[coreboot-gerrit] Patch set updated for coreboot: c7e199b arm64: psci: use struct cpu_action to track startup entry
Patrick Georgi (pgeorgi@google.com)
gerrit at coreboot.org
Fri Apr 10 08:46:52 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 c7e199b0257feea2a29956d829ad180901e11168
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