diff options
Diffstat (limited to 'src/mainboard/google/ocelot/mainboard.c')
-rw-r--r-- | src/mainboard/google/ocelot/mainboard.c | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/src/mainboard/google/ocelot/mainboard.c b/src/mainboard/google/ocelot/mainboard.c index f514eb96d146..5bd98924804d 100644 --- a/src/mainboard/google/ocelot/mainboard.c +++ b/src/mainboard/google/ocelot/mainboard.c @@ -4,6 +4,7 @@ #include <acpi/acpigen.h> #include <baseboard/gpio.h> #include <baseboard/variants.h> +#include <bootstate.h> #include <device/device.h> #include <ec/ec.h> #include <soc/ramstage.h> @@ -27,6 +28,12 @@ void __weak variant_update_soc_chip_config(struct soc_intel_pantherlake_config * static void mainboard_init(void *chip_info) { + baseboard_devtree_update(); +} + +/* Must happen before MPinit */ +static void mainboard_early(void *unused) +{ struct pad_config *padbased_table; const struct pad_config *base_pads; size_t base_num; @@ -37,9 +44,10 @@ static void mainboard_init(void *chip_info) fw_config_gpio_padbased_override(padbased_table); gpio_configure_pads_with_padbased(padbased_table); free(padbased_table); - baseboard_devtree_update(); } +BOOT_STATE_INIT_ENTRY(BS_PRE_DEVICE, BS_ON_EXIT, mainboard_early, NULL); + void __weak baseboard_devtree_update(void) { /* Override dev tree settings per baseboard */ @@ -58,6 +66,32 @@ void __weak variant_generate_s0ix_hook(enum s0ix_entry entry) */ } +static void mainboard_generate_s0ix_hook(void) +{ + acpigen_write_if_lequal_op_int(ARG0_OP, 1); + { + if (CONFIG(HAVE_SLP_S0_GATE)) + acpigen_soc_clear_tx_gpio(GPIO_SLP_S0_GATE); + variant_generate_s0ix_hook(S0IX_ENTRY); + } + acpigen_write_else(); + { + if (CONFIG(HAVE_SLP_S0_GATE)) + acpigen_soc_set_tx_gpio(GPIO_SLP_S0_GATE); + variant_generate_s0ix_hook(S0IX_EXIT); + } + acpigen_write_if_end(); +} + +static void mainboard_fill_ssdt(const struct device *dev) +{ + acpigen_write_scope("\\_SB"); + acpigen_write_method_serialized("MS0X", 1); + mainboard_generate_s0ix_hook(); + acpigen_write_method_end(); /* Method */ + acpigen_write_scope_end(); /* Scope */ +} + static void mainboard_dev_init(struct device *dev) { mainboard_ec_init(); @@ -66,6 +100,7 @@ static void mainboard_dev_init(struct device *dev) static void mainboard_enable(struct device *dev) { dev->ops->init = mainboard_dev_init; + dev->ops->acpi_fill_ssdt = mainboard_fill_ssdt; } struct chip_operations mainboard_ops = { |