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 12static 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 24static 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 40int 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