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 
25 static 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, 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(&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(&events[i], events[0].fd));
71 
72 	for (i = 0; i < 5; i++)
73 		event_close(&events[i]);
74 
75 	e = &events[0];
76 	event_init(e, 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(&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(&events[i], events[0].fd));
99 
100 	for (i = 0; i < 5; i++)
101 		event_close(&events[i]);
102 
103 	return 0;
104 }
105 
106 int main(void)
107 {
108 	return test_harness(event_alternatives_tests_p10, "event_alternatives_tests_p10");
109 }
110