Module Name: src Committed By: jmcneill Date: Fri Jul 23 21:33:35 UTC 2021
Modified Files: src/sys/arch/arm/fdt: acpi_fdt.c Log Message: smbios: Support SMBIOS 2.x tables. To generate a diff of this commit: cvs rdiff -u -r1.20 -r1.21 src/sys/arch/arm/fdt/acpi_fdt.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/fdt/acpi_fdt.c diff -u src/sys/arch/arm/fdt/acpi_fdt.c:1.20 src/sys/arch/arm/fdt/acpi_fdt.c:1.21 --- src/sys/arch/arm/fdt/acpi_fdt.c:1.20 Thu Jul 22 00:47:55 2021 +++ src/sys/arch/arm/fdt/acpi_fdt.c Fri Jul 23 21:33:35 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_fdt.c,v 1.20 2021/07/22 00:47:55 jmcneill Exp $ */ +/* $NetBSD: acpi_fdt.c,v 1.21 2021/07/23 21:33:35 jmcneill Exp $ */ /*- * Copyright (c) 2015-2017 Jared McNeill <jmcne...@invisible.ca> @@ -30,7 +30,7 @@ #include "opt_efi.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: acpi_fdt.c,v 1.20 2021/07/22 00:47:55 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_fdt.c,v 1.21 2021/07/23 21:33:35 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -140,11 +140,36 @@ acpi_fdt_poweroff(device_t dev) psci_system_off(); } +static int +acpi_fdt_smbios_version(void) +{ + uint8_t *hdr; + int smbver; + + if (smbios_table == 0) { + return 0; + } + + hdr = AcpiOsMapMemory(smbios_table, 24); + if (hdr == NULL) { + return 0; + } + if (smbios3_check_header(hdr)) { + smbver = 3; + } else if (smbios2_check_header(hdr)) { + smbver = 2; + } else { + smbver = 0; + } + AcpiOsUnmapMemory(hdr, 24); + return smbver; +} + static void acpi_fdt_smbios_init(device_t dev) { - struct smb3hdr *sh; uint8_t *ptr; + int smbver; const int chosen = OF_finddevice("/chosen"); if (chosen >= 0) { @@ -154,29 +179,48 @@ acpi_fdt_smbios_init(device_t dev) return; } - sh = AcpiOsMapMemory(smbios_table, sizeof(*sh)); - if (sh == NULL) { - return; - } - if (!smbios3_check_header((uint8_t *)sh)) { - AcpiOsUnmapMemory(sh, sizeof(*sh)); - return; - } + smbver = acpi_fdt_smbios_version(); + if (smbver == 3) { + struct smb3hdr *sh = AcpiOsMapMemory(smbios_table, sizeof(*sh)); + if (sh == NULL) { + return; + } + + ptr = AcpiOsMapMemory(sh->addr, sh->size); + if (ptr != NULL) { + smbios_entry.addr = ptr; + smbios_entry.len = sh->size; + smbios_entry.rev = sh->eprev; + smbios_entry.mjr = sh->majrev; + smbios_entry.min = sh->minrev; + smbios_entry.doc = sh->docrev; + smbios_entry.count = UINT16_MAX; + } - ptr = AcpiOsMapMemory(sh->addr, sh->size); - if (ptr != NULL) { - smbios_entry.addr = ptr; - smbios_entry.len = sh->size; - smbios_entry.rev = sh->eprev; - smbios_entry.mjr = sh->majrev; - smbios_entry.min = sh->minrev; - smbios_entry.doc = sh->docrev; - smbios_entry.count = UINT16_MAX; - - device_printf(dev, "SMBIOS rev. %d.%d.%d @ 0x%lx\n", + aprint_normal_dev(dev, "SMBIOS rev. %d.%d.%d @ 0x%lx\n", sh->majrev, sh->minrev, sh->docrev, (u_long)sh->addr); + AcpiOsUnmapMemory(sh, sizeof(*sh)); + } else if (smbver == 2) { + struct smbhdr *sh = AcpiOsMapMemory(smbios_table, sizeof(*sh)); + if (sh == NULL) { + return; + } + + ptr = AcpiOsMapMemory(sh->addr, sh->size); + if (ptr != NULL) { + smbios_entry.addr = ptr; + smbios_entry.len = sh->size; + smbios_entry.rev = 0; + smbios_entry.mjr = sh->majrev; + smbios_entry.min = sh->minrev; + smbios_entry.doc = 0; + smbios_entry.count = sh->count; + } + + aprint_normal_dev(dev, "SMBIOS rev. %d.%d @ 0x%lx (%d entries)\n", + sh->majrev, sh->minrev, (u_long)sh->addr, sh->count); + AcpiOsUnmapMemory(sh, sizeof(*sh)); } - AcpiOsUnmapMemory(sh, sizeof(*sh)); } static void