Skip to content

Commit 1be08f4

Browse files
rmurphy-armwilldeacon
authored andcommitted
iommu/io-pgtable-arm: Support all Mali configurations
In principle, Midgard GPUs supporting smaller VA sizes should only require 3-level pagetables, since level 0 only resolves bits 48:40 of the address. However, the kbase driver does not appear to have any notion of a variable start level, and empirically T720 and T820 rapidly blow up with translation faults unless given a full 4-level table, despite only supporting a 33-bit VA size. The 'real' IAS value is still valuable in terms of validating addresses on map/unmap, so tweak the allocator to allow smaller values while still forcing the resultant tables to the full 4 levels. As far as I can test, this should make all known Midgard variants happy. Fixes: d08d42d ("iommu: io-pgtable: Add ARM Mali midgard MMU page table format") Tested-by: Neil Armstrong <[email protected]> Reviewed-by: Steven Price <[email protected]> Reviewed-by: Rob Herring <[email protected]> Signed-off-by: Robin Murphy <[email protected]> Signed-off-by: Will Deacon <[email protected]>
1 parent 52f325f commit 1be08f4

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

drivers/iommu/io-pgtable-arm.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1024,7 +1024,7 @@ arm_mali_lpae_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie)
10241024
if (cfg->quirks)
10251025
return NULL;
10261026

1027-
if (cfg->ias != 48 || cfg->oas > 40)
1027+
if (cfg->ias > 48 || cfg->oas > 40)
10281028
return NULL;
10291029

10301030
cfg->pgsize_bitmap &= (SZ_4K | SZ_2M | SZ_1G);
@@ -1033,6 +1033,11 @@ arm_mali_lpae_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie)
10331033
if (!data)
10341034
return NULL;
10351035

1036+
/* Mali seems to need a full 4-level table regardless of IAS */
1037+
if (data->levels < ARM_LPAE_MAX_LEVELS) {
1038+
data->levels = ARM_LPAE_MAX_LEVELS;
1039+
data->pgd_size = sizeof(arm_lpae_iopte);
1040+
}
10361041
/*
10371042
* MEMATTR: Mali has no actual notion of a non-cacheable type, so the
10381043
* best we can do is mimic the out-of-tree driver and hope that the

0 commit comments

Comments
 (0)