diff --git a/Runner/suites/Kernel/DEBUG/ETM-Test-Mode/ETM-Test-Mode.yaml b/Runner/suites/Kernel/DEBUG/ETM-Test-Mode/ETM-Test-Mode.yaml new file mode 100644 index 00000000..dd5199e3 --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/ETM-Test-Mode/ETM-Test-Mode.yaml @@ -0,0 +1,13 @@ +metadata: + name: ETM-Test-Mode + description: "Validates ETM functionality by setting the 'mode' attribute to high (0xFFFFFFF) and enabling the cores." + + os: + - linux + devices: + - qcm6490 + - qcs9100 + scope: + - coresight + - kernel + timeout: 60 \ No newline at end of file diff --git a/Runner/suites/Kernel/DEBUG/ETM-Test-Mode/README.md b/Runner/suites/Kernel/DEBUG/ETM-Test-Mode/README.md new file mode 100644 index 00000000..eaa971dd --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/ETM-Test-Mode/README.md @@ -0,0 +1,21 @@ +# ETM Test Mode + +## Overview +This test verifies the stability and write-access of the **ETM (Embedded Trace Macrocell)** `mode` attribute. It sets the mode to `0XFFFFFFF` (enabling various mode bits like cycle-accurate tracing, etc., depending on the hardware revision) and attempts to enable the ETM sources. + +## Execution +1. **Discovery**: Scans `/sys/bus/coresight/devices/` for ETM devices (`etm*` or `coresight-etm*`). +2. **Setup**: + * Resets all Coresight sources and sinks. + * Enables `tmc_etr0` as the trace sink. +3. **Test**: + * Iterates through all detected ETM devices. + * Writes `0XFFFFFFF` to the `mode` sysfs attribute. + * Enables the ETM source. +4. **Teardown**: + * Writes `0x0` to the `mode` sysfs attribute (restoring defaults). + * Disables all sources and sinks. + +## Output +* Console logs showing detection and configuration of each core. +* `ETM-Test-Mode.res` containing the final Pass/Fail status. \ No newline at end of file diff --git a/Runner/suites/Kernel/DEBUG/ETM-Test-Mode/run.sh b/Runner/suites/Kernel/DEBUG/ETM-Test-Mode/run.sh new file mode 100644 index 00000000..5651527a --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/ETM-Test-Mode/run.sh @@ -0,0 +1,135 @@ +#!/bin/sh + +# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. +# SPDX-License-Identifier: BSD-3-Clause + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +INIT_ENV="" +SEARCH="$SCRIPT_DIR" +while [ "$SEARCH" != "/" ]; do + if [ -f "$SEARCH/init_env" ]; then + INIT_ENV="$SEARCH/init_env" + break + fi + SEARCH=$(dirname "$SEARCH") +done + +if [ -z "$INIT_ENV" ]; then + echo "[ERROR] Could not find init_env" >&2 + exit 1 +fi + +if [ -z "$__INIT_ENV_LOADED" ]; then + # shellcheck disable=SC1090 + . "$INIT_ENV" +fi + +# shellcheck disable=SC1090,SC1091 +. "$TOOLS/functestlib.sh" + +TESTNAME="ETM-Test-Mode" +if command -v find_test_case_by_name >/dev/null 2>&1; then + test_path=$(find_test_case_by_name "$TESTNAME") + cd "$test_path" || exit 1 +else + cd "$SCRIPT_DIR" || exit 1 +fi + +res_file="./$TESTNAME.res" +rm -f "$res_file" +touch "$res_file" + +log_info "-----------------------------------------------------------------------------------------" +log_info "-------------------Starting $TESTNAME Testcase----------------------------" + +CS_BASE="/sys/bus/coresight/devices" +ETR_PATH="$CS_BASE/tmc_etr0" +[ ! -d "$ETR_PATH" ] && ETR_PATH="$CS_BASE/tmc_etr" + + +reset_source_sink() { + if [ -f "$CS_BASE/stm0/enable_source" ]; then + echo 0 > "$CS_BASE/stm0/enable_source" + fi + + # shellcheck disable=SC2086 + for etm in $ETM_LIST; do + if [ -f "$etm/enable_source" ]; then + echo 0 > "$etm/enable_source" + fi + done + + if [ -f "$ETR_PATH/enable_sink" ]; then + echo 0 > "$ETR_PATH/enable_sink" + fi + if [ -f "$CS_BASE/tmc_etf0/enable_sink" ]; then + echo 0 > "$CS_BASE/tmc_etf0/enable_sink" + fi +} + + +# shellcheck disable=SC2010 +ETM_LIST=$(ls -d "$CS_BASE"/etm* "$CS_BASE"/coresight-etm* 2>/dev/null) + +if [ -z "$ETM_LIST" ]; then + log_fail "No Coresight ETM devices found" + echo "$TESTNAME: FAIL" >> "$res_file" + exit 1 +fi + +log_info "Found ETM devices: $(echo "$ETM_LIST" | tr '\n' ' ')" + +reset_source_sink + +if [ -d "$ETR_PATH" ]; then + log_info "Enabling Sink: $ETR_PATH" + echo 1 > "$ETR_PATH/enable_sink" +else + log_fail "TMC-ETR sink not found" + echo "$TESTNAME: FAIL" >> "$res_file" + exit 1 +fi + +fail_count=0 + +# shellcheck disable=SC2086 +for etm in $ETM_LIST; do + log_info "Configuring $etm" + + if [ -f "$etm/mode" ]; then + echo 0XFFFFFFF > "$etm/mode" + if [ $? -ne 0 ]; then + log_warn "Failed to set mode on $etm" + fail_count=$((fail_count + 1)) + fi + else + log_warn "$etm does not have 'mode' attribute" + fi + + if [ -f "$etm/enable_source" ]; then + echo 1 > "$etm/enable_source" + if [ $? -ne 0 ]; then + log_fail "Failed to enable $etm" + fail_count=$((fail_count + 1)) + fi + fi +done + +if [ $fail_count -eq 0 ]; then + log_pass "ETM Mode Configuration Successful" + echo "$TESTNAME: PASS" >> "$res_file" +else + log_fail "ETM Mode Configuration Failed ($fail_count errors)" + echo "$TESTNAME: FAIL" >> "$res_file" +fi + +# shellcheck disable=SC2086 +for etm in $ETM_LIST; do + if [ -f "$etm/mode" ]; then + echo 0x0 > "$etm/mode" + fi +done + +reset_source_sink + +# log_info "-------------------$TESTNAME Testcase Finished----------------------------" \ No newline at end of file diff --git a/Runner/suites/Kernel/DEBUG/ETM-Trace/ETM-Trace.yaml b/Runner/suites/Kernel/DEBUG/ETM-Trace/ETM-Trace.yaml new file mode 100644 index 00000000..c0e473f7 --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/ETM-Trace/ETM-Trace.yaml @@ -0,0 +1,13 @@ +metadata: + name: ETM-Trace-Enable-Disable + description: "Validates the stability of enabling and disabling ETM sources repeatedly and verifies trace data generation." + + os: + - linux + devices: + - qcm6490 + - qcs9100 + scope: + - coresight + - kernel + timeout: 300 \ No newline at end of file diff --git a/Runner/suites/Kernel/DEBUG/ETM-Trace/README.md b/Runner/suites/Kernel/DEBUG/ETM-Trace/README.md new file mode 100644 index 00000000..004d663b --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/ETM-Trace/README.md @@ -0,0 +1,27 @@ +# ETM Trace Test + +## Overview +This test validates the reliability of the ETM (Embedded Trace Macrocell) drivers by repeatedly enabling and disabling trace sources and verifying that data is successfully written to the sinks. + +## Execution Logic +The test iterates through **every available sink** (excluding `tmc_etf1`) and **every available ETM source**. + +For each Sink $\leftrightarrow$ Source pair, it performs `N` iterations (default: 2): +1. **Reset**: Disable all Coresight devices. +2. **Enable Sink**: Activate the current sink (e.g., `tmc_etr0`). +3. **Enable Source**: Activate the current ETM (e.g., `etm0`). +4. **Capture**: Sleep for 3 seconds to generate trace data, then dump the content of `/dev/` to a temporary binary file. +5. **Verify**: + * Check if the captured binary file size is $\ge$ 64 bytes. + * Check if the source disabled correctly. + +## Usage +Run the script directly or via the runner. +Optional argument: Number of iterations per device pair. +```bash +./run.sh 5 +``` + +## Output +* Console logs for each iteration. +* ETM-Trace-Enable-Disable.res containing the final Pass/Fail status. \ No newline at end of file diff --git a/Runner/suites/Kernel/DEBUG/ETM-Trace/run.sh b/Runner/suites/Kernel/DEBUG/ETM-Trace/run.sh new file mode 100644 index 00000000..73a290ad --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/ETM-Trace/run.sh @@ -0,0 +1,174 @@ +#!/bin/sh + +# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. +# SPDX-License-Identifier: BSD-3-Clause + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +INIT_ENV="" +SEARCH="$SCRIPT_DIR" +while [ "$SEARCH" != "/" ]; do + if [ -f "$SEARCH/init_env" ]; then + INIT_ENV="$SEARCH/init_env" + break + fi + SEARCH=$(dirname "$SEARCH") +done + +if [ -z "$INIT_ENV" ]; then + echo "[ERROR] Could not find init_env" >&2 + exit 1 +fi + +if [ -z "$__INIT_ENV_LOADED" ]; then + # shellcheck disable=SC1090 + . "$INIT_ENV" +fi + +# shellcheck disable=SC1090,SC1091 +. "$TOOLS/functestlib.sh" + +TESTNAME="ETM-Trace" +if command -v find_test_case_by_name >/dev/null 2>&1; then + test_path=$(find_test_case_by_name "$TESTNAME") + cd "$test_path" || exit 1 +else + cd "$SCRIPT_DIR" || exit 1 +fi + +res_file="./$TESTNAME.res" +rm -f "$res_file" +touch "$res_file" + +log_info "-----------------------------------------------------------------------------------------" +log_info "-------------------Starting $TESTNAME Testcase----------------------------" + +CS_BASE="/sys/bus/coresight/devices" +TMP_DIR="/tmp/coresight-test" +FAIL_COUNT=0 + +RUNS=2 +if [ -n "$1" ]; then + RUNS=$1 +fi + +rm -rf "$TMP_DIR" +mkdir -p "$TMP_DIR" + + +reset_devices() { + if [ -f "$CS_BASE/stm0/enable_source" ]; then + echo 0 > "$CS_BASE/stm0/enable_source" 2>/dev/null + fi + + # shellcheck disable=SC2010 + for etm in $(ls -d "$CS_BASE"/etm* "$CS_BASE"/coresight-etm* 2>/dev/null); do + if [ -f "$etm/enable_source" ]; then + echo 0 > "$etm/enable_source" 2>/dev/null + fi + done + + for sink in "$CS_BASE"/tmc_et*; do + if [ -f "$sink/enable_sink" ]; then + echo 0 > "$sink/enable_sink" 2>/dev/null + fi + done +} + +run_trace_test() { + sourcename=$1 + sinkname=$2 + + bin_dir="$TMP_DIR/$sinkname" + mkdir -p "$bin_dir" + + log_info ">>> Source: $(basename "$sourcename") | Sink: $sinkname" + + if ! echo 1 > "$sourcename/enable_source"; then + log_fail "Failed to write 1 to $sourcename/enable_source" + return 1 + fi + + res=$(cat "$sourcename/enable_source") + if [ "$res" -eq 1 ]; then + log_info "Source enabled successfully" + else + log_fail "Source failed to enable (Value: $res)" + return 1 + fi + + sleep 3 + + outfile="$bin_dir/$(basename "$sourcename").bin" + timeout 5 cat "/dev/$sinkname" > "$outfile" 2>/dev/null + + if [ -f "$outfile" ]; then + bin_size=$(stat -c%s "$outfile") + log_info " captured bin size: $bin_size bytes" + + if [ "$bin_size" -ge 64 ]; then + log_pass "Trace data captured for $sourcename -> $sinkname" + else + log_fail "Trace data too small ($bin_size < 64)" + FAIL_COUNT=$((FAIL_COUNT + 1)) + fi + else + log_fail "Failed to create output file from /dev/$sinkname" + FAIL_COUNT=$((FAIL_COUNT + 1)) + fi + + echo 0 > "$sourcename/enable_source" + res=$(cat "$sourcename/enable_source") + + if [ "$res" -eq 0 ]; then + log_info "Source disabled successfully" + else + log_fail "Source failed to disable (Value: $res)" + FAIL_COUNT=$((FAIL_COUNT + 1)) + fi +} + + +# shellcheck disable=SC2010 +SINK_LIST=$(ls -d "$CS_BASE"/tmc_et* 2>/dev/null | grep -v tmc_etf1) +# shellcheck disable=SC2010 +ETM_LIST=$(ls -d "$CS_BASE"/etm* "$CS_BASE"/coresight-etm* 2>/dev/null) + +if [ -z "$SINK_LIST" ] || [ -z "$ETM_LIST" ]; then + log_fail "Missing Sinks or ETM devices" + echo "$TESTNAME: FAIL" >> "$res_file" + exit 1 +fi + +reset_devices + +for sink_path in $SINK_LIST; do + sinkname=$(basename "$sink_path") + + i=0 + while [ $i -lt "$RUNS" ]; do + log_info "--- Iteration $((i+1)) for Sink: $sinkname ---" + + for etm_path in $ETM_LIST; do + reset_devices + + echo 1 > "$sink_path/enable_sink" + + run_trace_test "$etm_path" "$sinkname" + done + + i=$((i+1)) + done +done + +reset_devices + +if [ "$FAIL_COUNT" -eq 0 ]; then + log_pass "ETM Trace Enable/Disable Test Completed Successfully" + echo "$TESTNAME: PASS" >> "$res_file" +else + log_fail "ETM Trace Enable/Disable Test Failed ($FAIL_COUNT errors)" + echo "$TESTNAME: FAIL" >> "$res_file" +fi + +rm -rf "$TMP_DIR" +# log_info "-------------------$TESTNAME Testcase Finished----------------------------" \ No newline at end of file diff --git a/Runner/suites/Kernel/DEBUG/MultiSource-STM-ETM/MultiSource-STM-ETM.yaml b/Runner/suites/Kernel/DEBUG/MultiSource-STM-ETM/MultiSource-STM-ETM.yaml new file mode 100644 index 00000000..221e8ba0 --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/MultiSource-STM-ETM/MultiSource-STM-ETM.yaml @@ -0,0 +1,13 @@ +metadata: + name: MultiSource-STM-ETM + description: "Validates concurrent STM and ETM trace collection across multiple cores." + + os: + - linux + devices: + - qcm6490 + - qcs9100 + scope: + - coresight + - kernel + timeout: 300 \ No newline at end of file diff --git a/Runner/suites/Kernel/DEBUG/MultiSource-STM-ETM/README.md b/Runner/suites/Kernel/DEBUG/MultiSource-STM-ETM/README.md new file mode 100644 index 00000000..db11cf4e --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/MultiSource-STM-ETM/README.md @@ -0,0 +1,25 @@ +# Multi-Source STM + ETM Test + +## Description +This test verifies the Coresight subsystem's ability to handle simultaneous trace data from: +1. **STM (System Trace Macrocell)**: Software events. +2. **ETM (Embedded Trace Macrocell)**: Instruction trace from all online CPUs. + +It iterates through available sinks (e.g., `tmc_etf0`, `tmc_etr0`) and checks if valid binary data is captured. + +## Dependencies +- **Library**: `Runner/utils/coresight_common.sh` +- **Kernel Config**: `CONFIG_CORESIGHT`, `CONFIG_CORESIGHT_STM`, `CONFIG_CORESIGHT_LINK_AND_SINK_TMC`. + +## Execution +Run the script directly: +```bash +./run.sh +``` + +## Result +A result.res file is generated +```bash +MultiSource_tmc_etf0: Pass +MultiSource_tmc_etr0: Pass +``` \ No newline at end of file diff --git a/Runner/suites/Kernel/DEBUG/MultiSource-STM-ETM/run.sh b/Runner/suites/Kernel/DEBUG/MultiSource-STM-ETM/run.sh new file mode 100644 index 00000000..a1fc608b --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/MultiSource-STM-ETM/run.sh @@ -0,0 +1,152 @@ +#!/bin/sh + +# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. +# SPDX-License-Identifier: BSD-3-Clause + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +INIT_ENV="" +SEARCH="$SCRIPT_DIR" +while [ "$SEARCH" != "/" ]; do + if [ -f "$SEARCH/init_env" ]; then + INIT_ENV="$SEARCH/init_env" + break + fi + SEARCH=$(dirname "$SEARCH") +done + +if [ -z "$INIT_ENV" ]; then + echo "[ERROR] Could not find init_env (starting at $SCRIPT_DIR)" >&2 + exit 1 +fi + +if [ -z "$__INIT_ENV_LOADED" ]; then + # shellcheck disable=SC1090 + . "$INIT_ENV" +fi + +# shellcheck disable=SC1090,SC1091 +. "$TOOLS/functestlib.sh" + +TESTNAME="MultiSource-STM-ETM" +if command -v find_test_case_by_name >/dev/null 2>&1; then + test_path=$(find_test_case_by_name "$TESTNAME") + cd "$test_path" || exit 1 +else + cd "$SCRIPT_DIR" || exit 1 +fi + +res_file="./$TESTNAME.res" +rm -f "$res_file" +touch "$res_file" + +log_info "-----------------------------------------------------------------------------------------" +log_info "-------------------Starting $TESTNAME Testcase----------------------------" +log_info "=== Test Initialization ===" +log_info "Checking if required tools are available" + +CS_BASE="/sys/bus/coresight/devices" +CPU_PATH="/sys/devices/system/cpu/cpu" +CORES=$(grep -c "processor" /proc/cpuinfo) +STM_PATH="$CS_BASE/stm0" +[ ! -d "$STM_PATH" ] && STM_PATH="$CS_BASE/coresight-stm" + +reset_source_sink() { + # shellcheck disable=SC2045 + for dev in $(ls "$CS_BASE"); do + path="$CS_BASE/$dev" + if [ -f "$path/enable_source" ]; then + val=$(cat "$path/enable_source") + if [ "$val" -eq 1 ]; then + echo 0 > "$path/enable_source" + [ -f "$path/reset" ] && echo 1 > "$path/reset" + fi + fi + if [ -f "$path/enable_sink" ]; then + val=$(cat "$path/enable_sink") + [ "$val" -eq 1 ] && echo 0 > "$path/enable_sink" + fi + done +} + +toggle_etm_all() { + state=$1 + count=0 + while [ "$count" -lt "$CORES" ]; do + [ -f "$CPU_PATH$count/online" ] && echo 1 > "$CPU_PATH$count/online" + + if [ -d "$CS_BASE/ete$count" ]; then + etm_path="$CS_BASE/ete$count/enable_source" + elif [ -d "$CS_BASE/coresight-ete$count" ]; then + etm_path="$CS_BASE/coresight-ete$count/enable_source" + elif [ -d "$CS_BASE/etm$count" ]; then + etm_path="$CS_BASE/etm$count/enable_source" + elif [ -d "$CS_BASE/coresight-etm$count" ]; then + etm_path="$CS_BASE/coresight-etm$count/enable_source" + else + count=$((count + 1)) + continue + fi + + [ -f "$etm_path" ] && echo "$state" > "$etm_path" + count=$((count + 1)) + done +} + +reset_source_sink +toggle_etm_all 0 + +# shellcheck disable=SC2010 +SINKS=$(ls "$CS_BASE" | grep "tmc_et" | grep -v "tmc_etf1") + +if [ -z "$SINKS" ]; then + log_fail "No suitable TMC sinks found" + echo "$TESTNAME: FAIL" >> "$res_file" + exit 1 +fi + +for sinkname in $SINKS; do + log_info "Testing Sink: $sinkname" + + reset_source_sink + OUTPUT_BIN="/tmp/$sinkname.bin" + rm -f "$OUTPUT_BIN" + + if [ -f "$CS_BASE/$sinkname/enable_sink" ]; then + echo 1 > "$CS_BASE/$sinkname/enable_sink" + else + log_warn "Sink $sinkname enable file not found" + echo "$TESTNAME: FAIL" >> "$res_file" + continue + fi + + toggle_etm_all 1 + + if [ -f "$STM_PATH/enable_source" ]; then + echo 1 > "$STM_PATH/enable_source" + else + log_warn "STM source not found" + fi + + if [ -c "/dev/$sinkname" ]; then + timeout 2s cat "/dev/$sinkname" > "$OUTPUT_BIN" + fi + + if [ -f "$OUTPUT_BIN" ]; then + bin_size=$(stat -c%s "$OUTPUT_BIN") + if [ "$bin_size" -ge 64 ]; then + log_pass "Captured $bin_size bytes from $sinkname" + echo "$TESTNAME: PASS" >> "$res_file" + else + log_fail "Captured data too small ($bin_size bytes) from $sinkname" + echo "$TESTNAME: FAIL" >> "$res_file" + fi + else + log_fail "No output file generated for $sinkname" + echo "$TESTNAME: FAIL" >> "$res_file" + fi + + toggle_etm_all 0 +done + +reset_source_sink +# log_info "-------------------$TESTNAME Testcase Finished----------------------------" \ No newline at end of file diff --git a/Runner/suites/Kernel/DEBUG/STM-HWE-PORT-SWITCH/README.md b/Runner/suites/Kernel/DEBUG/STM-HWE-PORT-SWITCH/README.md new file mode 100644 index 00000000..5828f597 --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/STM-HWE-PORT-SWITCH/README.md @@ -0,0 +1,22 @@ +# STM-HWE-PORT-SWITCH Test + +## Overview +This test verifies that the **STM (System Trace Macrocell)** attributes `hwevent_enable` and `port_enable` can be successfully toggled (0 and 1) via sysfs, regardless of whether the main STM source (`enable_source`) is currently active or inactive. + +## Execution +1. **Setup**: + * Creates STP policy directories. + * Resets Coresight devices. + * Enables `tmc_etf0` as the sink. +2. **Test Loop (Run for both `hwevent_enable` and `port_enable`)**: + * **Outer Loop**: Toggles STM `enable_source` (0, then 1). + * **Inner Loop**: Toggles the target attribute (0, then 1). + * **Verification**: Reads back the attribute value to ensure it matches the written value. +3. **Teardown**: + * Resets all devices. + * Restores `hwevent_enable` to `0`. + * Restores `port_enable` to `0xffffffff` (all ports enabled). + +## Output +* Console logs detailing the read/write operations. +* `STM-HWEvent-Port-Enable-Disable.res` containing Pass/Fail status for each attribute. \ No newline at end of file diff --git a/Runner/suites/Kernel/DEBUG/STM-HWE-PORT-SWITCH/STM-HWE-PORT-SWITCH.yaml b/Runner/suites/Kernel/DEBUG/STM-HWE-PORT-SWITCH/STM-HWE-PORT-SWITCH.yaml new file mode 100644 index 00000000..14531410 --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/STM-HWE-PORT-SWITCH/STM-HWE-PORT-SWITCH.yaml @@ -0,0 +1,13 @@ +metadata: + name: STM-HWEvent-Port-Enable-Disable + description: "Validates the ability to enable and disable STM Hardware Events and Ports via sysfs." + + os: + - linux + devices: + - qcm6490 + - qcs9100 + scope: + - coresight + - kernel + timeout: 60 \ No newline at end of file diff --git a/Runner/suites/Kernel/DEBUG/STM-HWE-PORT-SWITCH/run.sh b/Runner/suites/Kernel/DEBUG/STM-HWE-PORT-SWITCH/run.sh new file mode 100644 index 00000000..0445f67d --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/STM-HWE-PORT-SWITCH/run.sh @@ -0,0 +1,142 @@ +#!/bin/sh + +# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. +# SPDX-License-Identifier: BSD-3-Clause + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +INIT_ENV="" +SEARCH="$SCRIPT_DIR" +while [ "$SEARCH" != "/" ]; do + if [ -f "$SEARCH/init_env" ]; then + INIT_ENV="$SEARCH/init_env" + break + fi + SEARCH=$(dirname "$SEARCH") +done + +if [ -z "$INIT_ENV" ]; then + echo "[ERROR] Could not find init_env" >&2 + exit 1 +fi + +if [ -z "$__INIT_ENV_LOADED" ]; then + # shellcheck disable=SC1090 + . "$INIT_ENV" +fi + +# shellcheck disable=SC1090,SC1091 +. "$TOOLS/functestlib.sh" + +TESTNAME="STM-HWE-PORT-SWITCH" +if command -v find_test_case_by_name >/dev/null 2>&1; then + test_path=$(find_test_case_by_name "$TESTNAME") + cd "$test_path" || exit 1 +else + cd "$SCRIPT_DIR" || exit 1 +fi + +res_file="./$TESTNAME.res" +rm -f "$res_file" +touch "$res_file" + +log_info "-----------------------------------------------------------------------------------------" +log_info "-------------------Starting $TESTNAME Testcase----------------------------" + +CS_BASE="/sys/bus/coresight/devices" +STM_PATH="$CS_BASE/stm0" +[ ! -d "$STM_PATH" ] && STM_PATH="$CS_BASE/coresight-stm" +ETF_PATH="$CS_BASE/tmc_etf0" +ETR_PATH="$CS_BASE/tmc_etr0" +DEBUGFS="/sys/kernel/debug/tracing" + +reset_source_sink() { + if [ -f "$STM_PATH/enable_source" ]; then + echo 0 > "$STM_PATH/enable_source" + fi + if [ -f "$ETF_PATH/enable_sink" ]; then + echo 0 > "$ETF_PATH/enable_sink" + fi + if [ -f "$ETR_PATH/enable_sink" ]; then + echo 0 > "$ETR_PATH/enable_sink" + fi + if [ -f "$DEBUGFS/tracing_on" ]; then + echo 0 > "$DEBUGFS/tracing_on" + fi +} + +test_attribute() { + attr_name=$1 + attr_path="$STM_PATH/$attr_name" + + log_info "Testing Attribute: $attr_name" + + if [ ! -f "$attr_path" ]; then + log_warn "Attribute $attr_name not found at $STM_PATH" + return 0 + fi + + for stm_state in 0 1; do + echo "$stm_state" > "$STM_PATH/enable_source" + + for val in 0 1; do + echo "$val" > "$attr_path" + readback=$(cat "$attr_path") + + + if [ "$attr_name" = "hwevent_enable" ]; then + if [ "$readback" -eq "$val" ]; then + log_pass "STM_Src:$stm_state | $attr_name set to $val" + else + log_fail "STM_Src:$stm_state | Failed to set $attr_name to $val (Read: $readback)" + echo "$TESTNAME: FAIL" >> "$res_file" + return 1 + fi + elif [ "$attr_name" = "port_enable" ]; then + if [ "$val" -eq 1 ] && [ "$readback" != "0" ] && [ "$readback" != "0x0" ]; then + log_pass "STM_Src:$stm_state | $attr_name set to $val" + elif [ "$val" -eq 0 ] && [ "$readback" = "0" ]; then + log_pass "STM_Src:$stm_state | $attr_name set to $val" + elif [ "$val" -eq 0 ] && [ "$readback" = "0x0" ]; then + log_pass "STM_Src:$stm_state | $attr_name set to $val" + else + log_fail "STM_Src:$stm_state | Failed to set $attr_name to $val (Read: $readback)" + echo "$TESTNAME: FAIL" >> "$res_file" + return 1 + fi + fi + done + done + + echo "$TESTNAME: PASS" >> "$res_file" + return 0 +} + + +if [ ! -d "$STM_PATH" ]; then + log_fail "STM device not found" + echo "$TESTNAME: FAIL" >> "$res_file" + exit 1 +fi + +log_info "Creating Policy Directories..." +mkdir -p /sys/kernel/config/stp-policy/stm0:p_ost.policy/default + +reset_source_sink + +if [ -f "$ETF_PATH/enable_sink" ]; then + echo 1 > "$ETF_PATH/enable_sink" +fi + +test_attribute "hwevent_enable" +test_attribute "port_enable" + +reset_source_sink + +if [ -f "$STM_PATH/hwevent_enable" ]; then + echo 0 > "$STM_PATH/hwevent_enable" +fi +if [ -f "$STM_PATH/port_enable" ]; then + echo 0xffffffff > "$STM_PATH/port_enable" +fi + +# log_info "-------------------$TESTNAME Testcase Finished----------------------------" \ No newline at end of file diff --git a/Runner/suites/Kernel/DEBUG/STM-Source-Enable-Disable/README.md b/Runner/suites/Kernel/DEBUG/STM-Source-Enable-Disable/README.md new file mode 100644 index 00000000..f0d173b7 --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/STM-Source-Enable-Disable/README.md @@ -0,0 +1,20 @@ +# STM Source Enable/Disable Stress Test + +## Overview +This test validates the stability of the **STM (System Trace Macrocell)** driver by repeatedly enabling and disabling the source in a loop. + +## Execution +1. **Setup**: + * Creates STP policy directories. + * Resets all Coresight source/sink devices. + * Disables hardware events and clears global tracing events. +2. **Loop (50 Iterations)**: + * Resets source/sink. + * Enables `tmc_etf` sink. + * Enables `stm` source $\to$ Checks if `enable_source` is `1`. + * Disables `stm` source $\to$ Checks if `enable_source` is `0`. +3. **Teardown**: Resets devices. + +## Output +* Console logs indicating iteration failures (if any). +* `STM-Source-Enable-Disable.res` containing Pass/Fail status. \ No newline at end of file diff --git a/Runner/suites/Kernel/DEBUG/STM-Source-Enable-Disable/STM-Source-Enable-Disable.yaml b/Runner/suites/Kernel/DEBUG/STM-Source-Enable-Disable/STM-Source-Enable-Disable.yaml new file mode 100644 index 00000000..6352587c --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/STM-Source-Enable-Disable/STM-Source-Enable-Disable.yaml @@ -0,0 +1,13 @@ +metadata: + name: STM-Source-Enable-Disable + description: "Stress test that toggles the STM source enablement 50 times to ensure stability." + + os: + - linux + devices: + - qcm6490 + - qcs9100 + scope: + - coresight + - kernel + timeout: 300 \ No newline at end of file diff --git a/Runner/suites/Kernel/DEBUG/STM-Source-Enable-Disable/run.sh b/Runner/suites/Kernel/DEBUG/STM-Source-Enable-Disable/run.sh new file mode 100644 index 00000000..a48397ca --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/STM-Source-Enable-Disable/run.sh @@ -0,0 +1,126 @@ +#!/bin/sh + +# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. +# SPDX-License-Identifier: BSD-3-Clause + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +INIT_ENV="" +SEARCH="$SCRIPT_DIR" +while [ "$SEARCH" != "/" ]; do + if [ -f "$SEARCH/init_env" ]; then + INIT_ENV="$SEARCH/init_env" + break + fi + SEARCH=$(dirname "$SEARCH") +done + +if [ -z "$INIT_ENV" ]; then + echo "[ERROR] Could not find init_env" >&2 + exit 1 +fi + +if [ -z "$__INIT_ENV_LOADED" ]; then + # shellcheck disable=SC1090 + . "$INIT_ENV" +fi + +# shellcheck disable=SC1090,SC1091 +. "$TOOLS/functestlib.sh" + +TESTNAME="STM-Source-Enable-Disable" +if command -v find_test_case_by_name >/dev/null 2>&1; then + test_path=$(find_test_case_by_name "$TESTNAME") + cd "$test_path" || exit 1 +else + cd "$SCRIPT_DIR" || exit 1 +fi + +res_file="./$TESTNAME.res" +rm -f "$res_file" +touch "$res_file" + +log_info "-----------------------------------------------------------------------------------------" +log_info "-------------------Starting $TESTNAME Testcase----------------------------" + +CS_BASE="/sys/bus/coresight/devices" +STM_PATH="$CS_BASE/stm0" +[ ! -d "$STM_PATH" ] && STM_PATH="$CS_BASE/coresight-stm" +ETF_PATH="$CS_BASE/tmc_etf0" +DEBUGFS="/sys/kernel/debug/tracing" +FAIL_COUNT=0 + +reset_source_sink() { + for dev in $(ls "$CS_BASE"); do + path="$CS_BASE/$dev" + if [ -f "$path/enable_source" ]; then + val=$(cat "$path/enable_source") + if [ "$val" -eq 1 ]; then + echo 0 > "$path/enable_source" + [ -f "$path/reset" ] && echo 1 > "$path/reset" + fi + fi + if [ -f "$path/enable_sink" ]; then + val=$(cat "$path/enable_sink") + [ "$val" -eq 1 ] && echo 0 > "$path/enable_sink" + fi + done +} + + +if [ ! -d "$STM_PATH" ]; then + log_fail "STM device not found" + echo "$TESTNAME: FAIL" >> "$res_file" + exit 1 +fi + +log_info "Setting up STP policy..." +mkdir -p /sys/kernel/config/stp-policy/stm0:p_ost.policy/default + +log_info "Initial cleanup..." +reset_source_sink + +if [ -f "$STM_PATH/hwevent_enable" ]; then + echo 0 > "$STM_PATH/hwevent_enable" +fi +if [ -f "$STM_PATH/port_enable" ]; then + echo 0xffffffff > "$STM_PATH/port_enable" +fi +echo 0 > "$DEBUGFS/events/enable" + +log_info "Starting 50 iteration loop..." + +for i in $(seq 1 50); do + reset_source_sink + + if [ -f "$ETF_PATH/enable_sink" ]; then + echo 1 > "$ETF_PATH/enable_sink" + fi + + echo 1 > "$STM_PATH/enable_source" + val=$(cat "$STM_PATH/enable_source") + + if [ "$val" -ne 1 ]; then + log_fail "Iteration $i: Failed to enable STM source" + FAIL_COUNT=$((FAIL_COUNT + 1)) + fi + + echo 0 > "$STM_PATH/enable_source" + val=$(cat "$STM_PATH/enable_source") + + if [ "$val" -ne 0 ]; then + log_fail "Iteration $i: Failed to disable STM source" + FAIL_COUNT=$((FAIL_COUNT + 1)) + fi +done + +reset_source_sink + +if [ "$FAIL_COUNT" -eq 0 ]; then + log_pass "STM source enable/disable loop passed (50 iterations)" + echo "$TESTNAME: PASS" >> "$res_file" +else + log_fail "STM source enable/disable loop failed ($FAIL_COUNT failures)" + echo "$TESTNAME: FAIL" >> "$res_file" +fi + +# log_info "-------------------$TESTNAME Testcase Finished----------------------------" \ No newline at end of file diff --git a/Runner/suites/Kernel/DEBUG/Sink-Status-STM-Toggle/README.md b/Runner/suites/Kernel/DEBUG/Sink-Status-STM-Toggle/README.md new file mode 100644 index 00000000..ad1cd7f8 --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/Sink-Status-STM-Toggle/README.md @@ -0,0 +1,28 @@ +# Coresight Sink Status Test (STM Toggle) + +## Overview +This test verifies the dependency behavior between Coresight Sources (STM, ETM) and Sinks (TMC-ETF, TMC-ETR). It ensures that sinks open and close correctly based on the activity of connected sources. + +## Execution + +The test performs two phases of validation for every available sink (`tmc_etf0`, `tmc_etr0`, etc., excluding `tmc_etf1`). + +### Phase 1: Single Source (STM Only) +1. **Setup**: Reset devices. +2. **Enable**: Enable Sink $\to$ Enable STM Source. + * *Verification*: Check if Sink `enable_sink` is `1`. +3. **Disable**: Disable STM Source. + * *Verification*: Check if Sink `enable_sink` drops to `0` (Release resource). + +### Phase 2: Multi-Source (STM + ETM) +*Note: This phase runs only if an ETM device is detected.* +1. **Setup**: Reset devices. +2. **Enable**: Enable Sink $\to$ Enable STM Source $\to$ Enable ETM Source. + * *Verification*: Check if Sink `enable_sink` is `1`. +3. **Partial Disable**: Disable **only** STM Source. + * *Verification*: Check if Sink `enable_sink` remains `1` (ETM should keep the sink active). +4. **Cleanup**: Reset devices. + +## Output +* Console logs for each sink and phase transition. +* `Sink-Status-STM-Toggle.res` containing the final Pass/Fail status. \ No newline at end of file diff --git a/Runner/suites/Kernel/DEBUG/Sink-Status-STM-Toggle/Sink-Status-STM-Toggle.yaml b/Runner/suites/Kernel/DEBUG/Sink-Status-STM-Toggle/Sink-Status-STM-Toggle.yaml new file mode 100644 index 00000000..dc63d61e --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/Sink-Status-STM-Toggle/Sink-Status-STM-Toggle.yaml @@ -0,0 +1,13 @@ +metadata: + name: Sink-Status-STM-Toggle + description: "Verifies that Coresight sinks maintain correct enabled/disabled states when sources (STM/ETM) are toggled." + + os: + - linux + devices: + - qcm6490 + - qcs9100 + scope: + - coresight + - kernel + timeout: 60 \ No newline at end of file diff --git a/Runner/suites/Kernel/DEBUG/Sink-Status-STM-Toggle/run.sh b/Runner/suites/Kernel/DEBUG/Sink-Status-STM-Toggle/run.sh new file mode 100644 index 00000000..7a57985a --- /dev/null +++ b/Runner/suites/Kernel/DEBUG/Sink-Status-STM-Toggle/run.sh @@ -0,0 +1,174 @@ +#!/bin/sh + +# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. +# SPDX-License-Identifier: BSD-3-Clause + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +INIT_ENV="" +SEARCH="$SCRIPT_DIR" +while [ "$SEARCH" != "/" ]; do + if [ -f "$SEARCH/init_env" ]; then + INIT_ENV="$SEARCH/init_env" + break + fi + SEARCH=$(dirname "$SEARCH") +done + +if [ -z "$INIT_ENV" ]; then + echo "[ERROR] Could not find init_env" >&2 + exit 1 +fi + +if [ -z "$__INIT_ENV_LOADED" ]; then + # shellcheck disable=SC1090 + . "$INIT_ENV" +fi + +# shellcheck disable=SC1090,SC1091 +. "$TOOLS/functestlib.sh" + +TESTNAME="Sink-Status-STM-Toggle" +if command -v find_test_case_by_name >/dev/null 2>&1; then + test_path=$(find_test_case_by_name "$TESTNAME") + cd "$test_path" || exit 1 +else + cd "$SCRIPT_DIR" || exit 1 +fi + +res_file="./$TESTNAME.res" +rm -f "$res_file" +touch "$res_file" + +log_info "-----------------------------------------------------------------------------------------" +log_info "-------------------Starting $TESTNAME Testcase----------------------------" + +CS_BASE="/sys/bus/coresight/devices" +STM_PATH="$CS_BASE/stm0" +[ ! -d "$STM_PATH" ] && STM_PATH="$CS_BASE/coresight-stm" + +ETM_PATH="$CS_BASE/etm0" +[ ! -d "$ETM_PATH" ] && ETM_PATH="$CS_BASE/coresight-etm0" +[ ! -d "$ETM_PATH" ] && ETM_PATH="$CS_BASE/coresight-etm4x" + +FAIL_COUNT=0 + + +reset_devices() { + if [ -f "$CS_BASE/reset_source_sink" ]; then + echo 1 > "$CS_BASE/reset_source_sink" + else + [ -d "$STM_PATH" ] && echo 0 > "$STM_PATH/enable_source" 2>/dev/null + [ -d "$ETM_PATH" ] && echo 0 > "$ETM_PATH/enable_source" 2>/dev/null + + for sink in "$CS_BASE"/tmc_et*; do + [ -f "$sink/enable_sink" ] && echo 0 > "$sink/enable_sink" 2>/dev/null + done + fi +} + +check_sink_status() { + sink=$1 + expected=$2 + stage=$3 + + val=$(cat "$sink/enable_sink") + if [ "$val" -ne "$expected" ]; then + log_fail "$stage: $sink status is $val (Expected: $expected)" + return 1 + else + log_pass "$stage: $sink status is $val" + return 0 + fi +} + + +if [ ! -d "$STM_PATH" ]; then + log_fail "STM device not found" + echo "STM_Init: Fail" >> "$res_file" + exit 1 +fi + +SINK_LIST=$(ls -d "$CS_BASE"/tmc_et* 2>/dev/null | grep -v tmc_etf1) + +if [ -z "$SINK_LIST" ]; then + log_fail "No suitable sinks found" + echo "Sink_Discovery: Fail" >> "$res_file" + exit 1 +fi + +if [ -f "$CS_BASE/tmc_etr0/out_mode" ]; then + echo mem > "$CS_BASE/tmc_etr0/out_mode" +fi + +log_info "=== Phase 1: STM Only Test ===" + +for sink in $SINK_LIST; do + log_info "Testing Sink: $(basename "$sink")" + + reset_devices + echo 1 > "$sink/enable_sink" + echo 1 > "$STM_PATH/enable_source" + sleep 1 + + if ! check_sink_status "$sink" 1 "Phase1_STM_Enable"; then + FAIL_COUNT=$((FAIL_COUNT + 1)) + fi + + echo 0 > "$STM_PATH/enable_source" + + if ! check_sink_status "$sink" 0 "Phase1_STM_Disable"; then + FAIL_COUNT=$((FAIL_COUNT + 1)) + fi +done + +log_info "=== Phase 2: STM + ETM Test ===" + +HAS_ETM=0 +if [ -d "$ETM_PATH" ]; then + if [ -f /proc/config.gz ]; then + if zcat /proc/config.gz | grep -q "CONFIG_CORESIGHT_SOURCE_ETM4X=y"; then + HAS_ETM=1 + fi + else + HAS_ETM=1 + fi +fi + +if [ "$HAS_ETM" -eq 1 ]; then + for sink in $SINK_LIST; do + log_info "Testing Sink (Multi-Source): $(basename "$sink")" + + reset_devices + echo 1 > "$sink/enable_sink" + + echo 1 > "$STM_PATH/enable_source" + echo 1 > "$ETM_PATH/enable_source" + sleep 1 + + if ! check_sink_status "$sink" 1 "Phase2_Both_Enable"; then + FAIL_COUNT=$((FAIL_COUNT + 1)) + fi + + echo 0 > "$STM_PATH/enable_source" + + if ! check_sink_status "$sink" 1 "Phase2_STM_Disable_ETM_Active"; then + FAIL_COUNT=$((FAIL_COUNT + 1)) + fi + + reset_devices + done +else + log_info "Skipping Phase 2 (ETM not found or not enabled)" +fi + +reset_devices + +if [ "$FAIL_COUNT" -eq 0 ]; then + log_pass "Sink status check passed across all phases" + echo "${TESTNAME}: Pass" >> "$res_file" +else + log_fail "Sink status check failed ($FAIL_COUNT errors)" + echo "${TESTNAME}: Fail" >> "$res_file" +fi + +# log_info "-------------------$TESTNAME Testcase Finished----------------------------" \ No newline at end of file