Make the Samsung Galaxy Book4 Edge (x1e80100) boot in ACPI mode;
authormglocker <mglocker@openbsd.org>
Tue, 30 Jul 2024 19:47:05 +0000 (19:47 +0000)
committermglocker <mglocker@openbsd.org>
Tue, 30 Jul 2024 19:47:05 +0000 (19:47 +0000)
Until now the kernel did panic during early boot because we couldn't
respond to the battery requests sent to the 0xa1 "bus".  This (dummy)
driver registers a 0xa1 region space very early, and responds with a
static zero value to satisfy the battery requests on 0xa1, which let us
boot successfully to multi-user.

In the future this machine should be operated in FDT mode, and an improved
AML parsing interface might make this workaround obsolete also for RAMDISK.

Help and OK kettenis@, deraadt@

sys/arch/arm64/conf/GENERIC
sys/arch/arm64/conf/RAMDISK
sys/dev/acpi/acpi.c
sys/dev/acpi/acpisectwo.c [new file with mode: 0644]
sys/dev/acpi/files.acpi

index b6421e6..e2c746b 100644 (file)
@@ -1,4 +1,4 @@
-# $OpenBSD: GENERIC,v 1.286 2024/03/25 17:24:03 patrick Exp $
+# $OpenBSD: GENERIC,v 1.287 2024/07/30 19:47:05 mglocker Exp $
 #
 # GENERIC machine description file
 #
@@ -46,6 +46,7 @@ acpiec*               at acpi?
 acpige*                at acpi?
 acpimcfg*      at acpi?
 acpiiort*      at acpi?
+acpisectwo*    at acpi?
 smmu*          at acpiiort?
 acpipci*       at acpi?
 pci*           at acpipci?
index c25a704..6cb8d2d 100644 (file)
@@ -1,4 +1,4 @@
-# $OpenBSD: RAMDISK,v 1.216 2024/03/25 17:24:03 patrick Exp $
+# $OpenBSD: RAMDISK,v 1.217 2024/07/30 19:47:05 mglocker Exp $
 
 machine                arm64
 maxusers       4
@@ -41,6 +41,7 @@ acpi0         at mainbus?
 acpiec*                at acpi?
 acpimcfg*      at acpi?
 acpiiort*      at acpi?
+acpisectwo*    at acpi?
 smmu*          at acpiiort?
 acpipci*       at acpi?
 pci*           at acpipci?
index 20aa4b9..29f84dd 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: acpi.c,v 1.435 2024/07/14 13:58:57 jmatthew Exp $ */
+/* $OpenBSD: acpi.c,v 1.436 2024/07/30 19:47:06 mglocker Exp $ */
 /*
  * Copyright (c) 2005 Thorsten Lockert <tholo@sigmasoft.com>
  * Copyright (c) 2005 Jordan Hargrave <jordan@openbsd.org>
@@ -95,6 +95,9 @@ int   acpi_gpe(struct acpi_softc *, int, void *);
 
 void   acpi_enable_rungpes(struct acpi_softc *);
 
+#ifdef __arm64__
+int    acpi_foundsectwo(struct aml_node *, void *);
+#endif
 int    acpi_foundec(struct aml_node *, void *);
 int    acpi_foundsony(struct aml_node *node, void *arg);
 int    acpi_foundhid(struct aml_node *, void *);
@@ -1231,6 +1234,10 @@ acpi_attach_common(struct acpi_softc *sc, paddr_t base)
        /* initialize runtime environment */
        aml_find_node(sc->sc_root, "_INI", acpi_inidev, sc);
 
+#ifdef __arm64__
+       aml_find_node(sc->sc_root, "ECTC", acpi_foundsectwo, sc);
+#endif
+
        /* Get PCI mapping */
        aml_walknodes(sc->sc_root, AML_WALK_PRE, acpi_getpci, sc);
 
@@ -2770,6 +2777,26 @@ acpi_create_thread(void *arg)
                    DEVNAME(sc));
 }
 
+#if __arm64__
+int
+acpi_foundsectwo(struct aml_node *node, void *arg)
+{
+       struct acpi_softc *sc = (struct acpi_softc *)arg;
+       struct device *self = (struct device *)arg;
+       struct acpi_attach_args aaa;
+
+       memset(&aaa, 0, sizeof(aaa));
+       aaa.aaa_iot = sc->sc_iot;
+       aaa.aaa_memt = sc->sc_memt;
+       aaa.aaa_node = node->parent;
+       aaa.aaa_name = "acpisectwo";
+
+       config_found(self, &aaa, acpi_print);
+
+       return 0;
+}
+#endif
+
 int
 acpi_foundec(struct aml_node *node, void *arg)
 {
diff --git a/sys/dev/acpi/acpisectwo.c b/sys/dev/acpi/acpisectwo.c
new file mode 100644 (file)
index 0000000..b7f8f90
--- /dev/null
@@ -0,0 +1,90 @@
+/*     $OpenBSD: acpisectwo.c,v 1.1 2024/07/30 19:47:06 mglocker Exp $ */
+/*
+ * Copyright (c) 2024 Marcus Glocker <mglocker@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+
+#include <dev/acpi/acpivar.h>
+#include <dev/acpi/dsdt.h>
+
+//#define ACPISECTWO_DEBUG
+#ifdef ACPISECTWO_DEBUG
+#define DPRINTF(x) printf x
+#else
+#define DPRINTF(x)
+#endif
+
+#define ACPISECTWO_REGIONSPACE_BAT     0xa1
+
+struct acpisectwo_softc {
+       struct device            sc_dev;
+       struct acpi_softc       *sc_acpi;
+       struct aml_node         *sc_node;
+};
+
+int    acpisectwo_match(struct device *, void *, void *);
+void   acpisectwo_attach(struct device *, struct device *, void *);
+
+const struct cfattach acpisectwo_ca = {
+       sizeof(struct acpisectwo_softc), acpisectwo_match, acpisectwo_attach
+};
+
+struct cfdriver acpisectwo_cd = {
+       NULL, "acpisectwo", DV_DULL
+};
+
+int    acpisectwo_bat_opreg_handler(void *, int, uint64_t, int, uint64_t *);
+
+int
+acpisectwo_match(struct device *parent, void *match, void *aux)
+{
+       struct acpi_attach_args *aa = aux;
+       struct cfdata *cf = match;
+
+       if (aa->aaa_name == NULL ||
+           strcmp(aa->aaa_name, cf->cf_driver->cd_name) != 0 ||
+           aa->aaa_table != NULL)
+               return 0;
+
+       return 1;
+}
+
+void
+acpisectwo_attach(struct device *parent, struct device *self, void *aux)
+{
+       struct acpisectwo_softc *sc = (struct acpisectwo_softc *)self;
+       struct acpi_attach_args *aa = aux;
+
+       printf("\n");
+
+       sc->sc_node = aa->aaa_node;
+
+       aml_register_regionspace(sc->sc_node, ACPISECTWO_REGIONSPACE_BAT, sc,
+           acpisectwo_bat_opreg_handler);
+}
+
+int
+acpisectwo_bat_opreg_handler(void *cookie, int iodir, uint64_t address,
+    int size, uint64_t *value)
+{
+       DPRINTF(("%s: iodir=%d, address=0x%llx, size=%d\n",
+           __func__, iodir, address, size));
+
+       *value = 0;
+
+       return 0;
+}
index 4036d6a..f664ac3 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: files.acpi,v 1.69 2023/04/23 00:20:26 dlg Exp $
+#      $OpenBSD: files.acpi,v 1.70 2024/07/30 19:47:06 mglocker Exp $
 #
 # Config file and device description for machine-independent ACPI code.
 # Included by ports that need it.
@@ -110,6 +110,11 @@ device     acpitoshiba
 attach acpitoshiba at acpi
 file   dev/acpi/acpitoshiba.c          acpitoshiba
 
+# Samsung EC2
+device acpisectwo
+attach acpisectwo at acpi
+file   dev/acpi/acpisectwo.c           acpisectwo
+
 # Sony support
 device acpisony
 attach acpisony at acpi