diff mbox series

[v2,3/4] board: fsl: lx2160ardb: add dts fixup function for RevC

Message ID 20210426130113.6514-4-ioana.ciornei@nxp.com
State Changes Requested
Delegated to: Priyanka Jain
Headers show
Series board: fsl: lx2160ardb: add networking support for RevC | expand

Commit Message

Ioana Ciornei April 26, 2021, 1:01 p.m. UTC
From: Florin Chiculita <florinlaurentiu.chiculita@nxp.com>

Since the new RevC LX2160A-RDB board has its 10G Aquantia PHYs at
different MDIO bus addresses, we must update both the kernel DTS and
u-boot's DTS (in case of DM_ETH) in case the board is indeed RevC.
Use the newly introduced get_board_rev() function to trigger a fixup
of the kernel DTS to properly match the actual PHY addresses.
All this is encapsulated in the fdt_fixup_board_phy_revc() function
which will be used in the next patch.

Signed-off-by: Florin Chiculita <florinlaurentiu.chiculita@nxp.com>
Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
---
 board/freescale/lx2160a/eth_lx2160ardb.c | 106 +++++++++++++++++++++++
 board/freescale/lx2160a/lx2160a.h        |   1 +
 2 files changed, 107 insertions(+)

Comments

Priyanka Jain May 7, 2021, 9:04 a.m. UTC | #1
>-----Original Message-----
>From: Ioana Ciornei <ioana.ciornei@nxp.com>
>Sent: Monday, April 26, 2021 6:31 PM
>To: Priyanka Jain <priyanka.jain@nxp.com>
>Cc: u-boot@lists.denx.de; Florin Laurentiu Chiculita
><florinlaurentiu.chiculita@nxp.com>; Wasim Khan (OSS)
><wasim.khan@oss.nxp.com>; Ioana Ciornei <ioana.ciornei@nxp.com>
>Subject: [PATCH v2 3/4] board: fsl: lx2160ardb: add dts fixup function for RevC
>
>From: Florin Chiculita <florinlaurentiu.chiculita@nxp.com>
>
>Since the new RevC LX2160A-RDB board has its 10G Aquantia PHYs at different
>MDIO bus addresses, we must update both the kernel DTS and u-boot's DTS (in
>case of DM_ETH) in case the board is indeed RevC.
>Use the newly introduced get_board_rev() function to trigger a fixup of the kernel
>DTS to properly match the actual PHY addresses.
>All this is encapsulated in the fdt_fixup_board_phy_revc() function which will be
>used in the next patch.
>
>Signed-off-by: Florin Chiculita <florinlaurentiu.chiculita@nxp.com>
>Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
>---
> board/freescale/lx2160a/eth_lx2160ardb.c | 106 +++++++++++++++++++++++
> board/freescale/lx2160a/lx2160a.h        |   1 +
> 2 files changed, 107 insertions(+)
>
>diff --git a/board/freescale/lx2160a/eth_lx2160ardb.c
>b/board/freescale/lx2160a/eth_lx2160ardb.c
>index 8fd2a501de16..c693ad9a0a4a 100644
>--- a/board/freescale/lx2160a/eth_lx2160ardb.c
>+++ b/board/freescale/lx2160a/eth_lx2160ardb.c
>@@ -231,6 +231,112 @@ void reset_phy(void)  }  #endif /*
>CONFIG_RESET_PHY_R */
>
>+static int fdt_get_dpmac_node(void *fdt, int dpmac_id) {
>+	char dpmac_str[] = "dpmacs@00";
>+	int offset, dpmacs_offset;
>+
>+	/* get the dpmac offset */
>+	dpmacs_offset = fdt_path_offset(fdt, "/soc/fsl-mc/dpmacs");
>+	if (dpmacs_offset < 0)
>+		dpmacs_offset = fdt_path_offset(fdt, "/fsl-mc/dpmacs");
>+
>+	if (dpmacs_offset < 0) {
>+		printf("dpmacs node not found in device tree\n");
>+		return dpmacs_offset;
>+	}
>+
>+	sprintf(dpmac_str, "dpmac@%x", dpmac_id);
>+	offset = fdt_subnode_offset(fdt, dpmacs_offset, dpmac_str);
>+	if (offset < 0) {
>+		sprintf(dpmac_str, "ethernet@%x", dpmac_id);
>+		offset = fdt_subnode_offset(fdt, dpmacs_offset, dpmac_str);
>+		if (offset < 0) {
>+			printf("dpmac@%x/ethernet@%x node not found in
>device tree\n",
>+			       dpmac_id, dpmac_id);
>+			return offset;
>+		}
>+	}
>+
>+	return offset;
>+}
>+
>+static int fdt_update_phy_addr(void *fdt, int dpmac_id, int phy_addr) {
>+	char dpmac_str[] = "dpmacs@00";
>+	const u32 *phyhandle;
>+	int offset;
>+	int err;
>+
>+	/* get the dpmac offset */
>+	offset = fdt_get_dpmac_node(fdt, dpmac_id);
>+	if (offset < 0)
>+		return offset;
>+
>+	/* get dpmac phy-handle */
>+	sprintf(dpmac_str, "dpmac@%x", dpmac_id);
>+	phyhandle = (u32 *)fdt_getprop(fdt, offset, "phy-handle", NULL);
>+	if (!phyhandle) {
>+		printf("%s node not found in device tree\n", dpmac_str);
>+		return offset;
>+	}
>+
>+	offset = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*phyhandle));
>+	if (offset < 0) {
>+		printf("Could not get the ph node offset for dpmac %d\n",
>+		       dpmac_id);
>+		return offset;
>+	}
>+
>+	phy_addr = cpu_to_fdt32(phy_addr);
>+	err = fdt_setprop(fdt, offset, "reg", &phy_addr, sizeof(phy_addr));
>+	if (err < 0) {
>+		printf("Could not set phy node's reg for dpmac %d: %s.\n",
>+		       dpmac_id, fdt_strerror(err));
>+		return err;
>+	}
>+
>+	return 0;
>+}
>+
>+static int fdt_delete_phy_handle(void *fdt, int dpmac_id) {
>+	const u32 *phyhandle;
>+	int offset;
>+
>+	/* get the dpmac offset */
>+	offset = fdt_get_dpmac_node(fdt, dpmac_id);
>+	if (offset < 0)
>+		return offset;
>+
>+	/* verify if the node has a phy-handle */
>+	phyhandle = (u32 *)fdt_getprop(fdt, offset, "phy-handle", NULL);
>+	if (!phyhandle)
>+		return 0;
>+
>+	return fdt_delprop(fdt, offset, "phy-handle"); }
>+
>+int fdt_fixup_board_phy_revc(void *fdt) {
>+	int ret;
>+
>+	if (get_board_rev() != 'C')
>+		return 0;

Do we want to check for < 'C' version or != here?
Is fdt_fixup_board_phy_revc() rquired only for Rev C version or >= Rev C?

Regards
Priyanka
Priyanka Jain June 17, 2021, 6:39 a.m. UTC | #2
>-----Original Message-----
>From: Ioana Ciornei <ioana.ciornei@nxp.com>
>Sent: Monday, April 26, 2021 6:31 PM
>To: Priyanka Jain <priyanka.jain@nxp.com>
>Cc: u-boot@lists.denx.de; Florin Laurentiu Chiculita
><florinlaurentiu.chiculita@nxp.com>; Wasim Khan (OSS)
><wasim.khan@oss.nxp.com>; Ioana Ciornei <ioana.ciornei@nxp.com>
>Subject: [PATCH v2 3/4] board: fsl: lx2160ardb: add dts fixup function for RevC
>
>From: Florin Chiculita <florinlaurentiu.chiculita@nxp.com>
>
>Since the new RevC LX2160A-RDB board has its 10G Aquantia PHYs at different
>MDIO bus addresses, we must update both the kernel DTS and u-boot's DTS (in
>case of DM_ETH) in case the board is indeed RevC.
>Use the newly introduced get_board_rev() function to trigger a fixup of the kernel
>DTS to properly match the actual PHY addresses.
>All this is encapsulated in the fdt_fixup_board_phy_revc() function which will be
>used in the next patch.
>
>Signed-off-by: Florin Chiculita <florinlaurentiu.chiculita@nxp.com>
>Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
>---
> board/freescale/lx2160a/eth_lx2160ardb.c | 106 +++++++++++++++++++++++
> board/freescale/lx2160a/lx2160a.h        |   1 +
> 2 files changed, 107 insertions(+)
>
>diff --git a/board/freescale/lx2160a/eth_lx2160ardb.c
>b/board/freescale/lx2160a/eth_lx2160ardb.c
>index 8fd2a501de16..c693ad9a0a4a 100644
>--- a/board/freescale/lx2160a/eth_lx2160ardb.c
>+++ b/board/freescale/lx2160a/eth_lx2160ardb.c
>@@ -231,6 +231,112 @@ void reset_phy(void)  }  #endif /*
>CONFIG_RESET_PHY_R */
>
>+static int fdt_get_dpmac_node(void *fdt, int dpmac_id) {
>+	char dpmac_str[] = "dpmacs@00";
>+	int offset, dpmacs_offset;
>+
>+	/* get the dpmac offset */
>+	dpmacs_offset = fdt_path_offset(fdt, "/soc/fsl-mc/dpmacs");
>+	if (dpmacs_offset < 0)
>+		dpmacs_offset = fdt_path_offset(fdt, "/fsl-mc/dpmacs");
>+
>+	if (dpmacs_offset < 0) {
>+		printf("dpmacs node not found in device tree\n");
>+		return dpmacs_offset;
>+	}
>+
>+	sprintf(dpmac_str, "dpmac@%x", dpmac_id);
>+	offset = fdt_subnode_offset(fdt, dpmacs_offset, dpmac_str);
>+	if (offset < 0) {
>+		sprintf(dpmac_str, "ethernet@%x", dpmac_id);
>+		offset = fdt_subnode_offset(fdt, dpmacs_offset, dpmac_str);
>+		if (offset < 0) {
>+			printf("dpmac@%x/ethernet@%x node not found in
>device tree\n",
>+			       dpmac_id, dpmac_id);
>+			return offset;
>+		}
>+	}
>+
>+	return offset;
>+}
>+
>+static int fdt_update_phy_addr(void *fdt, int dpmac_id, int phy_addr) {
>+	char dpmac_str[] = "dpmacs@00";
>+	const u32 *phyhandle;
>+	int offset;
>+	int err;
>+
>+	/* get the dpmac offset */
>+	offset = fdt_get_dpmac_node(fdt, dpmac_id);
>+	if (offset < 0)
>+		return offset;
>+
>+	/* get dpmac phy-handle */
>+	sprintf(dpmac_str, "dpmac@%x", dpmac_id);
>+	phyhandle = (u32 *)fdt_getprop(fdt, offset, "phy-handle", NULL);
>+	if (!phyhandle) {
>+		printf("%s node not found in device tree\n", dpmac_str);
>+		return offset;
>+	}
>+
>+	offset = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*phyhandle));
>+	if (offset < 0) {
>+		printf("Could not get the ph node offset for dpmac %d\n",
>+		       dpmac_id);
>+		return offset;
>+	}
>+
>+	phy_addr = cpu_to_fdt32(phy_addr);
>+	err = fdt_setprop(fdt, offset, "reg", &phy_addr, sizeof(phy_addr));
>+	if (err < 0) {
>+		printf("Could not set phy node's reg for dpmac %d: %s.\n",
>+		       dpmac_id, fdt_strerror(err));
>+		return err;
>+	}
>+
>+	return 0;
>+}
>+
>+static int fdt_delete_phy_handle(void *fdt, int dpmac_id) {
>+	const u32 *phyhandle;
>+	int offset;
>+
>+	/* get the dpmac offset */
>+	offset = fdt_get_dpmac_node(fdt, dpmac_id);
>+	if (offset < 0)
>+		return offset;
>+
>+	/* verify if the node has a phy-handle */
>+	phyhandle = (u32 *)fdt_getprop(fdt, offset, "phy-handle", NULL);
>+	if (!phyhandle)
>+		return 0;
>+
>+	return fdt_delprop(fdt, offset, "phy-handle"); }
>+
>+int fdt_fixup_board_phy_revc(void *fdt) {
>+	int ret;
>+
>+	if (get_board_rev() != 'C')
>+		return 0;
>+
>+	/* DPMACs 3,4 have their Aquantia PHYs at new addresses */
>+	ret = fdt_update_phy_addr(fdt, 3, AQR113C_PHY_ADDR1);
>+	if (ret)
>+		return ret;
>+
>+	ret = fdt_update_phy_addr(fdt, 4, AQR113C_PHY_ADDR2);
>+	if (ret)
>+		return ret;
>+
>+	/* There is no PHY for the DPMAC2, so remove the phy-handle */
>+	return fdt_delete_phy_handle(fdt, 2);
>+}
>+
> int fdt_fixup_board_phy(void *fdt)
> {
> 	int mdio_offset;
>diff --git a/board/freescale/lx2160a/lx2160a.h
>b/board/freescale/lx2160a/lx2160a.h
>index cf56cefb45a3..e9b318339af3 100644
>--- a/board/freescale/lx2160a/lx2160a.h
>+++ b/board/freescale/lx2160a/lx2160a.h
>@@ -60,6 +60,7 @@
>
> #if CONFIG_IS_ENABLED(TARGET_LX2160ARDB)
> u8 get_board_rev(void);
>+int fdt_fixup_board_phy_revc(void *fdt);
> #endif
>
> #endif /* __LX2160_H */
>--
>2.17.1


Kindly ensure build for all lx2160a platforms, fix build issues like below  
2021-06-16T15:10:30.1450001Z    aarch64:  +   lx2162aqds_tfa
2021-06-16T15:10:30.1450811Z +board/freescale/lx2160a/lx2160a.c: In function 'board_fix_fdt':
2021-06-16T15:10:30.1451830Z +board/freescale/lx2160a/lx2160a.c:196:3: error: implicit declaration of function 'fdt_fixup_board_phy_revc'; did you mean 'fdt_fixup_board_enet'? [-Werror=implicit-function-declaration]
2021-06-16T15:10:30.1452462Z +  196 |   fdt_fixup_board_phy_revc(fdt);
2021-06-16T15:10:30.1452800Z +      |   ^~~~~~~~~~~~~~~~~~~~~~~~
2021-06-16T15:10:30.1453131Z +      |   fdt_fixup_board_enet
2021-06-16T15:10:30.1453705Z +board/freescale/lx2160a/lx2160a.c: In function 'ft_board_setup':
2021-06-16T15:10:30.1454548Z +board/freescale/lx2160a/lx2160a.c:922:6: error: implicit declaration of function 'get_board_rev' [-Werror=implicit-function-declaration]
2021-06-16T15:10:30.1455235Z +  922 |  if (get_board_rev() >= 'C')
2021-06-16T15:10:30.1455569Z +      |      ^~~~~~~~~~~~~
2021-06-16T15:10:30.1456345Z +board/freescale/lx2160a/lx2160a.c:923:3: error: implicit declaration of function 'fdt_fixup_i2c_thermal_node' [-Werror=implicit-function-declaration]
2021-06-16T15:10:30.1456912Z +  923 |   fdt_fixup_i2c_thermal_node(blob);
2021-06-16T15:10:30.1457254Z +      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~
2021-06-16T15:10:30.1457608Z +cc1: all warnings being treated as errors
2021-06-16T15:10:30.1457987Z +make[2]: *** [board/freescale/lx2160a/lx2160a.o] Error 1
2021-06-16T15:10:30.1458374Z +make[1]: *** [board/freescale/lx2160a] Error 2
2021-06-16T15:10:30.1458878Z +make: *** [sub-make] Error 2
2021-06-16T15:10:30.1459042Z 
2021-06-16T15:10:49.8594009Z     2    0    3 /8       -3      0:01:07  : lx2162aqds_tfa
2021-06-16T15:10:49.8606363Z                                                            

https://dev.azure.com/u-boot/a1096300-2999-4ec4-a21a-4c22075e3771/_apis/build/builds/2383/logs/415


Regards
Priyanka
diff mbox series

Patch

diff --git a/board/freescale/lx2160a/eth_lx2160ardb.c b/board/freescale/lx2160a/eth_lx2160ardb.c
index 8fd2a501de16..c693ad9a0a4a 100644
--- a/board/freescale/lx2160a/eth_lx2160ardb.c
+++ b/board/freescale/lx2160a/eth_lx2160ardb.c
@@ -231,6 +231,112 @@  void reset_phy(void)
 }
 #endif /* CONFIG_RESET_PHY_R */
 
+static int fdt_get_dpmac_node(void *fdt, int dpmac_id)
+{
+	char dpmac_str[] = "dpmacs@00";
+	int offset, dpmacs_offset;
+
+	/* get the dpmac offset */
+	dpmacs_offset = fdt_path_offset(fdt, "/soc/fsl-mc/dpmacs");
+	if (dpmacs_offset < 0)
+		dpmacs_offset = fdt_path_offset(fdt, "/fsl-mc/dpmacs");
+
+	if (dpmacs_offset < 0) {
+		printf("dpmacs node not found in device tree\n");
+		return dpmacs_offset;
+	}
+
+	sprintf(dpmac_str, "dpmac@%x", dpmac_id);
+	offset = fdt_subnode_offset(fdt, dpmacs_offset, dpmac_str);
+	if (offset < 0) {
+		sprintf(dpmac_str, "ethernet@%x", dpmac_id);
+		offset = fdt_subnode_offset(fdt, dpmacs_offset, dpmac_str);
+		if (offset < 0) {
+			printf("dpmac@%x/ethernet@%x node not found in device tree\n",
+			       dpmac_id, dpmac_id);
+			return offset;
+		}
+	}
+
+	return offset;
+}
+
+static int fdt_update_phy_addr(void *fdt, int dpmac_id, int phy_addr)
+{
+	char dpmac_str[] = "dpmacs@00";
+	const u32 *phyhandle;
+	int offset;
+	int err;
+
+	/* get the dpmac offset */
+	offset = fdt_get_dpmac_node(fdt, dpmac_id);
+	if (offset < 0)
+		return offset;
+
+	/* get dpmac phy-handle */
+	sprintf(dpmac_str, "dpmac@%x", dpmac_id);
+	phyhandle = (u32 *)fdt_getprop(fdt, offset, "phy-handle", NULL);
+	if (!phyhandle) {
+		printf("%s node not found in device tree\n", dpmac_str);
+		return offset;
+	}
+
+	offset = fdt_node_offset_by_phandle(fdt, fdt32_to_cpu(*phyhandle));
+	if (offset < 0) {
+		printf("Could not get the ph node offset for dpmac %d\n",
+		       dpmac_id);
+		return offset;
+	}
+
+	phy_addr = cpu_to_fdt32(phy_addr);
+	err = fdt_setprop(fdt, offset, "reg", &phy_addr, sizeof(phy_addr));
+	if (err < 0) {
+		printf("Could not set phy node's reg for dpmac %d: %s.\n",
+		       dpmac_id, fdt_strerror(err));
+		return err;
+	}
+
+	return 0;
+}
+
+static int fdt_delete_phy_handle(void *fdt, int dpmac_id)
+{
+	const u32 *phyhandle;
+	int offset;
+
+	/* get the dpmac offset */
+	offset = fdt_get_dpmac_node(fdt, dpmac_id);
+	if (offset < 0)
+		return offset;
+
+	/* verify if the node has a phy-handle */
+	phyhandle = (u32 *)fdt_getprop(fdt, offset, "phy-handle", NULL);
+	if (!phyhandle)
+		return 0;
+
+	return fdt_delprop(fdt, offset, "phy-handle");
+}
+
+int fdt_fixup_board_phy_revc(void *fdt)
+{
+	int ret;
+
+	if (get_board_rev() != 'C')
+		return 0;
+
+	/* DPMACs 3,4 have their Aquantia PHYs at new addresses */
+	ret = fdt_update_phy_addr(fdt, 3, AQR113C_PHY_ADDR1);
+	if (ret)
+		return ret;
+
+	ret = fdt_update_phy_addr(fdt, 4, AQR113C_PHY_ADDR2);
+	if (ret)
+		return ret;
+
+	/* There is no PHY for the DPMAC2, so remove the phy-handle */
+	return fdt_delete_phy_handle(fdt, 2);
+}
+
 int fdt_fixup_board_phy(void *fdt)
 {
 	int mdio_offset;
diff --git a/board/freescale/lx2160a/lx2160a.h b/board/freescale/lx2160a/lx2160a.h
index cf56cefb45a3..e9b318339af3 100644
--- a/board/freescale/lx2160a/lx2160a.h
+++ b/board/freescale/lx2160a/lx2160a.h
@@ -60,6 +60,7 @@ 
 
 #if CONFIG_IS_ENABLED(TARGET_LX2160ARDB)
 u8 get_board_rev(void);
+int fdt_fixup_board_phy_revc(void *fdt);
 #endif
 
 #endif /* __LX2160_H */