[PATCH 2/2] firmware: dmi: Log board vendor if no system vendor has been given
From: Maciej W. Rozycki
Date: Tue Jul 06 2021 - 01:27:20 EST
Some systems do not provide any names with System Information, e.g. the
Tyan Tomcat IV S1564D mainboard reports:
Legacy DMI 2.0 present.
DMI: /i430HX, BIOS 4.51 PG 05/13/98
This is not unreasonable given that it was retailed as a bare mainboard
rather that a complete system, so no information could have been known
about the integrator. It does have the manufacturer correctly recorded
with Base Board Information though:
Handle 0x0001
DMI type 1, 8 bytes.
System Information
Manufacturer:
Product Name:
Version:
Serial Number:
Handle 0x0002
DMI type 2, 8 bytes.
Base Board Information
Manufacturer: Tyan Computer Corp
Product Name: i430HX
Version:
Serial Number:
Resort to logging the board manufacturer then if none has been given for
the system. Also refrain from including the separating slash if no name
has been given for the system.
Output is now:
Legacy DMI 2.0 present.
DMI: Tyan Computer Corp i430HX, BIOS 4.51 PG 05/13/98
for said board, surely more informative (of course a better name could
have been chosen for the product than just "i430HX", but there you go).
Signed-off-by: Maciej W. Rozycki <macro@xxxxxxxxxxx>
---
drivers/firmware/dmi_scan.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
linux-dmi-board-vendor.diff
Index: linux-macro-ide-tty/drivers/firmware/dmi_scan.c
===================================================================
--- linux-macro-ide-tty.orig/drivers/firmware/dmi_scan.c
+++ linux-macro-ide-tty/drivers/firmware/dmi_scan.c
@@ -535,17 +535,23 @@ static int __init print_filtered(char *b
static void __init dmi_format_ids(char *buf, size_t len)
{
int c = 0;
+ const char *vendor;
const char *board; /* Board Name is optional */
+ const char *name;
- c += print_filtered(buf + c, len - c,
- dmi_get_system_info(DMI_SYS_VENDOR));
+ vendor = dmi_get_system_info(DMI_SYS_VENDOR);
+ if (!vendor || !*vendor)
+ vendor = dmi_get_system_info(DMI_BOARD_VENDOR);
+ c += print_filtered(buf + c, len - c, vendor);
c += scnprintf(buf + c, len - c, " ");
- c += print_filtered(buf + c, len - c,
- dmi_get_system_info(DMI_PRODUCT_NAME));
+
+ name = dmi_get_system_info(DMI_PRODUCT_NAME);
+ c += print_filtered(buf + c, len - c, name);
board = dmi_get_system_info(DMI_BOARD_NAME);
if (board && *board) {
- c += scnprintf(buf + c, len - c, "/");
+ if (name && *name)
+ c += scnprintf(buf + c, len - c, "/");
c += print_filtered(buf + c, len - c, board);
}
c += scnprintf(buf + c, len - c, ", BIOS ");