Add sysfs mode selftest for ARM Coresight hardware tracer.

Signed-off-by: Linu Cherian <lcher...@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

diff --git a/tools/testing/selftests/drivers/hwtracing/coresight/Makefile 
b/tools/testing/selftests/drivers/hwtracing/coresight/Makefile
new file mode 100644
index 000000000000..7dc68ae1c0a9
--- /dev/null
+++ b/tools/testing/selftests/drivers/hwtracing/coresight/Makefile
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0
+
+TEST_PROGS = sysfs_test_trace.sh
+
+include ../../../lib.mk
diff --git 
a/tools/testing/selftests/drivers/hwtracing/coresight/sysfs_test_trace.sh 
b/tools/testing/selftests/drivers/hwtracing/coresight/sysfs_test_trace.sh
new file mode 100755
index 000000000000..0d6307fff1d2
--- /dev/null
+++ b/tools/testing/selftests/drivers/hwtracing/coresight/sysfs_test_trace.sh
@@ -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
-- 
2.34.1


Reply via email to