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 <gws...@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/pci-bridge.h |  3 +++
 arch/powerpc/kernel/pci_dn.c          | 10 ++++++++++
 2 files changed, 13 insertions(+)

diff --git a/arch/powerpc/include/asm/pci-bridge.h 
b/arch/powerpc/include/asm/pci-bridge.h
index 706710b..01b730a 100644
--- a/arch/powerpc/include/asm/pci-bridge.h
+++ b/arch/powerpc/include/asm/pci-bridge.h
@@ -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 */
diff --git a/arch/powerpc/kernel/pci_dn.c b/arch/powerpc/kernel/pci_dn.c
index 0ab2dad..d139f72f 100644
--- a/arch/powerpc/kernel/pci_dn.c
+++ b/arch/powerpc/kernel/pci_dn.c
@@ -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;
        }
-- 
1.8.3.2

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to