@@ -197,11 +197,11 @@ static void pnv_pci_ioda2_set_bypass(struct pnv_ioda_pe *pe, bool enable)
pe->tce_bypass_enabled = enable;
}
-static void pnv_pci_ioda2_release_dma_pe(struct pci_dev *dev,
- struct pnv_ioda_pe *pe)
+static void pnv_pci_ioda2_release_pe_dma(struct pnv_ioda_pe *pe)
{
- struct iommu_table *tbl;
- int64_t rc;
+ struct iommu_table *tbl;
+ struct device_node *dn;
+ int64_t rc;
tbl = pe->table_group.tables[0];
rc = pnv_pci_ioda2_unset_window(&pe->table_group, 0);
@@ -213,8 +213,20 @@ static void pnv_pci_ioda2_release_dma_pe(struct pci_dev *dev,
iommu_group_put(pe->table_group.group);
BUG_ON(pe->table_group.group);
}
+
+ if (pe->flags & (PNV_IODA_PE_BUS | PNV_IODA_PE_BUS_ALL))
+ dn = pci_bus_to_OF_node(pe->pbus);
+ else if (pe->flags & PNV_IODA_PE_DEV)
+ dn = pci_device_to_OF_node(pe->pdev);
+#ifdef CONFIG_PCI_IOV
+ else if (pe->flags & PNV_IODA_PE_VF)
+ dn = pci_device_to_OF_node(pe->parent_dev);
+#endif
+ else
+ dn = NULL;
+
pnv_pci_ioda2_table_free_pages(tbl);
- iommu_free_table(tbl, of_node_full_name(dev->dev.of_node));
+ iommu_free_table(tbl, of_node_full_name(dn));
}
static int pnv_ioda_set_one_peltv(struct pnv_phb *phb,
@@ -1495,14 +1507,14 @@ static void pnv_ioda_release_vf_PE(struct pci_dev *pdev, u16 num_vfs)
if ((pe->flags & PNV_IODA_PE_MASTER) &&
(pe->flags & PNV_IODA_PE_VF)) {
list_for_each_entry_safe(s, sn, &pe->slaves, list) {
- pnv_pci_ioda2_release_dma_pe(pdev, s);
+ pnv_pci_ioda2_release_pe_dma(s);
list_del(&s->list);
pnv_ioda_deconfigure_pe(phb, s);
pnv_ioda_free_pe(phb, s->pe_number);
}
}
- pnv_pci_ioda2_release_dma_pe(pdev, pe);
+ pnv_pci_ioda2_release_pe_dma(pe);
/* Remove from list */
mutex_lock(&phb->ioda.pe_list_mutex);
The patch applies cleanup on pnv_pci_ioda2_release_dma_pe(): * Rename it to pnv_pci_ioda2_release_pe_dma() to match the function names used to release resources for one PE in the subsequent patches. * Remove the parameter of PCI device, which is used to figure out device node. VFs don't have associated device nodes in SRIOV case. For other cases, the device node can be figured out from the PCI bus or device the PE was allocated for. Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com> --- v5: * Newly introduced --- arch/powerpc/platforms/powernv/pci-ioda.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-)