[U-Boot] [PATCH v1 15/41] net: mvpp2: introduce PPv2.2 HW descriptors and adapt accessors

Joe Hershberger joe.hershberger at gmail.com
Tue Mar 21 17:13:56 UTC 2017


On Tue, Mar 21, 2017 at 9:27 AM, Stefan Roese <sr at denx.de> wrote:
> From: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
>
> This commit adds the definition of the PPv2.2 HW descriptors, adjusts
> the mvpp2_tx_desc and mvpp2_rx_desc structures accordingly, and adapts
> the accessors to work on both PPv2.1 and PPv2.2.
>
> Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
> Signed-off-by: Stefan Roese <sr at denx.de>

Acked-by: Joe Hershberger <joe.hershberger at ni.com>

> ---
>
>  drivers/net/mvpp2.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 65 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/net/mvpp2.c b/drivers/net/mvpp2.c
> index 537ca8cbb4..c460ba2112 100644
> --- a/drivers/net/mvpp2.c
> +++ b/drivers/net/mvpp2.c
> @@ -825,18 +825,42 @@ struct mvpp21_rx_desc {
>         u32 reserved8;
>  };
>
> +/* HW TX descriptor for PPv2.2 */
> +struct mvpp22_tx_desc {
> +       u32 command;
> +       u8  packet_offset;
> +       u8  phys_txq;
> +       u16 data_size;
> +       u64 reserved1;
> +       u64 buf_dma_addr_ptp;
> +       u64 buf_cookie_misc;
> +};
> +
> +/* HW RX descriptor for PPv2.2 */
> +struct mvpp22_rx_desc {
> +       u32 status;
> +       u16 reserved1;
> +       u16 data_size;
> +       u32 reserved2;
> +       u32 reserved3;
> +       u64 buf_dma_addr_key_hash;
> +       u64 buf_cookie_misc;
> +};
> +
>  /* Opaque type used by the driver to manipulate the HW TX and RX
>   * descriptors
>   */
>  struct mvpp2_tx_desc {
>         union {
>                 struct mvpp21_tx_desc pp21;
> +               struct mvpp22_tx_desc pp22;
>         };
>  };
>
>  struct mvpp2_rx_desc {
>         union {
>                 struct mvpp21_rx_desc pp21;
> +               struct mvpp22_rx_desc pp22;
>         };
>  };
>
> @@ -1040,59 +1064,91 @@ static void mvpp2_txdesc_dma_addr_set(struct mvpp2_port *port,
>                                       struct mvpp2_tx_desc *tx_desc,
>                                       dma_addr_t dma_addr)
>  {
> -       tx_desc->pp21.buf_dma_addr = dma_addr;
> +       if (port->priv->hw_version == MVPP21) {
> +               tx_desc->pp21.buf_dma_addr = dma_addr;
> +       } else {
> +               u64 val = (u64)dma_addr;
> +
> +               tx_desc->pp22.buf_dma_addr_ptp &= ~GENMASK_ULL(40, 0);
> +               tx_desc->pp22.buf_dma_addr_ptp |= val;
> +       }
>  }
>
>  static void mvpp2_txdesc_size_set(struct mvpp2_port *port,
>                                   struct mvpp2_tx_desc *tx_desc,
>                                   size_t size)
>  {
> -       tx_desc->pp21.data_size = size;
> +       if (port->priv->hw_version == MVPP21)
> +               tx_desc->pp21.data_size = size;
> +       else
> +               tx_desc->pp22.data_size = size;
>  }
>
>  static void mvpp2_txdesc_txq_set(struct mvpp2_port *port,
>                                  struct mvpp2_tx_desc *tx_desc,
>                                  unsigned int txq)
>  {
> -       tx_desc->pp21.phys_txq = txq;
> +       if (port->priv->hw_version == MVPP21)
> +               tx_desc->pp21.phys_txq = txq;
> +       else
> +               tx_desc->pp22.phys_txq = txq;
>  }
>
>  static void mvpp2_txdesc_cmd_set(struct mvpp2_port *port,
>                                  struct mvpp2_tx_desc *tx_desc,
>                                  unsigned int command)
>  {
> -       tx_desc->pp21.command = command;
> +       if (port->priv->hw_version == MVPP21)
> +               tx_desc->pp21.command = command;
> +       else
> +               tx_desc->pp22.command = command;
>  }
>
>  static void mvpp2_txdesc_offset_set(struct mvpp2_port *port,
>                                     struct mvpp2_tx_desc *tx_desc,
>                                     unsigned int offset)
>  {
> -       tx_desc->pp21.packet_offset = offset;
> +       if (port->priv->hw_version == MVPP21)
> +               tx_desc->pp21.packet_offset = offset;
> +       else
> +               tx_desc->pp22.packet_offset = offset;
>  }
>
>  static dma_addr_t mvpp2_rxdesc_dma_addr_get(struct mvpp2_port *port,
>                                             struct mvpp2_rx_desc *rx_desc)
>  {
> -       return rx_desc->pp21.buf_dma_addr;
> +       if (port->priv->hw_version == MVPP21)
> +               return rx_desc->pp21.buf_dma_addr;
> +       else
> +               return rx_desc->pp22.buf_dma_addr_key_hash & GENMASK_ULL(40, 0);
>  }
>
>  static unsigned long mvpp2_rxdesc_cookie_get(struct mvpp2_port *port,
>                                              struct mvpp2_rx_desc *rx_desc)
>  {
> -       return rx_desc->pp21.buf_cookie;
> +       if (port->priv->hw_version == MVPP21) {
> +               return rx_desc->pp21.buf_cookie;
> +       } else {
> +               return rx_desc->pp22.buf_cookie_misc & GENMASK_ULL(40, 0);
> +       }

The braces look like something that checkpatch might complain about
(unnecessary one-line if), but I assume you ran that (using patman,
right!?). Also inconsistent with the other functions.

If there ends up being a v2, then maybe clean this up, otherwise, whatever.

>  }
>
>  static size_t mvpp2_rxdesc_size_get(struct mvpp2_port *port,
>                                     struct mvpp2_rx_desc *rx_desc)
>  {
> -       return rx_desc->pp21.data_size;
> +       if (port->priv->hw_version == MVPP21)
> +               return rx_desc->pp21.data_size;
> +       else
> +               return rx_desc->pp22.data_size;
>  }
>
>  static u32 mvpp2_rxdesc_status_get(struct mvpp2_port *port,
>                                    struct mvpp2_rx_desc *rx_desc)
>  {
> -       return rx_desc->pp21.status;
> +       if (port->priv->hw_version == MVPP21)
> +               return rx_desc->pp21.status;
> +       else
> +               return rx_desc->pp22.status;
>  }
>
>  static void mvpp2_txq_inc_get(struct mvpp2_txq_pcpu *txq_pcpu)
> --
> 2.12.0
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot


More information about the U-Boot mailing list