Commit 0637deeb authored by hanliyang's avatar hanliyang
Browse files

crypto: ccp: Support DOWNLOAD_FIRMWARE when detect CSV

hygon inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I98VXP


CVE: NA

---------------------------

When ccp driver detect CSV support on Hygon CPU, it should try to
update the latest CSV firmware on the system paths.

Signed-off-by: default avatarhanliyang <hanliyang@hygon.cn>
parent 7f1817c1
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -12,10 +12,17 @@

#include <linux/fs.h>

#define CSV_FW_FILE		"hygon/csv.fw"

extern u32 hygon_csv_build;
extern const struct file_operations csv_fops;

void csv_update_api_version(struct sev_user_data_status *status);
int csv_cmd_buffer_len(int cmd);

static inline bool csv_version_greater_or_equal(u32 build)
{
	return hygon_csv_build >= build;
}

#endif	/* __CCP_HYGON_CSV_DEV_H__ */
+16 −4
Original line number Diff line number Diff line
@@ -758,6 +758,14 @@ static int sev_get_firmware(struct device *dev,
	char fw_name_specific[SEV_FW_NAME_SIZE];
	char fw_name_subset[SEV_FW_NAME_SIZE];

	if (is_vendor_hygon()) {
		/* Check for CSV FW to using generic name: csv.fw */
		if (firmware_request_nowarn(firmware, CSV_FW_FILE, dev) >= 0)
			return 0;
		else
			return -ENOENT;
	}

	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);
@@ -796,13 +804,15 @@ static int sev_update_firmware(struct device *dev)
	struct page *p;
	u64 data_size;

	if (!sev_version_greater_or_equal(0, 15)) {
	if (!sev_version_greater_or_equal(0, 15) &&
	    !(is_vendor_hygon() && csv_version_greater_or_equal(1667))) {
		dev_dbg(dev, "DOWNLOAD_FIRMWARE not supported\n");
		return -1;
	}

	if (sev_get_firmware(dev, &firmware) == -ENOENT) {
		dev_dbg(dev, "No SEV firmware file present\n");
		dev_dbg(dev, "No %s firmware file present\n",
			is_vendor_hygon() ? "CSV" : "SEV");
		return -1;
	}

@@ -842,9 +852,11 @@ static int sev_update_firmware(struct device *dev)
		ret = sev_do_cmd(SEV_CMD_DOWNLOAD_FIRMWARE, data, &error);

	if (ret)
		dev_dbg(dev, "Failed to update SEV firmware: %#x\n", error);
		dev_dbg(dev, "Failed to update %s firmware: %#x\n",
			is_vendor_hygon() ? "CSV" : "SEV", error);
	else
		dev_info(dev, "SEV firmware update successful\n");
		dev_info(dev, "%s firmware update successful\n",
			 is_vendor_hygon() ? "CSV" : "SEV");

	__free_pages(p, order);