aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0129-crypto-ccp-Allow-SEV-firmware-to-be-chosen-based-on-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0129-crypto-ccp-Allow-SEV-firmware-to-be-chosen-based-on-.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0129-crypto-ccp-Allow-SEV-firmware-to-be-chosen-based-on-.patch99
1 files changed, 99 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0129-crypto-ccp-Allow-SEV-firmware-to-be-chosen-based-on-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0129-crypto-ccp-Allow-SEV-firmware-to-be-chosen-based-on-.patch
new file mode 100644
index 00000000..a7b50496
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0129-crypto-ccp-Allow-SEV-firmware-to-be-chosen-based-on-.patch
@@ -0,0 +1,99 @@
+From 03e12867a4dad629e3b1695a2049ebacd2229134 Mon Sep 17 00:00:00 2001
+From: Janakarajan Natarajan <Janakarajan.Natarajan@amd.com>
+Date: Fri, 14 Sep 2018 17:32:04 -0500
+Subject: [PATCH 129/131] crypto: ccp - Allow SEV firmware to be chosen based
+ on Family and Model
+
+During PSP initialization, there is an attempt to update the SEV firmware
+by looking in /lib/firmware/amd/. Currently, sev.fw is the expected name
+of the firmware blob.
+
+This patch will allow for firmware filenames based on the family and
+model of the processor.
+
+Model specific firmware files are given highest priority. Followed by
+firmware for a subset of models. Lastly, failing the previous two options,
+fallback to looking for sev.fw.
+
+Signed-off-by: Janakarajan Natarajan <Janakarajan.Natarajan@amd.com>
+Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>
+Acked-by: Gary R Hook <gary.hook@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 | 44 ++++++++++++++++++++++++++++++++++++++++----
+ 1 file changed, 40 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/crypto/ccp/psp-dev.c b/drivers/crypto/ccp/psp-dev.c
+index f541e60..3571aa2 100644
+--- a/drivers/crypto/ccp/psp-dev.c
++++ b/drivers/crypto/ccp/psp-dev.c
+@@ -31,8 +31,9 @@
+ ((psp_master->api_major) >= _maj && \
+ (psp_master->api_minor) >= _min)
+
+-#define DEVICE_NAME "sev"
+-#define SEV_FW_FILE "amd/sev.fw"
++#define DEVICE_NAME "sev"
++#define SEV_FW_FILE "amd/sev.fw"
++#define SEV_FW_NAME_SIZE 64
+
+ static DEFINE_MUTEX(sev_cmd_mutex);
+ static struct sev_misc_dev *misc_dev;
+@@ -440,6 +441,40 @@ static int sev_get_api_version(void)
+ return 0;
+ }
+
++int sev_get_firmware(struct device *dev, const struct firmware **firmware)
++{
++ char fw_name_specific[SEV_FW_NAME_SIZE];
++ char fw_name_subset[SEV_FW_NAME_SIZE];
++
++ snprintf(fw_name_specific, sizeof(fw_name_specific),
++ "amd/amd_sev_fam%.2xh_model%.2xh.sbin",
++ boot_cpu_data.x86, boot_cpu_data.x86_model);
++
++ snprintf(fw_name_subset, sizeof(fw_name_subset),
++ "amd/amd_sev_fam%.2xh_model%.1xxh.sbin",
++ boot_cpu_data.x86, (boot_cpu_data.x86_model & 0xf0) >> 4);
++
++ /* Check for SEV FW for a particular model.
++ * Ex. amd_sev_fam17h_model00h.sbin for Family 17h Model 00h
++ *
++ * or
++ *
++ * Check for SEV FW common to a subset of models.
++ * Ex. amd_sev_fam17h_model0xh.sbin for
++ * Family 17h Model 00h -- Family 17h Model 0Fh
++ *
++ * or
++ *
++ * Fall-back to using generic name: sev.fw
++ */
++ if ((request_firmware(firmware, fw_name_specific, dev) >= 0) ||
++ (request_firmware(firmware, fw_name_subset, dev) >= 0) ||
++ (request_firmware(firmware, SEV_FW_FILE, dev) >= 0))
++ return 0;
++
++ return -ENOENT;
++}
++
+ /* Don't fail if SEV FW couldn't be updated. Continue with existing SEV FW */
+ static int sev_update_firmware(struct device *dev)
+ {
+@@ -449,9 +484,10 @@ static int sev_update_firmware(struct device *dev)
+ struct page *p;
+ u64 data_size;
+
+- ret = request_firmware(&firmware, SEV_FW_FILE, dev);
+- if (ret < 0)
++ if (sev_get_firmware(dev, &firmware) == -ENOENT) {
++ dev_dbg(dev, "No SEV firmware file present\n");
+ return -1;
++ }
+
+ /*
+ * SEV FW expects the physical address given to it to be 32
+--
+2.7.4
+