[U-Boot] [linux-sunxi] [PATCH 3/2] net/designware: reorder struct dw_eth_dev to pack more efficiently.

Siarhei Siamashka siarhei.siamashka at gmail.com
Wed May 14 09:44:13 CEST 2014


On Thu, 01 May 2014 20:01:58 +0100
Ian Campbell <ijc at hellion.org.uk> wrote:

> The {tx,rx}_mac_descrtable fields are aligned to ARCH_DMA_MINALIGN, which could
> be 256 or even larger. That means there is a potentially huge hole in the
> struct before those fields, so move them to the front where they are better
> packed.
> 
> Moving them to the front also helps ensure that so long as dw_eth_dev is
> properly aligned (which it is since "net/designware: ensure device private data
> is DMA aligned.") the {tx,rx}_mac_descrtable will be too, or at least avoids
> having to worry too much about compiler specifics.
> 
> Signed-off-by: Ian Campbell <ijc at hellion.org.uk>
> Cc: Alexey Brodkin <abrodkin at synopsys.com>
> ---
>  drivers/net/designware.h | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/designware.h b/drivers/net/designware.h
> index 382b0c7..6d94b3a 100644
> --- a/drivers/net/designware.h
> +++ b/drivers/net/designware.h
> @@ -215,13 +215,13 @@ struct dmamacdescr {
>  #endif
>  
>  struct dw_eth_dev {
> +	struct dmamacdescr tx_mac_descrtable[CONFIG_TX_DESCR_NUM];
> +	struct dmamacdescr rx_mac_descrtable[CONFIG_RX_DESCR_NUM];
> +
>  	u32 interface;
>  	u32 tx_currdescnum;
>  	u32 rx_currdescnum;
>  
> -	struct dmamacdescr tx_mac_descrtable[CONFIG_TX_DESCR_NUM];
> -	struct dmamacdescr rx_mac_descrtable[CONFIG_RX_DESCR_NUM];
> -
>  	char txbuffs[TX_TOTAL_BUFSIZE];
>  	char rxbuffs[RX_TOTAL_BUFSIZE];

After this reordering, txbuffs and rxbuffs buffers become DMA unaligned.
And they are also used with the cache flush/invalidate operations all
over the place, causing all the same "v7_dcache_inval_range - start
address is not aligned" failures.

The txbuffs/rxbuffs buffers probably should immediately follow
dmamacdescr structs and also have their own alignment enforcement
attribute.

As for the buffer sizes, we have the following defines:

#define CONFIG_TX_DESCR_NUM	16
#define CONFIG_RX_DESCR_NUM	16
#define CONFIG_ETH_BUFSIZE	2048
#define TX_TOTAL_BUFSIZE	(CONFIG_ETH_BUFSIZE * CONFIG_TX_DESCR_NUM)
#define RX_TOTAL_BUFSIZE	(CONFIG_ETH_BUFSIZE * CONFIG_RX_DESCR_NUM)

CONFIG_ETH_BUFSIZE is a power of two, which is good. Still maybe an
extra assertion check to verify/confirm that it is divisible by the
cache line size would make the code cleaner? But that's just a nitpick,
because the "v7_dcache_inval_range" function is noisy enough if anything
is wrong :-)

-- 
Best regards,
Siarhei Siamashka


More information about the U-Boot mailing list