18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci#include "evlist.h"
38c2ecf20Sopenharmony_ci#include "evsel.h"
48c2ecf20Sopenharmony_ci#include "parse-events.h"
58c2ecf20Sopenharmony_ci#include "tests.h"
68c2ecf20Sopenharmony_ci#include "debug.h"
78c2ecf20Sopenharmony_ci#include <errno.h>
88c2ecf20Sopenharmony_ci#include <linux/kernel.h>
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_cistatic int perf_evsel__roundtrip_cache_name_test(void)
118c2ecf20Sopenharmony_ci{
128c2ecf20Sopenharmony_ci	char name[128];
138c2ecf20Sopenharmony_ci	int type, op, err = 0, ret = 0, i, idx;
148c2ecf20Sopenharmony_ci	struct evsel *evsel;
158c2ecf20Sopenharmony_ci	struct evlist *evlist = evlist__new();
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci        if (evlist == NULL)
188c2ecf20Sopenharmony_ci                return -ENOMEM;
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci	for (type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
218c2ecf20Sopenharmony_ci		for (op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
228c2ecf20Sopenharmony_ci			/* skip invalid cache type */
238c2ecf20Sopenharmony_ci			if (!evsel__is_cache_op_valid(type, op))
248c2ecf20Sopenharmony_ci				continue;
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci			for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
278c2ecf20Sopenharmony_ci				__evsel__hw_cache_type_op_res_name(type, op, i, name, sizeof(name));
288c2ecf20Sopenharmony_ci				err = parse_events(evlist, name, NULL);
298c2ecf20Sopenharmony_ci				if (err)
308c2ecf20Sopenharmony_ci					ret = err;
318c2ecf20Sopenharmony_ci			}
328c2ecf20Sopenharmony_ci		}
338c2ecf20Sopenharmony_ci	}
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	idx = 0;
368c2ecf20Sopenharmony_ci	evsel = evlist__first(evlist);
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci	for (type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
398c2ecf20Sopenharmony_ci		for (op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
408c2ecf20Sopenharmony_ci			/* skip invalid cache type */
418c2ecf20Sopenharmony_ci			if (!evsel__is_cache_op_valid(type, op))
428c2ecf20Sopenharmony_ci				continue;
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci			for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
458c2ecf20Sopenharmony_ci				__evsel__hw_cache_type_op_res_name(type, op, i, name, sizeof(name));
468c2ecf20Sopenharmony_ci				if (evsel->idx != idx)
478c2ecf20Sopenharmony_ci					continue;
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci				++idx;
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci				if (strcmp(evsel__name(evsel), name)) {
528c2ecf20Sopenharmony_ci					pr_debug("%s != %s\n", evsel__name(evsel), name);
538c2ecf20Sopenharmony_ci					ret = -1;
548c2ecf20Sopenharmony_ci				}
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci				evsel = evsel__next(evsel);
578c2ecf20Sopenharmony_ci			}
588c2ecf20Sopenharmony_ci		}
598c2ecf20Sopenharmony_ci	}
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci	evlist__delete(evlist);
628c2ecf20Sopenharmony_ci	return ret;
638c2ecf20Sopenharmony_ci}
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_cistatic int __perf_evsel__name_array_test(const char *names[], int nr_names)
668c2ecf20Sopenharmony_ci{
678c2ecf20Sopenharmony_ci	int i, err;
688c2ecf20Sopenharmony_ci	struct evsel *evsel;
698c2ecf20Sopenharmony_ci	struct evlist *evlist = evlist__new();
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci        if (evlist == NULL)
728c2ecf20Sopenharmony_ci                return -ENOMEM;
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_ci	for (i = 0; i < nr_names; ++i) {
758c2ecf20Sopenharmony_ci		err = parse_events(evlist, names[i], NULL);
768c2ecf20Sopenharmony_ci		if (err) {
778c2ecf20Sopenharmony_ci			pr_debug("failed to parse event '%s', err %d\n",
788c2ecf20Sopenharmony_ci				 names[i], err);
798c2ecf20Sopenharmony_ci			goto out_delete_evlist;
808c2ecf20Sopenharmony_ci		}
818c2ecf20Sopenharmony_ci	}
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci	err = 0;
848c2ecf20Sopenharmony_ci	evlist__for_each_entry(evlist, evsel) {
858c2ecf20Sopenharmony_ci		if (strcmp(evsel__name(evsel), names[evsel->idx])) {
868c2ecf20Sopenharmony_ci			--err;
878c2ecf20Sopenharmony_ci			pr_debug("%s != %s\n", evsel__name(evsel), names[evsel->idx]);
888c2ecf20Sopenharmony_ci		}
898c2ecf20Sopenharmony_ci	}
908c2ecf20Sopenharmony_ci
918c2ecf20Sopenharmony_ciout_delete_evlist:
928c2ecf20Sopenharmony_ci	evlist__delete(evlist);
938c2ecf20Sopenharmony_ci	return err;
948c2ecf20Sopenharmony_ci}
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ci#define perf_evsel__name_array_test(names) \
978c2ecf20Sopenharmony_ci	__perf_evsel__name_array_test(names, ARRAY_SIZE(names))
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_ciint test__perf_evsel__roundtrip_name_test(struct test *test __maybe_unused, int subtest __maybe_unused)
1008c2ecf20Sopenharmony_ci{
1018c2ecf20Sopenharmony_ci	int err = 0, ret = 0;
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_ci	err = perf_evsel__name_array_test(evsel__hw_names);
1048c2ecf20Sopenharmony_ci	if (err)
1058c2ecf20Sopenharmony_ci		ret = err;
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ci	err = __perf_evsel__name_array_test(evsel__sw_names, PERF_COUNT_SW_DUMMY + 1);
1088c2ecf20Sopenharmony_ci	if (err)
1098c2ecf20Sopenharmony_ci		ret = err;
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_ci	err = perf_evsel__roundtrip_cache_name_test();
1128c2ecf20Sopenharmony_ci	if (err)
1138c2ecf20Sopenharmony_ci		ret = err;
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ci	return ret;
1168c2ecf20Sopenharmony_ci}
117