diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1842-crypto-ccp-fix-the-SEV-probe-in-kexec-boot-path.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1842-crypto-ccp-fix-the-SEV-probe-in-kexec-boot-path.patch | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1842-crypto-ccp-fix-the-SEV-probe-in-kexec-boot-path.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1842-crypto-ccp-fix-the-SEV-probe-in-kexec-boot-path.patch new file mode 100644 index 00000000..745e83be --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/1842-crypto-ccp-fix-the-SEV-probe-in-kexec-boot-path.patch @@ -0,0 +1,58 @@ +From 932bfd21029a1372b5032cf1d0785af9877b3dcd Mon Sep 17 00:00:00 2001 +From: "Singh, Brijesh" <brijesh.singh@amd.com> +Date: Wed, 30 Jan 2019 20:57:52 +0000 +Subject: [PATCH 1842/2940] crypto: ccp - fix the SEV probe in kexec boot path + +A kexec reboot may leave the firmware in INIT or WORKING state. +Currently, we issue PLATFORM_INIT command during the probe without +checking the current state. The PLATFORM_INIT command fails if the +FW is already in INIT state. Lets check the current state, if FW +is not in UNINIT state then transition it to UNINIT before +initializing or upgrading the FW. + +Signed-off-by: Brijesh Singh <brijesh.singh@amd.com> +Cc: Tom Lendacky <thomas.lendacky@amd.com> +Cc: Gary Hook <gary.hook@amd.com> +Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com> +Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> +--- + drivers/crypto/ccp/psp-dev.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/drivers/crypto/ccp/psp-dev.c b/drivers/crypto/ccp/psp-dev.c +index d79147177394..4afe6b1badb8 100644 +--- a/drivers/crypto/ccp/psp-dev.c ++++ b/drivers/crypto/ccp/psp-dev.c +@@ -437,6 +437,7 @@ static int sev_get_api_version(void) + psp_master->api_major = status->api_major; + psp_master->api_minor = status->api_minor; + psp_master->build = status->build; ++ psp_master->sev_state = status->state; + + return 0; + } +@@ -964,6 +965,21 @@ void psp_pci_init(void) + if (sev_get_api_version()) + goto err; + ++ /* ++ * If platform is not in UNINIT state then firmware upgrade and/or ++ * platform INIT command will fail. These command require UNINIT state. ++ * ++ * In a normal boot we should never run into case where the firmware ++ * is not in UNINIT state on boot. But in case of kexec boot, a reboot ++ * may not go through a typical shutdown sequence and may leave the ++ * firmware in INIT or WORKING state. ++ */ ++ ++ if (psp_master->sev_state != SEV_STATE_UNINIT) { ++ sev_platform_shutdown(NULL); ++ psp_master->sev_state = SEV_STATE_UNINIT; ++ } ++ + if (SEV_VERSION_GREATER_OR_EQUAL(0, 15) && + sev_update_firmware(psp_master->dev) == 0) + sev_get_api_version(); +-- +2.17.1 + |