|
@@ -20,6 +20,7 @@
|
|
|
#ifndef __ASM_SYSREG_H
|
|
|
#define __ASM_SYSREG_H
|
|
|
|
|
|
+#include <asm/compiler.h>
|
|
|
#include <linux/stringify.h>
|
|
|
|
|
|
/*
|
|
@@ -398,25 +399,81 @@
|
|
|
|
|
|
/* Common SCTLR_ELx flags. */
|
|
|
#define SCTLR_ELx_EE (1 << 25)
|
|
|
+#define SCTLR_ELx_WXN (1 << 19)
|
|
|
#define SCTLR_ELx_I (1 << 12)
|
|
|
#define SCTLR_ELx_SA (1 << 3)
|
|
|
#define SCTLR_ELx_C (1 << 2)
|
|
|
#define SCTLR_ELx_A (1 << 1)
|
|
|
#define SCTLR_ELx_M 1
|
|
|
|
|
|
+#define SCTLR_ELx_FLAGS (SCTLR_ELx_M | SCTLR_ELx_A | SCTLR_ELx_C | \
|
|
|
+ SCTLR_ELx_SA | SCTLR_ELx_I)
|
|
|
+
|
|
|
+/* SCTLR_EL2 specific flags. */
|
|
|
#define SCTLR_EL2_RES1 ((1 << 4) | (1 << 5) | (1 << 11) | (1 << 16) | \
|
|
|
(1 << 18) | (1 << 22) | (1 << 23) | (1 << 28) | \
|
|
|
(1 << 29))
|
|
|
+#define SCTLR_EL2_RES0 ((1 << 6) | (1 << 7) | (1 << 8) | (1 << 9) | \
|
|
|
+ (1 << 10) | (1 << 13) | (1 << 14) | (1 << 15) | \
|
|
|
+ (1 << 17) | (1 << 20) | (1 << 21) | (1 << 24) | \
|
|
|
+ (1 << 26) | (1 << 27) | (1 << 30) | (1 << 31))
|
|
|
+
|
|
|
+#ifdef CONFIG_CPU_BIG_ENDIAN
|
|
|
+#define ENDIAN_SET_EL2 SCTLR_ELx_EE
|
|
|
+#define ENDIAN_CLEAR_EL2 0
|
|
|
+#else
|
|
|
+#define ENDIAN_SET_EL2 0
|
|
|
+#define ENDIAN_CLEAR_EL2 SCTLR_ELx_EE
|
|
|
+#endif
|
|
|
+
|
|
|
+/* SCTLR_EL2 value used for the hyp-stub */
|
|
|
+#define SCTLR_EL2_SET (ENDIAN_SET_EL2 | SCTLR_EL2_RES1)
|
|
|
+#define SCTLR_EL2_CLEAR (SCTLR_ELx_M | SCTLR_ELx_A | SCTLR_ELx_C | \
|
|
|
+ SCTLR_ELx_SA | SCTLR_ELx_I | SCTLR_ELx_WXN | \
|
|
|
+ ENDIAN_CLEAR_EL2 | SCTLR_EL2_RES0)
|
|
|
+
|
|
|
+/* Check all the bits are accounted for */
|
|
|
+#define SCTLR_EL2_BUILD_BUG_ON_MISSING_BITS BUILD_BUG_ON((SCTLR_EL2_SET ^ SCTLR_EL2_CLEAR) != ~0)
|
|
|
|
|
|
-#define SCTLR_ELx_FLAGS (SCTLR_ELx_M | SCTLR_ELx_A | SCTLR_ELx_C | \
|
|
|
- SCTLR_ELx_SA | SCTLR_ELx_I)
|
|
|
|
|
|
/* SCTLR_EL1 specific flags. */
|
|
|
#define SCTLR_EL1_UCI (1 << 26)
|
|
|
+#define SCTLR_EL1_E0E (1 << 24)
|
|
|
#define SCTLR_EL1_SPAN (1 << 23)
|
|
|
+#define SCTLR_EL1_NTWE (1 << 18)
|
|
|
+#define SCTLR_EL1_NTWI (1 << 16)
|
|
|
#define SCTLR_EL1_UCT (1 << 15)
|
|
|
+#define SCTLR_EL1_DZE (1 << 14)
|
|
|
+#define SCTLR_EL1_UMA (1 << 9)
|
|
|
#define SCTLR_EL1_SED (1 << 8)
|
|
|
+#define SCTLR_EL1_ITD (1 << 7)
|
|
|
#define SCTLR_EL1_CP15BEN (1 << 5)
|
|
|
+#define SCTLR_EL1_SA0 (1 << 4)
|
|
|
+
|
|
|
+#define SCTLR_EL1_RES1 ((1 << 11) | (1 << 20) | (1 << 22) | (1 << 28) | \
|
|
|
+ (1 << 29))
|
|
|
+#define SCTLR_EL1_RES0 ((1 << 6) | (1 << 10) | (1 << 13) | (1 << 17) | \
|
|
|
+ (1 << 21) | (1 << 27) | (1 << 30) | (1 << 31))
|
|
|
+
|
|
|
+#ifdef CONFIG_CPU_BIG_ENDIAN
|
|
|
+#define ENDIAN_SET_EL1 (SCTLR_EL1_E0E | SCTLR_ELx_EE)
|
|
|
+#define ENDIAN_CLEAR_EL1 0
|
|
|
+#else
|
|
|
+#define ENDIAN_SET_EL1 0
|
|
|
+#define ENDIAN_CLEAR_EL1 (SCTLR_EL1_E0E | SCTLR_ELx_EE)
|
|
|
+#endif
|
|
|
+
|
|
|
+#define SCTLR_EL1_SET (SCTLR_ELx_M | SCTLR_ELx_C | SCTLR_ELx_SA |\
|
|
|
+ SCTLR_EL1_SA0 | SCTLR_EL1_SED | SCTLR_ELx_I |\
|
|
|
+ SCTLR_EL1_DZE | SCTLR_EL1_UCT | SCTLR_EL1_NTWI |\
|
|
|
+ SCTLR_EL1_NTWE | SCTLR_EL1_SPAN | ENDIAN_SET_EL1 |\
|
|
|
+ SCTLR_EL1_UCI | SCTLR_EL1_RES1)
|
|
|
+#define SCTLR_EL1_CLEAR (SCTLR_ELx_A | SCTLR_EL1_CP15BEN | SCTLR_EL1_ITD |\
|
|
|
+ SCTLR_EL1_UMA | SCTLR_ELx_WXN | ENDIAN_CLEAR_EL1 |\
|
|
|
+ SCTLR_EL1_RES0)
|
|
|
+
|
|
|
+/* Check all the bits are accounted for */
|
|
|
+#define SCTLR_EL1_BUILD_BUG_ON_MISSING_BITS BUILD_BUG_ON((SCTLR_EL1_SET ^ SCTLR_EL1_CLEAR) != ~0)
|
|
|
|
|
|
/* id_aa64isar0 */
|
|
|
#define ID_AA64ISAR0_FHM_SHIFT 48
|
|
@@ -593,6 +650,7 @@
|
|
|
|
|
|
#else
|
|
|
|
|
|
+#include <linux/build_bug.h>
|
|
|
#include <linux/types.h>
|
|
|
|
|
|
asm(
|
|
@@ -649,6 +707,9 @@ static inline void config_sctlr_el1(u32 clear, u32 set)
|
|
|
{
|
|
|
u32 val;
|
|
|
|
|
|
+ SCTLR_EL2_BUILD_BUG_ON_MISSING_BITS;
|
|
|
+ SCTLR_EL1_BUILD_BUG_ON_MISSING_BITS;
|
|
|
+
|
|
|
val = read_sysreg(sctlr_el1);
|
|
|
val &= ~clear;
|
|
|
val |= set;
|