summaryrefslogtreecommitdiff
path: root/sys/dev/acpi
diff options
context:
space:
mode:
authorjmcneill <jmcneill@NetBSD.org>2022-01-15 14:40:22 +0000
committerjmcneill <jmcneill@NetBSD.org>2022-01-15 14:40:22 +0000
commitae008ef2e10be72043021430d593d170ee4417f5 (patch)
tree0129b1f5e35e0a69288a1d3314ee7d202bb24725 /sys/dev/acpi
parent3ceb61100623312a5ee03227f4ecd0c5e83b15dd (diff)
acpi: Add helper for querying DSM function 0.
Diffstat (limited to 'sys/dev/acpi')
-rw-r--r--sys/dev/acpi/acpi_util.c36
-rw-r--r--sys/dev/acpi/acpi_util.h4
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 *);