[PATCH v4 00/12] Linux RISC-V trace framework and drivers

Anup Patel posted 12 patches 1 month, 1 week ago
.../bindings/riscv/riscv,trace-component.yaml | 120 +++
MAINTAINERS                                   |  11 +
arch/riscv/configs/defconfig                  |   1 +
drivers/Makefile                              |   1 +
drivers/hwtracing/Kconfig                     |   2 +
drivers/hwtracing/rvtrace/Kconfig             |  33 +
drivers/hwtracing/rvtrace/Makefile            |   6 +
drivers/hwtracing/rvtrace/rvtrace-core.c      | 787 ++++++++++++++++++
drivers/hwtracing/rvtrace/rvtrace-encoder.c   | 130 +++
drivers/hwtracing/rvtrace/rvtrace-perf.c      | 345 ++++++++
drivers/hwtracing/rvtrace/rvtrace-platform.c  | 209 +++++
drivers/hwtracing/rvtrace/rvtrace-ramsink.c   | 338 ++++++++
include/linux/rvtrace.h                       | 352 ++++++++
tools/perf/arch/riscv/util/Build              |   1 +
tools/perf/arch/riscv/util/auxtrace.c         | 219 +++++
tools/perf/util/Build                         |   1 +
tools/perf/util/auxtrace.c                    |   4 +
tools/perf/util/auxtrace.h                    |   1 +
tools/perf/util/rvtrace-decoder.c             |  91 ++
tools/perf/util/rvtrace.h                     |  19 +
20 files changed, 2671 insertions(+)
create mode 100644 Documentation/devicetree/bindings/riscv/riscv,trace-component.yaml
create mode 100644 drivers/hwtracing/rvtrace/Kconfig
create mode 100644 drivers/hwtracing/rvtrace/Makefile
create mode 100644 drivers/hwtracing/rvtrace/rvtrace-core.c
create mode 100644 drivers/hwtracing/rvtrace/rvtrace-encoder.c
create mode 100644 drivers/hwtracing/rvtrace/rvtrace-perf.c
create mode 100644 drivers/hwtracing/rvtrace/rvtrace-platform.c
create mode 100644 drivers/hwtracing/rvtrace/rvtrace-ramsink.c
create mode 100644 include/linux/rvtrace.h
create mode 100644 tools/perf/arch/riscv/util/auxtrace.c
create mode 100644 tools/perf/util/rvtrace-decoder.c
create mode 100644 tools/perf/util/rvtrace.h
[PATCH v4 00/12] Linux RISC-V trace framework and drivers
Posted by Anup Patel 1 month, 1 week ago
This series adds initial support for RISC-V trace framework and drivers.
The RISC-V trace v1.0 specification is already ratified and can be found at:
https://github.com/riscv-non-isa/e-trace-encap/releases/tag/v1.0.0-ratified
https://github.com/riscv-non-isa/tg-nexus-trace/releases/tag/1.0_Ratified

The RISC-V trace framework and drivers are designed to be agnostic to the
underlying trace protocol hence both RISC-V E-trace and RISC-V N-trace should
work fine. The discovery of trace protocl parameters are left to user-space
trace decoder.

In ther future, there will be subsequent series adding:
1) Sysfs support
2) ACPI support
3) More trace drivers (such as funnel, ATB, etc)
4) Support for upcoming self-hosted trace specification
5) ... and more ...

These patches can also be found in the riscv_trace_support_v3 branch at:
https://github.com/avpatel/linux.git

To test the patches, we need QEMU virt machine with RISC-V trace support
which can be found in rv-etrace branch at:
https://gitlab.com/danielhb/qemu.git

To capture rvtrace data using perf on QEMU virt machine do the following:
1) Launch QEMU virt machine
   $ qemu-system-riscv64 -nographic -M virt -smp 2 -bios fw_dynamic.bin \
     -kernel Image -append "root=/dev/vda rw console=ttyS0 earlycon=sbi" \
     -drive file=/path/to/rootfs.img,id=disk1,if=none,format=raw \
     -device virtio-blk-device,drive=disk1
2) Run perf record to capture rvtrace data
   $ perf record --all-cpus -e rvtrace/event=0x1/ <command>
3) The step2 would create a perf.data file which has the rvtrace data.
   Now run perf report -D and look for PERF_RECORD_AUXTRACE event
   section(s) which point(s) to the actual rvtrace data offset.

Changes since v3:
 - Rebased on Linux-7.1-rc1
 - Use kzalloc_obj() in-place of kzalloc() in PATCH2, PATCH3 and PATCH9
 - Improved PATCH7 to save the previous WP value

Changes since v2:
 - Rebased on Linux-7.0-rc1
 - Addressed Rob's comments on DT bindings in PATCH1
 - Addressed ref-count related issues in rvtrace_of_parse_outconns()
   of PATCH2
 - Made RVtrace framework more generic by avoiding implicit access
   to component registers in PATCH2
 - More improvements in trRamStart/Limit/WP programming and other
   improvments in PATCH7
 - Removed RVTRACE_BUF_LEN from PATCH9
 - Removed redundant page_size from PATCH10
 - Renamed found_etm in PATCH10
 - Removed rvtrace_recording_init() declaration from header in PATCH11

Changes since v1:
 - Rebased on Linux-6.18-rc3
 - Addressed Rob's comments in dt-bindings added by PATCH1
 - Get reference of conn->dest_fwnode and add missing break in
   rvtrace_of_parse_outconns() of rvtrace-platform drivers added
   by PATCH2
 - Added new inline function rvtrace_comp_is_empty() in PATCH2
   and used it in rvtrace_encoder_stop() added by PATCH5
 - Fixed trRamWPLow usage in PATCH7
 - Determine RAM sink buffer size based on component implementation
   ID and reduce default RAM sink buffer size to 1MB
 - Add new PATCH8 to enable DMA_RESTRICTED_POOL in RISC-V defconfig
   so that implementations with RAM sink address restrictions can
   be handled.

Anup Patel (6):
  dt-bindings: Add RISC-V trace component bindings
  rvtrace: Initial implementation of driver framework
  rvtrace: Add functions to create/destroy a trace component path
  rvtrace: Add function to copy into perf AUX buffer
  riscv: Enable DMA_RESTRICTED_POOL in defconfig
  MAINTAINERS: Add entry for RISC-V trace framework

Mayuresh Chitale (6):
  rvtrace: Add functions to start/stop tracing on a component path
  rvtrace: Add trace encoder driver
  rvtrace: Add trace ramsink driver
  rvtrace: Add perf driver for tracing using perf tool
  perf tools: Add RISC-V trace PMU record capabilities
  perf tools: Initial support for RISC-V trace decoder

 .../bindings/riscv/riscv,trace-component.yaml | 120 +++
 MAINTAINERS                                   |  11 +
 arch/riscv/configs/defconfig                  |   1 +
 drivers/Makefile                              |   1 +
 drivers/hwtracing/Kconfig                     |   2 +
 drivers/hwtracing/rvtrace/Kconfig             |  33 +
 drivers/hwtracing/rvtrace/Makefile            |   6 +
 drivers/hwtracing/rvtrace/rvtrace-core.c      | 787 ++++++++++++++++++
 drivers/hwtracing/rvtrace/rvtrace-encoder.c   | 130 +++
 drivers/hwtracing/rvtrace/rvtrace-perf.c      | 345 ++++++++
 drivers/hwtracing/rvtrace/rvtrace-platform.c  | 209 +++++
 drivers/hwtracing/rvtrace/rvtrace-ramsink.c   | 338 ++++++++
 include/linux/rvtrace.h                       | 352 ++++++++
 tools/perf/arch/riscv/util/Build              |   1 +
 tools/perf/arch/riscv/util/auxtrace.c         | 219 +++++
 tools/perf/util/Build                         |   1 +
 tools/perf/util/auxtrace.c                    |   4 +
 tools/perf/util/auxtrace.h                    |   1 +
 tools/perf/util/rvtrace-decoder.c             |  91 ++
 tools/perf/util/rvtrace.h                     |  19 +
 20 files changed, 2671 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/riscv/riscv,trace-component.yaml
 create mode 100644 drivers/hwtracing/rvtrace/Kconfig
 create mode 100644 drivers/hwtracing/rvtrace/Makefile
 create mode 100644 drivers/hwtracing/rvtrace/rvtrace-core.c
 create mode 100644 drivers/hwtracing/rvtrace/rvtrace-encoder.c
 create mode 100644 drivers/hwtracing/rvtrace/rvtrace-perf.c
 create mode 100644 drivers/hwtracing/rvtrace/rvtrace-platform.c
 create mode 100644 drivers/hwtracing/rvtrace/rvtrace-ramsink.c
 create mode 100644 include/linux/rvtrace.h
 create mode 100644 tools/perf/arch/riscv/util/auxtrace.c
 create mode 100644 tools/perf/util/rvtrace-decoder.c
 create mode 100644 tools/perf/util/rvtrace.h

-- 
2.43.0
Re: [PATCH v4 00/12] Linux RISC-V trace framework and drivers
Posted by Anup Patel 3 weeks, 1 day ago
Hi Greg,

On Wed, Apr 29, 2026 at 6:21 PM Anup Patel <anup.patel@oss.qualcomm.com> wrote:
>
> This series adds initial support for RISC-V trace framework and drivers.
> The RISC-V trace v1.0 specification is already ratified and can be found at:
> https://github.com/riscv-non-isa/e-trace-encap/releases/tag/v1.0.0-ratified
> https://github.com/riscv-non-isa/tg-nexus-trace/releases/tag/1.0_Ratified
>
> The RISC-V trace framework and drivers are designed to be agnostic to the
> underlying trace protocol hence both RISC-V E-trace and RISC-V N-trace should
> work fine. The discovery of trace protocl parameters are left to user-space
> trace decoder.
>
> In ther future, there will be subsequent series adding:
> 1) Sysfs support
> 2) ACPI support
> 3) More trace drivers (such as funnel, ATB, etc)
> 4) Support for upcoming self-hosted trace specification
> 5) ... and more ...
>
> These patches can also be found in the riscv_trace_support_v3 branch at:
> https://github.com/avpatel/linux.git
>
> To test the patches, we need QEMU virt machine with RISC-V trace support
> which can be found in rv-etrace branch at:
> https://gitlab.com/danielhb/qemu.git
>
> To capture rvtrace data using perf on QEMU virt machine do the following:
> 1) Launch QEMU virt machine
>    $ qemu-system-riscv64 -nographic -M virt -smp 2 -bios fw_dynamic.bin \
>      -kernel Image -append "root=/dev/vda rw console=ttyS0 earlycon=sbi" \
>      -drive file=/path/to/rootfs.img,id=disk1,if=none,format=raw \
>      -device virtio-blk-device,drive=disk1
> 2) Run perf record to capture rvtrace data
>    $ perf record --all-cpus -e rvtrace/event=0x1/ <command>
> 3) The step2 would create a perf.data file which has the rvtrace data.
>    Now run perf report -D and look for PERF_RECORD_AUXTRACE event
>    section(s) which point(s) to the actual rvtrace data offset.
>
> Changes since v3:
>  - Rebased on Linux-7.1-rc1
>  - Use kzalloc_obj() in-place of kzalloc() in PATCH2, PATCH3 and PATCH9
>  - Improved PATCH7 to save the previous WP value
>
> Changes since v2:
>  - Rebased on Linux-7.0-rc1
>  - Addressed Rob's comments on DT bindings in PATCH1
>  - Addressed ref-count related issues in rvtrace_of_parse_outconns()
>    of PATCH2
>  - Made RVtrace framework more generic by avoiding implicit access
>    to component registers in PATCH2
>  - More improvements in trRamStart/Limit/WP programming and other
>    improvments in PATCH7
>  - Removed RVTRACE_BUF_LEN from PATCH9
>  - Removed redundant page_size from PATCH10
>  - Renamed found_etm in PATCH10
>  - Removed rvtrace_recording_init() declaration from header in PATCH11
>
> Changes since v1:
>  - Rebased on Linux-6.18-rc3
>  - Addressed Rob's comments in dt-bindings added by PATCH1
>  - Get reference of conn->dest_fwnode and add missing break in
>    rvtrace_of_parse_outconns() of rvtrace-platform drivers added
>    by PATCH2
>  - Added new inline function rvtrace_comp_is_empty() in PATCH2
>    and used it in rvtrace_encoder_stop() added by PATCH5
>  - Fixed trRamWPLow usage in PATCH7
>  - Determine RAM sink buffer size based on component implementation
>    ID and reduce default RAM sink buffer size to 1MB
>  - Add new PATCH8 to enable DMA_RESTRICTED_POOL in RISC-V defconfig
>    so that implementations with RAM sink address restrictions can
>    be handled.
>
> Anup Patel (6):
>   dt-bindings: Add RISC-V trace component bindings
>   rvtrace: Initial implementation of driver framework
>   rvtrace: Add functions to create/destroy a trace component path
>   rvtrace: Add function to copy into perf AUX buffer
>   riscv: Enable DMA_RESTRICTED_POOL in defconfig
>   MAINTAINERS: Add entry for RISC-V trace framework
>
> Mayuresh Chitale (6):
>   rvtrace: Add functions to start/stop tracing on a component path
>   rvtrace: Add trace encoder driver
>   rvtrace: Add trace ramsink driver
>   rvtrace: Add perf driver for tracing using perf tool
>   perf tools: Add RISC-V trace PMU record capabilities
>   perf tools: Initial support for RISC-V trace decoder
>
>  .../bindings/riscv/riscv,trace-component.yaml | 120 +++
>  MAINTAINERS                                   |  11 +
>  arch/riscv/configs/defconfig                  |   1 +
>  drivers/Makefile                              |   1 +
>  drivers/hwtracing/Kconfig                     |   2 +
>  drivers/hwtracing/rvtrace/Kconfig             |  33 +
>  drivers/hwtracing/rvtrace/Makefile            |   6 +
>  drivers/hwtracing/rvtrace/rvtrace-core.c      | 787 ++++++++++++++++++
>  drivers/hwtracing/rvtrace/rvtrace-encoder.c   | 130 +++
>  drivers/hwtracing/rvtrace/rvtrace-perf.c      | 345 ++++++++
>  drivers/hwtracing/rvtrace/rvtrace-platform.c  | 209 +++++
>  drivers/hwtracing/rvtrace/rvtrace-ramsink.c   | 338 ++++++++
>  include/linux/rvtrace.h                       | 352 ++++++++
>  tools/perf/arch/riscv/util/Build              |   1 +
>  tools/perf/arch/riscv/util/auxtrace.c         | 219 +++++
>  tools/perf/util/Build                         |   1 +
>  tools/perf/util/auxtrace.c                    |   4 +
>  tools/perf/util/auxtrace.h                    |   1 +
>  tools/perf/util/rvtrace-decoder.c             |  91 ++
>  tools/perf/util/rvtrace.h                     |  19 +
>  20 files changed, 2671 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/riscv/riscv,trace-component.yaml
>  create mode 100644 drivers/hwtracing/rvtrace/Kconfig
>  create mode 100644 drivers/hwtracing/rvtrace/Makefile
>  create mode 100644 drivers/hwtracing/rvtrace/rvtrace-core.c
>  create mode 100644 drivers/hwtracing/rvtrace/rvtrace-encoder.c
>  create mode 100644 drivers/hwtracing/rvtrace/rvtrace-perf.c
>  create mode 100644 drivers/hwtracing/rvtrace/rvtrace-platform.c
>  create mode 100644 drivers/hwtracing/rvtrace/rvtrace-ramsink.c
>  create mode 100644 include/linux/rvtrace.h
>  create mode 100644 tools/perf/arch/riscv/util/auxtrace.c
>  create mode 100644 tools/perf/util/rvtrace-decoder.c
>  create mode 100644 tools/perf/util/rvtrace.h
>
> --
> 2.43.0
>

Friendly ping ?

If this series looks good to you then I can send first PR for rvtrace ?

Best Regards,
Anup
Re: [PATCH v4 00/12] Linux RISC-V trace framework and drivers
Posted by Greg KH 2 weeks, 6 days ago
On Tue, May 19, 2026 at 01:51:43PM +0530, Anup Patel wrote:
> Hi Greg,
> 
> On Wed, Apr 29, 2026 at 6:21 PM Anup Patel <anup.patel@oss.qualcomm.com> wrote:
> >
> > This series adds initial support for RISC-V trace framework and drivers.
> > The RISC-V trace v1.0 specification is already ratified and can be found at:
> > https://github.com/riscv-non-isa/e-trace-encap/releases/tag/v1.0.0-ratified
> > https://github.com/riscv-non-isa/tg-nexus-trace/releases/tag/1.0_Ratified
> >
> > The RISC-V trace framework and drivers are designed to be agnostic to the
> > underlying trace protocol hence both RISC-V E-trace and RISC-V N-trace should
> > work fine. The discovery of trace protocl parameters are left to user-space
> > trace decoder.
> >
> > In ther future, there will be subsequent series adding:
> > 1) Sysfs support
> > 2) ACPI support
> > 3) More trace drivers (such as funnel, ATB, etc)
> > 4) Support for upcoming self-hosted trace specification
> > 5) ... and more ...
> >
> > These patches can also be found in the riscv_trace_support_v3 branch at:
> > https://github.com/avpatel/linux.git
> >
> > To test the patches, we need QEMU virt machine with RISC-V trace support
> > which can be found in rv-etrace branch at:
> > https://gitlab.com/danielhb/qemu.git
> >
> > To capture rvtrace data using perf on QEMU virt machine do the following:
> > 1) Launch QEMU virt machine
> >    $ qemu-system-riscv64 -nographic -M virt -smp 2 -bios fw_dynamic.bin \
> >      -kernel Image -append "root=/dev/vda rw console=ttyS0 earlycon=sbi" \
> >      -drive file=/path/to/rootfs.img,id=disk1,if=none,format=raw \
> >      -device virtio-blk-device,drive=disk1
> > 2) Run perf record to capture rvtrace data
> >    $ perf record --all-cpus -e rvtrace/event=0x1/ <command>
> > 3) The step2 would create a perf.data file which has the rvtrace data.
> >    Now run perf report -D and look for PERF_RECORD_AUXTRACE event
> >    section(s) which point(s) to the actual rvtrace data offset.
> >
> > Changes since v3:
> >  - Rebased on Linux-7.1-rc1
> >  - Use kzalloc_obj() in-place of kzalloc() in PATCH2, PATCH3 and PATCH9
> >  - Improved PATCH7 to save the previous WP value
> >
> > Changes since v2:
> >  - Rebased on Linux-7.0-rc1
> >  - Addressed Rob's comments on DT bindings in PATCH1
> >  - Addressed ref-count related issues in rvtrace_of_parse_outconns()
> >    of PATCH2
> >  - Made RVtrace framework more generic by avoiding implicit access
> >    to component registers in PATCH2
> >  - More improvements in trRamStart/Limit/WP programming and other
> >    improvments in PATCH7
> >  - Removed RVTRACE_BUF_LEN from PATCH9
> >  - Removed redundant page_size from PATCH10
> >  - Renamed found_etm in PATCH10
> >  - Removed rvtrace_recording_init() declaration from header in PATCH11
> >
> > Changes since v1:
> >  - Rebased on Linux-6.18-rc3
> >  - Addressed Rob's comments in dt-bindings added by PATCH1
> >  - Get reference of conn->dest_fwnode and add missing break in
> >    rvtrace_of_parse_outconns() of rvtrace-platform drivers added
> >    by PATCH2
> >  - Added new inline function rvtrace_comp_is_empty() in PATCH2
> >    and used it in rvtrace_encoder_stop() added by PATCH5
> >  - Fixed trRamWPLow usage in PATCH7
> >  - Determine RAM sink buffer size based on component implementation
> >    ID and reduce default RAM sink buffer size to 1MB
> >  - Add new PATCH8 to enable DMA_RESTRICTED_POOL in RISC-V defconfig
> >    so that implementations with RAM sink address restrictions can
> >    be handled.
> >
> > Anup Patel (6):
> >   dt-bindings: Add RISC-V trace component bindings
> >   rvtrace: Initial implementation of driver framework
> >   rvtrace: Add functions to create/destroy a trace component path
> >   rvtrace: Add function to copy into perf AUX buffer
> >   riscv: Enable DMA_RESTRICTED_POOL in defconfig
> >   MAINTAINERS: Add entry for RISC-V trace framework
> >
> > Mayuresh Chitale (6):
> >   rvtrace: Add functions to start/stop tracing on a component path
> >   rvtrace: Add trace encoder driver
> >   rvtrace: Add trace ramsink driver
> >   rvtrace: Add perf driver for tracing using perf tool
> >   perf tools: Add RISC-V trace PMU record capabilities
> >   perf tools: Initial support for RISC-V trace decoder
> >
> >  .../bindings/riscv/riscv,trace-component.yaml | 120 +++
> >  MAINTAINERS                                   |  11 +
> >  arch/riscv/configs/defconfig                  |   1 +
> >  drivers/Makefile                              |   1 +
> >  drivers/hwtracing/Kconfig                     |   2 +
> >  drivers/hwtracing/rvtrace/Kconfig             |  33 +
> >  drivers/hwtracing/rvtrace/Makefile            |   6 +
> >  drivers/hwtracing/rvtrace/rvtrace-core.c      | 787 ++++++++++++++++++
> >  drivers/hwtracing/rvtrace/rvtrace-encoder.c   | 130 +++
> >  drivers/hwtracing/rvtrace/rvtrace-perf.c      | 345 ++++++++
> >  drivers/hwtracing/rvtrace/rvtrace-platform.c  | 209 +++++
> >  drivers/hwtracing/rvtrace/rvtrace-ramsink.c   | 338 ++++++++
> >  include/linux/rvtrace.h                       | 352 ++++++++
> >  tools/perf/arch/riscv/util/Build              |   1 +
> >  tools/perf/arch/riscv/util/auxtrace.c         | 219 +++++
> >  tools/perf/util/Build                         |   1 +
> >  tools/perf/util/auxtrace.c                    |   4 +
> >  tools/perf/util/auxtrace.h                    |   1 +
> >  tools/perf/util/rvtrace-decoder.c             |  91 ++
> >  tools/perf/util/rvtrace.h                     |  19 +
> >  20 files changed, 2671 insertions(+)
> >  create mode 100644 Documentation/devicetree/bindings/riscv/riscv,trace-component.yaml
> >  create mode 100644 drivers/hwtracing/rvtrace/Kconfig
> >  create mode 100644 drivers/hwtracing/rvtrace/Makefile
> >  create mode 100644 drivers/hwtracing/rvtrace/rvtrace-core.c
> >  create mode 100644 drivers/hwtracing/rvtrace/rvtrace-encoder.c
> >  create mode 100644 drivers/hwtracing/rvtrace/rvtrace-perf.c
> >  create mode 100644 drivers/hwtracing/rvtrace/rvtrace-platform.c
> >  create mode 100644 drivers/hwtracing/rvtrace/rvtrace-ramsink.c
> >  create mode 100644 include/linux/rvtrace.h
> >  create mode 100644 tools/perf/arch/riscv/util/auxtrace.c
> >  create mode 100644 tools/perf/util/rvtrace-decoder.c
> >  create mode 100644 tools/perf/util/rvtrace.h
> >
> > --
> > 2.43.0
> >
> 
> Friendly ping ?
> 
> If this series looks good to you then I can send first PR for rvtrace ?

They should be as patches, not a pull request, after you get everyone to
agree that the user api is ok.

thanks,

greg k-h