1*2becea3bSAthira Rajeev // SPDX-License-Identifier: GPL-2.0-only
2*2becea3bSAthira Rajeev /*
3*2becea3bSAthira Rajeev  * Copyright 2022, Athira Rajeev, IBM Corp.
4*2becea3bSAthira Rajeev  */
5*2becea3bSAthira Rajeev 
6*2becea3bSAthira Rajeev #include <stdio.h>
7*2becea3bSAthira Rajeev #include <stdlib.h>
8*2becea3bSAthira Rajeev 
9*2becea3bSAthira Rajeev #include "../event.h"
10*2becea3bSAthira Rajeev #include "misc.h"
11*2becea3bSAthira Rajeev #include "utils.h"
12*2becea3bSAthira Rajeev 
13*2becea3bSAthira Rajeev /* All successful D-side store dispatches for this thread that were L2 Miss */
14*2becea3bSAthira Rajeev #define EventCode 0x46880
15*2becea3bSAthira Rajeev 
16*2becea3bSAthira Rajeev extern void thirty_two_instruction_loop_with_ll_sc(u64 loops, u64 *ll_sc_target);
17*2becea3bSAthira Rajeev 
18*2becea3bSAthira Rajeev /*
19*2becea3bSAthira Rajeev  * A perf sampling test for mmcr1
20*2becea3bSAthira Rajeev  * fields : comb.
21*2becea3bSAthira Rajeev  */
mmcr1_comb(void)22*2becea3bSAthira Rajeev static int mmcr1_comb(void)
23*2becea3bSAthira Rajeev {
24*2becea3bSAthira Rajeev 	struct event event;
25*2becea3bSAthira Rajeev 	u64 *intr_regs;
26*2becea3bSAthira Rajeev 	u64 dummy;
27*2becea3bSAthira Rajeev 
28*2becea3bSAthira Rajeev 	/* Check for platform support for the test */
29*2becea3bSAthira Rajeev 	SKIP_IF(check_pvr_for_sampling_tests());
30*2becea3bSAthira Rajeev 
31*2becea3bSAthira Rajeev 	/* Init the event for the sampling test */
32*2becea3bSAthira Rajeev 	event_init_sampling(&event, EventCode);
33*2becea3bSAthira Rajeev 	event.attr.sample_regs_intr = platform_extended_mask;
34*2becea3bSAthira Rajeev 	FAIL_IF(event_open(&event));
35*2becea3bSAthira Rajeev 	event.mmap_buffer = event_sample_buf_mmap(event.fd, 1);
36*2becea3bSAthira Rajeev 
37*2becea3bSAthira Rajeev 	FAIL_IF(event_enable(&event));
38*2becea3bSAthira Rajeev 
39*2becea3bSAthira Rajeev 	/* workload to make the event overflow */
40*2becea3bSAthira Rajeev 	thirty_two_instruction_loop_with_ll_sc(10000000, &dummy);
41*2becea3bSAthira Rajeev 
42*2becea3bSAthira Rajeev 	FAIL_IF(event_disable(&event));
43*2becea3bSAthira Rajeev 
44*2becea3bSAthira Rajeev 	/* Check for sample count */
45*2becea3bSAthira Rajeev 	FAIL_IF(!collect_samples(event.mmap_buffer));
46*2becea3bSAthira Rajeev 
47*2becea3bSAthira Rajeev 	intr_regs = get_intr_regs(&event, event.mmap_buffer);
48*2becea3bSAthira Rajeev 
49*2becea3bSAthira Rajeev 	/* Check for intr_regs */
50*2becea3bSAthira Rajeev 	FAIL_IF(!intr_regs);
51*2becea3bSAthira Rajeev 
52*2becea3bSAthira Rajeev 	/*
53*2becea3bSAthira Rajeev 	 * Verify that comb field match with
54*2becea3bSAthira Rajeev 	 * corresponding event code fields
55*2becea3bSAthira Rajeev 	 */
56*2becea3bSAthira Rajeev 	FAIL_IF(EV_CODE_EXTRACT(event.attr.config, comb) !=
57*2becea3bSAthira Rajeev 		get_mmcr1_comb(get_reg_value(intr_regs, "MMCR1"), 4));
58*2becea3bSAthira Rajeev 
59*2becea3bSAthira Rajeev 	event_close(&event);
60*2becea3bSAthira Rajeev 	return 0;
61*2becea3bSAthira Rajeev }
62*2becea3bSAthira Rajeev 
main(void)63*2becea3bSAthira Rajeev int main(void)
64*2becea3bSAthira Rajeev {
65*2becea3bSAthira Rajeev 	return test_harness(mmcr1_comb, "mmcr1_comb");
66*2becea3bSAthira Rajeev }
67