Hello Adriana,
On Fri, 31 Oct 2025 at 09:41, adriana adriana@arista.com wrote:
From: Adriana Nicolae adriana@arista.com
Signed-off-by: Adriana Nicolae adriana@arista.com
drivers/firmware/dmi_scan.c | 58 +++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+)
diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c index 70d39adf50dc..acc0e18b8d0f 100644 --- a/drivers/firmware/dmi_scan.c +++ b/drivers/firmware/dmi_scan.c @@ -10,6 +10,9 @@ #include <linux/random.h> #include <asm/dmi.h> #include <linux/unaligned.h> +#if IS_ENABLED(CONFIG_OF) +#include <linux/of.h> +#endif
#ifndef SMBIOS_ENTRY_POINT_SCAN_START #define SMBIOS_ENTRY_POINT_SCAN_START 0xF0000 @@ -670,6 +673,54 @@ static int __init dmi_smbios3_present(const u8 *buf) return 1; }
+#if IS_ENABLED(CONFIG_OF) +/**
- dmi_scan_from_dt - Find and parse DMI/SMBIOS tables from the Device Tree
 
- Checks if the bootloader has passed SMBIOS table addresses via the /chosen
 
- node in the Device Tree. This follows the standard kernel DT bindings and
 
- assumes a fixed 32-byte mapping for the entry point.
 
Not sure what 'the standard kernel DT bindings' are, or what you mean by 'a fixed 32-byte mapping. You could just drop this sentence, I think, or otherwise, describe that the DT property gives us the physical address of the SMBIOS3 entrypoint structure.
- Returns true if a valid table is found and successfully parsed.
 
if a valid entry point is found
- */
 +static bool __init dmi_scan_from_dt(void) +{
struct device_node *chosen;const __be64 *prop;char buf[32];void __iomem *p;bool dmi_available = false;u64 addr;int len;chosen = of_find_node_by_path("/chosen");if (!chosen)return false;prop = of_get_property(chosen, "linux,smbios3-table", &len);if (prop && len >= sizeof(u64)) {addr = be64_to_cpup(prop);p = dmi_early_remap(addr, 32);if (p == NULL)goto out;memcpy_fromio(buf, p, sizeof(buf));dmi_early_unmap(p, 32);if (!dmi_smbios3_present(buf)) {dmi_available = true;goto out;}}+out:
of_node_put(chosen);return dmi_available;+} +#else +static bool __init dmi_scan_from_dt(void) { return false; } +#endif /* IS_ENABLED(CONFIG_OF) */
static void __init dmi_scan_machine(void) { char __iomem *p, *q; @@ -718,6 +769,13 @@ static void __init dmi_scan_machine(void) dmi_available = 1; return; }
} else if (IS_ENABLED(CONFIG_OF) && dmi_scan_from_dt()) {
Please drop the IS_ENABLED() here, and fold it into dmi_scan_from_dt(), by doing
if (!IS_ENABLED(CONFIG_OF)) return false;
at the beginning. This removes the need to provide two different versions of dmi_scan_from_dt().
/** If EFI is not present or failed, try getting SMBIOS* tables from the Device Tree.*/dmi_available = 1;return; } else if (IS_ENABLED(CONFIG_DMI_SCAN_MACHINE_NON_EFI_FALLBACK)) { p = dmi_early_remap(SMBIOS_ENTRY_POINT_SCAN_START, 0x10000); if (p == NULL)-- 2.51.0
boot-architecture@lists.linaro.org