mb/google/brya: Implement shutdown function for dGPU

Variants of brya that have a dGPU also need to perform a special
shutdown sequence in the _PTS ACPI Method.

Signed-off-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Change-Id: Ib760fa65e6e021c0949187f13f038d3e952e5910
Reviewed-on: https://review.coreboot.org/c/coreboot/+/65488
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Subrata Banik <subratabanik@google.com>
Reviewed-by: Nick Vaccaro <nvaccaro@google.com>
This commit is contained in:
Tim Wawrzynczak 2022-06-24 15:31:36 -06:00
parent ef886f3034
commit 52ccd293d7
1 changed files with 22 additions and 11 deletions

View File

@ -14,6 +14,7 @@
#include <stdio.h> #include <stdio.h>
WEAK_DEV_PTR(rp6_wwan); WEAK_DEV_PTR(rp6_wwan);
WEAK_DEV_PTR(dgpu);
static void add_fw_config_oem_string(const struct fw_config *config, void *arg) static void add_fw_config_oem_string(const struct fw_config *config, void *arg)
{ {
@ -102,7 +103,7 @@ static void mainboard_dev_init(struct device *dev)
mainboard_ec_init(); mainboard_ec_init();
} }
static void mainboard_generate_shutdown(const struct device *dev) static void mainboard_generate_wwan_shutdown(const struct device *dev)
{ {
const struct drivers_wwan_fm_config *config = config_of(dev); const struct drivers_wwan_fm_config *config = config_of(dev);
const struct device *parent = dev->bus->dev; const struct device *parent = dev->bus->dev;
@ -119,12 +120,18 @@ static void mainboard_generate_shutdown(const struct device *dev)
acpigen_emit_byte(ARG0_OP); acpigen_emit_byte(ARG0_OP);
} }
acpigen_write_if_end(); acpigen_write_if_end();
} else {
acpigen_emit_namestring(acpi_device_path_join(dev, "DPTS"));
acpigen_emit_byte(ARG0_OP);
} }
} }
static void mainboard_generate_dgpu_shutdown(const struct device *dev)
{
/* Call `_OFF` from the Power Resource associated with the dGPU's PEG port. */
const struct device *parent = dev->bus->dev;
if (parent)
acpigen_emit_namestring(acpi_device_path_join(parent, "PGPR._OFF"));
}
static void mainboard_generate_s0ix_hook(void) static void mainboard_generate_s0ix_hook(void)
{ {
acpigen_write_if_lequal_op_int(ARG0_OP, 1); acpigen_write_if_lequal_op_int(ARG0_OP, 1);
@ -145,14 +152,18 @@ static void mainboard_generate_s0ix_hook(void)
static void mainboard_fill_ssdt(const struct device *dev) static void mainboard_fill_ssdt(const struct device *dev)
{ {
const struct device *wwan = DEV_PTR(rp6_wwan); const struct device *wwan = DEV_PTR(rp6_wwan);
const struct device *dgpu = DEV_PTR(dgpu);
acpigen_write_scope("\\_SB");
acpigen_write_method_serialized("MPTS", 1);
if (wwan)
mainboard_generate_wwan_shutdown(wwan);
if (dgpu)
mainboard_generate_dgpu_shutdown(dgpu);
acpigen_write_method_end(); /* Method */
acpigen_write_scope_end(); /* Scope */
if (wwan) {
acpigen_write_scope("\\_SB");
acpigen_write_method_serialized("MPTS", 1);
mainboard_generate_shutdown(wwan);
acpigen_write_method_end(); /* Method */
acpigen_write_scope_end(); /* Scope */
}
/* for variant to fill additional SSDT */ /* for variant to fill additional SSDT */
variant_fill_ssdt(dev); variant_fill_ssdt(dev);