hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (C) 2018 SiFive
 * Copyright (C) 2018 Andes Technology Corporation
 *
 */
 
#ifndef _ASM_RISCV_PERF_EVENT_H
#define _ASM_RISCV_PERF_EVENT_H
 
#include <linux/perf_event.h>
#include <linux/ptrace.h>
#include <linux/interrupt.h>
 
#ifdef CONFIG_RISCV_BASE_PMU
#define RISCV_BASE_COUNTERS    2
 
/*
 * The RISCV_MAX_COUNTERS parameter should be specified.
 */
 
#define RISCV_MAX_COUNTERS    2
 
/*
 * These are the indexes of bits in counteren register *minus* 1,
 * except for cycle.  It would be coherent if it can directly mapped
 * to counteren bit definition, but there is a *time* register at
 * counteren[1].  Per-cpu structure is scarce resource here.
 *
 * According to the spec, an implementation can support counter up to
 * mhpmcounter31, but many high-end processors has at most 6 general
 * PMCs, we give the definition to MHPMCOUNTER8 here.
 */
#define RISCV_PMU_CYCLE        0
#define RISCV_PMU_INSTRET    1
#define RISCV_PMU_MHPMCOUNTER3    2
#define RISCV_PMU_MHPMCOUNTER4    3
#define RISCV_PMU_MHPMCOUNTER5    4
#define RISCV_PMU_MHPMCOUNTER6    5
#define RISCV_PMU_MHPMCOUNTER7    6
#define RISCV_PMU_MHPMCOUNTER8    7
 
#define RISCV_OP_UNSUPP        (-EOPNOTSUPP)
 
struct cpu_hw_events {
   /* # currently enabled events*/
   int            n_events;
   /* currently enabled events */
   struct perf_event    *events[RISCV_MAX_COUNTERS];
   /* vendor-defined PMU data */
   void            *platform;
};
 
struct riscv_pmu {
   struct pmu    *pmu;
 
   /* generic hw/cache events table */
   const int    *hw_events;
   const int    (*cache_events)[PERF_COUNT_HW_CACHE_MAX]
                      [PERF_COUNT_HW_CACHE_OP_MAX]
                      [PERF_COUNT_HW_CACHE_RESULT_MAX];
   /* method used to map hw/cache events */
   int        (*map_hw_event)(u64 config);
   int        (*map_cache_event)(u64 config);
 
   /* max generic hw events in map */
   int        max_events;
   /* number total counters, 2(base) + x(general) */
   int        num_counters;
   /* the width of the counter */
   int        counter_width;
 
   /* vendor-defined PMU features */
   void        *platform;
 
   irqreturn_t    (*handle_irq)(int irq_num, void *dev);
   int        irq;
};
 
#endif
#ifdef CONFIG_PERF_EVENTS
#define perf_arch_bpf_user_pt_regs(regs) (struct user_regs_struct *)regs
#endif
 
#endif /* _ASM_RISCV_PERF_EVENT_H */