[PATCH v1 02/10] net: mvpp2: add CP115 port1 10G/5G SFI support

Ramon Fried rfried.dev at gmail.com
Thu Apr 29 22:20:00 CEST 2021


On Tue, Apr 27, 2021 at 4:27 PM Stefan Roese <sr at denx.de> wrote:
>
> From: Stefan Chulski <stefanc at marvell.com>
>
> 1. Differ between Port1 RGMII and SFI modes in Netcomplex config.
> 2. Remove XPCS config from SFI mode.
>    Port1 doesn't XPCS domain, XPCS config should be removed.
>    Access to Port1 XPCS can cause stall.
> 3. Add Port1 MPCS configurations.
>
> Signed-off-by: Stefan Chulski <stefanc at marvell.com>
> Signed-off-by: Stefan Roese <sr at denx.de>
> ---
>
>  drivers/net/mvpp2.c | 75 ++++++++++-----------------------------------
>  1 file changed, 17 insertions(+), 58 deletions(-)
>
> diff --git a/drivers/net/mvpp2.c b/drivers/net/mvpp2.c
> index 1cf522b8fe57..015f5329de74 100644
> --- a/drivers/net/mvpp2.c
> +++ b/drivers/net/mvpp2.c
> @@ -520,8 +520,9 @@ do {                                                                        \
>  /* Net Complex */
>  enum mv_netc_topology {
>         MV_NETC_GE_MAC2_SGMII           =       BIT(0),
> -       MV_NETC_GE_MAC3_SGMII           =       BIT(1),
> -       MV_NETC_GE_MAC3_RGMII           =       BIT(2),
> +       MV_NETC_GE_MAC2_RGMII           =       BIT(1),
> +       MV_NETC_GE_MAC3_SGMII           =       BIT(2),
> +       MV_NETC_GE_MAC3_RGMII           =       BIT(3),
>  };
>
>  enum mv_netc_phase {
> @@ -3208,56 +3209,31 @@ static int gop_gpcs_reset(struct mvpp2_port *port, int reset)
>         return 0;
>  }
>
> -/* Set the internal mux's to the required PCS in the PI */
> -static int gop_xpcs_mode(struct mvpp2_port *port, int num_of_lanes)
> -{
> -       u32 val;
> -       int lane;
> -
> -       switch (num_of_lanes) {
> -       case 1:
> -               lane = 0;
> -               break;
> -       case 2:
> -               lane = 1;
> -               break;
> -       case 4:
> -               lane = 2;
> -               break;
> -       default:
> -               return -1;
> -       }
> -
> -       /* configure XG MAC mode */
> -       val = readl(port->priv->xpcs_base + MVPP22_XPCS_GLOBAL_CFG_0_REG);
> -       val &= ~MVPP22_XPCS_PCSMODE_MASK;
> -       val &= ~MVPP22_XPCS_LANEACTIVE_MASK;
> -       val |= (2 * lane) << MVPP22_XPCS_LANEACTIVE_OFFS;
> -       writel(val, port->priv->xpcs_base + MVPP22_XPCS_GLOBAL_CFG_0_REG);
> -
> -       return 0;
> -}
> -
>  static int gop_mpcs_mode(struct mvpp2_port *port)
>  {
>         u32 val;
>
>         /* configure PCS40G COMMON CONTROL */
> -       val = readl(port->priv->mpcs_base + PCS40G_COMMON_CONTROL);
> +       val = readl(port->priv->mpcs_base + port->gop_id * MVPP22_PORT_OFFSET +
> +                   PCS40G_COMMON_CONTROL);
>         val &= ~FORWARD_ERROR_CORRECTION_MASK;
> -       writel(val, port->priv->mpcs_base + PCS40G_COMMON_CONTROL);
> +       writel(val, port->priv->mpcs_base + port->gop_id * MVPP22_PORT_OFFSET +
> +              PCS40G_COMMON_CONTROL);
>
>         /* configure PCS CLOCK RESET */
> -       val = readl(port->priv->mpcs_base + PCS_CLOCK_RESET);
> +       val = readl(port->priv->mpcs_base + port->gop_id * MVPP22_PORT_OFFSET +
> +                   PCS_CLOCK_RESET);
>         val &= ~CLK_DIVISION_RATIO_MASK;
>         val |= 1 << CLK_DIVISION_RATIO_OFFS;
> -       writel(val, port->priv->mpcs_base + PCS_CLOCK_RESET);
> +       writel(val, port->priv->mpcs_base + port->gop_id * MVPP22_PORT_OFFSET +
> +              PCS_CLOCK_RESET);
>
>         val &= ~CLK_DIV_PHASE_SET_MASK;
>         val |= MAC_CLK_RESET_MASK;
>         val |= RX_SD_CLK_RESET_MASK;
>         val |= TX_SD_CLK_RESET_MASK;
> -       writel(val, port->priv->mpcs_base + PCS_CLOCK_RESET);
> +       writel(val, port->priv->mpcs_base + port->gop_id * MVPP22_PORT_OFFSET +
> +              PCS_CLOCK_RESET);
>
>         return 0;
>  }
> @@ -3300,22 +3276,6 @@ static int gop_xlg_mac_mode_cfg(struct mvpp2_port *port, int num_of_act_lanes)
>         return 0;
>  }
>
> -/* Set PCS to reset or exit from reset */
> -static int gop_xpcs_reset(struct mvpp2_port *port, int reset)
> -{
> -       u32 val;
> -
> -       /* read - modify - write */
> -       val = readl(port->priv->xpcs_base + MVPP22_XPCS_GLOBAL_CFG_0_REG);
> -       if (reset)
> -               val &= ~MVPP22_XPCS_PCSRESET;
> -       else
> -               val |= MVPP22_XPCS_PCSRESET;
> -       writel(val, port->priv->xpcs_base + MVPP22_XPCS_GLOBAL_CFG_0_REG);
> -
> -       return 0;
> -}
> -
>  /* Set the MAC to reset or exit from reset */
>  static int gop_xlg_mac_reset(struct mvpp2_port *port, int reset)
>  {
> @@ -3387,14 +3347,10 @@ static int gop_port_init(struct mvpp2_port *port)
>                 num_of_act_lanes = 2;
>                 mac_num = 0;
>                 /* configure PCS */
> -               gop_xpcs_mode(port, num_of_act_lanes);
>                 gop_mpcs_mode(port);
>                 /* configure MAC */
>                 gop_xlg_mac_mode_cfg(port, num_of_act_lanes);
>
> -               /* pcs unreset */
> -               gop_xpcs_reset(port, 0);
> -
>                 /* mac unreset */
>                 gop_xlg_mac_reset(port, 0);
>                 break;
> @@ -3465,6 +3421,9 @@ static u32 mvpp2_netc_cfg_create(int gop_id, phy_interface_t phy_type)
>         if (gop_id == 2) {
>                 if (phy_type == PHY_INTERFACE_MODE_SGMII)
>                         val |= MV_NETC_GE_MAC2_SGMII;
> +               else if (phy_type == PHY_INTERFACE_MODE_RGMII ||
> +                        phy_type == PHY_INTERFACE_MODE_RGMII_ID)
> +                       val |= MV_NETC_GE_MAC2_RGMII;
>         }
>
>         if (gop_id == 3) {
> @@ -3656,7 +3615,7 @@ static int gop_netc_init(struct mvpp2 *priv, enum mv_netc_phase phase)
>
>         if (c & MV_NETC_GE_MAC2_SGMII)
>                 gop_netc_mac_to_sgmii(priv, 2, phase);
> -       else
> +       else if (c & MV_NETC_GE_MAC2_RGMII)
>                 gop_netc_mac_to_xgmii(priv, 2, phase);
>
>         if (c & MV_NETC_GE_MAC3_SGMII) {
> --
> 2.31.1
>
Reviewed-by: Ramon Fried <rfried.dev at gmail.com>


More information about the U-Boot mailing list