162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef __ASM_ARM_CP15_H 362306a36Sopenharmony_ci#define __ASM_ARM_CP15_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <asm/barrier.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci/* 862306a36Sopenharmony_ci * CR1 bits (CP#15 CR1) 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci#define CR_M (1 << 0) /* MMU enable */ 1162306a36Sopenharmony_ci#define CR_A (1 << 1) /* Alignment abort enable */ 1262306a36Sopenharmony_ci#define CR_C (1 << 2) /* Dcache enable */ 1362306a36Sopenharmony_ci#define CR_W (1 << 3) /* Write buffer enable */ 1462306a36Sopenharmony_ci#define CR_P (1 << 4) /* 32-bit exception handler */ 1562306a36Sopenharmony_ci#define CR_D (1 << 5) /* 32-bit data address range */ 1662306a36Sopenharmony_ci#define CR_L (1 << 6) /* Implementation defined */ 1762306a36Sopenharmony_ci#define CR_B (1 << 7) /* Big endian */ 1862306a36Sopenharmony_ci#define CR_S (1 << 8) /* System MMU protection */ 1962306a36Sopenharmony_ci#define CR_R (1 << 9) /* ROM MMU protection */ 2062306a36Sopenharmony_ci#define CR_F (1 << 10) /* Implementation defined */ 2162306a36Sopenharmony_ci#define CR_Z (1 << 11) /* Implementation defined */ 2262306a36Sopenharmony_ci#define CR_I (1 << 12) /* Icache enable */ 2362306a36Sopenharmony_ci#define CR_V (1 << 13) /* Vectors relocated to 0xffff0000 */ 2462306a36Sopenharmony_ci#define CR_RR (1 << 14) /* Round Robin cache replacement */ 2562306a36Sopenharmony_ci#define CR_L4 (1 << 15) /* LDR pc can set T bit */ 2662306a36Sopenharmony_ci#define CR_DT (1 << 16) 2762306a36Sopenharmony_ci#ifdef CONFIG_MMU 2862306a36Sopenharmony_ci#define CR_HA (1 << 17) /* Hardware management of Access Flag */ 2962306a36Sopenharmony_ci#else 3062306a36Sopenharmony_ci#define CR_BR (1 << 17) /* MPU Background region enable (PMSA) */ 3162306a36Sopenharmony_ci#endif 3262306a36Sopenharmony_ci#define CR_IT (1 << 18) 3362306a36Sopenharmony_ci#define CR_ST (1 << 19) 3462306a36Sopenharmony_ci#define CR_FI (1 << 21) /* Fast interrupt (lower latency mode) */ 3562306a36Sopenharmony_ci#define CR_U (1 << 22) /* Unaligned access operation */ 3662306a36Sopenharmony_ci#define CR_XP (1 << 23) /* Extended page tables */ 3762306a36Sopenharmony_ci#define CR_VE (1 << 24) /* Vectored interrupts */ 3862306a36Sopenharmony_ci#define CR_EE (1 << 25) /* Exception (Big) Endian */ 3962306a36Sopenharmony_ci#define CR_TRE (1 << 28) /* TEX remap enable */ 4062306a36Sopenharmony_ci#define CR_AFE (1 << 29) /* Access flag enable */ 4162306a36Sopenharmony_ci#define CR_TE (1 << 30) /* Thumb exception enable */ 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#if __LINUX_ARM_ARCH__ >= 4 4662306a36Sopenharmony_ci#define vectors_high() (get_cr() & CR_V) 4762306a36Sopenharmony_ci#else 4862306a36Sopenharmony_ci#define vectors_high() (0) 4962306a36Sopenharmony_ci#endif 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#ifdef CONFIG_CPU_CP15 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci#include <asm/vdso/cp15.h> 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ciextern unsigned long cr_alignment; /* defined in entry-armv.S */ 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistatic inline unsigned long get_cr(void) 5862306a36Sopenharmony_ci{ 5962306a36Sopenharmony_ci unsigned long val; 6062306a36Sopenharmony_ci asm("mrc p15, 0, %0, c1, c0, 0 @ get CR" : "=r" (val) : : "cc"); 6162306a36Sopenharmony_ci return val; 6262306a36Sopenharmony_ci} 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistatic inline void set_cr(unsigned long val) 6562306a36Sopenharmony_ci{ 6662306a36Sopenharmony_ci asm volatile("mcr p15, 0, %0, c1, c0, 0 @ set CR" 6762306a36Sopenharmony_ci : : "r" (val) : "cc"); 6862306a36Sopenharmony_ci isb(); 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistatic inline unsigned int get_auxcr(void) 7262306a36Sopenharmony_ci{ 7362306a36Sopenharmony_ci unsigned int val; 7462306a36Sopenharmony_ci asm("mrc p15, 0, %0, c1, c0, 1 @ get AUXCR" : "=r" (val)); 7562306a36Sopenharmony_ci return val; 7662306a36Sopenharmony_ci} 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cistatic inline void set_auxcr(unsigned int val) 7962306a36Sopenharmony_ci{ 8062306a36Sopenharmony_ci asm volatile("mcr p15, 0, %0, c1, c0, 1 @ set AUXCR" 8162306a36Sopenharmony_ci : : "r" (val)); 8262306a36Sopenharmony_ci isb(); 8362306a36Sopenharmony_ci} 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci#define CPACC_FULL(n) (3 << (n * 2)) 8662306a36Sopenharmony_ci#define CPACC_SVC(n) (1 << (n * 2)) 8762306a36Sopenharmony_ci#define CPACC_DISABLE(n) (0 << (n * 2)) 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_cistatic inline unsigned int get_copro_access(void) 9062306a36Sopenharmony_ci{ 9162306a36Sopenharmony_ci unsigned int val; 9262306a36Sopenharmony_ci asm("mrc p15, 0, %0, c1, c0, 2 @ get copro access" 9362306a36Sopenharmony_ci : "=r" (val) : : "cc"); 9462306a36Sopenharmony_ci return val; 9562306a36Sopenharmony_ci} 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cistatic inline void set_copro_access(unsigned int val) 9862306a36Sopenharmony_ci{ 9962306a36Sopenharmony_ci asm volatile("mcr p15, 0, %0, c1, c0, 2 @ set copro access" 10062306a36Sopenharmony_ci : : "r" (val) : "cc"); 10162306a36Sopenharmony_ci isb(); 10262306a36Sopenharmony_ci} 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci#else /* ifdef CONFIG_CPU_CP15 */ 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci/* 10762306a36Sopenharmony_ci * cr_alignment is tightly coupled to cp15 (at least in the minds of the 10862306a36Sopenharmony_ci * developers). Yielding 0 for machines without a cp15 (and making it 10962306a36Sopenharmony_ci * read-only) is fine for most cases and saves quite some #ifdeffery. 11062306a36Sopenharmony_ci */ 11162306a36Sopenharmony_ci#define cr_alignment UL(0) 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_cistatic inline unsigned long get_cr(void) 11462306a36Sopenharmony_ci{ 11562306a36Sopenharmony_ci return 0; 11662306a36Sopenharmony_ci} 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci#endif /* ifdef CONFIG_CPU_CP15 / else */ 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci#endif /* ifndef __ASSEMBLY__ */ 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci#endif 123