Implement the equivalent of OF_getprop() for device-tree-like properties in ACPI land. Needed for the upcomong Raspberry Pi4 network interface driver.
ok? Index: dev/acpi/acpi.c =================================================================== RCS file: /cvs/src/sys/dev/acpi/acpi.c,v retrieving revision 1.381 diff -u -p -r1.381 acpi.c --- dev/acpi/acpi.c 12 Apr 2020 09:21:19 -0000 1.381 +++ dev/acpi/acpi.c 12 Apr 2020 14:57:21 -0000 @@ -2961,6 +2961,57 @@ acpi_foundsony(struct aml_node *node, vo /* Support for _DSD Device Properties. */ +int +acpi_getprop(struct aml_node *node, const char *prop, void *buf, int buflen) +{ + struct aml_value dsd; + int i; + + /* daffd814-6eba-4d8c-8a91-bc9bbf4aa301 */ + static uint8_t prop_guid[] = { + 0x14, 0xd8, 0xff, 0xda, 0xba, 0x6e, 0x8c, 0x4d, + 0x8a, 0x91, 0xbc, 0x9b, 0xbf, 0x4a, 0xa3, 0x01, + }; + + if (aml_evalname(acpi_softc, node, "_DSD", 0, NULL, &dsd)) + return -1; + + if (dsd.type != AML_OBJTYPE_PACKAGE || dsd.length != 2 || + dsd.v_package[0]->type != AML_OBJTYPE_BUFFER || + dsd.v_package[1]->type != AML_OBJTYPE_PACKAGE) + return -1; + + /* Check UUID. */ + if (dsd.v_package[0]->length != sizeof(prop_guid) || + memcmp(dsd.v_package[0]->v_buffer, prop_guid, + sizeof(prop_guid)) != 0) + return -1; + + /* Check properties. */ + for (i = 0; i < dsd.v_package[1]->length; i++) { + struct aml_value *res = dsd.v_package[1]->v_package[i]; + int len; + + if (res->type != AML_OBJTYPE_PACKAGE || res->length != 2 || + res->v_package[0]->type != AML_OBJTYPE_STRING) + continue; + + len = res->v_package[1]->length; + switch (res->v_package[1]->type) { + case AML_OBJTYPE_BUFFER: + memcpy(buf, res->v_package[1]->v_buffer, + min(len, buflen)); + return len; + case AML_OBJTYPE_STRING: + memcpy(buf, res->v_package[1]->v_string, + min(len, buflen)); + return len; + } + } + + return -1; +} + uint32_t acpi_getpropint(struct aml_node *node, const char *prop, uint32_t defval) { @@ -2999,7 +3050,7 @@ acpi_getpropint(struct aml_node *node, c if (strcmp(res->v_package[0]->v_string, prop) == 0) return res->v_package[1]->v_integer; } - + return defval; } Index: dev/acpi/acpivar.h =================================================================== RCS file: /cvs/src/sys/dev/acpi/acpivar.h,v retrieving revision 1.106 diff -u -p -r1.106 acpivar.h --- dev/acpi/acpivar.h 12 Apr 2020 09:21:19 -0000 1.106 +++ dev/acpi/acpivar.h 12 Apr 2020 14:57:21 -0000 @@ -372,6 +372,7 @@ int acpi_matchhids(struct acpi_attach_ar int acpi_parsehid(struct aml_node *, void *, char *, char *, size_t); int64_t acpi_getsta(struct acpi_softc *sc, struct aml_node *); +int acpi_getprop(struct aml_node *, const char *, void *, int); uint32_t acpi_getpropint(struct aml_node *, const char *, uint32_t); int acpi_record_event(struct acpi_softc *, u_int);