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

platform/x86/intel-uncore-freq: Process read/write blocked feature status

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



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

Intel-SIG: commit b06458d1b1cb platform/x86/intel-uncore-freq: Process read/write blocked feature status.
Backport Intel-uncore-freq driver support for 6.6 from 6.11.

When a feature is read blocked, don't continue to read uncore information
and register with uncore core.

When the feature is write blocked, continue to offer read interface but
block setting uncore limits.

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/20231204221740.3645130-6-srinivas.pandruvada@linux.intel.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 0306ad73
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ struct tpmi_uncore_struct {
	int min_ratio;
	struct tpmi_uncore_power_domain_info *pd_info;
	struct tpmi_uncore_cluster_info root_cluster;
	bool write_blocked;
};

#define UNCORE_GENMASK_MIN_RATIO	GENMASK_ULL(21, 15)
@@ -157,6 +158,9 @@ static int uncore_write_control_freq(struct uncore_data *data, unsigned int inpu
	cluster_info = container_of(data, struct tpmi_uncore_cluster_info, uncore_data);
	uncore_root = cluster_info->uncore_root;

	if (uncore_root->write_blocked)
		return -EPERM;

	/* Update each cluster in a package */
	if (cluster_info->root_domain) {
		struct tpmi_uncore_struct *uncore_root = cluster_info->uncore_root;
@@ -233,12 +237,22 @@ static void remove_cluster_entries(struct tpmi_uncore_struct *tpmi_uncore)

static int uncore_probe(struct auxiliary_device *auxdev, const struct auxiliary_device_id *id)
{
	bool read_blocked = 0, write_blocked = 0;
	struct intel_tpmi_plat_info *plat_info;
	struct tpmi_uncore_struct *tpmi_uncore;
	bool uncore_sysfs_added = false;
	int ret, i, pkg = 0;
	int num_resources;

	ret = tpmi_get_feature_status(auxdev, TPMI_ID_UNCORE, &read_blocked, &write_blocked);
	if (ret)
		dev_info(&auxdev->dev, "Can't read feature status: ignoring blocked status\n");

	if (read_blocked) {
		dev_info(&auxdev->dev, "Firmware has blocked reads, exiting\n");
		return -ENODEV;
	}

	/* Get number of power domains, which is equal to number of resources */
	num_resources = tpmi_get_resource_count(auxdev);
	if (!num_resources)
@@ -267,6 +281,7 @@ static int uncore_probe(struct auxiliary_device *auxdev, const struct auxiliary_
	}

	tpmi_uncore->power_domain_count = num_resources;
	tpmi_uncore->write_blocked = write_blocked;

	/* Get the package ID from the TPMI core */
	plat_info = tpmi_get_platform_data(auxdev);