Commit fa1a4f11 authored by Zhang Rui's avatar Zhang Rui Committed by Wang, Xiaolong
Browse files

powercap: intel_rapl_tpmi: Fix System Domain probing

mainline inclusion
from mainline-v6.9-rc1
commit 903eb9fb85e32810f376a2858aad77c9298f9488
category: bugfix
bugzilla: https://gitee.com/openeuler/intel-kernel/issues/IA85P6
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=903eb9fb85e32810f376a2858aad77c9298f9488



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

Only domain root packages can enumerate System (Psys) domain.
Whether a package is domain root or not is described in the Bit 0 of the
Domain Info register.

Add support for Domain Info register and fix the System domain probing
accordingly.

Intel-SIG: commit 903eb9fb85e3 powercap: intel_rapl_tpmi: Fix System Domain probing
Backport Intel RAPL driver bugfixes up to upstream v6.9.

Fixes: 9eef7f9d ("powercap: intel_rapl: Introduce RAPL TPMI interface driver")
Signed-off-by: default avatarZhang Rui <rui.zhang@intel.com>
Cc: 6.5+ <stable@vger.kernel.org> # 6.5+
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
[ Xiaolong Wang: amend commit log ]
Signed-off-by: default avatarXiaolong Wang <xiaolong.wang@intel.com>
parent 651fc862
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -131,6 +131,12 @@ static void trp_release(struct tpmi_rapl_package *trp)
	mutex_unlock(&tpmi_rapl_lock);
}

/*
 * Bit 0 of TPMI_RAPL_REG_DOMAIN_INFO indicates if the current package is a domain
 * root or not. Only domain root packages can enumerate System (Psys) Domain.
 */
#define TPMI_RAPL_DOMAIN_ROOT	BIT(0)

static int parse_one_domain(struct tpmi_rapl_package *trp, u32 offset)
{
	u8 tpmi_domain_version;
@@ -140,6 +146,7 @@ static int parse_one_domain(struct tpmi_rapl_package *trp, u32 offset)
	enum rapl_domain_reg_id reg_id;
	int tpmi_domain_size, tpmi_domain_flags;
	u64 tpmi_domain_header = readq(trp->base + offset);
	u64 tpmi_domain_info;

	/* Domain Parent bits are ignored for now */
	tpmi_domain_version = tpmi_domain_header & 0xff;
@@ -170,6 +177,13 @@ static int parse_one_domain(struct tpmi_rapl_package *trp, u32 offset)
		domain_type = RAPL_DOMAIN_PACKAGE;
		break;
	case TPMI_RAPL_DOMAIN_SYSTEM:
		if (!(tpmi_domain_flags & BIT(TPMI_RAPL_REG_DOMAIN_INFO))) {
			pr_warn(FW_BUG "System domain must support Domain Info register\n");
			return -ENODEV;
		}
		tpmi_domain_info = readq(trp->base + offset + TPMI_RAPL_REG_DOMAIN_INFO);
		if (!(tpmi_domain_info & TPMI_RAPL_DOMAIN_ROOT))
			return 0;
		domain_type = RAPL_DOMAIN_PLATFORM;
		break;
	case TPMI_RAPL_DOMAIN_MEMORY: