summaryrefslogtreecommitdiff
path: root/common/psci/psci_afflvl_suspend.c
diff options
context:
space:
mode:
authorAchin Gupta <achin.gupta@arm.com>2013-12-05 14:21:04 +0000
committerDan Handley <dan.handley@arm.com>2014-01-20 18:45:04 +0000
commita59caa4cbd03c394e7a5bf098ddd9db457b35aae (patch)
treea6ee2402c1c446a352974b8ff68a67a611187344 /common/psci/psci_afflvl_suspend.c
parent03cb8fbb5d769affd508c97a5327544e487eb1a9 (diff)
psci: replace secure context with suspend context
The secure context saved and restored across a cpu_suspend operation can be more than just the state of the secure system registers e.g. we also need to save the affinity level till which the cpu is being powered down. This patch creates a suspend_context data structure which includes the system register context. This will allow other bits to be saved and restored as well in subsequent patches. Change-Id: I1c1f7d25497388b54b7d6ee4fab77e8c6a9992c4
Diffstat (limited to 'common/psci/psci_afflvl_suspend.c')
-rw-r--r--common/psci/psci_afflvl_suspend.c40
1 files changed, 20 insertions, 20 deletions
diff --git a/common/psci/psci_afflvl_suspend.c b/common/psci/psci_afflvl_suspend.c
index d91b9210..6fb60f4a 100644
--- a/common/psci/psci_afflvl_suspend.c
+++ b/common/psci/psci_afflvl_suspend.c
@@ -73,16 +73,16 @@ static int psci_afflvl0_suspend(unsigned long mpidr,
* Arch. management: Save the secure context, flush the
* L1 caches and exit intra-cluster coherency et al
*/
- psci_secure_context[index].sctlr = read_sctlr();
- psci_secure_context[index].scr = read_scr();
- psci_secure_context[index].cptr = read_cptr();
- psci_secure_context[index].cpacr = read_cpacr();
- psci_secure_context[index].cntfrq = read_cntfrq_el0();
- psci_secure_context[index].mair = read_mair();
- psci_secure_context[index].tcr = read_tcr();
- psci_secure_context[index].ttbr = read_ttbr0();
- psci_secure_context[index].vbar = read_vbar();
- psci_secure_context[index].pstate =
+ psci_suspend_context[index].sec_sysregs.sctlr = read_sctlr();
+ psci_suspend_context[index].sec_sysregs.scr = read_scr();
+ psci_suspend_context[index].sec_sysregs.cptr = read_cptr();
+ psci_suspend_context[index].sec_sysregs.cpacr = read_cpacr();
+ psci_suspend_context[index].sec_sysregs.cntfrq = read_cntfrq_el0();
+ psci_suspend_context[index].sec_sysregs.mair = read_mair();
+ psci_suspend_context[index].sec_sysregs.tcr = read_tcr();
+ psci_suspend_context[index].sec_sysregs.ttbr = read_ttbr0();
+ psci_suspend_context[index].sec_sysregs.vbar = read_vbar();
+ psci_suspend_context[index].sec_sysregs.pstate =
read_daif() & (DAIF_ABT_BIT | DAIF_DBG_BIT);
/* Set the secure world (EL3) re-entry point after BL1 */
@@ -411,18 +411,18 @@ static unsigned int psci_afflvl0_suspend_finish(unsigned long mpidr,
* Arch. management: Restore the stashed secure architectural
* context in the right order.
*/
- write_vbar(psci_secure_context[index].vbar);
- write_daif(read_daif() | psci_secure_context[index].pstate);
- write_mair(psci_secure_context[index].mair);
- write_tcr(psci_secure_context[index].tcr);
- write_ttbr0(psci_secure_context[index].ttbr);
- write_sctlr(psci_secure_context[index].sctlr);
+ write_vbar(psci_suspend_context[index].sec_sysregs.vbar);
+ write_daif(read_daif() | psci_suspend_context[index].sec_sysregs.pstate);
+ write_mair(psci_suspend_context[index].sec_sysregs.mair);
+ write_tcr(psci_suspend_context[index].sec_sysregs.tcr);
+ write_ttbr0(psci_suspend_context[index].sec_sysregs.ttbr);
+ write_sctlr(psci_suspend_context[index].sec_sysregs.sctlr);
/* MMU and coherency should be enabled by now */
- write_scr(psci_secure_context[index].scr);
- write_cptr(psci_secure_context[index].cptr);
- write_cpacr(psci_secure_context[index].cpacr);
- write_cntfrq_el0(psci_secure_context[index].cntfrq);
+ write_scr(psci_suspend_context[index].sec_sysregs.scr);
+ write_cptr(psci_suspend_context[index].sec_sysregs.cptr);
+ write_cpacr(psci_suspend_context[index].sec_sysregs.cpacr);
+ write_cntfrq_el0(psci_suspend_context[index].sec_sysregs.cntfrq);
/*
* Generic management: Now we just need to retrieve the