|
@@ -35,133 +35,117 @@
|
|
* but the encodings are considered to be `reserved' in the case that
|
|
* but the encodings are considered to be `reserved' in the case that
|
|
* they are not available.
|
|
* they are not available.
|
|
*/
|
|
*/
|
|
-enum armv7_perf_types {
|
|
|
|
- ARMV7_PERFCTR_PMNC_SW_INCR = 0x00,
|
|
|
|
- ARMV7_PERFCTR_L1_ICACHE_REFILL = 0x01,
|
|
|
|
- ARMV7_PERFCTR_ITLB_REFILL = 0x02,
|
|
|
|
- ARMV7_PERFCTR_L1_DCACHE_REFILL = 0x03,
|
|
|
|
- ARMV7_PERFCTR_L1_DCACHE_ACCESS = 0x04,
|
|
|
|
- ARMV7_PERFCTR_DTLB_REFILL = 0x05,
|
|
|
|
- ARMV7_PERFCTR_MEM_READ = 0x06,
|
|
|
|
- ARMV7_PERFCTR_MEM_WRITE = 0x07,
|
|
|
|
- ARMV7_PERFCTR_INSTR_EXECUTED = 0x08,
|
|
|
|
- ARMV7_PERFCTR_EXC_TAKEN = 0x09,
|
|
|
|
- ARMV7_PERFCTR_EXC_EXECUTED = 0x0A,
|
|
|
|
- ARMV7_PERFCTR_CID_WRITE = 0x0B,
|
|
|
|
|
|
+#define ARMV7_PERFCTR_PMNC_SW_INCR 0x00
|
|
|
|
+#define ARMV7_PERFCTR_L1_ICACHE_REFILL 0x01
|
|
|
|
+#define ARMV7_PERFCTR_ITLB_REFILL 0x02
|
|
|
|
+#define ARMV7_PERFCTR_L1_DCACHE_REFILL 0x03
|
|
|
|
+#define ARMV7_PERFCTR_L1_DCACHE_ACCESS 0x04
|
|
|
|
+#define ARMV7_PERFCTR_DTLB_REFILL 0x05
|
|
|
|
+#define ARMV7_PERFCTR_MEM_READ 0x06
|
|
|
|
+#define ARMV7_PERFCTR_MEM_WRITE 0x07
|
|
|
|
+#define ARMV7_PERFCTR_INSTR_EXECUTED 0x08
|
|
|
|
+#define ARMV7_PERFCTR_EXC_TAKEN 0x09
|
|
|
|
+#define ARMV7_PERFCTR_EXC_EXECUTED 0x0A
|
|
|
|
+#define ARMV7_PERFCTR_CID_WRITE 0x0B
|
|
|
|
|
|
- /*
|
|
|
|
- * ARMV7_PERFCTR_PC_WRITE is equivalent to HW_BRANCH_INSTRUCTIONS.
|
|
|
|
- * It counts:
|
|
|
|
- * - all (taken) branch instructions,
|
|
|
|
- * - instructions that explicitly write the PC,
|
|
|
|
- * - exception generating instructions.
|
|
|
|
- */
|
|
|
|
- ARMV7_PERFCTR_PC_WRITE = 0x0C,
|
|
|
|
- ARMV7_PERFCTR_PC_IMM_BRANCH = 0x0D,
|
|
|
|
- ARMV7_PERFCTR_PC_PROC_RETURN = 0x0E,
|
|
|
|
- ARMV7_PERFCTR_MEM_UNALIGNED_ACCESS = 0x0F,
|
|
|
|
- ARMV7_PERFCTR_PC_BRANCH_MIS_PRED = 0x10,
|
|
|
|
- ARMV7_PERFCTR_CLOCK_CYCLES = 0x11,
|
|
|
|
- ARMV7_PERFCTR_PC_BRANCH_PRED = 0x12,
|
|
|
|
-
|
|
|
|
- /* These events are defined by the PMUv2 supplement (ARM DDI 0457A). */
|
|
|
|
- ARMV7_PERFCTR_MEM_ACCESS = 0x13,
|
|
|
|
- ARMV7_PERFCTR_L1_ICACHE_ACCESS = 0x14,
|
|
|
|
- ARMV7_PERFCTR_L1_DCACHE_WB = 0x15,
|
|
|
|
- ARMV7_PERFCTR_L2_CACHE_ACCESS = 0x16,
|
|
|
|
- ARMV7_PERFCTR_L2_CACHE_REFILL = 0x17,
|
|
|
|
- ARMV7_PERFCTR_L2_CACHE_WB = 0x18,
|
|
|
|
- ARMV7_PERFCTR_BUS_ACCESS = 0x19,
|
|
|
|
- ARMV7_PERFCTR_MEM_ERROR = 0x1A,
|
|
|
|
- ARMV7_PERFCTR_INSTR_SPEC = 0x1B,
|
|
|
|
- ARMV7_PERFCTR_TTBR_WRITE = 0x1C,
|
|
|
|
- ARMV7_PERFCTR_BUS_CYCLES = 0x1D,
|
|
|
|
-
|
|
|
|
- ARMV7_PERFCTR_CPU_CYCLES = 0xFF
|
|
|
|
-};
|
|
|
|
|
|
+/*
|
|
|
|
+ * ARMV7_PERFCTR_PC_WRITE is equivalent to HW_BRANCH_INSTRUCTIONS.
|
|
|
|
+ * It counts:
|
|
|
|
+ * - all (taken) branch instructions,
|
|
|
|
+ * - instructions that explicitly write the PC,
|
|
|
|
+ * - exception generating instructions.
|
|
|
|
+ */
|
|
|
|
+#define ARMV7_PERFCTR_PC_WRITE 0x0C
|
|
|
|
+#define ARMV7_PERFCTR_PC_IMM_BRANCH 0x0D
|
|
|
|
+#define ARMV7_PERFCTR_PC_PROC_RETURN 0x0E
|
|
|
|
+#define ARMV7_PERFCTR_MEM_UNALIGNED_ACCESS 0x0F
|
|
|
|
+#define ARMV7_PERFCTR_PC_BRANCH_MIS_PRED 0x10
|
|
|
|
+#define ARMV7_PERFCTR_CLOCK_CYCLES 0x11
|
|
|
|
+#define ARMV7_PERFCTR_PC_BRANCH_PRED 0x12
|
|
|
|
+
|
|
|
|
+/* These events are defined by the PMUv2 supplement (ARM DDI 0457A). */
|
|
|
|
+#define ARMV7_PERFCTR_MEM_ACCESS 0x13
|
|
|
|
+#define ARMV7_PERFCTR_L1_ICACHE_ACCESS 0x14
|
|
|
|
+#define ARMV7_PERFCTR_L1_DCACHE_WB 0x15
|
|
|
|
+#define ARMV7_PERFCTR_L2_CACHE_ACCESS 0x16
|
|
|
|
+#define ARMV7_PERFCTR_L2_CACHE_REFILL 0x17
|
|
|
|
+#define ARMV7_PERFCTR_L2_CACHE_WB 0x18
|
|
|
|
+#define ARMV7_PERFCTR_BUS_ACCESS 0x19
|
|
|
|
+#define ARMV7_PERFCTR_MEM_ERROR 0x1A
|
|
|
|
+#define ARMV7_PERFCTR_INSTR_SPEC 0x1B
|
|
|
|
+#define ARMV7_PERFCTR_TTBR_WRITE 0x1C
|
|
|
|
+#define ARMV7_PERFCTR_BUS_CYCLES 0x1D
|
|
|
|
+
|
|
|
|
+#define ARMV7_PERFCTR_CPU_CYCLES 0xFF
|
|
|
|
|
|
/* ARMv7 Cortex-A8 specific event types */
|
|
/* ARMv7 Cortex-A8 specific event types */
|
|
-enum armv7_a8_perf_types {
|
|
|
|
- ARMV7_A8_PERFCTR_L2_CACHE_ACCESS = 0x43,
|
|
|
|
- ARMV7_A8_PERFCTR_L2_CACHE_REFILL = 0x44,
|
|
|
|
- ARMV7_A8_PERFCTR_L1_ICACHE_ACCESS = 0x50,
|
|
|
|
- ARMV7_A8_PERFCTR_STALL_ISIDE = 0x56,
|
|
|
|
-};
|
|
|
|
|
|
+#define ARMV7_A8_PERFCTR_L2_CACHE_ACCESS 0x43
|
|
|
|
+#define ARMV7_A8_PERFCTR_L2_CACHE_REFILL 0x44
|
|
|
|
+#define ARMV7_A8_PERFCTR_L1_ICACHE_ACCESS 0x50
|
|
|
|
+#define ARMV7_A8_PERFCTR_STALL_ISIDE 0x56
|
|
|
|
|
|
/* ARMv7 Cortex-A9 specific event types */
|
|
/* ARMv7 Cortex-A9 specific event types */
|
|
-enum armv7_a9_perf_types {
|
|
|
|
- ARMV7_A9_PERFCTR_INSTR_CORE_RENAME = 0x68,
|
|
|
|
- ARMV7_A9_PERFCTR_STALL_ICACHE = 0x60,
|
|
|
|
- ARMV7_A9_PERFCTR_STALL_DISPATCH = 0x66,
|
|
|
|
-};
|
|
|
|
|
|
+#define ARMV7_A9_PERFCTR_INSTR_CORE_RENAME 0x68
|
|
|
|
+#define ARMV7_A9_PERFCTR_STALL_ICACHE 0x60
|
|
|
|
+#define ARMV7_A9_PERFCTR_STALL_DISPATCH 0x66
|
|
|
|
|
|
/* ARMv7 Cortex-A5 specific event types */
|
|
/* ARMv7 Cortex-A5 specific event types */
|
|
-enum armv7_a5_perf_types {
|
|
|
|
- ARMV7_A5_PERFCTR_PREFETCH_LINEFILL = 0xc2,
|
|
|
|
- ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP = 0xc3,
|
|
|
|
-};
|
|
|
|
|
|
+#define ARMV7_A5_PERFCTR_PREFETCH_LINEFILL 0xc2
|
|
|
|
+#define ARMV7_A5_PERFCTR_PREFETCH_LINEFILL_DROP 0xc3
|
|
|
|
|
|
/* ARMv7 Cortex-A15 specific event types */
|
|
/* ARMv7 Cortex-A15 specific event types */
|
|
-enum armv7_a15_perf_types {
|
|
|
|
- ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_READ = 0x40,
|
|
|
|
- ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_WRITE = 0x41,
|
|
|
|
- ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_READ = 0x42,
|
|
|
|
- ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_WRITE = 0x43,
|
|
|
|
|
|
+#define ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_READ 0x40
|
|
|
|
+#define ARMV7_A15_PERFCTR_L1_DCACHE_ACCESS_WRITE 0x41
|
|
|
|
+#define ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_READ 0x42
|
|
|
|
+#define ARMV7_A15_PERFCTR_L1_DCACHE_REFILL_WRITE 0x43
|
|
|
|
|
|
- ARMV7_A15_PERFCTR_DTLB_REFILL_L1_READ = 0x4C,
|
|
|
|
- ARMV7_A15_PERFCTR_DTLB_REFILL_L1_WRITE = 0x4D,
|
|
|
|
|
|
+#define ARMV7_A15_PERFCTR_DTLB_REFILL_L1_READ 0x4C
|
|
|
|
+#define ARMV7_A15_PERFCTR_DTLB_REFILL_L1_WRITE 0x4D
|
|
|
|
|
|
- ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_READ = 0x50,
|
|
|
|
- ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_WRITE = 0x51,
|
|
|
|
- ARMV7_A15_PERFCTR_L2_CACHE_REFILL_READ = 0x52,
|
|
|
|
- ARMV7_A15_PERFCTR_L2_CACHE_REFILL_WRITE = 0x53,
|
|
|
|
|
|
+#define ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_READ 0x50
|
|
|
|
+#define ARMV7_A15_PERFCTR_L2_CACHE_ACCESS_WRITE 0x51
|
|
|
|
+#define ARMV7_A15_PERFCTR_L2_CACHE_REFILL_READ 0x52
|
|
|
|
+#define ARMV7_A15_PERFCTR_L2_CACHE_REFILL_WRITE 0x53
|
|
|
|
|
|
- ARMV7_A15_PERFCTR_PC_WRITE_SPEC = 0x76,
|
|
|
|
-};
|
|
|
|
|
|
+#define ARMV7_A15_PERFCTR_PC_WRITE_SPEC 0x76
|
|
|
|
|
|
/* ARMv7 Cortex-A12 specific event types */
|
|
/* ARMv7 Cortex-A12 specific event types */
|
|
-enum armv7_a12_perf_types {
|
|
|
|
- ARMV7_A12_PERFCTR_L1_DCACHE_ACCESS_READ = 0x40,
|
|
|
|
- ARMV7_A12_PERFCTR_L1_DCACHE_ACCESS_WRITE = 0x41,
|
|
|
|
|
|
+#define ARMV7_A12_PERFCTR_L1_DCACHE_ACCESS_READ 0x40
|
|
|
|
+#define ARMV7_A12_PERFCTR_L1_DCACHE_ACCESS_WRITE 0x41
|
|
|
|
|
|
- ARMV7_A12_PERFCTR_L2_CACHE_ACCESS_READ = 0x50,
|
|
|
|
- ARMV7_A12_PERFCTR_L2_CACHE_ACCESS_WRITE = 0x51,
|
|
|
|
|
|
+#define ARMV7_A12_PERFCTR_L2_CACHE_ACCESS_READ 0x50
|
|
|
|
+#define ARMV7_A12_PERFCTR_L2_CACHE_ACCESS_WRITE 0x51
|
|
|
|
|
|
- ARMV7_A12_PERFCTR_PC_WRITE_SPEC = 0x76,
|
|
|
|
|
|
+#define ARMV7_A12_PERFCTR_PC_WRITE_SPEC 0x76
|
|
|
|
|
|
- ARMV7_A12_PERFCTR_PF_TLB_REFILL = 0xe7,
|
|
|
|
-};
|
|
|
|
|
|
+#define ARMV7_A12_PERFCTR_PF_TLB_REFILL 0xe7
|
|
|
|
|
|
/* ARMv7 Krait specific event types */
|
|
/* ARMv7 Krait specific event types */
|
|
-enum krait_perf_types {
|
|
|
|
- KRAIT_PMRESR0_GROUP0 = 0xcc,
|
|
|
|
- KRAIT_PMRESR1_GROUP0 = 0xd0,
|
|
|
|
- KRAIT_PMRESR2_GROUP0 = 0xd4,
|
|
|
|
- KRAIT_VPMRESR0_GROUP0 = 0xd8,
|
|
|
|
|
|
+#define KRAIT_PMRESR0_GROUP0 0xcc
|
|
|
|
+#define KRAIT_PMRESR1_GROUP0 0xd0
|
|
|
|
+#define KRAIT_PMRESR2_GROUP0 0xd4
|
|
|
|
+#define KRAIT_VPMRESR0_GROUP0 0xd8
|
|
|
|
|
|
- KRAIT_PERFCTR_L1_ICACHE_ACCESS = 0x10011,
|
|
|
|
- KRAIT_PERFCTR_L1_ICACHE_MISS = 0x10010,
|
|
|
|
|
|
+#define KRAIT_PERFCTR_L1_ICACHE_ACCESS 0x10011
|
|
|
|
+#define KRAIT_PERFCTR_L1_ICACHE_MISS 0x10010
|
|
|
|
|
|
- KRAIT_PERFCTR_L1_ITLB_ACCESS = 0x12222,
|
|
|
|
- KRAIT_PERFCTR_L1_DTLB_ACCESS = 0x12210,
|
|
|
|
-};
|
|
|
|
|
|
+#define KRAIT_PERFCTR_L1_ITLB_ACCESS 0x12222
|
|
|
|
+#define KRAIT_PERFCTR_L1_DTLB_ACCESS 0x12210
|
|
|
|
|
|
/* ARMv7 Scorpion specific event types */
|
|
/* ARMv7 Scorpion specific event types */
|
|
-enum scorpion_perf_types {
|
|
|
|
- SCORPION_LPM0_GROUP0 = 0x4c,
|
|
|
|
- SCORPION_LPM1_GROUP0 = 0x50,
|
|
|
|
- SCORPION_LPM2_GROUP0 = 0x54,
|
|
|
|
- SCORPION_L2LPM_GROUP0 = 0x58,
|
|
|
|
- SCORPION_VLPM_GROUP0 = 0x5c,
|
|
|
|
|
|
+#define SCORPION_LPM0_GROUP0 0x4c
|
|
|
|
+#define SCORPION_LPM1_GROUP0 0x50
|
|
|
|
+#define SCORPION_LPM2_GROUP0 0x54
|
|
|
|
+#define SCORPION_L2LPM_GROUP0 0x58
|
|
|
|
+#define SCORPION_VLPM_GROUP0 0x5c
|
|
|
|
|
|
- SCORPION_ICACHE_ACCESS = 0x10053,
|
|
|
|
- SCORPION_ICACHE_MISS = 0x10052,
|
|
|
|
|
|
+#define SCORPION_ICACHE_ACCESS 0x10053
|
|
|
|
+#define SCORPION_ICACHE_MISS 0x10052
|
|
|
|
|
|
- SCORPION_DTLB_ACCESS = 0x12013,
|
|
|
|
- SCORPION_DTLB_MISS = 0x12012,
|
|
|
|
|
|
+#define SCORPION_DTLB_ACCESS 0x12013
|
|
|
|
+#define SCORPION_DTLB_MISS 0x12012
|
|
|
|
|
|
- SCORPION_ITLB_MISS = 0x12021,
|
|
|
|
-};
|
|
|
|
|
|
+#define SCORPION_ITLB_MISS 0x12021
|
|
|
|
|
|
/*
|
|
/*
|
|
* Cortex-A8 HW events mapping
|
|
* Cortex-A8 HW events mapping
|
|
@@ -547,6 +531,134 @@ static const unsigned scorpion_perf_cache_map[PERF_COUNT_HW_CACHE_MAX]
|
|
[C(BPU)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
|
|
[C(BPU)][C(OP_WRITE)][C(RESULT_MISS)] = ARMV7_PERFCTR_PC_BRANCH_MIS_PRED,
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+PMU_FORMAT_ATTR(event, "config:0-7");
|
|
|
|
+
|
|
|
|
+static struct attribute *armv7_pmu_format_attrs[] = {
|
|
|
|
+ &format_attr_event.attr,
|
|
|
|
+ NULL,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct attribute_group armv7_pmu_format_attr_group = {
|
|
|
|
+ .name = "format",
|
|
|
|
+ .attrs = armv7_pmu_format_attrs,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+#define ARMV7_EVENT_ATTR_RESOLVE(m) #m
|
|
|
|
+#define ARMV7_EVENT_ATTR(name, config) \
|
|
|
|
+ PMU_EVENT_ATTR_STRING(name, armv7_event_attr_##name, \
|
|
|
|
+ "event=" ARMV7_EVENT_ATTR_RESOLVE(config))
|
|
|
|
+
|
|
|
|
+ARMV7_EVENT_ATTR(sw_incr, ARMV7_PERFCTR_PMNC_SW_INCR);
|
|
|
|
+ARMV7_EVENT_ATTR(l1i_cache_refill, ARMV7_PERFCTR_L1_ICACHE_REFILL);
|
|
|
|
+ARMV7_EVENT_ATTR(l1i_tlb_refill, ARMV7_PERFCTR_ITLB_REFILL);
|
|
|
|
+ARMV7_EVENT_ATTR(l1d_cache_refill, ARMV7_PERFCTR_L1_DCACHE_REFILL);
|
|
|
|
+ARMV7_EVENT_ATTR(l1d_cache, ARMV7_PERFCTR_L1_DCACHE_ACCESS);
|
|
|
|
+ARMV7_EVENT_ATTR(l1d_tlb_refill, ARMV7_PERFCTR_DTLB_REFILL);
|
|
|
|
+ARMV7_EVENT_ATTR(ld_retired, ARMV7_PERFCTR_MEM_READ);
|
|
|
|
+ARMV7_EVENT_ATTR(st_retired, ARMV7_PERFCTR_MEM_WRITE);
|
|
|
|
+ARMV7_EVENT_ATTR(inst_retired, ARMV7_PERFCTR_INSTR_EXECUTED);
|
|
|
|
+ARMV7_EVENT_ATTR(exc_taken, ARMV7_PERFCTR_EXC_TAKEN);
|
|
|
|
+ARMV7_EVENT_ATTR(exc_return, ARMV7_PERFCTR_EXC_EXECUTED);
|
|
|
|
+ARMV7_EVENT_ATTR(cid_write_retired, ARMV7_PERFCTR_CID_WRITE);
|
|
|
|
+ARMV7_EVENT_ATTR(pc_write_retired, ARMV7_PERFCTR_PC_WRITE);
|
|
|
|
+ARMV7_EVENT_ATTR(br_immed_retired, ARMV7_PERFCTR_PC_IMM_BRANCH);
|
|
|
|
+ARMV7_EVENT_ATTR(br_return_retired, ARMV7_PERFCTR_PC_PROC_RETURN);
|
|
|
|
+ARMV7_EVENT_ATTR(unaligned_ldst_retired, ARMV7_PERFCTR_MEM_UNALIGNED_ACCESS);
|
|
|
|
+ARMV7_EVENT_ATTR(br_mis_pred, ARMV7_PERFCTR_PC_BRANCH_MIS_PRED);
|
|
|
|
+ARMV7_EVENT_ATTR(cpu_cycles, ARMV7_PERFCTR_CLOCK_CYCLES);
|
|
|
|
+ARMV7_EVENT_ATTR(br_pred, ARMV7_PERFCTR_PC_BRANCH_PRED);
|
|
|
|
+
|
|
|
|
+static struct attribute *armv7_pmuv1_event_attrs[] = {
|
|
|
|
+ &armv7_event_attr_sw_incr.attr.attr,
|
|
|
|
+ &armv7_event_attr_l1i_cache_refill.attr.attr,
|
|
|
|
+ &armv7_event_attr_l1i_tlb_refill.attr.attr,
|
|
|
|
+ &armv7_event_attr_l1d_cache_refill.attr.attr,
|
|
|
|
+ &armv7_event_attr_l1d_cache.attr.attr,
|
|
|
|
+ &armv7_event_attr_l1d_tlb_refill.attr.attr,
|
|
|
|
+ &armv7_event_attr_ld_retired.attr.attr,
|
|
|
|
+ &armv7_event_attr_st_retired.attr.attr,
|
|
|
|
+ &armv7_event_attr_inst_retired.attr.attr,
|
|
|
|
+ &armv7_event_attr_exc_taken.attr.attr,
|
|
|
|
+ &armv7_event_attr_exc_return.attr.attr,
|
|
|
|
+ &armv7_event_attr_cid_write_retired.attr.attr,
|
|
|
|
+ &armv7_event_attr_pc_write_retired.attr.attr,
|
|
|
|
+ &armv7_event_attr_br_immed_retired.attr.attr,
|
|
|
|
+ &armv7_event_attr_br_return_retired.attr.attr,
|
|
|
|
+ &armv7_event_attr_unaligned_ldst_retired.attr.attr,
|
|
|
|
+ &armv7_event_attr_br_mis_pred.attr.attr,
|
|
|
|
+ &armv7_event_attr_cpu_cycles.attr.attr,
|
|
|
|
+ &armv7_event_attr_br_pred.attr.attr,
|
|
|
|
+ NULL,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct attribute_group armv7_pmuv1_events_attr_group = {
|
|
|
|
+ .name = "events",
|
|
|
|
+ .attrs = armv7_pmuv1_event_attrs,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static const struct attribute_group *armv7_pmuv1_attr_groups[] = {
|
|
|
|
+ &armv7_pmuv1_events_attr_group,
|
|
|
|
+ &armv7_pmu_format_attr_group,
|
|
|
|
+ NULL,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+ARMV7_EVENT_ATTR(mem_access, ARMV7_PERFCTR_MEM_ACCESS);
|
|
|
|
+ARMV7_EVENT_ATTR(l1i_cache, ARMV7_PERFCTR_L1_ICACHE_ACCESS);
|
|
|
|
+ARMV7_EVENT_ATTR(l1d_cache_wb, ARMV7_PERFCTR_L1_DCACHE_WB);
|
|
|
|
+ARMV7_EVENT_ATTR(l2d_cache, ARMV7_PERFCTR_L2_CACHE_ACCESS);
|
|
|
|
+ARMV7_EVENT_ATTR(l2d_cache_refill, ARMV7_PERFCTR_L2_CACHE_REFILL);
|
|
|
|
+ARMV7_EVENT_ATTR(l2d_cache_wb, ARMV7_PERFCTR_L2_CACHE_WB);
|
|
|
|
+ARMV7_EVENT_ATTR(bus_access, ARMV7_PERFCTR_BUS_ACCESS);
|
|
|
|
+ARMV7_EVENT_ATTR(memory_error, ARMV7_PERFCTR_MEM_ERROR);
|
|
|
|
+ARMV7_EVENT_ATTR(inst_spec, ARMV7_PERFCTR_INSTR_SPEC);
|
|
|
|
+ARMV7_EVENT_ATTR(ttbr_write_retired, ARMV7_PERFCTR_TTBR_WRITE);
|
|
|
|
+ARMV7_EVENT_ATTR(bus_cycles, ARMV7_PERFCTR_BUS_CYCLES);
|
|
|
|
+
|
|
|
|
+static struct attribute *armv7_pmuv2_event_attrs[] = {
|
|
|
|
+ &armv7_event_attr_sw_incr.attr.attr,
|
|
|
|
+ &armv7_event_attr_l1i_cache_refill.attr.attr,
|
|
|
|
+ &armv7_event_attr_l1i_tlb_refill.attr.attr,
|
|
|
|
+ &armv7_event_attr_l1d_cache_refill.attr.attr,
|
|
|
|
+ &armv7_event_attr_l1d_cache.attr.attr,
|
|
|
|
+ &armv7_event_attr_l1d_tlb_refill.attr.attr,
|
|
|
|
+ &armv7_event_attr_ld_retired.attr.attr,
|
|
|
|
+ &armv7_event_attr_st_retired.attr.attr,
|
|
|
|
+ &armv7_event_attr_inst_retired.attr.attr,
|
|
|
|
+ &armv7_event_attr_exc_taken.attr.attr,
|
|
|
|
+ &armv7_event_attr_exc_return.attr.attr,
|
|
|
|
+ &armv7_event_attr_cid_write_retired.attr.attr,
|
|
|
|
+ &armv7_event_attr_pc_write_retired.attr.attr,
|
|
|
|
+ &armv7_event_attr_br_immed_retired.attr.attr,
|
|
|
|
+ &armv7_event_attr_br_return_retired.attr.attr,
|
|
|
|
+ &armv7_event_attr_unaligned_ldst_retired.attr.attr,
|
|
|
|
+ &armv7_event_attr_br_mis_pred.attr.attr,
|
|
|
|
+ &armv7_event_attr_cpu_cycles.attr.attr,
|
|
|
|
+ &armv7_event_attr_br_pred.attr.attr,
|
|
|
|
+ &armv7_event_attr_mem_access.attr.attr,
|
|
|
|
+ &armv7_event_attr_l1i_cache.attr.attr,
|
|
|
|
+ &armv7_event_attr_l1d_cache_wb.attr.attr,
|
|
|
|
+ &armv7_event_attr_l2d_cache.attr.attr,
|
|
|
|
+ &armv7_event_attr_l2d_cache_refill.attr.attr,
|
|
|
|
+ &armv7_event_attr_l2d_cache_wb.attr.attr,
|
|
|
|
+ &armv7_event_attr_bus_access.attr.attr,
|
|
|
|
+ &armv7_event_attr_memory_error.attr.attr,
|
|
|
|
+ &armv7_event_attr_inst_spec.attr.attr,
|
|
|
|
+ &armv7_event_attr_ttbr_write_retired.attr.attr,
|
|
|
|
+ &armv7_event_attr_bus_cycles.attr.attr,
|
|
|
|
+ NULL,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static struct attribute_group armv7_pmuv2_events_attr_group = {
|
|
|
|
+ .name = "events",
|
|
|
|
+ .attrs = armv7_pmuv2_event_attrs,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static const struct attribute_group *armv7_pmuv2_attr_groups[] = {
|
|
|
|
+ &armv7_pmuv2_events_attr_group,
|
|
|
|
+ &armv7_pmu_format_attr_group,
|
|
|
|
+ NULL,
|
|
|
|
+};
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Perf Events' indices
|
|
* Perf Events' indices
|
|
*/
|
|
*/
|
|
@@ -1085,6 +1197,7 @@ static int armv7_a8_pmu_init(struct arm_pmu *cpu_pmu)
|
|
armv7pmu_init(cpu_pmu);
|
|
armv7pmu_init(cpu_pmu);
|
|
cpu_pmu->name = "armv7_cortex_a8";
|
|
cpu_pmu->name = "armv7_cortex_a8";
|
|
cpu_pmu->map_event = armv7_a8_map_event;
|
|
cpu_pmu->map_event = armv7_a8_map_event;
|
|
|
|
+ cpu_pmu->pmu.attr_groups = armv7_pmuv1_attr_groups;
|
|
return armv7_probe_num_events(cpu_pmu);
|
|
return armv7_probe_num_events(cpu_pmu);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1093,6 +1206,7 @@ static int armv7_a9_pmu_init(struct arm_pmu *cpu_pmu)
|
|
armv7pmu_init(cpu_pmu);
|
|
armv7pmu_init(cpu_pmu);
|
|
cpu_pmu->name = "armv7_cortex_a9";
|
|
cpu_pmu->name = "armv7_cortex_a9";
|
|
cpu_pmu->map_event = armv7_a9_map_event;
|
|
cpu_pmu->map_event = armv7_a9_map_event;
|
|
|
|
+ cpu_pmu->pmu.attr_groups = armv7_pmuv1_attr_groups;
|
|
return armv7_probe_num_events(cpu_pmu);
|
|
return armv7_probe_num_events(cpu_pmu);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1101,6 +1215,7 @@ static int armv7_a5_pmu_init(struct arm_pmu *cpu_pmu)
|
|
armv7pmu_init(cpu_pmu);
|
|
armv7pmu_init(cpu_pmu);
|
|
cpu_pmu->name = "armv7_cortex_a5";
|
|
cpu_pmu->name = "armv7_cortex_a5";
|
|
cpu_pmu->map_event = armv7_a5_map_event;
|
|
cpu_pmu->map_event = armv7_a5_map_event;
|
|
|
|
+ cpu_pmu->pmu.attr_groups = armv7_pmuv1_attr_groups;
|
|
return armv7_probe_num_events(cpu_pmu);
|
|
return armv7_probe_num_events(cpu_pmu);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1110,6 +1225,7 @@ static int armv7_a15_pmu_init(struct arm_pmu *cpu_pmu)
|
|
cpu_pmu->name = "armv7_cortex_a15";
|
|
cpu_pmu->name = "armv7_cortex_a15";
|
|
cpu_pmu->map_event = armv7_a15_map_event;
|
|
cpu_pmu->map_event = armv7_a15_map_event;
|
|
cpu_pmu->set_event_filter = armv7pmu_set_event_filter;
|
|
cpu_pmu->set_event_filter = armv7pmu_set_event_filter;
|
|
|
|
+ cpu_pmu->pmu.attr_groups = armv7_pmuv2_attr_groups;
|
|
return armv7_probe_num_events(cpu_pmu);
|
|
return armv7_probe_num_events(cpu_pmu);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1119,6 +1235,7 @@ static int armv7_a7_pmu_init(struct arm_pmu *cpu_pmu)
|
|
cpu_pmu->name = "armv7_cortex_a7";
|
|
cpu_pmu->name = "armv7_cortex_a7";
|
|
cpu_pmu->map_event = armv7_a7_map_event;
|
|
cpu_pmu->map_event = armv7_a7_map_event;
|
|
cpu_pmu->set_event_filter = armv7pmu_set_event_filter;
|
|
cpu_pmu->set_event_filter = armv7pmu_set_event_filter;
|
|
|
|
+ cpu_pmu->pmu.attr_groups = armv7_pmuv2_attr_groups;
|
|
return armv7_probe_num_events(cpu_pmu);
|
|
return armv7_probe_num_events(cpu_pmu);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1128,6 +1245,7 @@ static int armv7_a12_pmu_init(struct arm_pmu *cpu_pmu)
|
|
cpu_pmu->name = "armv7_cortex_a12";
|
|
cpu_pmu->name = "armv7_cortex_a12";
|
|
cpu_pmu->map_event = armv7_a12_map_event;
|
|
cpu_pmu->map_event = armv7_a12_map_event;
|
|
cpu_pmu->set_event_filter = armv7pmu_set_event_filter;
|
|
cpu_pmu->set_event_filter = armv7pmu_set_event_filter;
|
|
|
|
+ cpu_pmu->pmu.attr_groups = armv7_pmuv2_attr_groups;
|
|
return armv7_probe_num_events(cpu_pmu);
|
|
return armv7_probe_num_events(cpu_pmu);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1135,6 +1253,7 @@ static int armv7_a17_pmu_init(struct arm_pmu *cpu_pmu)
|
|
{
|
|
{
|
|
int ret = armv7_a12_pmu_init(cpu_pmu);
|
|
int ret = armv7_a12_pmu_init(cpu_pmu);
|
|
cpu_pmu->name = "armv7_cortex_a17";
|
|
cpu_pmu->name = "armv7_cortex_a17";
|
|
|
|
+ cpu_pmu->pmu.attr_groups = armv7_pmuv2_attr_groups;
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|