1*84cc4e66SKajol Jain // SPDX-License-Identifier: GPL-2.0-only 2*84cc4e66SKajol Jain /* 3*84cc4e66SKajol Jain * Copyright 2022, Kajol Jain, IBM Corp. 4*84cc4e66SKajol Jain */ 5*84cc4e66SKajol Jain 6*84cc4e66SKajol Jain #include <stdio.h> 7*84cc4e66SKajol Jain #include <stdlib.h> 8*84cc4e66SKajol Jain 9*84cc4e66SKajol Jain #include "../event.h" 10*84cc4e66SKajol Jain #include "misc.h" 11*84cc4e66SKajol Jain #include "utils.h" 12*84cc4e66SKajol Jain 13*84cc4e66SKajol Jain extern void thirty_two_instruction_loop(int loops); 14*84cc4e66SKajol Jain 15*84cc4e66SKajol Jain /* Instructions */ 16*84cc4e66SKajol Jain #define EventCode 0x500fa 17*84cc4e66SKajol Jain 18*84cc4e66SKajol Jain /* 19*84cc4e66SKajol Jain * A perf sampling test for mmcra 20*84cc4e66SKajol Jain * field: bhrb_disable. 21*84cc4e66SKajol Jain */ mmcra_bhrb_disable_test(void)22*84cc4e66SKajol Jainstatic int mmcra_bhrb_disable_test(void) 23*84cc4e66SKajol Jain { 24*84cc4e66SKajol Jain struct event event; 25*84cc4e66SKajol Jain u64 *intr_regs; 26*84cc4e66SKajol Jain 27*84cc4e66SKajol Jain /* 28*84cc4e66SKajol Jain * Check for platform support for the test. 29*84cc4e66SKajol Jain * This test is only aplicable on power10 30*84cc4e66SKajol Jain */ 31*84cc4e66SKajol Jain SKIP_IF(check_pvr_for_sampling_tests()); 32*84cc4e66SKajol Jain SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_3_1)); 33*84cc4e66SKajol Jain 34*84cc4e66SKajol Jain /* Init the event for the sampling test */ 35*84cc4e66SKajol Jain event_init_sampling(&event, EventCode); 36*84cc4e66SKajol Jain event.attr.sample_regs_intr = platform_extended_mask; 37*84cc4e66SKajol Jain event.attr.sample_type |= PERF_SAMPLE_BRANCH_STACK; 38*84cc4e66SKajol Jain event.attr.branch_sample_type = PERF_SAMPLE_BRANCH_ANY; 39*84cc4e66SKajol Jain event.attr.exclude_kernel = 1; 40*84cc4e66SKajol Jain 41*84cc4e66SKajol Jain FAIL_IF(event_open(&event)); 42*84cc4e66SKajol Jain event.mmap_buffer = event_sample_buf_mmap(event.fd, 1); 43*84cc4e66SKajol Jain 44*84cc4e66SKajol Jain FAIL_IF(event_enable(&event)); 45*84cc4e66SKajol Jain 46*84cc4e66SKajol Jain /* workload to make the event overflow */ 47*84cc4e66SKajol Jain thirty_two_instruction_loop(10000); 48*84cc4e66SKajol Jain 49*84cc4e66SKajol Jain FAIL_IF(event_disable(&event)); 50*84cc4e66SKajol Jain 51*84cc4e66SKajol Jain intr_regs = get_intr_regs(&event, event.mmap_buffer); 52*84cc4e66SKajol Jain 53*84cc4e66SKajol Jain /* Check for intr_regs */ 54*84cc4e66SKajol Jain FAIL_IF(!intr_regs); 55*84cc4e66SKajol Jain 56*84cc4e66SKajol Jain /* Verify that bhrb_disable bit is set in MMCRA */ 57*84cc4e66SKajol Jain FAIL_IF(get_mmcra_bhrb_disable(get_reg_value(intr_regs, "MMCRA"), 5)); 58*84cc4e66SKajol Jain 59*84cc4e66SKajol Jain event_close(&event); 60*84cc4e66SKajol Jain return 0; 61*84cc4e66SKajol Jain } 62*84cc4e66SKajol Jain main(void)63*84cc4e66SKajol Jainint main(void) 64*84cc4e66SKajol Jain { 65*84cc4e66SKajol Jain return test_harness(mmcra_bhrb_disable_test, "mmcra_bhrb_disable_test"); 66*84cc4e66SKajol Jain } 67