Hi,

On 2024-12-04 at 05:53:56, Shuah Khan (sk...@linuxfoundation.org) 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 <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
> 
> thanks,
> -- Shuah
> 

Reply via email to