1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright 2022, Athira Rajeev, IBM Corp.
4 */
5
6#include <stdio.h>
7#include "../event.h"
8#include "../sampling_tests/misc.h"
9
10#define PM_RUN_CYC_ALT 0x200f4
11#define PM_INST_DISP 0x200f2
12#define PM_BR_2PATH 0x20036
13#define PM_LD_MISS_L1 0x3e054
14#define PM_RUN_INST_CMPL_ALT 0x400fa
15
16#define EventCode_1 0x100fc
17#define EventCode_2 0x200fa
18#define EventCode_3 0x300fc
19#define EventCode_4 0x400fc
20
21/*
22 * Check for event alternatives.
23 */
24
25static int event_alternatives_tests_p10(void)
26{
27 struct event *e, events[5];
28 int i;
29
30 /* Check for platform support for the test */
31 SKIP_IF(platform_check_for_tests());
32
33 /*
34 * PVR check is used here since PMU specific data like
35 * alternative events is handled by respective PMU driver
36 * code and using PVR will work correctly for all cases
37 * including generic compat mode.
38 */
39 SKIP_IF(PVR_VER(mfspr(SPRN_PVR)) != POWER10);
40
41 SKIP_IF(check_for_generic_compat_pmu());
42
43 /*
44 * Test for event alternative for 0x0001e
45 * and 0x00002.
46 */
47 e = &events[0];
48 event_init(e, config: 0x0001e);
49
50 e = &events[1];
51 event_init(e, EventCode_1);
52
53 e = &events[2];
54 event_init(e, EventCode_2);
55
56 e = &events[3];
57 event_init(e, EventCode_3);
58
59 e = &events[4];
60 event_init(e, EventCode_4);
61
62 FAIL_IF(event_open(e: &events[0]));
63
64 /*
65 * Expected to pass since 0x0001e has alternative event
66 * 0x600f4 in PMC6. So it can go in with other events
67 * in PMC1 to PMC4.
68 */
69 for (i = 1; i < 5; i++)
70 FAIL_IF(event_open_with_group(e: &events[i], group_fd: events[0].fd));
71
72 for (i = 0; i < 5; i++)
73 event_close(e: &events[i]);
74
75 e = &events[0];
76 event_init(e, config: 0x00002);
77
78 e = &events[1];
79 event_init(e, EventCode_1);
80
81 e = &events[2];
82 event_init(e, EventCode_2);
83
84 e = &events[3];
85 event_init(e, EventCode_3);
86
87 e = &events[4];
88 event_init(e, EventCode_4);
89
90 FAIL_IF(event_open(e: &events[0]));
91
92 /*
93 * Expected to pass since 0x00020 has alternative event
94 * 0x500fa in PMC5. So it can go in with other events
95 * in PMC1 to PMC4.
96 */
97 for (i = 1; i < 5; i++)
98 FAIL_IF(event_open_with_group(e: &events[i], group_fd: events[0].fd));
99
100 for (i = 0; i < 5; i++)
101 event_close(e: &events[i]);
102
103 return 0;
104}
105
106int main(void)
107{
108 return test_harness(event_alternatives_tests_p10, "event_alternatives_tests_p10");
109}
110

source code of linux/tools/testing/selftests/powerpc/pmu/event_code_tests/event_alternatives_tests_p10.c