diff --git a/sys/dev/acpi/acpi_util.c b/sys/dev/acpi/acpi_util.c index b81a1143b0f3..a9d848e1c144 100644 --- a/sys/dev/acpi/acpi_util.c +++ b/sys/dev/acpi/acpi_util.c @@ -763,6 +763,38 @@ acpi_dsd_integer(ACPI_HANDLE handle, const char *prop, ACPI_INTEGER *val) return rv; } +ACPI_STATUS +acpi_dsd_data(ACPI_HANDLE handle, const char *prop, uint8_t *data, + size_t datalen) +{ + ACPI_OBJECT *propval; + ACPI_STATUS rv; + ACPI_BUFFER buf; + + buf.Pointer = NULL; + buf.Length = ACPI_ALLOCATE_BUFFER; + + rv = acpi_dsd_property(handle, prop, &buf, ACPI_TYPE_PACKAGE, &propval); + if (ACPI_SUCCESS(rv)) { + for (size_t i = 0; i < propval->Package.Count; i++) { + const size_t len = uimin(datalen, sizeof(ACPI_INTEGER)); + if (len == 0) + break; + + const ACPI_OBJECT * const elm = + &propval->Package.Elements[i]; + memcpy(data, &elm->Integer.Value, len); + data += len; + datalen -= len; + } + } + + if (buf.Pointer != NULL) + ACPI_FREE(buf.Pointer); + + return rv; +} + ACPI_STATUS acpi_dsd_string(ACPI_HANDLE handle, const char *prop, char **val) { diff --git a/sys/dev/acpi/acpi_util.h b/sys/dev/acpi/acpi_util.h index 9157d5af8aca..a96e9b020d66 100644 --- a/sys/dev/acpi/acpi_util.h +++ b/sys/dev/acpi/acpi_util.h @@ -90,6 +90,7 @@ struct cpu_info *acpi_match_cpu_handle(ACPI_HANDLE); char *acpi_pack_compat_list(ACPI_DEVICE_INFO *, size_t *); +ACPI_STATUS acpi_dsd_data(ACPI_HANDLE, const char *, uint8_t *, size_t); ACPI_STATUS acpi_dsd_integer(ACPI_HANDLE, const char *, ACPI_INTEGER *); ACPI_STATUS acpi_dsd_string(ACPI_HANDLE, const char *, char **);