diff options
author | Felix Held <felix.held@amd.corp-partner.google.com> | 2020-04-01 22:06:39 +0200 |
---|---|---|
committer | Felix Held <felix-coreboot@felixheld.de> | 2020-04-16 23:17:09 +0000 |
commit | 43126edc3ae246d1dbd293550e29a9e2c378f424 (patch) | |
tree | 228f2cf086db0d3d4b52ec95ecc7e786b8550ce6 /src | |
parent | e8ffa9ffd3cf5cb9fcade12e1f1e0dea5fc3fcf2 (diff) |
soc/amd/common/psp: Add notify_sx_info
Add the command to tell the PSP the system is going to a sleep
state.
BUG=b:153677737
Change-Id: I50da358e1f8438b46dbb1bda593becf6dd4549ea
Signed-off-by: Marshall Dawson <marshalldawson3rd@gmail.com>
Reviewed-on: https://chromium-review.googlesource.com/2020367
Reviewed-on: https://chromium-review.googlesource.com/2110764
Reviewed-on: https://chromium-review.googlesource.com/2121159
Signed-off-by: Felix Held <felix-coreboot@felixheld.de>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/40016
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Raul Rangel <rrangel@chromium.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/soc/amd/common/block/include/amdblocks/psp.h | 6 | ||||
-rw-r--r-- | src/soc/amd/common/block/psp/psp_def.h | 25 | ||||
-rw-r--r-- | src/soc/amd/common/block/psp/psp_smm.c | 28 |
3 files changed, 47 insertions, 12 deletions
diff --git a/src/soc/amd/common/block/include/amdblocks/psp.h b/src/soc/amd/common/block/include/amdblocks/psp.h index a1c1152af9..91c96e1b0c 100644 --- a/src/soc/amd/common/block/include/amdblocks/psp.h +++ b/src/soc/amd/common/block/include/amdblocks/psp.h @@ -67,6 +67,12 @@ enum psp_blob_type { BLOB_SMU_FW2, }; +/* + * Notify PSP that the system is entering a sleep state. sleep_state uses the + * same definition as Pm1Cnt[SlpTyp], typically 0, 1, 3, 4, 5. + */ +void psp_notify_sx_info(u8 sleep_type); + int psp_load_named_blob(enum psp_blob_type type, const char *name); #endif /* __AMD_PSP_H__ */ diff --git a/src/soc/amd/common/block/psp/psp_def.h b/src/soc/amd/common/block/psp/psp_def.h index 63ca3abb0a..7772ca6bda 100644 --- a/src/soc/amd/common/block/psp/psp_def.h +++ b/src/soc/amd/common/block/psp/psp_def.h @@ -9,18 +9,19 @@ #include <amdblocks/psp.h> /* x86 to PSP commands */ -#define MBOX_BIOS_CMD_DRAM_INFO 0x01 -#define MBOX_BIOS_CMD_SMM_INFO 0x02 -#define MBOX_BIOS_CMD_SX_INFO 0x03 -#define MBOX_BIOS_CMD_RSM_INFO 0x04 -#define MBOX_BIOS_CMD_PSP_QUERY 0x05 -#define MBOX_BIOS_CMD_BOOT_DONE 0x06 -#define MBOX_BIOS_CMD_CLEAR_S3_STS 0x07 -#define MBOX_BIOS_CMD_S3_DATA_INFO 0x08 -#define MBOX_BIOS_CMD_NOP 0x09 -#define MBOX_BIOS_CMD_SMU_FW 0x19 -#define MBOX_BIOS_CMD_SMU_FW2 0x1a -#define MBOX_BIOS_CMD_ABORT 0xfe +#define MBOX_BIOS_CMD_DRAM_INFO 0x01 +#define MBOX_BIOS_CMD_SMM_INFO 0x02 +#define MBOX_BIOS_CMD_SX_INFO 0x03 +#define MBOX_BIOS_CMD_SX_INFO_SLEEP_TYPE_MAX 0x07 +#define MBOX_BIOS_CMD_RSM_INFO 0x04 +#define MBOX_BIOS_CMD_PSP_QUERY 0x05 +#define MBOX_BIOS_CMD_BOOT_DONE 0x06 +#define MBOX_BIOS_CMD_CLEAR_S3_STS 0x07 +#define MBOX_BIOS_CMD_S3_DATA_INFO 0x08 +#define MBOX_BIOS_CMD_NOP 0x09 +#define MBOX_BIOS_CMD_SMU_FW 0x19 +#define MBOX_BIOS_CMD_SMU_FW2 0x1a +#define MBOX_BIOS_CMD_ABORT 0xfe /* generic PSP interface status, v1 */ #define PSPV1_STATUS_INITIALIZED BIT(0) diff --git a/src/soc/amd/common/block/psp/psp_smm.c b/src/soc/amd/common/block/psp/psp_smm.c index cc15738881..4ae2277cab 100644 --- a/src/soc/amd/common/block/psp/psp_smm.c +++ b/src/soc/amd/common/block/psp/psp_smm.c @@ -76,3 +76,31 @@ int psp_notify_smm(void) return cmd_status; } + +/* Notify PSP the system is going to a sleep state. */ +void psp_notify_sx_info(u8 sleep_type) +{ + int cmd_status; + struct mbox_cmd_sx_info_buffer *buffer; + + /* PSP verifies that this buffer is at the address specified in psp_notify_smm() */ + buffer = (struct mbox_cmd_sx_info_buffer *)c2p_buffer.buffer; + memset(buffer, 0, sizeof(*buffer)); + buffer->header.size = sizeof(*buffer); + + if (sleep_type > MBOX_BIOS_CMD_SX_INFO_SLEEP_TYPE_MAX) { + printk(BIOS_ERR, "PSP: BUG: invalid sleep type 0x%x requested\n", sleep_type); + return; + } + + printk(BIOS_DEBUG, "PSP: Prepare to enter sleep state %d... ", sleep_type); + + buffer->sleep_type = sleep_type; + + set_smm_flag(); + cmd_status = send_psp_command(MBOX_BIOS_CMD_SX_INFO, buffer); + clear_smm_flag(); + + /* buffer's status shouldn't change but report it if it does */ + psp_print_cmd_status(cmd_status, (struct mbox_default_buffer *)buffer); +} |