]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
x86: coreboot: Show unimplemented sysinfo tags
authorSimon Glass <sjg@chromium.org>
Thu, 4 May 2023 22:55:06 +0000 (16:55 -0600)
committerBin Meng <bmeng@tinylab.org>
Thu, 11 May 2023 02:25:29 +0000 (10:25 +0800)
Sometimes coreboot adds new tags that U-Boot does not know about. These
are silently ignored, but it is useful to at least know what we are
missing.

Add a way to collect this information. For Brya it shows:

   Unimpl. 38 41 37 34 42 40

These are:

   LB_TAG_PLATFORM_BLOB_VERSION
   LB_TAG_ACPI_CNVS
   LB_TAG_FMAP
   LB_TAG_VBOOT_WORKBUF
   LB_TAG_TYPE_C_INFO
   LB_TAG_BOARD_CONFIG

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Tested-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/include/asm/cb_sysinfo.h
arch/x86/lib/coreboot/cb_sysinfo.c
cmd/x86/cbsysinfo.c

index 6b266149cf65ca8e93dab772acb3461b7e0efb36..2c78b22d0d2299bbe936b5a25fa2c962c210900c 100644 (file)
@@ -16,6 +16,8 @@
 #define SYSINFO_MAX_GPIOS      8
 /* Up to 10 MAC addresses */
 #define SYSINFO_MAX_MACS 10
+/* Track the first 32 unimplemented tags */
+#define SYSINFO_MAX_UNIMPL     32
 
 /**
  * struct sysinfo_t - Information passed to U-Boot from coreboot
  * @chromeos_vpd: Chromium OS Vital Product Data region, typically NULL, meaning
  *     not used
  * @rsdp: Pointer to ACPI RSDP table
+ * @unimpl_count: Number of entries in unimpl_map[]
+ * @unimpl: List of unimplemented IDs (bottom 8 bits only)
  */
 struct sysinfo_t {
        unsigned int cpu_khz;
@@ -213,6 +217,8 @@ struct sysinfo_t {
        u32 mtc_size;
        void    *chromeos_vpd;
        void *rsdp;
+       u32 unimpl_count;
+       u8 unimpl[SYSINFO_MAX_UNIMPL];
 };
 
 extern struct sysinfo_t lib_sysinfo;
index a11a2587f66b6c59803d54ff8d95ad783b9cf42b..42cc3a128d931c4b62e5473d10b48de7af957404 100644 (file)
@@ -439,6 +439,8 @@ static int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
                        cb_parse_acpi_rsdp(rec, info);
                        break;
                default:
+                       if (info->unimpl_count < SYSINFO_MAX_UNIMPL)
+                               info->unimpl[info->unimpl_count++] = rec->tag;
                        cb_parse_unhandled(rec->tag, ptr);
                        break;
                }
index 07570b00c9a0058dba3550902b3888070f12a452..2b8d3b0a43562472bbe24fa477982165cbd71f02 100644 (file)
@@ -364,6 +364,14 @@ static void show_table(struct sysinfo_t *info, bool verbose)
 
        print_ptr("Chrome OS VPD", info->chromeos_vpd);
        print_ptr("RSDP", info->rsdp);
+       printf("%-12s: ", "Unimpl.");
+       if (info->unimpl_count) {
+               for (i = 0; i < info->unimpl_count; i++)
+                       printf("%02x ", info->unimpl[i]);
+               printf("\n");
+       } else {
+               printf("(none)\n");
+       }
 }
 
 static int do_cbsysinfo(struct cmd_tbl *cmdtp, int flag, int argc,