diff options
-rw-r--r-- | src/arch/x86/acpi_device.c | 62 | ||||
-rw-r--r-- | src/arch/x86/include/arch/acpi_device.h | 31 |
2 files changed, 68 insertions, 25 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) { diff --git a/src/arch/x86/include/arch/acpi_device.h b/src/arch/x86/include/arch/acpi_device.h index f904cc6107..483fa477d7 100644 --- a/src/arch/x86/include/arch/acpi_device.h +++ b/src/arch/x86/include/arch/acpi_device.h @@ -20,6 +20,30 @@ #include <stdint.h> #include <spi-generic.h> +enum acpi_dp_type { + ACPI_DP_TYPE_UNKNOWN, + 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; + }; +}; + #define ACPI_DESCRIPTOR_LARGE (1 << 7) #define ACPI_DESCRIPTOR_INTERRUPT (ACPI_DESCRIPTOR_LARGE | 9) #define ACPI_DESCRIPTOR_GPIO (ACPI_DESCRIPTOR_LARGE | 12) @@ -337,8 +361,6 @@ void acpi_device_add_power_res( * } */ -struct acpi_dp; - /* Start a new Device Property table with provided ACPI reference */ struct acpi_dp *acpi_dp_new_table(const char *ref); @@ -370,6 +392,11 @@ struct acpi_dp *acpi_dp_add_gpio(struct acpi_dp *dp, const char *name, struct acpi_dp *acpi_dp_add_child(struct acpi_dp *dp, const char *name, struct acpi_dp *child); +/* Add a list of Device Properties, returns the number of properties added */ +size_t acpi_dp_add_property_list(struct acpi_dp *dp, + const struct acpi_dp *property_list, + size_t property_count); + /* Write Device Property hierarchy and clean up resources */ void acpi_dp_write(struct acpi_dp *table); |