2022-02-27 23:33:48

by Cristian Marussi

[permalink] [raw]
Subject: [RFC PATCH 15/16] selftests: arm64: Add initial SCMI testcases

A few initial testcases for Clock and Sensot protocol plus all the test
infrastructure, including the test runeer.

All of this just an experimental demonstrator.

Signed-off-by: Cristian Marussi <[email protected]>
---
tools/testing/selftests/arm64/Makefile | 2 +-
tools/testing/selftests/arm64/scmi/Makefile | 6 +
tools/testing/selftests/arm64/scmi/config | 1 +
.../arm64/scmi/kselftest_scmi_lib.sh | 118 ++++++++++++++++++
.../selftests/arm64/scmi/run_scmi_tests.sh | 69 ++++++++++
.../testcases/protocol_0x14/clock_enable.sh | 33 +++++
.../protocol_0x14/clock_rate_read.sh | 18 +++
.../protocol_0x14/clock_rate_write.sh | 29 +++++
.../testcases/protocol_0x15/sensor_reading.sh | 17 +++
9 files changed, 292 insertions(+), 1 deletion(-)
create mode 100644 tools/testing/selftests/arm64/scmi/Makefile
create mode 100644 tools/testing/selftests/arm64/scmi/config
create mode 100644 tools/testing/selftests/arm64/scmi/kselftest_scmi_lib.sh
create mode 100755 tools/testing/selftests/arm64/scmi/run_scmi_tests.sh
create mode 100755 tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_enable.sh
create mode 100755 tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_read.sh
create mode 100755 tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_write.sh
create mode 100755 tools/testing/selftests/arm64/scmi/testcases/protocol_0x15/sensor_reading.sh

diff --git a/tools/testing/selftests/arm64/Makefile b/tools/testing/selftests/arm64/Makefile
index 1e8d9a8f59df..6648dd8e2173 100644
--- a/tools/testing/selftests/arm64/Makefile
+++ b/tools/testing/selftests/arm64/Makefile
@@ -4,7 +4,7 @@
ARCH ?= $(shell uname -m 2>/dev/null || echo not)

ifneq (,$(filter $(ARCH),aarch64 arm64))
-ARM64_SUBTARGETS ?= tags signal pauth fp mte bti abi
+ARM64_SUBTARGETS ?= tags signal pauth fp mte bti abi scmi
else
ARM64_SUBTARGETS :=
endif
diff --git a/tools/testing/selftests/arm64/scmi/Makefile b/tools/testing/selftests/arm64/scmi/Makefile
new file mode 100644
index 000000000000..8786d8d4c332
--- /dev/null
+++ b/tools/testing/selftests/arm64/scmi/Makefile
@@ -0,0 +1,6 @@
+# SPDX-License-Identifier: GPL-2.0
+
+TEST_PROGS := run_scmi_tests.sh
+TEST_FILES := kselftest_scmi_lib.sh testcases/*
+
+include ../../lib.mk
diff --git a/tools/testing/selftests/arm64/scmi/config b/tools/testing/selftests/arm64/scmi/config
new file mode 100644
index 000000000000..161387084a3f
--- /dev/null
+++ b/tools/testing/selftests/arm64/scmi/config
@@ -0,0 +1 @@
+CONFIG_ARM_SCMI_TEST_DRIVER=y
diff --git a/tools/testing/selftests/arm64/scmi/kselftest_scmi_lib.sh b/tools/testing/selftests/arm64/scmi/kselftest_scmi_lib.sh
new file mode 100644
index 000000000000..54d27b5f3e1a
--- /dev/null
+++ b/tools/testing/selftests/arm64/scmi/kselftest_scmi_lib.sh
@@ -0,0 +1,118 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+SCMI_TEST_DRV="scmi_test_driver"
+TRES=(0 0 0)
+
+ksft_log()
+{
+ echo -e "[SCMI]: $1"
+}
+
+ksft_skip()
+{
+ echo -e "[SKIP]: $1"
+ exit 4
+}
+
+ksft_pass()
+{
+ echo -e "[PASS]: $1"
+}
+
+ksft_fail()
+{
+ echo -e "[FAIL]: $1"
+ exit 1
+}
+
+ksft_results()
+{
+ if [ $# -gt 0 ]; then
+ local val
+ local idx
+ local ret=$1
+
+ case "$ret" in
+ 0)
+ idx=0
+ ;;
+ 4)
+ idx=1
+ ;;
+ *)
+ idx=2
+ ;;
+ esac
+ val=${TRES[${idx}]}
+ TRES[$idx]=$((val + 1))
+ else
+ ksft_log "Summary - PASS[${TRES[0]}] SKIP[${TRES[1]}] FAIL[${TRES[2]}]"
+ [ "x${TRES[2]}" != "x0" ] && exit 1
+ [ "x${TRES[1]}" != "x0" -a "x${TRES[0]}" == "x0" ] && exit 4
+ exit 0
+ fi
+}
+
+ksft_scmi_run_one()
+{
+ tcase=$1
+
+ echo "-> Running testcase: $tcase"
+
+ ./$tcase
+ ret=$?
+
+ ksft_results $ret
+}
+
+ksft_scmi_check_fw_version()
+{
+ local supported=$1
+ local current="${SCMI_VENDOR}:${SCMI_SUB_VENDOR}"
+
+ if [ "x${current}" != "x${supported}" ]; then
+ ksft_skip "Current FW('$current') is UNSUPPORTED. Should be '$supported'"
+ fi
+}
+
+ksft_scmi_transport_is_atomic ()
+{
+ [ "x$SCMI_TRANSPORT_IS_ATOMIC" == "xY" ] && return 0 || return 1
+}
+
+ksft_scmi_protocol_resources_get()
+{
+ local proto_dir=$1
+ local resources=""
+
+ for d in ${proto_dir}/*; do
+ rd="$(basename $d)"
+ [[ $rd =~ [0-9] ]] && resources="$resources $rd"
+ done
+
+ echo "$resources"
+}
+
+ksft_scmi_value_get()
+{
+ local syspath=$1
+ local __retval=$2
+ local value
+
+ value=$(cat $syspath)
+ [ "x$?" != "x0" ] && ksft_fail "Fail to read $syspath"
+
+ eval $__retval="'$value'"
+}
+
+ksft_scmi_value_set()
+{
+ local syspath=$1
+ local value=$2
+
+ echo $value > $syspath
+ [ "x$?" != "x0" ] && ksft_fail "Fail to write $syspath - err:$?"
+}
+
+
diff --git a/tools/testing/selftests/arm64/scmi/run_scmi_tests.sh b/tools/testing/selftests/arm64/scmi/run_scmi_tests.sh
new file mode 100755
index 000000000000..f372744a4579
--- /dev/null
+++ b/tools/testing/selftests/arm64/scmi/run_scmi_tests.sh
@@ -0,0 +1,69 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+. ./kselftest_scmi_lib.sh
+
+check_root_privs()
+{
+ [ x"$(id -u)" != "x0" ] && ksft_skip "You need to be root"
+}
+
+check_scmi_testing_stack()
+{
+ local debugfs_root=$(findmnt -o TARGET -t debugfs | grep -v TARGET)
+ export SCMI_DEBUGFS_TOPDIR="$debugfs_root/scmi"
+
+ # Try to load module if not builtin
+ if [ ! -d $SCMI_DEBUGFS_TOPDIR ]; then
+ modprobe $SCMI_TEST_DRV || ksft_skip "Failed to load $SCMI_TEST_DRV"
+ [ ! -d $SCMI_DEBUGFS_TOPDIR ] && ksft_skip "SCMI Test stack not found; is CONFIG_ARM_SCMI_TEST_DRIVER enabled ?"
+ fi
+}
+
+setup_scmi_test_env()
+{
+ local scmi_info_dir="${SCMI_DEBUGFS_TOPDIR}/info/"
+
+ export SCMI_VENDOR="$(cat ${scmi_info_dir}/vendor_id)"
+ export SCMI_SUB_VENDOR="$(cat ${scmi_info_dir}/sub_vendor_id)"
+ export SCMI_VERS_MAJ="$(cat ${scmi_info_dir}/major_ver)"
+ export SCMI_VERS_MIN="$(cat ${scmi_info_dir}/minor_ver)"
+ export SCMI_VERS_IMPL="$(cat ${scmi_info_dir}/impl_ver)"
+
+ ksft_log "Found stack: $SCMI_VENDOR/$SCMI_SUB_VENDOR ${SCMI_VERS_MAJ}.${SCMI_VERS_MAJ} - $SCMI_VERS_IMPL"
+
+ SCMI_TEST_PROTOS=""
+ for p in ${SCMI_DEBUGFS_TOPDIR}/protocol_*; do
+ SCMI_TEST_PROTOS="${SCMI_TEST_PROTOS} $(basename $p)"
+ done
+
+ ksft_log "Found testing protocols: $SCMI_TEST_PROTOS"
+
+ export SCMI_TEST_PROTOS
+ SCMI_TRANSPORT_IS_ATOMIC="N"
+ [ -d "${SCMI_DEBUGFS_TOPDIR}/transport" ] &&
+ SCMI_TRANSPORT_IS_ATOMIC=$(cat "${SCMI_DEBUGFS_TOPDIR}/transport/is_atomic")
+ export SCMI_TRANSPORT_IS_ATOMIC
+}
+
+# Setup
+check_root_privs
+
+check_scmi_testing_stack
+
+setup_scmi_test_env
+
+# Main
+# Run all available tests for the found protocols
+#
+for proto_dir in $SCMI_TEST_PROTOS; do
+ [ ! -d $proto_dir ] && ksft_log "$proto_dir tests NOT supported." && continue
+ export TST_PROTO_DIR="${SCMI_DEBUGFS_TOPDIR}/${proto_dir}"
+ TST_PROTO_VERSION=$(cat ${TST_PROTO_DIR}/version)
+ ksft_log "Running tests for SCMI $proto_dir ver:$TST_PROTO_VERSION"
+ for tst in $proto_dir/*; do
+ ksft_scmi_run_one $tst
+ done
+done
+
+ksft_results
diff --git a/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_enable.sh b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_enable.sh
new file mode 100755
index 000000000000..4cdf3a097ba7
--- /dev/null
+++ b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_enable.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+. ./kselftest_scmi_lib.sh
+
+supported_fw="EMU-SCMI-VM:userland"
+ksft_scmi_check_fw_version $supported_fw
+
+clock_enable_disable() {
+ rname=$1
+ rdir=$2
+ clk_op=$3
+
+ ksft_scmi_value_set $rdir/$clk_op Y
+ ksft_scmi_value_set $rdir/$clk_op N
+ ksft_log "Clock $rname: $clk_op - ON/OFF ... OK"
+}
+
+resources=$(ksft_scmi_protocol_resources_get $TST_PROTO_DIR)
+ksft_log "Found Clock resources: $resources"
+
+for res in $resources;do
+ resd="$TST_PROTO_DIR/$res"
+ name="$(cat $resd/info/name)"
+
+ clock_enable_disable $name $resd "enable"
+ if [ ksft_transport_is_atomic ]; then
+ clock_enable_disable $name $resd "enable_atomic_irqs_off"
+ clock_enable_disable $name $resd "enable_atomic_irqs_on"
+ fi
+done
+
+ksft_pass "$0"
diff --git a/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_read.sh b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_read.sh
new file mode 100755
index 000000000000..88c444fd317d
--- /dev/null
+++ b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_read.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+. ./kselftest_scmi_lib.sh
+
+resources=$(ksft_scmi_protocol_resources_get $TST_PROTO_DIR)
+ksft_log "Found Clock resources: $resources"
+
+for res in $resources;do
+ resd="$TST_PROTO_DIR/$res"
+ name="$(cat $resd/info/name)"
+ val=0
+
+ ksft_scmi_value_get $resd/rate_get_set val
+ ksft_log "$name READ => $val"
+done
+
+ksft_pass "$0"
diff --git a/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_write.sh b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_write.sh
new file mode 100755
index 000000000000..346084ec3812
--- /dev/null
+++ b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_write.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+. ./kselftest_scmi_lib.sh
+
+supported_fw="EMU-SCMI-VM:userland"
+ksft_scmi_check_fw_version $supported_fw
+
+resources=$(ksft_scmi_protocol_resources_get $TST_PROTO_DIR)
+ksft_log "Found Clock resources: $resources"
+
+for res in $resources;do
+ resd="$TST_PROTO_DIR/$res"
+ name="$(cat $resd/info/name)"
+ val=0
+ oldval=0
+ setval=0
+
+ ksft_scmi_value_get $resd/rate_get_set oldval
+ setval=$((oldval + 666))
+
+ ksft_scmi_value_set $resd/rate_get_set $setval
+
+ ksft_scmi_value_get $resd/rate_get_set val
+ [ "x$val" != "x$setval" ] && ksft_fail "Set:$setval readback:$val"
+ ksft_log "$name OK -> read:$oldval set:$setval readback:$val"
+done
+
+ksft_pass "$0"
diff --git a/tools/testing/selftests/arm64/scmi/testcases/protocol_0x15/sensor_reading.sh b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x15/sensor_reading.sh
new file mode 100755
index 000000000000..b0f5f6361379
--- /dev/null
+++ b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x15/sensor_reading.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+. ./kselftest_scmi_lib.sh
+
+resources=$(ksft_scmi_protocol_resources_get $TST_PROTO_DIR)
+ksft_log "Found Sensor resources: $resources"
+
+for res in $resources;do
+ resd="$TST_PROTO_DIR/$res"
+ name="$(cat $resd/info/name)"
+ val=0
+
+ ksft_scmi_value_get $resd/reading_get val
+ ksft_log "$name READ => $val"
+done
+
+ksft_pass $0
--
2.17.1


2022-08-01 04:57:32

by Arun KS

[permalink] [raw]
Subject: Re: [RFC PATCH 15/16] selftests: arm64: Add initial SCMI testcases

Hi Cristian,

On Mon, Feb 28, 2022 at 12:16 PM Cristian Marussi
<[email protected]> wrote:
>
> A few initial testcases for Clock and Sensot protocol plus all the test
> infrastructure, including the test runeer.
>
> All of this just an experimental demonstrator.
>
> Signed-off-by: Cristian Marussi <[email protected]>
> ---
> tools/testing/selftests/arm64/Makefile | 2 +-
> tools/testing/selftests/arm64/scmi/Makefile | 6 +
> tools/testing/selftests/arm64/scmi/config | 1 +
> .../arm64/scmi/kselftest_scmi_lib.sh | 118 ++++++++++++++++++
> .../selftests/arm64/scmi/run_scmi_tests.sh | 69 ++++++++++
> .../testcases/protocol_0x14/clock_enable.sh | 33 +++++
> .../protocol_0x14/clock_rate_read.sh | 18 +++
> .../protocol_0x14/clock_rate_write.sh | 29 +++++
> .../testcases/protocol_0x15/sensor_reading.sh | 17 +++
> 9 files changed, 292 insertions(+), 1 deletion(-)
> create mode 100644 tools/testing/selftests/arm64/scmi/Makefile
> create mode 100644 tools/testing/selftests/arm64/scmi/config
> create mode 100644 tools/testing/selftests/arm64/scmi/kselftest_scmi_lib.sh
> create mode 100755 tools/testing/selftests/arm64/scmi/run_scmi_tests.sh
> create mode 100755 tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_enable.sh
> create mode 100755 tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_read.sh
> create mode 100755 tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_write.sh
> create mode 100755 tools/testing/selftests/arm64/scmi/testcases/protocol_0x15/sensor_reading.sh
>
> diff --git a/tools/testing/selftests/arm64/Makefile b/tools/testing/selftests/arm64/Makefile
> index 1e8d9a8f59df..6648dd8e2173 100644
> --- a/tools/testing/selftests/arm64/Makefile
> +++ b/tools/testing/selftests/arm64/Makefile
> @@ -4,7 +4,7 @@
> ARCH ?= $(shell uname -m 2>/dev/null || echo not)
>
> ifneq (,$(filter $(ARCH),aarch64 arm64))
> -ARM64_SUBTARGETS ?= tags signal pauth fp mte bti abi
> +ARM64_SUBTARGETS ?= tags signal pauth fp mte bti abi scmi
> else
> ARM64_SUBTARGETS :=
> endif
> diff --git a/tools/testing/selftests/arm64/scmi/Makefile b/tools/testing/selftests/arm64/scmi/Makefile
> new file mode 100644
> index 000000000000..8786d8d4c332
> --- /dev/null
> +++ b/tools/testing/selftests/arm64/scmi/Makefile
> @@ -0,0 +1,6 @@
> +# SPDX-License-Identifier: GPL-2.0
> +
> +TEST_PROGS := run_scmi_tests.sh
> +TEST_FILES := kselftest_scmi_lib.sh testcases/*
> +
> +include ../../lib.mk
> diff --git a/tools/testing/selftests/arm64/scmi/config b/tools/testing/selftests/arm64/scmi/config
> new file mode 100644
> index 000000000000..161387084a3f
> --- /dev/null
> +++ b/tools/testing/selftests/arm64/scmi/config
> @@ -0,0 +1 @@
> +CONFIG_ARM_SCMI_TEST_DRIVER=y
> diff --git a/tools/testing/selftests/arm64/scmi/kselftest_scmi_lib.sh b/tools/testing/selftests/arm64/scmi/kselftest_scmi_lib.sh
> new file mode 100644
> index 000000000000..54d27b5f3e1a
> --- /dev/null
> +++ b/tools/testing/selftests/arm64/scmi/kselftest_scmi_lib.sh
> @@ -0,0 +1,118 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +
> +SCMI_TEST_DRV="scmi_test_driver"
> +TRES=(0 0 0)
> +
> +ksft_log()
> +{
> + echo -e "[SCMI]: $1"
> +}
> +
> +ksft_skip()
> +{
> + echo -e "[SKIP]: $1"
> + exit 4
> +}
> +
> +ksft_pass()
> +{
> + echo -e "[PASS]: $1"
> +}
> +
> +ksft_fail()
> +{
> + echo -e "[FAIL]: $1"
> + exit 1
> +}
> +
> +ksft_results()
> +{
> + if [ $# -gt 0 ]; then
> + local val
> + local idx
> + local ret=$1
> +
> + case "$ret" in
> + 0)
> + idx=0
> + ;;
> + 4)
> + idx=1
> + ;;
> + *)
> + idx=2
> + ;;
> + esac
> + val=${TRES[${idx}]}
> + TRES[$idx]=$((val + 1))
> + else
> + ksft_log "Summary - PASS[${TRES[0]}] SKIP[${TRES[1]}] FAIL[${TRES[2]}]"
> + [ "x${TRES[2]}" != "x0" ] && exit 1
> + [ "x${TRES[1]}" != "x0" -a "x${TRES[0]}" == "x0" ] && exit 4
> + exit 0
> + fi
> +}
> +
> +ksft_scmi_run_one()
> +{
> + tcase=$1
> +
> + echo "-> Running testcase: $tcase"
> +
> + ./$tcase
> + ret=$?
> +
> + ksft_results $ret
> +}
> +
> +ksft_scmi_check_fw_version()
> +{
> + local supported=$1
> + local current="${SCMI_VENDOR}:${SCMI_SUB_VENDOR}"
> +
> + if [ "x${current}" != "x${supported}" ]; then
> + ksft_skip "Current FW('$current') is UNSUPPORTED. Should be '$supported'"
> + fi
> +}
> +
> +ksft_scmi_transport_is_atomic ()
> +{
> + [ "x$SCMI_TRANSPORT_IS_ATOMIC" == "xY" ] && return 0 || return 1
> +}
> +
> +ksft_scmi_protocol_resources_get()
> +{
> + local proto_dir=$1
> + local resources=""
> +
> + for d in ${proto_dir}/*; do
> + rd="$(basename $d)"
> + [[ $rd =~ [0-9] ]] && resources="$resources $rd"
> + done
> +
> + echo "$resources"
> +}
> +
> +ksft_scmi_value_get()
> +{
> + local syspath=$1
> + local __retval=$2
> + local value
> +
> + value=$(cat $syspath)
> + [ "x$?" != "x0" ] && ksft_fail "Fail to read $syspath"
> +
> + eval $__retval="'$value'"
> +}
> +
> +ksft_scmi_value_set()
> +{
> + local syspath=$1
> + local value=$2
> +
> + echo $value > $syspath
> + [ "x$?" != "x0" ] && ksft_fail "Fail to write $syspath - err:$?"
> +}
> +
> +
> diff --git a/tools/testing/selftests/arm64/scmi/run_scmi_tests.sh b/tools/testing/selftests/arm64/scmi/run_scmi_tests.sh
> new file mode 100755
> index 000000000000..f372744a4579
> --- /dev/null
> +++ b/tools/testing/selftests/arm64/scmi/run_scmi_tests.sh
> @@ -0,0 +1,69 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +
> +. ./kselftest_scmi_lib.sh
> +
> +check_root_privs()
> +{
> + [ x"$(id -u)" != "x0" ] && ksft_skip "You need to be root"
> +}
> +
> +check_scmi_testing_stack()
> +{
> + local debugfs_root=$(findmnt -o TARGET -t debugfs | grep -v TARGET)
> + export SCMI_DEBUGFS_TOPDIR="$debugfs_root/scmi"
> +
> + # Try to load module if not builtin
> + if [ ! -d $SCMI_DEBUGFS_TOPDIR ]; then
> + modprobe $SCMI_TEST_DRV || ksft_skip "Failed to load $SCMI_TEST_DRV"
> + [ ! -d $SCMI_DEBUGFS_TOPDIR ] && ksft_skip "SCMI Test stack not found; is CONFIG_ARM_SCMI_TEST_DRIVER enabled ?"
> + fi
> +}
> +
> +setup_scmi_test_env()
> +{
> + local scmi_info_dir="${SCMI_DEBUGFS_TOPDIR}/info/"
> +
> + export SCMI_VENDOR="$(cat ${scmi_info_dir}/vendor_id)"
> + export SCMI_SUB_VENDOR="$(cat ${scmi_info_dir}/sub_vendor_id)"
> + export SCMI_VERS_MAJ="$(cat ${scmi_info_dir}/major_ver)"
> + export SCMI_VERS_MIN="$(cat ${scmi_info_dir}/minor_ver)"
> + export SCMI_VERS_IMPL="$(cat ${scmi_info_dir}/impl_ver)"
> +
> + ksft_log "Found stack: $SCMI_VENDOR/$SCMI_SUB_VENDOR ${SCMI_VERS_MAJ}.${SCMI_VERS_MAJ} - $SCMI_VERS_IMPL"
> +
> + SCMI_TEST_PROTOS=""
> + for p in ${SCMI_DEBUGFS_TOPDIR}/protocol_*; do
> + SCMI_TEST_PROTOS="${SCMI_TEST_PROTOS} $(basename $p)"
> + done
> +
> + ksft_log "Found testing protocols: $SCMI_TEST_PROTOS"
> +
> + export SCMI_TEST_PROTOS
> + SCMI_TRANSPORT_IS_ATOMIC="N"
> + [ -d "${SCMI_DEBUGFS_TOPDIR}/transport" ] &&
> + SCMI_TRANSPORT_IS_ATOMIC=$(cat "${SCMI_DEBUGFS_TOPDIR}/transport/is_atomic")
> + export SCMI_TRANSPORT_IS_ATOMIC
> +}
> +
> +# Setup
> +check_root_privs
> +
> +check_scmi_testing_stack
> +
> +setup_scmi_test_env
> +
> +# Main
> +# Run all available tests for the found protocols
> +#
> +for proto_dir in $SCMI_TEST_PROTOS; do
> + [ ! -d $proto_dir ] && ksft_log "$proto_dir tests NOT supported." && continue
> + export TST_PROTO_DIR="${SCMI_DEBUGFS_TOPDIR}/${proto_dir}"
> + TST_PROTO_VERSION=$(cat ${TST_PROTO_DIR}/version)
> + ksft_log "Running tests for SCMI $proto_dir ver:$TST_PROTO_VERSION"
> + for tst in $proto_dir/*; do
> + ksft_scmi_run_one $tst
> + done
> +done
> +
> +ksft_results
> diff --git a/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_enable.sh b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_enable.sh
> new file mode 100755
> index 000000000000..4cdf3a097ba7
> --- /dev/null
> +++ b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_enable.sh
> @@ -0,0 +1,33 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +
> +. ./kselftest_scmi_lib.sh
> +
> +supported_fw="EMU-SCMI-VM:userland"
> +ksft_scmi_check_fw_version $supported_fw

what is the necessity of this check? Won't it limits the use of this
common test script across multiple platforms?

> +
> +clock_enable_disable() {
> + rname=$1
> + rdir=$2
> + clk_op=$3
> +
> + ksft_scmi_value_set $rdir/$clk_op Y
> + ksft_scmi_value_set $rdir/$clk_op N
> + ksft_log "Clock $rname: $clk_op - ON/OFF ... OK"
> +}
> +
> +resources=$(ksft_scmi_protocol_resources_get $TST_PROTO_DIR)
> +ksft_log "Found Clock resources: $resources"
> +
> +for res in $resources;do
> + resd="$TST_PROTO_DIR/$res"
> + name="$(cat $resd/info/name)"
> +
> + clock_enable_disable $name $resd "enable"
> + if [ ksft_transport_is_atomic ]; then
> + clock_enable_disable $name $resd "enable_atomic_irqs_off"
> + clock_enable_disable $name $resd "enable_atomic_irqs_on"
> + fi
> +done
> +
> +ksft_pass "$0"
> diff --git a/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_read.sh b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_read.sh
> new file mode 100755
> index 000000000000..88c444fd317d
> --- /dev/null
> +++ b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_read.sh
> @@ -0,0 +1,18 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +
> +. ./kselftest_scmi_lib.sh
> +
> +resources=$(ksft_scmi_protocol_resources_get $TST_PROTO_DIR)
> +ksft_log "Found Clock resources: $resources"
> +
> +for res in $resources;do
> + resd="$TST_PROTO_DIR/$res"
> + name="$(cat $resd/info/name)"
> + val=0
> +
> + ksft_scmi_value_get $resd/rate_get_set val
> + ksft_log "$name READ => $val"
> +done
> +
> +ksft_pass "$0"
> diff --git a/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_write.sh b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_write.sh
> new file mode 100755
> index 000000000000..346084ec3812
> --- /dev/null
> +++ b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_write.sh
> @@ -0,0 +1,29 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +
> +. ./kselftest_scmi_lib.sh
> +
> +supported_fw="EMU-SCMI-VM:userland"
> +ksft_scmi_check_fw_version $supported_fw
> +
> +resources=$(ksft_scmi_protocol_resources_get $TST_PROTO_DIR)
> +ksft_log "Found Clock resources: $resources"
> +
> +for res in $resources;do
> + resd="$TST_PROTO_DIR/$res"
> + name="$(cat $resd/info/name)"
> + val=0
> + oldval=0
> + setval=0
> +
> + ksft_scmi_value_get $resd/rate_get_set oldval
> + setval=$((oldval + 666))
> +
> + ksft_scmi_value_set $resd/rate_get_set $setval
> +
> + ksft_scmi_value_get $resd/rate_get_set val
> + [ "x$val" != "x$setval" ] && ksft_fail "Set:$setval readback:$val"
> + ksft_log "$name OK -> read:$oldval set:$setval readback:$val"
> +done
> +
> +ksft_pass "$0"
> diff --git a/tools/testing/selftests/arm64/scmi/testcases/protocol_0x15/sensor_reading.sh b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x15/sensor_reading.sh
> new file mode 100755
> index 000000000000..b0f5f6361379
> --- /dev/null
> +++ b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x15/sensor_reading.sh
> @@ -0,0 +1,17 @@
> +#!/bin/bash
> +
> +. ./kselftest_scmi_lib.sh
> +
> +resources=$(ksft_scmi_protocol_resources_get $TST_PROTO_DIR)
> +ksft_log "Found Sensor resources: $resources"
> +
> +for res in $resources;do
> + resd="$TST_PROTO_DIR/$res"
> + name="$(cat $resd/info/name)"
> + val=0
> +
> + ksft_scmi_value_get $resd/reading_get val
> + ksft_log "$name READ => $val"
> +done
> +
> +ksft_pass $0
> --
> 2.17.1
>

2022-08-01 07:02:52

by Cristian Marussi

[permalink] [raw]
Subject: Re: [RFC PATCH 15/16] selftests: arm64: Add initial SCMI testcases

On Mon, Aug 01, 2022 at 11:02:28AM +0530, Arun KS wrote:
> Hi Cristian,

Hi Arun,

sorry I found this mail a bit garbled and with HTML, I'll answer below
what I could see.

> On Mon, Feb 28, 2022 at 12:16 PM Cristian Marussi
> <[1][email protected]> wrote:
> >
> > A few initial testcases for Clock and Sensot protocol plus all the
> test
> > infrastructure, including the test runeer.
> >
> > All of this just an experimental demonstrator.
> >
> > Signed-off-by: Cristian Marussi <[2][email protected]>
> > ---
> > tools/testing/selftests/arm64/Makefile | 2 +-
> > tools/testing/selftests/arm64/scmi/Makefile | 6 +
> > tools/testing/selftests/arm64/scmi/config | 1 +
> > .../arm64/scmi/kselftest_scmi_lib.sh | 118
> ++++++++++++++++++
> > .../selftests/arm64/scmi/run_scmi_tests.sh | 69 ++++++++++
> > .../testcases/protocol_0x14/clock_enable.sh | 33 +++++
> > .../protocol_0x14/clock_rate_read.sh | 18 +++
> > .../protocol_0x14/clock_rate_write.sh | 29 +++++
> > .../testcases/protocol_0x15/sensor_reading.sh | 17 +++
> > 9 files changed, 292 insertions(+), 1 deletion(-)
> > create mode 100644 tools/testing/selftests/arm64/scmi/Makefile
> > create mode 100644 tools/testing/selftests/arm64/scmi/config
> > create mode 100644
> tools/testing/selftests/arm64/scmi/kselftest_scmi_lib.sh
> > create mode 100755
> tools/testing/selftests/arm64/scmi/run_scmi_tests.sh
> > create mode 100755
> tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_enable
> .sh
> > create mode 100755
> tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_r
> ead.sh
> > create mode 100755
> tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate_w
> rite.sh
> > create mode 100755
> tools/testing/selftests/arm64/scmi/testcases/protocol_0x15/sensor_readi
> ng.sh
> >
> > diff --git a/tools/testing/selftests/arm64/Makefile
> b/tools/testing/selftests/arm64/Makefile
> > index 1e8d9a8f59df..6648dd8e2173 100644
> > --- a/tools/testing/selftests/arm64/Makefile
> > +++ b/tools/testing/selftests/arm64/Makefile
> > @@ -4,7 +4,7 @@
> > ARCH ?= $(shell uname -m 2>/dev/null || echo not)
> >
> > ifneq (,$(filter $(ARCH),aarch64 arm64))
> > -ARM64_SUBTARGETS ?= tags signal pauth fp mte bti abi
> > +ARM64_SUBTARGETS ?= tags signal pauth fp mte bti abi scmi
> > else
> > ARM64_SUBTARGETS :=
> > endif
> > diff --git a/tools/testing/selftests/arm64/scmi/Makefile
> b/tools/testing/selftests/arm64/scmi/Makefile
> > new file mode 100644
> > index 000000000000..8786d8d4c332
> > --- /dev/null
> > +++ b/tools/testing/selftests/arm64/scmi/Makefile
> > @@ -0,0 +1,6 @@
> > +# SPDX-License-Identifier: GPL-2.0
> > +
> > +TEST_PROGS := run_scmi_tests.sh
> > +TEST_FILES := kselftest_scmi_lib.sh testcases/*
> > +
> > +include ../../[3]lib.mk
> > diff --git a/tools/testing/selftests/arm64/scmi/config
> b/tools/testing/selftests/arm64/scmi/config
> > new file mode 100644
> > index 000000000000..161387084a3f
> > --- /dev/null
> > +++ b/tools/testing/selftests/arm64/scmi/config
> > @@ -0,0 +1 @@
> > +CONFIG_ARM_SCMI_TEST_DRIVER=y
> > diff --git a/tools/testing/selftests/arm64/scmi/kselftest_scmi_lib.sh
> b/tools/testing/selftests/arm64/scmi/kselftest_scmi_lib.sh
> > new file mode 100644
> > index 000000000000..54d27b5f3e1a
> > --- /dev/null
> > +++ b/tools/testing/selftests/arm64/scmi/kselftest_scmi_lib.sh
> > @@ -0,0 +1,118 @@
> > +#!/bin/bash
> > +# SPDX-License-Identifier: GPL-2.0
> > +
> > +SCMI_TEST_DRV="scmi_test_driver"
> > +TRES=(0 0 0)
> > +
> > +ksft_log()
> > +{
> > + echo -e "[SCMI]: $1"
> > +}
> > +
> > +ksft_skip()
> > +{
> > + echo -e "[SKIP]: $1"
> > + exit 4
> > +}
> > +
> > +ksft_pass()
> > +{
> > + echo -e "[PASS]: $1"
> > +}
> > +
> > +ksft_fail()
> > +{
> > + echo -e "[FAIL]: $1"
> > + exit 1
> > +}
> > +
> > +ksft_results()
> > +{
> > + if [ $# -gt 0 ]; then
> > + local val
> > + local idx
> > + local ret=$1
> > +
> > + case "$ret" in
> > + 0)
> > + idx=0
> > + ;;
> > + 4)
> > + idx=1
> > + ;;
> > + *)
> > + idx=2
> > + ;;
> > + esac
> > + val=${TRES[${idx}]}
> > + TRES[$idx]=$((val + 1))
> > + else
> > + ksft_log "Summary - PASS[${TRES[0]}]
> SKIP[${TRES[1]}] FAIL[${TRES[2]}]"
> > + [ "x${TRES[2]}" != "x0" ] && exit 1
> > + [ "x${TRES[1]}" != "x0" -a "x${TRES[0]}" == "x0" ] &&
> exit 4
> > + exit 0
> > + fi
> > +}
> > +
> > +ksft_scmi_run_one()
> > +{
> > + tcase=$1
> > +
> > + echo "-> Running testcase: $tcase"
> > +
> > + ./$tcase
> > + ret=$?
> > +
> > + ksft_results $ret
> > +}
> > +
> > +ksft_scmi_check_fw_version()
> > +{
> > + local supported=$1
> > + local current="${SCMI_VENDOR}:${SCMI_SUB_VENDOR}"
> > +
> > + if [ "x${current}" != "x${supported}" ]; then
> > + ksft_skip "Current FW('$current') is UNSUPPORTED.
> Should be '$supported'"

No, because I want to write out that the FW currently found running is
not supported by this test.

> > + fi
> > +}
> > +
> > +ksft_scmi_transport_is_atomic ()
> > +{
> > + [ "x$SCMI_TRANSPORT_IS_ATOMIC" == "xY" ] && return 0 ||
> return 1
> > +}
> > +
> > +ksft_scmi_protocol_resources_get()
> > +{
> > + local proto_dir=$1
> > + local resources=""
> > +
> > + for d in ${proto_dir}/*; do
> > + rd="$(basename $d)"
> > + [[ $rd =~ [0-9] ]] && resources="$resources $rd"
> > + done
> > +
> > + echo "$resources"
> > +}
> > +
> > +ksft_scmi_value_get()
> > +{
> > + local syspath=$1
> > + local __retval=$2
> > + local value
> > +
> > + value=$(cat $syspath)
> > + [ "x$?" != "x0" ] && ksft_fail "Fail to read $syspath"
> > +
> > + eval $__retval="'$value'"
> > +}
> > +
> > +ksft_scmi_value_set()
> > +{
> > + local syspath=$1
> > + local value=$2
> > +
> > + echo $value > $syspath
> > + [ "x$?" != "x0" ] && ksft_fail "Fail to write $syspath -
> err:$?"
> > +}
> > +
> > +
> > diff --git a/tools/testing/selftests/arm64/scmi/run_scmi_tests.sh
> b/tools/testing/selftests/arm64/scmi/run_scmi_tests.sh
> > new file mode 100755
> > index 000000000000..f372744a4579
> > --- /dev/null
> > +++ b/tools/testing/selftests/arm64/scmi/run_scmi_tests.sh
> > @@ -0,0 +1,69 @@
> > +#!/bin/bash
> > +# SPDX-License-Identifier: GPL-2.0
> > +
> > +. ./kselftest_scmi_lib.sh
> > +
> > +check_root_privs()
> > +{
> > + [ x"$(id -u)" != "x0" ] && ksft_skip "You need to be root"
> > +}
> > +
> > +check_scmi_testing_stack()
> > +{
> > + local debugfs_root=$(findmnt -o TARGET -t debugfs | grep -v
> TARGET)
> > + export SCMI_DEBUGFS_TOPDIR="$debugfs_root/scmi"
> > +
> > + # Try to load module if not builtin
> > + if [ ! -d $SCMI_DEBUGFS_TOPDIR ]; then
> > + modprobe $SCMI_TEST_DRV || ksft_skip "Failed to load
> $SCMI_TEST_DRV"
> > + [ ! -d $SCMI_DEBUGFS_TOPDIR ] && ksft_skip "SCMI Test
> stack not found; is CONFIG_ARM_SCMI_TEST_DRIVER enabled ?"
> > + fi
> > +}
> > +
> > +setup_scmi_test_env()
> > +{
> > + local scmi_info_dir="${SCMI_DEBUGFS_TOPDIR}/info/"
> > +
> > + export SCMI_VENDOR="$(cat ${scmi_info_dir}/vendor_id)"
> > + export SCMI_SUB_VENDOR="$(cat
> ${scmi_info_dir}/sub_vendor_id)"
> > + export SCMI_VERS_MAJ="$(cat ${scmi_info_dir}/major_ver)"
> > + export SCMI_VERS_MIN="$(cat ${scmi_info_dir}/minor_ver)"
> > + export SCMI_VERS_IMPL="$(cat ${scmi_info_dir}/impl_ver)"
> > +
> > + ksft_log "Found stack: $SCMI_VENDOR/$SCMI_SUB_VENDOR
> ${SCMI_VERS_MAJ}.${SCMI_VERS_MAJ} - $SCMI_VERS_IMPL"
> > +
> > + SCMI_TEST_PROTOS=""
> > + for p in ${SCMI_DEBUGFS_TOPDIR}/protocol_*; do
> > + SCMI_TEST_PROTOS="${SCMI_TEST_PROTOS} $(basename $p)"
> > + done
> > +
> > + ksft_log "Found testing protocols: $SCMI_TEST_PROTOS"
> > +
> > + export SCMI_TEST_PROTOS
> > + SCMI_TRANSPORT_IS_ATOMIC="N"
> > + [ -d "${SCMI_DEBUGFS_TOPDIR}/transport" ] &&
> > + SCMI_TRANSPORT_IS_ATOMIC=$(cat
> "${SCMI_DEBUGFS_TOPDIR}/transport/is_atomic")
> > + export SCMI_TRANSPORT_IS_ATOMIC
> > +}
> > +
> > +# Setup
> > +check_root_privs
> > +
> > +check_scmi_testing_stack
> > +
> > +setup_scmi_test_env
> > +
> > +# Main
> > +# Run all available tests for the found protocols
> > +#
> > +for proto_dir in $SCMI_TEST_PROTOS; do
> > + [ ! -d $proto_dir ] && ksft_log "$proto_dir tests NOT
> supported." && continue
> > + export TST_PROTO_DIR="${SCMI_DEBUGFS_TOPDIR}/${proto_dir}"
> > + TST_PROTO_VERSION=$(cat ${TST_PROTO_DIR}/version)
> > + ksft_log "Running tests for SCMI $proto_dir
> ver:$TST_PROTO_VERSION"
> > + for tst in $proto_dir/*; do
> > + ksft_scmi_run_one $tst
> > + done
> > +done
> > +
> > +ksft_results
> > diff --git
> a/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_enab
> le.sh
> b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_enab
> le.sh
> > new file mode 100755
> > index 000000000000..4cdf3a097ba7
> > --- /dev/null
> > +++
> b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_enab
> le.sh
> > @@ -0,0 +1,33 @@
> > +#!/bin/bash
> > +# SPDX-License-Identifier: GPL-2.0
> > +
> > +. ./kselftest_scmi_lib.sh
> > +
> > +supported_fw="EMU-SCMI-VM:userland"
> > +ksft_scmi_check_fw_version $supported_fw
> > +
> > +clock_enable_disable() {
> > + rname=$1
> > + rdir=$2
> > + clk_op=$3
> > +
> > + ksft_scmi_value_set $rdir/$clk_op Y
> > + ksft_scmi_value_set $rdir/$clk_op N
> > + ksft_log "Clock $rname: $clk_op - ON/OFF ... OK"
> > +}
> > +
> > +resources=$(ksft_scmi_protocol_resources_get $TST_PROTO_DIR)
> > +ksft_log "Found Clock resources: $resources"
> > +
> > +for res in $resources;do
> > + resd="$TST_PROTO_DIR/$res"
> > + name="$(cat $resd/info/name)"
> > +
> > + clock_enable_disable $name $resd "enable"
> > + if [ ksft_transport_is_atomic ]; then
> > + clock_enable_disable $name $resd
> "enable_atomic_irqs_off"
> > + clock_enable_disable $name $resd
> "enable_atomic_irqs_on"
> > + fi
> > +done
> > +
> > +ksft_pass "$0"
> > diff --git
> a/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate
> _read.sh
> b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate
> _read.sh
> > new file mode 100755
> > index 000000000000..88c444fd317d
> > --- /dev/null
> > +++
> b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate
> _read.sh
> > @@ -0,0 +1,18 @@
> > +#!/bin/bash
> > +# SPDX-License-Identifier: GPL-2.0
> > +
> > +. ./kselftest_scmi_lib.sh
> > +
> > +resources=$(ksft_scmi_protocol_resources_get $TST_PROTO_DIR)
> > +ksft_log "Found Clock resources: $resources"
> > +
> > +for res in $resources;do
> > + resd="$TST_PROTO_DIR/$res"
> > + name="$(cat $resd/info/name)"
> > + val=0
> > +
> > + ksft_scmi_value_get $resd/rate_get_set val
> > + ksft_log "$name READ => $val"
> > +done
> > +
> > +ksft_pass "$0"
> > diff --git
> a/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate
> _write.sh
> b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate
> _write.sh
> > new file mode 100755
> > index 000000000000..346084ec3812
> > --- /dev/null
> > +++
> b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_rate
> _write.sh
> > @@ -0,0 +1,29 @@
> > +#!/bin/bash
> > +# SPDX-License-Identifier: GPL-2.0
> > +
> > +. ./kselftest_scmi_lib.sh
> > +
> > +supported_fw="EMU-SCMI-VM:userland"
> > +ksft_scmi_check_fw_version $supported_fw
> > +
> > +resources=$(ksft_scmi_protocol_resources_get $TST_PROTO_DIR)
> > +ksft_log "Found Clock resources: $resources"
> > +
> > +for res in $resources;do
> > + resd="$TST_PROTO_DIR/$res"
> > + name="$(cat $resd/info/name)"
> > + val=0
> > + oldval=0
> > + setval=0
> > +
> > + ksft_scmi_value_get $resd/rate_get_set oldval
> > + setval=$((oldval + 666))
> significance of 666?

Just a stupid dummy value that stands-out in my log when
testing this series .... clearly won't be the value in the final series.

> > +
> > + ksft_scmi_value_set $resd/rate_get_set $setval
> when setval is not a valid option(not in the list of possible clock
> rates),
> rate_get_set returns non zero value and ksft_scmi_value_set() calls
> ksft_fail()
> and then an exit. Is this what is intended to do?

Probably not, this should expect a failure...thanks.

Thanks,
Cristian

2022-08-01 07:13:29

by Cristian Marussi

[permalink] [raw]
Subject: Re: [RFC PATCH 15/16] selftests: arm64: Add initial SCMI testcases

On Mon, Aug 01, 2022 at 10:22:19AM +0530, Arun KS wrote:
> Hi Cristian,
>

Hi Arun,

[snip]
> > +setup_scmi_test_env()
> > +{
> > + local scmi_info_dir="${SCMI_DEBUGFS_TOPDIR}/info/"
> > +
> > + export SCMI_VENDOR="$(cat ${scmi_info_dir}/vendor_id)"
> > + export SCMI_SUB_VENDOR="$(cat ${scmi_info_dir}/sub_vendor_id)"
> > + export SCMI_VERS_MAJ="$(cat ${scmi_info_dir}/major_ver)"
> > + export SCMI_VERS_MIN="$(cat ${scmi_info_dir}/minor_ver)"
> > + export SCMI_VERS_IMPL="$(cat ${scmi_info_dir}/impl_ver)"
> > +
> > + ksft_log "Found stack: $SCMI_VENDOR/$SCMI_SUB_VENDOR ${SCMI_VERS_MAJ}.${SCMI_VERS_MAJ} - $SCMI_VERS_IMPL"
> > +
> > + SCMI_TEST_PROTOS=""
> > + for p in ${SCMI_DEBUGFS_TOPDIR}/protocol_*; do
> > + SCMI_TEST_PROTOS="${SCMI_TEST_PROTOS} $(basename $p)"
> > + done
> > +
> > + ksft_log "Found testing protocols: $SCMI_TEST_PROTOS"
> > +
> > + export SCMI_TEST_PROTOS
> > + SCMI_TRANSPORT_IS_ATOMIC="N"
> > + [ -d "${SCMI_DEBUGFS_TOPDIR}/transport" ] &&
> > + SCMI_TRANSPORT_IS_ATOMIC=$(cat "${SCMI_DEBUGFS_TOPDIR}/transport/is_atomic")
> > + export SCMI_TRANSPORT_IS_ATOMIC
> > +}
> > +
> > +# Setup
> > +check_root_privs
> > +
> > +check_scmi_testing_stack
> > +
> > +setup_scmi_test_env
> > +
> > +# Main
> > +# Run all available tests for the found protocols
> > +#
> > +for proto_dir in $SCMI_TEST_PROTOS; do
> > + [ ! -d $proto_dir ] && ksft_log "$proto_dir tests NOT supported." && continue
> > + export TST_PROTO_DIR="${SCMI_DEBUGFS_TOPDIR}/${proto_dir}"
> > + TST_PROTO_VERSION=$(cat ${TST_PROTO_DIR}/version)
> > + ksft_log "Running tests for SCMI $proto_dir ver:$TST_PROTO_VERSION"
> > + for tst in $proto_dir/*; do
> > + ksft_scmi_run_one $tst
> > + done
> > +done
> > +
> > +ksft_results
> > diff --git a/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_enable.sh b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_enable.sh
> > new file mode 100755
> > index 000000000000..4cdf3a097ba7
> > --- /dev/null
> > +++ b/tools/testing/selftests/arm64/scmi/testcases/protocol_0x14/clock_enable.sh
> > @@ -0,0 +1,33 @@
> > +#!/bin/bash
> > +# SPDX-License-Identifier: GPL-2.0
> > +
> > +. ./kselftest_scmi_lib.sh
> > +
> > +supported_fw="EMU-SCMI-VM:userland"
> > +ksft_scmi_check_fw_version $supported_fw
>
> what is the necessity of this check? Won't it limits the use of this
> common test script across multiple platforms?
>

Yes, indeed the basic idea here was to showcase in this RFC series that
the testcases could be written so as to be run only on a restricted set
of platforms: the crux of the matter is that some of the SCMI tests by
their own nature can be very invasive and disruptive, but for the sake
of testing the Kernel stack some of those are worth to be run and, with
this 'version-bsed' approach, you could run it safely as long as you
deploy them against some sort of special emulated SCMI-server which is
is instead safe to be tested in any way (since no real clocks are in
fact involved...)

For this same reason, this kind of test tailored at a very special SCMI
server wouldn't be probably upstreamed unless you fw-emulation backend
is upstream in the open too, so I posted this test more to showcase the
version based mechanism than the test itself...

Thanks,
Cristian