--- /dev/null
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright 2022, Kajol Jain, IBM Corp.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "../event.h"
+#include "utils.h"
+#include "../sampling_tests/misc.h"
+
+/*
+ * Primary PMU events used here is PM_MRK_INST_CMPL (0x401e0) and
+ * PM_THRESH_MET (0x101ec)
+ * Threshold event selection used is issue to complete for cycles
+ * Sampling criteria is Load or Store only sampling
+ */
+#define p9_EventCode_1 0x13e35340401e0
+#define p9_EventCode_2 0x17d34340101ec
+#define p9_EventCode_3 0x13e35340101ec
+#define p10_EventCode_1 0x35340401e0
+#define p10_EventCode_2 0x35340101ec
+
+/*
+ * Testcase for group constraint check of thresh_cmp bits which is
+ * used to program thresh compare field in Monitor Mode Control Register A
+ * (MMCRA: 9-18 bits for power9 and MMCRA: 8-18 bits for power10).
+ * All events in the group should match thresh compare bits otherwise
+ * event_open for the group will fail.
+ */
+static int group_constraint_thresh_cmp(void)
+{
+       struct event event, leader;
+
+       /* Check for platform support for the test */
+       SKIP_IF(platform_check_for_tests());
+
+       if (have_hwcap2(PPC_FEATURE2_ARCH_3_1)) {
+               /* Init the events for the group contraint check for thresh_cmp bits */
+               event_init(&leader, p10_EventCode_1);
+
+               /* Add the thresh_cmp value for leader in config1 */
+               leader.attr.config1 = 1000;
+               FAIL_IF(event_open(&leader));
+
+               event_init(&event, p10_EventCode_2);
+
+               /* Add the different thresh_cmp value from the leader event in config1 */
+               event.attr.config1 = 2000;
+
+               /* Expected to fail as sibling and leader event request different thresh_cmp bits */
+               FAIL_IF(!event_open_with_group(&event, leader.fd));
+
+               event_close(&event);
+
+               /* Init the event for the group contraint thresh compare test */
+               event_init(&event, p10_EventCode_2);
+
+               /* Add the same thresh_cmp value for leader and sibling event in config1 */
+               event.attr.config1 = 1000;
+
+               /* Expected to succeed as sibling and leader event request same thresh_cmp bits */
+               FAIL_IF(event_open_with_group(&event, leader.fd));
+
+               event_close(&leader);
+               event_close(&event);
+       } else {
+               /* Init the events for the group contraint check for thresh_cmp bits */
+               event_init(&leader, p9_EventCode_1);
+               FAIL_IF(event_open(&leader));
+
+               event_init(&event, p9_EventCode_2);
+
+               /* Expected to fail as sibling and leader event request different thresh_cmp bits */
+               FAIL_IF(!event_open_with_group(&event, leader.fd));
+
+               event_close(&event);
+
+               /* Init the event for the group contraint thresh compare test */
+               event_init(&event, p9_EventCode_3);
+
+               /* Expected to succeed as sibling and leader event request same thresh_cmp bits */
+               FAIL_IF(event_open_with_group(&event, leader.fd));
+
+               event_close(&leader);
+               event_close(&event);
+       }
+
+       return 0;
+}
+
+int main(void)
+{
+       return test_harness(group_constraint_thresh_cmp, "group_constraint_thresh_cmp");
+}