lkml.org 
[lkml]   [2011]   [Oct]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH v2 24/29] alpha/PCI: convert to pci_scan_root_bus() for correct root bus resources
    From
    Date
    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.

    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    ---
    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);
    +
    + bus = pci_scan_root_bus(NULL, next_busno, alpha_mv.pci_ops,
    + hose, &resources);
    hose->bus = bus;
    hose->need_domain_info = need_domain_info;
    next_busno = bus->subordinate + 1;


    \
     
     \ /
      Last update: 2011-10-14 06:33    [W:5.041 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site