
Hi Simon,
On Mon, Jun 15, 2020 at 1:00 AM Simon Glass sjg@chromium.org wrote:
With the new MP features the CPUs are no-longer parked when the OS is run. Fix this by calling a special function to park them, just before the OS is started.
Signed-off-by: Simon Glass sjg@chromium.org Reviewed-by: Wolfgang Wallner wolfgang.wallner@br-automation.com
(no changes since v1)
arch/x86/cpu/cpu.c | 5 +++++ arch/x86/cpu/mp_init.c | 18 ++++++++++++++++++ arch/x86/include/asm/mp.h | 17 +++++++++++++++++ 3 files changed, 40 insertions(+)
diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c index d0720fb7fb..baa7dae172 100644 --- a/arch/x86/cpu/cpu.c +++ b/arch/x86/cpu/cpu.c @@ -66,6 +66,11 @@ static const char *const x86_vendor_name[] = {
int __weak x86_cleanup_before_linux(void) {
int ret;
ret = mp_park_aps();
if (ret)
return log_msg_ret("park", ret); bootstage_stash((void *)CONFIG_BOOTSTAGE_STASH_ADDR, CONFIG_BOOTSTAGE_STASH_SIZE);
diff --git a/arch/x86/cpu/mp_init.c b/arch/x86/cpu/mp_init.c index e65c82c8fd..9970b51c8d 100644 --- a/arch/x86/cpu/mp_init.c +++ b/arch/x86/cpu/mp_init.c @@ -657,6 +657,24 @@ int mp_run_on_cpus(int cpu_select, mp_run_func func, void *arg) return 0; }
+static void park_this_cpu(void *unused) +{
stop_this_cpu();
+}
+int mp_park_aps(void) +{
unsigned long start;
int ret;
start = get_timer(0);
ret = mp_run_on_cpus(MP_SELECT_APS, park_this_cpu, NULL);
if (ret)
return ret;
return get_timer(start);
What is this return value for? It seems you wanted to do some timeout check?
+}
int mp_init(void) { int num_aps, num_cpus; diff --git a/arch/x86/include/asm/mp.h b/arch/x86/include/asm/mp.h index 0272b3c0b6..38961ca44b 100644 --- a/arch/x86/include/asm/mp.h +++ b/arch/x86/include/asm/mp.h @@ -106,6 +106,15 @@ typedef void (*mp_run_func)(void *arg);
- @return 0 on success, -ve on error
*/ int mp_run_on_cpus(int cpu_select, mp_run_func func, void *arg);
+/**
- mp_park_aps() - Park the APs ready for the OS
- This halts all CPUs except the main one, ready for the OS to use them
- @return 0 on success, -ve on error
The return value does not match the codes
- */
+int mp_park_aps(void); #else static inline int mp_run_on_cpus(int cpu_select, mp_run_func func, void *arg) { @@ -114,6 +123,14 @@ static inline int mp_run_on_cpus(int cpu_select, mp_run_func func, void *arg)
return 0;
}
+static inline int mp_park_aps(void) +{
/* No APs to park */
return 0;
+}
#endif
#endif /* _X86_MP_H_ */
Regards, Bin