Add a test that picks a supported frequency other than the current one from the frequency-supported list of an input pin, sets it, reads it back and restores the original value. Both ends of every advertised range are candidates, so that a pin advertising a single range wider than one value still has one. It skips when the dpll tool lacks the frequency 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 reports no frequency or advertises a single frequency only is a skip on a device provided by the user and a failure on the device the script created, whose pins advertise several. The driver may refuse the candidate. A driver without a frequency setter refuses every value with EOPNOTSUPP, and a driver with constraints of its own refuses values the advertised ranges allow, zl3073x for instance wants the frequencies of an output pair to divide each other. On a device provided by the user a refused set is a skip that names the reason the tool reported, which the setter keeps in DPLL_LAST_ERR, on the created device the simulator accepts every advertised value and the refusal is a failure. Once the set went through, a refused restore is a failure on either. Signed-off-by: Petr Oros --- .../drivers/net/dpll/dpll_features.sh | 64 +++++++++++++++++++ .../selftests/drivers/net/lib/sh/dpll_lib.sh | 5 ++ 2 files changed, 69 insertions(+) diff --git a/tools/testing/selftests/drivers/net/dpll/dpll_features.sh b/tools/testing/selftests/drivers/net/dpll/dpll_features.sh index 941b7ee848f951..66e11f7f44eec9 100755 --- a/tools/testing/selftests/drivers/net/dpll/dpll_features.sh +++ b/tools/testing/selftests/drivers/net/dpll/dpll_features.sh @@ -17,6 +17,7 @@ source "$SCRIPTDIR/../lib/sh/dpll_lib.sh" ALL_TESTS=" test_pin_state_transitions test_pin_priority_get_set + test_pin_frequency_set_get " ############################################################################## @@ -165,6 +166,69 @@ test_pin_state_transitions() log_test "DPLL pin state transitions" } +test_pin_frequency_set_get() +{ + local before target after reason + + RET=0 + + if [ -z "$PIN_TUNE_ID" ]; then + dpll_log_test_skip_or_fail "DPLL pin frequency set/get" \ + "no spare input pin" + return + fi + if ! dpll_pin_set_supports frequency; then + log_test_skip "DPLL pin frequency set/get" \ + "dpll tool lacks pin set frequency" + return + fi + + before=$(dpll_pin_get_frequency "$PIN_TUNE_ID") + if [ -z "$before" ]; then + dpll_log_test_skip_or_fail "DPLL pin frequency set/get" \ + "frequency not reported" + return + fi + defer dpll_pin_set_frequency "$PIN_TUNE_ID" "$before" + + # Pick a supported frequency different from the current one. Both + # ends of every supported range are candidates, so a pin with a + # single range still has an alternative unless it is one value wide. + target=$(dpll_pin_json "$PIN_TUNE_ID" | \ + jq -r --argjson cur "$before" \ + '[.["frequency-supported"][]? | + .["frequency-min"], .["frequency-max"] | + numbers | select(. != $cur)][0] // empty') + if [ -z "$target" ]; then + dpll_log_test_skip_or_fail "DPLL pin frequency set/get" \ + "no alternative supported frequency" + return + fi + + # A driver without a frequency setter or with constraints of its own + # may refuse the candidate, a skip on a device the user provided, the + # simulator accepts every advertised value. + if ! dpll_pin_set_frequency "$PIN_TUNE_ID" "$target"; then + reason=${DPLL_LAST_ERR%%$'\n'*} + dpll_log_test_skip_or_fail "DPLL pin frequency set/get" \ + "cannot set frequency=$target${reason:+, $reason}" + return + fi + after=$(dpll_pin_get_frequency "$PIN_TUNE_ID") + if [ "$after" != "$target" ]; then + check_err 1 "frequency expected $target, got '$after'" + fi + + dpll_pin_set_frequency "$PIN_TUNE_ID" "$before" + check_err $? "cannot restore frequency" + after=$(dpll_pin_get_frequency "$PIN_TUNE_ID") + if [ "$after" != "$before" ]; then + check_err 1 "frequency not restored, got '$after'" + fi + + log_test "DPLL pin frequency set/get" +} + ############################################################################## cleanup() 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 613ed365e3e311..191948442ef8bd 100644 --- a/tools/testing/selftests/drivers/net/lib/sh/dpll_lib.sh +++ b/tools/testing/selftests/drivers/net/lib/sh/dpll_lib.sh @@ -409,6 +409,11 @@ dpll_pin_set_prio() prio "$prio" 2>&1 >/dev/null) } +dpll_pin_set_frequency() +{ + DPLL_LAST_ERR=$(dpll pin set id "$1" frequency "$2" 2>&1 >/dev/null) +} + ############################################################################## # dpllsim configfs interface # -- 2.56.0