xref: /linux/tools/perf/pmu-events/README (revision b746a1a2860f4a918f32d10dc569115d282aaf2f)
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