diff options
Diffstat (limited to 'src/arch/x86/acpi_device.c')
-rw-r--r-- | src/arch/x86/acpi_device.c | 62 |
1 files changed, 39 insertions, 23 deletions
diff --git a/src/arch/x86/acpi_device.c b/src/arch/x86/acpi_device.c index aac7b88497..de2d3375be 100644 --- a/src/arch/x86/acpi_device.c +++ b/src/arch/x86/acpi_device.c @@ -26,29 +26,6 @@ #define ACPI_DP_UUID "daffd814-6eba-4d8c-8a91-bc9bbf4aa301" #define ACPI_DP_CHILD_UUID "dbb8e3e6-5886-4ba6-8795-1319f52a966b" -enum acpi_dp_type { - ACPI_DP_TYPE_INTEGER, - ACPI_DP_TYPE_STRING, - ACPI_DP_TYPE_REFERENCE, - ACPI_DP_TYPE_TABLE, - ACPI_DP_TYPE_ARRAY, - ACPI_DP_TYPE_CHILD, -}; - -struct acpi_dp { - enum acpi_dp_type type; - const char *name; - struct acpi_dp *next; - union { - struct acpi_dp *child; - struct acpi_dp *array; - }; - union { - uint64_t integer; - const char *string; - }; -}; - /* Write empty word value and return pointer to it */ static void *acpi_device_write_zero_len(void) { @@ -705,6 +682,45 @@ struct acpi_dp *acpi_dp_new_table(const char *name) return acpi_dp_new(NULL, ACPI_DP_TYPE_TABLE, name); } +size_t acpi_dp_add_property_list(struct acpi_dp *dp, + const struct acpi_dp *property_list, + size_t property_count) +{ + const struct acpi_dp *prop; + size_t i, properties_added = 0; + + for (i = 0; i < property_count; i++) { + prop = &property_list[i]; + + if (prop->type == ACPI_DP_TYPE_UNKNOWN || !prop->name) + continue; + + switch (prop->type) { + case ACPI_DP_TYPE_INTEGER: + acpi_dp_add_integer(dp, prop->name, prop->integer); + break; + case ACPI_DP_TYPE_STRING: + acpi_dp_add_string(dp, prop->name, prop->string); + break; + case ACPI_DP_TYPE_REFERENCE: + acpi_dp_add_reference(dp, prop->name, prop->string); + break; + case ACPI_DP_TYPE_ARRAY: + acpi_dp_add_array(dp, prop->array); + break; + case ACPI_DP_TYPE_CHILD: + acpi_dp_add_child(dp, prop->name, prop->child); + break; + default: + continue; + } + + ++properties_added; + } + + return properties_added; +} + struct acpi_dp *acpi_dp_add_integer(struct acpi_dp *dp, const char *name, uint64_t value) { |