diff options
Diffstat (limited to 'cpu/bf537/cache.S')
| -rw-r--r-- | cpu/bf537/cache.S | 128 | 
1 files changed, 128 insertions, 0 deletions
| diff --git a/cpu/bf537/cache.S b/cpu/bf537/cache.S new file mode 100644 index 000000000..5bda5bf97 --- /dev/null +++ b/cpu/bf537/cache.S @@ -0,0 +1,128 @@ +#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; |