aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0127-crypto-ccp-add-timeout-support-in-the-SEV-command.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0127-crypto-ccp-add-timeout-support-in-the-SEV-command.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0127-crypto-ccp-add-timeout-support-in-the-SEV-command.patch121
1 files changed, 0 insertions, 121 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0127-crypto-ccp-add-timeout-support-in-the-SEV-command.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0127-crypto-ccp-add-timeout-support-in-the-SEV-command.patch
deleted file mode 100644
index 188ad7f8..00000000
--- a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0127-crypto-ccp-add-timeout-support-in-the-SEV-command.patch
+++ /dev/null
@@ -1,121 +0,0 @@
-From b1aa7fbdaa2a498b8d2e1dab0f95112c83ff18ff Mon Sep 17 00:00:00 2001
-From: Brijesh Singh <brijesh.singh@amd.com>
-Date: Wed, 15 Aug 2018 16:11:25 -0500
-Subject: [PATCH 127/131] crypto: ccp - add timeout support in the SEV command
-
-Currently, the CCP driver assumes that the SEV command issued to the PSP
-will always return (i.e. it will never hang). But recently, firmware bugs
-have shown that a command can hang. Since of the SEV commands are used
-in probe routines, this can cause boot hangs and/or loss of virtualization
-capabilities.
-
-To protect against firmware bugs, add a timeout in the SEV command
-execution flow. If a command does not complete within the specified
-timeout then return -ETIMEOUT and stop the driver from executing any
-further commands since the state of the SEV firmware is unknown.
-
-Cc: Tom Lendacky <thomas.lendacky@amd.com>
-Cc: Gary Hook <Gary.Hook@amd.com>
-Cc: Herbert Xu <herbert@gondor.apana.org.au>
-Cc: linux-kernel@vger.kernel.org
-Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
-Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
----
- drivers/crypto/ccp/psp-dev.c | 46 +++++++++++++++++++++++++++++++++++++++-----
- 1 file changed, 41 insertions(+), 5 deletions(-)
-
-diff --git a/drivers/crypto/ccp/psp-dev.c b/drivers/crypto/ccp/psp-dev.c
-index 218739b..72790d8 100644
---- a/drivers/crypto/ccp/psp-dev.c
-+++ b/drivers/crypto/ccp/psp-dev.c
-@@ -38,6 +38,17 @@ static DEFINE_MUTEX(sev_cmd_mutex);
- static struct sev_misc_dev *misc_dev;
- static struct psp_device *psp_master;
-
-+static int psp_cmd_timeout = 100;
-+module_param(psp_cmd_timeout, int, 0644);
-+MODULE_PARM_DESC(psp_cmd_timeout, " default timeout value, in seconds, for PSP commands");
-+
-+static int psp_probe_timeout = 5;
-+module_param(psp_probe_timeout, int, 0644);
-+MODULE_PARM_DESC(psp_probe_timeout, " default timeout value, in seconds, during PSP device probe");
-+
-+static bool psp_dead;
-+static int psp_timeout;
-+
- static struct psp_device *psp_alloc_struct(struct sp_device *sp)
- {
- struct device *dev = sp->dev;
-@@ -82,10 +93,19 @@ static irqreturn_t psp_irq_handler(int irq, void *data)
- return IRQ_HANDLED;
- }
-
--static void sev_wait_cmd_ioc(struct psp_device *psp, unsigned int *reg)
-+static int sev_wait_cmd_ioc(struct psp_device *psp,
-+ unsigned int *reg, unsigned int timeout)
- {
-- wait_event(psp->sev_int_queue, psp->sev_int_rcvd);
-+ int ret;
-+
-+ ret = wait_event_timeout(psp->sev_int_queue,
-+ psp->sev_int_rcvd, timeout * HZ);
-+ if (!ret)
-+ return -ETIMEDOUT;
-+
- *reg = ioread32(psp->io_regs + psp->vdata->cmdresp_reg);
-+
-+ return 0;
- }
-
- static int sev_cmd_buffer_len(int cmd)
-@@ -133,12 +153,15 @@ static int __sev_do_cmd_locked(int cmd, void *data, int *psp_ret)
- if (!psp)
- return -ENODEV;
-
-+ if (psp_dead)
-+ return -EBUSY;
-+
- /* Get the physical address of the command buffer */
- phys_lsb = data ? lower_32_bits(__psp_pa(data)) : 0;
- phys_msb = data ? upper_32_bits(__psp_pa(data)) : 0;
-
-- dev_dbg(psp->dev, "sev command id %#x buffer 0x%08x%08x\n",
-- cmd, phys_msb, phys_lsb);
-+ dev_dbg(psp->dev, "sev command id %#x buffer 0x%08x%08x timeout %us\n",
-+ cmd, phys_msb, phys_lsb, psp_timeout);
-
- print_hex_dump_debug("(in): ", DUMP_PREFIX_OFFSET, 16, 2, data,
- sev_cmd_buffer_len(cmd), false);
-@@ -154,7 +177,18 @@ static int __sev_do_cmd_locked(int cmd, void *data, int *psp_ret)
- iowrite32(reg, psp->io_regs + psp->vdata->cmdresp_reg);
-
- /* wait for command completion */
-- sev_wait_cmd_ioc(psp, &reg);
-+ ret = sev_wait_cmd_ioc(psp, &reg, psp_timeout);
-+ if (ret) {
-+ if (psp_ret)
-+ *psp_ret = 0;
-+
-+ dev_err(psp->dev, "sev command %#x timed out, disabling PSP \n", cmd);
-+ psp_dead = true;
-+
-+ return ret;
-+ }
-+
-+ psp_timeout = psp_cmd_timeout;
-
- if (psp_ret)
- *psp_ret = reg & PSP_CMDRESP_ERR_MASK;
-@@ -888,6 +922,8 @@ void psp_pci_init(void)
-
- psp_master = sp->psp_data;
-
-+ psp_timeout = psp_probe_timeout;
-+
- if (sev_get_api_version())
- goto err;
-
---
-2.7.4
-