Re: [PATCH v8 17/22] RISC-V: perf: Add legacy event encodings via sysfs

From: Charlie Jenkins

Date: Mon Jul 20 2026 - 03:29:19 EST


# Add your code comments below. There is no need to trim or delete
# any existing content -- just insert your comments under the relevant
# lines of code. Lines starting with "> " are quoted diff context and
# lines starting with "| " are comments from other reviewers.
# The final email will be reformatted automatically to include only
# the sections that have your comments.
#
> Define sysfs details for the legacy events so that any tool can
> parse these to understand the minimum set of legacy events
> supported by the platform. The sysfs entry will describe both event
> encoding and corresponding counter map so that an perf event can be
> programmed accordingly.
>
> Signed-off-by: Atish Patra <atishp@xxxxxxxxxxxx>
>
> diff --git a/drivers/perf/riscv_pmu_sbi.c b/drivers/perf/riscv_pmu_sbi.c
> index 19d9e4750424..8d56bef95a1b 100644
> --- a/drivers/perf/riscv_pmu_sbi.c
> +++ b/drivers/perf/riscv_pmu_sbi.c
> @@ -131,7 +131,20 @@ static struct attribute_group riscv_cdeleg_pmu_format_group = {
> .attrs = riscv_cdeleg_pmu_formats_attr,
> };
>
> +#define RVPMU_EVENT_ATTR_RESOLVE(m) #m
> +#define RVPMU_EVENT_CMASK_ATTR(_name, _var, config, mask) \
> + PMU_EVENT_ATTR_STRING(_name, rvpmu_event_attr_##_var, \
> + "event=" RVPMU_EVENT_ATTR_RESOLVE(config) \
> + ",counterid_mask=" RVPMU_EVENT_ATTR_RESOLVE(mask))
> +
> +#define RVPMU_EVENT_ATTR_PTR(name) (&rvpmu_event_attr_##name.attr.attr)
> +
> +static struct attribute_group riscv_cdeleg_pmu_event_group __ro_after_init = {
> + .name = "events",
> +};
> +
> static const struct attribute_group *riscv_cdeleg_pmu_attr_groups[] = {
> + &riscv_cdeleg_pmu_event_group,
> &riscv_cdeleg_pmu_format_group,
> NULL,
> };
> @@ -447,11 +460,14 @@ struct riscv_vendor_pmu_events {
> const struct riscv_pmu_event *hw_event_map;
> const struct riscv_pmu_event (*cache_event_map)[PERF_COUNT_HW_CACHE_OP_MAX]
> [PERF_COUNT_HW_CACHE_RESULT_MAX];
> + struct attribute **attrs_events;
> };
>
> -#define RISCV_VENDOR_PMU_EVENTS(_vendorid, _archid, _implid, _hw_event_map, _cache_event_map) \
> +#define RISCV_VENDOR_PMU_EVENTS(_vendorid, _archid, _implid, _hw_event_map, \
> + _cache_event_map, _attrs) \
> { .vendorid = _vendorid, .archid = _archid, .implid = _implid, \
> - .hw_event_map = _hw_event_map, .cache_event_map = _cache_event_map },
> + .hw_event_map = _hw_event_map, .cache_event_map = _cache_event_map, \
> + .attrs_events = _attrs },
>
> static struct riscv_vendor_pmu_events pmu_vendor_events_table[] = {
> };
> @@ -473,6 +489,8 @@ static void __init rvpmu_vendor_register_events(void)
> pmu_vendor_events_table[i].archid == arch_id) {
> current_pmu_hw_event_map = pmu_vendor_events_table[i].hw_event_map;
> current_pmu_cache_event_map = pmu_vendor_events_table[i].cache_event_map;
> + riscv_cdeleg_pmu_event_group.attrs =
> + pmu_vendor_events_table[i].attrs_events;
> break;
> }
> }

Reviewed-by: Charlie Jenkins <thecharlesjenkins@xxxxxxxxx>
Tested-by: Charlie Jenkins <thecharlesjenkins@xxxxxxxxx>

--
- Charlie