dcp: Fix firmware mapping check on t8103/t600x

t8103 and t600x use "asc-dram-mask" in iop-dcp-nub to mask bits out of
DMA addresses. This needs to be used in the firmware mappings
check/remap since the segments have maskable bits sets.

Fixes: 8332e24 ("dcp: Undo carnage from bad stage1 DART code")
Signed-off-by: Janne Grunau <j@jannau.net>
This commit is contained in:
Janne Grunau 2024-05-18 00:15:09 +02:00 committed by Hector Martin
parent 56feda2b5e
commit 421dfa4252

View file

@ -116,6 +116,10 @@ static int dcp_create_firmware_mappings(const display_config_t *cfg, dcp_dev_t *
return -1; return -1;
} }
u64 asc_dram_mask;
if (ADT_GETPROP(adt, node, "asc-dram-mask", &asc_dram_mask) < 0)
asc_dram_mask = 0;
const struct adt_segment_ranges *seg; const struct adt_segment_ranges *seg;
u32 segments_len; u32 segments_len;
@ -123,13 +127,14 @@ static int dcp_create_firmware_mappings(const display_config_t *cfg, dcp_dev_t *
unsigned int count = segments_len / sizeof(*seg); unsigned int count = segments_len / sizeof(*seg);
for (unsigned int i = 0; i < count; i++) { for (unsigned int i = 0; i < count; i++) {
if (dart_translate_silent(dcp->dart_dcp, seg[i].remap)) u64 iova = seg[i].remap & ~asc_dram_mask;
if (dart_translate_silent(dcp->dart_dcp, iova))
continue; continue;
size_t len = ALIGN_UP(seg[i].size, SZ_16K); size_t len = ALIGN_UP(seg[i].size, SZ_16K);
u32 flags = i == 0 ? 0b0100 : 0; // TEXT gets this bit set? u32 flags = i == 0 ? 0b0100 : 0; // TEXT gets this bit set?
printf("dcp: Mapping segment #0 %lx -> %lx [%lx]\n", seg[i].remap, seg[i].phys, len); printf("dcp: Mapping segment #%u %lx -> %lx [%lx]\n", i, iova, seg[i].phys, len);
if (dart_map_flags(dcp->dart_dcp, seg[i].remap, (void *)seg[i].phys, len, flags)) { if (dart_map_flags(dcp->dart_dcp, iova, (void *)seg[i].phys, len, flags)) {
printf("dcp: Failed to map segment\n"); printf("dcp: Failed to map segment\n");
return -1; return -1;
} }