acpi: Add support for writing a _PRW

A 'Power Resource for Wake' list the resources a device depends on for
wake. Add a function to generate this.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2020-09-22 12:44:56 -06:00 committed by Bin Meng
parent 99e555a79a
commit e0a896b88f
3 changed files with 50 additions and 0 deletions

View File

@ -563,4 +563,14 @@ int acpigen_set_enable_tx_gpio(struct acpi_ctx *ctx, u32 tx_state_val,
const char *dw0_read, const char *dw0_write,
struct acpi_gpio *gpio, bool enable);
/**
* acpigen_write_prw() - Write a power resource for wake (_PRW)
*
* @ctx: ACPI context pointer
* @wake: GPE that wakes up the device
* @level: Deepest power system sleeping state that can be entered while still
* providing wake functionality
*/
void acpigen_write_prw(struct acpi_ctx *ctx, uint wake, uint level);
#endif

View File

@ -426,6 +426,16 @@ void acpigen_write_register_resource(struct acpi_ctx *ctx,
acpigen_write_resourcetemplate_footer(ctx);
}
void acpigen_write_prw(struct acpi_ctx *ctx, uint wake, uint level)
{
/* Name (_PRW, Package () { wake, level } */
acpigen_write_name(ctx, "_PRW");
acpigen_write_package(ctx, 2);
acpigen_write_integer(ctx, wake);
acpigen_write_integer(ctx, level);
acpigen_pop_len(ctx);
}
/*
* ToUUID(uuid)
*

View File

@ -1097,3 +1097,33 @@ static int dm_test_acpi_write_name(struct unit_test_state *uts)
return 0;
}
DM_TEST(dm_test_acpi_write_name, 0);
/* Test emitting a _PRW component */
static int dm_test_acpi_write_prw(struct unit_test_state *uts)
{
struct acpi_ctx *ctx;
u8 *ptr;
ut_assertok(alloc_context(&ctx));
ptr = acpigen_get_current(ctx);
acpigen_write_prw(ctx, 5, 3);
ut_asserteq(NAME_OP, *ptr++);
ut_asserteq_strn("_PRW", (char *)ptr);
ptr += 4;
ut_asserteq(PACKAGE_OP, *ptr++);
ut_asserteq(8, acpi_test_get_length(ptr));
ptr += 3;
ut_asserteq(2, *ptr++);
ut_asserteq(BYTE_PREFIX, *ptr++);
ut_asserteq(5, *ptr++);
ut_asserteq(BYTE_PREFIX, *ptr++);
ut_asserteq(3, *ptr++);
ut_asserteq_ptr(ptr, ctx->current);
free_context(&ctx);
return 0;
}
DM_TEST(dm_test_acpi_write_prw, 0);