Skip to content

Modularized adsp, cdsp, and wpss remoteproc tests using common helper functions #98

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 25 additions & 43 deletions Runner/suites/Kernel/FunctionalArea/baseport/adsp_remoteproc/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ while [ "$SEARCH" != "/" ]; do
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

# Only source if not already loaded (idempotent)
if [ -z "$__INIT_ENV_LOADED" ]; then
# shellcheck disable=SC1090
Expand All @@ -30,61 +30,43 @@ fi
. "$TOOLS/functestlib.sh"

TESTNAME="adsp_remoteproc"
res_file="./$TESTNAME.res"
test_path=$(find_test_case_by_name "$TESTNAME")
cd "$test_path" || exit 1
# shellcheck disable=SC2034
res_file="./$TESTNAME.res"

log_info "-----------------------------------------------------------------------------------------"
log_info "-------------------Starting $TESTNAME Testcase----------------------------"
log_info "=== Test Initialization ==="
log_info "Get the firmware output and find the position of adsp"

# Get the firmware output and find the position of adsp
log_info "Checking for firmware"
firmware_output=$(cat /sys/class/remoteproc/remoteproc*/firmware)
adsp_position=$(echo "$firmware_output" | grep -n "adsp" | cut -d: -f1)

# Adjust the position to match the remoteproc numbering (starting from 0)
remoteproc_number=$((adsp_position - 1))

# Construct the remoteproc path based on the adsp position
remoteproc_path="/sys/class/remoteproc/remoteproc${remoteproc_number}"
log_info "Remoteproc node is $remoteproc_path"
# Execute command 1 and check if the output is "running"
state1=$(cat ${remoteproc_path}/state)

if [ "$state1" != "running" ]; then
log_fail "$TESTNAME : Test Failed"
echo "$TESTNAME FAIL" > "$test_path/$TESTNAME.res"
rproc_path=$(get_remoteproc_path_by_firmware "adsp") || {
log_fail "$TESTNAME" "adsp remoteproc path not found"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It’s better to mark this as info and skip the test, rather than fail it. Since the node isn’t present, further validation isn’t needed. If any additional steps fail, then it would make sense to mark it as a failure.

echo "$TESTNAME FAIL" > "$res_file"
exit 1
fi
}
log_info "Found adsp remoteproc: $rproc_path"

# Execute command 2 (no output expected)
log_info "Stopping remoteproc"
echo stop > ${remoteproc_path}/state
state=$(get_remoteproc_state "$rproc_path")
[ "$state" = "running" ] || {
log_fail "$TESTNAME" "adsp remoteproc not running"
echo "$TESTNAME FAIL" > "$res_file"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you think about adding logs or checks to confirm if the firmware loads when a particular subsystem isn’t running? This could help with debugging in CI.

exit 1
}

# Execute command 3 and check if the output is "offline"
state3=$(cat ${remoteproc_path}/state)
if [ "$state3" != "offline" ]; then
log_fail "adsp stop failed"
echo "$TESTNAME FAIL" > "$test_path/$TESTNAME.res"
stop_remoteproc "$rproc_path" || {
log_fail "$TESTNAME" "adsp remoteproc stop failed"
echo "$TESTNAME FAIL" > "$res_file"
exit 1
else
log_pass "adsp stop successful"
fi
log_info "Restarting remoteproc"
# Execute command 4 (no output expected)
echo start > ${remoteproc_path}/state
}
log_pass "adsp stop successful"

# Execute command 5 and check if the output is "running"
state5=$(cat ${remoteproc_path}/state)
if [ "$state5" != "running" ]; then
log_fail "adsp start failed"
echo "$TESTNAME FAIL" > "$res_file"
log_info "Restarting remoteproc"
start_remoteproc "$rproc_path" || {
log_fail "$TESTNAME" "adsp remoteproc start failed"
echo "$TESTNAME FAIL" > "$res_file"
exit 1
fi
}

# If all checks pass, print "PASS"
echo "adsp PASS"
log_pass "adsp PASS"
echo "$TESTNAME PASS" > "$res_file"
Expand Down
60 changes: 22 additions & 38 deletions Runner/suites/Kernel/FunctionalArea/baseport/cdsp_remoteproc/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -30,61 +30,45 @@ fi
. "$TOOLS/functestlib.sh"

TESTNAME="cdsp_remoteproc"
res_file="./$TESTNAME.res"
test_path=$(find_test_case_by_name "$TESTNAME")
cd "$test_path" || exit 1
# shellcheck disable=SC2034
res_file="./$TESTNAME.res"

log_info "-----------------------------------------------------------------------------------------"
log_info "-------------------Starting $TESTNAME Testcase----------------------------"
log_info "=== Test Initialization ==="

# Get the firmware output and find the position of cdsp
log_info "Get the firmware output and find the position of cdsp"
firmware_output=$(cat /sys/class/remoteproc/remoteproc*/firmware)
cdsp_position=$(echo "$firmware_output" | grep -n "cdsp" | cut -d: -f1)

# Adjust the position to match the remoteproc numbering (starting from 0)
remoteproc_number=$((cdsp_position - 1))

# Construct the remoteproc path based on the cdsp position
remoteproc_path="/sys/class/remoteproc/remoteproc${remoteproc_number}"

# Execute command 1 and check if the output is "running"
state1=$(cat ${remoteproc_path}/state)
if [ "$state1" != "running" ]; then
log_fail "$TESTNAME : Test Failed"
echo "$TESTNAME FAIL" > $test_path/$TESTNAME.res
rproc_path=$(get_remoteproc_path_by_firmware "cdsp") || {
log_fail "$TESTNAME" "cdsp remoteproc path not found"
echo "$TESTNAME FAIL" > "$res_file"
exit 1
fi
}
log_info "Found cdsp remoteproc: $rproc_path"

# Execute command 2 (no output expected)
echo stop > ${remoteproc_path}/state
state=$(get_remoteproc_state "$rproc_path")
[ "$state" = "running" ] || {
log_fail "$TESTNAME" "cdsp remoteproc not running"
echo "$TESTNAME FAIL" > "$res_file"
exit 1
}

# Execute command 3 and check if the output is "offline"
state3=$(cat ${remoteproc_path}/state)
if [ "$state3" != "offline" ]; then
log_fail "cdsp stop failed"
echo "$TESTNAME FAIL" > $test_path/$TESTNAME.res
stop_remoteproc "$rproc_path" || {
log_fail "$TESTNAME" "cdsp remoteproc stop failed"
echo "$TESTNAME FAIL" > "$res_file"
exit 1
else
log_pass "cdsp stop successful"
fi
log_info "Restarting remoteproc"
# Execute command 4 (no output expected)
echo start > ${remoteproc_path}/state
}
log_pass "cdsp stop successful"

# Execute command 5 and check if the output is "running"
state5=$(cat ${remoteproc_path}/state)
if [ "$state5" != "running" ]; then
log_fail "cdsp start failed"
log_info "Restarting remoteproc"
start_remoteproc "$rproc_path" || {
log_fail "$TESTNAME" "cdsp remoteproc start failed"
echo "$TESTNAME FAIL" > "$res_file"
exit 1
fi
}

# If all checks pass, print "PASS"
echo "cdsp PASS"
log_pass "cdsp PASS"
echo "$TESTNAME PASS" > "$res_file"
echo "$TESTNAME PASS" > "$res_file"
log_info "-------------------Completed $TESTNAME Testcase----------------------------"
exit 0
89 changes: 33 additions & 56 deletions Runner/suites/Kernel/FunctionalArea/baseport/wpss_remoteproc/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ while [ "$SEARCH" != "/" ]; do
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

# Only source if not already loaded (idempotent)
if [ -z "$__INIT_ENV_LOADED" ]; then
# shellcheck disable=SC1090
Expand All @@ -29,70 +29,47 @@ fi
# shellcheck disable=SC1090,SC1091
. "$TOOLS/functestlib.sh"


TESTNAME="wpss_remoteproc"
res_file="./$TESTNAME.res"
test_path=$(find_test_case_by_name "$TESTNAME")
cd "$test_path" || exit 1
# shellcheck disable=SC2034
res_file="./$TESTNAME.res"

log_info "-----------------------------------------------------------------------------------------"
log_info "-------------------Starting $TESTNAME Testcase----------------------------"
log_info "=== Test Initialization ==="
log_info "Get the firmware output and find the position of wpss"

log_info "=== Detecting and validating WPSS remoteproc instance ==="

log_info "Looking for remoteproc device exposing WPSS..."
wpss_path=""
for node in /sys/class/remoteproc/remoteproc*; do
[ -f "$node/name" ] || continue
name=$(cat "$node/name" 2>/dev/null | tr '[:upper:]' '[:lower:]')
if echo "$name" | grep -qi "wpss"; then
wpss_path="$node"
break
fi
done

if [ -z "$wpss_path" ]; then
log_skip "WPSS remoteproc node not found"
rproc_path=$(get_remoteproc_path_by_firmware "wpss") || {
log_skip "wpss remoteproc path not found"
echo "$TESTNAME SKIP" > "$res_file"
exit 0
fi

log_info "Found WPSS remoteproc node at: $wpss_path"
firmware=$(cat "$wpss_path/firmware" 2>/dev/null)
log_info "WPSS firmware: $firmware"

# Capture state before any change
orig_state=$(cat "$wpss_path/state" 2>/dev/null)
log_info "Original state: $orig_state"

log_info "Attempting to stop WPSS..."
if echo stop > "$wpss_path/state" 2>/dev/null; then
sleep 1
new_state=$(cat "$wpss_path/state" 2>/dev/null)
if [ "$new_state" != "offline" ]; then
log_warn "Expected offline state after stop, got: $new_state"
fi
else
log_warn "Could not stop WPSS; may already be offline"
fi

log_info "Attempting to start WPSS..."
if echo start > "$wpss_path/state" 2>/dev/null; then
sleep 1
final_state=$(cat "$wpss_path/state" 2>/dev/null)
if [ "$final_state" = "running" ]; then
log_pass "WPSS remoteproc started successfully"
echo "$TESTNAME PASS" > "$res_file"
exit 0
else
log_fail "WPSS remoteproc failed to start, state: $final_state"
echo "$TESTNAME FAIL" > "$res_file"
exit 1
fi
else
log_fail "Failed to write 'start' to $wpss_path/state"
}
log_info "Found wpss remoteproc: $rproc_path"

state=$(get_remoteproc_state "$rproc_path")
[ "$state" = "running" ] || {
log_fail "$TESTNAME" "wpss remoteproc not running"
echo "$TESTNAME FAIL" > "$res_file"
exit 1
fi
}

stop_remoteproc "$rproc_path" || {
log_fail "$TESTNAME" "wpss remoteproc stop failed"
echo "$TESTNAME FAIL" > "$res_file"
exit 1
}
log_pass "wpss stop successful"

log_info "Restarting remoteproc"
start_remoteproc "$rproc_path" || {
log_fail "$TESTNAME" "wpss remoteproc start failed"
echo "$TESTNAME FAIL" > "$res_file"
exit 1
}

echo "wpss PASS"
log_pass "wpss PASS"
echo "$TESTNAME PASS" > "$res_file"
log_info "-------------------Completed $TESTNAME Testcase----------------------------"
exit 0
48 changes: 48 additions & 0 deletions Runner/utils/functestlib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -391,3 +391,51 @@ weston_start() {
fi
}

# Find the remoteproc path for a given firmware substring (e.g., "adsp", "cdsp", "gdsp").
get_remoteproc_path_by_firmware() {
name="$1"
local idx path
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Replace local with unscoped variable.

# List all remoteproc firmware nodes, match name, and return the remoteproc path
idx=$(cat /sys/class/remoteproc/remoteproc*/firmware 2>/dev/null | grep -n "$name" | cut -d: -f1 | head -n1)
[ -z "$idx" ] && return 1
idx=$((idx - 1))
path="/sys/class/remoteproc/remoteproc${idx}"
[ -d "$path" ] && echo "$path" && return 0
return 1
}

# Get current remoteproc state
get_remoteproc_state() {
rproc_path="$1"
[ -f "$rproc_path/state" ] && cat "$rproc_path/state"
}

# Wait until remoteproc reaches a given state (with retries)
wait_remoteproc_state() {
rproc_path="$1"
target="$2"
retries="${3:-6}"
i=0
while [ $i -lt "$retries" ]; do
state=$(get_remoteproc_state "$rproc_path")
[ "$state" = "$target" ] && return 0
sleep 1
i=$((i+1))
done
return 1
}

# Stop remoteproc (wait for "offline")
stop_remoteproc() {
rproc_path="$1"
echo stop > "$rproc_path/state"
wait_remoteproc_state "$rproc_path" "offline" 6
}

# Start remoteproc (wait for "running")
start_remoteproc() {
rproc_path="$1"
echo start > "$rproc_path/state"
wait_remoteproc_state "$rproc_path" "running" 6
}

Loading