From: Petr Oros <poros@redhat.com>
To: netdev@vger.kernel.org
Cc: Petr Oros <poros@redhat.com>, Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <skhan@linuxfoundation.org>,
Shuah Khan <shuah@kernel.org>,
Randy Dunlap <rdunlap@infradead.org>,
Jani Nikula <jani.nikula@intel.com>,
Vadim Fedorenko <vadim.fedorenko@linux.dev>,
Arkadiusz Kubalewski <arkadiusz.kubalewski@intel.com>,
Jiri Pirko <jiri@resnulli.us>, Ivan Vecera <ivecera@redhat.com>,
Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@kernel.org>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org
Subject: [PATCH net-next v2 08/14] selftests: dpll: add pin priority test
Date: Thu, 5 Nov 2026 16:18:46 +0100 [thread overview]
Message-ID: <20261105151852.1844305-9-poros@redhat.com> (raw)
In-Reply-To: <20261105151852.1844305-1-poros@redhat.com>
Add a test that sets a new priority on an input pin, reads it back and
restores the original value. The range of priorities a device accepts is
not advertised over netlink, so the test tries one below the current
value and then the small values every driver accepts, since a large
current value may mark an unused pin outside the settable range, as the
ice driver does with 255. A driver may still refuse all of them for a
constraint the interface does not tell, so that is a skip on a device
provided by the user, with the reason the tool reported, and a failure
on the device the script created, whose simulator accepts every
priority. The test skips when the dpll tool lacks the prio keyword of
pin set, and the restore is deferred right after the original value is
read so that an interrupted run restores it too. A pin that does not
advertise the priority-can-change capability or does not report a
priority is a skip on a device provided by the user and a failure on the
device the script created, whose pins have both.
The dpllsim_add_pin helper gains an optional priority argument, which is
written only when it is given, so that a pin without one keeps the
default of the simulator. A priority is accepted for input pins only,
so the callers pass one for those alone.
The standard device lays its inputs out as gnss0 with priority 0 and
ext0 with priority 1, and the stress devices get random priorities on
their input pins.
Signed-off-by: Petr Oros <poros@redhat.com>
---
.../drivers/net/dpll/dpll_features.sh | 65 +++++++++++++++++++
.../selftests/drivers/net/dpll/dpll_stress.sh | 15 +++--
.../selftests/drivers/net/lib/sh/dpll_lib.sh | 32 +++++++--
3 files changed, 100 insertions(+), 12 deletions(-)
diff --git a/tools/testing/selftests/drivers/net/dpll/dpll_features.sh b/tools/testing/selftests/drivers/net/dpll/dpll_features.sh
index c73417a058e0a0..61003ba280d658 100755
--- a/tools/testing/selftests/drivers/net/dpll/dpll_features.sh
+++ b/tools/testing/selftests/drivers/net/dpll/dpll_features.sh
@@ -16,11 +16,76 @@ source "$SCRIPTDIR/../lib/sh/dpll_lib.sh"
ALL_TESTS="
test_pin_state_transitions
+ test_pin_priority_get_set
"
##############################################################################
# Pin-level feature tests
+test_pin_priority_get_set()
+{
+ local before target after reason candidate
+
+ RET=0
+
+ if [ -z "$PIN_TUNE_ID" ]; then
+ dpll_log_test_skip_or_fail "DPLL pin priority set/get" \
+ "no spare input pin"
+ return
+ fi
+ if ! dpll_pin_set_supports prio; then
+ log_test_skip "DPLL pin priority set/get" \
+ "dpll tool lacks pin set prio"
+ return
+ fi
+ if ! dpll_pin_has_capability "$PIN_TUNE_ID" priority-can-change; then
+ dpll_log_test_skip_or_fail "DPLL pin priority set/get" \
+ "priority cannot change"
+ return
+ fi
+
+ before=$(dpll_pin_get_prio "$DPLL_DEV_ID" "$PIN_TUNE_ID")
+ if [ -z "$before" ]; then
+ dpll_log_test_skip_or_fail "DPLL pin priority set/get" \
+ "prio not reported"
+ return
+ fi
+ defer dpll_pin_set_prio "$DPLL_DEV_ID" "$PIN_TUNE_ID" "$before"
+
+ # The accepted range is not advertised, so try one below the current
+ # value and then small values, a refusal of all of them is a skip on
+ # a device the user provided, the simulator accepts every priority.
+ target=""
+ for candidate in $((before - 1)) 1 7; do
+ [ "$candidate" -ge 0 ] && [ "$candidate" != "$before" ] ||
+ continue
+ if dpll_pin_set_prio "$DPLL_DEV_ID" "$PIN_TUNE_ID" \
+ "$candidate"; then
+ target=$candidate
+ break
+ fi
+ reason=${DPLL_LAST_ERR%%$'\n'*}
+ done
+ if [ -z "$target" ]; then
+ dpll_log_test_skip_or_fail "DPLL pin priority set/get" \
+ "cannot set a new prio${reason:+, $reason}"
+ return
+ fi
+ after=$(dpll_pin_get_prio "$DPLL_DEV_ID" "$PIN_TUNE_ID")
+ if [ "$after" != "$target" ]; then
+ check_err 1 "priority expected $target, got '$after'"
+ fi
+
+ dpll_pin_set_prio "$DPLL_DEV_ID" "$PIN_TUNE_ID" "$before"
+ check_err $? "cannot restore pin priority"
+ after=$(dpll_pin_get_prio "$DPLL_DEV_ID" "$PIN_TUNE_ID")
+ if [ "$after" != "$before" ]; then
+ check_err 1 "priority not restored, got '$after'"
+ fi
+
+ log_test "DPLL pin priority set/get"
+}
+
test_pin_state_transitions()
{
local before state after reason
diff --git a/tools/testing/selftests/drivers/net/dpll/dpll_stress.sh b/tools/testing/selftests/drivers/net/dpll/dpll_stress.sh
index ee543e2cd8703c..60e42107c67efe 100755
--- a/tools/testing/selftests/drivers/net/dpll/dpll_stress.sh
+++ b/tools/testing/selftests/drivers/net/dpll/dpll_stress.sh
@@ -77,13 +77,13 @@ create_stress_device()
local clock_id=$1
local num_pins=$2
local name="st$clock_id"
- local i type freq dir
+ local i type freq dir prio
local dirs=(input output)
dpllsim_create_device "$name" "$clock_id" || return 1
# Always have at least one plain input pin, then random ones
- if ! dpllsim_add_pin "$name" ext0 ext 10000000 input; then
+ if ! dpllsim_add_pin "$name" ext0 ext 10000000 input 1; then
dpllsim_delete_device "$name"
return 1
fi
@@ -94,8 +94,11 @@ create_stress_device()
# output one
dir=${dirs[RANDOM % 2]}
[ "$type" = mux ] && dir=input
- if ! dpllsim_add_pin "$name" "pin$i" "$type" "$freq" \
- "$dir"; then
+ # Only input pins accept a priority
+ prio=""
+ [ "$dir" = input ] && prio=$((RANDOM % 128))
+ if ! dpllsim_add_pin "$name" "pin$i" "$type" "$freq" "$dir" \
+ "$prio"; then
dpllsim_delete_device "$name"
return 1
fi
@@ -205,8 +208,8 @@ test_deploy_cycle()
fi
track_device "$name"
- if ! dpllsim_add_pin "$name" gnss0 gnss 1 input ||
- ! dpllsim_add_pin "$name" ext0 ext 10000000 input ||
+ if ! dpllsim_add_pin "$name" gnss0 gnss 1 input 0 ||
+ ! dpllsim_add_pin "$name" ext0 ext 10000000 input 1 ||
! dpllsim_add_pin "$name" out0 ext 10000000 output; then
check_err 1 "cannot add pins"
log_test "DPLL deploy/undeploy cycling"
diff --git a/tools/testing/selftests/drivers/net/lib/sh/dpll_lib.sh b/tools/testing/selftests/drivers/net/lib/sh/dpll_lib.sh
index ee91ad1722971d..1c3e27eb09775d 100644
--- a/tools/testing/selftests/drivers/net/lib/sh/dpll_lib.sh
+++ b/tools/testing/selftests/drivers/net/lib/sh/dpll_lib.sh
@@ -376,6 +376,11 @@ dpll_pin_has_capability()
<<< "$out" &> /dev/null
}
+dpll_pin_get_prio()
+{
+ __dpll_pin_dev_field "$1" "$2" '.prio'
+}
+
##############################################################################
# Pin setters
#
@@ -397,6 +402,16 @@ dpll_pin_set_state()
state "$state" 2>&1 >/dev/null)
}
+dpll_pin_set_prio()
+{
+ local dev_id=$1
+ local pin_id=$2
+ local prio=$3
+
+ DPLL_LAST_ERR=$(dpll pin set id "$pin_id" parent-device "$dev_id" \
+ prio "$prio" 2>&1 >/dev/null)
+}
+
##############################################################################
# dpllsim configfs interface
#
@@ -478,7 +493,9 @@ dpllsim_create_device()
# $1: device name, $2: pin name (becomes the board-label), $3: type (gnss,
# int-oscillator, ext, synce-eth-port, mux), $4: frequency in Hz,
-# $5: direction (input/output)
+# $5: direction (input/output), $6: prio (optional, input pins only).
+# The priority is written only when one is given, so a pin without one
+# keeps the default of the simulator.
dpllsim_add_pin()
{
local dev=$1
@@ -486,13 +503,16 @@ dpllsim_add_pin()
local type=$3
local frequency=$4
local direction=$5
+ local prio=${6:-}
local pin_path="$DPLLSIM_CFG/$dev/pins/$pin"
mkdir "$pin_path" 2>/dev/null || return 1
if ! echo "$type" 2>/dev/null > "$pin_path/type" ||
! echo "$frequency" 2>/dev/null > "$pin_path/frequency" ||
- ! echo "$direction" 2>/dev/null > "$pin_path/direction"; then
+ ! echo "$direction" 2>/dev/null > "$pin_path/direction" ||
+ { [ -n "$prio" ] &&
+ ! echo "$prio" 2>/dev/null > "$pin_path/prio"; }; then
rmdir "$pin_path" 2>/dev/null
return 1
fi
@@ -540,8 +560,8 @@ dpllsim_alloc_clock_id()
# Create a device with the standard 3-pin layout, deploy it and resolve
# the netlink device id. Sets DPLLSIM_CREATED_NAME, DPLLSIM_CLOCK_ID and
# DPLLSIM_DEV_ID.
-# gnss0: GNSS, 1 Hz, input
-# ext0: EXT, 10 MHz, input
+# gnss0: GNSS, 1 Hz, input, prio 0 (active reference)
+# ext0: EXT, 10 MHz, input, prio 1
# out0: EXT, 10 MHz, output
# shellcheck disable=SC2120 # the argument is optional
dpllsim_setup_standard_device()
@@ -553,8 +573,8 @@ dpllsim_setup_standard_device()
name="std$clock_id"
dpllsim_create_device "$name" "$clock_id" || return 1
- if ! dpllsim_add_pin "$name" gnss0 gnss 1 input ||
- ! dpllsim_add_pin "$name" ext0 ext 10000000 input ||
+ if ! dpllsim_add_pin "$name" gnss0 gnss 1 input 0 ||
+ ! dpllsim_add_pin "$name" ext0 ext 10000000 input 1 ||
! dpllsim_add_pin "$name" out0 ext 10000000 output; then
dpllsim_delete_device "$name"
return 1
--
2.56.0
next prev parent reply other threads:[~2026-11-05 15:20 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-05 15:18 [PATCH net-next v2 00/14] dpll: add a simulated DPLL device driver Petr Oros
2026-11-05 15:18 ` [PATCH net-next v2 01/14] dpll: dpllsim: Add " Petr Oros
2026-11-06 10:47 ` Ivan Vecera
2026-11-05 15:18 ` [PATCH net-next v2 02/14] selftests: dpll: add test library and device lifecycle tests Petr Oros
2026-11-06 10:48 ` Ivan Vecera
2026-11-05 15:18 ` [PATCH net-next v2 03/14] dpll: dpllsim: Add configurable pins Petr Oros
2026-11-06 10:48 ` Ivan Vecera
2026-11-05 15:18 ` [PATCH net-next v2 04/14] selftests: dpll: add pin enumeration and property tests Petr Oros
2026-11-06 10:48 ` Ivan Vecera
2026-11-05 15:18 ` [PATCH net-next v2 05/14] dpll: dpllsim: Add support to set input pin state Petr Oros
2026-11-06 10:41 ` Ivan Vecera
2026-11-05 15:18 ` [PATCH net-next v2 06/14] selftests: dpll: add pin state tests Petr Oros
2026-11-06 10:49 ` Ivan Vecera
2026-11-05 15:18 ` [PATCH net-next v2 07/14] dpll: dpllsim: Add support to get/set priority on input pins Petr Oros
2026-11-06 10:49 ` Ivan Vecera
2026-11-05 15:18 ` Petr Oros [this message]
2026-11-06 10:50 ` [PATCH net-next v2 08/14] selftests: dpll: add pin priority test Ivan Vecera
2026-11-05 15:18 ` [PATCH net-next v2 09/14] dpll: dpllsim: Add support to set frequency on pins Petr Oros
2026-11-06 10:50 ` Ivan Vecera
2026-11-05 15:18 ` [PATCH net-next v2 10/14] selftests: dpll: add pin frequency test Petr Oros
2026-11-06 10:51 ` Ivan Vecera
2026-11-05 15:18 ` [PATCH net-next v2 11/14] dpll: dpllsim: Add support to adjust phase Petr Oros
2026-11-06 10:51 ` Ivan Vecera
2026-11-05 15:18 ` [PATCH net-next v2 12/14] selftests: dpll: add pin phase adjust test Petr Oros
2026-11-06 10:51 ` Ivan Vecera
2026-11-05 15:18 ` [PATCH net-next v2 13/14] selftests: dpll: add concurrency stress tests Petr Oros
2026-11-06 10:52 ` Ivan Vecera
2026-11-05 15:18 ` [PATCH net-next v2 14/14] selftests: dpll: add reference leak tests Petr Oros
2026-11-06 10:47 ` Ivan Vecera
2026-11-06 12:27 ` [PATCH net-next v2 00/14] dpll: add a simulated DPLL device driver Jiri Pirko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261105151852.1844305-9-poros@redhat.com \
--to=poros@redhat.com \
--cc=andrew+netdev@lunn.ch \
--cc=arkadiusz.kubalewski@intel.com \
--cc=corbet@lwn.net \
--cc=davem@davemloft.net \
--cc=edumazet@kernel.org \
--cc=ivecera@redhat.com \
--cc=jani.nikula@intel.com \
--cc=jiri@resnulli.us \
--cc=kuba@kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=rdunlap@infradead.org \
--cc=shuah@kernel.org \
--cc=skhan@linuxfoundation.org \
--cc=vadim.fedorenko@linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox