mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-14 08:57:58 +00:00
x86: mp_init: Adjust bsp_init() to return more information
This function is misnamed since it does not actually init the BSP. Also it is convenient to adjust it to return a little more information. Rename and update the function, to allow it to return the BSP CPU device and number, as well as the total number of CPUs. 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
77a5e2d3bc
commit
20b049e885
1 changed files with 23 additions and 13 deletions
|
@ -421,9 +421,18 @@ static int bsp_do_flight_plan(struct udevice *cpu, struct mp_flight_plan *plan,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int init_bsp(struct udevice **devp)
|
/**
|
||||||
|
* get_bsp() - Get information about the bootstrap processor
|
||||||
|
*
|
||||||
|
* @devp: If non-NULL, returns CPU device corresponding to the BSP
|
||||||
|
* @cpu_countp: If non-NULL, returns the total number of CPUs
|
||||||
|
* @return CPU number of the BSP, or -ve on error. If multiprocessing is not
|
||||||
|
* enabled, returns 0
|
||||||
|
*/
|
||||||
|
static int get_bsp(struct udevice **devp, int *cpu_countp)
|
||||||
{
|
{
|
||||||
char processor_name[CPU_MAX_NAME_LEN];
|
char processor_name[CPU_MAX_NAME_LEN];
|
||||||
|
struct udevice *dev;
|
||||||
int apic_id;
|
int apic_id;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -431,13 +440,20 @@ static int init_bsp(struct udevice **devp)
|
||||||
debug("CPU: %s\n", processor_name);
|
debug("CPU: %s\n", processor_name);
|
||||||
|
|
||||||
apic_id = lapicid();
|
apic_id = lapicid();
|
||||||
ret = find_cpu_by_apic_id(apic_id, devp);
|
ret = find_cpu_by_apic_id(apic_id, &dev);
|
||||||
if (ret) {
|
if (ret < 0) {
|
||||||
printf("Cannot find boot CPU, APIC ID %d\n", apic_id);
|
printf("Cannot find boot CPU, APIC ID %d\n", apic_id);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
ret = cpu_get_count(dev);
|
||||||
|
if (ret < 0)
|
||||||
|
return log_msg_ret("count", ret);
|
||||||
|
if (devp)
|
||||||
|
*devp = dev;
|
||||||
|
if (cpu_countp)
|
||||||
|
*cpu_countp = ret;
|
||||||
|
|
||||||
return 0;
|
return dev->req_seq >= 0 ? dev->req_seq : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mp_init_cpu(struct udevice *cpu, void *unused)
|
static int mp_init_cpu(struct udevice *cpu, void *unused)
|
||||||
|
@ -476,24 +492,18 @@ int mp_init(void)
|
||||||
uclass_id_foreach_dev(UCLASS_CPU, cpu, uc)
|
uclass_id_foreach_dev(UCLASS_CPU, cpu, uc)
|
||||||
cpu->req_seq = dev_read_u32_default(cpu, "reg", -1);
|
cpu->req_seq = dev_read_u32_default(cpu, "reg", -1);
|
||||||
|
|
||||||
ret = init_bsp(&cpu);
|
ret = get_bsp(&cpu, &num_cpus);
|
||||||
if (ret) {
|
if (ret < 0) {
|
||||||
debug("Cannot init boot CPU: err=%d\n", ret);
|
debug("Cannot init boot CPU: err=%d\n", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
num_cpus = cpu_get_count(cpu);
|
|
||||||
if (num_cpus < 0) {
|
|
||||||
debug("Cannot get number of CPUs: err=%d\n", num_cpus);
|
|
||||||
return num_cpus;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (num_cpus < 2)
|
if (num_cpus < 2)
|
||||||
debug("Warning: Only 1 CPU is detected\n");
|
debug("Warning: Only 1 CPU is detected\n");
|
||||||
|
|
||||||
ret = check_cpu_devices(num_cpus);
|
ret = check_cpu_devices(num_cpus);
|
||||||
if (ret)
|
if (ret)
|
||||||
debug("Warning: Device tree does not describe all CPUs. Extra ones will not be started correctly\n");
|
log_warning("Warning: Device tree does not describe all CPUs. Extra ones will not be started correctly\n");
|
||||||
|
|
||||||
/* Copy needed parameters so that APs have a reference to the plan */
|
/* Copy needed parameters so that APs have a reference to the plan */
|
||||||
mp_info.num_records = ARRAY_SIZE(mp_steps);
|
mp_info.num_records = ARRAY_SIZE(mp_steps);
|
||||||
|
|
Loading…
Reference in a new issue