Cliff Huang has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/72825 )
Change subject: src/acpi: add function gen: if_lgreater_ and namestr assignment ......................................................................
src/acpi: add function gen: if_lgreater_ and namestr assignment
1. add functions to generate if greater than conditions: acpigen_write_if_lgreater_op_op: if (op1 > op2) acpigen_write_if_lgreater_op_int: if (op > val) acpigen_write_if_lgreater_namestr_int: if (namestr > val) 2. add function to assignal value to a namestr acpigen_write_store_namestr_to_op: namestr = val
TEST=Use above functions and check the generated SSDT table after OS boot.
Signed-off-by: Cliff Huang cliff.huang@intel.com Change-Id: Iffe1b23362a7ab58bdc2aa8daf45cd6f086ee818 --- M src/acpi/acpigen.c M src/include/acpi/acpigen.h 2 files changed, 78 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/25/72825/1
diff --git a/src/acpi/acpigen.c b/src/acpi/acpigen.c index 305cddb..725a2d8 100644 --- a/src/acpi/acpigen.c +++ b/src/acpi/acpigen.c @@ -1368,6 +1368,14 @@ acpigen_emit_namestring(dst); }
+/* Store ("namestr", dst) */ +void acpigen_write_store_namestr_to_op(const char *src, uint8_t dst) +{ + acpigen_write_store(); + acpigen_emit_namestring(src); + acpigen_emit_byte(dst); +} + /* Store (src, dst) */ void acpigen_write_store_int_to_op(uint64_t src, uint8_t dst) { @@ -1527,6 +1535,20 @@ }
/* + * Generates ACPI code for checking if operand1 is greater than operand2. + * Both operand1 and operand2 are ACPI ops. + * + * If (Lgreater (op1 op2)) + */ +void acpigen_write_if_lgreater_op_op(uint8_t op1, uint8_t op2) +{ + acpigen_write_if(); + acpigen_emit_byte(LGREATER_OP); + acpigen_emit_byte(op1); + acpigen_emit_byte(op2); +} + +/* * Generates ACPI code for checking if operand1 and operand2 are equal, where, * operand1 is ACPI op and operand2 is an integer. * @@ -1541,6 +1563,20 @@ }
/* + * Generates ACPI code for checking if operand is greater than the value, where, + * operand is ACPI op and val is an integer. + * + * If (Lgreater (op, val)) + */ +void acpigen_write_if_lgreater_op_int(uint8_t op, uint64_t val) +{ + acpigen_write_if(); + acpigen_emit_byte(LGREATER_OP); + acpigen_emit_byte(op); + acpigen_write_integer(val); +} + +/* * Generates ACPI code for checking if operand1 and operand2 are equal, where, * operand1 is namestring and operand2 is an integer. * @@ -1555,6 +1591,20 @@ }
/* + * Generates ACPI code for checking if operand1 and operand2 are equal, where, + * operand1 is namestring and operand2 is an integer. + * + * If (Lgreater ("namestr", val)) + */ +void acpigen_write_if_lgreater_namestr_int(const char *namestr, uint64_t val) +{ + acpigen_write_if(); + acpigen_emit_byte(LGREATER_OP); + acpigen_emit_namestring(namestr); + acpigen_write_integer(val); +} + +/* * Generates ACPI code to check at runtime if an object named `namestring` * exists, and leaves the If scope open to continue execute code when this * is true. NOTE: Requires matching acpigen_write_if_end(). diff --git a/src/include/acpi/acpigen.h b/src/include/acpi/acpigen.h index c506021..cf88100 100644 --- a/src/include/acpi/acpigen.h +++ b/src/include/acpi/acpigen.h @@ -487,6 +487,7 @@ void acpigen_write_store_int_to_op(uint64_t src, uint8_t dst); void acpigen_write_store_ops(uint8_t src, uint8_t dst); void acpigen_write_store_op_to_namestr(uint8_t src, const char *dst); +void acpigen_write_store_namestr_to_op(const char *src, uint8_t dst); void acpigen_write_or(uint8_t arg1, uint8_t arg2, uint8_t res); void acpigen_write_xor(uint8_t arg1, uint8_t arg2, uint8_t res); void acpigen_write_and(uint8_t arg1, uint8_t arg2, uint8_t res); @@ -506,8 +507,11 @@ void acpigen_write_if(void); void acpigen_write_if_and(uint8_t arg1, uint8_t arg2); void acpigen_write_if_lequal_op_op(uint8_t op, uint8_t val); +void acpigen_write_if_lgreater_op_op(uint8_t op1, uint8_t op2); void acpigen_write_if_lequal_op_int(uint8_t op, uint64_t val); +void acpigen_write_if_lgreater_op_int(uint8_t op, uint64_t val); void acpigen_write_if_lequal_namestr_int(const char *namestr, uint64_t val); +void acpigen_write_if_lgreater_namestr_int(const char *namestr, uint64_t val); __always_inline void acpigen_write_if_end(void) { acpigen_pop_len();