On Fri, Oct 28, 2011 at 4:26 PM, Bjorn Helgaas <bhelgaas@xxxxxxxxxx> wrote: > Convert from pci_scan_bus() to pci_scan_root_bus() and remove root bus > resource fixups. This fixes the problem of "early" and "header" quirks > seeing incorrect root bus resources. > > CC: linux-alpha@xxxxxxxxxxxxxxx > Signed-off-by: Bjorn Helgaas <bhelgaas@xxxxxxxxxx> > --- > arch/alpha/kernel/pci.c | 37 ++++++++++++++++++++----------------- > 1 files changed, 20 insertions(+), 17 deletions(-) > > diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c > index c9ab94e..e9e78a2 100644 > --- a/arch/alpha/kernel/pci.c > +++ b/arch/alpha/kernel/pci.c > @@ -286,22 +286,7 @@ pcibios_fixup_bus(struct pci_bus *bus) > struct pci_controller *hose = bus->sysdata; > struct pci_dev *dev = bus->self; > > - if (!dev) { > - /* Root bus. */ > - u32 pci_mem_end; > - u32 sg_base = hose->sg_pci ? hose->sg_pci->dma_base : ~0; > - unsigned long end; > - > - bus->resource[0] = hose->io_space; > - bus->resource[1] = hose->mem_space; > - > - /* Adjust hose mem_space limit to prevent PCI allocations > - in the iommu windows. */ > - pci_mem_end = min((u32)__direct_map_base, sg_base) - 1; > - end = hose->mem_space->start + pci_mem_end; > - if (hose->mem_space->end > end) > - hose->mem_space->end = end; > - } else if (pci_probe_only && > + if (pci_probe_only && dev && > (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { > pci_read_bridge_bases(bus); > pcibios_fixup_device_resources(dev, bus); > @@ -414,13 +399,31 @@ void __init > common_init_pci(void) > { > struct pci_controller *hose; > + struct list_head resources; > struct pci_bus *bus; > int next_busno; > int need_domain_info = 0; > + u32 pci_mem_end; > + u32 sg_base; > + unsigned long end; > > /* Scan all of the recorded PCI controllers. */ > for (next_busno = 0, hose = hose_head; hose; hose = hose->next) { > - bus = pci_scan_bus(next_busno, alpha_mv.pci_ops, hose); > + sg_base = hose->sg_pci ? hose->sg_pci->dma_base : ~0; > + > + /* Adjust hose mem_space limit to prevent PCI allocations > + in the iommu windows. */ > + pci_mem_end = min((u32)__direct_map_base, sg_base) - 1; > + end = hose->mem_space->start + pci_mem_end; > + if (hose->mem_space->end > end) > + hose->mem_space->end = end; > + > + INIT_LIST_HEAD(&resources); > + pci_add_resource(&resources, &hose->io_space); > + pci_add_resource(&resources, &hose->mem_space); These two lines are errors: hose->io_space is already a struct resource pointer, so we shouldn't take the pointer's address. Updated patch and incremental patch attached. Bjorn
Attachment:
patch.alpha-pci-convert-to-pci_scan_root_bus
Description: Binary data
Attachment:
patch.alpha-incremental
Description: Binary data