diff options
author | Marcus Glocker <mglocker@cvs.openbsd.org> | 2024-07-30 19:47:07 +0000 |
---|---|---|
committer | Marcus Glocker <mglocker@cvs.openbsd.org> | 2024-07-30 19:47:07 +0000 |
commit | c69199934d0c07407debf00aa139c4899bae5574 (patch) | |
tree | 7ba2c0ad545ea56f8361e543e17d862c2a7a1659 | |
parent | d8377f80b7928ed366f88afebec62c73014df84b (diff) |
Make the Samsung Galaxy Book4 Edge (x1e80100) boot in ACPI mode;
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@
-rw-r--r-- | sys/arch/arm64/conf/GENERIC | 3 | ||||
-rw-r--r-- | sys/arch/arm64/conf/RAMDISK | 3 | ||||
-rw-r--r-- | sys/dev/acpi/acpi.c | 29 | ||||
-rw-r--r-- | sys/dev/acpi/acpisectwo.c | 90 | ||||
-rw-r--r-- | sys/dev/acpi/files.acpi | 7 |
5 files changed, 128 insertions, 4 deletions
diff --git a/sys/arch/arm64/conf/GENERIC b/sys/arch/arm64/conf/GENERIC index b6421e6e22c..e2c746bdcb3 100644 --- a/sys/arch/arm64/conf/GENERIC +++ b/sys/arch/arm64/conf/GENERIC @@ -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? diff --git a/sys/arch/arm64/conf/RAMDISK b/sys/arch/arm64/conf/RAMDISK index c25a704337d..6cb8d2d7389 100644 --- a/sys/arch/arm64/conf/RAMDISK +++ b/sys/arch/arm64/conf/RAMDISK @@ -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? diff --git a/sys/dev/acpi/acpi.c b/sys/dev/acpi/acpi.c index 20aa4b9c2a0..29f84dd0343 100644 --- a/sys/dev/acpi/acpi.c +++ b/sys/dev/acpi/acpi.c @@ -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 index 00000000000..b7f8f908b67 --- /dev/null +++ b/sys/dev/acpi/acpisectwo.c @@ -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; +} diff --git a/sys/dev/acpi/files.acpi b/sys/dev/acpi/files.acpi index 4036d6a19f6..f664ac350da 100644 --- a/sys/dev/acpi/files.acpi +++ b/sys/dev/acpi/files.acpi @@ -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 |