* [PATCH v4 0/6] Print AGESA version at bootup
@ 2026-01-21 6:04 Mario Limonciello (AMD)
2026-01-21 6:04 ` [PATCH v4 1/6] firmware: dmi: Correct an indexing error in dmi.h Mario Limonciello (AMD)
` (5 more replies)
0 siblings, 6 replies; 18+ messages in thread
From: Mario Limonciello (AMD) @ 2026-01-21 6:04 UTC (permalink / raw)
To: Yazen Ghannam, Jean Delvare
Cc: linux-kernel, Borislav Petkov, Mario Limonciello (AMD)
The SMBIOS additional entries on AMD Zen4+ systems running an AGESA
based BIOS contain information about the AGESA version which can be
useful for matching the software stack when debugging an issue.
Add support for parsing this from SMBIOS tables and output it into
the logs at bootup.
v4:
* Add Yazen tag
* Correct commit message typo
* Adopt Yazen's modified patch to only print on AMD systems and handle
flexible arrays
* Add back in patch for prefixing messages in x86/amd
Mario Limonciello (AMD) (5):
firmware: dmi: Correct an indexing error in dmi.h
firmware: dmi: Adjust dmi_decode() to use enums
firmware: dmi: Add missing DMI entry types
firmware: dmi: Add pr_fmt() for dmi_scan.c
x86/CPU/AMD: Prefix messages with x86/amd
Yazen Ghannam (1):
x86/CPU/AMD: Print AGESA string from DMI additional information entry
arch/x86/kernel/cpu/amd.c | 57 ++++++++++++++++++++++++++++++++++++-
drivers/firmware/dmi_scan.c | 34 ++++++++++++----------
include/linux/dmi.h | 23 +++++++++++++++
3 files changed, 98 insertions(+), 16 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH v4 1/6] firmware: dmi: Correct an indexing error in dmi.h
2026-01-21 6:04 [PATCH v4 0/6] Print AGESA version at bootup Mario Limonciello (AMD)
@ 2026-01-21 6:04 ` Mario Limonciello (AMD)
2026-01-21 6:04 ` [PATCH v4 2/6] firmware: dmi: Adjust dmi_decode() to use enums Mario Limonciello (AMD)
` (4 subsequent siblings)
5 siblings, 0 replies; 18+ messages in thread
From: Mario Limonciello (AMD) @ 2026-01-21 6:04 UTC (permalink / raw)
To: Yazen Ghannam, Jean Delvare
Cc: linux-kernel, Borislav Petkov, Mario Limonciello (AMD)
The entries later in `enum dmi_entry_type` don't match the SMBIOS
specification. The entry for type 33: `64-Bit Memory Error Information`
is not present and thus the index for all later entries is incorrect.
Add the missing type 33 entry.
Fixes: 93c890dbe5287 ("firmware: Add DMI entry types to the headers")
Link: https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.4.0a.pdf
Reviewed-by: Yazen Ghannam <yazen.ghannam@amd.com>
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
v3:
* Rename to DMI_ENTRY_64_MEM_ERROR (Jean)
---
include/linux/dmi.h | 1 +
1 file changed, 1 insertion(+)
diff --git a/include/linux/dmi.h b/include/linux/dmi.h
index 927f8a8b7a1dd..32b2529a73301 100644
--- a/include/linux/dmi.h
+++ b/include/linux/dmi.h
@@ -60,6 +60,7 @@ enum dmi_entry_type {
DMI_ENTRY_OOB_REMOTE_ACCESS,
DMI_ENTRY_BIS_ENTRY,
DMI_ENTRY_SYSTEM_BOOT,
+ DMI_ENTRY_64_MEM_ERROR,
DMI_ENTRY_MGMT_DEV,
DMI_ENTRY_MGMT_DEV_COMPONENT,
DMI_ENTRY_MGMT_DEV_THRES,
--
2.43.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v4 2/6] firmware: dmi: Adjust dmi_decode() to use enums
2026-01-21 6:04 [PATCH v4 0/6] Print AGESA version at bootup Mario Limonciello (AMD)
2026-01-21 6:04 ` [PATCH v4 1/6] firmware: dmi: Correct an indexing error in dmi.h Mario Limonciello (AMD)
@ 2026-01-21 6:04 ` Mario Limonciello (AMD)
2026-01-21 6:04 ` [PATCH v4 3/6] firmware: dmi: Add missing DMI entry types Mario Limonciello (AMD)
` (3 subsequent siblings)
5 siblings, 0 replies; 18+ messages in thread
From: Mario Limonciello (AMD) @ 2026-01-21 6:04 UTC (permalink / raw)
To: Yazen Ghannam, Jean Delvare
Cc: linux-kernel, Borislav Petkov, Mario Limonciello (AMD),
Jean Delvare
dmi_decode() has hardcoded values with comments for each DMI entry
type. The same information is already in dmi.h though, so drop the
comments and use the definitions instead.
Reviewed-by: Jean Delvare <jdelvare@suse.de>
Reviewed-by: Yazen Ghannam <yazen.ghannam@amd.com>
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
v3:
* pick up tag (Jean)
---
drivers/firmware/dmi_scan.c | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c
index 70d39adf50dca..80aded4c778bc 100644
--- a/drivers/firmware/dmi_scan.c
+++ b/drivers/firmware/dmi_scan.c
@@ -484,14 +484,14 @@ static void __init dmi_memdev_walk(void)
static void __init dmi_decode(const struct dmi_header *dm, void *dummy)
{
switch (dm->type) {
- case 0: /* BIOS Information */
+ case DMI_ENTRY_BIOS:
dmi_save_ident(dm, DMI_BIOS_VENDOR, 4);
dmi_save_ident(dm, DMI_BIOS_VERSION, 5);
dmi_save_ident(dm, DMI_BIOS_DATE, 8);
dmi_save_release(dm, DMI_BIOS_RELEASE, 21);
dmi_save_release(dm, DMI_EC_FIRMWARE_RELEASE, 23);
break;
- case 1: /* System Information */
+ case DMI_ENTRY_SYSTEM:
dmi_save_ident(dm, DMI_SYS_VENDOR, 4);
dmi_save_ident(dm, DMI_PRODUCT_NAME, 5);
dmi_save_ident(dm, DMI_PRODUCT_VERSION, 6);
@@ -500,33 +500,33 @@ static void __init dmi_decode(const struct dmi_header *dm, void *dummy)
dmi_save_ident(dm, DMI_PRODUCT_SKU, 25);
dmi_save_ident(dm, DMI_PRODUCT_FAMILY, 26);
break;
- case 2: /* Base Board Information */
+ case DMI_ENTRY_BASEBOARD:
dmi_save_ident(dm, DMI_BOARD_VENDOR, 4);
dmi_save_ident(dm, DMI_BOARD_NAME, 5);
dmi_save_ident(dm, DMI_BOARD_VERSION, 6);
dmi_save_ident(dm, DMI_BOARD_SERIAL, 7);
dmi_save_ident(dm, DMI_BOARD_ASSET_TAG, 8);
break;
- case 3: /* Chassis Information */
+ case DMI_ENTRY_CHASSIS:
dmi_save_ident(dm, DMI_CHASSIS_VENDOR, 4);
dmi_save_type(dm, DMI_CHASSIS_TYPE, 5);
dmi_save_ident(dm, DMI_CHASSIS_VERSION, 6);
dmi_save_ident(dm, DMI_CHASSIS_SERIAL, 7);
dmi_save_ident(dm, DMI_CHASSIS_ASSET_TAG, 8);
break;
- case 9: /* System Slots */
+ case DMI_ENTRY_SYSTEM_SLOT:
dmi_save_system_slot(dm);
break;
- case 10: /* Onboard Devices Information */
+ case DMI_ENTRY_ONBOARD_DEVICE:
dmi_save_devices(dm);
break;
- case 11: /* OEM Strings */
+ case DMI_ENTRY_OEMSTRINGS:
dmi_save_oem_strings_devices(dm);
break;
- case 38: /* IPMI Device Information */
+ case DMI_ENTRY_IPMI_DEV:
dmi_save_ipmi_device(dm);
break;
- case 41: /* Onboard Devices Extended Information */
+ case DMI_ENTRY_ONBOARD_DEV_EXT:
dmi_save_extended_devices(dm);
}
}
--
2.43.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v4 3/6] firmware: dmi: Add missing DMI entry types
2026-01-21 6:04 [PATCH v4 0/6] Print AGESA version at bootup Mario Limonciello (AMD)
2026-01-21 6:04 ` [PATCH v4 1/6] firmware: dmi: Correct an indexing error in dmi.h Mario Limonciello (AMD)
2026-01-21 6:04 ` [PATCH v4 2/6] firmware: dmi: Adjust dmi_decode() to use enums Mario Limonciello (AMD)
@ 2026-01-21 6:04 ` Mario Limonciello (AMD)
2026-01-21 6:04 ` [PATCH v4 4/6] firmware: dmi: Add pr_fmt() for dmi_scan.c Mario Limonciello (AMD)
` (2 subsequent siblings)
5 siblings, 0 replies; 18+ messages in thread
From: Mario Limonciello (AMD) @ 2026-01-21 6:04 UTC (permalink / raw)
To: Yazen Ghannam, Jean Delvare
Cc: linux-kernel, Borislav Petkov, Mario Limonciello (AMD),
Jean Delvare
Type 43 through type 46 entry types are missing from the
definitions in the dmi_entry_type enum.
Link: https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_3.7.1.pdf
Suggested-by: Yazen Ghannam <yazen.ghannam@amd.com>
Reviewed-by: Jean Delvare <jdelvare@suse.de>
Reviewed-by: Yazen Ghannam <yazen.ghannam@amd.com>
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
v4:
* Add tag (Yazen)
* Correct text (Yazen)
v3:
* Add tag (Jean)
---
include/linux/dmi.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/include/linux/dmi.h b/include/linux/dmi.h
index 32b2529a73301..2eedf44e68012 100644
--- a/include/linux/dmi.h
+++ b/include/linux/dmi.h
@@ -70,6 +70,10 @@ enum dmi_entry_type {
DMI_ENTRY_ADDITIONAL,
DMI_ENTRY_ONBOARD_DEV_EXT,
DMI_ENTRY_MGMT_CONTROLLER_HOST,
+ DMI_ENTRY_TPM_DEVICE,
+ DMI_ENTRY_PROCESSOR_ADDITIONAL,
+ DMI_ENTRY_FIRMWARE_INVENTORY,
+ DMI_ENTRY_STRING_PROPERTY,
DMI_ENTRY_INACTIVE = 126,
DMI_ENTRY_END_OF_TABLE = 127,
};
--
2.43.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v4 4/6] firmware: dmi: Add pr_fmt() for dmi_scan.c
2026-01-21 6:04 [PATCH v4 0/6] Print AGESA version at bootup Mario Limonciello (AMD)
` (2 preceding siblings ...)
2026-01-21 6:04 ` [PATCH v4 3/6] firmware: dmi: Add missing DMI entry types Mario Limonciello (AMD)
@ 2026-01-21 6:04 ` Mario Limonciello (AMD)
2026-01-21 6:04 ` [PATCH v4 5/6] x86/CPU/AMD: Prefix messages with x86/amd Mario Limonciello (AMD)
2026-01-21 6:04 ` [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry Mario Limonciello (AMD)
5 siblings, 0 replies; 18+ messages in thread
From: Mario Limonciello (AMD) @ 2026-01-21 6:04 UTC (permalink / raw)
To: Yazen Ghannam, Jean Delvare
Cc: linux-kernel, Borislav Petkov, Mario Limonciello (AMD)
Several prints inconsistently use DMI: or dmi: or nothing. To make
it clear which prints come from dmi_scan.c, add a pr_fmt macro.
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
v4:
* Adjust "DMI not present or invalid" message too (Yazen)
---
drivers/firmware/dmi_scan.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c
index 80aded4c778bc..ed6235ac576b6 100644
--- a/drivers/firmware/dmi_scan.c
+++ b/drivers/firmware/dmi_scan.c
@@ -1,4 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
+
+#define pr_fmt(fmt) "DMI: " fmt
+
#include <linux/types.h>
#include <linux/string.h>
#include <linux/init.h>
@@ -634,7 +637,7 @@ static int __init dmi_present(const u8 *buf)
dmi_ver >> 16, (dmi_ver >> 8) & 0xFF);
}
dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string));
- pr_info("DMI: %s\n", dmi_ids_string);
+ pr_info("%s\n", dmi_ids_string);
return 0;
}
}
@@ -663,7 +666,7 @@ static int __init dmi_smbios3_present(const u8 *buf)
dmi_ver >> 16, (dmi_ver >> 8) & 0xFF,
dmi_ver & 0xFF);
dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string));
- pr_info("DMI: %s\n", dmi_ids_string);
+ pr_info("%s\n", dmi_ids_string);
return 0;
}
}
@@ -758,7 +761,7 @@ static void __init dmi_scan_machine(void)
dmi_early_unmap(p, 0x10000);
}
error:
- pr_info("DMI not present or invalid.\n");
+ pr_info("not present or invalid.\n");
}
static __ro_after_init BIN_ATTR_SIMPLE_ADMIN_RO(smbios_entry_point);
@@ -810,7 +813,7 @@ static int __init dmi_init(void)
kobject_del(tables_kobj);
kobject_put(tables_kobj);
err:
- pr_err("dmi: Firmware registration failed.\n");
+ pr_err("Firmware registration failed.\n");
return ret;
}
@@ -831,7 +834,7 @@ void __init dmi_setup(void)
return;
dmi_memdev_walk();
- pr_info("DMI: Memory slots populated: %d/%d\n",
+ pr_info("Memory slots populated: %d/%d\n",
dmi_memdev_populated_nr, dmi_memdev_nr);
dump_stack_set_arch_desc("%s", dmi_ids_string);
}
--
2.43.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v4 5/6] x86/CPU/AMD: Prefix messages with x86/amd
2026-01-21 6:04 [PATCH v4 0/6] Print AGESA version at bootup Mario Limonciello (AMD)
` (3 preceding siblings ...)
2026-01-21 6:04 ` [PATCH v4 4/6] firmware: dmi: Add pr_fmt() for dmi_scan.c Mario Limonciello (AMD)
@ 2026-01-21 6:04 ` Mario Limonciello (AMD)
2026-01-21 10:49 ` Borislav Petkov
2026-01-21 6:04 ` [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry Mario Limonciello (AMD)
5 siblings, 1 reply; 18+ messages in thread
From: Mario Limonciello (AMD) @ 2026-01-21 6:04 UTC (permalink / raw)
To: Yazen Ghannam, Jean Delvare
Cc: linux-kernel, Borislav Petkov, Mario Limonciello (AMD)
To clarify which messages come from arch/x86/kernel/cpu/amd.c add
a prefix to all messages instead of just the previous reset reason.
Reviewed-by: Yazen Ghannam <yazen.ghannam@amd.com>
Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
---
v3:
* add tag, put in it's own series
---
arch/x86/kernel/cpu/amd.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index bc94ff1e250ad..c19c4ee74dd1f 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -1,4 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
+#define pr_fmt(fmt) "x86/amd: " fmt
+
#include <linux/export.h>
#include <linux/bitops.h>
#include <linux/elf.h>
@@ -1396,7 +1398,7 @@ static __init int print_s5_reset_status_mmio(void)
continue;
if (s5_reset_reason_txt[i]) {
- pr_info("x86/amd: Previous system reset reason [0x%08x]: %s\n",
+ pr_info("Previous system reset reason [0x%08x]: %s\n",
value, s5_reset_reason_txt[i]);
}
}
--
2.43.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry
2026-01-21 6:04 [PATCH v4 0/6] Print AGESA version at bootup Mario Limonciello (AMD)
` (4 preceding siblings ...)
2026-01-21 6:04 ` [PATCH v4 5/6] x86/CPU/AMD: Prefix messages with x86/amd Mario Limonciello (AMD)
@ 2026-01-21 6:04 ` Mario Limonciello (AMD)
2026-01-21 11:30 ` kernel test robot
` (3 more replies)
5 siblings, 4 replies; 18+ messages in thread
From: Mario Limonciello (AMD) @ 2026-01-21 6:04 UTC (permalink / raw)
To: Yazen Ghannam, Jean Delvare
Cc: linux-kernel, Borislav Petkov, Mario Limonciello (AMD)
From: Yazen Ghannam <yazen.ghannam@amd.com>
Type 40 entries (Additional Information) are summarized in section 7.41
as part of the SMBIOS specification. Generally, these entries aren't
interesting to save.
However on some AMD Zen systems, the AGESA version is stored here. This
is useful to save to the kernel message logs for debugging. It can be
used to cross-reference issues.
Implement an iterator for the Additional Information entries. Use this
to find and print the AGESA string. Do so in AMD code, since the use
case is AMD-specific.
Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com>
Co-developed-by: "Mario Limonciello (AMD)" <superm1@kernel.org>
Signed-off-by: "Mario Limonciello (AMD)" <superm1@kernel.org>
---
v4:
* New patch (based upon older versions though)
---
arch/x86/kernel/cpu/amd.c | 53 +++++++++++++++++++++++++++++++++++++
drivers/firmware/dmi_scan.c | 3 ++-
include/linux/dmi.h | 18 +++++++++++++
3 files changed, 73 insertions(+), 1 deletion(-)
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index c19c4ee74dd1f..5cd60855a85b0 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -3,6 +3,7 @@
#include <linux/export.h>
#include <linux/bitops.h>
+#include <linux/dmi.h>
#include <linux/elf.h>
#include <linux/mm.h>
#include <linux/kvm_types.h>
@@ -1406,3 +1407,55 @@ static __init int print_s5_reset_status_mmio(void)
return 0;
}
late_initcall(print_s5_reset_status_mmio);
+
+static void __init amd_dmi_scan_additional(const struct dmi_header *d, void *p)
+{
+ struct dmi_a_info *info = (struct dmi_a_info *)d;
+ void *next, *end;
+
+ /*
+ * DMI Additional Info table has a 'count' field. But it's not very
+ * helpful since the entries are variable length. So don't use it.
+ */
+ if (info->header.type != DMI_ENTRY_ADDITIONAL ||
+ info->header.length < DMI_A_INFO_MIN_SIZE)
+ return;
+
+ /*
+ * Get the first entry.
+ * The minimum table size guarantees at least one entry is present.
+ */
+ next = (void *)(info + 1);
+ end = (void *)info + info->header.length;
+
+ do {
+ struct dmi_a_info_entry *entry;
+ const char *string_ptr;
+
+ entry = (struct dmi_a_info_entry *)next;
+
+ /*
+ * Not much can be done to validate data. At least the entry
+ * length shouldn't be 0.
+ */
+ if (!entry->length)
+ return;
+
+ string_ptr = dmi_string_nosave(&info->header, entry->str_num);
+
+ /* Only one AGESA string is expected. */
+ if (!strncmp(string_ptr, "AGESA", 5)) {
+ pr_info("%s\n", string_ptr);
+ break;
+ }
+
+ next += entry->length;
+ } while (end - next >= DMI_A_INFO_ENT_MIN_SIZE);
+}
+
+static __init int print_dmi_agesa(void)
+{
+ dmi_walk(amd_dmi_scan_additional, NULL);
+ return 0;
+}
+late_initcall(print_dmi_agesa);
diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c
index ed6235ac576b6..a3f7dabd49554 100644
--- a/drivers/firmware/dmi_scan.c
+++ b/drivers/firmware/dmi_scan.c
@@ -47,7 +47,7 @@ static struct dmi_memdev_info {
static int dmi_memdev_nr;
static int dmi_memdev_populated_nr __initdata;
-static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s)
+const char *dmi_string_nosave(const struct dmi_header *dm, u8 s)
{
const u8 *bp = ((u8 *) dm) + dm->length;
const u8 *nsp;
@@ -66,6 +66,7 @@ static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s)
return dmi_empty_string;
}
+EXPORT_SYMBOL_GPL(dmi_string_nosave);
static const char * __init dmi_string(const struct dmi_header *dm, u8 s)
{
diff --git a/include/linux/dmi.h b/include/linux/dmi.h
index 2eedf44e68012..b7865fa387ccb 100644
--- a/include/linux/dmi.h
+++ b/include/linux/dmi.h
@@ -91,6 +91,21 @@ struct dmi_device {
void *device_data; /* Type specific data */
};
+#define DMI_A_INFO_ENT_MIN_SIZE 0x6
+struct dmi_a_info_entry {
+ u8 length;
+ u16 handle;
+ u8 offset;
+ u8 str_num;
+ u8 value[];
+} __packed;
+
+#define DMI_A_INFO_MIN_SIZE 0xB
+struct dmi_a_info {
+ struct dmi_header header;
+ u8 count;
+} __packed;
+
#ifdef CONFIG_DMI
struct dmi_dev_onboard {
@@ -120,6 +135,7 @@ extern void dmi_memdev_name(u16 handle, const char **bank, const char **device);
extern u64 dmi_memdev_size(u16 handle);
extern u8 dmi_memdev_type(u16 handle);
extern u16 dmi_memdev_handle(int slot);
+const char *dmi_string_nosave(const struct dmi_header *dm, u8 s);
#else
@@ -153,6 +169,8 @@ static inline u8 dmi_memdev_type(u16 handle) { return 0x0; }
static inline u16 dmi_memdev_handle(int slot) { return 0xffff; }
static inline const struct dmi_system_id *
dmi_first_match(const struct dmi_system_id *list) { return NULL; }
+static inline const char *
+ dmi_string_nosave(const struct dmi_header *dm, u8 s) { return dmi_empty_string; }
#endif
--
2.43.0
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH v4 5/6] x86/CPU/AMD: Prefix messages with x86/amd
2026-01-21 6:04 ` [PATCH v4 5/6] x86/CPU/AMD: Prefix messages with x86/amd Mario Limonciello (AMD)
@ 2026-01-21 10:49 ` Borislav Petkov
2026-01-21 14:28 ` Mario Limonciello (AMD) (kernel.org)
0 siblings, 1 reply; 18+ messages in thread
From: Borislav Petkov @ 2026-01-21 10:49 UTC (permalink / raw)
To: Mario Limonciello (AMD); +Cc: Yazen Ghannam, Jean Delvare, linux-kernel
On Wed, Jan 21, 2026 at 12:04:30AM -0600, Mario Limonciello (AMD) wrote:
> To clarify which messages come from arch/x86/kernel/cpu/amd.c add
> a prefix to all messages instead of just the previous reset reason.
>
> Reviewed-by: Yazen Ghannam <yazen.ghannam@amd.com>
> Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
> ---
> v3:
> * add tag, put in it's own series
> ---
> arch/x86/kernel/cpu/amd.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
> index bc94ff1e250ad..c19c4ee74dd1f 100644
> --- a/arch/x86/kernel/cpu/amd.c
> +++ b/arch/x86/kernel/cpu/amd.c
> @@ -1,4 +1,6 @@
> // SPDX-License-Identifier: GPL-2.0-only
> +#define pr_fmt(fmt) "x86/amd: " fmt
I'm still not sure about this. There are a lot of places which you can call
"x86/amd:" - not only this one. So if anything, this prefix should be called
"x86/CPU:".
But looking at cpu/intel.c, they have "x86/tme:" and "x86/mktme:" prefixes
there for the TME specific stuff.
So I still don't see a clear working logic to apply to x86/cpu/ compilation
units.
So unless there's a better idea, pls drop this for now.
Thx.
--
Regards/Gruss,
Boris.
https://people.kernel.org/tglx/notes-about-netiquette
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry
2026-01-21 6:04 ` [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry Mario Limonciello (AMD)
@ 2026-01-21 11:30 ` kernel test robot
2026-01-21 14:26 ` Yazen Ghannam
` (2 subsequent siblings)
3 siblings, 0 replies; 18+ messages in thread
From: kernel test robot @ 2026-01-21 11:30 UTC (permalink / raw)
To: Mario Limonciello (AMD), Yazen Ghannam, Jean Delvare
Cc: oe-kbuild-all, linux-kernel, Borislav Petkov,
Mario Limonciello (AMD)
Hi Mario,
kernel test robot noticed the following build errors:
[auto build test ERROR on tip/x86/core]
[also build test ERROR on tip/master linus/master v6.19-rc6 next-20260120]
[cannot apply to jdelvare-staging/dmi-for-next bp/for-next tip/auto-latest]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Mario-Limonciello-AMD/firmware-dmi-Correct-an-indexing-error-in-dmi-h/20260121-140800
base: tip/x86/core
patch link: https://lore.kernel.org/r/20260121060431.432350-7-superm1%40kernel.org
patch subject: [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry
config: microblaze-defconfig (https://download.01.org/0day-ci/archive/20260121/202601211912.0hwXBwKQ-lkp@intel.com/config)
compiler: microblaze-linux-gcc (GCC) 15.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260121/202601211912.0hwXBwKQ-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601211912.0hwXBwKQ-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from drivers/pci/pci.c:14:
include/linux/dmi.h: In function 'dmi_string_nosave':
>> include/linux/dmi.h:173:71: error: 'dmi_empty_string' undeclared (first use in this function)
173 | dmi_string_nosave(const struct dmi_header *dm, u8 s) { return dmi_empty_string; }
| ^~~~~~~~~~~~~~~~
include/linux/dmi.h:173:71: note: each undeclared identifier is reported only once for each function it appears in
vim +/dmi_empty_string +173 include/linux/dmi.h
141
142 static inline int dmi_check_system(const struct dmi_system_id *list) { return 0; }
143 static inline const char * dmi_get_system_info(int field) { return NULL; }
144 static inline const struct dmi_device * dmi_find_device(int type, const char *name,
145 const struct dmi_device *from) { return NULL; }
146 static inline void dmi_setup(void) { }
147 static inline bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp)
148 {
149 if (yearp)
150 *yearp = 0;
151 if (monthp)
152 *monthp = 0;
153 if (dayp)
154 *dayp = 0;
155 return false;
156 }
157 static inline int dmi_get_bios_year(void) { return -ENXIO; }
158 static inline int dmi_name_in_vendors(const char *s) { return 0; }
159 static inline int dmi_name_in_serial(const char *s) { return 0; }
160 #define dmi_available 0
161 static inline int dmi_walk(void (*decode)(const struct dmi_header *, void *),
162 void *private_data) { return -ENXIO; }
163 static inline bool dmi_match(enum dmi_field f, const char *str)
164 { return false; }
165 static inline void dmi_memdev_name(u16 handle, const char **bank,
166 const char **device) { }
167 static inline u64 dmi_memdev_size(u16 handle) { return ~0ul; }
168 static inline u8 dmi_memdev_type(u16 handle) { return 0x0; }
169 static inline u16 dmi_memdev_handle(int slot) { return 0xffff; }
170 static inline const struct dmi_system_id *
171 dmi_first_match(const struct dmi_system_id *list) { return NULL; }
172 static inline const char *
> 173 dmi_string_nosave(const struct dmi_header *dm, u8 s) { return dmi_empty_string; }
174
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry
2026-01-21 6:04 ` [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry Mario Limonciello (AMD)
2026-01-21 11:30 ` kernel test robot
@ 2026-01-21 14:26 ` Yazen Ghannam
2026-01-21 14:28 ` Mario Limonciello (AMD) (kernel.org)
2026-01-21 20:50 ` Mario Limonciello
2026-01-21 15:44 ` kernel test robot
2026-01-21 18:53 ` kernel test robot
3 siblings, 2 replies; 18+ messages in thread
From: Yazen Ghannam @ 2026-01-21 14:26 UTC (permalink / raw)
To: Mario Limonciello (AMD); +Cc: Jean Delvare, linux-kernel, Borislav Petkov
On Wed, Jan 21, 2026 at 12:04:31AM -0600, Mario Limonciello (AMD) wrote:
> From: Yazen Ghannam <yazen.ghannam@amd.com>
>
> Type 40 entries (Additional Information) are summarized in section 7.41
> as part of the SMBIOS specification. Generally, these entries aren't
> interesting to save.
>
> However on some AMD Zen systems, the AGESA version is stored here. This
> is useful to save to the kernel message logs for debugging. It can be
> used to cross-reference issues.
>
> Implement an iterator for the Additional Information entries. Use this
> to find and print the AGESA string. Do so in AMD code, since the use
> case is AMD-specific.
>
> Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com>
> Co-developed-by: "Mario Limonciello (AMD)" <superm1@kernel.org>
> Signed-off-by: "Mario Limonciello (AMD)" <superm1@kernel.org>
> ---
> v4:
> * New patch (based upon older versions though)
> ---
> arch/x86/kernel/cpu/amd.c | 53 +++++++++++++++++++++++++++++++++++++
> drivers/firmware/dmi_scan.c | 3 ++-
> include/linux/dmi.h | 18 +++++++++++++
> 3 files changed, 73 insertions(+), 1 deletion(-)
>
> diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
> index c19c4ee74dd1f..5cd60855a85b0 100644
> --- a/arch/x86/kernel/cpu/amd.c
> +++ b/arch/x86/kernel/cpu/amd.c
> @@ -3,6 +3,7 @@
>
> #include <linux/export.h>
> #include <linux/bitops.h>
> +#include <linux/dmi.h>
> #include <linux/elf.h>
> #include <linux/mm.h>
> #include <linux/kvm_types.h>
> @@ -1406,3 +1407,55 @@ static __init int print_s5_reset_status_mmio(void)
> return 0;
> }
> late_initcall(print_s5_reset_status_mmio);
> +
> +static void __init amd_dmi_scan_additional(const struct dmi_header *d, void *p)
> +{
> + struct dmi_a_info *info = (struct dmi_a_info *)d;
> + void *next, *end;
> +
> + /*
> + * DMI Additional Info table has a 'count' field. But it's not very
> + * helpful since the entries are variable length. So don't use it.
> + */
> + if (info->header.type != DMI_ENTRY_ADDITIONAL ||
> + info->header.length < DMI_A_INFO_MIN_SIZE)
> + return;
> +
> + /*
> + * Get the first entry.
> + * The minimum table size guarantees at least one entry is present.
> + */
> + next = (void *)(info + 1);
> + end = (void *)info + info->header.length;
> +
> + do {
> + struct dmi_a_info_entry *entry;
> + const char *string_ptr;
> +
> + entry = (struct dmi_a_info_entry *)next;
> +
> + /*
> + * Not much can be done to validate data. At least the entry
> + * length shouldn't be 0.
> + */
> + if (!entry->length)
> + return;
> +
> + string_ptr = dmi_string_nosave(&info->header, entry->str_num);
> +
> + /* Only one AGESA string is expected. */
> + if (!strncmp(string_ptr, "AGESA", 5)) {
> + pr_info("%s\n", string_ptr);
> + break;
> + }
> +
> + next += entry->length;
> + } while (end - next >= DMI_A_INFO_ENT_MIN_SIZE);
> +}
> +
> +static __init int print_dmi_agesa(void)
> +{
> + dmi_walk(amd_dmi_scan_additional, NULL);
> + return 0;
> +}
> +late_initcall(print_dmi_agesa);
> diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c
> index ed6235ac576b6..a3f7dabd49554 100644
> --- a/drivers/firmware/dmi_scan.c
> +++ b/drivers/firmware/dmi_scan.c
> @@ -47,7 +47,7 @@ static struct dmi_memdev_info {
> static int dmi_memdev_nr;
> static int dmi_memdev_populated_nr __initdata;
>
> -static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s)
> +const char *dmi_string_nosave(const struct dmi_header *dm, u8 s)
> {
> const u8 *bp = ((u8 *) dm) + dm->length;
> const u8 *nsp;
> @@ -66,6 +66,7 @@ static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s)
>
> return dmi_empty_string;
> }
> +EXPORT_SYMBOL_GPL(dmi_string_nosave);
>
> static const char * __init dmi_string(const struct dmi_header *dm, u8 s)
> {
> diff --git a/include/linux/dmi.h b/include/linux/dmi.h
> index 2eedf44e68012..b7865fa387ccb 100644
> --- a/include/linux/dmi.h
> +++ b/include/linux/dmi.h
> @@ -91,6 +91,21 @@ struct dmi_device {
> void *device_data; /* Type specific data */
> };
>
> +#define DMI_A_INFO_ENT_MIN_SIZE 0x6
> +struct dmi_a_info_entry {
> + u8 length;
> + u16 handle;
> + u8 offset;
> + u8 str_num;
> + u8 value[];
> +} __packed;
> +
> +#define DMI_A_INFO_MIN_SIZE 0xB
> +struct dmi_a_info {
> + struct dmi_header header;
> + u8 count;
> +} __packed;
> +
> #ifdef CONFIG_DMI
>
> struct dmi_dev_onboard {
> @@ -120,6 +135,7 @@ extern void dmi_memdev_name(u16 handle, const char **bank, const char **device);
> extern u64 dmi_memdev_size(u16 handle);
> extern u8 dmi_memdev_type(u16 handle);
> extern u16 dmi_memdev_handle(int slot);
> +const char *dmi_string_nosave(const struct dmi_header *dm, u8 s);
>
> #else
>
> @@ -153,6 +169,8 @@ static inline u8 dmi_memdev_type(u16 handle) { return 0x0; }
> static inline u16 dmi_memdev_handle(int slot) { return 0xffff; }
> static inline const struct dmi_system_id *
> dmi_first_match(const struct dmi_system_id *list) { return NULL; }
> +static inline const char *
> + dmi_string_nosave(const struct dmi_header *dm, u8 s) { return dmi_empty_string; }
>
The dmi_empty_string needs to be moved to this header file from
dmi_scan.c.
Otherwise, there's a build issue as the test bot reported.
Thanks,
Yazen
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v4 5/6] x86/CPU/AMD: Prefix messages with x86/amd
2026-01-21 10:49 ` Borislav Petkov
@ 2026-01-21 14:28 ` Mario Limonciello (AMD) (kernel.org)
2026-01-21 14:37 ` Borislav Petkov
0 siblings, 1 reply; 18+ messages in thread
From: Mario Limonciello (AMD) (kernel.org) @ 2026-01-21 14:28 UTC (permalink / raw)
To: Borislav Petkov; +Cc: Yazen Ghannam, Jean Delvare, linux-kernel
On 1/21/2026 4:49 AM, Borislav Petkov wrote:
> On Wed, Jan 21, 2026 at 12:04:30AM -0600, Mario Limonciello (AMD) wrote:
>> To clarify which messages come from arch/x86/kernel/cpu/amd.c add
>> a prefix to all messages instead of just the previous reset reason.
>>
>> Reviewed-by: Yazen Ghannam <yazen.ghannam@amd.com>
>> Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
>> ---
>> v3:
>> * add tag, put in it's own series
>> ---
>> arch/x86/kernel/cpu/amd.c | 4 +++-
>> 1 file changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
>> index bc94ff1e250ad..c19c4ee74dd1f 100644
>> --- a/arch/x86/kernel/cpu/amd.c
>> +++ b/arch/x86/kernel/cpu/amd.c
>> @@ -1,4 +1,6 @@
>> // SPDX-License-Identifier: GPL-2.0-only
>> +#define pr_fmt(fmt) "x86/amd: " fmt
>
> I'm still not sure about this. There are a lot of places which you can call
> "x86/amd:" - not only this one. So if anything, this prefix should be called
> "x86/CPU:".
>
> But looking at cpu/intel.c, they have "x86/tme:" and "x86/mktme:" prefixes
> there for the TME specific stuff.
>
> So I still don't see a clear working logic to apply to x86/cpu/ compilation
> units.
>
> So unless there's a better idea, pls drop this for now.
>
> Thx.
>
Well so if I drop this patch, I still want to apply some sort of prefix
to patch 6/6. Because otherwise you end up with an AGESA string with no
context of what that actually means or goes with.
Any other ideas of what to prefix that with? Maybe:
pr_info("AMD BIOS: %s\n")
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry
2026-01-21 14:26 ` Yazen Ghannam
@ 2026-01-21 14:28 ` Mario Limonciello (AMD) (kernel.org)
2026-01-21 20:50 ` Mario Limonciello
1 sibling, 0 replies; 18+ messages in thread
From: Mario Limonciello (AMD) (kernel.org) @ 2026-01-21 14:28 UTC (permalink / raw)
To: Yazen Ghannam; +Cc: Jean Delvare, linux-kernel, Borislav Petkov
On 1/21/2026 8:26 AM, Yazen Ghannam wrote:
> On Wed, Jan 21, 2026 at 12:04:31AM -0600, Mario Limonciello (AMD) wrote:
>> From: Yazen Ghannam <yazen.ghannam@amd.com>
>>
>> Type 40 entries (Additional Information) are summarized in section 7.41
>> as part of the SMBIOS specification. Generally, these entries aren't
>> interesting to save.
>>
>> However on some AMD Zen systems, the AGESA version is stored here. This
>> is useful to save to the kernel message logs for debugging. It can be
>> used to cross-reference issues.
>>
>> Implement an iterator for the Additional Information entries. Use this
>> to find and print the AGESA string. Do so in AMD code, since the use
>> case is AMD-specific.
>>
>> Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com>
>> Co-developed-by: "Mario Limonciello (AMD)" <superm1@kernel.org>
>> Signed-off-by: "Mario Limonciello (AMD)" <superm1@kernel.org>
>> ---
>> v4:
>> * New patch (based upon older versions though)
>> ---
>> arch/x86/kernel/cpu/amd.c | 53 +++++++++++++++++++++++++++++++++++++
>> drivers/firmware/dmi_scan.c | 3 ++-
>> include/linux/dmi.h | 18 +++++++++++++
>> 3 files changed, 73 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
>> index c19c4ee74dd1f..5cd60855a85b0 100644
>> --- a/arch/x86/kernel/cpu/amd.c
>> +++ b/arch/x86/kernel/cpu/amd.c
>> @@ -3,6 +3,7 @@
>>
>> #include <linux/export.h>
>> #include <linux/bitops.h>
>> +#include <linux/dmi.h>
>> #include <linux/elf.h>
>> #include <linux/mm.h>
>> #include <linux/kvm_types.h>
>> @@ -1406,3 +1407,55 @@ static __init int print_s5_reset_status_mmio(void)
>> return 0;
>> }
>> late_initcall(print_s5_reset_status_mmio);
>> +
>> +static void __init amd_dmi_scan_additional(const struct dmi_header *d, void *p)
>> +{
>> + struct dmi_a_info *info = (struct dmi_a_info *)d;
>> + void *next, *end;
>> +
>> + /*
>> + * DMI Additional Info table has a 'count' field. But it's not very
>> + * helpful since the entries are variable length. So don't use it.
>> + */
>> + if (info->header.type != DMI_ENTRY_ADDITIONAL ||
>> + info->header.length < DMI_A_INFO_MIN_SIZE)
>> + return;
>> +
>> + /*
>> + * Get the first entry.
>> + * The minimum table size guarantees at least one entry is present.
>> + */
>> + next = (void *)(info + 1);
>> + end = (void *)info + info->header.length;
>> +
>> + do {
>> + struct dmi_a_info_entry *entry;
>> + const char *string_ptr;
>> +
>> + entry = (struct dmi_a_info_entry *)next;
>> +
>> + /*
>> + * Not much can be done to validate data. At least the entry
>> + * length shouldn't be 0.
>> + */
>> + if (!entry->length)
>> + return;
>> +
>> + string_ptr = dmi_string_nosave(&info->header, entry->str_num);
>> +
>> + /* Only one AGESA string is expected. */
>> + if (!strncmp(string_ptr, "AGESA", 5)) {
>> + pr_info("%s\n", string_ptr);
>> + break;
>> + }
>> +
>> + next += entry->length;
>> + } while (end - next >= DMI_A_INFO_ENT_MIN_SIZE);
>> +}
>> +
>> +static __init int print_dmi_agesa(void)
>> +{
>> + dmi_walk(amd_dmi_scan_additional, NULL);
>> + return 0;
>> +}
>> +late_initcall(print_dmi_agesa);
>> diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c
>> index ed6235ac576b6..a3f7dabd49554 100644
>> --- a/drivers/firmware/dmi_scan.c
>> +++ b/drivers/firmware/dmi_scan.c
>> @@ -47,7 +47,7 @@ static struct dmi_memdev_info {
>> static int dmi_memdev_nr;
>> static int dmi_memdev_populated_nr __initdata;
>>
>> -static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s)
>> +const char *dmi_string_nosave(const struct dmi_header *dm, u8 s)
>> {
>> const u8 *bp = ((u8 *) dm) + dm->length;
>> const u8 *nsp;
>> @@ -66,6 +66,7 @@ static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s)
>>
>> return dmi_empty_string;
>> }
>> +EXPORT_SYMBOL_GPL(dmi_string_nosave);
>>
>> static const char * __init dmi_string(const struct dmi_header *dm, u8 s)
>> {
>> diff --git a/include/linux/dmi.h b/include/linux/dmi.h
>> index 2eedf44e68012..b7865fa387ccb 100644
>> --- a/include/linux/dmi.h
>> +++ b/include/linux/dmi.h
>> @@ -91,6 +91,21 @@ struct dmi_device {
>> void *device_data; /* Type specific data */
>> };
>>
>> +#define DMI_A_INFO_ENT_MIN_SIZE 0x6
>> +struct dmi_a_info_entry {
>> + u8 length;
>> + u16 handle;
>> + u8 offset;
>> + u8 str_num;
>> + u8 value[];
>> +} __packed;
>> +
>> +#define DMI_A_INFO_MIN_SIZE 0xB
>> +struct dmi_a_info {
>> + struct dmi_header header;
>> + u8 count;
>> +} __packed;
>> +
>> #ifdef CONFIG_DMI
>>
>> struct dmi_dev_onboard {
>> @@ -120,6 +135,7 @@ extern void dmi_memdev_name(u16 handle, const char **bank, const char **device);
>> extern u64 dmi_memdev_size(u16 handle);
>> extern u8 dmi_memdev_type(u16 handle);
>> extern u16 dmi_memdev_handle(int slot);
>> +const char *dmi_string_nosave(const struct dmi_header *dm, u8 s);
>>
>> #else
>>
>> @@ -153,6 +169,8 @@ static inline u8 dmi_memdev_type(u16 handle) { return 0x0; }
>> static inline u16 dmi_memdev_handle(int slot) { return 0xffff; }
>> static inline const struct dmi_system_id *
>> dmi_first_match(const struct dmi_system_id *list) { return NULL; }
>> +static inline const char *
>> + dmi_string_nosave(const struct dmi_header *dm, u8 s) { return dmi_empty_string; }
>>
>
> The dmi_empty_string needs to be moved to this header file from
> dmi_scan.c.
>
> Otherwise, there's a build issue as the test bot reported.
>
> Thanks,
> Yazen
Yeah; it makes sense now. Will move in next version.
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v4 5/6] x86/CPU/AMD: Prefix messages with x86/amd
2026-01-21 14:28 ` Mario Limonciello (AMD) (kernel.org)
@ 2026-01-21 14:37 ` Borislav Petkov
0 siblings, 0 replies; 18+ messages in thread
From: Borislav Petkov @ 2026-01-21 14:37 UTC (permalink / raw)
To: Mario Limonciello (AMD) (kernel.org)
Cc: Yazen Ghannam, Jean Delvare, linux-kernel
On Wed, Jan 21, 2026 at 08:28:26AM -0600, Mario Limonciello (AMD) (kernel.org) wrote:
> Well so if I drop this patch, I still want to apply some sort of prefix to
> patch 6/6. Because otherwise you end up with an AGESA string with no
> context of what that actually means or goes with.
Other useful strings don't have a prefix either:
[ 0.000000] DMI: Micro-Star International Co., Ltd. MS-7B79/X470 GAMING PRO (MS-7B79), BIOS 1.70 01/23/2019
> Any other ideas of what to prefix that with? Maybe:
> pr_info("AMD BIOS: %s\n")
"AGESA: ..."
AGESA is unique and AMD-specific.
--
Regards/Gruss,
Boris.
https://people.kernel.org/tglx/notes-about-netiquette
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry
2026-01-21 6:04 ` [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry Mario Limonciello (AMD)
2026-01-21 11:30 ` kernel test robot
2026-01-21 14:26 ` Yazen Ghannam
@ 2026-01-21 15:44 ` kernel test robot
2026-01-21 18:53 ` kernel test robot
3 siblings, 0 replies; 18+ messages in thread
From: kernel test robot @ 2026-01-21 15:44 UTC (permalink / raw)
To: Mario Limonciello (AMD), Yazen Ghannam, Jean Delvare
Cc: llvm, oe-kbuild-all, linux-kernel, Borislav Petkov,
Mario Limonciello (AMD)
Hi Mario,
kernel test robot noticed the following build errors:
[auto build test ERROR on tip/x86/core]
[also build test ERROR on tip/master linus/master v6.19-rc6 next-20260120]
[cannot apply to bp/for-next tip/auto-latest]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Mario-Limonciello-AMD/firmware-dmi-Correct-an-indexing-error-in-dmi-h/20260121-140800
base: tip/x86/core
patch link: https://lore.kernel.org/r/20260121060431.432350-7-superm1%40kernel.org
patch subject: [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry
config: loongarch-allnoconfig (https://download.01.org/0day-ci/archive/20260121/202601212323.7qxI0awN-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project 9b8addffa70cee5b2acc5454712d9cf78ce45710)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260121/202601212323.7qxI0awN-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601212323.7qxI0awN-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from arch/loongarch/kernel/setup.c:16:
>> include/linux/dmi.h:173:64: error: use of undeclared identifier 'dmi_empty_string'
173 | dmi_string_nosave(const struct dmi_header *dm, u8 s) { return dmi_empty_string; }
| ^~~~~~~~~~~~~~~~
1 error generated.
vim +/dmi_empty_string +173 include/linux/dmi.h
141
142 static inline int dmi_check_system(const struct dmi_system_id *list) { return 0; }
143 static inline const char * dmi_get_system_info(int field) { return NULL; }
144 static inline const struct dmi_device * dmi_find_device(int type, const char *name,
145 const struct dmi_device *from) { return NULL; }
146 static inline void dmi_setup(void) { }
147 static inline bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp)
148 {
149 if (yearp)
150 *yearp = 0;
151 if (monthp)
152 *monthp = 0;
153 if (dayp)
154 *dayp = 0;
155 return false;
156 }
157 static inline int dmi_get_bios_year(void) { return -ENXIO; }
158 static inline int dmi_name_in_vendors(const char *s) { return 0; }
159 static inline int dmi_name_in_serial(const char *s) { return 0; }
160 #define dmi_available 0
161 static inline int dmi_walk(void (*decode)(const struct dmi_header *, void *),
162 void *private_data) { return -ENXIO; }
163 static inline bool dmi_match(enum dmi_field f, const char *str)
164 { return false; }
165 static inline void dmi_memdev_name(u16 handle, const char **bank,
166 const char **device) { }
167 static inline u64 dmi_memdev_size(u16 handle) { return ~0ul; }
168 static inline u8 dmi_memdev_type(u16 handle) { return 0x0; }
169 static inline u16 dmi_memdev_handle(int slot) { return 0xffff; }
170 static inline const struct dmi_system_id *
171 dmi_first_match(const struct dmi_system_id *list) { return NULL; }
172 static inline const char *
> 173 dmi_string_nosave(const struct dmi_header *dm, u8 s) { return dmi_empty_string; }
174
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry
2026-01-21 6:04 ` [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry Mario Limonciello (AMD)
` (2 preceding siblings ...)
2026-01-21 15:44 ` kernel test robot
@ 2026-01-21 18:53 ` kernel test robot
3 siblings, 0 replies; 18+ messages in thread
From: kernel test robot @ 2026-01-21 18:53 UTC (permalink / raw)
To: Mario Limonciello (AMD), Yazen Ghannam, Jean Delvare
Cc: oe-kbuild-all, linux-kernel, Borislav Petkov,
Mario Limonciello (AMD)
Hi Mario,
kernel test robot noticed the following build warnings:
[auto build test WARNING on tip/x86/core]
[also build test WARNING on tip/master linus/master v6.19-rc6 next-20260120]
[cannot apply to jdelvare-staging/dmi-for-next bp/for-next tip/auto-latest]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Mario-Limonciello-AMD/firmware-dmi-Correct-an-indexing-error-in-dmi-h/20260121-140800
base: tip/x86/core
patch link: https://lore.kernel.org/r/20260121060431.432350-7-superm1%40kernel.org
patch subject: [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry
config: i386-buildonly-randconfig-003-20260121 (https://download.01.org/0day-ci/archive/20260122/202601220139.ymxKIu3a-lkp@intel.com/config)
compiler: gcc-13 (Debian 13.3.0-16) 13.3.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260122/202601220139.ymxKIu3a-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601220139.ymxKIu3a-lkp@intel.com/
All warnings (new ones prefixed by >>):
In file included from arch/x86/kernel/cpu/amd.c:6:
include/linux/dmi.h: In function 'dmi_string_nosave':
include/linux/dmi.h:173:71: error: 'dmi_empty_string' undeclared (first use in this function)
173 | dmi_string_nosave(const struct dmi_header *dm, u8 s) { return dmi_empty_string; }
| ^~~~~~~~~~~~~~~~
include/linux/dmi.h:173:71: note: each undeclared identifier is reported only once for each function it appears in
>> include/linux/dmi.h:173:89: warning: control reaches end of non-void function [-Wreturn-type]
173 | dmi_string_nosave(const struct dmi_header *dm, u8 s) { return dmi_empty_string; }
| ^
vim +173 include/linux/dmi.h
141
142 static inline int dmi_check_system(const struct dmi_system_id *list) { return 0; }
143 static inline const char * dmi_get_system_info(int field) { return NULL; }
144 static inline const struct dmi_device * dmi_find_device(int type, const char *name,
145 const struct dmi_device *from) { return NULL; }
146 static inline void dmi_setup(void) { }
147 static inline bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp)
148 {
149 if (yearp)
150 *yearp = 0;
151 if (monthp)
152 *monthp = 0;
153 if (dayp)
154 *dayp = 0;
155 return false;
156 }
157 static inline int dmi_get_bios_year(void) { return -ENXIO; }
158 static inline int dmi_name_in_vendors(const char *s) { return 0; }
159 static inline int dmi_name_in_serial(const char *s) { return 0; }
160 #define dmi_available 0
161 static inline int dmi_walk(void (*decode)(const struct dmi_header *, void *),
162 void *private_data) { return -ENXIO; }
163 static inline bool dmi_match(enum dmi_field f, const char *str)
164 { return false; }
165 static inline void dmi_memdev_name(u16 handle, const char **bank,
166 const char **device) { }
167 static inline u64 dmi_memdev_size(u16 handle) { return ~0ul; }
168 static inline u8 dmi_memdev_type(u16 handle) { return 0x0; }
169 static inline u16 dmi_memdev_handle(int slot) { return 0xffff; }
170 static inline const struct dmi_system_id *
171 dmi_first_match(const struct dmi_system_id *list) { return NULL; }
172 static inline const char *
> 173 dmi_string_nosave(const struct dmi_header *dm, u8 s) { return dmi_empty_string; }
174
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry
2026-01-21 14:26 ` Yazen Ghannam
2026-01-21 14:28 ` Mario Limonciello (AMD) (kernel.org)
@ 2026-01-21 20:50 ` Mario Limonciello
2026-01-21 21:30 ` Yazen Ghannam
1 sibling, 1 reply; 18+ messages in thread
From: Mario Limonciello @ 2026-01-21 20:50 UTC (permalink / raw)
To: Yazen Ghannam; +Cc: Jean Delvare, linux-kernel, Borislav Petkov
On 1/21/26 8:26 AM, Yazen Ghannam wrote:
> On Wed, Jan 21, 2026 at 12:04:31AM -0600, Mario Limonciello (AMD) wrote:
>> From: Yazen Ghannam <yazen.ghannam@amd.com>
>>
>> Type 40 entries (Additional Information) are summarized in section 7.41
>> as part of the SMBIOS specification. Generally, these entries aren't
>> interesting to save.
>>
>> However on some AMD Zen systems, the AGESA version is stored here. This
>> is useful to save to the kernel message logs for debugging. It can be
>> used to cross-reference issues.
>>
>> Implement an iterator for the Additional Information entries. Use this
>> to find and print the AGESA string. Do so in AMD code, since the use
>> case is AMD-specific.
>>
>> Signed-off-by: Yazen Ghannam <yazen.ghannam@amd.com>
>> Co-developed-by: "Mario Limonciello (AMD)" <superm1@kernel.org>
>> Signed-off-by: "Mario Limonciello (AMD)" <superm1@kernel.org>
>> ---
>> v4:
>> * New patch (based upon older versions though)
>> ---
>> arch/x86/kernel/cpu/amd.c | 53 +++++++++++++++++++++++++++++++++++++
>> drivers/firmware/dmi_scan.c | 3 ++-
>> include/linux/dmi.h | 18 +++++++++++++
>> 3 files changed, 73 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
>> index c19c4ee74dd1f..5cd60855a85b0 100644
>> --- a/arch/x86/kernel/cpu/amd.c
>> +++ b/arch/x86/kernel/cpu/amd.c
>> @@ -3,6 +3,7 @@
>>
>> #include <linux/export.h>
>> #include <linux/bitops.h>
>> +#include <linux/dmi.h>
>> #include <linux/elf.h>
>> #include <linux/mm.h>
>> #include <linux/kvm_types.h>
>> @@ -1406,3 +1407,55 @@ static __init int print_s5_reset_status_mmio(void)
>> return 0;
>> }
>> late_initcall(print_s5_reset_status_mmio);
>> +
>> +static void __init amd_dmi_scan_additional(const struct dmi_header *d, void *p)
>> +{
>> + struct dmi_a_info *info = (struct dmi_a_info *)d;
>> + void *next, *end;
>> +
>> + /*
>> + * DMI Additional Info table has a 'count' field. But it's not very
>> + * helpful since the entries are variable length. So don't use it.
>> + */
>> + if (info->header.type != DMI_ENTRY_ADDITIONAL ||
>> + info->header.length < DMI_A_INFO_MIN_SIZE)
>> + return;
>> +
>> + /*
>> + * Get the first entry.
>> + * The minimum table size guarantees at least one entry is present.
>> + */
>> + next = (void *)(info + 1);
>> + end = (void *)info + info->header.length;
>> +
>> + do {
>> + struct dmi_a_info_entry *entry;
>> + const char *string_ptr;
>> +
>> + entry = (struct dmi_a_info_entry *)next;
>> +
>> + /*
>> + * Not much can be done to validate data. At least the entry
>> + * length shouldn't be 0.
>> + */
>> + if (!entry->length)
>> + return;
>> +
>> + string_ptr = dmi_string_nosave(&info->header, entry->str_num);
>> +
>> + /* Only one AGESA string is expected. */
>> + if (!strncmp(string_ptr, "AGESA", 5)) {
>> + pr_info("%s\n", string_ptr);
>> + break;
>> + }
>> +
>> + next += entry->length;
>> + } while (end - next >= DMI_A_INFO_ENT_MIN_SIZE);
>> +}
>> +
>> +static __init int print_dmi_agesa(void)
>> +{
>> + dmi_walk(amd_dmi_scan_additional, NULL);
>> + return 0;
>> +}
>> +late_initcall(print_dmi_agesa);
>> diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c
>> index ed6235ac576b6..a3f7dabd49554 100644
>> --- a/drivers/firmware/dmi_scan.c
>> +++ b/drivers/firmware/dmi_scan.c
>> @@ -47,7 +47,7 @@ static struct dmi_memdev_info {
>> static int dmi_memdev_nr;
>> static int dmi_memdev_populated_nr __initdata;
>>
>> -static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s)
>> +const char *dmi_string_nosave(const struct dmi_header *dm, u8 s)
>> {
>> const u8 *bp = ((u8 *) dm) + dm->length;
>> const u8 *nsp;
>> @@ -66,6 +66,7 @@ static const char * __init dmi_string_nosave(const struct dmi_header *dm, u8 s)
>>
>> return dmi_empty_string;
>> }
>> +EXPORT_SYMBOL_GPL(dmi_string_nosave);
>>
>> static const char * __init dmi_string(const struct dmi_header *dm, u8 s)
>> {
>> diff --git a/include/linux/dmi.h b/include/linux/dmi.h
>> index 2eedf44e68012..b7865fa387ccb 100644
>> --- a/include/linux/dmi.h
>> +++ b/include/linux/dmi.h
>> @@ -91,6 +91,21 @@ struct dmi_device {
>> void *device_data; /* Type specific data */
>> };
>>
>> +#define DMI_A_INFO_ENT_MIN_SIZE 0x6
>> +struct dmi_a_info_entry {
>> + u8 length;
>> + u16 handle;
>> + u8 offset;
>> + u8 str_num;
>> + u8 value[];
>> +} __packed;
>> +
>> +#define DMI_A_INFO_MIN_SIZE 0xB
>> +struct dmi_a_info {
>> + struct dmi_header header;
>> + u8 count;
>> +} __packed;
>> +
>> #ifdef CONFIG_DMI
>>
>> struct dmi_dev_onboard {
>> @@ -120,6 +135,7 @@ extern void dmi_memdev_name(u16 handle, const char **bank, const char **device);
>> extern u64 dmi_memdev_size(u16 handle);
>> extern u8 dmi_memdev_type(u16 handle);
>> extern u16 dmi_memdev_handle(int slot);
>> +const char *dmi_string_nosave(const struct dmi_header *dm, u8 s);
>>
>> #else
>>
>> @@ -153,6 +169,8 @@ static inline u8 dmi_memdev_type(u16 handle) { return 0x0; }
>> static inline u16 dmi_memdev_handle(int slot) { return 0xffff; }
>> static inline const struct dmi_system_id *
>> dmi_first_match(const struct dmi_system_id *list) { return NULL; }
>> +static inline const char *
>> + dmi_string_nosave(const struct dmi_header *dm, u8 s) { return dmi_empty_string; }
>>
>
> The dmi_empty_string needs to be moved to this header file from
> dmi_scan.c.
>
> Otherwise, there's a build issue as the test bot reported.
>
> Thanks,
> Yazen
I don't think it's actually appropriate to move dmi_empty_string in this
case. It's a static variable, shouldn't really be in a header.
I would think it's better to just return NULL.
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry
2026-01-21 20:50 ` Mario Limonciello
@ 2026-01-21 21:30 ` Yazen Ghannam
2026-01-21 22:06 ` Mario Limonciello (AMD) (kernel.org)
0 siblings, 1 reply; 18+ messages in thread
From: Yazen Ghannam @ 2026-01-21 21:30 UTC (permalink / raw)
To: Mario Limonciello; +Cc: Jean Delvare, linux-kernel, Borislav Petkov
On Wed, Jan 21, 2026 at 02:50:49PM -0600, Mario Limonciello wrote:
> On 1/21/26 8:26 AM, Yazen Ghannam wrote:
[...]
> > > + do {
> > > + struct dmi_a_info_entry *entry;
> > > + const char *string_ptr;
> > > +
> > > + entry = (struct dmi_a_info_entry *)next;
> > > +
> > > + /*
> > > + * Not much can be done to validate data. At least the entry
> > > + * length shouldn't be 0.
> > > + */
> > > + if (!entry->length)
> > > + return;
> > > +
> > > + string_ptr = dmi_string_nosave(&info->header, entry->str_num);
> > > +
> > > + /* Only one AGESA string is expected. */
> > > + if (!strncmp(string_ptr, "AGESA", 5)) {
> > > + pr_info("%s\n", string_ptr);
> > > + break;
> > > + }
> > > +
[...]
> > > +static inline const char *
> > > + dmi_string_nosave(const struct dmi_header *dm, u8 s) { return dmi_empty_string; }
> >
> > The dmi_empty_string needs to be moved to this header file from
> > dmi_scan.c.
> >
> > Otherwise, there's a build issue as the test bot reported.
> >
> > Thanks,
> > Yazen
>
> I don't think it's actually appropriate to move dmi_empty_string in this
> case. It's a static variable, shouldn't really be in a header.
>
> I would think it's better to just return NULL.
dmi_string_nosave() should always return a string. The callers expect
it. That's why we don't need a NULL pointer check above.
+static inline const char *
+ dmi_string_nosave(const struct dmi_header *dm, u8 s) { return ""; }
Rather than move the variable, just return the empty string directly.
Thanks,
Yazen
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry
2026-01-21 21:30 ` Yazen Ghannam
@ 2026-01-21 22:06 ` Mario Limonciello (AMD) (kernel.org)
0 siblings, 0 replies; 18+ messages in thread
From: Mario Limonciello (AMD) (kernel.org) @ 2026-01-21 22:06 UTC (permalink / raw)
To: Yazen Ghannam; +Cc: Jean Delvare, linux-kernel, Borislav Petkov
On 1/21/2026 3:30 PM, Yazen Ghannam wrote:
> On Wed, Jan 21, 2026 at 02:50:49PM -0600, Mario Limonciello wrote:
>> On 1/21/26 8:26 AM, Yazen Ghannam wrote:
>
> [...]
>
>>>> + do {
>>>> + struct dmi_a_info_entry *entry;
>>>> + const char *string_ptr;
>>>> +
>>>> + entry = (struct dmi_a_info_entry *)next;
>>>> +
>>>> + /*
>>>> + * Not much can be done to validate data. At least the entry
>>>> + * length shouldn't be 0.
>>>> + */
>>>> + if (!entry->length)
>>>> + return;
>>>> +
>>>> + string_ptr = dmi_string_nosave(&info->header, entry->str_num);
>>>> +
>>>> + /* Only one AGESA string is expected. */
>>>> + if (!strncmp(string_ptr, "AGESA", 5)) {
>>>> + pr_info("%s\n", string_ptr);
>>>> + break;
>>>> + }
>>>> +
>
> [...]
>
>>>> +static inline const char *
>>>> + dmi_string_nosave(const struct dmi_header *dm, u8 s) { return dmi_empty_string; }
>>>
>>> The dmi_empty_string needs to be moved to this header file from
>>> dmi_scan.c.
>>>
>>> Otherwise, there's a build issue as the test bot reported.
>>>
>>> Thanks,
>>> Yazen
>>
>> I don't think it's actually appropriate to move dmi_empty_string in this
>> case. It's a static variable, shouldn't really be in a header.
>>
>> I would think it's better to just return NULL.
>
> dmi_string_nosave() should always return a string. The callers expect
> it. That's why we don't need a NULL pointer check above.
>
> +static inline const char *
> + dmi_string_nosave(const struct dmi_header *dm, u8 s) { return ""; }
>
> Rather than move the variable, just return the empty string directly.
>
> Thanks,
> Yazen
Got it; thanks for clarifying.
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2026-01-21 22:06 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-21 6:04 [PATCH v4 0/6] Print AGESA version at bootup Mario Limonciello (AMD)
2026-01-21 6:04 ` [PATCH v4 1/6] firmware: dmi: Correct an indexing error in dmi.h Mario Limonciello (AMD)
2026-01-21 6:04 ` [PATCH v4 2/6] firmware: dmi: Adjust dmi_decode() to use enums Mario Limonciello (AMD)
2026-01-21 6:04 ` [PATCH v4 3/6] firmware: dmi: Add missing DMI entry types Mario Limonciello (AMD)
2026-01-21 6:04 ` [PATCH v4 4/6] firmware: dmi: Add pr_fmt() for dmi_scan.c Mario Limonciello (AMD)
2026-01-21 6:04 ` [PATCH v4 5/6] x86/CPU/AMD: Prefix messages with x86/amd Mario Limonciello (AMD)
2026-01-21 10:49 ` Borislav Petkov
2026-01-21 14:28 ` Mario Limonciello (AMD) (kernel.org)
2026-01-21 14:37 ` Borislav Petkov
2026-01-21 6:04 ` [PATCH v4 6/6] x86/CPU/AMD: Print AGESA string from DMI additional information entry Mario Limonciello (AMD)
2026-01-21 11:30 ` kernel test robot
2026-01-21 14:26 ` Yazen Ghannam
2026-01-21 14:28 ` Mario Limonciello (AMD) (kernel.org)
2026-01-21 20:50 ` Mario Limonciello
2026-01-21 21:30 ` Yazen Ghannam
2026-01-21 22:06 ` Mario Limonciello (AMD) (kernel.org)
2026-01-21 15:44 ` kernel test robot
2026-01-21 18:53 ` kernel test robot
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox