x86: mp: Park CPUs before running the OS

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>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
Simon Glass 2020-07-17 08:48:20 -06:00 committed by Bin Meng
parent 84d3ed125a
commit 99a573fb32
3 changed files with 38 additions and 0 deletions

View File

@ -67,6 +67,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);

View File

@ -668,6 +668,22 @@ 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)
{
int ret;
ret = mp_run_on_cpus(MP_SELECT_APS, park_this_cpu, NULL);
if (ret)
return log_ret(ret);
return 0;
}
int mp_init(void)
{
int num_aps, num_cpus;

View File

@ -109,6 +109,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 if OK, -ve on error
*/
int mp_park_aps(void);
#else
static inline int mp_run_on_cpus(int cpu_select, mp_run_func func, void *arg)
{
@ -117,6 +126,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_ */