mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-29 15:43:59 +08:00
perf/x86/rapl: Get MSR values from new probe framework
There's no need to have special code for getting the bit and MSR value for given event. We can now easily get it from rapl_msrs array. Also getting rid of RAPL_IDX_*, which is no longer needed and replacing INTEL_RAPL* with PERF_RAPL* enums. Signed-off-by: Jiri Olsa <jolsa@kernel.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andy Lutomirski <luto@kernel.org> Cc: Arnaldo Carvalho de Melo <acme@kernel.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Kan <kan.liang@linux.intel.com> Cc: Liang Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Vince Weaver <vincent.weaver@maine.edu> Link: https://lkml.kernel.org/r/20190616140358.27799-7-jolsa@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
cd105aed1a
commit
122f1c51b1
@ -55,6 +55,7 @@
|
|||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/perf_event.h>
|
#include <linux/perf_event.h>
|
||||||
|
#include <linux/nospec.h>
|
||||||
#include <asm/cpu_device_id.h>
|
#include <asm/cpu_device_id.h>
|
||||||
#include <asm/intel-family.h>
|
#include <asm/intel-family.h>
|
||||||
#include "../perf_event.h"
|
#include "../perf_event.h"
|
||||||
@ -65,19 +66,6 @@ MODULE_LICENSE("GPL");
|
|||||||
/*
|
/*
|
||||||
* RAPL energy status counters
|
* RAPL energy status counters
|
||||||
*/
|
*/
|
||||||
#define RAPL_IDX_PP0_NRG_STAT 0 /* all cores */
|
|
||||||
#define INTEL_RAPL_PP0 0x1 /* pseudo-encoding */
|
|
||||||
#define RAPL_IDX_PKG_NRG_STAT 1 /* entire package */
|
|
||||||
#define INTEL_RAPL_PKG 0x2 /* pseudo-encoding */
|
|
||||||
#define RAPL_IDX_RAM_NRG_STAT 2 /* DRAM */
|
|
||||||
#define INTEL_RAPL_RAM 0x3 /* pseudo-encoding */
|
|
||||||
#define RAPL_IDX_PP1_NRG_STAT 3 /* gpu */
|
|
||||||
#define INTEL_RAPL_PP1 0x4 /* pseudo-encoding */
|
|
||||||
#define RAPL_IDX_PSYS_NRG_STAT 4 /* psys */
|
|
||||||
#define INTEL_RAPL_PSYS 0x5 /* pseudo-encoding */
|
|
||||||
|
|
||||||
#define NR_RAPL_DOMAINS 0x5
|
|
||||||
|
|
||||||
enum perf_rapl_events {
|
enum perf_rapl_events {
|
||||||
PERF_RAPL_PP0 = 0, /* all cores */
|
PERF_RAPL_PP0 = 0, /* all cores */
|
||||||
PERF_RAPL_PKG, /* entire package */
|
PERF_RAPL_PKG, /* entire package */
|
||||||
@ -86,6 +74,7 @@ enum perf_rapl_events {
|
|||||||
PERF_RAPL_PSYS, /* psys */
|
PERF_RAPL_PSYS, /* psys */
|
||||||
|
|
||||||
PERF_RAPL_MAX,
|
PERF_RAPL_MAX,
|
||||||
|
NR_RAPL_DOMAINS = PERF_RAPL_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *const rapl_domain_names[NR_RAPL_DOMAINS] __initconst = {
|
static const char *const rapl_domain_names[NR_RAPL_DOMAINS] __initconst = {
|
||||||
@ -149,6 +138,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 inline struct rapl_pmu *cpu_to_rapl_pmu(unsigned int cpu)
|
static inline struct rapl_pmu *cpu_to_rapl_pmu(unsigned int cpu)
|
||||||
{
|
{
|
||||||
@ -340,7 +330,7 @@ static void rapl_pmu_event_del(struct perf_event *event, int flags)
|
|||||||
static int rapl_pmu_event_init(struct perf_event *event)
|
static int rapl_pmu_event_init(struct perf_event *event)
|
||||||
{
|
{
|
||||||
u64 cfg = event->attr.config & RAPL_EVENT_MASK;
|
u64 cfg = event->attr.config & RAPL_EVENT_MASK;
|
||||||
int bit, msr, ret = 0;
|
int bit, ret = 0;
|
||||||
struct rapl_pmu *pmu;
|
struct rapl_pmu *pmu;
|
||||||
|
|
||||||
/* only look at RAPL events */
|
/* only look at RAPL events */
|
||||||
@ -356,33 +346,12 @@ static int rapl_pmu_event_init(struct perf_event *event)
|
|||||||
|
|
||||||
event->event_caps |= PERF_EV_CAP_READ_ACTIVE_PKG;
|
event->event_caps |= PERF_EV_CAP_READ_ACTIVE_PKG;
|
||||||
|
|
||||||
/*
|
if (!cfg || cfg >= NR_RAPL_DOMAINS + 1)
|
||||||
* check event is known (determines counter)
|
|
||||||
*/
|
|
||||||
switch (cfg) {
|
|
||||||
case INTEL_RAPL_PP0:
|
|
||||||
bit = RAPL_IDX_PP0_NRG_STAT;
|
|
||||||
msr = MSR_PP0_ENERGY_STATUS;
|
|
||||||
break;
|
|
||||||
case INTEL_RAPL_PKG:
|
|
||||||
bit = RAPL_IDX_PKG_NRG_STAT;
|
|
||||||
msr = MSR_PKG_ENERGY_STATUS;
|
|
||||||
break;
|
|
||||||
case INTEL_RAPL_RAM:
|
|
||||||
bit = RAPL_IDX_RAM_NRG_STAT;
|
|
||||||
msr = MSR_DRAM_ENERGY_STATUS;
|
|
||||||
break;
|
|
||||||
case INTEL_RAPL_PP1:
|
|
||||||
bit = RAPL_IDX_PP1_NRG_STAT;
|
|
||||||
msr = MSR_PP1_ENERGY_STATUS;
|
|
||||||
break;
|
|
||||||
case INTEL_RAPL_PSYS:
|
|
||||||
bit = RAPL_IDX_PSYS_NRG_STAT;
|
|
||||||
msr = MSR_PLATFORM_ENERGY_STATUS;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
|
||||||
|
cfg = array_index_nospec((long)cfg, NR_RAPL_DOMAINS + 1);
|
||||||
|
bit = cfg - 1;
|
||||||
|
|
||||||
/* check event supported */
|
/* check event supported */
|
||||||
if (!(rapl_cntr_mask & (1 << bit)))
|
if (!(rapl_cntr_mask & (1 << bit)))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -397,7 +366,7 @@ static int rapl_pmu_event_init(struct perf_event *event)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
event->cpu = pmu->cpu;
|
event->cpu = pmu->cpu;
|
||||||
event->pmu_private = pmu;
|
event->pmu_private = pmu;
|
||||||
event->hw.event_base = msr;
|
event->hw.event_base = rapl_msrs[bit].msr;
|
||||||
event->hw.config = cfg;
|
event->hw.config = cfg;
|
||||||
event->hw.idx = bit;
|
event->hw.idx = bit;
|
||||||
|
|
||||||
@ -705,7 +674,7 @@ static int rapl_check_hw_unit(bool apply_quirk)
|
|||||||
* of 2. Datasheet, September 2014, Reference Number: 330784-001 "
|
* of 2. Datasheet, September 2014, Reference Number: 330784-001 "
|
||||||
*/
|
*/
|
||||||
if (apply_quirk)
|
if (apply_quirk)
|
||||||
rapl_hw_unit[RAPL_IDX_RAM_NRG_STAT] = 16;
|
rapl_hw_unit[PERF_RAPL_RAM] = 16;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Calculate the timer rate:
|
* Calculate the timer rate:
|
||||||
|
Loading…
Reference in New Issue
Block a user