Skip to content

Commit fabe27e

Browse files
committed
memory: Remap some carveouts as uncached
This fixes display DART real-time cache hits causing AMCC exceptions. The relevant carve-outs have flags 0x60004016; 0x60004002 is used for DCP which is non-realtime, so I'm guessing the '16' means we should map it uncached. Signed-off-by: Hector Martin <[email protected]>
1 parent 144c3da commit fabe27e

1 file changed

Lines changed: 11 additions & 3 deletions

File tree

src/memory.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ static void mmu_map_mmio(void)
345345
}
346346
}
347347

348-
static void mmu_remap_pcie(void)
348+
static void mmu_remap_ranges(void)
349349
{
350350

351351
int node = adt_path_offset(adt, "/defaults");
@@ -359,7 +359,7 @@ static void mmu_remap_pcie(void)
359359
printf("MMU: Failed to get pmap-io-ranges property!\n");
360360
return;
361361
}
362-
int range_cnt = ranges_len / 20;
362+
int range_cnt = ranges_len / 24;
363363
while (range_cnt--) {
364364
u64 addr = ranges[0] | ((u64)ranges[1] << 32);
365365
u64 size = ranges[2] | ((u64)ranges[3] << 32);
@@ -369,6 +369,10 @@ static void mmu_remap_pcie(void)
369369
if ((flags >> 28) == 8) {
370370
printf("MMU: Adding nGnRE mapping at 0x%lx (0x%lx)\n", addr, size);
371371
mmu_add_mapping(addr, addr, size, MAIR_IDX_DEVICE_nGnRE, PERM_RW_EL0);
372+
} else if (flags == 0x60004016) {
373+
printf("MMU: Adding UC mapping at 0x%lx (0x%lx)\n", addr, size);
374+
dc_civac_range((void *)addr, size);
375+
mmu_add_mapping(addr, addr, size, MAIR_IDX_FRAMEBUFFER, PERM_RW_EL0);
372376
}
373377

374378
ranges += 6;
@@ -378,7 +382,6 @@ static void mmu_remap_pcie(void)
378382
static void mmu_add_default_mappings(void)
379383
{
380384
mmu_map_mmio();
381-
mmu_remap_pcie();
382385

383386
ram_base = ALIGN_DOWN(cur_boot_args.phys_base, BIT(32));
384387
uint64_t ram_size = cur_boot_args.mem_size + cur_boot_args.phys_base - ram_base;
@@ -432,6 +435,11 @@ static void mmu_add_default_mappings(void)
432435
*/
433436
mmu_add_mapping(0xe000000000, 0x0000000000, 0x0800000000, MAIR_IDX_DEVICE_nGnRnE, PERM_RW_EL0);
434437
mmu_add_mapping(0xf000000000, 0x0000000000, 0x0800000000, MAIR_IDX_DEVICE_nGnRE, PERM_RW_EL0);
438+
439+
/*
440+
* Handle pmap-ranges
441+
*/
442+
mmu_remap_ranges();
435443
}
436444

437445
static void mmu_configure(void)

0 commit comments

Comments
 (0)