// SPDX-License-Identifier: GPL-2.0-only /* * Copyright 2022, Athira Rajeev, IBM Corp. */ #include <stdio.h> #include "../event.h" #include "../sampling_tests/misc.h" #define PM_RUN_CYC_ALT 0x200f4 #define PM_INST_DISP 0x200f2 #define PM_BR_2PATH 0x20036 #define PM_LD_MISS_L1 0x3e054 #define PM_RUN_INST_CMPL_ALT 0x400fa #define EventCode_1 0x200fa #define EventCode_2 0x200fc #define EventCode_3 0x300fc #define EventCode_4 0x400fc /* * Check for event alternatives. */ static int event_alternatives_tests_p9(void) { struct event event, leader; /* Check for platform support for the test */ SKIP_IF(platform_check_for_tests()); /* * PVR check is used here since PMU specific data like * alternative events is handled by respective PMU driver * code and using PVR will work correctly for all cases * including generic compat mode. */ SKIP_IF(PVR_VER(mfspr(SPRN_PVR)) != POWER9); /* Skip for generic compat PMU */ SKIP_IF(check_for_generic_compat_pmu()); /* Init the event for PM_RUN_CYC_ALT */ event_init(&leader, PM_RUN_CYC_ALT); FAIL_IF(event_open(&leader)); event_init(&event, EventCode_1); /* * Expected to pass since PM_RUN_CYC_ALT in PMC2 has alternative event * 0x600f4. So it can go in with EventCode_1 which is using PMC2 */ FAIL_IF(event_open_with_group(&event, leader.fd)); event_close(&leader); event_close(&event); event_init(&leader, PM_INST_DISP); FAIL_IF(event_open(&leader)); event_init(&event, EventCode_2); /* * Expected to pass since PM_INST_DISP in PMC2 has alternative event * 0x300f2 in PMC3. So it can go in with EventCode_2 which is using PMC2 */ FAIL_IF(event_open_with_group(&event, leader.fd)); event_close(&leader); event_close(&event); event_init(&leader, PM_BR_2PATH); FAIL_IF(event_open(&leader)); event_init(&event, EventCode_2); /* * Expected to pass since PM_BR_2PATH in PMC2 has alternative event * 0x40036 in PMC4. So it can go in with EventCode_2 which is using PMC2 */ FAIL_IF(event_open_with_group(&event, leader.fd)); event_close(&leader); event_close(&event); event_init(&leader, PM_LD_MISS_L1); FAIL_IF(event_open(&leader)); event_init(&event, EventCode_3); /* * Expected to pass since PM_LD_MISS_L1 in PMC3 has alternative event * 0x400f0 in PMC4. So it can go in with EventCode_3 which is using PMC3 */ FAIL_IF(event_open_with_group(&event, leader.fd)); event_close(&leader); event_close(&event); event_init(&leader, PM_RUN_INST_CMPL_ALT); FAIL_IF(event_open(&leader)); event_init(&event, EventCode_4); /* * Expected to pass since PM_RUN_INST_CMPL_ALT in PMC4 has alternative event * 0x500fa in PMC5. So it can go in with EventCode_4 which is using PMC4 */ FAIL_IF(event_open_with_group(&event, leader.fd)); event_close(&leader); event_close(&event); return 0; } int main(void) { return test_harness(event_alternatives_tests_p9, "event_alternatives_tests_p9"); }