Re: [PATCH v5 5/5] x86/CPU/AMD: Print AGESA string from DMI additional information entry

From: Mario Limonciello (AMD) (kernel.org)

Date: Mon Jan 26 2026 - 10:16:06 EST




On 1/26/2026 7:07 AM, Borislav Petkov wrote:
On Fri, Jan 23, 2026 at 03:30:56PM -0600, Mario Limonciello (AMD) wrote:
From: Yazen Ghannam <yazen.ghannam@xxxxxxx>

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.

Please do not explain the diff.

👍
Signed-off-by: Yazen Ghannam <yazen.ghannam@xxxxxxx>
Co-developed-by: "Mario Limonciello (AMD)" <superm1@xxxxxxxxxx>
Signed-off-by: "Mario Limonciello (AMD)" <superm1@xxxxxxxxxx>
---
v5:
* Return "" in !CONFIG_DMI case (LKP robot, Yazen)
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 bc94ff1e250ad..aa04a27aeb107 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
#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>
@@ -1404,3 +1405,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)

It's a static - no need for the "amd_" prefix.

+{
+ struct dmi_a_info *info = (struct dmi_a_info *)d;
+ void *next, *end;

This needs a

if (!IS_ENABLED(CONFIG_DMI))
return;

👍
+
+ /*
+ * 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;

This end needs to be corrected to some sane upper limit because we don't trust
firmware one bit.

👍
+
+ 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. */

Superfluous comment.

👍

+ if (!strncmp(string_ptr, "AGESA", 5)) {
+ pr_info("%s\n", string_ptr);

So on this Zen5 laptop here, this dumps:

[ 0.840480] AGESA!V9 StrixPI-FP8 1.0.0.1d

I guess we can make that:

[ 0.840480] AGESA: V9 StrixPI-FP8 1.0.0.1d

no?

I think if slicing and dicing the string I would instead have us "match" "AGESA!V9" instead and then spit it out like this:

AGESA: StrixPI-FP8 1.0.0.1d

Then if there's a v10 sentinel some day or something like that we would add a new match then.