Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/arm/fdt Expose SMBIOS tables using sysctl machdep.d...



details:   https://anonhg.NetBSD.org/src/rev/06ac2c0b5f37
branches:  trunk
changeset: 984763:06ac2c0b5f37
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Thu Jul 22 00:47:55 2021 +0000

description:
Expose SMBIOS tables using sysctl machdep.dmi.*, same as x86.

diffstat:

 sys/arch/arm/fdt/acpi_fdt.c |  72 ++++++++++++++++++++++++++++++++++++--------
 sys/arch/arm/fdt/files.fdt  |   5 +-
 2 files changed, 62 insertions(+), 15 deletions(-)

diffs (153 lines):

diff -r 61c3a7ed6ad2 -r 06ac2c0b5f37 sys/arch/arm/fdt/acpi_fdt.c
--- a/sys/arch/arm/fdt/acpi_fdt.c       Wed Jul 21 23:26:15 2021 +0000
+++ b/sys/arch/arm/fdt/acpi_fdt.c       Thu Jul 22 00:47:55 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_fdt.c,v 1.19 2021/04/24 23:36:26 thorpej Exp $ */
+/* $NetBSD: acpi_fdt.c,v 1.20 2021/07/22 00:47:55 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2015-2017 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -30,7 +30,7 @@
 #include "opt_efi.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_fdt.c,v 1.19 2021/04/24 23:36:26 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_fdt.c,v 1.20 2021/07/22 00:47:55 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -47,6 +47,7 @@
 
 #include <dev/acpi/acpivar.h>
 #include <dev/pci/pcivar.h>
+#include <dev/smbiosvar.h>
 
 #include <arm/arm/psci.h>
 
@@ -61,6 +62,7 @@
 
 static void    acpi_fdt_poweroff(device_t);
 
+static void    acpi_fdt_smbios_init(device_t);
 static void    acpi_fdt_sysctl_init(void);
 
 extern struct arm32_bus_dma_tag acpi_coherent_dma_tag;
@@ -89,18 +91,24 @@
 static void
 acpi_fdt_attach(device_t parent, device_t self, void *aux)
 {
+       extern void platform_init(void); /* XXX */
        struct fdt_attach_args * const faa = aux;
        struct acpibus_attach_args aa;
 
        aprint_naive("\n");
        aprint_normal("\n");
 
+       acpi_fdt_smbios_init(self);
+       platform_init();
+
        fdtbus_register_power_controller(self, faa->faa_phandle,
            &acpi_fdt_power_funcs);
 
        if (!acpi_probe())
                panic("ACPI subsystem failed to initialize");
 
+       platform_init();
+
        memset(&aa, 0, sizeof(aa));
 #if NPCI > 0
        aa.aa_pciflags =
@@ -133,26 +141,64 @@
 }
 
 static void
+acpi_fdt_smbios_init(device_t dev)
+{
+       struct smb3hdr *sh;
+       uint8_t *ptr;
+
+       const int chosen = OF_finddevice("/chosen");
+       if (chosen >= 0) {
+               of_getprop_uint64(chosen, "netbsd,smbios-table", &smbios_table);
+       }
+       if (smbios_table == 0) {
+               return;
+       }
+
+       sh = AcpiOsMapMemory(smbios_table, sizeof(*sh));
+       if (sh == NULL) {
+               return;
+       }
+       if (!smbios3_check_header((uint8_t *)sh)) {
+               AcpiOsUnmapMemory(sh, sizeof(*sh));
+               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;
+
+               device_printf(dev, "SMBIOS rev. %d.%d.%d @ 0x%lx\n",
+                   sh->majrev, sh->minrev, sh->docrev, (u_long)sh->addr);
+       }
+       AcpiOsUnmapMemory(sh, sizeof(*sh));
+}
+
+static void
 acpi_fdt_sysctl_init(void)
 {
        const struct sysctlnode *rnode;
        int error;
 
-       const int chosen = OF_finddevice("/chosen");
-       if (chosen >= 0)
-               of_getprop_uint64(chosen, "netbsd,smbios-table", &smbios_table);
+       if (smbios_table == 0) {
+               return;
+       }
 
        error = sysctl_createv(NULL, 0, NULL, &rnode,
            CTLFLAG_PERMANENT, CTLTYPE_NODE, "machdep", NULL,
            NULL, 0, NULL, 0, CTL_MACHDEP, CTL_EOL);
-       if (error)
+       if (error) {
                return;
+       }
 
-       if (smbios_table != 0) {
-               (void)sysctl_createv(NULL, 0, &rnode, NULL,
-                   CTLFLAG_PERMANENT | CTLFLAG_READONLY | CTLFLAG_HEX, CTLTYPE_QUAD,
-                   "smbios", SYSCTL_DESCR("SMBIOS table pointer"),
-                   NULL, 0, &smbios_table, sizeof(smbios_table),
-                   CTL_CREATE, CTL_EOL);
-       }
+       (void)sysctl_createv(NULL, 0, &rnode, NULL,
+           CTLFLAG_PERMANENT | CTLFLAG_READONLY | CTLFLAG_HEX, CTLTYPE_QUAD,
+           "smbios", SYSCTL_DESCR("SMBIOS table pointer"),
+           NULL, 0, &smbios_table, sizeof(smbios_table),
+           CTL_CREATE, CTL_EOL);
 }
diff -r 61c3a7ed6ad2 -r 06ac2c0b5f37 sys/arch/arm/fdt/files.fdt
--- a/sys/arch/arm/fdt/files.fdt        Wed Jul 21 23:26:15 2021 +0000
+++ b/sys/arch/arm/fdt/files.fdt        Thu Jul 22 00:47:55 2021 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: files.fdt,v 1.33 2021/04/26 14:44:16 thorpej Exp $
+# $NetBSD: files.fdt,v 1.34 2021/07/22 00:47:55 jmcneill Exp $
 
 include        "dev/pckbport/files.pckbport"
 
@@ -75,6 +75,7 @@
 attach genfb at fdt with plfb_fdt: fdt_display_timing
 file   arch/arm/fdt/plfb_fdt.c                 plfb_fdt
 
-device acpifdt: acpibus
+device acpifdt: acpibus, smbios
 attach acpifdt at fdt with acpi_fdt
 file   arch/arm/fdt/acpi_fdt.c                 acpi_fdt
+file   dev/smbios_platform.c                   acpi_fdt



Home | Main Index | Thread Index | Old Index