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();
|
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();
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue