x86: Move coreboot-table detection into common code
authorSimon Glass <sjg@chromium.org>
Sun, 26 Apr 2020 15:12:58 +0000 (09:12 -0600)
committerBin Meng <bmeng.cn@gmail.com>
Thu, 30 Apr 2020 09:47:06 +0000 (17:47 +0800)
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>
arch/x86/cpu/coreboot/tables.c
arch/x86/cpu/i386/cpu.c
arch/x86/include/asm/coreboot_tables.h

index 37e0424b5e6f3516342bd2b9ca4e7c4b16f051fc..0f04c4f8e91c7094e9954dde81eeaa32cd005d78 100644 (file)
@@ -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)
 {
+       unsigned char *ptr = addr;
        struct cb_header *header;
-       unsigned char *ptr = (unsigned char *)addr;
        int i;
 
-       for (i = 0; i < len; i += 16, ptr += 16) {
-               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;
-
+       header = (struct cb_header *)ptr;
        if (!header->table_bytes)
                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 ret = cb_parse_header((void *)0x00000000, 0x1000, info);
+       long addr;
+       int ret;
 
-       if (ret != 1)
-               ret = cb_parse_header((void *)0x000f0000, 0x1000, info);
+       addr = locate_coreboot_table();
+       if (addr < 0)
+               return addr;
+       ret = cb_parse_header((void *)addr, 0x1000, info);
 
-       return (ret == 1) ? 0 : -1;
+       return ret == 1 ? 0 : -ENOENT;
 }
index c8da7f10e9b611739b821d5d4c004b3acfc482f0..cc20456c892ed643d79308e0f503e7b7e1d9a91f 100644 (file)
@@ -447,6 +447,31 @@ int x86_cpu_init_f(void)
        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)
 {
        setup_identity();
index 61de0077d72cfcd99b92ea3a131b8afa81a7c132..268284f43c30745ad1634bdb801ba48309a86227 100644 (file)
@@ -343,4 +343,11 @@ void *high_table_malloc(size_t bytes);
  */
 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