arm64: secmon: pass online CPUs to secmon
Instead of relying on CONFIG_MAX_CPUS to be the number of CPUs running a platform pass the number of online cpus from coreboot secmon. That allows for actually enabled CPUs < CONFIG_MAX_CPUS. BUG=chrome-os-partner:32112 BRANCH=None TEST=Booted SMP kernel. Change-Id: Iaf1591e77fcb5ccf5fe271b6c84ea8866e19c59d Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Original-Commit-Id: 3827af876c247fc42cd6be5dd67f8517457b36e7 Original-Change-Id: Ice10b8ab45bb1190a42678e67776846eec4eb79a Original-Signed-off-by: Aaron Durbin <adurbin@chromium.org> Original-Reviewed-on: https://chromium-review.googlesource.com/227529 Original-Reviewed-by: Furquan Shaikh <furquan@chromium.org> Reviewed-on: http://review.coreboot.org/9397 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
parent
9fd7b1c1a9
commit
931a218d68
|
@ -58,22 +58,10 @@ static void cpu_init(int bsp)
|
|||
cpu_set_bsp();
|
||||
}
|
||||
|
||||
static void wait_for_all_cpus(void)
|
||||
static void wait_for_all_cpus(size_t expected)
|
||||
{
|
||||
int all_online;
|
||||
|
||||
while (1) {
|
||||
int i;
|
||||
|
||||
all_online = 1;
|
||||
for (i = 0; i < CONFIG_MAX_CPUS; i++) {
|
||||
if (!cpu_online(cpu_info_for_cpu(i)))
|
||||
all_online = 0;
|
||||
}
|
||||
|
||||
if (all_online)
|
||||
break;
|
||||
}
|
||||
while (cpus_online() != expected)
|
||||
;
|
||||
}
|
||||
|
||||
static void secmon_init(struct secmon_params *params, int bsp)
|
||||
|
@ -90,7 +78,7 @@ static void secmon_init(struct secmon_params *params, int bsp)
|
|||
secmon_wait_for_action();
|
||||
|
||||
/* Wait for all CPUs to enter secmon. */
|
||||
wait_for_all_cpus();
|
||||
wait_for_all_cpus(params->online_cpus);
|
||||
|
||||
smc_init();
|
||||
psci_init();
|
||||
|
|
|
@ -116,6 +116,8 @@ static void fill_secmon_params(struct secmon_params *p,
|
|||
|
||||
memset(p, 0, sizeof(*p));
|
||||
|
||||
p->online_cpus = cpus_online();
|
||||
|
||||
spin_attrs = spintable_get_attributes();
|
||||
|
||||
if (spin_attrs != NULL) {
|
||||
|
|
|
@ -32,6 +32,19 @@ struct cpu_info *cpu_info(void)
|
|||
return cpu_info_for_cpu(smp_processor_id());
|
||||
}
|
||||
|
||||
size_t cpus_online(void)
|
||||
{
|
||||
int i;
|
||||
size_t num = 0;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(cpu_infos); i++) {
|
||||
if (cpu_online(cpu_info_for_cpu(i)))
|
||||
num++;
|
||||
}
|
||||
|
||||
return num;
|
||||
}
|
||||
|
||||
static inline int action_queue_empty(struct cpu_action_queue *q)
|
||||
{
|
||||
return load_acquire_exclusive(&q->todo) == NULL;
|
||||
|
|
|
@ -99,6 +99,9 @@ static inline void cpu_mark_online(struct cpu_info *ci)
|
|||
store_release(&ci->online, 1);
|
||||
}
|
||||
|
||||
/* Provide number of CPUs online. */
|
||||
size_t cpus_online(void);
|
||||
|
||||
/* Control routines for starting CPUs. */
|
||||
struct cpu_control_ops {
|
||||
/* Return the maximum number of CPUs supported. */
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#if IS_ENABLED(CONFIG_ARCH_USE_SECURE_MONITOR)
|
||||
|
||||
struct secmon_params {
|
||||
size_t online_cpus;
|
||||
struct cpu_action bsp;
|
||||
struct cpu_action secondary;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue