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 if (list_empty(&pmus)) 48 perf_pmu__scan(NULL); 49 50 ibs_pmu = perf_pmu__find("ibs_op"); 51 if (!ibs_pmu) 52 return TEST_SKIP; 53 54 for (i = 0; i < NR_SUB_TESTS; i++) { 55 fd = event_open(sub_tests[i].type, sub_tests[i].config); 56 pr_debug("type: 0x%x, config: 0x%lx, fd: %d - ", sub_tests[i].type, 57 sub_tests[i].config, fd); 58 if ((sub_tests[i].valid && fd == -1) || 59 (!sub_tests[i].valid && fd > 0)) { 60 pr_debug("Fail\n"); 61 ret = TEST_FAIL; 62 } else { 63 pr_debug("Pass\n"); 64 } 65 66 if (fd > 0) 67 close(fd); 68 } 69 70 return ret; 71 } 72