#define QUADD_AA64_CPU_IMP_NVIDIA 'N'
#define QUADD_AA64_CPU_IDCODE_CORTEX_A57 0x01
-
+#define QUADD_AA64_CPU_IDCODE_CORTEX_A53 0x03
enum {
QUADD_AA64_CPU_TYPE_UNKNOWN = 1,
+ QUADD_AA64_CPU_TYPE_UNKNOWN_IMP,
QUADD_AA64_CPU_TYPE_ARM,
+ QUADD_AA64_CPU_TYPE_CORTEX_A53,
QUADD_AA64_CPU_TYPE_CORTEX_A57,
- QUADD_AA64_CPU_TYPE_UNKNOWN_IMP,
QUADD_AA64_CPU_TYPE_DENVER,
};
QUADD_ARMV8_HW_EVENT_BUS_CYCLES = 0x1D,
};
+/*
+ * ARMv8 Cortex-A57 specific event types.
+ */
+enum {
+ QUADD_ARMV8_A57_HW_EVENT_L1D_CACHE_REFILL_LD = 0x42,
+ QUADD_ARMV8_A57_HW_EVENT_L1D_CACHE_REFILL_ST = 0x43,
+ QUADD_ARMV8_A57_HW_EVENT_L2D_CACHE_REFILL_LD = 0x52,
+ QUADD_ARMV8_A57_HW_EVENT_L2D_CACHE_REFILL_ST = 0x53,
+};
+
#define QUADD_ARMV8_UNSUPPORTED_EVENT 0xff00
#define QUADD_ARMV8_CPU_CYCLE_EVENT 0xffff
static struct quadd_pmu_ctx pmu_ctx;
-static unsigned quadd_armv8_pmuv3_events_map[QUADD_EVENT_TYPE_MAX] = {
+static unsigned
+quadd_armv8_pmuv3_arm_events_map[QUADD_EVENT_TYPE_MAX] = {
+ [QUADD_EVENT_TYPE_INSTRUCTIONS] =
+ QUADD_ARMV8_HW_EVENT_INSTR_EXECUTED,
+ [QUADD_EVENT_TYPE_BRANCH_INSTRUCTIONS] =
+ QUADD_ARMV8_UNSUPPORTED_EVENT,
+ [QUADD_EVENT_TYPE_BRANCH_MISSES] =
+ QUADD_ARMV8_HW_EVENT_PC_BRANCH_MIS_PRED,
+ [QUADD_EVENT_TYPE_BUS_CYCLES] =
+ QUADD_ARMV8_UNSUPPORTED_EVENT,
+
+ [QUADD_EVENT_TYPE_L1_DCACHE_READ_MISSES] =
+ QUADD_ARMV8_HW_EVENT_L1_DCACHE_REFILL,
+ [QUADD_EVENT_TYPE_L1_DCACHE_WRITE_MISSES] =
+ QUADD_ARMV8_HW_EVENT_L1_DCACHE_REFILL,
+ [QUADD_EVENT_TYPE_L1_ICACHE_MISSES] =
+ QUADD_ARMV8_HW_EVENT_L1_ICACHE_REFILL,
+
+ [QUADD_EVENT_TYPE_L2_DCACHE_READ_MISSES] =
+ QUADD_ARMV8_HW_EVENT_L2_CACHE_REFILL,
+ [QUADD_EVENT_TYPE_L2_DCACHE_WRITE_MISSES] =
+ QUADD_ARMV8_HW_EVENT_L2_CACHE_REFILL,
+ [QUADD_EVENT_TYPE_L2_ICACHE_MISSES] =
+ QUADD_ARMV8_UNSUPPORTED_EVENT,
+};
+
+static unsigned
+quadd_armv8_pmuv3_a57_events_map[QUADD_EVENT_TYPE_MAX] = {
+ [QUADD_EVENT_TYPE_INSTRUCTIONS] =
+ QUADD_ARMV8_HW_EVENT_INSTR_EXECUTED,
+ [QUADD_EVENT_TYPE_BRANCH_INSTRUCTIONS] =
+ QUADD_ARMV8_UNSUPPORTED_EVENT,
+ [QUADD_EVENT_TYPE_BRANCH_MISSES] =
+ QUADD_ARMV8_HW_EVENT_PC_BRANCH_MIS_PRED,
+ [QUADD_EVENT_TYPE_BUS_CYCLES] =
+ QUADD_ARMV8_UNSUPPORTED_EVENT,
+
+ [QUADD_EVENT_TYPE_L1_DCACHE_READ_MISSES] =
+ QUADD_ARMV8_A57_HW_EVENT_L1D_CACHE_REFILL_LD,
+ [QUADD_EVENT_TYPE_L1_DCACHE_WRITE_MISSES] =
+ QUADD_ARMV8_A57_HW_EVENT_L1D_CACHE_REFILL_ST,
+ [QUADD_EVENT_TYPE_L1_ICACHE_MISSES] =
+ QUADD_ARMV8_HW_EVENT_L1_ICACHE_REFILL,
+
+ [QUADD_EVENT_TYPE_L2_DCACHE_READ_MISSES] =
+ QUADD_ARMV8_A57_HW_EVENT_L2D_CACHE_REFILL_LD,
+ [QUADD_EVENT_TYPE_L2_DCACHE_WRITE_MISSES] =
+ QUADD_ARMV8_A57_HW_EVENT_L2D_CACHE_REFILL_ST,
+ [QUADD_EVENT_TYPE_L2_ICACHE_MISSES] =
+ QUADD_ARMV8_UNSUPPORTED_EVENT,
+};
+
+static unsigned
+quadd_armv8_pmuv3_denver_events_map[QUADD_EVENT_TYPE_MAX] = {
[QUADD_EVENT_TYPE_INSTRUCTIONS] =
QUADD_ARMV8_HW_EVENT_INSTR_EXECUTED,
[QUADD_EVENT_TYPE_BRANCH_INSTRUCTIONS] =
strncpy(pmu_ctx.arch.name, "Unknown", sizeof(pmu_ctx.arch.name));
pmu_ctx.arch.type = QUADD_AA64_CPU_TYPE_UNKNOWN;
pmu_ctx.arch.ver = 0;
+ pmu_ctx.current_map = NULL;
switch (aa64_dfr) {
case QUADD_AA64_PMUVER_PMUV3:
pmu_ctx.counters_mask =
QUADD_ARMV8_COUNTERS_MASK_PMUV3;
- pmu_ctx.current_map = quadd_armv8_pmuv3_events_map;
+ pmu_ctx.current_map =
+ quadd_armv8_pmuv3_arm_events_map;
pmcr = armv8_pmu_pmcr_read();
strlen(pmu_ctx.arch.name));
pmu_ctx.arch.name[sizeof(pmu_ctx.arch.name) - 1] = '\0';
- if (idcode == QUADD_AA64_CPU_IDCODE_CORTEX_A57) {
+ if (idcode == QUADD_AA64_CPU_IDCODE_CORTEX_A53) {
+ pmu_ctx.arch.type =
+ QUADD_AA64_CPU_TYPE_CORTEX_A53;
+
+ strncat(pmu_ctx.arch.name, " CORTEX-A53",
+ sizeof(pmu_ctx.arch.name) -
+ strlen(pmu_ctx.arch.name));
+ } else if (idcode == QUADD_AA64_CPU_IDCODE_CORTEX_A57) {
pmu_ctx.arch.type =
QUADD_AA64_CPU_TYPE_CORTEX_A57;
- strncat(pmu_ctx.arch.name, " CORTEX_A57",
+ pmu_ctx.current_map =
+ quadd_armv8_pmuv3_a57_events_map;
+
+ strncat(pmu_ctx.arch.name, " CORTEX-A57",
sizeof(pmu_ctx.arch.name) -
strlen(pmu_ctx.arch.name));
} else {
strncat(pmu_ctx.arch.name, " NVIDIA (Denver)",
sizeof(pmu_ctx.arch.name) -
strlen(pmu_ctx.arch.name));
+
pmu_ctx.arch.type = QUADD_AA64_CPU_TYPE_DENVER;
pmu_ctx.arch.ver = ext_ver;
+ pmu_ctx.current_map =
+ quadd_armv8_pmuv3_denver_events_map;
} else {
strncat(pmu_ctx.arch.name, " Unknown implementor code",
sizeof(pmu_ctx.arch.name) -