Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/powerpc/pmu/: Add interface test for mmcr0_fc56 field using pmc1

The testcase uses event code 0x1001e to verify two bit settings (FC5-6
and PMC1CE) in Monitor Mode Control Register 0 (MMCR0). Check if FC5-6
bit to be set in MMCR0 when not using Performance Monitor Counter 5 and
6 (PMC5 and PMC6). And also PMC1CE is expected to be set when using
PMC1. Test if these fields are programmed correctly via perf interface.

Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
[mpe: Add error checking, drop GET_MMCR_FIELD, add to .gitignore]
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220127072012.662451-14-kjain@linux.ibm.com

authored by

Athira Rajeev and committed by
Michael Ellerman
d5172f25 9ac7c6d5

+61 -1
+1
tools/testing/selftests/powerpc/pmu/sampling_tests/.gitignore
··· 2 2 mmcr0_cc56run_test 3 3 mmcr0_pmccext_test 4 4 mmcr0_pmcjce_test 5 + mmcr0_fc56_pmc1ce_test
+1 -1
tools/testing/selftests/powerpc/pmu/sampling_tests/Makefile
··· 2 2 CFLAGS += -m64 3 3 4 4 TEST_GEN_PROGS := mmcr0_exceptionbits_test mmcr0_cc56run_test mmcr0_pmccext_test \ 5 - mmcr0_pmcjce_test 5 + mmcr0_pmcjce_test mmcr0_fc56_pmc1ce_test 6 6 7 7 top_srcdir = ../../../../../.. 8 8 include ../../../lib.mk
+59
tools/testing/selftests/powerpc/pmu/sampling_tests/mmcr0_fc56_pmc1ce_test.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Copyright 2022, Athira Rajeev, IBM Corp. 4 + */ 5 + 6 + #include <stdio.h> 7 + #include <stdlib.h> 8 + 9 + #include "../event.h" 10 + #include "misc.h" 11 + #include "utils.h" 12 + 13 + extern void thirty_two_instruction_loop(int loops); 14 + 15 + /* 16 + * A perf sampling test for mmcr0 17 + * fields: fc56, pmc1ce. 18 + */ 19 + static int mmcr0_fc56_pmc1ce(void) 20 + { 21 + struct event event; 22 + u64 *intr_regs; 23 + 24 + /* Check for platform support for the test */ 25 + SKIP_IF(check_pvr_for_sampling_tests()); 26 + 27 + /* Init the event for the sampling test */ 28 + event_init_sampling(&event, 0x1001e); 29 + event.attr.sample_regs_intr = platform_extended_mask; 30 + FAIL_IF(event_open(&event)); 31 + event.mmap_buffer = event_sample_buf_mmap(event.fd, 1); 32 + 33 + FAIL_IF(event_enable(&event)); 34 + 35 + /* workload to make the event overflow */ 36 + thirty_two_instruction_loop(10000); 37 + 38 + FAIL_IF(event_disable(&event)); 39 + 40 + /* Check for sample count */ 41 + FAIL_IF(!collect_samples(event.mmap_buffer)); 42 + 43 + intr_regs = get_intr_regs(&event, event.mmap_buffer); 44 + 45 + /* Check for intr_regs */ 46 + FAIL_IF(!intr_regs); 47 + 48 + /* Verify that fc56, pmc1ce fields are set in MMCR0 */ 49 + FAIL_IF(!get_mmcr0_fc56(get_reg_value(intr_regs, "MMCR0"), 1)); 50 + FAIL_IF(!get_mmcr0_pmc1ce(get_reg_value(intr_regs, "MMCR0"), 1)); 51 + 52 + event_close(&event); 53 + return 0; 54 + } 55 + 56 + int main(void) 57 + { 58 + return test_harness(mmcr0_fc56_pmc1ce, "mmcr0_fc56_pmc1ce"); 59 + }