[PATCH 0/2] net: xilinx: axi_emac: Add 64bit support

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH 0/2] net: xilinx: axi_emac: Add 64bit support

Michal Simek-3
Hi,

these two patches are extending axi emac driver to support 64bit systems.

Thanks,
Michal


Ashok Reddy Soma (2):
  net: xilinx: axi_emac: Fix dma descriptors for 64bit and compilation
    warnings
  net: xilinx: axi_emac: Typecast flush_cache arguments

 drivers/net/xilinx_axi_emac.c | 48 ++++++++++++++++++++++-------------
 1 file changed, 30 insertions(+), 18 deletions(-)

--
2.28.0

Reply | Threaded
Open this post in threaded view
|

[PATCH 1/2] net: xilinx: axi_emac: Fix dma descriptors for 64bit and compilation warnings

Michal Simek-3
From: Ashok Reddy Soma <[hidden email]>

There are compilation warnings showing up when we compile AXI ethernet
driver for 64bit architectures. Fix them, so that it works on both 32
and 64 bit architectures.

DMA descriptors are not taking care of 64bit addresses. To fix it,
change axidma_bd members as below:

next ==> next_desc
reserverd1 ==> next_desc_msb
phys ==> buf_addr
reserverd2 ==> buf_addr_msb

and update next_desc and buf_addr with lower 32 bits of the addresses,
update next_desc_msb and buf_addr_msb with upper 32 bits of the 64bit
addresses.

Signed-off-by: Ashok Reddy Soma <[hidden email]>
Signed-off-by: Michal Simek <[hidden email]>
---

 drivers/net/xilinx_axi_emac.c | 36 +++++++++++++++++++++++------------
 1 file changed, 24 insertions(+), 12 deletions(-)

diff --git a/drivers/net/xilinx_axi_emac.c b/drivers/net/xilinx_axi_emac.c
index 99d4d85c5270..c56c4d0d83e4 100644
--- a/drivers/net/xilinx_axi_emac.c
+++ b/drivers/net/xilinx_axi_emac.c
@@ -101,10 +101,10 @@ struct axidma_priv {
 
 /* BD descriptors */
 struct axidma_bd {
- u32 next; /* Next descriptor pointer */
- u32 reserved1;
- u32 phys; /* Buffer address */
- u32 reserved2;
+ u32 next_desc; /* Next descriptor pointer */
+ u32 next_desc_msb;
+ u32 buf_addr; /* Buffer address */
+ u32 buf_addr_msb;
  u32 reserved3;
  u32 reserved4;
  u32 cntrl; /* Control */
@@ -182,7 +182,7 @@ static inline int mdio_wait(struct axi_regs *regs)
 static inline void axienet_dma_write(struct axidma_bd *bd, u32 *desc)
 {
 #if defined(CONFIG_PHYS_64BIT)
- writeq(bd, desc);
+ writeq((unsigned long)bd, desc);
 #else
  writel((u32)bd, desc);
 #endif
@@ -492,8 +492,12 @@ static int axiemac_start(struct udevice *dev)
 
  /* Setup the BD. */
  memset(&rx_bd, 0, sizeof(rx_bd));
- rx_bd.next = (u32)&rx_bd;
- rx_bd.phys = (u32)&rxframe;
+ rx_bd.next_desc = lower_32_bits((unsigned long)&rx_bd);
+ rx_bd.buf_addr = lower_32_bits((unsigned long)&rxframe);
+#if defined(CONFIG_PHYS_64BIT)
+ rx_bd.next_desc_msb = upper_32_bits((unsigned long)&rx_bd);
+ rx_bd.buf_addr_msb = upper_32_bits((unsigned long)&rxframe);
+#endif
  rx_bd.cntrl = sizeof(rxframe);
  /* Flush the last BD so DMA core could see the updates */
  flush_cache((u32)&rx_bd, sizeof(rx_bd));
@@ -539,8 +543,12 @@ static int axiemac_send(struct udevice *dev, void *ptr, int len)
  /* Setup Tx BD */
  memset(&tx_bd, 0, sizeof(tx_bd));
  /* At the end of the ring, link the last BD back to the top */
- tx_bd.next = (u32)&tx_bd;
- tx_bd.phys = (u32)ptr;
+ tx_bd.next_desc = lower_32_bits((unsigned long)&tx_bd);
+ tx_bd.buf_addr = lower_32_bits((unsigned long)ptr);
+#if defined(CONFIG_PHYS_64BIT)
+ tx_bd.next_desc_msb = upper_32_bits((unsigned long)&tx_bd);
+ tx_bd.buf_addr_msb = upper_32_bits((unsigned long)ptr);
+#endif
  /* Save len */
  tx_bd.cntrl = len | XAXIDMA_BD_CTRL_TXSOF_MASK |
  XAXIDMA_BD_CTRL_TXEOF_MASK;
@@ -637,8 +645,12 @@ static int axiemac_free_pkt(struct udevice *dev, uchar *packet, int length)
  /* Setup RxBD */
  /* Clear the whole buffer and setup it again - all flags are cleared */
  memset(&rx_bd, 0, sizeof(rx_bd));
- rx_bd.next = (u32)&rx_bd;
- rx_bd.phys = (u32)&rxframe;
+ rx_bd.next_desc = lower_32_bits((unsigned long)&rx_bd);
+ rx_bd.buf_addr = lower_32_bits((unsigned long)&rxframe);
+#if defined(CONFIG_PHYS_64BIT)
+ rx_bd.next_desc_msb = upper_32_bits((unsigned long)&rx_bd);
+ rx_bd.buf_addr_msb = upper_32_bits((unsigned long)&rxframe);
+#endif
  rx_bd.cntrl = sizeof(rxframe);
 
  /* Write bd to HW */
@@ -738,7 +750,7 @@ static int axi_emac_ofdata_to_platdata(struct udevice *dev)
  return -EINVAL;
  }
  /* RX channel offset is 0x30 */
- priv->dmarx = (struct axidma_reg *)((u32)priv->dmatx + 0x30);
+ priv->dmarx = (struct axidma_reg *)((phys_addr_t)priv->dmatx + 0x30);
 
  priv->phyaddr = -1;
 
--
2.28.0

Reply | Threaded
Open this post in threaded view
|

[PATCH 2/2] net: xilinx: axi_emac: Typecast flush_cache arguments

Michal Simek-3
In reply to this post by Michal Simek-3
From: Ashok Reddy Soma <[hidden email]>

flush_cache() arguments are not type casted to take care of 64 bit
systems. Use phys_addr_t to type cast for it to work properly for 32 bit
and 64 bit systems.

Signed-off-by: Ashok Reddy Soma <[hidden email]>
Signed-off-by: Michal Simek <[hidden email]>
---

 drivers/net/xilinx_axi_emac.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/net/xilinx_axi_emac.c b/drivers/net/xilinx_axi_emac.c
index c56c4d0d83e4..8af371120462 100644
--- a/drivers/net/xilinx_axi_emac.c
+++ b/drivers/net/xilinx_axi_emac.c
@@ -500,11 +500,11 @@ static int axiemac_start(struct udevice *dev)
 #endif
  rx_bd.cntrl = sizeof(rxframe);
  /* Flush the last BD so DMA core could see the updates */
- flush_cache((u32)&rx_bd, sizeof(rx_bd));
+ flush_cache((phys_addr_t)&rx_bd, sizeof(rx_bd));
 
  /* It is necessary to flush rxframe because if you don't do it
  * then cache can contain uninitialized data */
- flush_cache((u32)&rxframe, sizeof(rxframe));
+ flush_cache((phys_addr_t)&rxframe, sizeof(rxframe));
 
  /* Start the hardware */
  temp = readl(&priv->dmarx->control);
@@ -538,7 +538,7 @@ static int axiemac_send(struct udevice *dev, void *ptr, int len)
  len = PKTSIZE_ALIGN;
 
  /* Flush packet to main memory to be trasfered by DMA */
- flush_cache((u32)ptr, len);
+ flush_cache((phys_addr_t)ptr, len);
 
  /* Setup Tx BD */
  memset(&tx_bd, 0, sizeof(tx_bd));
@@ -554,7 +554,7 @@ static int axiemac_send(struct udevice *dev, void *ptr, int len)
  XAXIDMA_BD_CTRL_TXEOF_MASK;
 
  /* Flush the last BD so DMA core could see the updates */
- flush_cache((u32)&tx_bd, sizeof(tx_bd));
+ flush_cache((phys_addr_t)&tx_bd, sizeof(tx_bd));
 
  if (readl(&priv->dmatx->status) & XAXIDMA_HALTED_MASK) {
  u32 temp;
@@ -654,11 +654,11 @@ static int axiemac_free_pkt(struct udevice *dev, uchar *packet, int length)
  rx_bd.cntrl = sizeof(rxframe);
 
  /* Write bd to HW */
- flush_cache((u32)&rx_bd, sizeof(rx_bd));
+ flush_cache((phys_addr_t)&rx_bd, sizeof(rx_bd));
 
  /* It is necessary to flush rxframe because if you don't do it
  * then cache will contain previous packet */
- flush_cache((u32)&rxframe, sizeof(rxframe));
+ flush_cache((phys_addr_t)&rxframe, sizeof(rxframe));
 
  /* Rx BD is ready - start again */
  axienet_dma_write(&rx_bd, &priv->dmarx->tail);
--
2.28.0

Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 0/2] net: xilinx: axi_emac: Add 64bit support

Ramon Fried-4
In reply to this post by Michal Simek-3
On Mon, Sep 14, 2020 at 12:34 PM Michal Simek <[hidden email]> wrote:

>
> Hi,
>
> these two patches are extending axi emac driver to support 64bit systems.
>
> Thanks,
> Michal
>
>
> Ashok Reddy Soma (2):
>   net: xilinx: axi_emac: Fix dma descriptors for 64bit and compilation
>     warnings
>   net: xilinx: axi_emac: Typecast flush_cache arguments
>
>  drivers/net/xilinx_axi_emac.c | 48 ++++++++++++++++++++++-------------
>  1 file changed, 30 insertions(+), 18 deletions(-)
>
> --
> 2.28.0
>
Reviewed-By: Ramon Fried <[hidden email]>
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 2/2] net: xilinx: axi_emac: Typecast flush_cache arguments

Ramon Fried-4
In reply to this post by Michal Simek-3
On Mon, Sep 14, 2020 at 12:35 PM Michal Simek <[hidden email]> wrote:

>
> From: Ashok Reddy Soma <[hidden email]>
>
> flush_cache() arguments are not type casted to take care of 64 bit
> systems. Use phys_addr_t to type cast for it to work properly for 32 bit
> and 64 bit systems.
>
> Signed-off-by: Ashok Reddy Soma <[hidden email]>
> Signed-off-by: Michal Simek <[hidden email]>
> ---
>
>  drivers/net/xilinx_axi_emac.c | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/xilinx_axi_emac.c b/drivers/net/xilinx_axi_emac.c
> index c56c4d0d83e4..8af371120462 100644
> --- a/drivers/net/xilinx_axi_emac.c
> +++ b/drivers/net/xilinx_axi_emac.c
> @@ -500,11 +500,11 @@ static int axiemac_start(struct udevice *dev)
>  #endif
>         rx_bd.cntrl = sizeof(rxframe);
>         /* Flush the last BD so DMA core could see the updates */
> -       flush_cache((u32)&rx_bd, sizeof(rx_bd));
> +       flush_cache((phys_addr_t)&rx_bd, sizeof(rx_bd));
>
>         /* It is necessary to flush rxframe because if you don't do it
>          * then cache can contain uninitialized data */
> -       flush_cache((u32)&rxframe, sizeof(rxframe));
> +       flush_cache((phys_addr_t)&rxframe, sizeof(rxframe));
>
>         /* Start the hardware */
>         temp = readl(&priv->dmarx->control);
> @@ -538,7 +538,7 @@ static int axiemac_send(struct udevice *dev, void *ptr, int len)
>                 len = PKTSIZE_ALIGN;
>
>         /* Flush packet to main memory to be trasfered by DMA */
> -       flush_cache((u32)ptr, len);
> +       flush_cache((phys_addr_t)ptr, len);
>
>         /* Setup Tx BD */
>         memset(&tx_bd, 0, sizeof(tx_bd));
> @@ -554,7 +554,7 @@ static int axiemac_send(struct udevice *dev, void *ptr, int len)
>                                                 XAXIDMA_BD_CTRL_TXEOF_MASK;
>
>         /* Flush the last BD so DMA core could see the updates */
> -       flush_cache((u32)&tx_bd, sizeof(tx_bd));
> +       flush_cache((phys_addr_t)&tx_bd, sizeof(tx_bd));
>
>         if (readl(&priv->dmatx->status) & XAXIDMA_HALTED_MASK) {
>                 u32 temp;
> @@ -654,11 +654,11 @@ static int axiemac_free_pkt(struct udevice *dev, uchar *packet, int length)
>         rx_bd.cntrl = sizeof(rxframe);
>
>         /* Write bd to HW */
> -       flush_cache((u32)&rx_bd, sizeof(rx_bd));
> +       flush_cache((phys_addr_t)&rx_bd, sizeof(rx_bd));
>
>         /* It is necessary to flush rxframe because if you don't do it
>          * then cache will contain previous packet */
> -       flush_cache((u32)&rxframe, sizeof(rxframe));
> +       flush_cache((phys_addr_t)&rxframe, sizeof(rxframe));
>
>         /* Rx BD is ready - start again */
>         axienet_dma_write(&rx_bd, &priv->dmarx->tail);
> --
> 2.28.0
>
Reviewed-By: Ramon Fried <[hidden email]>
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 1/2] net: xilinx: axi_emac: Fix dma descriptors for 64bit and compilation warnings

Ramon Fried-4
In reply to this post by Michal Simek-3
On Mon, Sep 14, 2020 at 12:35 PM Michal Simek <[hidden email]> wrote:

>
> From: Ashok Reddy Soma <[hidden email]>
>
> There are compilation warnings showing up when we compile AXI ethernet
> driver for 64bit architectures. Fix them, so that it works on both 32
> and 64 bit architectures.
>
> DMA descriptors are not taking care of 64bit addresses. To fix it,
> change axidma_bd members as below:
>
> next            ==>     next_desc
> reserverd1      ==>     next_desc_msb
> phys            ==>     buf_addr
> reserverd2      ==>     buf_addr_msb
>
> and update next_desc and buf_addr with lower 32 bits of the addresses,
> update next_desc_msb and buf_addr_msb with upper 32 bits of the 64bit
> addresses.
>
> Signed-off-by: Ashok Reddy Soma <[hidden email]>
> Signed-off-by: Michal Simek <[hidden email]>
> ---
>
>  drivers/net/xilinx_axi_emac.c | 36 +++++++++++++++++++++++------------
>  1 file changed, 24 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/net/xilinx_axi_emac.c b/drivers/net/xilinx_axi_emac.c
> index 99d4d85c5270..c56c4d0d83e4 100644
> --- a/drivers/net/xilinx_axi_emac.c
> +++ b/drivers/net/xilinx_axi_emac.c
> @@ -101,10 +101,10 @@ struct axidma_priv {
>
>  /* BD descriptors */
>  struct axidma_bd {
> -       u32 next;       /* Next descriptor pointer */
> -       u32 reserved1;
> -       u32 phys;       /* Buffer address */
> -       u32 reserved2;
> +       u32 next_desc;  /* Next descriptor pointer */
> +       u32 next_desc_msb;
> +       u32 buf_addr;   /* Buffer address */
> +       u32 buf_addr_msb;
>         u32 reserved3;
>         u32 reserved4;
>         u32 cntrl;      /* Control */
> @@ -182,7 +182,7 @@ static inline int mdio_wait(struct axi_regs *regs)
>  static inline void axienet_dma_write(struct axidma_bd *bd, u32 *desc)
>  {
>  #if defined(CONFIG_PHYS_64BIT)
> -       writeq(bd, desc);
> +       writeq((unsigned long)bd, desc);
>  #else
>         writel((u32)bd, desc);
>  #endif
> @@ -492,8 +492,12 @@ static int axiemac_start(struct udevice *dev)
>
>         /* Setup the BD. */
>         memset(&rx_bd, 0, sizeof(rx_bd));
> -       rx_bd.next = (u32)&rx_bd;
> -       rx_bd.phys = (u32)&rxframe;
> +       rx_bd.next_desc = lower_32_bits((unsigned long)&rx_bd);
> +       rx_bd.buf_addr = lower_32_bits((unsigned long)&rxframe);
> +#if defined(CONFIG_PHYS_64BIT)
> +       rx_bd.next_desc_msb = upper_32_bits((unsigned long)&rx_bd);
> +       rx_bd.buf_addr_msb = upper_32_bits((unsigned long)&rxframe);
> +#endif
>         rx_bd.cntrl = sizeof(rxframe);
>         /* Flush the last BD so DMA core could see the updates */
>         flush_cache((u32)&rx_bd, sizeof(rx_bd));
> @@ -539,8 +543,12 @@ static int axiemac_send(struct udevice *dev, void *ptr, int len)
>         /* Setup Tx BD */
>         memset(&tx_bd, 0, sizeof(tx_bd));
>         /* At the end of the ring, link the last BD back to the top */
> -       tx_bd.next = (u32)&tx_bd;
> -       tx_bd.phys = (u32)ptr;
> +       tx_bd.next_desc = lower_32_bits((unsigned long)&tx_bd);
> +       tx_bd.buf_addr = lower_32_bits((unsigned long)ptr);
> +#if defined(CONFIG_PHYS_64BIT)
> +       tx_bd.next_desc_msb = upper_32_bits((unsigned long)&tx_bd);
> +       tx_bd.buf_addr_msb = upper_32_bits((unsigned long)ptr);
> +#endif
>         /* Save len */
>         tx_bd.cntrl = len | XAXIDMA_BD_CTRL_TXSOF_MASK |
>                                                 XAXIDMA_BD_CTRL_TXEOF_MASK;
> @@ -637,8 +645,12 @@ static int axiemac_free_pkt(struct udevice *dev, uchar *packet, int length)
>         /* Setup RxBD */
>         /* Clear the whole buffer and setup it again - all flags are cleared */
>         memset(&rx_bd, 0, sizeof(rx_bd));
> -       rx_bd.next = (u32)&rx_bd;
> -       rx_bd.phys = (u32)&rxframe;
> +       rx_bd.next_desc = lower_32_bits((unsigned long)&rx_bd);
> +       rx_bd.buf_addr = lower_32_bits((unsigned long)&rxframe);
> +#if defined(CONFIG_PHYS_64BIT)
> +       rx_bd.next_desc_msb = upper_32_bits((unsigned long)&rx_bd);
> +       rx_bd.buf_addr_msb = upper_32_bits((unsigned long)&rxframe);
> +#endif
>         rx_bd.cntrl = sizeof(rxframe);
>
>         /* Write bd to HW */
> @@ -738,7 +750,7 @@ static int axi_emac_ofdata_to_platdata(struct udevice *dev)
>                 return -EINVAL;
>         }
>         /* RX channel offset is 0x30 */
> -       priv->dmarx = (struct axidma_reg *)((u32)priv->dmatx + 0x30);
> +       priv->dmarx = (struct axidma_reg *)((phys_addr_t)priv->dmatx + 0x30);
>
>         priv->phyaddr = -1;
>
> --
> 2.28.0
>
Reviewed-By: Ramon Fried <[hidden email]>
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 0/2] net: xilinx: axi_emac: Add 64bit support

Michal Simek-4
In reply to this post by Michal Simek-3
po 14. 9. 2020 v 11:34 odesílatel Michal Simek <[hidden email]> napsal:

>
> Hi,
>
> these two patches are extending axi emac driver to support 64bit systems.
>
> Thanks,
> Michal
>
>
> Ashok Reddy Soma (2):
>   net: xilinx: axi_emac: Fix dma descriptors for 64bit and compilation
>     warnings
>   net: xilinx: axi_emac: Typecast flush_cache arguments
>
>  drivers/net/xilinx_axi_emac.c | 48 ++++++++++++++++++++++-------------
>  1 file changed, 30 insertions(+), 18 deletions(-)
>
> --
> 2.28.0
>

Applied.
M


--
Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel - Xilinx Microblaze
Maintainer of Linux kernel - Xilinx Zynq ARM and ZynqMP ARM64 SoCs
U-Boot custodian - Xilinx Microblaze/Zynq/ZynqMP/Versal SoCs