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 /*
11  * Testcase for reserved bits in Monitor Mode Control
12  * Register A (MMCRA) Random Sampling Mode (SM) value.
13  * As per Instruction Set Architecture (ISA), the values
14  * 0x5, 0x9, 0xD, 0x19, 0x1D, 0x1A, 0x1E are reserved
15  * for sampling mode field. Test that having these reserved
16  * bit values should cause event_open to fail.
17  * Input event code uses these sampling bits along with
18  * 401e0 (PM_MRK_INST_CMPL).
19  */
20 
21 static int reserved_bits_mmcra_sample_elig_mode(void)
22 {
23 	struct event event;
24 
25 	/* Check for platform support for the test */
26 	SKIP_IF(platform_check_for_tests());
27 
28 	/* Skip for Generic compat PMU */
29 	SKIP_IF(check_for_generic_compat_pmu());
30 
31 	/*
32 	 * MMCRA Random Sampling Mode (SM) values: 0x5
33 	 * 0x9, 0xD, 0x19, 0x1D, 0x1A, 0x1E is reserved.
34 	 * Expected to fail when using these reserved values.
35 	 */
36 	event_init(&event, 0x50401e0);
37 	FAIL_IF(!event_open(&event));
38 
39 	event_init(&event, 0x90401e0);
40 	FAIL_IF(!event_open(&event));
41 
42 	event_init(&event, 0xD0401e0);
43 	FAIL_IF(!event_open(&event));
44 
45 	event_init(&event, 0x190401e0);
46 	FAIL_IF(!event_open(&event));
47 
48 	event_init(&event, 0x1D0401e0);
49 	FAIL_IF(!event_open(&event));
50 
51 	event_init(&event, 0x1A0401e0);
52 	FAIL_IF(!event_open(&event));
53 
54 	event_init(&event, 0x1E0401e0);
55 	FAIL_IF(!event_open(&event));
56 
57 	/*
58 	 * MMCRA Random Sampling Mode (SM) value 0x10
59 	 * is reserved in power10 and 0xC is reserved in
60 	 * power9.
61 	 */
62 	if (PVR_VER(mfspr(SPRN_PVR)) == POWER10) {
63 		event_init(&event, 0x100401e0);
64 		FAIL_IF(!event_open(&event));
65 	} else if (PVR_VER(mfspr(SPRN_PVR)) == POWER9) {
66 		event_init(&event, 0xC0401e0);
67 		FAIL_IF(!event_open(&event));
68 	}
69 
70 	return 0;
71 }
72 
73 int main(void)
74 {
75 	return test_harness(reserved_bits_mmcra_sample_elig_mode,
76 			    "reserved_bits_mmcra_sample_elig_mode");
77 }
78