Files
u-boot/test/dm/phy_common_props.c
Lucien.Jheng 615c536717 test: dm: add PHY common props unit tests and sandbox DT nodes
Add sandbox DM unit tests for the PHY common properties library and the
corresponding device tree test nodes to arch/sandbox/dts/test.dts.
Also enable CONFIG_PHY_COMMON_PROPS in configs/sandbox_defconfig so
the tests are built and run in the sandbox environment.

The test file covers rx/tx polarity lookups for all relevant cases:

  - missing property (defaults to PHY_POL_NORMAL)
  - single value without names array (applies to all modes)
  - count mismatch between values and names arrays (-EINVAL)
  - name found by exact match
  - name not found with no "default" fallback (-EINVAL)
  - name not found with a "default" entry (uses fallback value)
  - unsupported polarity value (-EOPNOTSUPP)

Ported from Linux KUnit test:
  linux/drivers/phy/phy-common-props-test.c

Signed-off-by: Lucien.Jheng <lucienzx159@gmail.com>
2026-05-06 11:07:22 +02:00

320 lines
8.2 KiB
C

// SPDX-License-Identifier: GPL-2.0-or-later
/*
* U-Boot sandbox DM tests for PHY common props
*
* Ported from Linux KUnit test:
* linux/drivers/phy/phy-common-props-test.c
*
* Copyright 2025-2026 NXP
*/
#include <dm.h>
#include <dm/ofnode.h>
#include <dm/test.h>
#include <linux/bitops.h>
#include <linux/phy/phy-common-props.h>
#include <dt-bindings/phy/phy.h>
#include <test/test.h>
#include <test/ut.h>
/* --- RX polarity tests -------------------------------------------------- */
/* Test: rx-polarity property is missing => default PHY_POL_NORMAL */
static int dm_test_phy_common_props_rx_missing(struct unit_test_state *uts)
{
ofnode node = ofnode_path("/phy-common-props-missing");
unsigned int val;
int ret;
ut_assert(ofnode_valid(node));
ret = phy_get_manual_rx_polarity(node, "sgmii", &val);
ut_asserteq(0, ret);
ut_asserteq(PHY_POL_NORMAL, val);
return 0;
}
DM_TEST(dm_test_phy_common_props_rx_missing, UTF_SCAN_FDT);
/* Test: rx-polarity has more values than rx-polarity-names => -EINVAL */
static int dm_test_phy_common_props_rx_more_values(struct unit_test_state *uts)
{
ofnode node = ofnode_path("/phy-common-props-more-values");
unsigned int val;
int ret;
ut_assert(ofnode_valid(node));
ret = phy_get_manual_rx_polarity(node, "sgmii", &val);
ut_asserteq(-EINVAL, ret);
return 0;
}
DM_TEST(dm_test_phy_common_props_rx_more_values, UTF_SCAN_FDT);
/* Test: rx-polarity has 1 value and rx-polarity-names does not exist */
static int dm_test_phy_common_props_rx_single_value(struct unit_test_state *uts)
{
ofnode node = ofnode_path("/phy-common-props-single");
unsigned int val;
int ret;
ut_assert(ofnode_valid(node));
ret = phy_get_manual_rx_polarity(node, "sgmii", &val);
ut_asserteq(0, ret);
ut_asserteq(PHY_POL_INVERT, val);
return 0;
}
DM_TEST(dm_test_phy_common_props_rx_single_value, UTF_SCAN_FDT);
/* Test: rx-polarity-names has more values than rx-polarity => -EINVAL */
static int dm_test_phy_common_props_rx_more_names(struct unit_test_state *uts)
{
ofnode node = ofnode_path("/phy-common-props-more-names");
unsigned int val;
int ret;
ut_assert(ofnode_valid(node));
ret = phy_get_manual_rx_polarity(node, "sgmii", &val);
ut_asserteq(-EINVAL, ret);
return 0;
}
DM_TEST(dm_test_phy_common_props_rx_more_names, UTF_SCAN_FDT);
/* Test: valid arrays, find polarity by mode name */
static int dm_test_phy_common_props_rx_find_by_name(struct unit_test_state *uts)
{
ofnode node = ofnode_path("/phy-common-props-find-by-name");
unsigned int val;
int ret;
ut_assert(ofnode_valid(node));
ret = phy_get_manual_rx_polarity(node, "sgmii", &val);
ut_asserteq(0, ret);
ut_asserteq(PHY_POL_NORMAL, val);
ret = phy_get_manual_rx_polarity(node, "2500base-x", &val);
ut_asserteq(0, ret);
ut_asserteq(PHY_POL_INVERT, val);
/* "usb-ss" has PHY_POL_AUTO; auto is supported here */
ret = phy_get_rx_polarity(node, "usb-ss", BIT(PHY_POL_AUTO),
PHY_POL_AUTO, &val);
ut_asserteq(0, ret);
ut_asserteq(PHY_POL_AUTO, val);
return 0;
}
DM_TEST(dm_test_phy_common_props_rx_find_by_name, UTF_SCAN_FDT);
/* Test: name not found, no "default" entry => -EINVAL */
static int dm_test_phy_common_props_rx_no_default(struct unit_test_state *uts)
{
ofnode node = ofnode_path("/phy-common-props-no-default");
unsigned int val;
int ret;
ut_assert(ofnode_valid(node));
ret = phy_get_manual_rx_polarity(node, "sgmii", &val);
ut_asserteq(-EINVAL, ret);
return 0;
}
DM_TEST(dm_test_phy_common_props_rx_no_default, UTF_SCAN_FDT);
/* Test: name not found, "default" entry exists => use default polarity */
static int dm_test_phy_common_props_rx_with_default(struct unit_test_state *uts)
{
ofnode node = ofnode_path("/phy-common-props-with-default");
unsigned int val;
int ret;
ut_assert(ofnode_valid(node));
ret = phy_get_manual_rx_polarity(node, "sgmii", &val);
ut_asserteq(0, ret);
ut_asserteq(PHY_POL_INVERT, val);
return 0;
}
DM_TEST(dm_test_phy_common_props_rx_with_default, UTF_SCAN_FDT);
/* Test: polarity value found but not in supported set => -EOPNOTSUPP */
static int dm_test_phy_common_props_rx_unsupported(struct unit_test_state *uts)
{
ofnode node = ofnode_path("/phy-common-props-unsupported");
unsigned int val;
int ret;
ut_assert(ofnode_valid(node));
ret = phy_get_manual_rx_polarity(node, "sgmii", &val);
ut_asserteq(-EOPNOTSUPP, ret);
return 0;
}
DM_TEST(dm_test_phy_common_props_rx_unsupported, UTF_SCAN_FDT);
/* --- TX polarity tests -------------------------------------------------- */
/* Test: tx-polarity property is missing => default PHY_POL_NORMAL */
static int dm_test_phy_common_props_tx_missing(struct unit_test_state *uts)
{
ofnode node = ofnode_path("/phy-common-props-missing");
unsigned int val;
int ret;
ut_assert(ofnode_valid(node));
ret = phy_get_manual_tx_polarity(node, "sgmii", &val);
ut_asserteq(0, ret);
ut_asserteq(PHY_POL_NORMAL, val);
return 0;
}
DM_TEST(dm_test_phy_common_props_tx_missing, UTF_SCAN_FDT);
/* Test: tx-polarity has more values than tx-polarity-names => -EINVAL */
static int dm_test_phy_common_props_tx_more_values(struct unit_test_state *uts)
{
ofnode node = ofnode_path("/phy-common-props-more-values");
unsigned int val;
int ret;
ut_assert(ofnode_valid(node));
ret = phy_get_manual_tx_polarity(node, "sgmii", &val);
ut_asserteq(-EINVAL, ret);
return 0;
}
DM_TEST(dm_test_phy_common_props_tx_more_values, UTF_SCAN_FDT);
/* Test: tx-polarity has 1 value and tx-polarity-names does not exist */
static int dm_test_phy_common_props_tx_single_value(struct unit_test_state *uts)
{
ofnode node = ofnode_path("/phy-common-props-single");
unsigned int val;
int ret;
ut_assert(ofnode_valid(node));
ret = phy_get_manual_tx_polarity(node, "sgmii", &val);
ut_asserteq(0, ret);
ut_asserteq(PHY_POL_INVERT, val);
return 0;
}
DM_TEST(dm_test_phy_common_props_tx_single_value, UTF_SCAN_FDT);
/* Test: tx-polarity-names has more values than tx-polarity => -EINVAL */
static int dm_test_phy_common_props_tx_more_names(struct unit_test_state *uts)
{
ofnode node = ofnode_path("/phy-common-props-more-names");
unsigned int val;
int ret;
ut_assert(ofnode_valid(node));
ret = phy_get_manual_tx_polarity(node, "sgmii", &val);
ut_asserteq(-EINVAL, ret);
return 0;
}
DM_TEST(dm_test_phy_common_props_tx_more_names, UTF_SCAN_FDT);
/* Test: valid arrays, find polarity by mode name */
static int dm_test_phy_common_props_tx_find_by_name(struct unit_test_state *uts)
{
ofnode node = ofnode_path("/phy-common-props-find-by-name");
unsigned int val;
int ret;
ut_assert(ofnode_valid(node));
ret = phy_get_manual_tx_polarity(node, "sgmii", &val);
ut_asserteq(0, ret);
ut_asserteq(PHY_POL_NORMAL, val);
ret = phy_get_manual_tx_polarity(node, "2500base-x", &val);
ut_asserteq(0, ret);
ut_asserteq(PHY_POL_INVERT, val);
ret = phy_get_manual_tx_polarity(node, "1000base-x", &val);
ut_asserteq(0, ret);
ut_asserteq(PHY_POL_NORMAL, val);
return 0;
}
DM_TEST(dm_test_phy_common_props_tx_find_by_name, UTF_SCAN_FDT);
/* Test: name not found, no "default" entry => -EINVAL */
static int dm_test_phy_common_props_tx_no_default(struct unit_test_state *uts)
{
ofnode node = ofnode_path("/phy-common-props-no-default");
unsigned int val;
int ret;
ut_assert(ofnode_valid(node));
ret = phy_get_manual_tx_polarity(node, "sgmii", &val);
ut_asserteq(-EINVAL, ret);
return 0;
}
DM_TEST(dm_test_phy_common_props_tx_no_default, UTF_SCAN_FDT);
/* Test: name not found, "default" entry exists => use default polarity */
static int dm_test_phy_common_props_tx_with_default(struct unit_test_state *uts)
{
ofnode node = ofnode_path("/phy-common-props-with-default");
unsigned int val;
int ret;
ut_assert(ofnode_valid(node));
ret = phy_get_manual_tx_polarity(node, "sgmii", &val);
ut_asserteq(0, ret);
ut_asserteq(PHY_POL_INVERT, val);
return 0;
}
DM_TEST(dm_test_phy_common_props_tx_with_default, UTF_SCAN_FDT);
/* Test: polarity value found but not in supported set => -EOPNOTSUPP */
static int dm_test_phy_common_props_tx_unsupported(struct unit_test_state *uts)
{
ofnode node = ofnode_path("/phy-common-props-unsupported");
unsigned int val;
int ret;
ut_assert(ofnode_valid(node));
ret = phy_get_manual_tx_polarity(node, "sgmii", &val);
ut_asserteq(-EOPNOTSUPP, ret);
return 0;
}
DM_TEST(dm_test_phy_common_props_tx_unsupported, UTF_SCAN_FDT);