// SPDX-License-Identifier: GPL-2.0 #include "arch-tests.h" #include "linux/perf_event.h" #include "tests/tests.h" #include "pmu.h" #include "pmus.h" #include "../perf-sys.h" #include "debug.h" #define NR_SUB_TESTS 5 static struct sub_tests { int type; unsigned long config; bool valid; } sub_tests[NR_SUB_TESTS] = { { PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES, true }, { PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS, false }, { PERF_TYPE_RAW, 0x076, true }, { PERF_TYPE_RAW, 0x0C1, true }, { PERF_TYPE_RAW, 0x012, false }, }; static int event_open(int type, unsigned long config) { struct perf_event_attr attr; memset(&attr, 0, sizeof(struct perf_event_attr)); attr.type = type; attr.size = sizeof(struct perf_event_attr); attr.config = config; attr.disabled = 1; attr.precise_ip = 1; attr.sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_TID; attr.sample_period = 100000; return sys_perf_event_open(&attr, -1, 0, -1, 0); } int test__amd_ibs_via_core_pmu(struct test_suite *test __maybe_unused, int subtest __maybe_unused) { struct perf_pmu *ibs_pmu; int ret = TEST_OK; int fd, i; ibs_pmu = perf_pmus__find("ibs_op"); if (!ibs_pmu) return TEST_SKIP; for (i = 0; i < NR_SUB_TESTS; i++) { fd = event_open(sub_tests[i].type, sub_tests[i].config); pr_debug("type: 0x%x, config: 0x%lx, fd: %d - ", sub_tests[i].type, sub_tests[i].config, fd); if ((sub_tests[i].valid && fd == -1) || (!sub_tests[i].valid && fd > 0)) { pr_debug("Fail\n"); ret = TEST_FAIL; } else { pr_debug("Pass\n"); } if (fd > 0) close(fd); } return ret; }