// 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" /* All successful D-side store dispatches for this thread with PMC 2 */ #define EventCode_1 0x26080 /* All successful D-side store dispatches for this thread with PMC 4 */ #define EventCode_2 0x46080 /* All successful D-side store dispatches for this thread that were L2 Miss with PMC 3 */ #define EventCode_3 0x36880 /* * Testcase for group constraint check of unit and pmc bits which is * used to program corresponding unit and pmc field in Monitor Mode * Control Register 1 (MMCR1) * One of the event in the group should use PMC 4 incase units field * value is within 6 to 9 otherwise event_open for the group will fail. */ static int group_constraint_unit(void) { struct event *e, events[3]; /* * Check for platform support for the test. * Constraint to use PMC4 with one of the event in group, * when the unit is within 6 to 9 is only applicable on * power9. */ SKIP_IF(platform_check_for_tests()); SKIP_IF(have_hwcap2(PPC_FEATURE2_ARCH_3_1)); /* Init the events for the group contraint check for unit bits */ e = &events[0]; event_init(e, EventCode_1); /* Expected to fail as PMC 4 is not used with unit field value 6 to 9 */ FAIL_IF(!event_open(&events[0])); /* Init the events for the group contraint check for unit bits */ e = &events[1]; event_init(e, EventCode_2); /* Expected to pass as PMC 4 is used with unit field value 6 to 9 */ FAIL_IF(event_open(&events[1])); /* Init the event for the group contraint unit test */ e = &events[2]; event_init(e, EventCode_3); /* Expected to fail as PMC4 is not being used */ FAIL_IF(!event_open_with_group(&events[2], events[0].fd)); /* Expected to succeed as event using PMC4 */ FAIL_IF(event_open_with_group(&events[2], events[1].fd)); event_close(&events[0]); event_close(&events[1]); event_close(&events[2]); return 0; } int main(void) { return test_harness(group_constraint_unit, "group_constraint_unit"); }