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
event_alternatives_tests_p10(void)25 static int event_alternatives_tests_p10(void)
26 {
27 struct event *e, events[5];
28 int i;
29 int pvr = PVR_VER(mfspr(SPRN_PVR));
30
31 /* Check for platform support for the test */
32 SKIP_IF(platform_check_for_tests());
33
34 /*
35 * PVR check is used here since PMU specific data like
36 * alternative events is handled by respective PMU driver
37 * code and using PVR will work correctly for all cases
38 * including generic compat mode.
39 */
40 SKIP_IF((pvr != POWER10) && (pvr != POWER11));
41
42 SKIP_IF(check_for_generic_compat_pmu());
43
44 /*
45 * Test for event alternative for 0x0001e
46 * and 0x00002.
47 */
48 e = &events[0];
49 event_init(e, 0x0001e);
50
51 e = &events[1];
52 event_init(e, EventCode_1);
53
54 e = &events[2];
55 event_init(e, EventCode_2);
56
57 e = &events[3];
58 event_init(e, EventCode_3);
59
60 e = &events[4];
61 event_init(e, EventCode_4);
62
63 FAIL_IF(event_open(&events[0]));
64
65 /*
66 * Expected to pass since 0x0001e has alternative event
67 * 0x600f4 in PMC6. So it can go in with other events
68 * in PMC1 to PMC4.
69 */
70 for (i = 1; i < 5; i++)
71 FAIL_IF(event_open_with_group(&events[i], events[0].fd));
72
73 for (i = 0; i < 5; i++)
74 event_close(&events[i]);
75
76 e = &events[0];
77 event_init(e, 0x00002);
78
79 e = &events[1];
80 event_init(e, EventCode_1);
81
82 e = &events[2];
83 event_init(e, EventCode_2);
84
85 e = &events[3];
86 event_init(e, EventCode_3);
87
88 e = &events[4];
89 event_init(e, EventCode_4);
90
91 FAIL_IF(event_open(&events[0]));
92
93 /*
94 * Expected to pass since 0x00020 has alternative event
95 * 0x500fa in PMC5. So it can go in with other events
96 * in PMC1 to PMC4.
97 */
98 for (i = 1; i < 5; i++)
99 FAIL_IF(event_open_with_group(&events[i], events[0].fd));
100
101 for (i = 0; i < 5; i++)
102 event_close(&events[i]);
103
104 return 0;
105 }
106
main(void)107 int main(void)
108 {
109 return test_harness(event_alternatives_tests_p10, "event_alternatives_tests_p10");
110 }
111