From patchwork Tue Mar 29 20:08:34 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marek_Beh=C3=BAn?= X-Patchwork-Id: 1610809 X-Patchwork-Delegate: rfried.dev@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20201202 header.b=GS6o/f16; dkim-atps=neutral Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by bilbo.ozlabs.org (Postfix) with ESMTPS id 4KSgfS1DZhz9sDX for ; Wed, 30 Mar 2022 07:10:24 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 6C3D98408A; Tue, 29 Mar 2022 22:09:41 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=kernel.org header.i=@kernel.org header.b="GS6o/f16"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 3AFC884069; Tue, 29 Mar 2022 22:09:02 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.2 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id BC92184008 for ; Tue, 29 Mar 2022 22:08:55 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=kabel@kernel.org Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 5550E6168D; Tue, 29 Mar 2022 20:08:54 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9069AC340F2; Tue, 29 Mar 2022 20:08:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1648584533; bh=LKNPdZ2iyhN+8TpHGuLCptQ4JA0ar2QobjBINIZn0sQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GS6o/f16HdgLxAnrkJTLjCNaITACvzfQdE+OhFTaGblibMaorRxG9LKpT8PGdaO/A xotWWsJRrTH2YgCe3NMikYe0byWUcAi9nON2fs/yvX2yXKKDuNvAK61eF2aAMzgF6i PX/qyBa1ebxlYYC+SRrzLEH4P7JNdHRMjvAhEhXB/jVqWwBpd9VDtufILreMPGwTu9 SWy3HSz5GIT4m4O3eDI6d7GhxkWVMwXU2QD3luthDYTSchY9umZKfNsMU3332N+hYK g6h4lh3uEx4NMWjOemtTWea+IHFWYh/dNTX9CussmeTzoIGxqfJdFsjtkp2vChtlFb MYABcVnVEx0Xw== From: =?utf-8?q?Marek_Beh=C3=BAn?= To: Joe Hershberger , Ramon Fried Cc: u-boot@lists.denx.de, =?utf-8?q?Marek_Beh=C3=BAn?= , Simon Glass Subject: [PATCH u-boot-net v3 03/14] net: introduce helpers to get PHY ofnode from MAC Date: Tue, 29 Mar 2022 22:08:34 +0200 Message-Id: <20220329200845.13435-4-kabel@kernel.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220329200845.13435-1-kabel@kernel.org> References: <20220329200845.13435-1-kabel@kernel.org> MIME-Version: 1.0 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.5 at phobos.denx.de X-Virus-Status: Clean From: Marek BehĂșn Add helpers ofnode_get_phy_node() and dev_get_phy_node() and use it in net/mdio-uclass.c function dm_eth_connect_phy_handle(). Also add corresponding UT test. This is useful because other part's of U-Boot may want to get PHY ofnode without connecting a PHY. Signed-off-by: Marek BehĂșn Reviewed-by: Ramon Fried Reviewed-by: Simon Glass --- arch/sandbox/dts/test.dts | 11 +++++++++++ drivers/core/ofnode.c | 21 +++++++++++++++++++++ drivers/core/read.c | 5 +++++ include/dm/ofnode.h | 14 ++++++++++++++ include/dm/read.h | 19 +++++++++++++++++++ net/mdio-uclass.c | 24 ++++++------------------ test/dm/ofnode.c | 18 ++++++++++++++++++ 7 files changed, 94 insertions(+), 18 deletions(-) diff --git a/arch/sandbox/dts/test.dts b/arch/sandbox/dts/test.dts index 48ca3e1e47..5248beecd7 100644 --- a/arch/sandbox/dts/test.dts +++ b/arch/sandbox/dts/test.dts @@ -527,6 +527,13 @@ fake-host-hwaddr = [00 00 66 44 22 22]; }; + phy_eth0: phy-test-eth { + compatible = "sandbox,eth"; + reg = <0x10007000 0x1000>; + fake-host-hwaddr = [00 00 66 44 22 77]; + phy-handle = <ðphy1>; + }; + dsa_eth0: dsa-test-eth { compatible = "sandbox,eth"; reg = <0x10006000 0x1000>; @@ -1563,6 +1570,10 @@ mdio: mdio-test { compatible = "sandbox,mdio"; + + ethphy1: ethernet-phy@1 { + reg = <1>; + }; }; pm-bus-test { diff --git a/drivers/core/ofnode.c b/drivers/core/ofnode.c index 709bea272a..eaad2c989b 100644 --- a/drivers/core/ofnode.c +++ b/drivers/core/ofnode.c @@ -1162,3 +1162,24 @@ const char *ofnode_conf_read_str(const char *prop_name) return ofnode_read_string(node, prop_name); } + +ofnode ofnode_get_phy_node(ofnode node) +{ + /* DT node properties that reference a PHY node */ + static const char * const phy_handle_str[] = { + "phy-handle", "phy", "phy-device", + }; + struct ofnode_phandle_args args = { + .node = ofnode_null() + }; + int i; + + assert(ofnode_valid(node)); + + for (i = 0; i < ARRAY_SIZE(phy_handle_str); i++) + if (!ofnode_parse_phandle_with_args(node, phy_handle_str[i], + NULL, 0, 0, &args)) + break; + + return args.node; +} diff --git a/drivers/core/read.c b/drivers/core/read.c index 31f9e78a06..7ff100218d 100644 --- a/drivers/core/read.c +++ b/drivers/core/read.c @@ -398,3 +398,8 @@ int dev_decode_display_timing(const struct udevice *dev, int index, { return ofnode_decode_display_timing(dev_ofnode(dev), index, config); } + +ofnode dev_get_phy_node(const struct udevice *dev) +{ + return ofnode_get_phy_node(dev_ofnode(dev)); +} diff --git a/include/dm/ofnode.h b/include/dm/ofnode.h index 0cb324c8b0..8164386043 100644 --- a/include/dm/ofnode.h +++ b/include/dm/ofnode.h @@ -1204,4 +1204,18 @@ int ofnode_conf_read_int(const char *prop_name, int default_val); */ const char *ofnode_conf_read_str(const char *prop_name); +/** + * ofnode_get_phy_node() - Get PHY node for a MAC (if not fixed-link) + * + * This function parses PHY handle from the Ethernet controller's ofnode + * (trying all possible PHY handle property names), and returns the PHY ofnode. + * + * Before this is used, ofnode_phy_is_fixed_link() should be checked first, and + * if the result to that is true, this function should not be called. + * + * @eth_node: ofnode belonging to the Ethernet controller + * Return: ofnode of the PHY, if it exists, otherwise an invalid ofnode + */ +ofnode ofnode_get_phy_node(ofnode eth_node); + #endif diff --git a/include/dm/read.h b/include/dm/read.h index 233af3c063..899eb813fd 100644 --- a/include/dm/read.h +++ b/include/dm/read.h @@ -743,6 +743,20 @@ int dev_read_pci_bus_range(const struct udevice *dev, struct resource *res); int dev_decode_display_timing(const struct udevice *dev, int index, struct display_timing *config); +/** + * dev_get_phy_node() - Get PHY node for a MAC (if not fixed-link) + * + * This function parses PHY handle from the Ethernet controller's ofnode + * (trying all possible PHY handle property names), and returns the PHY ofnode. + * + * Before this is used, ofnode_phy_is_fixed_link() should be checked first, and + * if the result to that is true, this function should not be called. + * + * @dev: device representing the MAC + * Return: ofnode of the PHY, if it exists, otherwise an invalid ofnode + */ +ofnode dev_get_phy_node(const struct udevice *dev); + #else /* CONFIG_DM_DEV_READ_INLINE is enabled */ #include @@ -1092,6 +1106,11 @@ static inline int dev_decode_display_timing(const struct udevice *dev, return ofnode_decode_display_timing(dev_ofnode(dev), index, config); } +static inline ofnode dev_get_phy_node(const struct udevice *dev) +{ + return ofnode_get_phy_node(dev_ofnode(dev)); +} + #endif /* CONFIG_DM_DEV_READ_INLINE */ /** diff --git a/net/mdio-uclass.c b/net/mdio-uclass.c index 649dc60f73..233b70171b 100644 --- a/net/mdio-uclass.c +++ b/net/mdio-uclass.c @@ -20,11 +20,6 @@ static const char * const phy_mode_str[] = { "phy-mode", "phy-connection-type" }; -/* DT node properties that reference a PHY node */ -static const char * const phy_handle_str[] = { - "phy-handle", "phy", "phy-device" -}; - void dm_mdio_probe_devices(void) { struct udevice *it; @@ -137,23 +132,16 @@ static struct phy_device *dm_eth_connect_phy_handle(struct udevice *ethdev, u32 phy_addr; struct udevice *mdiodev; struct phy_device *phy; - struct ofnode_phandle_args phandle = {.node = ofnode_null()}; ofnode phynode; - int i; if (CONFIG_IS_ENABLED(PHY_FIXED) && ofnode_phy_is_fixed_link(dev_ofnode(ethdev), &phynode)) { phy = phy_connect(NULL, 0, ethdev, interface); - phandle.node = phynode; goto out; } - for (i = 0; i < ARRAY_SIZE(phy_handle_str); i++) - if (!dev_read_phandle_with_args(ethdev, phy_handle_str[i], NULL, - 0, 0, &phandle)) - break; - - if (!ofnode_valid(phandle.node)) { + phynode = dev_get_phy_node(ethdev); + if (!ofnode_valid(phynode)) { dev_dbg(ethdev, "can't find PHY node\n"); return NULL; } @@ -162,16 +150,16 @@ static struct phy_device *dm_eth_connect_phy_handle(struct udevice *ethdev, * reading 'reg' directly should be fine. This is a PHY node, the * address is always size 1 and requires no translation */ - if (ofnode_read_u32(phandle.node, "reg", &phy_addr)) { + if (ofnode_read_u32(phynode, "reg", &phy_addr)) { dev_dbg(ethdev, "missing reg property in phy node\n"); return NULL; } if (uclass_get_device_by_ofnode(UCLASS_MDIO, - ofnode_get_parent(phandle.node), + ofnode_get_parent(phynode), &mdiodev)) { dev_dbg(ethdev, "can't find MDIO bus for node %s\n", - ofnode_get_name(ofnode_get_parent(phandle.node))); + ofnode_get_name(ofnode_get_parent(phynode))); return NULL; } @@ -179,7 +167,7 @@ static struct phy_device *dm_eth_connect_phy_handle(struct udevice *ethdev, out: if (phy) - phy->node = phandle.node; + phy->node = phynode; return phy; } diff --git a/test/dm/ofnode.c b/test/dm/ofnode.c index dab0480a42..500c63aef5 100644 --- a/test/dm/ofnode.c +++ b/test/dm/ofnode.c @@ -447,3 +447,21 @@ static int dm_test_ofnode_string_err(struct unit_test_state *uts) return 0; } DM_TEST(dm_test_ofnode_string_err, UT_TESTF_LIVE_TREE); + +static int dm_test_ofnode_get_phy(struct unit_test_state *uts) +{ + ofnode eth_node, phy_node; + u32 reg; + + eth_node = ofnode_path("/phy-test-eth"); + ut_assert(ofnode_valid(eth_node)); + + phy_node = ofnode_get_phy_node(eth_node); + ut_assert(ofnode_valid(phy_node)); + + reg = ofnode_read_u32_default(phy_node, "reg", -1U); + ut_asserteq_64(0x1, reg); + + return 0; +} +DM_TEST(dm_test_ofnode_get_phy, 0);