summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/x86/acpigen.c36
-rw-r--r--src/arch/x86/include/arch/acpigen.h1
2 files changed, 37 insertions, 0 deletions
diff --git a/src/arch/x86/acpigen.c b/src/arch/x86/acpigen.c
index 226fba153c..c370321835 100644
--- a/src/arch/x86/acpigen.c
+++ b/src/arch/x86/acpigen.c
@@ -24,6 +24,7 @@
#define ACPIGEN_MAXLEN 0xfffff
+#include <lib.h>
#include <string.h>
#include <arch/acpigen.h>
#include <console/console.h>
@@ -827,3 +828,38 @@ void acpigen_emit_eisaid(const char *eisaid)
acpigen_emit_byte((compact >> 8) & 0xff);
acpigen_emit_byte(compact & 0xff);
}
+
+/*
+ * ToUUID(uuid)
+ *
+ * ACPI 6.1 Section 19.6.136 table 19-385 defines a special output
+ * order for the bytes that make up a UUID Buffer object.
+ * UUID byte order for input:
+ * aabbccdd-eeff-gghh-iijj-kkllmmnnoopp
+ * UUID byte order for output:
+ * ddccbbaa-ffee-hhgg-iijj-kkllmmnnoopp
+ */
+#define UUID_LEN 16
+void acpigen_write_uuid(const char *uuid)
+{
+ uint8_t buf[UUID_LEN];
+ size_t i, order[UUID_LEN] = { 3, 2, 1, 0, 5, 4, 7, 6,
+ 8, 9, 10, 11, 12, 13, 14, 15 };
+
+ /* Parse UUID string into bytes */
+ if (hexstrtobin(uuid, buf, UUID_LEN) < UUID_LEN)
+ return;
+
+ /* BufferOp */
+ acpigen_emit_byte(0x11);
+ acpigen_write_len_f();
+
+ /* Buffer length in bytes */
+ acpigen_write_word(UUID_LEN);
+
+ /* Output UUID in expected order */
+ for (i = 0; i < UUID_LEN; i++)
+ acpigen_emit_byte(buf[order[i]]);
+
+ acpigen_pop_len();
+}
diff --git a/src/arch/x86/include/arch/acpigen.h b/src/arch/x86/include/arch/acpigen.h
index e968778e5c..9e6ef2958f 100644
--- a/src/arch/x86/include/arch/acpigen.h
+++ b/src/arch/x86/include/arch/acpigen.h
@@ -92,6 +92,7 @@ void acpigen_write_resourcetemplate_footer(void);
void acpigen_write_mainboard_resource_template(void);
void acpigen_write_mainboard_resources(const char *scope, const char *name);
void acpigen_write_irq(u16 mask);
+void acpigen_write_uuid(const char *uuid);
int get_cst_entries(acpi_cstate_t **);