Module Name: src Committed By: jmcneill Date: Fri Dec 21 14:51:12 UTC 2018
Modified Files: src/sys/dev/acpi: acpi_util.c acpi_util.h Log Message: Add acpi_dsd_integer, which reads an integer value from an ACPI 5.0 _DSD key/value package list. To generate a diff of this commit: cvs rdiff -u -r1.14 -r1.15 src/sys/dev/acpi/acpi_util.c cvs rdiff -u -r1.6 -r1.7 src/sys/dev/acpi/acpi_util.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/acpi/acpi_util.c diff -u src/sys/dev/acpi/acpi_util.c:1.14 src/sys/dev/acpi/acpi_util.c:1.15 --- src/sys/dev/acpi/acpi_util.c:1.14 Fri Nov 16 23:05:50 2018 +++ src/sys/dev/acpi/acpi_util.c Fri Dec 21 14:51:12 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_util.c,v 1.14 2018/11/16 23:05:50 jmcneill Exp $ */ +/* $NetBSD: acpi_util.c,v 1.15 2018/12/21 14:51:12 jmcneill Exp $ */ /*- * Copyright (c) 2003, 2007 The NetBSD Foundation, Inc. @@ -65,7 +65,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: acpi_util.c,v 1.14 2018/11/16 23:05:50 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: acpi_util.c,v 1.15 2018/12/21 14:51:12 jmcneill Exp $"); #include <sys/param.h> #include <sys/kmem.h> @@ -607,3 +607,67 @@ acpi_intr_string(void *c, char *buf, siz return intr_string(ih, buf, size); } + +/* + * USB Device-Specific Data (_DSD) support + */ + +static UINT8 acpi_dsd_uuid[ACPI_UUID_LENGTH] = { + 0x14, 0xd8, 0xff, 0xda, 0xba, 0x6e, 0x8c, 0x4d, + 0x8a, 0x91, 0xbc, 0x9b, 0xbf, 0x4a, 0xa3, 0x01 +}; + +ACPI_STATUS +acpi_dsd_integer(ACPI_HANDLE handle, const char *prop, ACPI_INTEGER *val) +{ + ACPI_OBJECT *obj, *uuid, *props, *pobj, *propkey, *propval; + ACPI_STATUS rv; + ACPI_BUFFER buf; + int n; + + buf.Pointer = NULL; + buf.Length = ACPI_ALLOCATE_BUFFER; + + rv = AcpiEvaluateObjectTyped(handle, "_DSD", NULL, &buf, ACPI_TYPE_PACKAGE); + if (ACPI_FAILURE(rv)) + return rv; + + props = NULL; + obj = (ACPI_OBJECT *)buf.Pointer; + for (n = 0; (n + 1) < obj->Package.Count; n += 2) { + uuid = &obj->Package.Elements[n]; + if (uuid->Buffer.Length == ACPI_UUID_LENGTH && + memcmp(uuid->Buffer.Pointer, acpi_dsd_uuid, ACPI_UUID_LENGTH) == 0) { + props = &obj->Package.Elements[n + 1]; + break; + } + } + if (props == NULL) { + rv = AE_NOT_FOUND; + goto done; + } + + for (n = 0; n < props->Package.Count; n++) { + pobj = &props->Package.Elements[n]; + if (pobj->Type != ACPI_TYPE_PACKAGE || pobj->Package.Count != 2) + continue; + propkey = (ACPI_OBJECT *)&pobj->Package.Elements[0]; + propval = (ACPI_OBJECT *)&pobj->Package.Elements[1]; + if (propkey->Type != ACPI_TYPE_STRING) + continue; + if (strcmp(propkey->String.Pointer, prop) != 0) + continue; + + if (propval->Type != ACPI_TYPE_INTEGER) { + rv = AE_TYPE; + } else { + *val = propval->Integer.Value; + rv = AE_OK; + } + break; + } + +done: + ACPI_FREE(buf.Pointer); + return rv; +} Index: src/sys/dev/acpi/acpi_util.h diff -u src/sys/dev/acpi/acpi_util.h:1.6 src/sys/dev/acpi/acpi_util.h:1.7 --- src/sys/dev/acpi/acpi_util.h:1.6 Fri Oct 12 23:25:29 2018 +++ src/sys/dev/acpi/acpi_util.h Fri Dec 21 14:51:12 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: acpi_util.h,v 1.6 2018/10/12 23:25:29 jmcneill Exp $ */ +/* $NetBSD: acpi_util.h,v 1.7 2018/12/21 14:51:12 jmcneill Exp $ */ /*- * Copyright (c) 2003, 2007 The NetBSD Foundation, Inc. @@ -88,4 +88,6 @@ int acpi_match_class(ACPI_HANDLE, uint ACPI_HANDLE acpi_match_cpu_info(struct cpu_info *); struct cpu_info *acpi_match_cpu_handle(ACPI_HANDLE); +ACPI_STATUS acpi_dsd_integer(ACPI_HANDLE, const char *, ACPI_INTEGER *); + #endif /* !_SYS_DEV_ACPI_ACPI_UTIL_H */