|
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 |
|