mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 18:35:42 +01:00 
			
		
		
		
	Previous SLC management implementation is broken. Seems like it was never sufficiently tested probably because most of the time IOC was used instead (i.e. no manual cache operations were done). Now if we disable IOC in U-boot we'll get a lot of errors while using DMA-enabled peripherals. This time we fix it by substitution of broken per-line SLC operations region operations as it is done in the Linux kernel (we took it from v4.14 which is the latest stable as of today). Among other things this implementation might be a bit faster because instead of iteration over each and every cache line we're taking care about entire region in one go. Main changes: * Replaced __slc_line_op (per line operations) by __slc_rgn_op (region operations). * Reworked __slc_entire_op to get rid of __after_slc_op and __before_slc_op functions. Note flush fix (flush only instead of flush-n-inv when OP_FLUSH is used, see [1] for more details) is already incorporated here. * Added SLC invalidation to invalidate_icache_all(). * Added (start >= end) check to invalidate_dcache_range() and flush_dcache_range() as some buggy drivers pass region start == end. * Added read-out of MMU BCR so we may know if PAE40 exists in HW and then act on a particular AUX regs accordingly. [1] http://lists.infradead.org/pipermail/linux-snps-arc/2018-January/003357.html Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com> Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
		
			
				
	
	
		
			94 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. All rights reserved.
 | |
|  *
 | |
|  * SPDX-License-Identifier:	GPL-2.0+
 | |
|  */
 | |
| 
 | |
| #ifndef _ASM_ARC_ARCREGS_H
 | |
| #define _ASM_ARC_ARCREGS_H
 | |
| 
 | |
| #include <asm/cache.h>
 | |
| 
 | |
| /*
 | |
|  * ARC architecture has additional address space - auxiliary registers.
 | |
|  * These registers are mostly used for configuration purposes.
 | |
|  * These registers are not memory mapped and special commands are used for
 | |
|  * access: "lr"/"sr".
 | |
|  */
 | |
| 
 | |
| #define ARC_AUX_IDENTITY	0x04
 | |
| #define ARC_AUX_STATUS32	0x0a
 | |
| 
 | |
| /* Instruction cache related auxiliary registers */
 | |
| #define ARC_AUX_IC_IVIC		0x10
 | |
| #define ARC_AUX_IC_CTRL		0x11
 | |
| #define ARC_AUX_IC_IVIL		0x19
 | |
| #if (CONFIG_ARC_MMU_VER == 3)
 | |
| #define ARC_AUX_IC_PTAG		0x1E
 | |
| #endif
 | |
| #define ARC_BCR_IC_BUILD	0x77
 | |
| #define AUX_AUX_CACHE_LIMIT		0x5D
 | |
| #define ARC_AUX_NON_VOLATILE_LIMIT	0x5E
 | |
| 
 | |
| /* ICCM and DCCM auxiliary registers */
 | |
| #define ARC_AUX_DCCM_BASE	0x18	/* DCCM Base Addr ARCv2 */
 | |
| #define ARC_AUX_ICCM_BASE	0x208	/* ICCM Base Addr ARCv2 */
 | |
| 
 | |
| /* Timer related auxiliary registers */
 | |
| #define ARC_AUX_TIMER0_CNT	0x21	/* Timer 0 count */
 | |
| #define ARC_AUX_TIMER0_CTRL	0x22	/* Timer 0 control */
 | |
| #define ARC_AUX_TIMER0_LIMIT	0x23	/* Timer 0 limit */
 | |
| 
 | |
| #define ARC_AUX_TIMER1_CNT	0x100	/* Timer 1 count */
 | |
| #define ARC_AUX_TIMER1_CTRL	0x101	/* Timer 1 control */
 | |
| #define ARC_AUX_TIMER1_LIMIT	0x102	/* Timer 1 limit */
 | |
| 
 | |
| #define ARC_AUX_INTR_VEC_BASE	0x25
 | |
| 
 | |
| /* Data cache related auxiliary registers */
 | |
| #define ARC_AUX_DC_IVDC		0x47
 | |
| #define ARC_AUX_DC_CTRL		0x48
 | |
| 
 | |
| #define ARC_AUX_DC_IVDL		0x4A
 | |
| #define ARC_AUX_DC_FLSH		0x4B
 | |
| #define ARC_AUX_DC_FLDL		0x4C
 | |
| #if (CONFIG_ARC_MMU_VER == 3)
 | |
| #define ARC_AUX_DC_PTAG		0x5C
 | |
| #endif
 | |
| #define ARC_BCR_DC_BUILD	0x72
 | |
| #define ARC_BCR_SLC		0xce
 | |
| #define ARC_AUX_SLC_CONFIG	0x901
 | |
| #define ARC_AUX_SLC_CTRL	0x903
 | |
| #define ARC_AUX_SLC_FLUSH	0x904
 | |
| #define ARC_AUX_SLC_INVALIDATE	0x905
 | |
| #define ARC_AUX_SLC_IVDL	0x910
 | |
| #define ARC_AUX_SLC_FLDL	0x912
 | |
| #define ARC_AUX_SLC_RGN_START	0x914
 | |
| #define ARC_AUX_SLC_RGN_START1	0x915
 | |
| #define ARC_AUX_SLC_RGN_END	0x916
 | |
| #define ARC_AUX_SLC_RGN_END1	0x917
 | |
| #define ARC_BCR_CLUSTER		0xcf
 | |
| 
 | |
| /* MMU Management regs */
 | |
| #define ARC_AUX_MMU_BCR		0x06f
 | |
| 
 | |
| /* IO coherency related auxiliary registers */
 | |
| #define ARC_AUX_IO_COH_ENABLE	0x500
 | |
| #define ARC_AUX_IO_COH_PARTIAL	0x501
 | |
| #define ARC_AUX_IO_COH_AP0_BASE	0x508
 | |
| #define ARC_AUX_IO_COH_AP0_SIZE	0x509
 | |
| 
 | |
| #ifndef __ASSEMBLY__
 | |
| /* Accessors for auxiliary registers */
 | |
| #define read_aux_reg(reg)	__builtin_arc_lr(reg)
 | |
| 
 | |
| /* gcc builtin sr needs reg param to be long immediate */
 | |
| #define write_aux_reg(reg_immed, val)		\
 | |
| 		__builtin_arc_sr((unsigned int)val, reg_immed)
 | |
| 
 | |
| /* ARCNUM [15:8] - field to identify each core in a multi-core system */
 | |
| #define CPU_ID_GET()	((read_aux_reg(ARC_AUX_IDENTITY) & 0xFF00) >> 8)
 | |
| #endif /* __ASSEMBLY__ */
 | |
| 
 | |
| #endif /* _ASM_ARC_ARCREGS_H */
 |