Commit c29fa27d authored by Wei Yang's avatar Wei Yang Committed by Michael Ellerman

powerpc/eeh: Create PE for VFs

This creates PEs for VFs in the weak function pcibios_bus_add_device().
Those PEs for VFs are identified with newly introduced flag EEH_PE_VF
so that we treat them differently during EEH recovery.
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 39218cd0
...@@ -72,6 +72,7 @@ struct pci_dn; ...@@ -72,6 +72,7 @@ struct pci_dn;
#define EEH_PE_PHB (1 << 1) /* PHB PE */ #define EEH_PE_PHB (1 << 1) /* PHB PE */
#define EEH_PE_DEVICE (1 << 2) /* Device PE */ #define EEH_PE_DEVICE (1 << 2) /* Device PE */
#define EEH_PE_BUS (1 << 3) /* Bus PE */ #define EEH_PE_BUS (1 << 3) /* Bus PE */
#define EEH_PE_VF (1 << 4) /* VF PE */
#define EEH_PE_ISOLATED (1 << 0) /* Isolated PE */ #define EEH_PE_ISOLATED (1 << 0) /* Isolated PE */
#define EEH_PE_RECOVERING (1 << 1) /* Recovering PE */ #define EEH_PE_RECOVERING (1 << 1) /* Recovering PE */
......
...@@ -299,7 +299,10 @@ static struct eeh_pe *eeh_pe_get_parent(struct eeh_dev *edev) ...@@ -299,7 +299,10 @@ static struct eeh_pe *eeh_pe_get_parent(struct eeh_dev *edev)
* EEH device already having associated PE, but * EEH device already having associated PE, but
* the direct parent EEH device doesn't have yet. * the direct parent EEH device doesn't have yet.
*/ */
pdn = pdn ? pdn->parent : NULL; if (edev->physfn)
pdn = pci_get_pdn(edev->physfn);
else
pdn = pdn ? pdn->parent : NULL;
while (pdn) { while (pdn) {
/* We're poking out of PCI territory */ /* We're poking out of PCI territory */
parent = pdn_to_eeh_dev(pdn); parent = pdn_to_eeh_dev(pdn);
...@@ -382,7 +385,10 @@ int eeh_add_to_parent_pe(struct eeh_dev *edev) ...@@ -382,7 +385,10 @@ int eeh_add_to_parent_pe(struct eeh_dev *edev)
} }
/* Create a new EEH PE */ /* Create a new EEH PE */
pe = eeh_pe_alloc(edev->phb, EEH_PE_DEVICE); if (edev->physfn)
pe = eeh_pe_alloc(edev->phb, EEH_PE_VF);
else
pe = eeh_pe_alloc(edev->phb, EEH_PE_DEVICE);
if (!pe) { if (!pe) {
pr_err("%s: out of memory!\n", __func__); pr_err("%s: out of memory!\n", __func__);
return -ENOMEM; return -ENOMEM;
......
...@@ -1503,6 +1503,22 @@ static struct eeh_ops pnv_eeh_ops = { ...@@ -1503,6 +1503,22 @@ static struct eeh_ops pnv_eeh_ops = {
.restore_config = pnv_eeh_restore_config .restore_config = pnv_eeh_restore_config
}; };
void pcibios_bus_add_device(struct pci_dev *pdev)
{
struct pci_dn *pdn = pci_get_pdn(pdev);
if (!pdev->is_virtfn)
return;
/*
* The following operations will fail if VF's sysfs files
* aren't created or its resources aren't finalized.
*/
eeh_add_device_early(pdn);
eeh_add_device_late(pdev);
eeh_sysfs_add_device(pdev);
}
/** /**
* eeh_powernv_init - Register platform dependent EEH operations * eeh_powernv_init - Register platform dependent EEH operations
* *
......
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