Re: [PATCH v2 5/7] net: dwc_eth_qos_rockchip: Add support for RK3588
Hi Jonas, On 2023-10-01 21:17, Jonas Karlman wrote: > Add rk_gmac_ops and other special handling that is needed for GMAC to > work on RK3588. > > rk_gmac_ops was ported from linux commits: > 2f2b60a0ec28 ("net: ethernet: stmmac: dwmac-rk: Add gmac support for rk3588") > 88619e77b33d ("net: stmmac: rk3588: Allow multiple gmac controller") I've updated from U-Boot 2023.07.2 to 2024.01, and noticed Ethernet issue on Linux. On a ODROID-M1 with 8GB of RAM I had a packet drop rate of ~20%: 107 packets transmitted, 87 received, 18.6916% packet loss, time 107390ms rtt min/avg/max/mdev = 0.337/0.405/0.889/0.076 ms SSH connections feel very sluggy, presumably due to packet losses. Strangely, the same build works just fine on another ODROID-M1 with 4GB of RAM. I swapped Ethernet cable and switches to rule this out. It really seems to bee that particular unit which is problematic. Disabling this driver fixes the Etherent issue on Linux. Do you have an idea what this could be? I am happy to run commands or test patches to debug this. -- Stefan > > Signed-off-by: Jonas Karlman > Reviewed-by: Kever Yang > --- > Cc: David Wu > Cc: Sebastian Reichel > Cc: Benjamin Gaignard > --- > v2: > - Collect r-b tag > > drivers/net/dwc_eth_qos.c | 4 + > drivers/net/dwc_eth_qos_rockchip.c | 182 - > 2 files changed, 182 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/dwc_eth_qos.c b/drivers/net/dwc_eth_qos.c > index 9fb98a2c3c74..dc04416865dd 100644 > --- a/drivers/net/dwc_eth_qos.c > +++ b/drivers/net/dwc_eth_qos.c > @@ -1712,6 +1712,10 @@ static const struct udevice_id eqos_ids[] = { > .compatible = "rockchip,rk3568-gmac", > .data = (ulong)_rockchip_config > }, > + { > + .compatible = "rockchip,rk3588-gmac", > + .data = (ulong)_rockchip_config > + }, > #endif > #if IS_ENABLED(CONFIG_DWC_ETH_QOS_QCOM) > { > diff --git a/drivers/net/dwc_eth_qos_rockchip.c > b/drivers/net/dwc_eth_qos_rockchip.c > index 05edc098f50d..20fd3a25c3dd 100644 > --- a/drivers/net/dwc_eth_qos_rockchip.c > +++ b/drivers/net/dwc_eth_qos_rockchip.c > @@ -28,6 +28,7 @@ struct rk_gmac_ops { > int tx_delay, int rx_delay); > int (*set_to_rmii)(struct udevice *dev); > int (*set_gmac_speed)(struct udevice *dev); > + void (*set_clock_selection)(struct udevice *dev, bool enable); > u32 regs[3]; > }; > > @@ -35,7 +36,9 @@ struct rockchip_platform_data { > struct reset_ctl_bulk resets; > const struct rk_gmac_ops *ops; > int id; > + bool clock_input; > struct regmap *grf; > + struct regmap *php_grf; > }; > > #define HIWORD_UPDATE(val, mask, shift) \ > @@ -129,6 +132,137 @@ static int rk3568_set_gmac_speed(struct udevice *dev) > return 0; > } > > +/* sys_grf */ > +#define RK3588_GRF_GMAC_CON7 0x031c > +#define RK3588_GRF_GMAC_CON8 0x0320 > +#define RK3588_GRF_GMAC_CON9 0x0324 > + > +#define RK3588_GMAC_RXCLK_DLY_ENABLE(id) GRF_BIT(2 * (id) + 3) > +#define RK3588_GMAC_RXCLK_DLY_DISABLE(id)GRF_CLR_BIT(2 * (id) + 3) > +#define RK3588_GMAC_TXCLK_DLY_ENABLE(id) GRF_BIT(2 * (id) + 2) > +#define RK3588_GMAC_TXCLK_DLY_DISABLE(id)GRF_CLR_BIT(2 * (id) + 2) > + > +#define RK3588_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, > 0xFF, 8) > +#define RK3588_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, > 0xFF, 0) > + > +/* php_grf */ > +#define RK3588_GRF_GMAC_CON0 0x0008 > +#define RK3588_GRF_CLK_CON1 0x0070 > + > +#define RK3588_GMAC_PHY_INTF_SEL_RGMII(id) \ > + (GRF_BIT(3 + (id) * 6) | GRF_CLR_BIT(4 + (id) * 6) | GRF_CLR_BIT(5 + > (id) * 6)) > +#define RK3588_GMAC_PHY_INTF_SEL_RMII(id)\ > + (GRF_CLR_BIT(3 + (id) * 6) | GRF_CLR_BIT(4 + (id) * 6) | GRF_BIT(5 + > (id) * 6)) > + > +#define RK3588_GMAC_CLK_RMII_MODE(id)GRF_BIT(5 * (id)) > +#define RK3588_GMAC_CLK_RGMII_MODE(id) GRF_CLR_BIT(5 * (id)) > + > +#define RK3588_GMAC_CLK_SELET_CRU(id)GRF_BIT(5 * (id) + 4) > +#define RK3588_GMAC_CLK_SELET_IO(id) GRF_CLR_BIT(5 * (id) + 4) > + > +#define RK3588_GMAC_CLK_RMII_DIV2(id)GRF_BIT(5 * (id) + 2) > +#define RK3588_GMAC_CLK_RMII_DIV20(id) GRF_CLR_BIT(5 * (id) + > 2) > + > +#define RK3588_GMAC_CLK_RGMII_DIV1(id) \ > + (GRF_CLR_BIT(5 * (id) + 2) | GRF_CLR_BIT(5 * (id) + 3)) > +#define RK3588_GMAC_CLK_RGMII_DIV5(id) \ > + (GRF_BIT(5 * (id) + 2) | GRF_BIT(5 * (id) + 3)) > +#define RK3588_GMAC_CLK_RGMII_DIV50(id) \ > + (GRF_CLR_BIT(5 * (id) + 2) | GRF_BIT(5 * (id) + 3)) > + > +#define RK3588_GMAC_CLK_RMII_GATE(id)GRF_BIT(5 * (id) + 1) > +#define RK3588_GMAC_CLK_RMII_NOGATE(id) GRF_CLR_BIT(5 * (id) + > 1) > + > +static int
Re: [PATCH v2 5/7] net: dwc_eth_qos_rockchip: Add support for RK3588
On Sun, Oct 1, 2023 at 10:17 PM Jonas Karlman wrote: > > Add rk_gmac_ops and other special handling that is needed for GMAC to > work on RK3588. > > rk_gmac_ops was ported from linux commits: > 2f2b60a0ec28 ("net: ethernet: stmmac: dwmac-rk: Add gmac support for rk3588") > 88619e77b33d ("net: stmmac: rk3588: Allow multiple gmac controller") > > Signed-off-by: Jonas Karlman > Reviewed-by: Kever Yang > --- > Cc: David Wu > Cc: Sebastian Reichel > Cc: Benjamin Gaignard > --- > v2: > - Collect r-b tag > > drivers/net/dwc_eth_qos.c | 4 + > drivers/net/dwc_eth_qos_rockchip.c | 182 - > 2 files changed, 182 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/dwc_eth_qos.c b/drivers/net/dwc_eth_qos.c > index 9fb98a2c3c74..dc04416865dd 100644 > --- a/drivers/net/dwc_eth_qos.c > +++ b/drivers/net/dwc_eth_qos.c > @@ -1712,6 +1712,10 @@ static const struct udevice_id eqos_ids[] = { > .compatible = "rockchip,rk3568-gmac", > .data = (ulong)_rockchip_config > }, > + { > + .compatible = "rockchip,rk3588-gmac", > + .data = (ulong)_rockchip_config > + }, > #endif > #if IS_ENABLED(CONFIG_DWC_ETH_QOS_QCOM) > { > diff --git a/drivers/net/dwc_eth_qos_rockchip.c > b/drivers/net/dwc_eth_qos_rockchip.c > index 05edc098f50d..20fd3a25c3dd 100644 > --- a/drivers/net/dwc_eth_qos_rockchip.c > +++ b/drivers/net/dwc_eth_qos_rockchip.c > @@ -28,6 +28,7 @@ struct rk_gmac_ops { > int tx_delay, int rx_delay); > int (*set_to_rmii)(struct udevice *dev); > int (*set_gmac_speed)(struct udevice *dev); > + void (*set_clock_selection)(struct udevice *dev, bool enable); > u32 regs[3]; > }; > > @@ -35,7 +36,9 @@ struct rockchip_platform_data { > struct reset_ctl_bulk resets; > const struct rk_gmac_ops *ops; > int id; > + bool clock_input; > struct regmap *grf; > + struct regmap *php_grf; > }; > > #define HIWORD_UPDATE(val, mask, shift) \ > @@ -129,6 +132,137 @@ static int rk3568_set_gmac_speed(struct udevice *dev) > return 0; > } > > +/* sys_grf */ > +#define RK3588_GRF_GMAC_CON7 0x031c > +#define RK3588_GRF_GMAC_CON8 0x0320 > +#define RK3588_GRF_GMAC_CON9 0x0324 > + > +#define RK3588_GMAC_RXCLK_DLY_ENABLE(id) GRF_BIT(2 * (id) + 3) > +#define RK3588_GMAC_RXCLK_DLY_DISABLE(id) GRF_CLR_BIT(2 * (id) + 3) > +#define RK3588_GMAC_TXCLK_DLY_ENABLE(id) GRF_BIT(2 * (id) + 2) > +#define RK3588_GMAC_TXCLK_DLY_DISABLE(id) GRF_CLR_BIT(2 * (id) + 2) > + > +#define RK3588_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0xFF, 8) > +#define RK3588_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0xFF, 0) > + > +/* php_grf */ > +#define RK3588_GRF_GMAC_CON0 0x0008 > +#define RK3588_GRF_CLK_CON10x0070 > + > +#define RK3588_GMAC_PHY_INTF_SEL_RGMII(id) \ > + (GRF_BIT(3 + (id) * 6) | GRF_CLR_BIT(4 + (id) * 6) | GRF_CLR_BIT(5 + > (id) * 6)) > +#define RK3588_GMAC_PHY_INTF_SEL_RMII(id) \ > + (GRF_CLR_BIT(3 + (id) * 6) | GRF_CLR_BIT(4 + (id) * 6) | GRF_BIT(5 + > (id) * 6)) > + > +#define RK3588_GMAC_CLK_RMII_MODE(id) GRF_BIT(5 * (id)) > +#define RK3588_GMAC_CLK_RGMII_MODE(id) GRF_CLR_BIT(5 * (id)) > + > +#define RK3588_GMAC_CLK_SELET_CRU(id) GRF_BIT(5 * (id) + 4) > +#define RK3588_GMAC_CLK_SELET_IO(id) GRF_CLR_BIT(5 * (id) + 4) > + > +#define RK3588_GMAC_CLK_RMII_DIV2(id) GRF_BIT(5 * (id) + 2) > +#define RK3588_GMAC_CLK_RMII_DIV20(id) GRF_CLR_BIT(5 * (id) + 2) > + > +#define RK3588_GMAC_CLK_RGMII_DIV1(id) \ > + (GRF_CLR_BIT(5 * (id) + 2) | GRF_CLR_BIT(5 * (id) + > 3)) > +#define RK3588_GMAC_CLK_RGMII_DIV5(id) \ > + (GRF_BIT(5 * (id) + 2) | GRF_BIT(5 * (id) + 3)) > +#define RK3588_GMAC_CLK_RGMII_DIV50(id)\ > + (GRF_CLR_BIT(5 * (id) + 2) | GRF_BIT(5 * (id) + 3)) > + > +#define RK3588_GMAC_CLK_RMII_GATE(id) GRF_BIT(5 * (id) + 1) > +#define RK3588_GMAC_CLK_RMII_NOGATE(id)GRF_CLR_BIT(5 * (id) > + 1) > + > +static int rk3588_set_to_rgmii(struct udevice *dev, > + int tx_delay, int rx_delay) > +{ > + struct eth_pdata *pdata = dev_get_plat(dev); > + struct rockchip_platform_data *data = pdata->priv_pdata; > + u32 offset_con, id = data->id; > + > + offset_con = data->id == 1 ? RK3588_GRF_GMAC_CON9 : > +RK3588_GRF_GMAC_CON8; > + > + regmap_write(data->php_grf, RK3588_GRF_GMAC_CON0, > +RK3588_GMAC_PHY_INTF_SEL_RGMII(id)); > + > + regmap_write(data->php_grf, RK3588_GRF_CLK_CON1, > +RK3588_GMAC_CLK_RGMII_MODE(id)); > + > + regmap_write(data->grf, RK3588_GRF_GMAC_CON7, > +
Re: [PATCH v2 5/7] net: dwc_eth_qos_rockchip: Add support for RK3588
Hi, On Sun, Oct 01, 2023 at 07:17:20PM +, Jonas Karlman wrote: > Add rk_gmac_ops and other special handling that is needed for GMAC to > work on RK3588. > > rk_gmac_ops was ported from linux commits: > 2f2b60a0ec28 ("net: ethernet: stmmac: dwmac-rk: Add gmac support for rk3588") > 88619e77b33d ("net: stmmac: rk3588: Allow multiple gmac controller") > > Signed-off-by: Jonas Karlman > Reviewed-by: Kever Yang > --- > Cc: David Wu > Cc: Sebastian Reichel > Cc: Benjamin Gaignard > --- Looks like I've send my R-b to v1 while you were preparing v2. Since nothing changed this is still: Reviewed-by: Sebastian Reichel Greetings, -- Sebastian > v2: > - Collect r-b tag > > drivers/net/dwc_eth_qos.c | 4 + > drivers/net/dwc_eth_qos_rockchip.c | 182 - > 2 files changed, 182 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/dwc_eth_qos.c b/drivers/net/dwc_eth_qos.c > index 9fb98a2c3c74..dc04416865dd 100644 > --- a/drivers/net/dwc_eth_qos.c > +++ b/drivers/net/dwc_eth_qos.c > @@ -1712,6 +1712,10 @@ static const struct udevice_id eqos_ids[] = { > .compatible = "rockchip,rk3568-gmac", > .data = (ulong)_rockchip_config > }, > + { > + .compatible = "rockchip,rk3588-gmac", > + .data = (ulong)_rockchip_config > + }, > #endif > #if IS_ENABLED(CONFIG_DWC_ETH_QOS_QCOM) > { > diff --git a/drivers/net/dwc_eth_qos_rockchip.c > b/drivers/net/dwc_eth_qos_rockchip.c > index 05edc098f50d..20fd3a25c3dd 100644 > --- a/drivers/net/dwc_eth_qos_rockchip.c > +++ b/drivers/net/dwc_eth_qos_rockchip.c > @@ -28,6 +28,7 @@ struct rk_gmac_ops { > int tx_delay, int rx_delay); > int (*set_to_rmii)(struct udevice *dev); > int (*set_gmac_speed)(struct udevice *dev); > + void (*set_clock_selection)(struct udevice *dev, bool enable); > u32 regs[3]; > }; > > @@ -35,7 +36,9 @@ struct rockchip_platform_data { > struct reset_ctl_bulk resets; > const struct rk_gmac_ops *ops; > int id; > + bool clock_input; > struct regmap *grf; > + struct regmap *php_grf; > }; > > #define HIWORD_UPDATE(val, mask, shift) \ > @@ -129,6 +132,137 @@ static int rk3568_set_gmac_speed(struct udevice *dev) > return 0; > } > > +/* sys_grf */ > +#define RK3588_GRF_GMAC_CON7 0x031c > +#define RK3588_GRF_GMAC_CON8 0x0320 > +#define RK3588_GRF_GMAC_CON9 0x0324 > + > +#define RK3588_GMAC_RXCLK_DLY_ENABLE(id) GRF_BIT(2 * (id) + 3) > +#define RK3588_GMAC_RXCLK_DLY_DISABLE(id)GRF_CLR_BIT(2 * (id) + 3) > +#define RK3588_GMAC_TXCLK_DLY_ENABLE(id) GRF_BIT(2 * (id) + 2) > +#define RK3588_GMAC_TXCLK_DLY_DISABLE(id)GRF_CLR_BIT(2 * (id) + 2) > + > +#define RK3588_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, > 0xFF, 8) > +#define RK3588_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, > 0xFF, 0) > + > +/* php_grf */ > +#define RK3588_GRF_GMAC_CON0 0x0008 > +#define RK3588_GRF_CLK_CON1 0x0070 > + > +#define RK3588_GMAC_PHY_INTF_SEL_RGMII(id) \ > + (GRF_BIT(3 + (id) * 6) | GRF_CLR_BIT(4 + (id) * 6) | GRF_CLR_BIT(5 + > (id) * 6)) > +#define RK3588_GMAC_PHY_INTF_SEL_RMII(id)\ > + (GRF_CLR_BIT(3 + (id) * 6) | GRF_CLR_BIT(4 + (id) * 6) | GRF_BIT(5 + > (id) * 6)) > + > +#define RK3588_GMAC_CLK_RMII_MODE(id)GRF_BIT(5 * (id)) > +#define RK3588_GMAC_CLK_RGMII_MODE(id) GRF_CLR_BIT(5 * (id)) > + > +#define RK3588_GMAC_CLK_SELET_CRU(id)GRF_BIT(5 * (id) + 4) > +#define RK3588_GMAC_CLK_SELET_IO(id) GRF_CLR_BIT(5 * (id) + 4) > + > +#define RK3588_GMAC_CLK_RMII_DIV2(id)GRF_BIT(5 * (id) + 2) > +#define RK3588_GMAC_CLK_RMII_DIV20(id) GRF_CLR_BIT(5 * (id) + > 2) > + > +#define RK3588_GMAC_CLK_RGMII_DIV1(id) \ > + (GRF_CLR_BIT(5 * (id) + 2) | GRF_CLR_BIT(5 * (id) + 3)) > +#define RK3588_GMAC_CLK_RGMII_DIV5(id) \ > + (GRF_BIT(5 * (id) + 2) | GRF_BIT(5 * (id) + 3)) > +#define RK3588_GMAC_CLK_RGMII_DIV50(id) \ > + (GRF_CLR_BIT(5 * (id) + 2) | GRF_BIT(5 * (id) + 3)) > + > +#define RK3588_GMAC_CLK_RMII_GATE(id)GRF_BIT(5 * (id) + 1) > +#define RK3588_GMAC_CLK_RMII_NOGATE(id) GRF_CLR_BIT(5 * (id) + > 1) > + > +static int rk3588_set_to_rgmii(struct udevice *dev, > +int tx_delay, int rx_delay) > +{ > + struct eth_pdata *pdata = dev_get_plat(dev); > + struct rockchip_platform_data *data = pdata->priv_pdata; > + u32 offset_con, id = data->id; > + > + offset_con = data->id == 1 ? RK3588_GRF_GMAC_CON9 : > + RK3588_GRF_GMAC_CON8; > + > + regmap_write(data->php_grf, RK3588_GRF_GMAC_CON0, > + RK3588_GMAC_PHY_INTF_SEL_RGMII(id)); > + > +
[PATCH v2 5/7] net: dwc_eth_qos_rockchip: Add support for RK3588
Add rk_gmac_ops and other special handling that is needed for GMAC to work on RK3588. rk_gmac_ops was ported from linux commits: 2f2b60a0ec28 ("net: ethernet: stmmac: dwmac-rk: Add gmac support for rk3588") 88619e77b33d ("net: stmmac: rk3588: Allow multiple gmac controller") Signed-off-by: Jonas Karlman Reviewed-by: Kever Yang --- Cc: David Wu Cc: Sebastian Reichel Cc: Benjamin Gaignard --- v2: - Collect r-b tag drivers/net/dwc_eth_qos.c | 4 + drivers/net/dwc_eth_qos_rockchip.c | 182 - 2 files changed, 182 insertions(+), 4 deletions(-) diff --git a/drivers/net/dwc_eth_qos.c b/drivers/net/dwc_eth_qos.c index 9fb98a2c3c74..dc04416865dd 100644 --- a/drivers/net/dwc_eth_qos.c +++ b/drivers/net/dwc_eth_qos.c @@ -1712,6 +1712,10 @@ static const struct udevice_id eqos_ids[] = { .compatible = "rockchip,rk3568-gmac", .data = (ulong)_rockchip_config }, + { + .compatible = "rockchip,rk3588-gmac", + .data = (ulong)_rockchip_config + }, #endif #if IS_ENABLED(CONFIG_DWC_ETH_QOS_QCOM) { diff --git a/drivers/net/dwc_eth_qos_rockchip.c b/drivers/net/dwc_eth_qos_rockchip.c index 05edc098f50d..20fd3a25c3dd 100644 --- a/drivers/net/dwc_eth_qos_rockchip.c +++ b/drivers/net/dwc_eth_qos_rockchip.c @@ -28,6 +28,7 @@ struct rk_gmac_ops { int tx_delay, int rx_delay); int (*set_to_rmii)(struct udevice *dev); int (*set_gmac_speed)(struct udevice *dev); + void (*set_clock_selection)(struct udevice *dev, bool enable); u32 regs[3]; }; @@ -35,7 +36,9 @@ struct rockchip_platform_data { struct reset_ctl_bulk resets; const struct rk_gmac_ops *ops; int id; + bool clock_input; struct regmap *grf; + struct regmap *php_grf; }; #define HIWORD_UPDATE(val, mask, shift) \ @@ -129,6 +132,137 @@ static int rk3568_set_gmac_speed(struct udevice *dev) return 0; } +/* sys_grf */ +#define RK3588_GRF_GMAC_CON7 0x031c +#define RK3588_GRF_GMAC_CON8 0x0320 +#define RK3588_GRF_GMAC_CON9 0x0324 + +#define RK3588_GMAC_RXCLK_DLY_ENABLE(id) GRF_BIT(2 * (id) + 3) +#define RK3588_GMAC_RXCLK_DLY_DISABLE(id) GRF_CLR_BIT(2 * (id) + 3) +#define RK3588_GMAC_TXCLK_DLY_ENABLE(id) GRF_BIT(2 * (id) + 2) +#define RK3588_GMAC_TXCLK_DLY_DISABLE(id) GRF_CLR_BIT(2 * (id) + 2) + +#define RK3588_GMAC_CLK_RX_DL_CFG(val) HIWORD_UPDATE(val, 0xFF, 8) +#define RK3588_GMAC_CLK_TX_DL_CFG(val) HIWORD_UPDATE(val, 0xFF, 0) + +/* php_grf */ +#define RK3588_GRF_GMAC_CON0 0x0008 +#define RK3588_GRF_CLK_CON10x0070 + +#define RK3588_GMAC_PHY_INTF_SEL_RGMII(id) \ + (GRF_BIT(3 + (id) * 6) | GRF_CLR_BIT(4 + (id) * 6) | GRF_CLR_BIT(5 + (id) * 6)) +#define RK3588_GMAC_PHY_INTF_SEL_RMII(id) \ + (GRF_CLR_BIT(3 + (id) * 6) | GRF_CLR_BIT(4 + (id) * 6) | GRF_BIT(5 + (id) * 6)) + +#define RK3588_GMAC_CLK_RMII_MODE(id) GRF_BIT(5 * (id)) +#define RK3588_GMAC_CLK_RGMII_MODE(id) GRF_CLR_BIT(5 * (id)) + +#define RK3588_GMAC_CLK_SELET_CRU(id) GRF_BIT(5 * (id) + 4) +#define RK3588_GMAC_CLK_SELET_IO(id) GRF_CLR_BIT(5 * (id) + 4) + +#define RK3588_GMAC_CLK_RMII_DIV2(id) GRF_BIT(5 * (id) + 2) +#define RK3588_GMAC_CLK_RMII_DIV20(id) GRF_CLR_BIT(5 * (id) + 2) + +#define RK3588_GMAC_CLK_RGMII_DIV1(id) \ + (GRF_CLR_BIT(5 * (id) + 2) | GRF_CLR_BIT(5 * (id) + 3)) +#define RK3588_GMAC_CLK_RGMII_DIV5(id) \ + (GRF_BIT(5 * (id) + 2) | GRF_BIT(5 * (id) + 3)) +#define RK3588_GMAC_CLK_RGMII_DIV50(id)\ + (GRF_CLR_BIT(5 * (id) + 2) | GRF_BIT(5 * (id) + 3)) + +#define RK3588_GMAC_CLK_RMII_GATE(id) GRF_BIT(5 * (id) + 1) +#define RK3588_GMAC_CLK_RMII_NOGATE(id)GRF_CLR_BIT(5 * (id) + 1) + +static int rk3588_set_to_rgmii(struct udevice *dev, + int tx_delay, int rx_delay) +{ + struct eth_pdata *pdata = dev_get_plat(dev); + struct rockchip_platform_data *data = pdata->priv_pdata; + u32 offset_con, id = data->id; + + offset_con = data->id == 1 ? RK3588_GRF_GMAC_CON9 : +RK3588_GRF_GMAC_CON8; + + regmap_write(data->php_grf, RK3588_GRF_GMAC_CON0, +RK3588_GMAC_PHY_INTF_SEL_RGMII(id)); + + regmap_write(data->php_grf, RK3588_GRF_CLK_CON1, +RK3588_GMAC_CLK_RGMII_MODE(id)); + + regmap_write(data->grf, RK3588_GRF_GMAC_CON7, +RK3588_GMAC_RXCLK_DLY_ENABLE(id) | +RK3588_GMAC_TXCLK_DLY_ENABLE(id)); + + regmap_write(data->grf, offset_con, +RK3588_GMAC_CLK_RX_DL_CFG(rx_delay) | +RK3588_GMAC_CLK_TX_DL_CFG(tx_delay)); + + return 0; +} +