mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
RISC-V: Add perf platform driver based on SBI PMU extension
RISC-V SBI specification added a PMU extension that allows to configure start/stop any pmu counter. The RISC-V perf can use most of the generic perf features except interrupt overflow and event filtering based on privilege mode which will be added in future. It also allows to monitor a handful of firmware counters that can provide insights into firmware activity during a performance analysis. Signed-off-by: Atish Patra <atish.patra@wdc.com> Signed-off-by: Atish Patra <atishp@rivosinc.com> Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
This commit is contained in:
committed by
Palmer Dabbelt
parent
90beae5185
commit
e999143459
@@ -76,6 +76,16 @@ config RISCV_PMU_LEGACY
|
||||
of cycle/instruction counter and doesn't support counter overflow,
|
||||
or programmable counters. It will be removed in future.
|
||||
|
||||
config RISCV_PMU_SBI
|
||||
depends on RISCV_PMU && RISCV_SBI
|
||||
bool "RISC-V PMU based on SBI PMU extension"
|
||||
default y
|
||||
help
|
||||
Say y if you want to use the CPU performance monitor
|
||||
using SBI PMU extension on RISC-V based systems. This option provides
|
||||
full perf feature support i.e. counter overflow, privilege mode
|
||||
filtering, counter configuration.
|
||||
|
||||
config ARM_PMU_ACPI
|
||||
depends on ARM_PMU && ACPI
|
||||
def_bool y
|
||||
|
||||
@@ -12,6 +12,7 @@ obj-$(CONFIG_QCOM_L2_PMU) += qcom_l2_pmu.o
|
||||
obj-$(CONFIG_QCOM_L3_PMU) += qcom_l3_pmu.o
|
||||
obj-$(CONFIG_RISCV_PMU) += riscv_pmu.o
|
||||
obj-$(CONFIG_RISCV_PMU_LEGACY) += riscv_pmu_legacy.o
|
||||
obj-$(CONFIG_RISCV_PMU_SBI) += riscv_pmu_sbi.o
|
||||
obj-$(CONFIG_THUNDERX2_PMU) += thunderx2_pmu.o
|
||||
obj-$(CONFIG_XGENE_PMU) += xgene_pmu.o
|
||||
obj-$(CONFIG_ARM_SPE_PMU) += arm_spe_pmu.o
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
#include <linux/printk.h>
|
||||
#include <linux/smp.h>
|
||||
|
||||
#include <asm/sbi.h>
|
||||
|
||||
static unsigned long csr_read_num(int csr_num)
|
||||
{
|
||||
#define switchcase_csr_read(__csr_num, __val) {\
|
||||
|
||||
578
drivers/perf/riscv_pmu_sbi.c
Normal file
578
drivers/perf/riscv_pmu_sbi.c
Normal file
File diff suppressed because it is too large
Load Diff
@@ -165,6 +165,7 @@ enum cpuhp_state {
|
||||
CPUHP_AP_PERF_ARM_HW_BREAKPOINT_STARTING,
|
||||
CPUHP_AP_PERF_ARM_ACPI_STARTING,
|
||||
CPUHP_AP_PERF_ARM_STARTING,
|
||||
CPUHP_AP_PERF_RISCV_STARTING,
|
||||
CPUHP_AP_ARM_L2X0_STARTING,
|
||||
CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING,
|
||||
CPUHP_AP_ARM_ARCH_TIMER_STARTING,
|
||||
|
||||
@@ -31,8 +31,10 @@ struct cpu_hw_events {
|
||||
int n_events;
|
||||
/* currently enabled events */
|
||||
struct perf_event *events[RISCV_MAX_COUNTERS];
|
||||
/* currently enabled counters */
|
||||
DECLARE_BITMAP(used_event_ctrs, RISCV_MAX_COUNTERS);
|
||||
/* currently enabled hardware counters */
|
||||
DECLARE_BITMAP(used_hw_ctrs, RISCV_MAX_COUNTERS);
|
||||
/* currently enabled firmware counters */
|
||||
DECLARE_BITMAP(used_fw_ctrs, RISCV_MAX_COUNTERS);
|
||||
};
|
||||
|
||||
struct riscv_pmu {
|
||||
|
||||
Reference in New Issue
Block a user