void alt_dcache_flush (void* start, alt_u32 len) { #if NIOS2_DCACHE_SIZE > 0 char* i; char* end = ((char*) start) + len; for (i = start; i < end; i+= NIOS2_DCACHE_LINE_SIZE) { ALT_FLUSH_DATA(i); } /* * For an unaligned flush request, we've got one more line left. * Note that this is dependent on NIOS2_DCACHE_LINE_SIZE to be a * multiple of 2 (which it always is). */ if (((alt_u32) start) & (NIOS2_DCACHE_LINE_SIZE - 1)) { ALT_FLUSH_DATA(i); } #endif /* NIOS2_DCACHE_SIZE > 0 */ }
void alt_dcache_flush (void* start, alt_u32 len) { #if NIOS2_DCACHE_SIZE > 0 char* i; char* end; /* * This is the most we would ever need to flush. * * SPR 196942, 2006.01.13: The cache flush loop below will use the * 'flushda' instruction if its available; in that case each line * must be flushed individually, and thus 'len' cannot be trimmed. */ #ifndef NIOS2_FLUSHDA_SUPPORTED if (len > NIOS2_DCACHE_SIZE) { len = NIOS2_DCACHE_SIZE; } #endif end = ((char*) start) + len; for (i = start; i < end; i+= NIOS2_DCACHE_LINE_SIZE) { ALT_FLUSH_DATA(i); } /* * For an unaligned flush request, we've got one more line left. * Note that this is dependent on NIOS2_DCACHE_LINE_SIZE to be a * multiple of 2 (which it always is). */ if (((alt_u32) start) & (NIOS2_DCACHE_LINE_SIZE - 1)) { ALT_FLUSH_DATA(i); } #endif /* NIOS2_DCACHE_SIZE > 0 */ }