mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-23 13:56:20 +00:00
x86: Move coreboot-table detection into common code
To support detecting booting from coreboot, move the code which locates the coreboot tables into a common place. Adjust the algorithm slightly to use a word comparison instead of string, since it is faster. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> [bmeng: correct the comments to 960KB] Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
ba974a0137
commit
33139a0bc7
3 changed files with 41 additions and 15 deletions
|
@ -115,20 +115,11 @@ __weak void cb_parse_unhandled(u32 tag, unsigned char *ptr)
|
||||||
|
|
||||||
static int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
|
static int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
|
||||||
{
|
{
|
||||||
|
unsigned char *ptr = addr;
|
||||||
struct cb_header *header;
|
struct cb_header *header;
|
||||||
unsigned char *ptr = (unsigned char *)addr;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < len; i += 16, ptr += 16) {
|
header = (struct cb_header *)ptr;
|
||||||
header = (struct cb_header *)ptr;
|
|
||||||
if (!strncmp((const char *)header->signature, "LBIO", 4))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We walked the entire space and didn't find anything. */
|
|
||||||
if (i >= len)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (!header->table_bytes)
|
if (!header->table_bytes)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -231,10 +222,13 @@ static int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
|
||||||
|
|
||||||
int get_coreboot_info(struct sysinfo_t *info)
|
int get_coreboot_info(struct sysinfo_t *info)
|
||||||
{
|
{
|
||||||
int ret = cb_parse_header((void *)0x00000000, 0x1000, info);
|
long addr;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (ret != 1)
|
addr = locate_coreboot_table();
|
||||||
ret = cb_parse_header((void *)0x000f0000, 0x1000, info);
|
if (addr < 0)
|
||||||
|
return addr;
|
||||||
|
ret = cb_parse_header((void *)addr, 0x1000, info);
|
||||||
|
|
||||||
return (ret == 1) ? 0 : -1;
|
return ret == 1 ? 0 : -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
|
@ -447,6 +447,31 @@ int x86_cpu_init_f(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long detect_coreboot_table_at(ulong start, ulong size)
|
||||||
|
{
|
||||||
|
u32 *ptr, *end;
|
||||||
|
|
||||||
|
size /= 4;
|
||||||
|
for (ptr = (void *)start, end = ptr + size; ptr < end; ptr += 4) {
|
||||||
|
if (*ptr == 0x4f49424c) /* "LBIO" */
|
||||||
|
return (long)ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -ENOENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
long locate_coreboot_table(void)
|
||||||
|
{
|
||||||
|
long addr;
|
||||||
|
|
||||||
|
/* We look for LBIO in the first 4K of RAM and again at 960KB */
|
||||||
|
addr = detect_coreboot_table_at(0x0, 0x1000);
|
||||||
|
if (addr < 0)
|
||||||
|
addr = detect_coreboot_table_at(0xf0000, 0x1000);
|
||||||
|
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
|
||||||
int x86_cpu_reinit_f(void)
|
int x86_cpu_reinit_f(void)
|
||||||
{
|
{
|
||||||
setup_identity();
|
setup_identity();
|
||||||
|
|
|
@ -343,4 +343,11 @@ void *high_table_malloc(size_t bytes);
|
||||||
*/
|
*/
|
||||||
void write_coreboot_table(u32 addr, struct memory_area *cfg_tables);
|
void write_coreboot_table(u32 addr, struct memory_area *cfg_tables);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* locate_coreboot_table() - Try to find coreboot tables at standard locations
|
||||||
|
*
|
||||||
|
* @return address of table that was found, or -ve error number
|
||||||
|
*/
|
||||||
|
long locate_coreboot_table(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue