acpigen: Add function to generate ToUUID() from a string
acpigen_write_uuid() will generate a ToUUID() 128-bit buffer object for a common universally unique identifier that is passed as a string. The resulting buffer is the UUID in byte format with a specific order of the bytes as described in the ACPI specification: ToUUID (uuid) Compiles to: Buffer (16) { uuid[3], uuid[2], uuid[1], uuid[0], uuid[5], uuid[4], uuid[7], uuid[6], uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15] } Change-Id: Ibbeff926883532dd78477aaa2d26ffffb6ef30c0 Signed-off-by: Duncan Laurie <dlaurie@chromium.org> Reviewed-on: https://review.coreboot.org/14838 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
parent
b9552841bf
commit
3829f238fa
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
#define ACPIGEN_MAXLEN 0xfffff
|
#define ACPIGEN_MAXLEN 0xfffff
|
||||||
|
|
||||||
|
#include <lib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <arch/acpigen.h>
|
#include <arch/acpigen.h>
|
||||||
#include <console/console.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 >> 8) & 0xff);
|
||||||
acpigen_emit_byte(compact & 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();
|
||||||
|
}
|
||||||
|
|
|
@ -92,6 +92,7 @@ void acpigen_write_resourcetemplate_footer(void);
|
||||||
void acpigen_write_mainboard_resource_template(void);
|
void acpigen_write_mainboard_resource_template(void);
|
||||||
void acpigen_write_mainboard_resources(const char *scope, const char *name);
|
void acpigen_write_mainboard_resources(const char *scope, const char *name);
|
||||||
void acpigen_write_irq(u16 mask);
|
void acpigen_write_irq(u16 mask);
|
||||||
|
void acpigen_write_uuid(const char *uuid);
|
||||||
|
|
||||||
int get_cst_entries(acpi_cstate_t **);
|
int get_cst_entries(acpi_cstate_t **);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue