| #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; |