mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-11-03 21:48:15 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			129 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
#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;
 |