Have the PowerNV EEH backend allocate the eeh_dev if needed rather than using
the one attached to the pci_dn. This gets us most of the way towards decoupling
pci_dn from the PowerNV EEH code.

Signed-off-by: Oliver O'Halloran <ooh...@gmail.com>
---
We should probably be free()ing the eeh_dev somewhere. The pci_dev release
function is the right place for it.
---
 arch/powerpc/platforms/powernv/eeh-powernv.c | 22 ++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/arch/powerpc/platforms/powernv/eeh-powernv.c 
b/arch/powerpc/platforms/powernv/eeh-powernv.c
index 1cd80b399995..7aba18e08996 100644
--- a/arch/powerpc/platforms/powernv/eeh-powernv.c
+++ b/arch/powerpc/platforms/powernv/eeh-powernv.c
@@ -366,10 +366,9 @@ static int pnv_eeh_write_config(struct eeh_dev *edev,
  */
 static struct eeh_dev *pnv_eeh_probe_pdev(struct pci_dev *pdev)
 {
-       struct pci_dn *pdn = pci_get_pdn(pdev);
-       struct pci_controller *hose = pdn->phb;
-       struct pnv_phb *phb = hose->private_data;
-       struct eeh_dev *edev = pdn_to_eeh_dev(pdn);
+       struct pnv_phb *phb = pci_bus_to_pnvhb(pdev->bus);
+       struct pci_controller *hose = phb->hose;
+       struct eeh_dev *edev;
        uint32_t pcie_flags;
        int ret;
        int config_addr = (pdev->bus->number << 8) | (pdev->devfn);
@@ -415,12 +414,27 @@ static struct eeh_dev *pnv_eeh_probe_pdev(struct pci_dev 
*pdev)
        if ((pdev->class >> 8) == PCI_CLASS_BRIDGE_ISA)
                return NULL;
 
+       /* otherwise allocate and initialise a new eeh_dev */
+       edev = kzalloc(sizeof(*edev), GFP_KERNEL);
+       if (!edev) {
+               pr_err("%s: out of memory lol\n", __func__);
+               return NULL;
+       }
+
        /* Initialize eeh device */
+       edev->bdfn       = config_addr;
+       edev->controller = phb->hose;
+
        edev->class_code = pdev->class;
        edev->pcix_cap = pci_find_capability(pdev, PCI_CAP_ID_PCIX);
        edev->pcie_cap = pci_find_capability(pdev, PCI_CAP_ID_EXP);
        edev->af_cap   = pci_find_capability(pdev, PCI_CAP_ID_AF);
        edev->aer_cap  = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ERR);
+
+       /* TODO: stash the vf_index in here? */
+       if (pdev->is_virtfn)
+               edev->physfn = pdev->physfn;
+
        if ((pdev->class >> 8) == PCI_CLASS_BRIDGE_PCI) {
                edev->mode |= EEH_DEV_BRIDGE;
                if (edev->pcie_cap) {
-- 
2.21.0

Reply via email to