powerpc/pci: Trace more information from pci_dn
authorGavin Shan <gwshan@linux.vnet.ibm.com>
Tue, 17 Mar 2015 05:15:04 +0000 (16:15 +1100)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Tue, 24 Mar 2015 02:15:50 +0000 (13:15 +1100)
Originally, EEH probes on device_node or pci_dev and populates the
corresponding eeh_dev. In the subsequent patches, EEH will probes
on pci_dn and populates the corresponding eeh_dev. So we have to
cache some information in pci_dn, either from device_node or SRIOV
PF's enablement platform hook, to populate the eeh_dev properly.

The motivation to probe pci_dn, instead of device node or pci_dev,
to populate eeh_dev is SRIOV VFs are dynamically created and we
don't have the corresponding device nodes for them.

Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/include/asm/pci-bridge.h
arch/powerpc/kernel/pci_dn.c

index 706710b571c39dd5afe5bf366fc1bb1e3d798a47..01b730a8a5a3c36c47af8140f271581f4643d76c 100644 (file)
@@ -159,6 +159,9 @@ struct pci_dn {
 
        int     busno;                  /* pci bus number */
        int     devfn;                  /* pci device and function number */
+       int     vendor_id;              /* Vendor ID */
+       int     device_id;              /* Device ID */
+       int     class_code;             /* Device class code */
 
        struct  pci_dn *parent;
        struct  pci_controller *phb;    /* for pci devices */
index 0ab2dadaf842ae34dd6ddd2d03e63b6627a7dd76..d139f72ff9d5564b168e267725ebd533fa14f23d 100644 (file)
@@ -166,6 +166,15 @@ void *update_dn_pci_info(struct device_node *dn, void *data)
                pdn->devfn = (addr >> 8) & 0xff;
        }
 
+       /* vendor/device IDs and class code */
+       regs = of_get_property(dn, "vendor-id", NULL);
+       pdn->vendor_id = regs ? of_read_number(regs, 1) : 0;
+       regs = of_get_property(dn, "device-id", NULL);
+       pdn->device_id = regs ? of_read_number(regs, 1) : 0;
+       regs = of_get_property(dn, "class-code", NULL);
+       pdn->class_code = regs ? of_read_number(regs, 1) : 0;
+
+       /* Extended config space */
        pdn->pci_ext_config_space = (type && of_read_number(type, 1) == 1);
 
        /* Attach to parent node */
@@ -255,6 +264,7 @@ void pci_devs_phb_init_dynamic(struct pci_controller *phb)
        pdn = dn->data;
        if (pdn) {
                pdn->devfn = pdn->busno = -1;
+               pdn->vendor_id = pdn->device_id = pdn->class_code = 0;
                pdn->phb = phb;
                phb->pci_data = pdn;
        }