From 0a9f747379d81aef77e2ee8523dbb7eca22487c6 Mon Sep 17 00:00:00 2001
From: Achin Gupta <achin.gupta@arm.com>
Date: Sun, 9 Feb 2014 17:48:12 +0000
Subject: [PATCH] Move PSCI to runtime services directory

This patch creates a 'services' directory and moves the PSCI under
it. Other runtime services e.g. the Secure Payload Dispatcher service
will be placed under the same directory in the future.

Also fixes issue ARM-software/tf-issues#12

Change-Id: I187f83dcb660b728f82155d91882e961d2255068
---
 Makefile                                        | 2 +-
 bl31/bl31.mk                                    | 4 ++--
 {common => services}/psci/psci_afflvl_off.c     | 1 +
 {common => services}/psci/psci_afflvl_on.c      | 2 ++
 {common => services}/psci/psci_afflvl_suspend.c | 9 +++++++++
 {common => services}/psci/psci_common.c         | 0
 {common => services}/psci/psci_entry.S          | 0
 {common => services}/psci/psci_main.c           | 0
 {common => services}/psci/psci_private.h        | 0
 {common => services}/psci/psci_setup.c          | 0
 10 files changed, 15 insertions(+), 3 deletions(-)
 rename {common => services}/psci/psci_afflvl_off.c (99%)
 rename {common => services}/psci/psci_afflvl_on.c (99%)
 rename {common => services}/psci/psci_afflvl_suspend.c (98%)
 rename {common => services}/psci/psci_common.c (100%)
 rename {common => services}/psci/psci_entry.S (100%)
 rename {common => services}/psci/psci_main.c (100%)
 rename {common => services}/psci/psci_private.h (100%)
 rename {common => services}/psci/psci_setup.c (100%)

diff --git a/Makefile b/Makefile
index 4d925b3d7..a5a3a78e9 100644
--- a/Makefile
+++ b/Makefile
@@ -131,7 +131,7 @@ INCLUDES		+=	-Ilib/include/			\
 				-Iinclude/${ARCH}/		\
 				-Iinclude/			\
 				-Iarch/system/gic		\
-				-Icommon/psci			\
+				-Iservices/psci			\
 				-Iinclude/stdlib		\
 				-Iinclude/stdlib/sys		\
 				-Iplat/${PLAT}			\
diff --git a/bl31/bl31.mk b/bl31/bl31.mk
index fec8ebe24..1522b8399 100644
--- a/bl31/bl31.mk
+++ b/bl31/bl31.mk
@@ -33,13 +33,13 @@ vpath			%.c	common					\
 				arch/system/gic				\
 				plat/${PLAT}				\
 				arch/${ARCH}				\
-				common/psci				\
+				services/psci				\
 				lib/sync/locks/bakery			\
 				plat/${PLAT}/${ARCH}			\
 				${PLAT_BL31_C_VPATH}
 
 vpath			%.S	lib/arch/${ARCH}			\
-				common/psci				\
+				services/psci				\
 				include					\
 				plat/${PLAT}/${ARCH}			\
 				lib/sync/locks/exclusive		\
diff --git a/common/psci/psci_afflvl_off.c b/services/psci/psci_afflvl_off.c
similarity index 99%
rename from common/psci/psci_afflvl_off.c
rename to services/psci/psci_afflvl_off.c
index 1d8f2912d..72557aa31 100644
--- a/common/psci/psci_afflvl_off.c
+++ b/services/psci/psci_afflvl_off.c
@@ -31,6 +31,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <assert.h>
+#include <debug.h>
 #include <arch_helpers.h>
 #include <console.h>
 #include <platform.h>
diff --git a/common/psci/psci_afflvl_on.c b/services/psci/psci_afflvl_on.c
similarity index 99%
rename from common/psci/psci_afflvl_on.c
rename to services/psci/psci_afflvl_on.c
index 14f524c8f..d22904cd9 100644
--- a/common/psci/psci_afflvl_on.c
+++ b/services/psci/psci_afflvl_on.c
@@ -31,11 +31,13 @@
 #include <stdio.h>
 #include <string.h>
 #include <assert.h>
+#include <debug.h>
 #include <arch_helpers.h>
 #include <console.h>
 #include <platform.h>
 #include <psci.h>
 #include <psci_private.h>
+#include <context_mgmt.h>
 
 typedef int (*afflvl_on_handler)(unsigned long,
 				 aff_map_node *,
diff --git a/common/psci/psci_afflvl_suspend.c b/services/psci/psci_afflvl_suspend.c
similarity index 98%
rename from common/psci/psci_afflvl_suspend.c
rename to services/psci/psci_afflvl_suspend.c
index c12ad437c..4391580be 100644
--- a/common/psci/psci_afflvl_suspend.c
+++ b/services/psci/psci_afflvl_suspend.c
@@ -31,6 +31,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <assert.h>
+#include <debug.h>
 #include <arch_helpers.h>
 #include <console.h>
 #include <platform.h>
@@ -87,6 +88,7 @@ static int psci_afflvl0_suspend(unsigned long mpidr,
 {
 	unsigned int index, plat_state;
 	unsigned long psci_entrypoint, sctlr = read_sctlr();
+	el3_state *saved_el3_state;
 	int rc = PSCI_E_SUCCESS;
 
 	/* Sanity check to safeguard against data corruption */
@@ -112,6 +114,13 @@ static int psci_afflvl0_suspend(unsigned long mpidr,
 	cm_el3_sysregs_context_save(NON_SECURE);
 	rc = PSCI_E_SUCCESS;
 
+	/*
+	 * The EL3 state to PoC since it will be accessed after a
+	 * reset with the caches turned off
+	 */
+	saved_el3_state = get_el3state_ctx(cm_get_context(mpidr, NON_SECURE));
+	flush_dcache_range((uint64_t) saved_el3_state, sizeof(*saved_el3_state));
+
 	/* Set the secure world (EL3) re-entry point after BL1 */
 	psci_entrypoint = (unsigned long) psci_aff_suspend_finish_entry;
 
diff --git a/common/psci/psci_common.c b/services/psci/psci_common.c
similarity index 100%
rename from common/psci/psci_common.c
rename to services/psci/psci_common.c
diff --git a/common/psci/psci_entry.S b/services/psci/psci_entry.S
similarity index 100%
rename from common/psci/psci_entry.S
rename to services/psci/psci_entry.S
diff --git a/common/psci/psci_main.c b/services/psci/psci_main.c
similarity index 100%
rename from common/psci/psci_main.c
rename to services/psci/psci_main.c
diff --git a/common/psci/psci_private.h b/services/psci/psci_private.h
similarity index 100%
rename from common/psci/psci_private.h
rename to services/psci/psci_private.h
diff --git a/common/psci/psci_setup.c b/services/psci/psci_setup.c
similarity index 100%
rename from common/psci/psci_setup.c
rename to services/psci/psci_setup.c
-- 
GitLab