Hi, On 2024-12-04 at 05:53:56, Shuah Khan (skhan@xxxxxxxxxxxxxxxxxxx) wrote: > On 11/29/24 01:38, Linu Cherian wrote: > > Add sysfs mode selftest for ARM Coresight hardware tracer. > > Please add details on what this test does in here. Include > the output from the test? Ack. Will add test descripion here. > > Does this test have dependencies on config? If it does, does > this test detect and skip if config isn't enabled? Will add dependency. Thanks. > > > > > Signed-off-by: Linu Cherian <lcherian@xxxxxxxxxxx> > > --- > > .../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 > > thanks, > -- Shuah >