PCI: portdrv: cleanup pcie_device registration
[safe/jmp/linux-2.6] / drivers / pci / probe.c
index e2f3dd0..2fdffc0 100644 (file)
@@ -10,6 +10,9 @@
 #include <linux/module.h>
 #include <linux/cpumask.h>
 #include <linux/pci-aspm.h>
+#include <linux/iommu.h>
+#include <acpi/acpi_hest.h>
+#include <xen/xen.h>
 #include "pci.h"
 
 #define CARDBUS_LATENCY_TIMER  176     /* secondary latency timer */
@@ -163,12 +166,12 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
 {
        u32 l, sz, mask;
 
-       mask = type ? ~PCI_ROM_ADDRESS_ENABLE : ~0;
+       mask = type ? PCI_ROM_ADDRESS_MASK : ~0;
 
        res->name = pci_name(dev);
 
        pci_read_config_dword(dev, pos, &l);
-       pci_write_config_dword(dev, pos, mask);
+       pci_write_config_dword(dev, pos, l | mask);
        pci_read_config_dword(dev, pos, &sz);
        pci_write_config_dword(dev, pos, l);
 
@@ -193,7 +196,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
                res->flags |= pci_calc_resource_flags(l) | IORESOURCE_SIZEALIGN;
                if (type == pci_bar_io) {
                        l &= PCI_BASE_ADDRESS_IO_MASK;
-                       mask = PCI_BASE_ADDRESS_IO_MASK & 0xffff;
+                       mask = PCI_BASE_ADDRESS_IO_MASK & IO_SPACE_LIMIT;
                } else {
                        l &= PCI_BASE_ADDRESS_MEM_MASK;
                        mask = (u32)PCI_BASE_ADDRESS_MEM_MASK;
@@ -223,9 +226,13 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
                        goto fail;
 
                if ((sizeof(resource_size_t) < 8) && (sz64 > 0x100000000ULL)) {
-                       dev_err(&dev->dev, "can't handle 64-bit BAR\n");
+                       dev_err(&dev->dev, "reg %x: can't handle 64-bit BAR\n",
+                               pos);
                        goto fail;
-               } else if ((sizeof(resource_size_t) < 8) && l) {
+               }
+
+               res->flags |= IORESOURCE_MEM_64;
+               if ((sizeof(resource_size_t) < 8) && l) {
                        /* Address above 32-bit boundary; disable the BAR */
                        pci_write_config_dword(dev, pos, 0);
                        pci_write_config_dword(dev, pos + 4, 0);
@@ -234,8 +241,8 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
                } else {
                        res->start = l64;
                        res->end = l64 + sz64;
-                       dev_printk(KERN_DEBUG, &dev->dev,
-                               "reg %x 64bit mmio: %pR\n", pos, res);
+                       dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n",
+                                  pos, res);
                }
        } else {
                sz = pci_size(l, sz, mask);
@@ -246,9 +253,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
                res->start = l;
                res->end = l + sz;
 
-               dev_printk(KERN_DEBUG, &dev->dev, "reg %x %s: %pR\n", pos,
-                       (res->flags & IORESOURCE_IO) ? "io port" : "32bit mmio",
-                       res);
+               dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res);
        }
 
  out:
@@ -287,11 +292,14 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child)
        struct resource *res;
        int i;
 
-       if (!child->parent)     /* It's a host bus, nothing to read */
+       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) {
-               dev_info(&dev->dev, "transparent bridge\n");
                for(i = 3; i < PCI_BUS_NUM_RESOURCES; i++)
                        child->resource[i] = child->parent->resource[i - 3];
        }
@@ -316,7 +324,7 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child)
                        res->start = base;
                if (!res->end)
                        res->end = limit + 0xfff;
-               dev_printk(KERN_DEBUG, &dev->dev, "bridge io port: %pR\n", res);
+               dev_printk(KERN_DEBUG, &dev->dev, "  bridge window %pR\n", res);
        }
 
        res = child->resource[1];
@@ -328,8 +336,7 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child)
                res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM;
                res->start = base;
                res->end = limit + 0xfffff;
-               dev_printk(KERN_DEBUG, &dev->dev, "bridge 32bit mmio: %pR\n",
-                       res);
+               dev_printk(KERN_DEBUG, &dev->dev, "  bridge window %pR\n", res);
        }
 
        res = child->resource[2];
@@ -362,12 +369,13 @@ void __devinit pci_read_bridge_bases(struct pci_bus *child)
                }
        }
        if (base <= limit) {
-               res->flags = (mem_base_lo & PCI_MEMORY_RANGE_TYPE_MASK) | IORESOURCE_MEM | IORESOURCE_PREFETCH;
+               res->flags = (mem_base_lo & PCI_PREF_RANGE_TYPE_MASK) |
+                                        IORESOURCE_MEM | IORESOURCE_PREFETCH;
+               if (res->flags & PCI_PREF_RANGE_TYPE_64)
+                       res->flags |= IORESOURCE_MEM_64;
                res->start = base;
                res->end = limit + 0xfffff;
-               dev_printk(KERN_DEBUG, &dev->dev, "bridge %sbit mmio pref: %pR\n",
-                       (res->flags & PCI_PREF_RANGE_TYPE_64) ? "64" : "32",
-                       res);
+               dev_printk(KERN_DEBUG, &dev->dev, "  bridge window %pR\n", res);
        }
 }
 
@@ -641,13 +649,14 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max,
                    (child->number > bus->subordinate) ||
                    (child->number < bus->number) ||
                    (child->subordinate < bus->number)) {
-                       pr_debug("PCI: Bus #%02x (-#%02x) is %s "
-                               "hidden behind%s bridge #%02x (-#%02x)\n",
+                       dev_info(&child->dev, "[bus %02x-%02x] %s "
+                               "hidden behind%s bridge %s [bus %02x-%02x]\n",
                                child->number, child->subordinate,
                                (bus->number > child->subordinate &&
                                 bus->subordinate < child->number) ?
                                        "wholly" : "partially",
                                bus->self->transparent ? " transparent" : "",
+                               dev_name(&bus->dev),
                                bus->number, bus->subordinate);
                }
                bus = bus->parent;
@@ -683,10 +692,34 @@ static void set_pcie_port_type(struct pci_dev *pdev)
        if (!pos)
                return;
        pdev->is_pcie = 1;
+       pdev->pcie_cap = pos;
        pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, &reg16);
        pdev->pcie_type = (reg16 & PCI_EXP_FLAGS_TYPE) >> 4;
 }
 
+static void set_pcie_hotplug_bridge(struct pci_dev *pdev)
+{
+       int pos;
+       u16 reg16;
+       u32 reg32;
+
+       pos = pci_pcie_cap(pdev);
+       if (!pos)
+               return;
+       pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, &reg16);
+       if (!(reg16 & PCI_EXP_FLAGS_SLOT))
+               return;
+       pci_read_config_dword(pdev, pos + PCI_EXP_SLTCAP, &reg32);
+       if (reg32 & PCI_EXP_SLTCAP_HPC)
+               pdev->is_hotplug_bridge = 1;
+}
+
+static void set_pci_aer_firmware_first(struct pci_dev *pdev)
+{
+       if (acpi_hest_firmware_first_pci(pdev))
+               pdev->aer_firmware_first = 1;
+}
+
 #define LEGACY_IO_RESOURCE     (IORESOURCE_IO | IORESOURCE_PCI_FIXED)
 
 /**
@@ -704,6 +737,7 @@ int pci_setup_device(struct pci_dev *dev)
        u32 class;
        u8 hdr_type;
        struct pci_slot *slot;
+       int pos = 0;
 
        if (pci_read_config_byte(dev, PCI_HEADER_TYPE, &hdr_type))
                return -EIO;
@@ -715,6 +749,7 @@ int pci_setup_device(struct pci_dev *dev)
        dev->multifunction = !!(hdr_type & 0x80);
        dev->error_state = pci_channel_io_normal;
        set_pcie_port_type(dev);
+       set_pci_aer_firmware_first(dev);
 
        list_for_each_entry(slot, &dev->bus->slots, list)
                if (PCI_SLOT(dev->devfn) == slot->number)
@@ -745,6 +780,8 @@ int pci_setup_device(struct pci_dev *dev)
 
        /* Early fixups, before probing the BARs */
        pci_fixup_device(pci_fixup_early, dev);
+       /* device class may be changed after fixup */
+       class = dev->class >> 8;
 
        switch (dev->hdr_type) {                    /* header type */
        case PCI_HEADER_TYPE_NORMAL:                /* standard header */
@@ -792,6 +829,12 @@ int pci_setup_device(struct pci_dev *dev)
                pci_read_irq(dev);
                dev->transparent = ((dev->class & 0xff) == 1);
                pci_read_bases(dev, 2, PCI_ROM_ADDRESS1);
+               set_pcie_hotplug_bridge(dev);
+               pos = pci_find_capability(dev, PCI_CAP_ID_SSVID);
+               if (pos) {
+                       pci_read_config_word(dev, pos + PCI_SSVID_VENDOR_ID, &dev->subsystem_vendor);
+                       pci_read_config_word(dev, pos + PCI_SSVID_DEVICE_ID, &dev->subsystem_device);
+               }
                break;
 
        case PCI_HEADER_TYPE_CARDBUS:               /* CardBus bridge header */
@@ -877,7 +920,7 @@ int pci_cfg_space_size(struct pci_dev *dev)
        if (class == PCI_CLASS_BRIDGE_HOST)
                return pci_cfg_space_size_ext(dev);
 
-       pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
+       pos = pci_pcie_cap(dev);
        if (!pos) {
                pos = pci_find_capability(dev, PCI_CAP_ID_PCIX);
                if (!pos)
@@ -984,6 +1027,10 @@ static void pci_init_capabilities(struct pci_dev *dev)
 
        /* Single Root I/O Virtualization */
        pci_iov_init(dev);
+
+       /* Enable ACS P2P upstream forwarding */
+       if (iommu_found() || xen_initial_domain())
+               pci_enable_acs(dev);
 }
 
 void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
@@ -1002,6 +1049,9 @@ void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
        /* Fix up broken headers */
        pci_fixup_device(pci_fixup_header, dev);
 
+       /* Clear the state_saved flag. */
+       dev->state_saved = false;
+
        /* Initialize various capabilities */
        pci_init_capabilities(dev);
 
@@ -1054,8 +1104,7 @@ int pci_scan_slot(struct pci_bus *bus, int devfn)
        if (dev && !dev->is_added)      /* new device? */
                nr++;
 
-       if ((dev && dev->multifunction) ||
-           (!dev && pcibios_scan_all_fns(bus, devfn))) {
+       if (dev && dev->multifunction) {
                for (fn = 1; fn < 8; fn++) {
                        dev = pci_scan_single_device(bus, devfn + fn);
                        if (dev) {
@@ -1078,7 +1127,7 @@ unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus)
        unsigned int devfn, pass, max = bus->secondary;
        struct pci_dev *dev;
 
-       pr_debug("PCI: Scanning bus %04x:%02x\n", pci_domain_nr(bus), bus->number);
+       dev_dbg(&bus->dev, "scanning bus\n");
 
        /* Go find them, Rover! */
        for (devfn = 0; devfn < 0x100; devfn += 8)
@@ -1092,8 +1141,7 @@ unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus)
         * all PCI-to-PCI bridges on this bus.
         */
        if (!bus->is_added) {
-               pr_debug("PCI: Fixups for bus %04x:%02x\n",
-                        pci_domain_nr(bus), bus->number);
+               dev_dbg(&bus->dev, "fixups for bus\n");
                pcibios_fixup_bus(bus);
                if (pci_is_root_bus(bus))
                        bus->is_added = 1;
@@ -1113,20 +1161,15 @@ unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus)
         *
         * Return how far we've got finding sub-buses.
         */
-       pr_debug("PCI: Bus scan for %04x:%02x returning with max=%02x\n",
-               pci_domain_nr(bus), bus->number, max);
+       dev_dbg(&bus->dev, "bus scan returning with max=%02x\n", max);
        return max;
 }
 
-void __attribute__((weak)) set_pci_bus_resources_arch_default(struct pci_bus *b)
-{
-}
-
 struct pci_bus * pci_create_bus(struct device *parent,
                int bus, struct pci_ops *ops, void *sysdata)
 {
        int error;
-       struct pci_bus *b;
+       struct pci_bus *b, *b2;
        struct device *dev;
 
        b = pci_alloc_bus();
@@ -1142,9 +1185,10 @@ struct pci_bus * pci_create_bus(struct device *parent,
        b->sysdata = sysdata;
        b->ops = ops;
 
-       if (pci_find_bus(pci_domain_nr(b), bus)) {
+       b2 = pci_find_bus(pci_domain_nr(b), bus);
+       if (b2) {
                /* If we already got to this bus through a different bridge, ignore it */
-               pr_debug("PCI: Bus %04x:%02x already known\n", pci_domain_nr(b), bus);
+               dev_dbg(&b2->dev, "bus already known\n");
                goto err_out;
        }
 
@@ -1180,8 +1224,6 @@ struct pci_bus * pci_create_bus(struct device *parent,
        b->resource[0] = &ioport_resource;
        b->resource[1] = &iomem_resource;
 
-       set_pci_bus_resources_arch_default(b);
-
        return b;
 
 dev_create_file_err:
@@ -1220,7 +1262,7 @@ EXPORT_SYMBOL(pci_scan_bus_parented);
  *
  * Returns the max number of subordinate bus discovered.
  */
-unsigned int __devinit pci_rescan_bus(struct pci_bus *bus)
+unsigned int __ref pci_rescan_bus(struct pci_bus *bus)
 {
        unsigned int max;
        struct pci_dev *dev;