root/tools/testing/selftests/powerpc/pmu/event_code_tests/group_pmc56_exclude_constraints_test.c
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright 2022, Athira Rajeev, IBM Corp.
 */

#include <stdio.h>
#include "../event.h"
#include <sys/prctl.h>
#include <limits.h>
#include "../sampling_tests/misc.h"

/*
 * Testcase for group constraint check for
 * Performance Monitor Counter 5 (PMC5) and also
 * Performance Monitor Counter 6 (PMC6).
 * Test that pmc5/6 is excluded from constraint
 * check when scheduled along with group of events.
 */

static int group_pmc56_exclude_constraints(void)
{
        struct event *e, events[3];
        int i;

        /* Check for platform support for the test */
        SKIP_IF(platform_check_for_tests());

        /*
         * PMC5/6 is excluded from constraint bit
         * check along with group of events. Use
         * group of events with PMC5, PMC6 and also
         * event with cache bit (dc_ic) set. Test expects
         * this set of events to go in as a group.
         */
        e = &events[0];
        event_init(e, 0x500fa);

        e = &events[1];
        event_init(e, 0x600f4);

        e = &events[2];
        event_init(e, 0x22C040);

        FAIL_IF(event_open(&events[0]));

        /*
         * The event_open will fail if constraint check fails.
         * Since we are asking for events in a group and since
         * PMC5/PMC6 is excluded from group constraints, even_open
         * should pass.
         */
        for (i = 1; i < 3; i++)
                FAIL_IF(event_open_with_group(&events[i], events[0].fd));

        for (i = 0; i < 3; i++)
                event_close(&events[i]);

        return 0;
}

int main(void)
{
        return test_harness(group_pmc56_exclude_constraints, "group_pmc56_exclude_constraints");
}