106d839b4SSukadev Bhattiprolu 206d839b4SSukadev BhattiproluThe contents of this directory allow users to specify PMU events in their 306d839b4SSukadev BhattiproluCPUs by their symbolic names rather than raw event codes (see example below). 406d839b4SSukadev Bhattiprolu 506d839b4SSukadev BhattiproluThe main program in this directory, is the 'jevents', which is built and 606d839b4SSukadev Bhattiproluexecuted _BEFORE_ the perf binary itself is built. 706d839b4SSukadev Bhattiprolu 806d839b4SSukadev BhattiproluThe 'jevents' program tries to locate and process JSON files in the directory 906d839b4SSukadev Bhattiprolutree tools/perf/pmu-events/arch/foo. 1006d839b4SSukadev Bhattiprolu 1106d839b4SSukadev Bhattiprolu - Regular files with '.json' extension in the name are assumed to be 1206d839b4SSukadev Bhattiprolu JSON files, each of which describes a set of PMU events. 1306d839b4SSukadev Bhattiprolu 144c0ab160SJohn Garry - The CSV file that maps a specific CPU to its set of PMU events is to 154c0ab160SJohn Garry be named 'mapfile.csv' (see below for mapfile format). 1606d839b4SSukadev Bhattiprolu 1706d839b4SSukadev Bhattiprolu - Directories are traversed, but all other files are ignored. 1806d839b4SSukadev Bhattiprolu 19e9d32c1bSJohn Garry - To reduce JSON event duplication per architecture, platform JSONs may 20e9d32c1bSJohn Garry use "ArchStdEvent" keyword to dereference an "Architecture standard 21e9d32c1bSJohn Garry events", defined in architecture standard JSONs. 22e9d32c1bSJohn Garry Architecture standard JSONs must be located in the architecture root 23e9d32c1bSJohn Garry folder. Matching is based on the "EventName" field. 24e9d32c1bSJohn Garry 2506d839b4SSukadev BhattiproluThe PMU events supported by a CPU model are expected to grouped into topics 2606d839b4SSukadev Bhattiprolusuch as Pipelining, Cache, Memory, Floating-point etc. All events for a topic 2706d839b4SSukadev Bhattiprolushould be placed in a separate JSON file - where the file name identifies 2806d839b4SSukadev Bhattiproluthe topic. Eg: "Floating-point.json". 2906d839b4SSukadev Bhattiprolu 3006d839b4SSukadev BhattiproluAll the topic JSON files for a CPU model/family should be in a separate 3106d839b4SSukadev Bhattiprolusub directory. Thus for the Silvermont X86 CPU: 3206d839b4SSukadev Bhattiprolu 33*93125562SKim Phillips $ ls tools/perf/pmu-events/arch/x86/silvermont 34*93125562SKim Phillips cache.json memory.json virtual-memory.json 35*93125562SKim Phillips frontend.json pipeline.json 3606d839b4SSukadev Bhattiprolu 3751ce1dccSJohn GarryThe JSONs folder for a CPU model/family may be placed in the root arch 3851ce1dccSJohn Garryfolder, or may be placed in a vendor sub-folder under the arch folder 3951ce1dccSJohn Garryfor instances where the arch and vendor are not the same. 4051ce1dccSJohn Garry 4106d839b4SSukadev BhattiproluUsing the JSON files and the mapfile, 'jevents' generates the C source file, 4206d839b4SSukadev Bhattiprolu'pmu-events.c', which encodes the two sets of tables: 4306d839b4SSukadev Bhattiprolu 4406d839b4SSukadev Bhattiprolu - Set of 'PMU events tables' for all known CPUs in the architecture, 4506d839b4SSukadev Bhattiprolu (one table like the following, per JSON file; table name 'pme_power8' 4606d839b4SSukadev Bhattiprolu is derived from JSON file name, 'power8.json'). 4706d839b4SSukadev Bhattiprolu 4806d839b4SSukadev Bhattiprolu struct pmu_event pme_power8[] = { 4906d839b4SSukadev Bhattiprolu 5006d839b4SSukadev Bhattiprolu ... 5106d839b4SSukadev Bhattiprolu 5206d839b4SSukadev Bhattiprolu { 5306d839b4SSukadev Bhattiprolu .name = "pm_1plus_ppc_cmpl", 5406d839b4SSukadev Bhattiprolu .event = "event=0x100f2", 5506d839b4SSukadev Bhattiprolu .desc = "1 or more ppc insts finished,", 5606d839b4SSukadev Bhattiprolu }, 5706d839b4SSukadev Bhattiprolu 5806d839b4SSukadev Bhattiprolu ... 5906d839b4SSukadev Bhattiprolu } 6006d839b4SSukadev Bhattiprolu 6106d839b4SSukadev Bhattiprolu - A 'mapping table' that maps each CPU of the architecture, to its 6206d839b4SSukadev Bhattiprolu 'PMU events table' 6306d839b4SSukadev Bhattiprolu 6406d839b4SSukadev Bhattiprolu struct pmu_events_map pmu_events_map[] = { 6506d839b4SSukadev Bhattiprolu { 6606d839b4SSukadev Bhattiprolu .cpuid = "004b0000", 6706d839b4SSukadev Bhattiprolu .version = "1", 6806d839b4SSukadev Bhattiprolu .type = "core", 6906d839b4SSukadev Bhattiprolu .table = pme_power8 7006d839b4SSukadev Bhattiprolu }, 7106d839b4SSukadev Bhattiprolu ... 7206d839b4SSukadev Bhattiprolu 7306d839b4SSukadev Bhattiprolu }; 7406d839b4SSukadev Bhattiprolu 7506d839b4SSukadev BhattiproluAfter the 'pmu-events.c' is generated, it is compiled and the resulting 7606d839b4SSukadev Bhattiprolu'pmu-events.o' is added to 'libperf.a' which is then used to build perf. 7706d839b4SSukadev Bhattiprolu 7806d839b4SSukadev BhattiproluNOTES: 7906d839b4SSukadev Bhattiprolu 1. Several CPUs can support same set of events and hence use a common 8006d839b4SSukadev Bhattiprolu JSON file. Hence several entries in the pmu_events_map[] could map 8106d839b4SSukadev Bhattiprolu to a single 'PMU events table'. 8206d839b4SSukadev Bhattiprolu 8306d839b4SSukadev Bhattiprolu 2. The 'pmu-events.h' has an extern declaration for the mapping table 8406d839b4SSukadev Bhattiprolu and the generated 'pmu-events.c' defines this table. 8506d839b4SSukadev Bhattiprolu 8606d839b4SSukadev Bhattiprolu 3. _All_ known CPU tables for architecture are included in the perf 8706d839b4SSukadev Bhattiprolu binary. 8806d839b4SSukadev Bhattiprolu 8906d839b4SSukadev BhattiproluAt run time, perf determines the actual CPU it is running on, finds the 9006d839b4SSukadev Bhattiprolumatching events table and builds aliases for those events. This allows 9106d839b4SSukadev Bhattiproluusers to specify events by their name: 9206d839b4SSukadev Bhattiprolu 9306d839b4SSukadev Bhattiprolu $ perf stat -e pm_1plus_ppc_cmpl sleep 1 9406d839b4SSukadev Bhattiprolu 9506d839b4SSukadev Bhattiproluwhere 'pm_1plus_ppc_cmpl' is a Power8 PMU event. 9606d839b4SSukadev Bhattiprolu 97*93125562SKim PhillipsHowever some errors in processing may cause the alias build to fail. 9806d839b4SSukadev Bhattiprolu 9906d839b4SSukadev BhattiproluMapfile format 10006d839b4SSukadev Bhattiprolu=============== 10106d839b4SSukadev Bhattiprolu 10206d839b4SSukadev BhattiproluThe mapfile enables multiple CPU models to share a single set of PMU events. 10306d839b4SSukadev BhattiproluIt is required even if such mapping is 1:1. 10406d839b4SSukadev Bhattiprolu 10506d839b4SSukadev BhattiproluThe mapfile.csv format is expected to be: 10606d839b4SSukadev Bhattiprolu 10706d839b4SSukadev Bhattiprolu Header line 10806d839b4SSukadev Bhattiprolu CPUID,Version,Dir/path/name,Type 10906d839b4SSukadev Bhattiprolu 11006d839b4SSukadev Bhattiproluwhere: 11106d839b4SSukadev Bhattiprolu 11206d839b4SSukadev Bhattiprolu Comma: 11306d839b4SSukadev Bhattiprolu is the required field delimiter (i.e other fields cannot 11406d839b4SSukadev Bhattiprolu have commas within them). 11506d839b4SSukadev Bhattiprolu 11606d839b4SSukadev Bhattiprolu Comments: 11706d839b4SSukadev Bhattiprolu Lines in which the first character is either '\n' or '#' 11806d839b4SSukadev Bhattiprolu are ignored. 11906d839b4SSukadev Bhattiprolu 12006d839b4SSukadev Bhattiprolu Header line 12106d839b4SSukadev Bhattiprolu The header line is the first line in the file, which is 122*93125562SKim Phillips always _IGNORED_. It can be empty. 12306d839b4SSukadev Bhattiprolu 12406d839b4SSukadev Bhattiprolu CPUID: 12506d839b4SSukadev Bhattiprolu CPUID is an arch-specific char string, that can be used 12606d839b4SSukadev Bhattiprolu to identify CPU (and associate it with a set of PMU events 12706d839b4SSukadev Bhattiprolu it supports). Multiple CPUIDS can point to the same 12806d839b4SSukadev Bhattiprolu File/path/name.json. 12906d839b4SSukadev Bhattiprolu 13006d839b4SSukadev Bhattiprolu Example: 13106d839b4SSukadev Bhattiprolu CPUID == 'GenuineIntel-6-2E' (on x86). 13206d839b4SSukadev Bhattiprolu CPUID == '004b0100' (PVR value in Powerpc) 13306d839b4SSukadev Bhattiprolu Version: 13406d839b4SSukadev Bhattiprolu is the Version of the mapfile. 13506d839b4SSukadev Bhattiprolu 13606d839b4SSukadev Bhattiprolu Dir/path/name: 13706d839b4SSukadev Bhattiprolu is the pathname to the directory containing the CPU's JSON 13806d839b4SSukadev Bhattiprolu files, relative to the directory containing the mapfile.csv 13906d839b4SSukadev Bhattiprolu 14006d839b4SSukadev Bhattiprolu Type: 141*93125562SKim Phillips indicates whether the events are "core" or "uncore" events. 14206d839b4SSukadev Bhattiprolu 14306d839b4SSukadev Bhattiprolu 14406d839b4SSukadev Bhattiprolu Eg: 14506d839b4SSukadev Bhattiprolu 146*93125562SKim Phillips $ grep silvermont tools/perf/pmu-events/arch/x86/mapfile.csv 147*93125562SKim Phillips GenuineIntel-6-37,v13,silvermont,core 148*93125562SKim Phillips GenuineIntel-6-4D,v13,silvermont,core 149*93125562SKim Phillips GenuineIntel-6-4C,v13,silvermont,core 15006d839b4SSukadev Bhattiprolu 15106d839b4SSukadev Bhattiprolu i.e the three CPU models use the JSON files (i.e PMU events) listed 152*93125562SKim Phillips in the directory 'tools/perf/pmu-events/arch/x86/silvermont'. 153