diff options
author | Furquan Shaikh <furquan@google.com> | 2014-09-07 18:23:18 -0700 |
---|---|---|
committer | Patrick Georgi <pgeorgi@google.com> | 2015-03-28 07:04:29 +0100 |
commit | e1b87a103290115831226713b1711dcc956ae43d (patch) | |
tree | 7f24aa1d6e1dcbea47021e64370ee40e5c0d6841 /src/arch/arm64/armv8 | |
parent | 2157ba76f2fe238cb6bcc97957ac5481df599415 (diff) | |
download | coreboot-e1b87a103290115831226713b1711dcc956ae43d.tar.xz |
arm64 libhelpers: 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.
BUG=chrome-os-partner:30785
BRANCH=None
TEST=Compiles successfully
Change-Id: I98f35b8d3eb5e292ac895102ad91b675325c08c7
Signed-off-by: Patrick Georgi <pgeorgi@chromium.org>
Original-Commit-Id: 11d90df1fd92e03c25bfc463429a5f6a8d9d411d
Original-Change-Id: I17de4c4f3bc1ee804422efe5f4703b4dd65b51f2
Original-Signed-off-by: Furquan Shaikh <furquan@google.com>
Original-Reviewed-on: https://chromium-review.googlesource.com/216904
Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Original-Tested-by: Furquan Shaikh <furquan@chromium.org>
Original-Commit-Queue: Furquan Shaikh <furquan@chromium.org>
Reviewed-on: http://review.coreboot.org/9063
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Diffstat (limited to 'src/arch/arm64/armv8')
-rw-r--r-- | src/arch/arm64/armv8/lib/pstate.c | 32 | ||||
-rw-r--r-- | src/arch/arm64/armv8/lib/sysctrl.c | 194 | ||||
-rw-r--r-- | src/arch/arm64/armv8/lib/tlb.c | 16 |
3 files changed, 211 insertions, 31 deletions
diff --git a/src/arch/arm64/armv8/lib/pstate.c b/src/arch/arm64/armv8/lib/pstate.c index a194b91e26..d2f3649ee9 100644 --- a/src/arch/arm64/armv8/lib/pstate.c +++ b/src/arch/arm64/armv8/lib/pstate.c @@ -171,12 +171,24 @@ void raw_write_elr_el3(uint64_t elr_el3) uint64_t raw_read_elr_current(void) { - SWITCH_CASE_READ(raw_read_elr,elr,uint64_t); + uint32_t el = get_current_el(); + return raw_read_elr(el); } void raw_write_elr_current(uint64_t elr) { - SWITCH_CASE_WRITE(raw_write_elr,elr); + uint32_t el = get_current_el(); + raw_write_elr(elr, el); +} + +uint64_t raw_read_elr(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_elr, elr, uint64_t, el); +} + +void raw_write_elr(uint64_t elr, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_elr, elr, el); } /* FPCR */ @@ -372,12 +384,24 @@ void raw_write_spsr_el3(uint32_t spsr_el3) uint32_t raw_read_spsr_current(void) { - SWITCH_CASE_READ(raw_read_spsr,spsr,uint32_t); + uint32_t el = get_current_el(); + return raw_read_spsr(el); } void raw_write_spsr_current(uint32_t spsr) { - SWITCH_CASE_WRITE(raw_write_spsr,spsr); + uint32_t el = get_current_el(); + raw_write_spsr(spsr, el); +} + +uint32_t raw_read_spsr(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_spsr, spsr, uint32_t, el); +} + +void raw_write_spsr(uint32_t spsr, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_spsr, spsr, el); } uint32_t raw_read_spsr_fiq(void) diff --git a/src/arch/arm64/armv8/lib/sysctrl.c b/src/arch/arm64/armv8/lib/sysctrl.c index 2737f56ad2..444d6c7db2 100644 --- a/src/arch/arm64/armv8/lib/sysctrl.c +++ b/src/arch/arm64/armv8/lib/sysctrl.c @@ -72,12 +72,24 @@ void raw_write_actlr_el3(uint32_t actlr_el3) uint32_t raw_read_actlr_current(void) { - SWITCH_CASE_READ(raw_read_actlr,actlr,uint32_t); + uint32_t el = get_current_el(); + return raw_read_actlr(el); } void raw_write_actlr_current(uint32_t actlr) { - SWITCH_CASE_WRITE(raw_write_actlr,actlr); + uint32_t el = get_current_el(); + raw_write_actlr(actlr, el); +} + +uint32_t raw_read_actlr(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_actlr, actlr, uint32_t, el); +} + +void raw_write_actlr(uint32_t actlr, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_actlr, actlr, el); } /* AFSR0 */ @@ -125,12 +137,24 @@ void raw_write_afsr0_el3(uint32_t afsr0_el3) uint32_t raw_read_afsr0_current(void) { - SWITCH_CASE_READ(raw_read_afsr0,afsr0,uint32_t); + uint32_t el = get_current_el(); + return raw_read_afsr0(el); } void raw_write_afsr0_current(uint32_t afsr0) { - SWITCH_CASE_WRITE(raw_write_afsr0,afsr0); + uint32_t el = get_current_el(); + raw_write_afsr0(afsr0, el); +} + +uint32_t raw_read_afsr0(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_afsr0, afsr0, uint32_t, el); +} + +void raw_write_afsr0(uint32_t afsr0, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_afsr0, afsr0, el); } /* AFSR1 */ @@ -178,12 +202,24 @@ void raw_write_afsr1_el3(uint32_t afsr1_el3) uint32_t raw_read_afsr1_current(void) { - SWITCH_CASE_READ(raw_read_afsr1,afsr1,uint32_t); + uint32_t el = get_current_el(); + return raw_read_afsr1(el); } void raw_write_afsr1_current(uint32_t afsr1) { - SWITCH_CASE_WRITE(raw_write_afsr1,afsr1); + uint32_t el = get_current_el(); + raw_write_afsr1(afsr1, el); +} + +uint32_t raw_read_afsr1(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_afsr1, afsr1, uint32_t, el); +} + +void raw_write_afsr1(uint32_t afsr1, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_afsr1, afsr1, el); } /* AIDR */ @@ -241,12 +277,24 @@ void raw_write_amair_el3(uint64_t amair_el3) uint64_t raw_read_amair_current(void) { - SWITCH_CASE_READ(raw_read_amair,amair,uint64_t); + uint32_t el = get_current_el(); + return raw_read_amair(el); } void raw_write_amair_current(uint64_t amair) { - SWITCH_CASE_WRITE(raw_write_amair,amair); + uint32_t el = get_current_el(); + raw_write_amair(amair, el); +} + +uint64_t raw_read_amair(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_amair, amair, uint64_t, el); +} + +void raw_write_amair(uint64_t amair, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_amair, amair, el); } /* CCSIDR */ @@ -383,12 +431,24 @@ void raw_write_esr_el3(uint32_t esr_el3) uint32_t raw_read_esr_current(void) { - SWITCH_CASE_READ(raw_read_esr,esr,uint32_t); + uint32_t el = get_current_el(); + return raw_read_esr(el); } void raw_write_esr_current(uint32_t esr) { - SWITCH_CASE_WRITE(raw_write_esr,esr); + uint32_t el = get_current_el(); + raw_write_esr(esr, el); +} + +uint32_t raw_read_esr(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_esr, esr, uint32_t, el); +} + +void raw_write_esr(uint32_t esr, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_esr, esr, el); } /* FAR */ @@ -436,12 +496,24 @@ void raw_write_far_el3(uint64_t far_el3) uint64_t raw_read_far_current(void) { - SWITCH_CASE_READ(raw_read_far,far,uint64_t); + uint32_t el = get_current_el(); + return raw_read_far(el); } void raw_write_far_current(uint64_t far) { - SWITCH_CASE_WRITE(raw_write_far,far); + uint32_t el = get_current_el(); + raw_write_far(far, el); +} + +uint64_t raw_read_far(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_far, far, uint64_t, el); +} + +void raw_write_far(uint64_t far, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_far, far, el); } /* HCR */ @@ -514,12 +586,24 @@ void raw_write_mair_el3(uint64_t mair_el3) uint64_t raw_read_mair_current(void) { - SWITCH_CASE_READ(raw_read_mair,mair,uint64_t); + uint32_t el = get_current_el(); + return raw_read_mair(el); } void raw_write_mair_current(uint64_t mair) { - SWITCH_CASE_WRITE(raw_write_mair,mair); + uint32_t el = get_current_el(); + raw_write_mair(mair, el); +} + +uint64_t raw_read_mair(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_mair, mair, uint64_t, el); +} + +void raw_write_mair(uint64_t mair, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_mair, mair, el); } /* MIDR */ @@ -587,12 +671,24 @@ void raw_write_rmr_el3(uint32_t rmr_el3) uint32_t raw_read_rmr_current(void) { - SWITCH_CASE_READ(raw_read_rmr,rmr,uint32_t); + uint32_t el = get_current_el(); + return raw_read_rmr(el); } void raw_write_rmr_current(uint32_t rmr) { - SWITCH_CASE_WRITE(raw_write_rmr,rmr); + uint32_t el = get_current_el(); + raw_write_rmr(rmr, el); +} + +uint32_t raw_read_rmr(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_rmr, rmr, uint32_t, el); +} + +void raw_write_rmr(uint32_t rmr, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_rmr, rmr, el); } /* RVBAR */ @@ -640,15 +736,27 @@ void raw_write_rvbar_el3(uint64_t rvbar_el3) uint64_t raw_read_rvbar_current(void) { - SWITCH_CASE_READ(raw_read_rvbar,rvbar,uint64_t); + uint32_t el = get_current_el(); + return raw_read_rvbar(el); } void raw_write_rvbar_current(uint64_t rvbar) { - SWITCH_CASE_WRITE(raw_write_rvbar,rvbar); + uint32_t el = get_current_el(); + raw_write_rvbar(rvbar, el); +} + +uint64_t raw_read_rvbar(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_rvbar, rvbar, uint64_t, el); +} + +void raw_write_rvbar(uint64_t rvbar, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_rvbar, rvbar, el); } -/* SCR */ +/* Scr */ uint32_t raw_read_scr_el3(void) { uint32_t scr_el3; @@ -708,12 +816,24 @@ void raw_write_sctlr_el3(uint32_t sctlr_el3) uint32_t raw_read_sctlr_current(void) { - SWITCH_CASE_READ(raw_read_sctlr,sctlr,uint32_t); + uint32_t el = get_current_el(); + return raw_read_sctlr(el); } void raw_write_sctlr_current(uint32_t sctlr) { - SWITCH_CASE_WRITE(raw_write_sctlr,sctlr); + uint32_t el = get_current_el(); + raw_write_sctlr(sctlr, el); +} + +uint32_t raw_read_sctlr(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_sctlr, sctlr, uint32_t, el); +} + +void raw_write_sctlr(uint32_t sctlr, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_sctlr, sctlr, el); } /* TCR */ @@ -804,12 +924,24 @@ void raw_write_ttbr0_el3(uint64_t ttbr0_el3) uint64_t raw_read_ttbr0_current(void) { - SWITCH_CASE_READ(raw_read_ttbr0,ttbr0,uint64_t); + uint32_t el = get_current_el(); + return raw_read_ttbr0(el); } void raw_write_ttbr0_current(uint64_t ttbr0) { - SWITCH_CASE_WRITE(raw_write_ttbr0,ttbr0); + uint32_t el = get_current_el(); + raw_write_ttbr0(ttbr0, el); +} + +uint64_t raw_read_ttbr0(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_ttbr0, ttbr0, uint64_t, el); +} + +void raw_write_ttbr0(uint64_t ttbr0, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_ttbr0, ttbr0, el); } /* TTBR1 */ @@ -872,10 +1004,22 @@ void raw_write_vbar_el3(uint64_t vbar_el3) uint64_t raw_read_vbar_current(void) { - SWITCH_CASE_READ(raw_read_vbar,vbar,uint64_t); + uint32_t el = get_current_el(); + return raw_read_vbar(el); } void raw_write_vbar_current(uint64_t vbar) { - SWITCH_CASE_WRITE(raw_write_vbar,vbar); + uint32_t el = get_current_el(); + raw_write_vbar(vbar, el); +} + +uint64_t raw_read_vbar(uint32_t el) +{ + SWITCH_CASE_READ(raw_read_vbar, vbar, uint64_t, el); +} + +void raw_write_vbar(uint64_t vbar, uint32_t el) +{ + SWITCH_CASE_WRITE(raw_write_vbar, vbar, el); } diff --git a/src/arch/arm64/armv8/lib/tlb.c b/src/arch/arm64/armv8/lib/tlb.c index 36d1e70a4a..906f580347 100644 --- a/src/arch/arm64/armv8/lib/tlb.c +++ b/src/arch/arm64/armv8/lib/tlb.c @@ -44,7 +44,13 @@ void tlbiall_el3(void) void tlbiall_current(void) { - SWITCH_CASE_TLBI(tlbiall); + uint32_t el = get_current_el(); + tlbiall(el); +} + +void tlbiall(uint32_t el) +{ + SWITCH_CASE_TLBI(tlbiall, el); } /* TLBIALLIS */ @@ -65,7 +71,13 @@ void tlbiallis_el3(void) void tlbiallis_current(void) { - SWITCH_CASE_TLBI(tlbiallis); + uint32_t el = get_current_el(); + tlbiallis(el); +} + +void tlbiallis(uint32_t el) +{ + SWITCH_CASE_TLBI(tlbiallis, el); } /* TLBIVAA */ |