
Hi Bin,
On Tue, 30 Jun 2020 at 02:40, Bin Meng bmeng.cn@gmail.com wrote:
Hi Simon,
On Mon, Jun 15, 2020 at 11:58 AM Simon Glass sjg@chromium.org wrote:
At present if MP is not enabled (e.g. booting from coreboot) the 'mtrr' command does not work correctly. It is not easy to make it work for all CPUs, since coreboot has halted them and we would need to start them up again, but it is easy enough to make them work on the boot CPU.
Update the code to avoid assuming that the MP init routine has completed, so that this can work.
Signed-off-by: Simon Glass sjg@chromium.org
arch/x86/cpu/mp_init.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/arch/x86/cpu/mp_init.c b/arch/x86/cpu/mp_init.c index ef33a38017..c0ae24686e 100644 --- a/arch/x86/cpu/mp_init.c +++ b/arch/x86/cpu/mp_init.c @@ -454,7 +454,7 @@ static int get_bsp(struct udevice **devp, int *cpu_countp) if (cpu_countp) *cpu_countp = ret;
return dev->req_seq;
return dev->req_seq >= 0 ? dev->req_seq : 0;
}
static struct mp_callback *read_callback(struct mp_callback **slot) @@ -589,9 +589,6 @@ int mp_run_on_cpus(int cpu_select, mp_run_func func, void *arg) int num_cpus; int ret;
if (!(gd->flags & GD_FLG_SMP_INIT))
return -ENXIO;
ret = get_bsp(&dev, &num_cpus); if (ret < 0) return log_msg_ret("bsp", ret);
@@ -601,6 +598,13 @@ int mp_run_on_cpus(int cpu_select, mp_run_func func, void *arg) func(arg); }
if (!(gd->flags & GD_FLG_SMP_INIT)) {
/* Allow use of this function on the BSP only */
if (cpu_select == MP_SELECT_BSP || !cpu_select)
This assumes 0 is the BSP cpu number?
We until i SMP is inited, then it is assumed to be CPU 0, yes.
I ended up pulling this fix into the MTRR series as I had to fix the minnowmax bug.
Regards, Simon