new file mode 100644
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0
+
+TEST_PROGS = sysfs_test_trace.sh
+
+include ../../../lib.mk
new file mode 100755
@@ -0,0 +1,144 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (C) 2024 Marvell.
+
+# Test Arm CoreSight trace capture in sysfs mode
+# Based on tools/perf/tests/shell/test_arm_coresight.sh
+
+glb_err=0
+
+arm_cs_report() {
+ if [ $2 != 0 ]; then
+ echo "$1: FAIL"
+ glb_err=$2
+ else
+ echo "$1: PASS"
+ fi
+}
+
+is_device_sink() {
+ # If the node of "enable_sink" is existed under the device path, this
+ # means the device is a sink device.
+
+ if [ -e "$1/enable_sink" ]; then
+
+ return 0
+ else
+ return 1
+ fi
+}
+
+# Configure sink for buffer mode
+cfg_sink_buf_mode() {
+ sink_dev=$1
+ mode=$2
+ # Set buffer mode if supported
+ if [ -e "$sink_dev/buf_modes_available" ]; then
+ cat $sink_dev/buf_modes_available | grep -E -q $mode
+ if [ $? -eq 0 ]; then
+ echo $mode > $sink_dev/buf_mode_preferred
+ return 0
+ fi
+ fi
+
+ return 1
+}
+
+run_app() {
+
+ taskset -c $1 dd if=/dev/urandom of=/dev/null bs=1M count=64
+}
+
+sysfs_trace() {
+ src_dev=$1
+ sink_dev=$2
+ cpu=$3
+
+ # Enable sink device
+ echo 1 > $sink_dev/enable_sink
+ # Enable source device
+ echo 1 > $src_dev/enable_source
+
+ # Run app to be traced
+ run_app $cpu
+
+ # Read back trace data
+ dd if=/dev/$sink_dev_name of=/tmp/tracedata
+
+ # Verify if read is successful
+ err=$?
+
+ # Disable source device
+ echo 0 > $src_dev/enable_source
+
+ # Diskable sink device
+ echo 0 > $sink_dev/enable_sink
+
+ arm_cs_report "CoreSight path testing (CPU$cpu -> $sink_dev_name)" $err
+}
+
+try_sysfs_trace_resrv_buf() {
+ src_dev=$1
+ sink_dev=$2
+ cpu=$3
+
+ # Configure the resrved buffer mode if available
+ cfg_sink_buf_mode $sink_dev "resrv"
+ if [ $? -eq 0 ]; then
+ echo "Running sysfs trace with resrv buf mode"
+ sysfs_trace $src_dev $sink_dev $cpu
+ # Restore buffer mode
+ cfg_sink_buf_mode $sink_dev "auto"
+ if [ $? -eq 1 ]; then
+ echo "Failed to restore default buf mode"
+ fi
+ fi
+}
+
+arm_cs_iterate_devices() {
+ src_dev=$1
+ cpu=$3
+ for cdev in $2/connections/out\:*; do
+
+ # Skip testing if it's not a directory
+ ! [ -d $cdev ] && continue;
+
+ # Read out its symbol link file name
+ sink_dev=`readlink -f $cdev`
+
+ # Extract device name from path, e.g.
+ # sink_dev = '/sys/devices/platform/20010000.etf/tmc_etf0'
+ # `> sink_dev_name = 'tmc_etf0'
+ sink_dev_name=$(basename $sink_dev)
+
+ if is_device_sink $sink_dev; then
+ # Run trace with resrv buf mode (if available)
+ try_sysfs_trace_resrv_buf $src_dev $sink_dev $cpu
+
+ # Run the default mode
+ echo "Running sysfs trace with default settings"
+ sysfs_trace $src_dev $sink_dev $cpu
+ fi
+
+ arm_cs_iterate_devices $src_dev $cdev $cpu
+
+ done
+}
+
+arm_cs_etm_traverse_path_test() {
+ # Iterate for every ETM device
+ for dev in /sys/bus/event_source/devices/cs_etm/cpu*; do
+ # Canonicalize the path
+ dev=`readlink -f $dev`
+
+ # Find the ETM device belonging to which CPU
+ cpu=`cat $dev/cpu`
+
+ # Use depth-first search (DFS) to iterate outputs
+ arm_cs_iterate_devices $dev $dev $cpu
+ done
+}
+
+arm_cs_etm_traverse_path_test
+
+exit $glb_err
Add sysfs mode selftest for ARM Coresight hardware tracer. Signed-off-by: Linu Cherian <lcherian@marvell.com> --- .../drivers/hwtracing/coresight/Makefile | 5 + .../hwtracing/coresight/sysfs_test_trace.sh | 144 ++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 tools/testing/selftests/drivers/hwtracing/coresight/Makefile create mode 100755 tools/testing/selftests/drivers/hwtracing/coresight/sysfs_test_trace.sh