|  | #define ASSEMBLY | 
|  | #include <asm/linkage.h> | 
|  | #include <config.h> | 
|  | #include <asm/blackfin.h> | 
|  |  | 
|  | .text | 
|  | .align 2 | 
|  | ENTRY(_blackfin_icache_flush_range) | 
|  | R2 = -32; | 
|  | R2 = R0 & R2; | 
|  | P0 = R2; | 
|  | P1 = R1; | 
|  | CSYNC; | 
|  | 1: | 
|  | IFLUSH[P0++]; | 
|  | CC = P0 < P1(iu); | 
|  | IF CC JUMP 1b(bp); | 
|  | IFLUSH[P0]; | 
|  | SSYNC; | 
|  | RTS; | 
|  |  | 
|  | ENTRY(_blackfin_dcache_flush_range) | 
|  | R2 = -32; | 
|  | R2 = R0 & R2; | 
|  | P0 = R2; | 
|  | P1 = R1; | 
|  | CSYNC; | 
|  | 1: | 
|  | FLUSH[P0++]; | 
|  | CC = P0 < P1(iu); | 
|  | IF CC JUMP 1b(bp); | 
|  | FLUSH[P0]; | 
|  | SSYNC; | 
|  | RTS; | 
|  |  | 
|  | ENTRY(_icache_invalidate) | 
|  | ENTRY(_invalidate_entire_icache) | 
|  | [--SP] = (R7:5); | 
|  |  | 
|  | P0.L = (IMEM_CONTROL & 0xFFFF); | 
|  | P0.H = (IMEM_CONTROL >> 16); | 
|  | R7 =[P0]; | 
|  |  | 
|  | /* | 
|  | * Clear the IMC bit , All valid bits in the instruction | 
|  | * cache are set to the invalid state | 
|  | */ | 
|  | BITCLR(R7, IMC_P); | 
|  | CLI R6; | 
|  | /* SSYNC required before invalidating cache. */ | 
|  | SSYNC; | 
|  | .align 8; | 
|  | [P0] = R7; | 
|  | SSYNC; | 
|  | STI R6; | 
|  |  | 
|  | /* Configures the instruction cache agian */ | 
|  | R6 = (IMC | ENICPLB); | 
|  | R7 = R7 | R6; | 
|  |  | 
|  | CLI R6; | 
|  | SSYNC; | 
|  | .align 8; | 
|  | [P0] = R7; | 
|  | SSYNC; | 
|  | STI R6; | 
|  |  | 
|  | (R7:5) =[SP++]; | 
|  | RTS; | 
|  |  | 
|  | /* | 
|  | * Invalidate the Entire Data cache by | 
|  | * clearing DMC[1:0] bits | 
|  | */ | 
|  | ENTRY(_invalidate_entire_dcache) | 
|  | ENTRY(_dcache_invalidate) | 
|  | [--SP] = (R7:6); | 
|  |  | 
|  | P0.L = (DMEM_CONTROL & 0xFFFF); | 
|  | P0.H = (DMEM_CONTROL >> 16); | 
|  | R7 =[P0]; | 
|  |  | 
|  | /* | 
|  | * Clear the DMC[1:0] bits, All valid bits in the data | 
|  | * cache are set to the invalid state | 
|  | */ | 
|  | BITCLR(R7, DMC0_P); | 
|  | BITCLR(R7, DMC1_P); | 
|  | CLI R6; | 
|  | SSYNC; | 
|  | .align 8; | 
|  | [P0] = R7; | 
|  | SSYNC; | 
|  | STI R6; | 
|  | /* Configures the data cache again */ | 
|  |  | 
|  | R6 = (ACACHE_BCACHE | ENDCPLB | PORT_PREF0); | 
|  | R7 = R7 | R6; | 
|  |  | 
|  | CLI R6; | 
|  | SSYNC; | 
|  | .align 8; | 
|  | [P0] = R7; | 
|  | SSYNC; | 
|  | STI R6; | 
|  |  | 
|  | (R7:6) =[SP++]; | 
|  | RTS; | 
|  |  | 
|  | ENTRY(_blackfin_dcache_invalidate_range) | 
|  | R2 = -32; | 
|  | R2 = R0 & R2; | 
|  | P0 = R2; | 
|  | P1 = R1; | 
|  | CSYNC; | 
|  | 1: | 
|  | FLUSHINV[P0++]; | 
|  | CC = P0 < P1(iu); | 
|  | IF CC JUMP 1b(bp); | 
|  |  | 
|  | /* | 
|  | * If the data crosses a cache line, then we'll be pointing to | 
|  | * the last cache line, but won't have flushed/invalidated it yet, so do | 
|  | * one more. | 
|  | */ | 
|  | FLUSHINV[P0]; | 
|  | SSYNC; | 
|  | RTS; |