Skip to content

Commit b54fd9c

Browse files
RcColesadeaarm
authored andcommitted
LCM: Enable parity on only some DCUs
Previously parity had to either be enabled on all DCUs or none of them, now they can be enabled for subsets, provided that subset starts from the lowest DCU register. Change-Id: Ia7c0601be12e7c053dfe47b3f5f1e7aba3bb745c Signed-off-by: Raef Coles <raef.coles@arm.com>
1 parent fa760bd commit b54fd9c

File tree

2 files changed

+30
-8
lines changed

2 files changed

+30
-8
lines changed

platform/ext/target/arm/drivers/lcm/lcm_drv.c

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,12 @@
2222
#include <assert.h>
2323

2424
#ifdef LCM_DCU_PARITY
25-
#define DCU_ENABLED_MASK 0x55555555
26-
#define DCU_DISABLED_MASK 0xAAAAAAAA
27-
#else
28-
#define DCU_ENABLED_MASK 0xFFFFFFFF
29-
#define DCU_DISABLED_MASK 0x00000000
25+
#define DCU_PARITY_ENABLED_MASK 0x55555555
26+
#define DCU_PARITY_DISABLED_MASK 0xAAAAAAAA
27+
28+
#ifndef LCM_DCU_PARITY_WORDS
29+
#define LCM_DCU_PARITY_WORDS 4
30+
#endif
3031
#endif
3132

3233
#ifdef INTEGRITY_CHECKER_S
@@ -94,6 +95,26 @@ struct _lcm_reg_map_t {
9495
};
9596
};
9697

98+
static uint32_t get_enabled_mask(uint32_t dcu_word_idx)
99+
{
100+
#ifndef LCM_DCU_PARITY
101+
(void)dcu_word_idx;
102+
return 0xFFFFFFFF;
103+
#else
104+
return dcu_word_idx < LCM_DCU_PARITY_WORDS ? DCU_PARITY_ENABLED_MASK : 0xFFFFFFFF;
105+
#endif
106+
}
107+
108+
static uint32_t get_disabled_mask(uint32_t dcu_word_idx)
109+
{
110+
#ifndef LCM_DCU_PARITY
111+
(void)dcu_word_idx;
112+
return 0x00000000;
113+
#else
114+
return dcu_word_idx < LCM_DCU_PARITY_WORDS ? DCU_PARITY_DISABLED_MASK : 0x00000000;
115+
#endif
116+
}
117+
97118
static int is_pointer_word_aligned(void *ptr) {
98119
return !((uintptr_t)ptr & (sizeof(uint32_t) - 1));
99120
}
@@ -268,13 +289,13 @@ static inline void mask_dcus_for_sp_enable(struct lcm_dev_t *dev)
268289
for (idx = 0; idx < LCM_DCU_WIDTH_IN_BYTES / sizeof(uint32_t); idx++) {
269290
mask_val = p_lcm->dcu_sp_disable_mask[idx];
270291

271-
mask_enabled = mask_val & DCU_ENABLED_MASK;
272-
mask_disabled = mask_val & DCU_DISABLED_MASK;
292+
mask_enabled = mask_val & get_enabled_mask(idx);
293+
mask_disabled = mask_val & get_disabled_mask(idx);
273294

274295
dcu_val = p_lcm->dcu_en[idx];
275296

276297
dcu_val &= mask_enabled;
277-
dcu_val |= ((~dcu_val & DCU_ENABLED_MASK) << 1) & mask_disabled;
298+
dcu_val |= ((~dcu_val & get_enabled_mask(idx)) << 1) & mask_disabled;
278299

279300
p_lcm->dcu_en[idx] = dcu_val;
280301
}

platform/ext/target/arm/rse/common/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ target_compile_definitions(platform_region_defs
5555
RSE_TP_MODE=LCM_TP_MODE_${RSE_TP_MODE}
5656
RSE_TESTS_TP_MODE=LCM_TP_MODE_${RSE_TESTS_TP_MODE}
5757
LCM_DCU_PARITY
58+
LCM_DCU_PARITY_WORDS=1
5859
$<$<BOOL:${PLAT_MHU_VERSION}>:PLAT_MHU_VERSION=${PLAT_MHU_VERSION}>
5960
$<$<BOOL:${RSE_BL1_TEST_BINARY}>:RSE_BL1_TEST_BINARY>
6061
$<$<BOOL:${RSE_TEST_BINARY_IN_ROM}>:RSE_TEST_BINARY_IN_ROM>

0 commit comments

Comments
 (0)