Skip to content

Commit

Permalink
powerpc/perf: Use PVR rather than oprofile field to determine CPU ver…
Browse files Browse the repository at this point in the history
…sion

Currently the perf CPU backend drivers detect what CPU they're on using
cur_cpu_spec->oprofile_cpu_type.

Although that works, it's a bit crufty to be using oprofile related fields,
especially seeing as oprofile is more or less unused these days.

It also means perf is reliant on the fragile logic in setup_cpu_spec()
which detects when we're using a logical PVR and copies back the PMU
related fields from the raw CPU entry. So lets check the PVR directly.

Suggested-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Rashmica Gupta <rashmica.g@gmail.com>
Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Reviewed-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
[chleroy: Added power10 and fixed checkpatch issues]
Reviewed-and-tested-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Reviewed-and-tested-By: Kajol Jain <kjain@linux.ibm.com> [For 24x7 side changes]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20c0ee7f99dbf0dbf8658df6b39f84753e6db1ef.1657204631.git.christophe.leroy@csgroup.eu
  • Loading branch information
Rashmica Gupta authored and Michael Ellerman committed Jul 27, 2022
1 parent 6042a16 commit ec3eb9d
Show file tree
Hide file tree
Showing 12 changed files with 37 additions and 33 deletions.
9 changes: 5 additions & 4 deletions arch/powerpc/perf/e500-pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,12 +118,13 @@ static struct fsl_emb_pmu e500_pmu = {

static int init_e500_pmu(void)
{
if (!cur_cpu_spec->oprofile_cpu_type)
return -ENODEV;
unsigned int pvr = mfspr(SPRN_PVR);

if (!strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc/e500mc"))
/* ec500mc */
if (PVR_VER(pvr) == PVR_VER_E500MC || PVR_VER(pvr) == PVR_VER_E5500)
num_events = 256;
else if (strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc/e500"))
/* e500 */
else if (PVR_VER(pvr) != PVR_VER_E500V1 && PVR_VER(pvr) != PVR_VER_E500V2)
return -ENODEV;

return register_fsl_emb_pmu(&e500_pmu);
Expand Down
5 changes: 3 additions & 2 deletions arch/powerpc/perf/e6500-pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,9 @@ static struct fsl_emb_pmu e6500_pmu = {

static int init_e6500_pmu(void)
{
if (!cur_cpu_spec->oprofile_cpu_type ||
strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc/e6500"))
unsigned int pvr = mfspr(SPRN_PVR);

if (PVR_VER(pvr) != PVR_VER_E6500)
return -ENODEV;

return register_fsl_emb_pmu(&e6500_pmu);
Expand Down
6 changes: 3 additions & 3 deletions arch/powerpc/perf/hv-24x7.c
Original file line number Diff line number Diff line change
Expand Up @@ -1718,16 +1718,16 @@ static int hv_24x7_init(void)
{
int r;
unsigned long hret;
unsigned int pvr = mfspr(SPRN_PVR);
struct hv_perf_caps caps;

if (!firmware_has_feature(FW_FEATURE_LPAR)) {
pr_debug("not a virtualized system, not enabling\n");
return -ENODEV;
} else if (!cur_cpu_spec->oprofile_cpu_type)
return -ENODEV;
}

/* POWER8 only supports v1, while POWER9 only supports v2. */
if (!strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power8"))
if (PVR_VER(pvr) == PVR_POWER8)
interface_version = 1;
else {
interface_version = 2;
Expand Down
5 changes: 3 additions & 2 deletions arch/powerpc/perf/mpc7450-pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -417,8 +417,9 @@ struct power_pmu mpc7450_pmu = {

static int __init init_mpc7450_pmu(void)
{
if (!cur_cpu_spec->oprofile_cpu_type ||
strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc/7450"))
unsigned int pvr = mfspr(SPRN_PVR);

if (PVR_VER(pvr) != PVR_7450)
return -ENODEV;

return register_power_pmu(&mpc7450_pmu);
Expand Down
6 changes: 2 additions & 4 deletions arch/powerpc/perf/power10-pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -607,12 +607,10 @@ int __init init_power10_pmu(void)
unsigned int pvr;
int rc;

/* Comes from cpu_specs[] */
if (!cur_cpu_spec->oprofile_cpu_type ||
strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power10"))
pvr = mfspr(SPRN_PVR);
if (PVR_VER(pvr) != PVR_POWER10)
return -ENODEV;

pvr = mfspr(SPRN_PVR);
/* Add the ppmu flag for power10 DD1 */
if ((PVR_CFG(pvr) == 1))
power10_pmu.flags |= PPMU_P10_DD1;
Expand Down
6 changes: 3 additions & 3 deletions arch/powerpc/perf/power5+-pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -679,9 +679,9 @@ static struct power_pmu power5p_pmu = {

int __init init_power5p_pmu(void)
{
if (!cur_cpu_spec->oprofile_cpu_type ||
(strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5+")
&& strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5++")))
unsigned int pvr = mfspr(SPRN_PVR);

if (PVR_VER(pvr) != PVR_POWER5p)
return -ENODEV;

return register_power_pmu(&power5p_pmu);
Expand Down
5 changes: 3 additions & 2 deletions arch/powerpc/perf/power5-pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -620,8 +620,9 @@ static struct power_pmu power5_pmu = {

int __init init_power5_pmu(void)
{
if (!cur_cpu_spec->oprofile_cpu_type ||
strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power5"))
unsigned int pvr = mfspr(SPRN_PVR);

if (PVR_VER(pvr) != PVR_POWER5)
return -ENODEV;

return register_power_pmu(&power5_pmu);
Expand Down
5 changes: 3 additions & 2 deletions arch/powerpc/perf/power6-pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -541,8 +541,9 @@ static struct power_pmu power6_pmu = {

int __init init_power6_pmu(void)
{
if (!cur_cpu_spec->oprofile_cpu_type ||
strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power6"))
unsigned int pvr = mfspr(SPRN_PVR);

if (PVR_VER(pvr) != PVR_POWER6)
return -ENODEV;

return register_power_pmu(&power6_pmu);
Expand Down
7 changes: 4 additions & 3 deletions arch/powerpc/perf/power7-pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -447,11 +447,12 @@ static struct power_pmu power7_pmu = {

int __init init_power7_pmu(void)
{
if (!cur_cpu_spec->oprofile_cpu_type ||
strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power7"))
unsigned int pvr = mfspr(SPRN_PVR);

if (PVR_VER(pvr) != PVR_POWER7 && PVR_VER(pvr) != PVR_POWER7p)
return -ENODEV;

if (pvr_version_is(PVR_POWER7p))
if (PVR_VER(pvr) == PVR_POWER7p)
power7_pmu.flags |= PPMU_SIAR_VALID;

return register_power_pmu(&power7_pmu);
Expand Down
5 changes: 3 additions & 2 deletions arch/powerpc/perf/power8-pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -391,9 +391,10 @@ static struct power_pmu power8_pmu = {
int __init init_power8_pmu(void)
{
int rc;
unsigned int pvr = mfspr(SPRN_PVR);

if (!cur_cpu_spec->oprofile_cpu_type ||
strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power8"))
if (PVR_VER(pvr) != PVR_POWER8E && PVR_VER(pvr) != PVR_POWER8NVL &&
PVR_VER(pvr) != PVR_POWER8)
return -ENODEV;

rc = register_power_pmu(&power8_pmu);
Expand Down
4 changes: 1 addition & 3 deletions arch/powerpc/perf/power9-pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -467,9 +467,7 @@ int __init init_power9_pmu(void)
int rc = 0;
unsigned int pvr = mfspr(SPRN_PVR);

/* Comes from cpu_specs[] */
if (!cur_cpu_spec->oprofile_cpu_type ||
strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/power9"))
if (PVR_VER(pvr) != PVR_POWER9)
return -ENODEV;

/* Blacklist events */
Expand Down
7 changes: 4 additions & 3 deletions arch/powerpc/perf/ppc970-pmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -491,9 +491,10 @@ static struct power_pmu ppc970_pmu = {

int __init init_ppc970_pmu(void)
{
if (!cur_cpu_spec->oprofile_cpu_type ||
(strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/970")
&& strcmp(cur_cpu_spec->oprofile_cpu_type, "ppc64/970MP")))
unsigned int pvr = mfspr(SPRN_PVR);

if (PVR_VER(pvr) != PVR_970 && PVR_VER(pvr) != PVR_970MP &&
PVR_VER(pvr) != PVR_970FX && PVR_VER(pvr) != PVR_970GX)
return -ENODEV;

return register_power_pmu(&ppc970_pmu);
Expand Down

0 comments on commit ec3eb9d

Please sign in to comment.