Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@ struct pci_dn;
#define EEH_PE_PHB	(1 << 1)	/* PHB PE    */
#define EEH_PE_DEVICE 	(1 << 2)	/* Device 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_RECOVERING	(1 << 1)	/* Recovering PE	*/
+8 −2
Original line number Diff line number Diff line
@@ -299,6 +299,9 @@ static struct eeh_pe *eeh_pe_get_parent(struct eeh_dev *edev)
	 * EEH device already having associated PE, but
	 * the direct parent EEH device doesn't have yet.
	 */
	if (edev->physfn)
		pdn = pci_get_pdn(edev->physfn);
	else
		pdn = pdn ? pdn->parent : NULL;
	while (pdn) {
		/* We're poking out of PCI territory */
@@ -382,6 +385,9 @@ int eeh_add_to_parent_pe(struct eeh_dev *edev)
	}

	/* Create a new EEH PE */
	if (edev->physfn)
		pe = eeh_pe_alloc(edev->phb, EEH_PE_VF);
	else
		pe = eeh_pe_alloc(edev->phb, EEH_PE_DEVICE);
	if (!pe) {
		pr_err("%s: out of memory!\n", __func__);
+16 −0
Original line number Diff line number Diff line
@@ -1503,6 +1503,22 @@ static struct eeh_ops pnv_eeh_ops = {
	.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
 *