1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- /* 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>
- #define RISCV_BASE_COUNTERS 2
- /*
- * The RISCV_MAX_COUNTERS parameter should be specified.
- */
- #ifdef CONFIG_RISCV_BASE_PMU
- #define RISCV_MAX_COUNTERS 2
- #endif
- #ifndef RISCV_MAX_COUNTERS
- #error "Please provide a valid RISCV_MAX_COUNTERS for the PMU."
- #endif
- /*
- * 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 /* _ASM_RISCV_PERF_EVENT_H */
|