Tony Jones f602eb
From: Rashmica Gupta <rashmica.g@gmail.com>
Tony Jones f602eb
Date: Thu, 7 Jul 2022 16:37:17 +0200
Tony Jones f602eb
Subject: powerpc/perf: Use PVR rather than oprofile field to determine CPU
Tony Jones f602eb
 version
Tony Jones f602eb
Git-commit: ec3eb9d941a98f4c0dac263110729680a734279b
Tony Jones f602eb
Patch-mainline: v6.0-rc1
Tony Jones f602eb
References: jsc#PED-557
Tony Jones f602eb
Tony Jones f602eb
Currently the perf CPU backend drivers detect what CPU they're on using
Tony Jones f602eb
cur_cpu_spec->oprofile_cpu_type.
Tony Jones f602eb
Tony Jones f602eb
Although that works, it's a bit crufty to be using oprofile related fields,
Tony Jones f602eb
especially seeing as oprofile is more or less unused these days.
Tony Jones f602eb
Tony Jones f602eb
It also means perf is reliant on the fragile logic in setup_cpu_spec()
Tony Jones f602eb
which detects when we're using a logical PVR and copies back the PMU
Tony Jones f602eb
related fields from the raw CPU entry. So lets check the PVR directly.
Tony Jones f602eb
Tony Jones f602eb
Suggested-by: Michael Ellerman <mpe@ellerman.id.au>
Tony Jones f602eb
Signed-off-by: Rashmica Gupta <rashmica.g@gmail.com>
Tony Jones f602eb
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Tony Jones f602eb
Reviewed-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
Tony Jones f602eb
[chleroy: Added power10 and fixed checkpatch issues]
Tony Jones f602eb
Reviewed-and-tested-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Tony Jones f602eb
Reviewed-and-tested-By: Kajol Jain <kjain@linux.ibm.com> [For 24x7 side changes]
Tony Jones f602eb
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Tony Jones f602eb
Link: https://lore.kernel.org/r/20c0ee7f99dbf0dbf8658df6b39f84753e6db1ef.1657204631.git.christophe.leroy@csgroup.eu
Tony Jones f602eb
Tony Jones f602eb
Signed-off-by: Tony Jones <tonyj@suse.de>
Tony Jones f602eb
---
Tony Jones f602eb
 arch/powerpc/perf/e500-pmu.c    | 9 +++++----
Tony Jones f602eb
 arch/powerpc/perf/e6500-pmu.c   | 5 +++--
Tony Jones f602eb
 arch/powerpc/perf/hv-24x7.c     | 6 +++---
Tony Jones f602eb
 arch/powerpc/perf/mpc7450-pmu.c | 5 +++--
Tony Jones f602eb
 arch/powerpc/perf/power10-pmu.c | 6 ++----
Tony Jones f602eb
 arch/powerpc/perf/power5+-pmu.c | 6 +++---
Tony Jones f602eb
 arch/powerpc/perf/power5-pmu.c  | 5 +++--
Tony Jones f602eb
 arch/powerpc/perf/power6-pmu.c  | 5 +++--
Tony Jones f602eb
 arch/powerpc/perf/power7-pmu.c  | 7 ++++---
Tony Jones f602eb
 arch/powerpc/perf/power8-pmu.c  | 5 +++--
Tony Jones f602eb
 arch/powerpc/perf/power9-pmu.c  | 4 +---
Tony Jones f602eb
 arch/powerpc/perf/ppc970-pmu.c  | 7 ++++---
Tony Jones f602eb
 12 files changed, 37 insertions(+), 33 deletions(-)
Tony Jones f602eb
Tony Jones f602eb
diff --git a/arch/powerpc/perf/e500-pmu.c b/arch/powerpc/perf/e500-pmu.c
Tony Jones f602eb
index a59c33bed32a..e3e1a68eb1d5 100644
Tony Jones f602eb
--- a/arch/powerpc/perf/e500-pmu.c
Tony Jones f602eb
+++ b/arch/powerpc/perf/e500-pmu.c
Tony Jones f602eb
@@ -118,12 +118,13 @@ static struct fsl_emb_pmu e500_pmu = {
Tony Jones f602eb
 
Tony Jones f602eb
 static int init_e500_pmu(void)
Tony Jones f602eb
 {
Tony Jones f602eb
-	if (!cur_cpu_spec->oprofile_cpu_type)
Tony Jones f602eb
-		return -ENODEV;
Tony Jones f602eb
+	unsigned int pvr = mfspr(SPRN_PVR);
Tony Jones f602eb
 
Tony Jones f602eb
-	if (!strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc/e500mc"))
Tony Jones f602eb
+	/* ec500mc */
Tony Jones f602eb
+	if (PVR_VER(pvr) == PVR_VER_E500MC || PVR_VER(pvr) == PVR_VER_E5500)
Tony Jones f602eb
 		num_events = 256;
Tony Jones f602eb
-	else if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc/e500"))
Tony Jones f602eb
+	/* e500 */
Tony Jones f602eb
+	else if (PVR_VER(pvr) != PVR_VER_E500V1 && PVR_VER(pvr) != PVR_VER_E500V2)
Tony Jones f602eb
 		return -ENODEV;
Tony Jones f602eb
 
Tony Jones f602eb
 	return register_fsl_emb_pmu(&e500_pmu);
Tony Jones f602eb
diff --git a/arch/powerpc/perf/e6500-pmu.c b/arch/powerpc/perf/e6500-pmu.c
Tony Jones f602eb
index 44ad65da82ed..bd779a2338f8 100644
Tony Jones f602eb
--- a/arch/powerpc/perf/e6500-pmu.c
Tony Jones f602eb
+++ b/arch/powerpc/perf/e6500-pmu.c
Tony Jones f602eb
@@ -107,8 +107,9 @@ static struct fsl_emb_pmu e6500_pmu = {
Tony Jones f602eb
 
Tony Jones f602eb
 static int init_e6500_pmu(void)
Tony Jones f602eb
 {
Tony Jones f602eb
-	if (!cur_cpu_spec->oprofile_cpu_type ||
Tony Jones f602eb
-		strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc/e6500"))
Tony Jones f602eb
+	unsigned int pvr = mfspr(SPRN_PVR);
Tony Jones f602eb
+
Tony Jones f602eb
+	if (PVR_VER(pvr) != PVR_VER_E6500)
Tony Jones f602eb
 		return -ENODEV;
Tony Jones f602eb
 
Tony Jones f602eb
 	return register_fsl_emb_pmu(&e6500_pmu);
Tony Jones f602eb
diff --git a/arch/powerpc/perf/hv-24x7.c b/arch/powerpc/perf/hv-24x7.c
Tony Jones f602eb
index cf5406b31e27..33c23225fd54 100644
Tony Jones f602eb
--- a/arch/powerpc/perf/hv-24x7.c
Tony Jones f602eb
+++ b/arch/powerpc/perf/hv-24x7.c
Tony Jones f602eb
@@ -1718,16 +1718,16 @@ static int hv_24x7_init(void)
Tony Jones f602eb
 {
Tony Jones f602eb
 	int r;
Tony Jones f602eb
 	unsigned long hret;
Tony Jones f602eb
+	unsigned int pvr = mfspr(SPRN_PVR);
Tony Jones f602eb
 	struct hv_perf_caps caps;
Tony Jones f602eb
 
Tony Jones f602eb
 	if (!firmware_has_feature(FW_FEATURE_LPAR)) {
Tony Jones f602eb
 		pr_debug("not a virtualized system, not enabling\n");
Tony Jones f602eb
 		return -ENODEV;
Tony Jones f602eb
-	} else if (!cur_cpu_spec->oprofile_cpu_type)
Tony Jones f602eb
-		return -ENODEV;
Tony Jones f602eb
+	}
Tony Jones f602eb
 
Tony Jones f602eb
 	/* POWER8 only supports v1, while POWER9 only supports v2. */
Tony Jones f602eb
-	if (!strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power8"))
Tony Jones f602eb
+	if (PVR_VER(pvr) == PVR_POWER8)
Tony Jones f602eb
 		interface_version = 1;
Tony Jones f602eb
 	else {
Tony Jones f602eb
 		interface_version = 2;
Tony Jones f602eb
diff --git a/arch/powerpc/perf/mpc7450-pmu.c b/arch/powerpc/perf/mpc7450-pmu.c
Tony Jones f602eb
index e39b15b79a83..552d51a925d3 100644
Tony Jones f602eb
--- a/arch/powerpc/perf/mpc7450-pmu.c
Tony Jones f602eb
+++ b/arch/powerpc/perf/mpc7450-pmu.c
Tony Jones f602eb
@@ -417,8 +417,9 @@ struct power_pmu mpc7450_pmu = {
Tony Jones f602eb
 
Tony Jones f602eb
 static int __init init_mpc7450_pmu(void)
Tony Jones f602eb
 {
Tony Jones f602eb
-	if (!cur_cpu_spec->oprofile_cpu_type ||
Tony Jones f602eb
-	    strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc/7450"))
Tony Jones f602eb
+	unsigned int pvr = mfspr(SPRN_PVR);
Tony Jones f602eb
+
Tony Jones f602eb
+	if (PVR_VER(pvr) != PVR_7450)
Tony Jones f602eb
 		return -ENODEV;
Tony Jones f602eb
 
Tony Jones f602eb
 	return register_power_pmu(&mpc7450_pmu);
Tony Jones f602eb
diff --git a/arch/powerpc/perf/power10-pmu.c b/arch/powerpc/perf/power10-pmu.c
Tony Jones f602eb
index d1adcd9f52e2..403ba3a69512 100644
Tony Jones f602eb
--- a/arch/powerpc/perf/power10-pmu.c
Tony Jones f602eb
+++ b/arch/powerpc/perf/power10-pmu.c
Tony Jones f602eb
@@ -607,12 +607,10 @@ int __init init_power10_pmu(void)
Tony Jones f602eb
 	unsigned int pvr;
Tony Jones f602eb
 	int rc;
Tony Jones f602eb
 
Tony Jones f602eb
-	/* Comes from cpu_specs[] */
Tony Jones f602eb
-	if (!cur_cpu_spec->oprofile_cpu_type ||
Tony Jones f602eb
-	    strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power10"))
Tony Jones f602eb
+	pvr = mfspr(SPRN_PVR);
Tony Jones f602eb
+	if (PVR_VER(pvr) != PVR_POWER10)
Tony Jones f602eb
 		return -ENODEV;
Tony Jones f602eb
 
Tony Jones f602eb
-	pvr = mfspr(SPRN_PVR);
Tony Jones f602eb
 	/* Add the ppmu flag for power10 DD1 */
Tony Jones f602eb
 	if ((PVR_CFG(pvr) == 1))
Tony Jones f602eb
 		power10_pmu.flags |= PPMU_P10_DD1;
Tony Jones f602eb
diff --git a/arch/powerpc/perf/power5+-pmu.c b/arch/powerpc/perf/power5+-pmu.c
Tony Jones f602eb
index 753b4740ef64..b4708ab73145 100644
Tony Jones f602eb
--- a/arch/powerpc/perf/power5+-pmu.c
Tony Jones f602eb
+++ b/arch/powerpc/perf/power5+-pmu.c
Tony Jones f602eb
@@ -679,9 +679,9 @@ static struct power_pmu power5p_pmu = {
Tony Jones f602eb
 
Tony Jones f602eb
 int __init init_power5p_pmu(void)
Tony Jones f602eb
 {
Tony Jones f602eb
-	if (!cur_cpu_spec->oprofile_cpu_type ||
Tony Jones f602eb
-	    (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5+")
Tony Jones f602eb
-	     && strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5++")))
Tony Jones f602eb
+	unsigned int pvr = mfspr(SPRN_PVR);
Tony Jones f602eb
+
Tony Jones f602eb
+	if (PVR_VER(pvr) != PVR_POWER5p)
Tony Jones f602eb
 		return -ENODEV;
Tony Jones f602eb
 
Tony Jones f602eb
 	return register_power_pmu(&power5p_pmu);
Tony Jones f602eb
diff --git a/arch/powerpc/perf/power5-pmu.c b/arch/powerpc/perf/power5-pmu.c
Tony Jones f602eb
index 1f83c4cba0aa..c6aefd0a1cc8 100644
Tony Jones f602eb
--- a/arch/powerpc/perf/power5-pmu.c
Tony Jones f602eb
+++ b/arch/powerpc/perf/power5-pmu.c
Tony Jones f602eb
@@ -620,8 +620,9 @@ static struct power_pmu power5_pmu = {
Tony Jones f602eb
 
Tony Jones f602eb
 int __init init_power5_pmu(void)
Tony Jones f602eb
 {
Tony Jones f602eb
-	if (!cur_cpu_spec->oprofile_cpu_type ||
Tony Jones f602eb
-	    strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5"))
Tony Jones f602eb
+	unsigned int pvr = mfspr(SPRN_PVR);
Tony Jones f602eb
+
Tony Jones f602eb
+	if (PVR_VER(pvr) != PVR_POWER5)
Tony Jones f602eb
 		return -ENODEV;
Tony Jones f602eb
 
Tony Jones f602eb
 	return register_power_pmu(&power5_pmu);
Tony Jones f602eb
diff --git a/arch/powerpc/perf/power6-pmu.c b/arch/powerpc/perf/power6-pmu.c
Tony Jones f602eb
index aec746f86804..5729b6e059de 100644
Tony Jones f602eb
--- a/arch/powerpc/perf/power6-pmu.c
Tony Jones f602eb
+++ b/arch/powerpc/perf/power6-pmu.c
Tony Jones f602eb
@@ -541,8 +541,9 @@ static struct power_pmu power6_pmu = {
Tony Jones f602eb
 
Tony Jones f602eb
 int __init init_power6_pmu(void)
Tony Jones f602eb
 {
Tony Jones f602eb
-	if (!cur_cpu_spec->oprofile_cpu_type ||
Tony Jones f602eb
-	    strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power6"))
Tony Jones f602eb
+	unsigned int pvr = mfspr(SPRN_PVR);
Tony Jones f602eb
+
Tony Jones f602eb
+	if (PVR_VER(pvr) != PVR_POWER6)
Tony Jones f602eb
 		return -ENODEV;
Tony Jones f602eb
 
Tony Jones f602eb
 	return register_power_pmu(&power6_pmu);
Tony Jones f602eb
diff --git a/arch/powerpc/perf/power7-pmu.c b/arch/powerpc/perf/power7-pmu.c
Tony Jones f602eb
index a74211410b8d..c95ccf2e28da 100644
Tony Jones f602eb
--- a/arch/powerpc/perf/power7-pmu.c
Tony Jones f602eb
+++ b/arch/powerpc/perf/power7-pmu.c
Tony Jones f602eb
@@ -447,11 +447,12 @@ static struct power_pmu power7_pmu = {
Tony Jones f602eb
 
Tony Jones f602eb
 int __init init_power7_pmu(void)
Tony Jones f602eb
 {
Tony Jones f602eb
-	if (!cur_cpu_spec->oprofile_cpu_type ||
Tony Jones f602eb
-	    strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power7"))
Tony Jones f602eb
+	unsigned int pvr = mfspr(SPRN_PVR);
Tony Jones f602eb
+
Tony Jones f602eb
+	if (PVR_VER(pvr) != PVR_POWER7 && PVR_VER(pvr) != PVR_POWER7p)
Tony Jones f602eb
 		return -ENODEV;
Tony Jones f602eb
 
Tony Jones f602eb
-	if (pvr_version_is(PVR_POWER7p))
Tony Jones f602eb
+	if (PVR_VER(pvr) == PVR_POWER7p)
Tony Jones f602eb
 		power7_pmu.flags |= PPMU_SIAR_VALID;
Tony Jones f602eb
 
Tony Jones f602eb
 	return register_power_pmu(&power7_pmu);
Tony Jones f602eb
diff --git a/arch/powerpc/perf/power8-pmu.c b/arch/powerpc/perf/power8-pmu.c
Tony Jones f602eb
index 2518f5375d4a..ef9685065aaf 100644
Tony Jones f602eb
--- a/arch/powerpc/perf/power8-pmu.c
Tony Jones f602eb
+++ b/arch/powerpc/perf/power8-pmu.c
Tony Jones f602eb
@@ -391,9 +391,10 @@ static struct power_pmu power8_pmu = {
Tony Jones f602eb
 int __init init_power8_pmu(void)
Tony Jones f602eb
 {
Tony Jones f602eb
 	int rc;
Tony Jones f602eb
+	unsigned int pvr = mfspr(SPRN_PVR);
Tony Jones f602eb
 
Tony Jones f602eb
-	if (!cur_cpu_spec->oprofile_cpu_type ||
Tony Jones f602eb
-	    strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power8"))
Tony Jones f602eb
+	if (PVR_VER(pvr) != PVR_POWER8E && PVR_VER(pvr) != PVR_POWER8NVL &&
Tony Jones f602eb
+	    PVR_VER(pvr) != PVR_POWER8)
Tony Jones f602eb
 		return -ENODEV;
Tony Jones f602eb
 
Tony Jones f602eb
 	rc = register_power_pmu(&power8_pmu);
Tony Jones f602eb
diff --git a/arch/powerpc/perf/power9-pmu.c b/arch/powerpc/perf/power9-pmu.c
Tony Jones f602eb
index bc6d76bce97b..cb6a7dc02dd7 100644
Tony Jones f602eb
--- a/arch/powerpc/perf/power9-pmu.c
Tony Jones f602eb
+++ b/arch/powerpc/perf/power9-pmu.c
Tony Jones f602eb
@@ -467,9 +467,7 @@ int __init init_power9_pmu(void)
Tony Jones f602eb
 	int rc = 0;
Tony Jones f602eb
 	unsigned int pvr = mfspr(SPRN_PVR);
Tony Jones f602eb
 
Tony Jones f602eb
-	/* Comes from cpu_specs[] */
Tony Jones f602eb
-	if (!cur_cpu_spec->oprofile_cpu_type ||
Tony Jones f602eb
-	    strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power9"))
Tony Jones f602eb
+	if (PVR_VER(pvr) != PVR_POWER9)
Tony Jones f602eb
 		return -ENODEV;
Tony Jones f602eb
 
Tony Jones f602eb
 	/* Blacklist events */
Tony Jones f602eb
diff --git a/arch/powerpc/perf/ppc970-pmu.c b/arch/powerpc/perf/ppc970-pmu.c
Tony Jones f602eb
index 09802482ba72..762676fb839e 100644
Tony Jones f602eb
--- a/arch/powerpc/perf/ppc970-pmu.c
Tony Jones f602eb
+++ b/arch/powerpc/perf/ppc970-pmu.c
Tony Jones f602eb
@@ -491,9 +491,10 @@ static struct power_pmu ppc970_pmu = {
Tony Jones f602eb
 
Tony Jones f602eb
 int __init init_ppc970_pmu(void)
Tony Jones f602eb
 {
Tony Jones f602eb
-	if (!cur_cpu_spec->oprofile_cpu_type ||
Tony Jones f602eb
-	    (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/970")
Tony Jones f602eb
-	     && strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/970MP")))
Tony Jones f602eb
+	unsigned int pvr = mfspr(SPRN_PVR);
Tony Jones f602eb
+
Tony Jones f602eb
+	if (PVR_VER(pvr) != PVR_970 && PVR_VER(pvr) != PVR_970MP &&
Tony Jones f602eb
+	    PVR_VER(pvr) != PVR_970FX && PVR_VER(pvr) != PVR_970GX)
Tony Jones f602eb
 		return -ENODEV;
Tony Jones f602eb
 
Tony Jones f602eb
 	return register_power_pmu(&ppc970_pmu);
Tony Jones f602eb