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:
parent
84d3ed125a
commit
99a573fb32
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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_ */
|
||||
|
Loading…
Reference in New Issue
Block a user