Commit e818a9a2 authored by Srinivas Pandruvada's avatar Srinivas Pandruvada Committed by Jia, Yingbao
Browse files

platform/x86/intel/tpmi: Check major version change for TPMI Information

mainline inclusion
from mainline-v6.10
commit 59eb0814d6a3541f55b1d6e3d52df1226de41f3e
category: bugfix
bugzilla: https://gitee.com/openeuler/intel-kernel/issues/IB6QCJ
CVE: NA
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=59eb0814d6a3541f55b1d6e3d52df1226de41f3e



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

Intel-SIG: commit 59eb0814d6a3 platform/x86/intel/tpmi: Check major version change for TPMI Information.
Backport intel tpmi base driver update for 6.6 from 6.10

Check the major version from TPMI information header and fail to load
driver if the version is not supported.

Signed-off-by: default avatarSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Reviewed-by: default avatarIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Link: https://lore.kernel.org/r/20240423204619.3946901-3-srinivas.pandruvada@linux.intel.com


Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
[ Yingbao Jia: amend commit log ]
Signed-off-by: default avatarYingbao Jia <yingbao.jia@intel.com>
parent 9dc1c8b0
Loading
Loading
Loading
Loading
+13 −4
Original line number Diff line number Diff line
@@ -665,28 +665,37 @@ static int tpmi_create_devices(struct intel_tpmi_info *tpmi_info)
}

#define TPMI_INFO_BUS_INFO_OFFSET	0x08
#define TPMI_INFO_MAJOR_VERSION		0x00

static int tpmi_process_info(struct intel_tpmi_info *tpmi_info,
			     struct intel_tpmi_pm_feature *pfs)
{
	struct tpmi_info_header header;
	void __iomem *info_mem;
	u64 feature_header;
	int ret = 0;

	info_mem = ioremap(pfs->vsec_offset + TPMI_INFO_BUS_INFO_OFFSET,
			   pfs->pfs_header.entry_size * sizeof(u32) - TPMI_INFO_BUS_INFO_OFFSET);
	info_mem = ioremap(pfs->vsec_offset, pfs->pfs_header.entry_size * sizeof(u32));
	if (!info_mem)
		return -ENOMEM;

	memcpy_fromio(&header, info_mem, sizeof(header));
	feature_header = readq(info_mem);
	if (TPMI_MAJOR_VERSION(feature_header) != TPMI_INFO_MAJOR_VERSION) {
		ret = -ENODEV;
		goto error_info_header;
	}

	memcpy_fromio(&header, info_mem + TPMI_INFO_BUS_INFO_OFFSET, sizeof(header));

	tpmi_info->plat_info.package_id = header.pkg;
	tpmi_info->plat_info.bus_number = header.bus;
	tpmi_info->plat_info.device_number = header.dev;
	tpmi_info->plat_info.function_number = header.fn;

error_info_header:
	iounmap(info_mem);

	return 0;
	return ret;
}

static int tpmi_fetch_pfs_header(struct intel_tpmi_pm_feature *pfs, u64 start, int size)