diff options
author | Antonio Nino Diaz <antonio.ninodiaz@arm.com> | 2018-02-19 13:53:48 +0000 |
---|---|---|
committer | Antonio Nino Diaz <antonio.ninodiaz@arm.com> | 2018-02-21 13:54:55 +0000 |
commit | 6bf0e079303545ad6dd314ce3e7cb3a11dcec413 (patch) | |
tree | 25ea1d115147da95470962d9098063ed770a750d | |
parent | 5ff5a6d9c33fdf8b626a4e61066f467f2b5c75a9 (diff) |
Ensure the correct execution of TLBI instructions
After executing a TLBI a DSB is needed to ensure completion of the
TLBI.
rk3328: The MMU is allowed to load TLB entries for as long as it is
enabled. Because of this, the correct place to execute a TLBI is right
after disabling the MMU.
Change-Id: I8280f248d10b49a8c354a4ccbdc8f8345ac4c170
Signed-off-by: Antonio Nino Diaz <antonio.ninodiaz@arm.com>
-rw-r--r-- | bl1/aarch64/bl1_exceptions.S | 1 | ||||
-rw-r--r-- | plat/rockchip/rk3328/drivers/pmu/pmu.c | 4 | ||||
-rw-r--r-- | services/std_svc/spm/secure_partition_setup.c | 1 |
3 files changed, 5 insertions, 1 deletions
diff --git a/bl1/aarch64/bl1_exceptions.S b/bl1/aarch64/bl1_exceptions.S index eb98ffa0..92313fa3 100644 --- a/bl1/aarch64/bl1_exceptions.S +++ b/bl1/aarch64/bl1_exceptions.S @@ -187,6 +187,7 @@ func smc_handler64 bl disable_mmu_icache_el3 tlbi alle3 + dsb ish /* ERET implies ISB, so it is not needed here */ #if SPIN_ON_BL1_EXIT bl print_debug_loop_message diff --git a/plat/rockchip/rk3328/drivers/pmu/pmu.c b/plat/rockchip/rk3328/drivers/pmu/pmu.c index f576fe41..835c3a6b 100644 --- a/plat/rockchip/rk3328/drivers/pmu/pmu.c +++ b/plat/rockchip/rk3328/drivers/pmu/pmu.c @@ -591,8 +591,10 @@ err_loop: __sramfunc void sram_suspend(void) { /* disable mmu and icache */ - tlbialle3(); disable_mmu_icache_el3(); + tlbialle3(); + dsbsy(); + isb(); mmio_write_32(SGRF_BASE + SGRF_SOC_CON(1), ((uintptr_t)&pmu_cpuson_entrypoint >> CPU_BOOT_ADDR_ALIGN) | diff --git a/services/std_svc/spm/secure_partition_setup.c b/services/std_svc/spm/secure_partition_setup.c index c1f0edf6..6998dae5 100644 --- a/services/std_svc/spm/secure_partition_setup.c +++ b/services/std_svc/spm/secure_partition_setup.c @@ -54,6 +54,7 @@ void secure_partition_setup(void) /* Invalidate TLBs at EL1. */ tlbivmalle1(); + dsbish(); /* * General-Purpose registers |