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

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

/*
 * Testcase for number of counters in use.
 * The number of programmable counters is from
 * performance monitor counter 1 to performance
 * monitor counter 4 (PMC1-PMC4). If number of
 * counters in use exceeds the limit, next event
 * should fail to schedule.
 */

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

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

        /*
         * Test for number of counters in use.
         * Use PMC1 to PMC4 for leader and 3 sibling
         * events. Trying to open fourth event should
         * fail here.
         */
        e = &events[0];
        event_init(e, 0x1001a);

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

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

        e = &events[3];
        event_init(e, 0x40054);

        e = &events[4];
        event_init(e, 0x0002c);

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

        /*
         * The event_open will fail on event 4 if constraint
         * check fails
         */
        for (i = 1; i < 5; i++) {
                if (i == 4)
                        FAIL_IF(!event_open_with_group(&events[i], events[0].fd));
                else
                        FAIL_IF(event_open_with_group(&events[i], events[0].fd));
        }

        for (i = 1; i < 4; i++)
                event_close(&events[i]);

        return 0;
}

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