summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/x86/acpi_device.c62
-rw-r--r--src/arch/x86/include/arch/acpi_device.h31
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);