Commit 5c95c689 authored by Stephane Eranian's avatar Stephane Eranian Committed by Ingo Molnar

perf/x86/rapl: Refactor to share the RAPL code between Intel and AMD CPUs

This patch modifies the rapl_model struct to include architecture specific
knowledge in this previously Intel specific structure, and in particular
it adds the MSR for POWER_UNIT and the rapl_msrs array.

No functional changes.
Signed-off-by: default avatarStephane Eranian <eranian@google.com>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
Link: https://lore.kernel.org/r/20200527224659.206129-3-eranian@google.com
parent fd3ae1e1
...@@ -131,7 +131,9 @@ struct rapl_pmus { ...@@ -131,7 +131,9 @@ struct rapl_pmus {
}; };
struct rapl_model { struct rapl_model {
struct perf_msr *rapl_msrs;
unsigned long events; unsigned long events;
unsigned int msr_power_unit;
bool apply_quirk; bool apply_quirk;
}; };
...@@ -141,7 +143,7 @@ static struct rapl_pmus *rapl_pmus; ...@@ -141,7 +143,7 @@ static struct rapl_pmus *rapl_pmus;
static cpumask_t rapl_cpu_mask; static cpumask_t rapl_cpu_mask;
static unsigned int rapl_cntr_mask; static unsigned int rapl_cntr_mask;
static u64 rapl_timer_ms; static u64 rapl_timer_ms;
static struct perf_msr rapl_msrs[]; static struct perf_msr *rapl_msrs;
static inline struct rapl_pmu *cpu_to_rapl_pmu(unsigned int cpu) static inline struct rapl_pmu *cpu_to_rapl_pmu(unsigned int cpu)
{ {
...@@ -516,7 +518,7 @@ static bool test_msr(int idx, void *data) ...@@ -516,7 +518,7 @@ static bool test_msr(int idx, void *data)
return test_bit(idx, (unsigned long *) data); return test_bit(idx, (unsigned long *) data);
} }
static struct perf_msr rapl_msrs[] = { static struct perf_msr intel_rapl_msrs[] = {
[PERF_RAPL_PP0] = { MSR_PP0_ENERGY_STATUS, &rapl_events_cores_group, test_msr }, [PERF_RAPL_PP0] = { MSR_PP0_ENERGY_STATUS, &rapl_events_cores_group, test_msr },
[PERF_RAPL_PKG] = { MSR_PKG_ENERGY_STATUS, &rapl_events_pkg_group, test_msr }, [PERF_RAPL_PKG] = { MSR_PKG_ENERGY_STATUS, &rapl_events_pkg_group, test_msr },
[PERF_RAPL_RAM] = { MSR_DRAM_ENERGY_STATUS, &rapl_events_ram_group, test_msr }, [PERF_RAPL_RAM] = { MSR_DRAM_ENERGY_STATUS, &rapl_events_ram_group, test_msr },
...@@ -578,13 +580,13 @@ static int rapl_cpu_online(unsigned int cpu) ...@@ -578,13 +580,13 @@ static int rapl_cpu_online(unsigned int cpu)
return 0; return 0;
} }
static int rapl_check_hw_unit(bool apply_quirk) static int rapl_check_hw_unit(struct rapl_model *rm)
{ {
u64 msr_rapl_power_unit_bits; u64 msr_rapl_power_unit_bits;
int i; int i;
/* protect rdmsrl() to handle virtualization */ /* protect rdmsrl() to handle virtualization */
if (rdmsrl_safe(MSR_RAPL_POWER_UNIT, &msr_rapl_power_unit_bits)) if (rdmsrl_safe(rm->msr_power_unit, &msr_rapl_power_unit_bits))
return -1; return -1;
for (i = 0; i < NR_RAPL_DOMAINS; i++) for (i = 0; i < NR_RAPL_DOMAINS; i++)
rapl_hw_unit[i] = (msr_rapl_power_unit_bits >> 8) & 0x1FULL; rapl_hw_unit[i] = (msr_rapl_power_unit_bits >> 8) & 0x1FULL;
...@@ -595,7 +597,7 @@ static int rapl_check_hw_unit(bool apply_quirk) ...@@ -595,7 +597,7 @@ static int rapl_check_hw_unit(bool apply_quirk)
* "Intel Xeon Processor E5-1600 and E5-2600 v3 Product Families, V2 * "Intel Xeon Processor E5-1600 and E5-2600 v3 Product Families, V2
* of 2. Datasheet, September 2014, Reference Number: 330784-001 " * of 2. Datasheet, September 2014, Reference Number: 330784-001 "
*/ */
if (apply_quirk) if (rm->apply_quirk)
rapl_hw_unit[PERF_RAPL_RAM] = 16; rapl_hw_unit[PERF_RAPL_RAM] = 16;
/* /*
...@@ -676,6 +678,8 @@ static struct rapl_model model_snb = { ...@@ -676,6 +678,8 @@ static struct rapl_model model_snb = {
BIT(PERF_RAPL_PKG) | BIT(PERF_RAPL_PKG) |
BIT(PERF_RAPL_PP1), BIT(PERF_RAPL_PP1),
.apply_quirk = false, .apply_quirk = false,
.msr_power_unit = MSR_RAPL_POWER_UNIT,
.rapl_msrs = intel_rapl_msrs,
}; };
static struct rapl_model model_snbep = { static struct rapl_model model_snbep = {
...@@ -683,6 +687,8 @@ static struct rapl_model model_snbep = { ...@@ -683,6 +687,8 @@ static struct rapl_model model_snbep = {
BIT(PERF_RAPL_PKG) | BIT(PERF_RAPL_PKG) |
BIT(PERF_RAPL_RAM), BIT(PERF_RAPL_RAM),
.apply_quirk = false, .apply_quirk = false,
.msr_power_unit = MSR_RAPL_POWER_UNIT,
.rapl_msrs = intel_rapl_msrs,
}; };
static struct rapl_model model_hsw = { static struct rapl_model model_hsw = {
...@@ -691,6 +697,8 @@ static struct rapl_model model_hsw = { ...@@ -691,6 +697,8 @@ static struct rapl_model model_hsw = {
BIT(PERF_RAPL_RAM) | BIT(PERF_RAPL_RAM) |
BIT(PERF_RAPL_PP1), BIT(PERF_RAPL_PP1),
.apply_quirk = false, .apply_quirk = false,
.msr_power_unit = MSR_RAPL_POWER_UNIT,
.rapl_msrs = intel_rapl_msrs,
}; };
static struct rapl_model model_hsx = { static struct rapl_model model_hsx = {
...@@ -698,12 +706,16 @@ static struct rapl_model model_hsx = { ...@@ -698,12 +706,16 @@ static struct rapl_model model_hsx = {
BIT(PERF_RAPL_PKG) | BIT(PERF_RAPL_PKG) |
BIT(PERF_RAPL_RAM), BIT(PERF_RAPL_RAM),
.apply_quirk = true, .apply_quirk = true,
.msr_power_unit = MSR_RAPL_POWER_UNIT,
.rapl_msrs = intel_rapl_msrs,
}; };
static struct rapl_model model_knl = { static struct rapl_model model_knl = {
.events = BIT(PERF_RAPL_PKG) | .events = BIT(PERF_RAPL_PKG) |
BIT(PERF_RAPL_RAM), BIT(PERF_RAPL_RAM),
.apply_quirk = true, .apply_quirk = true,
.msr_power_unit = MSR_RAPL_POWER_UNIT,
.rapl_msrs = intel_rapl_msrs,
}; };
static struct rapl_model model_skl = { static struct rapl_model model_skl = {
...@@ -713,6 +725,8 @@ static struct rapl_model model_skl = { ...@@ -713,6 +725,8 @@ static struct rapl_model model_skl = {
BIT(PERF_RAPL_PP1) | BIT(PERF_RAPL_PP1) |
BIT(PERF_RAPL_PSYS), BIT(PERF_RAPL_PSYS),
.apply_quirk = false, .apply_quirk = false,
.msr_power_unit = MSR_RAPL_POWER_UNIT,
.rapl_msrs = intel_rapl_msrs,
}; };
static const struct x86_cpu_id rapl_model_match[] __initconst = { static const struct x86_cpu_id rapl_model_match[] __initconst = {
...@@ -760,10 +774,13 @@ static int __init rapl_pmu_init(void) ...@@ -760,10 +774,13 @@ static int __init rapl_pmu_init(void)
return -ENODEV; return -ENODEV;
rm = (struct rapl_model *) id->driver_data; rm = (struct rapl_model *) id->driver_data;
rapl_msrs = rm->rapl_msrs;
rapl_cntr_mask = perf_msr_probe(rapl_msrs, PERF_RAPL_MAX, rapl_cntr_mask = perf_msr_probe(rapl_msrs, PERF_RAPL_MAX,
false, (void *) &rm->events); false, (void *) &rm->events);
ret = rapl_check_hw_unit(rm->apply_quirk); ret = rapl_check_hw_unit(rm);
if (ret) if (ret)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment