xref: /OK3568_Linux_fs/kernel/tools/perf/tests/pfm.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Test support for libpfm4 event encodings.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright 2020 Google LLC.
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun #include "tests.h"
8*4882a593Smuzhiyun #include "util/debug.h"
9*4882a593Smuzhiyun #include "util/evlist.h"
10*4882a593Smuzhiyun #include "util/pfm.h"
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/kernel.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #ifdef HAVE_LIBPFM
15*4882a593Smuzhiyun static int test__pfm_events(void);
16*4882a593Smuzhiyun static int test__pfm_group(void);
17*4882a593Smuzhiyun #endif
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun static const struct {
20*4882a593Smuzhiyun 	int (*func)(void);
21*4882a593Smuzhiyun 	const char *desc;
22*4882a593Smuzhiyun } pfm_testcase_table[] = {
23*4882a593Smuzhiyun #ifdef HAVE_LIBPFM
24*4882a593Smuzhiyun 	{
25*4882a593Smuzhiyun 		.func = test__pfm_events,
26*4882a593Smuzhiyun 		.desc = "test of individual --pfm-events",
27*4882a593Smuzhiyun 	},
28*4882a593Smuzhiyun 	{
29*4882a593Smuzhiyun 		.func = test__pfm_group,
30*4882a593Smuzhiyun 		.desc = "test groups of --pfm-events",
31*4882a593Smuzhiyun 	},
32*4882a593Smuzhiyun #endif
33*4882a593Smuzhiyun };
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #ifdef HAVE_LIBPFM
count_pfm_events(struct perf_evlist * evlist)36*4882a593Smuzhiyun static int count_pfm_events(struct perf_evlist *evlist)
37*4882a593Smuzhiyun {
38*4882a593Smuzhiyun 	struct perf_evsel *evsel;
39*4882a593Smuzhiyun 	int count = 0;
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun 	perf_evlist__for_each_entry(evlist, evsel) {
42*4882a593Smuzhiyun 		count++;
43*4882a593Smuzhiyun 	}
44*4882a593Smuzhiyun 	return count;
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun 
test__pfm_events(void)47*4882a593Smuzhiyun static int test__pfm_events(void)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun 	struct evlist *evlist;
50*4882a593Smuzhiyun 	struct option opt;
51*4882a593Smuzhiyun 	size_t i;
52*4882a593Smuzhiyun 	const struct {
53*4882a593Smuzhiyun 		const char *events;
54*4882a593Smuzhiyun 		int nr_events;
55*4882a593Smuzhiyun 	} table[] = {
56*4882a593Smuzhiyun 		{
57*4882a593Smuzhiyun 			.events = "",
58*4882a593Smuzhiyun 			.nr_events = 0,
59*4882a593Smuzhiyun 		},
60*4882a593Smuzhiyun 		{
61*4882a593Smuzhiyun 			.events = "instructions",
62*4882a593Smuzhiyun 			.nr_events = 1,
63*4882a593Smuzhiyun 		},
64*4882a593Smuzhiyun 		{
65*4882a593Smuzhiyun 			.events = "instructions,cycles",
66*4882a593Smuzhiyun 			.nr_events = 2,
67*4882a593Smuzhiyun 		},
68*4882a593Smuzhiyun 		{
69*4882a593Smuzhiyun 			.events = "stereolab",
70*4882a593Smuzhiyun 			.nr_events = 0,
71*4882a593Smuzhiyun 		},
72*4882a593Smuzhiyun 		{
73*4882a593Smuzhiyun 			.events = "instructions,instructions",
74*4882a593Smuzhiyun 			.nr_events = 2,
75*4882a593Smuzhiyun 		},
76*4882a593Smuzhiyun 		{
77*4882a593Smuzhiyun 			.events = "stereolab,instructions",
78*4882a593Smuzhiyun 			.nr_events = 0,
79*4882a593Smuzhiyun 		},
80*4882a593Smuzhiyun 		{
81*4882a593Smuzhiyun 			.events = "instructions,stereolab",
82*4882a593Smuzhiyun 			.nr_events = 1,
83*4882a593Smuzhiyun 		},
84*4882a593Smuzhiyun 	};
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(table); i++) {
87*4882a593Smuzhiyun 		evlist = evlist__new();
88*4882a593Smuzhiyun 		if (evlist == NULL)
89*4882a593Smuzhiyun 			return -ENOMEM;
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 		opt.value = evlist;
92*4882a593Smuzhiyun 		parse_libpfm_events_option(&opt,
93*4882a593Smuzhiyun 					table[i].events,
94*4882a593Smuzhiyun 					0);
95*4882a593Smuzhiyun 		TEST_ASSERT_EQUAL(table[i].events,
96*4882a593Smuzhiyun 				count_pfm_events(&evlist->core),
97*4882a593Smuzhiyun 				table[i].nr_events);
98*4882a593Smuzhiyun 		TEST_ASSERT_EQUAL(table[i].events,
99*4882a593Smuzhiyun 				evlist->nr_groups,
100*4882a593Smuzhiyun 				0);
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun 		evlist__delete(evlist);
103*4882a593Smuzhiyun 	}
104*4882a593Smuzhiyun 	return 0;
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun 
test__pfm_group(void)107*4882a593Smuzhiyun static int test__pfm_group(void)
108*4882a593Smuzhiyun {
109*4882a593Smuzhiyun 	struct evlist *evlist;
110*4882a593Smuzhiyun 	struct option opt;
111*4882a593Smuzhiyun 	size_t i;
112*4882a593Smuzhiyun 	const struct {
113*4882a593Smuzhiyun 		const char *events;
114*4882a593Smuzhiyun 		int nr_events;
115*4882a593Smuzhiyun 		int nr_groups;
116*4882a593Smuzhiyun 	} table[] = {
117*4882a593Smuzhiyun 		{
118*4882a593Smuzhiyun 			.events = "{},",
119*4882a593Smuzhiyun 			.nr_events = 0,
120*4882a593Smuzhiyun 			.nr_groups = 0,
121*4882a593Smuzhiyun 		},
122*4882a593Smuzhiyun 		{
123*4882a593Smuzhiyun 			.events = "{instructions}",
124*4882a593Smuzhiyun 			.nr_events = 1,
125*4882a593Smuzhiyun 			.nr_groups = 1,
126*4882a593Smuzhiyun 		},
127*4882a593Smuzhiyun 		{
128*4882a593Smuzhiyun 			.events = "{instructions},{}",
129*4882a593Smuzhiyun 			.nr_events = 1,
130*4882a593Smuzhiyun 			.nr_groups = 1,
131*4882a593Smuzhiyun 		},
132*4882a593Smuzhiyun 		{
133*4882a593Smuzhiyun 			.events = "{},{instructions}",
134*4882a593Smuzhiyun 			.nr_events = 0,
135*4882a593Smuzhiyun 			.nr_groups = 0,
136*4882a593Smuzhiyun 		},
137*4882a593Smuzhiyun 		{
138*4882a593Smuzhiyun 			.events = "{instructions},{instructions}",
139*4882a593Smuzhiyun 			.nr_events = 2,
140*4882a593Smuzhiyun 			.nr_groups = 2,
141*4882a593Smuzhiyun 		},
142*4882a593Smuzhiyun 		{
143*4882a593Smuzhiyun 			.events = "{instructions,cycles},{instructions,cycles}",
144*4882a593Smuzhiyun 			.nr_events = 4,
145*4882a593Smuzhiyun 			.nr_groups = 2,
146*4882a593Smuzhiyun 		},
147*4882a593Smuzhiyun 		{
148*4882a593Smuzhiyun 			.events = "{stereolab}",
149*4882a593Smuzhiyun 			.nr_events = 0,
150*4882a593Smuzhiyun 			.nr_groups = 0,
151*4882a593Smuzhiyun 		},
152*4882a593Smuzhiyun 		{
153*4882a593Smuzhiyun 			.events =
154*4882a593Smuzhiyun 			"{instructions,cycles},{instructions,stereolab}",
155*4882a593Smuzhiyun 			.nr_events = 3,
156*4882a593Smuzhiyun 			.nr_groups = 1,
157*4882a593Smuzhiyun 		},
158*4882a593Smuzhiyun 	};
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(table); i++) {
161*4882a593Smuzhiyun 		evlist = evlist__new();
162*4882a593Smuzhiyun 		if (evlist == NULL)
163*4882a593Smuzhiyun 			return -ENOMEM;
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 		opt.value = evlist;
166*4882a593Smuzhiyun 		parse_libpfm_events_option(&opt,
167*4882a593Smuzhiyun 					table[i].events,
168*4882a593Smuzhiyun 					0);
169*4882a593Smuzhiyun 		TEST_ASSERT_EQUAL(table[i].events,
170*4882a593Smuzhiyun 				count_pfm_events(&evlist->core),
171*4882a593Smuzhiyun 				table[i].nr_events);
172*4882a593Smuzhiyun 		TEST_ASSERT_EQUAL(table[i].events,
173*4882a593Smuzhiyun 				evlist->nr_groups,
174*4882a593Smuzhiyun 				table[i].nr_groups);
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun 		evlist__delete(evlist);
177*4882a593Smuzhiyun 	}
178*4882a593Smuzhiyun 	return 0;
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun #endif
181*4882a593Smuzhiyun 
test__pfm_subtest_get_desc(int i)182*4882a593Smuzhiyun const char *test__pfm_subtest_get_desc(int i)
183*4882a593Smuzhiyun {
184*4882a593Smuzhiyun 	if (i < 0 || i >= (int)ARRAY_SIZE(pfm_testcase_table))
185*4882a593Smuzhiyun 		return NULL;
186*4882a593Smuzhiyun 	return pfm_testcase_table[i].desc;
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun 
test__pfm_subtest_get_nr(void)189*4882a593Smuzhiyun int test__pfm_subtest_get_nr(void)
190*4882a593Smuzhiyun {
191*4882a593Smuzhiyun 	return (int)ARRAY_SIZE(pfm_testcase_table);
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun 
test__pfm(struct test * test __maybe_unused,int i __maybe_unused)194*4882a593Smuzhiyun int test__pfm(struct test *test __maybe_unused, int i __maybe_unused)
195*4882a593Smuzhiyun {
196*4882a593Smuzhiyun #ifdef HAVE_LIBPFM
197*4882a593Smuzhiyun 	if (i < 0 || i >= (int)ARRAY_SIZE(pfm_testcase_table))
198*4882a593Smuzhiyun 		return TEST_FAIL;
199*4882a593Smuzhiyun 	return pfm_testcase_table[i].func();
200*4882a593Smuzhiyun #else
201*4882a593Smuzhiyun 	return TEST_SKIP;
202*4882a593Smuzhiyun #endif
203*4882a593Smuzhiyun }
204