Skip to content

Commit b8227a3

Browse files
MichaelBellGadgetoid
authored andcommitted
ports/rp2: Better fix to cache cleaning.
Signed-off-by: Mike Bell <[email protected]>
1 parent 7d3b7d6 commit b8227a3

File tree

1 file changed

+4
-5
lines changed

1 file changed

+4
-5
lines changed

ports/rp2/rp2_flash.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,13 +129,12 @@ static uint32_t begin_critical_flash_section(void) {
129129

130130
#if defined(MICROPY_HW_PSRAM_CS_PIN) && MICROPY_HW_ENABLE_PSRAM
131131
// We're about to invalidate the XIP cache, clean it first to commit any dirty writes to PSRAM
132-
uint8_t *maintenance_ptr = (uint8_t *)XIP_MAINTENANCE_BASE;
132+
// Use the upper 16k of the maintenance space (0x1bffc000 through 0x1bffffff) to workaround
133+
// incorrect behaviour of the XIP clean operation, where it also alters the tag of the associated
134+
// cache line: https://forums.raspberrypi.com/viewtopic.php?t=378249#p2263677
135+
volatile uint8_t *maintenance_ptr = (volatile uint8_t *)(XIP_SRAM_BASE + (XIP_MAINTENANCE_BASE - XIP_BASE));
133136
for (int i = 1; i < 16 * 1024; i += 8) {
134137
maintenance_ptr[i] = 0;
135-
136-
// Must also invalidate the cache lines to prevent rare hangs
137-
// See: https://forums.raspberrypi.com/viewtopic.php?t=378249)
138-
maintenance_ptr[i - 1] = 0;
139138
}
140139
#endif
141140

0 commit comments

Comments
 (0)