powerpc/pseries/iommu: Create huge DMA window if no MMIO32 is present
The iommu_init_table() helper takes an address range to reserve in the IOMMU table being initialized to exclude MMIO addresses, this is useful if the window stretches far beyond 4GB (although wastes some TCEs). At the moment the code searches for such MMIO32 range and fails if none found which is considered a problem while it really is not: it is actually better as this says there is no MMIO32 to reserve and we can use usually wasted TCEs. Furthermore PHYP never actually allows creating windows starting at busaddress=0 so this MMIO32 range is never useful. This removes error exit and initializes the table with zero range if no MMIO32 is detected. Fixes: 381ceda88c4c ("powerpc/pseries/iommu: Make use of DDW for indirect mapping") Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20211020132315.2287178-5-aik@ozlabs.ru
This commit is contained in:
parent
92fe01b7c6
commit
d853adc7ad
@ -1411,18 +1411,19 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
|
||||
} else {
|
||||
struct iommu_table *newtbl;
|
||||
int i;
|
||||
unsigned long start = 0, end = 0;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(pci->phb->mem_resources); i++) {
|
||||
const unsigned long mask = IORESOURCE_MEM_64 | IORESOURCE_MEM;
|
||||
|
||||
/* Look for MMIO32 */
|
||||
if ((pci->phb->mem_resources[i].flags & mask) == IORESOURCE_MEM)
|
||||
if ((pci->phb->mem_resources[i].flags & mask) == IORESOURCE_MEM) {
|
||||
start = pci->phb->mem_resources[i].start;
|
||||
end = pci->phb->mem_resources[i].end;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == ARRAY_SIZE(pci->phb->mem_resources))
|
||||
goto out_del_list;
|
||||
|
||||
/* New table for using DDW instead of the default DMA window */
|
||||
newtbl = iommu_pseries_alloc_table(pci->phb->node);
|
||||
if (!newtbl) {
|
||||
@ -1432,8 +1433,7 @@ static bool enable_ddw(struct pci_dev *dev, struct device_node *pdn)
|
||||
|
||||
iommu_table_setparms_common(newtbl, pci->phb->bus->number, create.liobn, win_addr,
|
||||
1UL << len, page_shift, NULL, &iommu_table_lpar_multi_ops);
|
||||
iommu_init_table(newtbl, pci->phb->node, pci->phb->mem_resources[i].start,
|
||||
pci->phb->mem_resources[i].end);
|
||||
iommu_init_table(newtbl, pci->phb->node, start, end);
|
||||
|
||||
pci->table_group->tables[1] = newtbl;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user