1*02f02febSKajol Jain // SPDX-License-Identifier: GPL-2.0-only
2*02f02febSKajol Jain /*
3*02f02febSKajol Jain  * Copyright 2022, Kajol Jain, IBM Corp.
4*02f02febSKajol Jain  */
5*02f02febSKajol Jain 
6*02f02febSKajol Jain #include <stdio.h>
7*02f02febSKajol Jain #include <stdlib.h>
8*02f02febSKajol Jain 
9*02f02febSKajol Jain #include "../event.h"
10*02f02febSKajol Jain #include "misc.h"
11*02f02febSKajol Jain #include "utils.h"
12*02f02febSKajol Jain 
13*02f02febSKajol Jain extern void thirty_two_instruction_loop_with_ll_sc(u64 loops, u64 *ll_sc_target);
14*02f02febSKajol Jain 
15*02f02febSKajol Jain /* The data cache was reloaded from local core's L3 due to a demand load */
16*02f02febSKajol Jain #define EventCode 0x1340000001c040
17*02f02febSKajol Jain 
18*02f02febSKajol Jain /*
19*02f02febSKajol Jain  * A perf sampling test for mmcr3
20*02f02febSKajol Jain  * fields.
21*02f02febSKajol Jain  */
mmcr3_src(void)22*02f02febSKajol Jain static int mmcr3_src(void)
23*02f02febSKajol Jain {
24*02f02febSKajol Jain 	struct event event;
25*02f02febSKajol Jain 	u64 *intr_regs;
26*02f02febSKajol Jain 	u64 dummy;
27*02f02febSKajol Jain 
28*02f02febSKajol Jain 	/* Check for platform support for the test */
29*02f02febSKajol Jain 	SKIP_IF(check_pvr_for_sampling_tests());
30*02f02febSKajol Jain 	SKIP_IF(!have_hwcap2(PPC_FEATURE2_ARCH_3_1));
31*02f02febSKajol Jain 
32*02f02febSKajol Jain 	/* Init the event for the sampling test */
33*02f02febSKajol Jain 	event_init_sampling(&event, EventCode);
34*02f02febSKajol Jain 	event.attr.sample_regs_intr = platform_extended_mask;
35*02f02febSKajol Jain 	FAIL_IF(event_open(&event));
36*02f02febSKajol Jain 	event.mmap_buffer = event_sample_buf_mmap(event.fd, 1);
37*02f02febSKajol Jain 
38*02f02febSKajol Jain 	FAIL_IF(event_enable(&event));
39*02f02febSKajol Jain 
40*02f02febSKajol Jain 	/* workload to make event overflow */
41*02f02febSKajol Jain 	thirty_two_instruction_loop_with_ll_sc(1000000, &dummy);
42*02f02febSKajol Jain 
43*02f02febSKajol Jain 	FAIL_IF(event_disable(&event));
44*02f02febSKajol Jain 
45*02f02febSKajol Jain 	/* Check for sample count */
46*02f02febSKajol Jain 	FAIL_IF(!collect_samples(event.mmap_buffer));
47*02f02febSKajol Jain 
48*02f02febSKajol Jain 	intr_regs = get_intr_regs(&event, event.mmap_buffer);
49*02f02febSKajol Jain 
50*02f02febSKajol Jain 	/* Check for intr_regs */
51*02f02febSKajol Jain 	FAIL_IF(!intr_regs);
52*02f02febSKajol Jain 
53*02f02febSKajol Jain 	/*
54*02f02febSKajol Jain 	 * Verify that src field of MMCR3 match with
55*02f02febSKajol Jain 	 * corresponding event code field
56*02f02febSKajol Jain 	 */
57*02f02febSKajol Jain 	FAIL_IF(EV_CODE_EXTRACT(event.attr.config, mmcr3_src) !=
58*02f02febSKajol Jain 		get_mmcr3_src(get_reg_value(intr_regs, "MMCR3"), 1));
59*02f02febSKajol Jain 
60*02f02febSKajol Jain 	event_close(&event);
61*02f02febSKajol Jain 	return 0;
62*02f02febSKajol Jain }
63*02f02febSKajol Jain 
main(void)64*02f02febSKajol Jain int main(void)
65*02f02febSKajol Jain {
66*02f02febSKajol Jain 	return test_harness(mmcr3_src, "mmcr3_src");
67*02f02febSKajol Jain }
68