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