lkml.org 
[lkml]   [2010]   [Feb]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH v3 1/7] PCI: split up pci_read_bridge_bases()
    From
    Date

    No functional change; this breaks up pci_read_bridge_bases() into separate
    pieces for the I/O, memory, and prefetchable memory windows, similar to how
    Yinghai recently split up pci_setup_bridge() in 68e84ff3bdc.

    Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
    ---

    drivers/pci/probe.c | 54 +++++++++++++++++++++++++++++++++++++--------------
    1 files changed, 39 insertions(+), 15 deletions(-)


    diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
    index d300943..3d305c1 100644
    --- a/drivers/pci/probe.c
    +++ b/drivers/pci/probe.c
    @@ -281,26 +281,12 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
    }
    }

    -void __devinit pci_read_bridge_bases(struct pci_bus *child)
    +static void __devinit pci_read_bridge_io(struct pci_bus *child)
    {
    struct pci_dev *dev = child->self;
    u8 io_base_lo, io_limit_lo;
    - u16 mem_base_lo, mem_limit_lo;
    unsigned long base, limit;
    struct resource *res;
    - int i;
    -
    - if (pci_is_root_bus(child)) /* It's a host bus, nothing to read */
    - return;
    -
    - dev_info(&dev->dev, "PCI bridge to [bus %02x-%02x]%s\n",
    - child->secondary, child->subordinate,
    - dev->transparent ? " (subtractive decode)": "");
    -
    - if (dev->transparent) {
    - for(i = 3; i < PCI_BUS_NUM_RESOURCES; i++)
    - child->resource[i] = child->parent->resource[i - 3];
    - }

    res = child->resource[0];
    pci_read_config_byte(dev, PCI_IO_BASE, &io_base_lo);
    @@ -328,6 +314,14 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child)
    " bridge window [io %04lx - %04lx] reg reading\n",
    base, limit);
    }
    +}
    +
    +static void __devinit pci_read_bridge_mmio(struct pci_bus *child)
    +{
    + struct pci_dev *dev = child->self;
    + u16 mem_base_lo, mem_limit_lo;
    + unsigned long base, limit;
    + struct resource *res;

    res = child->resource[1];
    pci_read_config_word(dev, PCI_MEMORY_BASE, &mem_base_lo);
    @@ -344,6 +338,14 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child)
    " bridge window [mem 0x%08lx - 0x%08lx] reg reading\n",
    base, limit + 0xfffff);
    }
    +}
    +
    +static void __devinit pci_read_bridge_mmio_pref(struct pci_bus *child)
    +{
    + struct pci_dev *dev = child->self;
    + u16 mem_base_lo, mem_limit_lo;
    + unsigned long base, limit;
    + struct resource *res;

    res = child->resource[2];
    pci_read_config_word(dev, PCI_PREF_MEMORY_BASE, &mem_base_lo);
    @@ -389,6 +391,28 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child)
    }
    }

    +void __devinit pci_read_bridge_bases(struct pci_bus *child)
    +{
    + struct pci_dev *dev = child->self;
    + int i;
    +
    + if (pci_is_root_bus(child)) /* It's a host bus, nothing to read */
    + return;
    +
    + dev_info(&dev->dev, "PCI bridge to [bus %02x-%02x]%s\n",
    + child->secondary, child->subordinate,
    + dev->transparent ? " (subtractive decode)": "");
    +
    + if (dev->transparent) {
    + for(i = 3; i < PCI_BUS_NUM_RESOURCES; i++)
    + child->resource[i] = child->parent->resource[i - 3];
    + }
    +
    + pci_read_bridge_io(child);
    + pci_read_bridge_mmio(child);
    + pci_read_bridge_mmio_pref(child);
    +}
    +
    static struct pci_bus * pci_alloc_bus(void)
    {
    struct pci_bus *b;


    \
     
     \ /
      Last update: 2010-02-12 18:03    [W:0.028 / U:0.232 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site