1 // SPDX-License-Identifier: GPL-2.0 2 #include <string.h> 3 #include <stdio.h> 4 #include <sys/types.h> 5 #include <dirent.h> 6 #include <fcntl.h> 7 #include <linux/stddef.h> 8 #include <linux/perf_event.h> 9 #include <linux/zalloc.h> 10 #include <api/fs/fs.h> 11 #include <errno.h> 12 13 #include "../../../util/intel-pt.h" 14 #include "../../../util/intel-bts.h" 15 #include "../../../util/pmu.h" 16 #include "../../../util/fncache.h" 17 #include "../../../util/pmus.h" 18 #include "mem-events.h" 19 #include "util/env.h" 20 21 void perf_pmu__arch_init(struct perf_pmu *pmu) 22 { 23 struct perf_pmu_caps *ldlat_cap; 24 25 #ifdef HAVE_AUXTRACE_SUPPORT 26 if (!strcmp(pmu->name, INTEL_PT_PMU_NAME)) { 27 pmu->auxtrace = true; 28 pmu->selectable = true; 29 pmu->perf_event_attr_init_default = intel_pt_pmu_default_config; 30 } 31 if (!strcmp(pmu->name, INTEL_BTS_PMU_NAME)) { 32 pmu->auxtrace = true; 33 pmu->selectable = true; 34 } 35 #endif 36 37 if (x86__is_amd_cpu()) { 38 if (strcmp(pmu->name, "ibs_op")) 39 return; 40 41 pmu->mem_events = perf_mem_events_amd; 42 43 if (!perf_pmu__caps_parse(pmu)) 44 return; 45 46 ldlat_cap = perf_pmu__get_cap(pmu, "ldlat"); 47 if (!ldlat_cap || strcmp(ldlat_cap->value, "1")) 48 return; 49 50 perf_mem_events__loads_ldlat = 0; 51 pmu->mem_events = perf_mem_events_amd_ldlat; 52 } else if (pmu->is_core) { 53 if (perf_pmu__have_event(pmu, "mem-loads-aux")) 54 pmu->mem_events = perf_mem_events_intel_aux; 55 else 56 pmu->mem_events = perf_mem_events_intel; 57 } 58 } 59