|
@@ -7,6 +7,7 @@ enum perf_msr_id {
|
|
|
PERF_MSR_PPERF = 3,
|
|
|
PERF_MSR_SMI = 4,
|
|
|
PERF_MSR_PTSC = 5,
|
|
|
+ PERF_MSR_IRPERF = 6,
|
|
|
|
|
|
PERF_MSR_EVENT_MAX,
|
|
|
};
|
|
@@ -21,6 +22,11 @@ static bool test_ptsc(int idx)
|
|
|
return boot_cpu_has(X86_FEATURE_PTSC);
|
|
|
}
|
|
|
|
|
|
+static bool test_irperf(int idx)
|
|
|
+{
|
|
|
+ return boot_cpu_has(X86_FEATURE_IRPERF);
|
|
|
+}
|
|
|
+
|
|
|
static bool test_intel(int idx)
|
|
|
{
|
|
|
if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL ||
|
|
@@ -75,20 +81,22 @@ struct perf_msr {
|
|
|
bool (*test)(int idx);
|
|
|
};
|
|
|
|
|
|
-PMU_EVENT_ATTR_STRING(tsc, evattr_tsc, "event=0x00");
|
|
|
-PMU_EVENT_ATTR_STRING(aperf, evattr_aperf, "event=0x01");
|
|
|
-PMU_EVENT_ATTR_STRING(mperf, evattr_mperf, "event=0x02");
|
|
|
-PMU_EVENT_ATTR_STRING(pperf, evattr_pperf, "event=0x03");
|
|
|
-PMU_EVENT_ATTR_STRING(smi, evattr_smi, "event=0x04");
|
|
|
-PMU_EVENT_ATTR_STRING(ptsc, evattr_ptsc, "event=0x05");
|
|
|
+PMU_EVENT_ATTR_STRING(tsc, evattr_tsc, "event=0x00");
|
|
|
+PMU_EVENT_ATTR_STRING(aperf, evattr_aperf, "event=0x01");
|
|
|
+PMU_EVENT_ATTR_STRING(mperf, evattr_mperf, "event=0x02");
|
|
|
+PMU_EVENT_ATTR_STRING(pperf, evattr_pperf, "event=0x03");
|
|
|
+PMU_EVENT_ATTR_STRING(smi, evattr_smi, "event=0x04");
|
|
|
+PMU_EVENT_ATTR_STRING(ptsc, evattr_ptsc, "event=0x05");
|
|
|
+PMU_EVENT_ATTR_STRING(irperf, evattr_irperf, "event=0x06");
|
|
|
|
|
|
static struct perf_msr msr[] = {
|
|
|
- [PERF_MSR_TSC] = { 0, &evattr_tsc, NULL, },
|
|
|
- [PERF_MSR_APERF] = { MSR_IA32_APERF, &evattr_aperf, test_aperfmperf, },
|
|
|
- [PERF_MSR_MPERF] = { MSR_IA32_MPERF, &evattr_mperf, test_aperfmperf, },
|
|
|
- [PERF_MSR_PPERF] = { MSR_PPERF, &evattr_pperf, test_intel, },
|
|
|
- [PERF_MSR_SMI] = { MSR_SMI_COUNT, &evattr_smi, test_intel, },
|
|
|
+ [PERF_MSR_TSC] = { 0, &evattr_tsc, NULL, },
|
|
|
+ [PERF_MSR_APERF] = { MSR_IA32_APERF, &evattr_aperf, test_aperfmperf, },
|
|
|
+ [PERF_MSR_MPERF] = { MSR_IA32_MPERF, &evattr_mperf, test_aperfmperf, },
|
|
|
+ [PERF_MSR_PPERF] = { MSR_PPERF, &evattr_pperf, test_intel, },
|
|
|
+ [PERF_MSR_SMI] = { MSR_SMI_COUNT, &evattr_smi, test_intel, },
|
|
|
[PERF_MSR_PTSC] = { MSR_F15H_PTSC, &evattr_ptsc, test_ptsc, },
|
|
|
+ [PERF_MSR_IRPERF] = { MSR_F17H_IRPERF, &evattr_irperf, test_irperf, },
|
|
|
};
|
|
|
|
|
|
static struct attribute *events_attrs[PERF_MSR_EVENT_MAX + 1] = {
|