-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
perf: riscv: preliminary RISC-V support
This patch provide a basic PMU, riscv_base_pmu, which supports two general hardware event, instructions and cycles. Furthermore, this PMU serves as a reference implementation to ease the portings in the future. riscv_base_pmu should be able to run on any RISC-V machine that conforms to the Priv-Spec. Note that the latest qemu model hasn't fully support a proper behavior of Priv-Spec 1.10 yet, but work around should be easy with very small fixes. Please check https://github.com/riscv/riscv-qemu/pull/115 for future updates. Cc: Nick Hu <nickhu@andestech.com> Cc: Greentime Hu <greentime@andestech.com> Signed-off-by: Alan Kao <alankao@andestech.com> Signed-off-by: Palmer Dabbelt <palmer@sifive.com>
- Loading branch information
Alan Kao
authored and
Palmer Dabbelt
committed
Jun 4, 2018
1 parent
29dcea8
commit 178e9fc
Showing
5 changed files
with
586 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
/* 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> | ||
|
||
#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 */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.