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, config: 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(e: &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(e: &events[i], group_fd: events[0].fd)); |
71 | |
72 | for (i = 0; i < 5; i++) |
73 | event_close(e: &events[i]); |
74 | |
75 | e = &events[0]; |
76 | event_init(e, config: 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(e: &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(e: &events[i], group_fd: events[0].fd)); |
99 | |
100 | for (i = 0; i < 5; i++) |
101 | event_close(e: &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 | |