acpigen: Add a runtime method to override exposed _Sx sleep states

This allows mainboards to override available sleep states at runtime.
This is done by adding a IntObj in SSDT that DSDT consumes to override
the available _Sx states.

Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
Change-Id: Ic21830c1ef9c183b1e3005cc1f8b7daf7e9ea998
Reviewed-on: https://review.coreboot.org/c/coreboot/+/74762
Reviewed-by: Nico Huber <nico.h@gmx.de>
Reviewed-by: Jakub Czapiga <jacz@semihalf.com>
Reviewed-by: Jan Samek <jan.samek@siemens.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Lean Sheng Tan <sheng.tan@9elements.com>
This commit is contained in:
Arthur Heymans 2023-04-25 16:23:37 +02:00 committed by Lean Sheng Tan
parent cd48c7ece3
commit 0eb5974def
3 changed files with 23 additions and 0 deletions

View File

@ -2364,3 +2364,17 @@ void acpigen_write_delay_until_namestr_int(uint32_t wait_ms, const char *name, u
acpigen_emit_byte(LOCAL7_OP); acpigen_emit_byte(LOCAL7_OP);
acpigen_pop_len(); /* While */ acpigen_pop_len(); /* While */
} }
void acpigen_ssdt_override_sleep_states(bool enable_s1, bool enable_s2, bool enable_s3,
bool enable_s4)
{
assert(!(enable_s1 && CONFIG(ACPI_S1_NOT_SUPPORTED)));
assert(!(enable_s3 && !CONFIG(HAVE_ACPI_RESUME)));
assert(!(enable_s4 && CONFIG(DISABLE_ACPI_HIBERNATE)));
acpigen_write_scope("\\");
uint32_t sleep_enable = (enable_s1 << 0) | (enable_s2 << 1)
| (enable_s3 << 2) | (enable_s4 << 3);
acpigen_write_name_dword("OSFG", sleep_enable);
acpigen_pop_len();
}

View File

@ -695,4 +695,8 @@ void acpigen_resource_qword(u16 res_type, u16 gen_flags, u16 type_flags,
/* Emits Notify(namestr, value) */ /* Emits Notify(namestr, value) */
void acpigen_notify(const char *namestr, int value); void acpigen_notify(const char *namestr, int value);
/* Create a namespace \OSFG to override the enabled sleep states */
void acpigen_ssdt_override_sleep_states(bool enable_s1, bool enable_s2, bool enable_s3,
bool enable_s4);
#endif /* __ACPI_ACPIGEN_H__ */ #endif /* __ACPI_ACPIGEN_H__ */

View File

@ -15,6 +15,11 @@ If (CONFIG(DISABLE_ACPI_HIBERNATE)) {
SSFG &= 0xf7 SSFG &= 0xf7
} }
External (\OSFG, IntObj)
If (CondRefOf(\OSFG)) {
SSFG = \OSFG
}
/* Supported sleep states: */ /* Supported sleep states: */
Name(\_S0, Package () {0x00, 0x00, 0x00, 0x00} ) /* (S0) - working state */ Name(\_S0, Package () {0x00, 0x00, 0x00, 0x00} ) /* (S0) - working state */