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