Commit 39218cd0 authored by Wei Yang's avatar Wei Yang Committed by Michael Ellerman

powerpc/eeh: EEH device for VF

VFs and their corresponding pdn are created and released dynamically
when their PF's SRIOV capability is enabled and disabled. This creates
and releases EEH devices for VFs when creating and releasing their pdn
instances, which means EEH devices and pdn instances have same life
cycle. Also, VF's EEH device is identified by (struct eeh_dev::physfn).
Signed-off-by: default avatarWei Yang <weiyang@linux.vnet.ibm.com>
Acked-by: default avatarGavin Shan <gwshan@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 51c0e87e
...@@ -141,6 +141,7 @@ struct eeh_dev { ...@@ -141,6 +141,7 @@ struct eeh_dev {
struct pci_controller *phb; /* Associated PHB */ struct pci_controller *phb; /* Associated PHB */
struct pci_dn *pdn; /* Associated PCI device node */ struct pci_dn *pdn; /* Associated PCI device node */
struct pci_dev *pdev; /* Associated PCI device */ struct pci_dev *pdev; /* Associated PCI device */
struct pci_dev *physfn; /* Associated SRIOV PF */
struct pci_bus *bus; /* PCI bus for partial hotplug */ struct pci_bus *bus; /* PCI bus for partial hotplug */
}; };
......
...@@ -179,6 +179,7 @@ struct pci_dn *add_dev_pci_data(struct pci_dev *pdev) ...@@ -179,6 +179,7 @@ struct pci_dn *add_dev_pci_data(struct pci_dev *pdev)
{ {
#ifdef CONFIG_PCI_IOV #ifdef CONFIG_PCI_IOV
struct pci_dn *parent, *pdn; struct pci_dn *parent, *pdn;
struct eeh_dev *edev;
int i; int i;
/* Only support IOV for now */ /* Only support IOV for now */
...@@ -204,6 +205,12 @@ struct pci_dn *add_dev_pci_data(struct pci_dev *pdev) ...@@ -204,6 +205,12 @@ struct pci_dn *add_dev_pci_data(struct pci_dev *pdev)
__func__, i); __func__, i);
return NULL; return NULL;
} }
/* Create the EEH device for the VF */
eeh_dev_init(pdn, pci_bus_to_host(pdev->bus));
edev = pdn_to_eeh_dev(pdn);
BUG_ON(!edev);
edev->physfn = pdev;
} }
#endif /* CONFIG_PCI_IOV */ #endif /* CONFIG_PCI_IOV */
...@@ -215,6 +222,7 @@ void remove_dev_pci_data(struct pci_dev *pdev) ...@@ -215,6 +222,7 @@ void remove_dev_pci_data(struct pci_dev *pdev)
#ifdef CONFIG_PCI_IOV #ifdef CONFIG_PCI_IOV
struct pci_dn *parent; struct pci_dn *parent;
struct pci_dn *pdn, *tmp; struct pci_dn *pdn, *tmp;
struct eeh_dev *edev;
int i; int i;
/* /*
...@@ -256,6 +264,13 @@ void remove_dev_pci_data(struct pci_dev *pdev) ...@@ -256,6 +264,13 @@ void remove_dev_pci_data(struct pci_dev *pdev)
pdn->devfn != pci_iov_virtfn_devfn(pdev, i)) pdn->devfn != pci_iov_virtfn_devfn(pdev, i))
continue; continue;
/* Release EEH device for the VF */
edev = pdn_to_eeh_dev(pdn);
if (edev) {
pdn->edev = NULL;
kfree(edev);
}
if (!list_empty(&pdn->list)) if (!list_empty(&pdn->list))
list_del(&pdn->list); list_del(&pdn->list);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment