[coreboot-gerrit] New patch to review for coreboot: 4ff6179 arm64: psci: use struct cpu_action to track startup entry

Patrick Georgi (pgeorgi@google.com) gerrit at coreboot.org
Wed Apr 8 12:48:30 CEST 2015


Patrick Georgi (pgeorgi at google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/9396

-gerrit

commit 4ff617969531bcbcaeccf4b3d3f199c9bee0d21a
Author: Aaron Durbin <adurbin at chromium.org>
Date:   Wed Nov 5 10:45:05 2014 -0600

    arm64: psci: use struct cpu_action to track startup entry
    
    The struct cpu_action already tracks entry/arg pointers. Use that
    instead of duplicating the same information.
    
    BUG=chrome-os-partner:32112
    BRANCH=None
    TEST=Built and booted.
    
    Change-Id: I70e1b471ca15eac2ea4e6ca3dab7d8dc2774a241
    Signed-off-by: Patrick Georgi <pgeorgi at chromium.org>
    Original-Commit-Id: cdddfd8d74d227cb5cbdf15b6871480839fa20d8
    Original-Change-Id: I4070ef0df19bb1141a1a47c4570a894928d6a5a4
    Original-Signed-off-by: Aaron Durbin <adurbin at chromium.org>
    Original-Reviewed-on: https://chromium-review.googlesource.com/227549
    Original-Reviewed-by: Furquan Shaikh <furquan at chromium.org>
---
 src/arch/arm64/armv8/secmon/psci.c        | 25 ++++++++++++++++---------
 src/arch/arm64/armv8/secmon/secmon_init.c |  2 +-
 src/arch/arm64/include/arch/psci.h        |  5 ++---
 3 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/src/arch/arm64/armv8/secmon/psci.c b/src/arch/arm64/armv8/secmon/psci.c
index 0051031..f87419d 100644
--- a/src/arch/arm64/armv8/secmon/psci.c
+++ b/src/arch/arm64/armv8/secmon/psci.c
@@ -170,17 +170,16 @@ static void psci_cpu_on_callback(void *arg)
 
 	memset(&state, 0, sizeof(state));
 	state.elx.spsr = get_eret_el(target_el, SPSR_USE_H);
-	transition_with_entry(e->cpu_state.entry, e->cpu_state.arg, &state);
+	transition_with_entry(e->cpu_state.startup.run,
+				e->cpu_state.startup.arg, &state);
 }
 
-static void psci_cpu_on_prepare(struct psci_node *e,
-				void *entry, void *arg)
+static void psci_cpu_on_prepare(struct psci_node *e, const struct cpu_action *a)
 {
 	struct psci_node *ancestor;
 	int state = PSCI_STATE_ON_PENDING;
 
-	e->cpu_state.entry = entry;
-	e->cpu_state.arg = arg;
+	e->cpu_state.startup = *a;
 	ancestor = psci_find_ancestor(e, PSCI_AFFINITY_LEVEL_HIGHEST, state);
 	e->cpu_state.ancestor = ancestor;
 	psci_set_hierarchy_state(e, ancestor, state);
@@ -188,18 +187,23 @@ static void psci_cpu_on_prepare(struct psci_node *e,
 
 static int psci_schedule_cpu_on(struct psci_node *e)
 {
+	struct cpu_info *ci;
 	struct cpu_action action = {
 		.run = &psci_cpu_on_callback,
 		.arg = e,
 	};
 
-	if (arch_run_on_cpu_async(e->cpu_state.ci->id, &action))
+	ci = e->cpu_state.ci;
+	if (ci == NULL || arch_run_on_cpu_async(ci->id, &action)) {
+		psci_set_hierarchy_state(e, e->cpu_state.ancestor,
+						PSCI_STATE_OFF);
 		return PSCI_RET_INTERNAL_FAILURE;
+	}
 
 	return PSCI_RET_SUCCESS;
 }
 
-void psci_turn_on_self(void *entry, void *arg)
+void psci_turn_on_self(const struct cpu_action *action)
 {
 	struct psci_node *e = node_self();
 
@@ -210,7 +214,7 @@ void psci_turn_on_self(void *entry, void *arg)
 	}
 
 	psci_lock();
-	psci_cpu_on_prepare(e, entry, arg);
+	psci_cpu_on_prepare(e, action);
 	psci_unlock();
 
 	psci_schedule_cpu_on(e);
@@ -223,6 +227,7 @@ static void psci_cpu_on(struct psci_func *pf)
 	uint64_t context_id;
 	int cpu_state;
 	struct psci_node *e;
+	struct cpu_action action;
 
 	target_mpidr = psci64_arg(pf, PSCI_PARAM_0);
 	entry = psci64_arg(pf, PSCI_PARAM_1);
@@ -248,7 +253,9 @@ static void psci_cpu_on(struct psci_func *pf)
 		return;
 	}
 
-	psci_cpu_on_prepare(e, (void *)entry, (void *)context_id);
+	action.run = (void *)entry;
+	action.arg = (void *)context_id;
+	psci_cpu_on_prepare(e, &action);
 	psci_unlock();
 
 	psci32_return(pf, psci_schedule_cpu_on(e));
diff --git a/src/arch/arm64/armv8/secmon/secmon_init.c b/src/arch/arm64/armv8/secmon/secmon_init.c
index 8fd3917..9e104c7 100644
--- a/src/arch/arm64/armv8/secmon/secmon_init.c
+++ b/src/arch/arm64/armv8/secmon/secmon_init.c
@@ -44,7 +44,7 @@ static void start_up_cpu(void *arg)
 	if (action->run == NULL)
 		psci_turn_off_self();
 
-	psci_turn_on_self(action->run, action->arg);
+	psci_turn_on_self(action);
 }
 
 static void cpu_init(int bsp)
diff --git a/src/arch/arm64/include/arch/psci.h b/src/arch/arm64/include/arch/psci.h
index afa4c42..32a32b1 100644
--- a/src/arch/arm64/include/arch/psci.h
+++ b/src/arch/arm64/include/arch/psci.h
@@ -63,8 +63,7 @@ struct psci_node;
 
 struct psci_cpu_state {
 	struct cpu_info *ci;
-	void *entry;
-	void *arg;
+	struct cpu_action startup;
 	/* Ancestor of target to update state in CPU_ON case. */
 	struct psci_node *ancestor;
 };
@@ -191,7 +190,7 @@ static inline void psci64_return(struct psci_func *pf, int64_t val)
 void psci_init(void);
 
 /* Turn on the current CPU within the PSCI subsystem. */
-void psci_turn_on_self(void *entry, void *arg);
+void psci_turn_on_self(const struct cpu_action *action);
 int psci_turn_off_self(void);
 
 #endif /* __ARCH_PSCI_H__ */



More information about the coreboot-gerrit mailing list