MIPS: cache: make index base address configurable
The index base address used for the cache initialisation is currently hard-coded to CKSEG0. Make this value configurable if a MIPS system needs to have a different address (e.g. in SRAM or ScratchPad RAM). Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
This commit is contained in:
		
							parent
							
								
									b838586086
								
							
						
					
					
						commit
						5ef337a037
					
				|  | @ -219,6 +219,18 @@ config MIPS_CM_BASE | ||||||
| 	  the GCRs occupy a region of the physical address space which is | 	  the GCRs occupy a region of the physical address space which is | ||||||
| 	  otherwise unused, or at minimum that software doesn't need to access. | 	  otherwise unused, or at minimum that software doesn't need to access. | ||||||
| 
 | 
 | ||||||
|  | config MIPS_CACHE_INDEX_BASE | ||||||
|  | 	hex "Index base address for cache initialisation" | ||||||
|  | 	default 0x80000000 if CPU_MIPS32 | ||||||
|  | 	default 0xffffffff80000000 if CPU_MIPS64 | ||||||
|  | 	help | ||||||
|  | 	  This is the base address for a memory block, which is used for | ||||||
|  | 	  initialising the cache lines. This is also the base address of a memory | ||||||
|  | 	  block which is used for loading and filling cache lines when | ||||||
|  | 	  SYS_MIPS_CACHE_INIT_RAM_LOAD is selected. | ||||||
|  | 	  Normally this is CKSEG0. If the MIPS system needs to move this block | ||||||
|  | 	  to some SRAM or ScratchPad RAM, adapt this option accordingly. | ||||||
|  | 
 | ||||||
| endmenu | endmenu | ||||||
| 
 | 
 | ||||||
| menu "OS boot interface" | menu "OS boot interface" | ||||||
|  |  | ||||||
|  | @ -18,8 +18,6 @@ | ||||||
| #define CONFIG_SYS_MIPS_CACHE_MODE CONF_CM_CACHABLE_NONCOHERENT | #define CONFIG_SYS_MIPS_CACHE_MODE CONF_CM_CACHABLE_NONCOHERENT | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
| #define INDEX_BASE	CKSEG0 |  | ||||||
| 
 |  | ||||||
| 	.macro	f_fill64 dst, offset, val | 	.macro	f_fill64 dst, offset, val | ||||||
| 	LONG_S	\val, (\offset +  0 * LONGSIZE)(\dst) | 	LONG_S	\val, (\offset +  0 * LONGSIZE)(\dst) | ||||||
| 	LONG_S	\val, (\offset +  1 * LONGSIZE)(\dst) | 	LONG_S	\val, (\offset +  1 * LONGSIZE)(\dst) | ||||||
|  | @ -256,7 +254,7 @@ l2_probe_done: | ||||||
| 	/* | 	/* | ||||||
| 	 * Now clear that much memory starting from zero. | 	 * Now clear that much memory starting from zero. | ||||||
| 	 */ | 	 */ | ||||||
| 	PTR_LI		a0, CKSEG1 | 	PTR_LI		a0, CKSEG1ADDR(CONFIG_MIPS_CACHE_INDEX_BASE) | ||||||
| 	PTR_ADDU	a1, a0, v0 | 	PTR_ADDU	a1, a0, v0 | ||||||
| 2:	PTR_ADDIU	a0, 64 | 2:	PTR_ADDIU	a0, 64 | ||||||
| 	f_fill64	a0, -64, zero | 	f_fill64	a0, -64, zero | ||||||
|  | @ -272,7 +270,7 @@ l2_probe_done: | ||||||
| 	bnez		R_L2_BYPASSED, l1_init | 	bnez		R_L2_BYPASSED, l1_init | ||||||
| 
 | 
 | ||||||
| l2_init: | l2_init: | ||||||
| 	PTR_LI		t0, INDEX_BASE | 	PTR_LI		t0, CKSEG0ADDR(CONFIG_MIPS_CACHE_INDEX_BASE) | ||||||
| 	PTR_ADDU	t1, t0, R_L2_SIZE | 	PTR_ADDU	t1, t0, R_L2_SIZE | ||||||
| 1:	cache		INDEX_STORE_TAG_SD, 0(t0) | 1:	cache		INDEX_STORE_TAG_SD, 0(t0) | ||||||
| 	PTR_ADDU	t0, t0, R_L2_LINE | 	PTR_ADDU	t0, t0, R_L2_LINE | ||||||
|  | @ -308,16 +306,16 @@ l1_init: | ||||||
| 	 * Initialize the I-cache first, | 	 * Initialize the I-cache first, | ||||||
| 	 */ | 	 */ | ||||||
| 	blez		R_IC_SIZE, 1f | 	blez		R_IC_SIZE, 1f | ||||||
| 	PTR_LI		t0, INDEX_BASE | 	PTR_LI		t0, CKSEG0ADDR(CONFIG_MIPS_CACHE_INDEX_BASE) | ||||||
| 	PTR_ADDU	t1, t0, R_IC_SIZE | 	PTR_ADDU	t1, t0, R_IC_SIZE | ||||||
| 	/* clear tag to invalidate */ | 	/* clear tag to invalidate */ | ||||||
| 	cache_loop	t0, t1, R_IC_LINE, INDEX_STORE_TAG_I | 	cache_loop	t0, t1, R_IC_LINE, INDEX_STORE_TAG_I | ||||||
| #ifdef CONFIG_SYS_MIPS_CACHE_INIT_RAM_LOAD | #ifdef CONFIG_SYS_MIPS_CACHE_INIT_RAM_LOAD | ||||||
| 	/* fill once, so data field parity is correct */ | 	/* fill once, so data field parity is correct */ | ||||||
| 	PTR_LI		t0, INDEX_BASE | 	PTR_LI		t0, CKSEG0ADDR(CONFIG_MIPS_CACHE_INDEX_BASE) | ||||||
| 	cache_loop	t0, t1, R_IC_LINE, FILL | 	cache_loop	t0, t1, R_IC_LINE, FILL | ||||||
| 	/* invalidate again - prudent but not strictly neccessary */ | 	/* invalidate again - prudent but not strictly neccessary */ | ||||||
| 	PTR_LI		t0, INDEX_BASE | 	PTR_LI		t0, CKSEG0ADDR(CONFIG_MIPS_CACHE_INDEX_BASE) | ||||||
| 	cache_loop	t0, t1, R_IC_LINE, INDEX_STORE_TAG_I | 	cache_loop	t0, t1, R_IC_LINE, INDEX_STORE_TAG_I | ||||||
| #endif | #endif | ||||||
| 	sync | 	sync | ||||||
|  | @ -340,18 +338,18 @@ l1_init: | ||||||
| 	 * then initialize D-cache. | 	 * then initialize D-cache. | ||||||
| 	 */ | 	 */ | ||||||
| 1:	blez		R_DC_SIZE, 3f | 1:	blez		R_DC_SIZE, 3f | ||||||
| 	PTR_LI		t0, INDEX_BASE | 	PTR_LI		t0, CKSEG0ADDR(CONFIG_MIPS_CACHE_INDEX_BASE) | ||||||
| 	PTR_ADDU	t1, t0, R_DC_SIZE | 	PTR_ADDU	t1, t0, R_DC_SIZE | ||||||
| 	/* clear all tags */ | 	/* clear all tags */ | ||||||
| 	cache_loop	t0, t1, R_DC_LINE, INDEX_STORE_TAG_D | 	cache_loop	t0, t1, R_DC_LINE, INDEX_STORE_TAG_D | ||||||
| #ifdef CONFIG_SYS_MIPS_CACHE_INIT_RAM_LOAD | #ifdef CONFIG_SYS_MIPS_CACHE_INIT_RAM_LOAD | ||||||
| 	/* load from each line (in cached space) */ | 	/* load from each line (in cached space) */ | ||||||
| 	PTR_LI		t0, INDEX_BASE | 	PTR_LI		t0, CKSEG0ADDR(CONFIG_MIPS_CACHE_INDEX_BASE) | ||||||
| 2:	LONG_L		zero, 0(t0) | 2:	LONG_L		zero, 0(t0) | ||||||
| 	PTR_ADDU	t0, R_DC_LINE | 	PTR_ADDU	t0, R_DC_LINE | ||||||
| 	bne		t0, t1, 2b | 	bne		t0, t1, 2b | ||||||
| 	/* clear all tags */ | 	/* clear all tags */ | ||||||
| 	PTR_LI		t0, INDEX_BASE | 	PTR_LI		t0, CKSEG0ADDR(CONFIG_MIPS_CACHE_INDEX_BASE) | ||||||
| 	cache_loop	t0, t1, R_DC_LINE, INDEX_STORE_TAG_D | 	cache_loop	t0, t1, R_DC_LINE, INDEX_STORE_TAG_D | ||||||
| #endif | #endif | ||||||
| 3: | 3: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue