1*c178606aSKajol Jain // SPDX-License-Identifier: GPL-2.0-only
2*c178606aSKajol Jain /*
3*c178606aSKajol Jain  * Copyright 2022, Kajol Jain, IBM Corp.
4*c178606aSKajol Jain  */
5*c178606aSKajol Jain 
6*c178606aSKajol Jain #include <stdio.h>
7*c178606aSKajol Jain #include <stdlib.h>
8*c178606aSKajol Jain 
9*c178606aSKajol Jain #include "../event.h"
10*c178606aSKajol Jain #include "utils.h"
11*c178606aSKajol Jain #include "../sampling_tests/misc.h"
12*c178606aSKajol Jain 
13*c178606aSKajol Jain /*
14*c178606aSKajol Jain  * Primary PMU events used here are PM_MRK_INST_CMPL (0x401e0) and
15*c178606aSKajol Jain  * PM_THRESH_MET (0x101ec).
16*c178606aSKajol Jain  * Threshold event selection used is issue to complete and issue to
17*c178606aSKajol Jain  * finished for cycles
18*c178606aSKajol Jain  * Sampling criteria is Load or Store only sampling
19*c178606aSKajol Jain  */
20*c178606aSKajol Jain #define EventCode_1 0x35340401e0
21*c178606aSKajol Jain #define EventCode_2 0x34340101ec
22*c178606aSKajol Jain #define EventCode_3 0x35340101ec
23*c178606aSKajol Jain 
24*c178606aSKajol Jain /*
25*c178606aSKajol Jain  * Testcase for group constraint check of thresh_ctl bits which is
26*c178606aSKajol Jain  * used to program thresh compare field in Monitor Mode Control Register A
27*c178606aSKajol Jain  * (MMCR0: 48-55).
28*c178606aSKajol Jain  * All events in the group should match thresh ctl bits otherwise
29*c178606aSKajol Jain  * event_open for the group will fail.
30*c178606aSKajol Jain  */
group_constraint_thresh_ctl(void)31*c178606aSKajol Jain static int group_constraint_thresh_ctl(void)
32*c178606aSKajol Jain {
33*c178606aSKajol Jain 	struct event event, leader;
34*c178606aSKajol Jain 
35*c178606aSKajol Jain 	/* Check for platform support for the test */
36*c178606aSKajol Jain 	SKIP_IF(platform_check_for_tests());
37*c178606aSKajol Jain 
38*c178606aSKajol Jain 	/* Init the events for the group contraint thresh control test */
39*c178606aSKajol Jain 	event_init(&leader, EventCode_1);
40*c178606aSKajol Jain 	FAIL_IF(event_open(&leader));
41*c178606aSKajol Jain 
42*c178606aSKajol Jain 	event_init(&event, EventCode_2);
43*c178606aSKajol Jain 
44*c178606aSKajol Jain 	/* Expected to fail as sibling and leader event request different thresh_ctl bits */
45*c178606aSKajol Jain 	FAIL_IF(!event_open_with_group(&event, leader.fd));
46*c178606aSKajol Jain 
47*c178606aSKajol Jain 	event_close(&event);
48*c178606aSKajol Jain 
49*c178606aSKajol Jain 	/* Init the event for the group contraint thresh control test */
50*c178606aSKajol Jain 	event_init(&event, EventCode_3);
51*c178606aSKajol Jain 
52*c178606aSKajol Jain 	 /* Expected to succeed as sibling and leader event request same thresh_ctl bits */
53*c178606aSKajol Jain 	FAIL_IF(event_open_with_group(&event, leader.fd));
54*c178606aSKajol Jain 
55*c178606aSKajol Jain 	event_close(&leader);
56*c178606aSKajol Jain 	event_close(&event);
57*c178606aSKajol Jain 
58*c178606aSKajol Jain 	return 0;
59*c178606aSKajol Jain }
60*c178606aSKajol Jain 
main(void)61*c178606aSKajol Jain int main(void)
62*c178606aSKajol Jain {
63*c178606aSKajol Jain 	return test_harness(group_constraint_thresh_ctl, "group_constraint_thresh_ctl");
64*c178606aSKajol Jain }
65