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