[PATCH 1/2] net: xilinx: axi_emac: Fix dma descriptors for 64bit and compilation warnings
Ramon Fried
rfried.dev at gmail.com
Mon Sep 14 16:07:43 CEST 2020
On Mon, Sep 14, 2020 at 12:35 PM Michal Simek <michal.simek at xilinx.com> wrote:
>
> From: Ashok Reddy Soma <ashok.reddy.soma at xilinx.com>
>
> 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 <ashok.reddy.soma at xilinx.com>
> Signed-off-by: Michal Simek <michal.simek at xilinx.com>
> ---
>
> 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 <rfried.dev at gmail.com>
More information about the U-Boot
mailing list