x86: Allow CPUs to be set up after relocation
This permits init of additional CPU cores after relocation and when driver model is ready. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
86196c65ac
commit
bcb0c61e1a
@ -21,6 +21,8 @@
|
|||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
#include <command.h>
|
#include <command.h>
|
||||||
|
#include <cpu.h>
|
||||||
|
#include <dm.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
#include <asm/control_regs.h>
|
#include <asm/control_regs.h>
|
||||||
@ -518,6 +520,16 @@ char *cpu_get_name(char *name)
|
|||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int x86_cpu_get_desc(struct udevice *dev, char *buf, int size)
|
||||||
|
{
|
||||||
|
if (size < CPU_MAX_NAME_LEN)
|
||||||
|
return -ENOSPC;
|
||||||
|
|
||||||
|
cpu_get_name(buf);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int default_print_cpuinfo(void)
|
int default_print_cpuinfo(void)
|
||||||
{
|
{
|
||||||
printf("CPU: %s, vendor %s, device %xh\n",
|
printf("CPU: %s, vendor %s, device %xh\n",
|
||||||
@ -600,3 +612,29 @@ int last_stage_init(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
__weak int x86_init_cpus(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cpu_init_r(void)
|
||||||
|
{
|
||||||
|
return x86_init_cpus();
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct cpu_ops cpu_x86_ops = {
|
||||||
|
.get_desc = x86_cpu_get_desc,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct udevice_id cpu_x86_ids[] = {
|
||||||
|
{ .compatible = "cpu-x86" },
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
U_BOOT_DRIVER(cpu_x86_drv) = {
|
||||||
|
.name = "cpu_x86",
|
||||||
|
.id = UCLASS_CPU,
|
||||||
|
.of_match = cpu_x86_ids,
|
||||||
|
.ops = &cpu_x86_ops,
|
||||||
|
};
|
||||||
|
@ -196,6 +196,20 @@ const char *cpu_vendor_name(int vendor);
|
|||||||
*/
|
*/
|
||||||
char *cpu_get_name(char *name);
|
char *cpu_get_name(char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* x86_cpu_get_desc() - Get a description string for an x86 CPU
|
||||||
|
*
|
||||||
|
* This uses cpu_get_name() and is suitable to use as the get_desc() method for
|
||||||
|
* the CPU uclass.
|
||||||
|
*
|
||||||
|
* @dev: Device to check (UCLASS_CPU)
|
||||||
|
* @buf: Buffer to place string
|
||||||
|
* @size: Size of string space
|
||||||
|
* @return 0 if OK, -ENOSPC if buffer is too small, other -ve on error
|
||||||
|
*/
|
||||||
|
int x86_cpu_get_desc(struct udevice *dev, char *buf, int size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cpu_call64() - Jump to a 64-bit Linux kernel (internal function)
|
* cpu_call64() - Jump to a 64-bit Linux kernel (internal function)
|
||||||
*
|
*
|
||||||
|
@ -69,6 +69,8 @@ uint64_t timer_get_tsc(void);
|
|||||||
|
|
||||||
void quick_ram_check(void);
|
void quick_ram_check(void);
|
||||||
|
|
||||||
|
int x86_init_cpus(void);
|
||||||
|
|
||||||
#define PCI_VGA_RAM_IMAGE_START 0xc0000
|
#define PCI_VGA_RAM_IMAGE_START 0xc0000
|
||||||
|
|
||||||
#endif /* _U_BOOT_I386_H_ */
|
#endif /* _U_BOOT_I386_H_ */
|
||||||
|
@ -779,7 +779,7 @@ init_fnc_t init_sequence_r[] = {
|
|||||||
initr_flash,
|
initr_flash,
|
||||||
#endif
|
#endif
|
||||||
INIT_FUNC_WATCHDOG_RESET
|
INIT_FUNC_WATCHDOG_RESET
|
||||||
#if defined(CONFIG_PPC) || defined(CONFIG_M68K)
|
#if defined(CONFIG_PPC) || defined(CONFIG_M68K) || defined(CONFIG_X86)
|
||||||
/* initialize higher level parts of CPU like time base and timers */
|
/* initialize higher level parts of CPU like time base and timers */
|
||||||
cpu_init_r,
|
cpu_init_r,
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user