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:
Aaron Durbin 2014-11-05 11:19:21 -06:00 committed by Patrick Georgi
parent 9fd7b1c1a9
commit 931a218d68
5 changed files with 23 additions and 16 deletions

View File

@ -58,22 +58,10 @@ static void cpu_init(int bsp)
cpu_set_bsp(); cpu_set_bsp();
} }
static void wait_for_all_cpus(void) static void wait_for_all_cpus(size_t expected)
{ {
int all_online; while (cpus_online() != expected)
;
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;
}
} }
static void secmon_init(struct secmon_params *params, int bsp) 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(); secmon_wait_for_action();
/* Wait for all CPUs to enter secmon. */ /* Wait for all CPUs to enter secmon. */
wait_for_all_cpus(); wait_for_all_cpus(params->online_cpus);
smc_init(); smc_init();
psci_init(); psci_init();

View File

@ -116,6 +116,8 @@ static void fill_secmon_params(struct secmon_params *p,
memset(p, 0, sizeof(*p)); memset(p, 0, sizeof(*p));
p->online_cpus = cpus_online();
spin_attrs = spintable_get_attributes(); spin_attrs = spintable_get_attributes();
if (spin_attrs != NULL) { if (spin_attrs != NULL) {

View File

@ -32,6 +32,19 @@ struct cpu_info *cpu_info(void)
return cpu_info_for_cpu(smp_processor_id()); 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) static inline int action_queue_empty(struct cpu_action_queue *q)
{ {
return load_acquire_exclusive(&q->todo) == NULL; return load_acquire_exclusive(&q->todo) == NULL;

View File

@ -99,6 +99,9 @@ static inline void cpu_mark_online(struct cpu_info *ci)
store_release(&ci->online, 1); store_release(&ci->online, 1);
} }
/* Provide number of CPUs online. */
size_t cpus_online(void);
/* Control routines for starting CPUs. */ /* Control routines for starting CPUs. */
struct cpu_control_ops { struct cpu_control_ops {
/* Return the maximum number of CPUs supported. */ /* Return the maximum number of CPUs supported. */

View File

@ -25,6 +25,7 @@
#if IS_ENABLED(CONFIG_ARCH_USE_SECURE_MONITOR) #if IS_ENABLED(CONFIG_ARCH_USE_SECURE_MONITOR)
struct secmon_params { struct secmon_params {
size_t online_cpus;
struct cpu_action bsp; struct cpu_action bsp;
struct cpu_action secondary; struct cpu_action secondary;
}; };