libpayload arm64: Add helper functions with el argument
Allow read/write to registers at a given el. Also, make read/write
registers at current el call this newly added function.
BRANCH=none
BUG=none
TEST=build and boot on mt8173-evb
Change-Id: Id69f0fdc07193c5c7e997712f0cd99de6f41510b
Signed-off-by: Patrick Georgi <pgeorgi@chromium.org>
Original-Commit-Id: c091917babc39d9ab997f51f81b486c9aa900c24
Original-Change-Id: I0944946642066b88331e497a92388e74e86902d0
Original-Signed-off-by: HC Yen <hc.yen@mediatek.com>
Original-Reviewed-on: https://chromium-review.googlesource.com/240322
Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/8798
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
diff --git a/payloads/libpayload/include/arm64/arch/lib_helpers.h b/payloads/libpayload/include/arm64/arch/lib_helpers.h
index d98d6f7..ca68435 100644
--- a/payloads/libpayload/include/arm64/arch/lib_helpers.h
+++ b/payloads/libpayload/include/arm64/arch/lib_helpers.h
@@ -96,57 +96,56 @@
#define CURRENT_EL_MASK 0x3
#define CURRENT_EL_SHIFT 2
+#include <stdint.h>
+
#define DAIF_DBG_BIT (1<<3)
#define DAIF_ABT_BIT (1<<2)
#define DAIF_IRQ_BIT (1<<1)
#define DAIF_FIQ_BIT (1<<0)
-#define SWITCH_CASE_READ(func,var,type) do { \
- type var = -1; \
- uint8_t current_el = get_current_el(); \
- switch(current_el) { \
- case EL1: \
- var = func##_el1(); \
- break; \
- case EL2: \
- var = func##_el2(); \
- break; \
- case EL3: \
- var = func##_el3(); \
- break; \
- } \
- return var; \
- } while(0)
+#define SWITCH_CASE_READ(func, var, type, el) do { \
+ type var = -1; \
+ switch (el) { \
+ case EL1: \
+ var = func##_el1(); \
+ break; \
+ case EL2: \
+ var = func##_el2(); \
+ break; \
+ case EL3: \
+ var = func##_el3(); \
+ break; \
+ } \
+ return var; \
+ } while (0)
-#define SWITCH_CASE_WRITE(func,var) do { \
- uint8_t current_el = get_current_el(); \
- switch(current_el) { \
- case EL1: \
- func##_el1(var); \
- break; \
- case EL2: \
- func##_el2(var); \
- break; \
- case EL3: \
- func##_el3(var); \
- break; \
- } \
- } while(0)
+#define SWITCH_CASE_WRITE(func, var, el) do { \
+ switch (el) { \
+ case EL1: \
+ func##_el1(var); \
+ break; \
+ case EL2: \
+ func##_el2(var); \
+ break; \
+ case EL3: \
+ func##_el3(var); \
+ break; \
+ } \
+ } while (0)
-#define SWITCH_CASE_TLBI(func) do { \
- uint8_t current_el = get_current_el(); \
- switch(current_el) { \
- case EL1: \
+#define SWITCH_CASE_TLBI(func, el) do { \
+ switch (el) { \
+ case EL1: \
func##_el1(); \
break; \
- case EL2: \
+ case EL2: \
func##_el2(); \
break; \
- case EL3: \
+ case EL3: \
func##_el3(); \
break; \
} \
- } while(0)
+ } while (0)
/* PSTATE and special purpose register access functions */
uint32_t raw_read_current_el(void);
@@ -173,6 +172,8 @@
void raw_write_elr_el3(uint64_t elr_el3);
uint64_t raw_read_elr_current(void);
void raw_write_elr_current(uint64_t elr);
+uint64_t raw_read_elr(uint32_t el);
+void raw_write_elr(uint64_t elr, uint32_t el);
uint32_t raw_read_fpcr(void);
void raw_write_fpcr(uint32_t fpcr);
uint32_t raw_read_fpsr(void);
@@ -199,6 +200,8 @@
void raw_write_spsr_el3(uint32_t spsr_el3);
uint32_t raw_read_spsr_current(void);
void raw_write_spsr_current(uint32_t spsr);
+uint32_t raw_read_spsr(uint32_t el);
+void raw_write_spsr(uint32_t spsr, uint32_t el);
uint32_t raw_read_spsr_fiq(void);
void raw_write_spsr_fiq(uint32_t spsr_fiq);
uint32_t raw_read_spsr_irq(void);
@@ -215,6 +218,8 @@
void raw_write_actlr_el3(uint32_t actlr_el3);
uint32_t raw_read_actlr_current(void);
void raw_write_actlr_current(uint32_t actlr);
+uint32_t raw_read_actlr(uint32_t el);
+void raw_write_actlr(uint32_t actlr, uint32_t el);
uint32_t raw_read_afsr0_el1(void);
void raw_write_afsr0_el1(uint32_t afsr0_el1);
uint32_t raw_read_afsr0_el2(void);
@@ -223,6 +228,8 @@
void raw_write_afsr0_el3(uint32_t afsr0_el3);
uint32_t raw_read_afsr0_current(void);
void raw_write_afsr0_current(uint32_t afsr0);
+uint32_t raw_read_afsr0(uint32_t el);
+void raw_write_afsr0(uint32_t afsr0, uint32_t el);
uint32_t raw_read_afsr1_el1(void);
void raw_write_afsr1_el1(uint32_t afsr1_el1);
uint32_t raw_read_afsr1_el2(void);
@@ -231,6 +238,8 @@
void raw_write_afsr1_el3(uint32_t afsr1_el3);
uint32_t raw_read_afsr1_current(void);
void raw_write_afsr1_current(uint32_t afsr1);
+uint32_t raw_read_afsr1(uint32_t el);
+void raw_write_afsr1(uint32_t afsr1, uint32_t el);
uint32_t raw_read_aidr_el1(void);
uint64_t raw_read_amair_el1(void);
void raw_write_amair_el1(uint64_t amair_el1);
@@ -240,6 +249,8 @@
void raw_write_amair_el3(uint64_t amair_el3);
uint64_t raw_read_amair_current(void);
void raw_write_amair_current(uint64_t amair);
+uint64_t raw_read_amair(uint32_t el);
+void raw_write_amair(uint64_t amair, uint32_t el);
uint32_t raw_read_ccsidr_el1(void);
uint32_t raw_read_clidr_el1(void);
uint32_t raw_read_cpacr_el1(void);
@@ -248,8 +259,6 @@
void raw_write_cptr_el2(uint32_t cptr_el2);
uint32_t raw_read_cptr_el3(void);
void raw_write_cptr_el3(uint32_t cptr_el3);
-uint32_t raw_read_cptr_current(void);
-void raw_write_cptr_current(uint32_t cptr);
uint32_t raw_read_csselr_el1(void);
void raw_write_csselr_el1(uint32_t csselr_el1);
uint32_t raw_read_ctr_el0(void);
@@ -261,6 +270,8 @@
void raw_write_esr_el3(uint32_t esr_el3);
uint32_t raw_read_esr_current(void);
void raw_write_esr_current(uint32_t esr);
+uint32_t raw_read_esr(uint32_t el);
+void raw_write_esr(uint32_t esr, uint32_t el);
uint64_t raw_read_far_el1(void);
void raw_write_far_el1(uint64_t far_el1);
uint64_t raw_read_far_el2(void);
@@ -269,6 +280,8 @@
void raw_write_far_el3(uint64_t far_el3);
uint64_t raw_read_far_current(void);
void raw_write_far_current(uint64_t far);
+uint64_t raw_read_far(uint32_t el);
+void raw_write_far(uint64_t far, uint32_t el);
uint64_t raw_read_hcr_el2(void);
void raw_write_hcr_el2(uint64_t hcr_el2);
uint64_t raw_read_aa64pfr0_el1(void);
@@ -280,6 +293,8 @@
void raw_write_mair_el3(uint64_t mair_el3);
uint64_t raw_read_mair_current(void);
void raw_write_mair_current(uint64_t mair);
+uint64_t raw_read_mair(uint32_t el);
+void raw_write_mair(uint64_t mair, uint32_t el);
uint64_t raw_read_mpidr_el1(void);
uint32_t raw_read_rmr_el1(void);
void raw_write_rmr_el1(uint32_t rmr_el1);
@@ -289,6 +304,8 @@
void raw_write_rmr_el3(uint32_t rmr_el3);
uint32_t raw_read_rmr_current(void);
void raw_write_rmr_current(uint32_t rmr);
+uint32_t raw_read_rmr(uint32_t el);
+void raw_write_rmr(uint32_t rmr, uint32_t el);
uint64_t raw_read_rvbar_el1(void);
void raw_write_rvbar_el1(uint64_t rvbar_el1);
uint64_t raw_read_rvbar_el2(void);
@@ -297,6 +314,8 @@
void raw_write_rvbar_el3(uint64_t rvbar_el3);
uint64_t raw_read_rvbar_current(void);
void raw_write_rvbar_current(uint64_t rvbar);
+uint64_t raw_read_rvbar(uint32_t el);
+void raw_write_rvbar(uint64_t rvbar, uint32_t el);
uint32_t raw_read_scr_el3(void);
void raw_write_scr_el3(uint32_t scr_el3);
uint32_t raw_read_sctlr_el1(void);
@@ -307,6 +326,8 @@
void raw_write_sctlr_el3(uint32_t sctlr_el3);
uint32_t raw_read_sctlr_current(void);
void raw_write_sctlr_current(uint32_t sctlr);
+uint32_t raw_read_sctlr(uint32_t el);
+void raw_write_sctlr(uint32_t sctlr, uint32_t el);
uint64_t raw_read_tcr_el1(void);
void raw_write_tcr_el1(uint64_t tcr_el1);
uint32_t raw_read_tcr_el2(void);
@@ -315,6 +336,8 @@
void raw_write_tcr_el3(uint32_t tcr_el3);
uint64_t raw_read_tcr_current(void);
void raw_write_tcr_current(uint64_t tcr);
+uint64_t raw_read_tcr(uint32_t el);
+void raw_write_tcr(uint64_t tcr, uint32_t el);
uint64_t raw_read_ttbr0_el1(void);
void raw_write_ttbr0_el1(uint64_t ttbr0_el1);
uint64_t raw_read_ttbr0_el2(void);
@@ -323,6 +346,8 @@
void raw_write_ttbr0_el3(uint64_t ttbr0_el3);
uint64_t raw_read_ttbr0_current(void);
void raw_write_ttbr0_current(uint64_t ttbr0);
+uint64_t raw_read_ttbr0(uint32_t el);
+void raw_write_ttbr0(uint64_t ttbr0, uint32_t el);
uint64_t raw_read_ttbr1_el1(void);
void raw_write_ttbr1_el1(uint64_t ttbr1_el1);
uint64_t raw_read_vbar_el1(void);
@@ -333,6 +358,8 @@
void raw_write_vbar_el3(uint64_t vbar_el3);
uint64_t raw_read_vbar_current(void);
void raw_write_vbar_current(uint64_t vbar);
+uint64_t raw_read_vbar(uint32_t el);
+void raw_write_vbar(uint64_t vbar, uint32_t el);
/* Cache maintenance system instructions */
void dccisw(uint64_t cisw);
@@ -352,10 +379,12 @@
void tlbiall_el2(void);
void tlbiall_el3(void);
void tlbiall_current(void);
+void tlbiall(uint32_t el);
void tlbiallis_el1(void);
void tlbiallis_el2(void);
void tlbiallis_el3(void);
void tlbiallis_current(void);
+void tlbiallis(uint32_t el);
void tlbivaa_el1(uint64_t va);
/* Memory barrier */