1 // SPDX-License-Identifier: GPL-2.0 2 #include "arch-tests.h" 3 #include "linux/perf_event.h" 4 #include "tests/tests.h" 5 #include "pmu.h" 6 #include "pmus.h" 7 #include "../perf-sys.h" 8 #include "debug.h" 9 10 #define NR_SUB_TESTS 5 11 12 static struct sub_tests { 13 int type; 14 unsigned long config; 15 bool valid; 16 } sub_tests[NR_SUB_TESTS] = { 17 { PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES, true }, 18 { PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS, false }, 19 { PERF_TYPE_RAW, 0x076, true }, 20 { PERF_TYPE_RAW, 0x0C1, true }, 21 { PERF_TYPE_RAW, 0x012, false }, 22 }; 23 24 static int event_open(int type, unsigned long config) 25 { 26 struct perf_event_attr attr; 27 28 memset(&attr, 0, sizeof(struct perf_event_attr)); 29 attr.type = type; 30 attr.size = sizeof(struct perf_event_attr); 31 attr.config = config; 32 attr.disabled = 1; 33 attr.precise_ip = 1; 34 attr.sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_TID; 35 attr.sample_period = 100000; 36 37 return sys_perf_event_open(&attr, -1, 0, -1, 0); 38 } 39 40 int test__amd_ibs_via_core_pmu(struct test_suite *test __maybe_unused, 41 int subtest __maybe_unused) 42 { 43 struct perf_pmu *ibs_pmu; 44 int ret = TEST_OK; 45 int fd, i; 46 47 ibs_pmu = perf_pmus__find("ibs_op"); 48 if (!ibs_pmu) 49 return TEST_SKIP; 50 51 for (i = 0; i < NR_SUB_TESTS; i++) { 52 fd = event_open(sub_tests[i].type, sub_tests[i].config); 53 pr_debug("type: 0x%x, config: 0x%lx, fd: %d - ", sub_tests[i].type, 54 sub_tests[i].config, fd); 55 if ((sub_tests[i].valid && fd == -1) || 56 (!sub_tests[i].valid && fd > 0)) { 57 pr_debug("Fail\n"); 58 ret = TEST_FAIL; 59 } else { 60 pr_debug("Pass\n"); 61 } 62 63 if (fd > 0) 64 close(fd); 65 } 66 67 return ret; 68 } 69