1*a7c0ab2eSAthira Rajeev // SPDX-License-Identifier: GPL-2.0-only 2*a7c0ab2eSAthira Rajeev /* 3*a7c0ab2eSAthira Rajeev * Copyright 2022, Athira Rajeev, IBM Corp. 4*a7c0ab2eSAthira Rajeev */ 5*a7c0ab2eSAthira Rajeev 6*a7c0ab2eSAthira Rajeev #include <stdio.h> 7*a7c0ab2eSAthira Rajeev #include <stdlib.h> 8*a7c0ab2eSAthira Rajeev 9*a7c0ab2eSAthira Rajeev #include "../event.h" 10*a7c0ab2eSAthira Rajeev #include "misc.h" 11*a7c0ab2eSAthira Rajeev #include "utils.h" 12*a7c0ab2eSAthira Rajeev 13*a7c0ab2eSAthira Rajeev extern void thirty_two_instruction_loop(int loops); 14*a7c0ab2eSAthira Rajeev 15*a7c0ab2eSAthira Rajeev /* 16*a7c0ab2eSAthira Rajeev * A perf sampling test for mmcr0 17*a7c0ab2eSAthira Rajeev * field: cc56run. 18*a7c0ab2eSAthira Rajeev */ mmcr0_cc56run(void)19*a7c0ab2eSAthira Rajeevstatic int mmcr0_cc56run(void) 20*a7c0ab2eSAthira Rajeev { 21*a7c0ab2eSAthira Rajeev struct event event; 22*a7c0ab2eSAthira Rajeev u64 *intr_regs; 23*a7c0ab2eSAthira Rajeev 24*a7c0ab2eSAthira Rajeev /* Check for platform support for the test */ 25*a7c0ab2eSAthira Rajeev SKIP_IF(check_pvr_for_sampling_tests()); 26*a7c0ab2eSAthira Rajeev SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_3_1)); 27*a7c0ab2eSAthira Rajeev 28*a7c0ab2eSAthira Rajeev /* Init the event for the sampling test */ 29*a7c0ab2eSAthira Rajeev event_init_sampling(&event, 0x500fa); 30*a7c0ab2eSAthira Rajeev event.attr.sample_regs_intr = platform_extended_mask; 31*a7c0ab2eSAthira Rajeev FAIL_IF(event_open(&event)); 32*a7c0ab2eSAthira Rajeev event.mmap_buffer = event_sample_buf_mmap(event.fd, 1); 33*a7c0ab2eSAthira Rajeev 34*a7c0ab2eSAthira Rajeev FAIL_IF(event_enable(&event)); 35*a7c0ab2eSAthira Rajeev 36*a7c0ab2eSAthira Rajeev /* workload to make the event overflow */ 37*a7c0ab2eSAthira Rajeev thirty_two_instruction_loop(10000); 38*a7c0ab2eSAthira Rajeev 39*a7c0ab2eSAthira Rajeev FAIL_IF(event_disable(&event)); 40*a7c0ab2eSAthira Rajeev 41*a7c0ab2eSAthira Rajeev /* Check for sample count */ 42*a7c0ab2eSAthira Rajeev FAIL_IF(!collect_samples(event.mmap_buffer)); 43*a7c0ab2eSAthira Rajeev 44*a7c0ab2eSAthira Rajeev intr_regs = get_intr_regs(&event, event.mmap_buffer); 45*a7c0ab2eSAthira Rajeev 46*a7c0ab2eSAthira Rajeev /* Check for intr_regs */ 47*a7c0ab2eSAthira Rajeev FAIL_IF(!intr_regs); 48*a7c0ab2eSAthira Rajeev 49*a7c0ab2eSAthira Rajeev /* Verify that cc56run bit is set in MMCR0 */ 50*a7c0ab2eSAthira Rajeev FAIL_IF(!get_mmcr0_cc56run(get_reg_value(intr_regs, "MMCR0"), 5)); 51*a7c0ab2eSAthira Rajeev 52*a7c0ab2eSAthira Rajeev event_close(&event); 53*a7c0ab2eSAthira Rajeev return 0; 54*a7c0ab2eSAthira Rajeev } 55*a7c0ab2eSAthira Rajeev main(void)56*a7c0ab2eSAthira Rajeevint main(void) 57*a7c0ab2eSAthira Rajeev { 58*a7c0ab2eSAthira Rajeev return test_harness(mmcr0_cc56run, "mmcr0_cc56run"); 59*a7c0ab2eSAthira Rajeev } 60