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 Rajeev static 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 Rajeev int main(void)
57*a7c0ab2eSAthira Rajeev {
58*a7c0ab2eSAthira Rajeev 	return test_harness(mmcr0_cc56run, "mmcr0_cc56run");
59*a7c0ab2eSAthira Rajeev }
60