|
Ivan T. Ivanov |
02dab8 |
From: Jean-Philippe Brucker <jean-philippe.brucker@arm.com>
|
|
Ivan T. Ivanov |
02dab8 |
Date: Mon, 8 Apr 2019 18:17:19 +0100
|
|
Ivan T. Ivanov |
02dab8 |
Subject: arm64: Save and restore OSDLR_EL1 across suspend/resume
|
|
Ivan T. Ivanov |
02dab8 |
Git-commit: 827a108e354db633698f0b4a10c1ffd2b1f8d1d0
|
|
Ivan T. Ivanov |
02dab8 |
Patch-mainline: v5.2-rc1
|
|
Ivan T. Ivanov |
02dab8 |
References: git-fixes
|
|
Ivan T. Ivanov |
02dab8 |
|
|
Ivan T. Ivanov |
02dab8 |
When the CPU comes out of suspend, the firmware may have modified the OS
|
|
Ivan T. Ivanov |
02dab8 |
Double Lock Register. Save it in an unused slot of cpu_suspend_ctx, and
|
|
Ivan T. Ivanov |
02dab8 |
restore it on resume.
|
|
Ivan T. Ivanov |
02dab8 |
|
|
Ivan T. Ivanov |
02dab8 |
Cc: <stable@vger.kernel.org>
|
|
Ivan T. Ivanov |
02dab8 |
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com>
|
|
Ivan T. Ivanov |
02dab8 |
Signed-off-by: Will Deacon <will.deacon@arm.com>
|
|
Ivan T. Ivanov |
02dab8 |
Acked-by: Ivan T. Ivanov <iivanov@suse.de>
|
|
Ivan T. Ivanov |
02dab8 |
---
|
|
Ivan T. Ivanov |
02dab8 |
arch/arm64/mm/proc.S | 34 ++++++++++++++++++----------------
|
|
Ivan T. Ivanov |
02dab8 |
1 file changed, 18 insertions(+), 16 deletions(-)
|
|
Ivan T. Ivanov |
02dab8 |
|
|
Ivan T. Ivanov |
02dab8 |
--- a/arch/arm64/mm/proc.S
|
|
Ivan T. Ivanov |
02dab8 |
+++ b/arch/arm64/mm/proc.S
|
|
Ivan T. Ivanov |
02dab8 |
@@ -64,24 +64,25 @@ ENTRY(cpu_do_suspend)
|
|
Ivan T. Ivanov |
02dab8 |
mrs x2, tpidr_el0
|
|
Ivan T. Ivanov |
02dab8 |
mrs x3, tpidrro_el0
|
|
Ivan T. Ivanov |
02dab8 |
mrs x4, contextidr_el1
|
|
Ivan T. Ivanov |
02dab8 |
- mrs x5, cpacr_el1
|
|
Ivan T. Ivanov |
02dab8 |
- mrs x6, tcr_el1
|
|
Ivan T. Ivanov |
02dab8 |
- mrs x7, vbar_el1
|
|
Ivan T. Ivanov |
02dab8 |
- mrs x8, mdscr_el1
|
|
Ivan T. Ivanov |
02dab8 |
- mrs x9, oslsr_el1
|
|
Ivan T. Ivanov |
02dab8 |
- mrs x10, sctlr_el1
|
|
Ivan T. Ivanov |
02dab8 |
+ mrs x5, osdlr_el1
|
|
Ivan T. Ivanov |
02dab8 |
+ mrs x6, cpacr_el1
|
|
Ivan T. Ivanov |
02dab8 |
+ mrs x7, tcr_el1
|
|
Ivan T. Ivanov |
02dab8 |
+ mrs x8, vbar_el1
|
|
Ivan T. Ivanov |
02dab8 |
+ mrs x9, mdscr_el1
|
|
Ivan T. Ivanov |
02dab8 |
+ mrs x10, oslsr_el1
|
|
Ivan T. Ivanov |
02dab8 |
+ mrs x11, sctlr_el1
|
|
Ivan T. Ivanov |
02dab8 |
alternative_if_not ARM64_HAS_VIRT_HOST_EXTN
|
|
Ivan T. Ivanov |
02dab8 |
- mrs x11, tpidr_el1
|
|
Ivan T. Ivanov |
02dab8 |
+ mrs x12, tpidr_el1
|
|
Ivan T. Ivanov |
02dab8 |
alternative_else
|
|
Ivan T. Ivanov |
02dab8 |
- mrs x11, tpidr_el2
|
|
Ivan T. Ivanov |
02dab8 |
+ mrs x12, tpidr_el2
|
|
Ivan T. Ivanov |
02dab8 |
alternative_endif
|
|
Ivan T. Ivanov |
02dab8 |
- mrs x12, sp_el0
|
|
Ivan T. Ivanov |
02dab8 |
+ mrs x13, sp_el0
|
|
Ivan T. Ivanov |
02dab8 |
stp x2, x3, [x0]
|
|
Ivan T. Ivanov |
02dab8 |
- stp x4, xzr, [x0, #16]
|
|
Ivan T. Ivanov |
02dab8 |
- stp x5, x6, [x0, #32]
|
|
Ivan T. Ivanov |
02dab8 |
- stp x7, x8, [x0, #48]
|
|
Ivan T. Ivanov |
02dab8 |
- stp x9, x10, [x0, #64]
|
|
Ivan T. Ivanov |
02dab8 |
- stp x11, x12, [x0, #80]
|
|
Ivan T. Ivanov |
02dab8 |
+ stp x4, x5, [x0, #16]
|
|
Ivan T. Ivanov |
02dab8 |
+ stp x6, x7, [x0, #32]
|
|
Ivan T. Ivanov |
02dab8 |
+ stp x8, x9, [x0, #48]
|
|
Ivan T. Ivanov |
02dab8 |
+ stp x10, x11, [x0, #64]
|
|
Ivan T. Ivanov |
02dab8 |
+ stp x12, x13, [x0, #80]
|
|
Ivan T. Ivanov |
02dab8 |
ret
|
|
Ivan T. Ivanov |
02dab8 |
ENDPROC(cpu_do_suspend)
|
|
Ivan T. Ivanov |
02dab8 |
|
|
Ivan T. Ivanov |
02dab8 |
@@ -104,8 +105,8 @@ ENTRY(cpu_do_resume)
|
|
Ivan T. Ivanov |
02dab8 |
msr cpacr_el1, x6
|
|
Ivan T. Ivanov |
02dab8 |
|
|
Ivan T. Ivanov |
02dab8 |
/* Don't change t0sz here, mask those bits when restoring */
|
|
Ivan T. Ivanov |
02dab8 |
- mrs x5, tcr_el1
|
|
Ivan T. Ivanov |
02dab8 |
- bfi x8, x5, TCR_T0SZ_OFFSET, TCR_TxSZ_WIDTH
|
|
Ivan T. Ivanov |
02dab8 |
+ mrs x7, tcr_el1
|
|
Ivan T. Ivanov |
02dab8 |
+ bfi x8, x7, TCR_T0SZ_OFFSET, TCR_TxSZ_WIDTH
|
|
Ivan T. Ivanov |
02dab8 |
|
|
Ivan T. Ivanov |
02dab8 |
msr tcr_el1, x8
|
|
Ivan T. Ivanov |
02dab8 |
msr vbar_el1, x9
|
|
Ivan T. Ivanov |
02dab8 |
@@ -129,6 +130,7 @@ alternative_endif
|
|
Ivan T. Ivanov |
02dab8 |
/*
|
|
Ivan T. Ivanov |
02dab8 |
* Restore oslsr_el1 by writing oslar_el1
|
|
Ivan T. Ivanov |
02dab8 |
*/
|
|
Ivan T. Ivanov |
02dab8 |
+ msr osdlr_el1, x5
|
|
Ivan T. Ivanov |
02dab8 |
ubfx x11, x11, #1, #1
|
|
Ivan T. Ivanov |
02dab8 |
msr oslar_el1, x11
|
|
Ivan T. Ivanov |
02dab8 |
reset_pmuserenr_el0 x0 // Disable PMU access from EL0
|