Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

arm64: perf: add support for Cortex-A73

The Cortex-A73 uses some implementation defined perf events.

This patch sets up the necessary mapping for Cortex-A73.

Mappings are based on Cortex-A73 TRM r0p2, section 11.9 Events
(pages 11-457 to 11-460).

Signed-off-by: Julien Thierry <julien.thierry@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>

authored by

Julien Thierry and committed by
Will Deacon
5561b6c5 d0d09d4d

+38
+1
Documentation/devicetree/bindings/arm/pmu.txt
··· 9 9 - compatible : should be one of 10 10 "apm,potenza-pmu" 11 11 "arm,armv8-pmuv3" 12 + "arm,cortex-a73-pmu" 12 13 "arm,cortex-a72-pmu" 13 14 "arm,cortex-a57-pmu" 14 15 "arm,cortex-a53-pmu"
+37
arch/arm64/kernel/perf_event.c
··· 255 255 [C(NODE)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV8_IMPDEF_PERFCTR_BUS_ACCESS_WR, 256 256 }; 257 257 258 + static const unsigned armv8_a73_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] 259 + [PERF_COUNT_HW_CACHE_OP_MAX] 260 + [PERF_COUNT_HW_CACHE_RESULT_MAX] = { 261 + PERF_CACHE_MAP_ALL_UNSUPPORTED, 262 + 263 + [C(L1D)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV8_IMPDEF_PERFCTR_L1D_CACHE_RD, 264 + [C(L1D)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV8_IMPDEF_PERFCTR_L1D_CACHE_WR, 265 + 266 + [C(NODE)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV8_IMPDEF_PERFCTR_BUS_ACCESS_RD, 267 + [C(NODE)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV8_IMPDEF_PERFCTR_BUS_ACCESS_WR, 268 + 269 + [C(NODE)][C(OP_READ)][C(RESULT_ACCESS)] = ARMV8_IMPDEF_PERFCTR_BUS_ACCESS_RD, 270 + [C(NODE)][C(OP_WRITE)][C(RESULT_ACCESS)] = ARMV8_IMPDEF_PERFCTR_BUS_ACCESS_WR, 271 + }; 272 + 258 273 static const unsigned armv8_thunder_perf_cache_map[PERF_COUNT_HW_CACHE_MAX] 259 274 [PERF_COUNT_HW_CACHE_OP_MAX] 260 275 [PERF_COUNT_HW_CACHE_RESULT_MAX] = { ··· 883 868 return __armv8_pmuv3_map_event(event, NULL, &armv8_a57_perf_cache_map); 884 869 } 885 870 871 + static int armv8_a73_map_event(struct perf_event *event) 872 + { 873 + return __armv8_pmuv3_map_event(event, NULL, &armv8_a73_perf_cache_map); 874 + } 875 + 886 876 static int armv8_thunder_map_event(struct perf_event *event) 887 877 { 888 878 return __armv8_pmuv3_map_event(event, NULL, ··· 1038 1018 return 0; 1039 1019 } 1040 1020 1021 + static int armv8_a73_pmu_init(struct arm_pmu *cpu_pmu) 1022 + { 1023 + int ret = armv8_pmu_init(cpu_pmu); 1024 + if (ret) 1025 + return ret; 1026 + 1027 + cpu_pmu->name = "armv8_cortex_a73"; 1028 + cpu_pmu->map_event = armv8_a73_map_event; 1029 + cpu_pmu->attr_groups[ARMPMU_ATTR_GROUP_EVENTS] = 1030 + &armv8_pmuv3_events_attr_group; 1031 + cpu_pmu->attr_groups[ARMPMU_ATTR_GROUP_FORMATS] = 1032 + &armv8_pmuv3_format_attr_group; 1033 + 1034 + return 0; 1035 + } 1036 + 1041 1037 static int armv8_thunder_pmu_init(struct arm_pmu *cpu_pmu) 1042 1038 { 1043 1039 int ret = armv8_pmu_init(cpu_pmu); ··· 1091 1055 {.compatible = "arm,cortex-a53-pmu", .data = armv8_a53_pmu_init}, 1092 1056 {.compatible = "arm,cortex-a57-pmu", .data = armv8_a57_pmu_init}, 1093 1057 {.compatible = "arm,cortex-a72-pmu", .data = armv8_a72_pmu_init}, 1058 + {.compatible = "arm,cortex-a73-pmu", .data = armv8_a73_pmu_init}, 1094 1059 {.compatible = "cavium,thunder-pmu", .data = armv8_thunder_pmu_init}, 1095 1060 {.compatible = "brcm,vulcan-pmu", .data = armv8_vulcan_pmu_init}, 1096 1061 {},