diff options
| author | jmcneill <jmcneill@NetBSD.org> | 2022-01-15 14:40:22 +0000 |
|---|---|---|
| committer | jmcneill <jmcneill@NetBSD.org> | 2022-01-15 14:40:22 +0000 |
| commit | ae008ef2e10be72043021430d593d170ee4417f5 (patch) | |
| tree | 0129b1f5e35e0a69288a1d3314ee7d202bb24725 /sys/dev/acpi | |
| parent | 3ceb61100623312a5ee03227f4ecd0c5e83b15dd (diff) | |
acpi: Add helper for querying DSM function 0.
Diffstat (limited to 'sys/dev/acpi')
| -rw-r--r-- | sys/dev/acpi/acpi_util.c | 36 | ||||
| -rw-r--r-- | sys/dev/acpi/acpi_util.h | 4 |
2 files changed, 37 insertions, 3 deletions
diff --git a/sys/dev/acpi/acpi_util.c b/sys/dev/acpi/acpi_util.c index 0c71cbb997f..a1087fbcfce 100644 --- a/sys/dev/acpi/acpi_util.c +++ b/sys/dev/acpi/acpi_util.c @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_util.c,v 1.30 2022/01/09 14:28:23 jmcneill Exp $ */ +/* $NetBSD: acpi_util.c,v 1.31 2022/01/15 14:40:22 jmcneill Exp $ */ /*- * Copyright (c) 2003, 2007, 2021 The NetBSD Foundation, Inc. @@ -65,7 +65,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: acpi_util.c,v 1.30 2022/01/09 14:28:23 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_util.c,v 1.31 2022/01/15 14:40:22 jmcneill Exp $"); #include <sys/param.h> #include <sys/kmem.h> @@ -1117,6 +1117,38 @@ acpi_dsm(ACPI_HANDLE handle, uint8_t *uuid, ACPI_INTEGER rev, } ACPI_STATUS +acpi_dsm_query(ACPI_HANDLE handle, uint8_t *uuid, ACPI_INTEGER rev, + ACPI_INTEGER *ret) +{ + ACPI_OBJECT *obj; + ACPI_STATUS status; + uint8_t *data; + u_int n; + + status = acpi_dsm(handle, uuid, rev, 0, NULL, &obj); + if (ACPI_FAILURE(status)) { + return status; + } + + if (obj->Type == ACPI_TYPE_INTEGER) { + *ret = obj->Integer.Value; + } else if (obj->Type == ACPI_TYPE_BUFFER && + obj->Buffer.Length <= 8) { + *ret = 0; + data = (uint8_t *)obj->Buffer.Pointer; + for (n = 0; n < obj->Buffer.Length; n++) { + *ret |= (uint64_t)data[n] << (n * 8); + } + } else { + status = AE_TYPE; + } + + ACPI_FREE(obj); + + return status; +} + +ACPI_STATUS acpi_claim_childdevs(device_t dev, struct acpi_devnode *devnode) { struct acpi_devnode *ad; diff --git a/sys/dev/acpi/acpi_util.h b/sys/dev/acpi/acpi_util.h index 1c3a0510ba3..74b8db97bbf 100644 --- a/sys/dev/acpi/acpi_util.h +++ b/sys/dev/acpi/acpi_util.h @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_util.h,v 1.12 2022/01/09 14:28:23 jmcneill Exp $ */ +/* $NetBSD: acpi_util.h,v 1.13 2022/01/15 14:40:33 jmcneill Exp $ */ /*- * Copyright (c) 2003, 2007 The NetBSD Foundation, Inc. @@ -108,6 +108,8 @@ ACPI_STATUS acpi_dsm_typed(ACPI_HANDLE, uint8_t *, ACPI_INTEGER, ACPI_STATUS acpi_dsm_integer(ACPI_HANDLE, uint8_t *, ACPI_INTEGER, ACPI_INTEGER, const ACPI_OBJECT *, ACPI_INTEGER *); +ACPI_STATUS acpi_dsm_query(ACPI_HANDLE, uint8_t *, ACPI_INTEGER, + ACPI_INTEGER *); ACPI_STATUS acpi_claim_childdevs(device_t, struct acpi_devnode *); |
