5 #include "sw/device/silicon_creator/rom/rom_epmp.h"
14 extern char _stack_start[];
15 extern char _text_start[];
16 extern char _text_end[];
21 "MMIO region changed, update ePMP configuration if needed");
22 static_assert(TOP_EARLGREY_MMIO_SIZE_BYTES == 0x10000000,
23 "MMIO region changed, update ePMP configuration if needed");
30 TOP_EARLGREY_MMIO_SIZE_BYTES,
31 "Retention SRAM must be in the MMIO address space.");
33 void rom_epmp_state_init(lifecycle_state_t lc_state) {
38 const epmp_region_t rom_text = {.start = (uintptr_t)_text_start,
39 .end = (uintptr_t)_text_end};
52 const epmp_region_t stack_guard = {.start = (uintptr_t)_stack_start,
53 .end = (uintptr_t)_stack_start + 4};
58 epmp_perm_t debug_rom_access = kEpmpPermLockedNoAccess;
59 switch (launder32(lc_state)) {
62 debug_rom_access = kEpmpPermLockedReadWriteExecute;
66 debug_rom_access = kEpmpPermLockedReadWriteExecute;
70 debug_rom_access = kEpmpPermLockedNoAccess;
74 debug_rom_access = kEpmpPermLockedNoAccess;
78 debug_rom_access = kEpmpPermLockedReadWriteExecute;
90 epmp_state_configure_tor(1, rom_text, kEpmpPermLockedReadExecute);
91 epmp_state_configure_napot(2, rom, kEpmpPermLockedReadOnly);
92 epmp_state_configure_napot(5, eflash, kEpmpPermLockedReadOnly);
93 epmp_state_configure_tor(11, mmio, kEpmpPermLockedReadWrite);
94 epmp_state_configure_napot(13, debug_rom, debug_rom_access);
95 epmp_state_configure_na4(14, stack_guard, kEpmpPermLockedNoAccess);
96 epmp_state_configure_napot(15, ram, kEpmpPermLockedReadWrite);
102 const int kEntry = 4;
103 epmp_state_configure_tor(kEntry, region, kEpmpPermLockedReadExecute);
116 CSR_WRITE(CSR_REG_PMPADDR3, region.start >> 2);
117 CSR_WRITE(CSR_REG_PMPADDR4, region.end >> 2);
119 CSR_SET_BITS(CSR_REG_PMPCFG1, kEpmpModeTor | kEpmpPermLockedReadExecute);
123 const int kEntry = 6;
124 epmp_state_configure_napot(kEntry, region, kEpmpPermLockedReadOnly);
139 region.start >> 2 | (region.end - region.start - 1) >> 3);
142 ((kEpmpModeNapot | kEpmpPermLockedReadOnly) << 16));
145 void rom_epmp_config_debug_rom(lifecycle_state_t lc_state) {
162 switch (launder32(lc_state)) {
165 pmpcfg = (kEpmpModeNapot | kEpmpPermLockedReadWriteExecute) << 8;
169 pmpcfg = (kEpmpModeNapot | kEpmpPermLockedReadWriteExecute) << 8;
173 pmpcfg = (kEpmpModeNapot | kEpmpPermLockedNoAccess) << 8;
175 case kLcStateProdEnd:
177 pmpcfg = (kEpmpModeNapot | kEpmpPermLockedNoAccess) << 8;
181 pmpcfg = (kEpmpModeNapot | kEpmpPermLockedReadWriteExecute) << 8;