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 number of counters in use.
12  * The number of programmable counters is from
13  * performance monitor counter 1 to performance
14  * monitor counter 4 (PMC1-PMC4). If number of
15  * counters in use exceeds the limit, next event
16  * should fail to schedule.
17  */
18 
19 static int group_constraint_pmc_count(void)
20 {
21 	struct event *e, events[5];
22 	int i;
23 
24 	/* Check for platform support for the test */
25 	SKIP_IF(platform_check_for_tests());
26 
27 	/*
28 	 * Test for number of counters in use.
29 	 * Use PMC1 to PMC4 for leader and 3 sibling
30 	 * events. Trying to open fourth event should
31 	 * fail here.
32 	 */
33 	e = &events[0];
34 	event_init(e, 0x1001a);
35 
36 	e = &events[1];
37 	event_init(e, 0x200fc);
38 
39 	e = &events[2];
40 	event_init(e, 0x30080);
41 
42 	e = &events[3];
43 	event_init(e, 0x40054);
44 
45 	e = &events[4];
46 	event_init(e, 0x0002c);
47 
48 	FAIL_IF(event_open(&events[0]));
49 
50 	/*
51 	 * The event_open will fail on event 4 if constraint
52 	 * check fails
53 	 */
54 	for (i = 1; i < 5; i++) {
55 		if (i == 4)
56 			FAIL_IF(!event_open_with_group(&events[i], events[0].fd));
57 		else
58 			FAIL_IF(event_open_with_group(&events[i], events[0].fd));
59 	}
60 
61 	for (i = 1; i < 4; i++)
62 		event_close(&events[i]);
63 
64 	return 0;
65 }
66 
67 int main(void)
68 {
69 	return test_harness(group_constraint_pmc_count, "group_constraint_pmc_count");
70 }
71