1*a77c6976SAthira Rajeev // SPDX-License-Identifier: GPL-2.0-only
2*a77c6976SAthira Rajeev /*
3*a77c6976SAthira Rajeev  * Copyright 2022, Athira Rajeev, IBM Corp.
4*a77c6976SAthira Rajeev  */
5*a77c6976SAthira Rajeev 
6*a77c6976SAthira Rajeev #include <stdio.h>
7*a77c6976SAthira Rajeev #include <sys/prctl.h>
8*a77c6976SAthira Rajeev #include <limits.h>
9*a77c6976SAthira Rajeev #include "../event.h"
10*a77c6976SAthira Rajeev #include "../sampling_tests/misc.h"
11*a77c6976SAthira Rajeev 
12*a77c6976SAthira Rajeev #define PM_DTLB_MISS_16G 0x1c058
13*a77c6976SAthira Rajeev #define PM_DERAT_MISS_2M 0x1c05a
14*a77c6976SAthira Rajeev #define PM_DTLB_MISS_2M 0x1c05c
15*a77c6976SAthira Rajeev #define PM_MRK_DTLB_MISS_1G 0x1d15c
16*a77c6976SAthira Rajeev #define PM_DTLB_MISS_4K 0x2c056
17*a77c6976SAthira Rajeev #define PM_DERAT_MISS_1G 0x2c05a
18*a77c6976SAthira Rajeev #define PM_MRK_DERAT_MISS_2M 0x2d152
19*a77c6976SAthira Rajeev #define PM_MRK_DTLB_MISS_4K  0x2d156
20*a77c6976SAthira Rajeev #define PM_MRK_DTLB_MISS_16G 0x2d15e
21*a77c6976SAthira Rajeev #define PM_DTLB_MISS_64K 0x3c056
22*a77c6976SAthira Rajeev #define PM_MRK_DERAT_MISS_1G 0x3d152
23*a77c6976SAthira Rajeev #define PM_MRK_DTLB_MISS_64K 0x3d156
24*a77c6976SAthira Rajeev #define PM_DISP_HELD_SYNC_HOLD 0x4003c
25*a77c6976SAthira Rajeev #define PM_DTLB_MISS_16M 0x4c056
26*a77c6976SAthira Rajeev #define PM_DTLB_MISS_1G 0x4c05a
27*a77c6976SAthira Rajeev #define PM_MRK_DTLB_MISS_16M 0x4c15e
28*a77c6976SAthira Rajeev #define PM_MRK_ST_DONE_L2 0x10134
29*a77c6976SAthira Rajeev #define PM_RADIX_PWC_L1_HIT 0x1f056
30*a77c6976SAthira Rajeev #define PM_FLOP_CMPL 0x100f4
31*a77c6976SAthira Rajeev #define PM_MRK_NTF_FIN 0x20112
32*a77c6976SAthira Rajeev #define PM_RADIX_PWC_L2_HIT 0x2d024
33*a77c6976SAthira Rajeev #define PM_IFETCH_THROTTLE 0x3405e
34*a77c6976SAthira Rajeev #define PM_MRK_L2_TM_ST_ABORT_SISTER 0x3e15c
35*a77c6976SAthira Rajeev #define PM_RADIX_PWC_L3_HIT 0x3f056
36*a77c6976SAthira Rajeev #define PM_RUN_CYC_SMT2_MODE 0x3006c
37*a77c6976SAthira Rajeev #define PM_TM_TX_PASS_RUN_INST 0x4e014
38*a77c6976SAthira Rajeev 
39*a77c6976SAthira Rajeev #define PVR_POWER9_CUMULUS 0x00002000
40*a77c6976SAthira Rajeev 
41*a77c6976SAthira Rajeev int blacklist_events_dd21[] = {
42*a77c6976SAthira Rajeev 	PM_MRK_ST_DONE_L2,
43*a77c6976SAthira Rajeev 	PM_RADIX_PWC_L1_HIT,
44*a77c6976SAthira Rajeev 	PM_FLOP_CMPL,
45*a77c6976SAthira Rajeev 	PM_MRK_NTF_FIN,
46*a77c6976SAthira Rajeev 	PM_RADIX_PWC_L2_HIT,
47*a77c6976SAthira Rajeev 	PM_IFETCH_THROTTLE,
48*a77c6976SAthira Rajeev 	PM_MRK_L2_TM_ST_ABORT_SISTER,
49*a77c6976SAthira Rajeev 	PM_RADIX_PWC_L3_HIT,
50*a77c6976SAthira Rajeev 	PM_RUN_CYC_SMT2_MODE,
51*a77c6976SAthira Rajeev 	PM_TM_TX_PASS_RUN_INST,
52*a77c6976SAthira Rajeev 	PM_DISP_HELD_SYNC_HOLD,
53*a77c6976SAthira Rajeev };
54*a77c6976SAthira Rajeev 
55*a77c6976SAthira Rajeev int blacklist_events_dd22[] = {
56*a77c6976SAthira Rajeev 	PM_DTLB_MISS_16G,
57*a77c6976SAthira Rajeev 	PM_DERAT_MISS_2M,
58*a77c6976SAthira Rajeev 	PM_DTLB_MISS_2M,
59*a77c6976SAthira Rajeev 	PM_MRK_DTLB_MISS_1G,
60*a77c6976SAthira Rajeev 	PM_DTLB_MISS_4K,
61*a77c6976SAthira Rajeev 	PM_DERAT_MISS_1G,
62*a77c6976SAthira Rajeev 	PM_MRK_DERAT_MISS_2M,
63*a77c6976SAthira Rajeev 	PM_MRK_DTLB_MISS_4K,
64*a77c6976SAthira Rajeev 	PM_MRK_DTLB_MISS_16G,
65*a77c6976SAthira Rajeev 	PM_DTLB_MISS_64K,
66*a77c6976SAthira Rajeev 	PM_MRK_DERAT_MISS_1G,
67*a77c6976SAthira Rajeev 	PM_MRK_DTLB_MISS_64K,
68*a77c6976SAthira Rajeev 	PM_DISP_HELD_SYNC_HOLD,
69*a77c6976SAthira Rajeev 	PM_DTLB_MISS_16M,
70*a77c6976SAthira Rajeev 	PM_DTLB_MISS_1G,
71*a77c6976SAthira Rajeev 	PM_MRK_DTLB_MISS_16M,
72*a77c6976SAthira Rajeev };
73*a77c6976SAthira Rajeev 
74*a77c6976SAthira Rajeev int pvr_min;
75*a77c6976SAthira Rajeev 
76*a77c6976SAthira Rajeev /*
77*a77c6976SAthira Rajeev  * check for power9 support for 2.1 and
78*a77c6976SAthira Rajeev  * 2.2 model where blacklist is applicable.
79*a77c6976SAthira Rajeev  */
check_for_power9_version(void)80*a77c6976SAthira Rajeev int check_for_power9_version(void)
81*a77c6976SAthira Rajeev {
82*a77c6976SAthira Rajeev 	pvr_min = PVR_MIN(mfspr(SPRN_PVR));
83*a77c6976SAthira Rajeev 
84*a77c6976SAthira Rajeev 	SKIP_IF(PVR_VER(pvr) != POWER9);
85*a77c6976SAthira Rajeev 	SKIP_IF(!(pvr & PVR_POWER9_CUMULUS));
86*a77c6976SAthira Rajeev 
87*a77c6976SAthira Rajeev 	SKIP_IF(!(3 - pvr_min));
88*a77c6976SAthira Rajeev 
89*a77c6976SAthira Rajeev 	return 0;
90*a77c6976SAthira Rajeev }
91*a77c6976SAthira Rajeev 
92*a77c6976SAthira Rajeev /*
93*a77c6976SAthira Rajeev  * Testcase to ensure that using blacklisted bits in
94*a77c6976SAthira Rajeev  * event code should cause event_open to fail in power9
95*a77c6976SAthira Rajeev  */
96*a77c6976SAthira Rajeev 
blacklisted_events(void)97*a77c6976SAthira Rajeev static int blacklisted_events(void)
98*a77c6976SAthira Rajeev {
99*a77c6976SAthira Rajeev 	struct event event;
100*a77c6976SAthira Rajeev 	int i = 0;
101*a77c6976SAthira Rajeev 
102*a77c6976SAthira Rajeev 	/* Check for platform support for the test */
103*a77c6976SAthira Rajeev 	SKIP_IF(platform_check_for_tests());
104*a77c6976SAthira Rajeev 
105*a77c6976SAthira Rajeev 	/*
106*a77c6976SAthira Rajeev 	 * check for power9 support for 2.1 and
107*a77c6976SAthira Rajeev 	 * 2.2 model where blacklist is applicable.
108*a77c6976SAthira Rajeev 	 */
109*a77c6976SAthira Rajeev 	SKIP_IF(check_for_power9_version());
110*a77c6976SAthira Rajeev 
111*a77c6976SAthira Rajeev 	/* Skip for Generic compat mode */
112*a77c6976SAthira Rajeev 	SKIP_IF(check_for_generic_compat_pmu());
113*a77c6976SAthira Rajeev 
114*a77c6976SAthira Rajeev 	if (pvr_min == 1) {
115*a77c6976SAthira Rajeev 		for (i = 0; i < ARRAY_SIZE(blacklist_events_dd21); i++) {
116*a77c6976SAthira Rajeev 			event_init(&event, blacklist_events_dd21[i]);
117*a77c6976SAthira Rajeev 			FAIL_IF(!event_open(&event));
118*a77c6976SAthira Rajeev 		}
119*a77c6976SAthira Rajeev 	} else if (pvr_min == 2) {
120*a77c6976SAthira Rajeev 		for (i = 0; i < ARRAY_SIZE(blacklist_events_dd22); i++) {
121*a77c6976SAthira Rajeev 			event_init(&event, blacklist_events_dd22[i]);
122*a77c6976SAthira Rajeev 			FAIL_IF(!event_open(&event));
123*a77c6976SAthira Rajeev 		}
124*a77c6976SAthira Rajeev 	}
125*a77c6976SAthira Rajeev 
126*a77c6976SAthira Rajeev 	return 0;
127*a77c6976SAthira Rajeev }
128*a77c6976SAthira Rajeev 
main(void)129*a77c6976SAthira Rajeev int main(void)
130*a77c6976SAthira Rajeev {
131*a77c6976SAthira Rajeev 	return test_harness(blacklisted_events, "blacklisted_events");
132*a77c6976SAthira Rajeev }
133