[PATCH] net: dwc_eth_qos: Pad descriptors to cacheline size
Stephen Warren
swarren at wwwdotorg.org
Wed Apr 29 21:51:46 CEST 2020
On 4/29/20 1:14 PM, Marek Vasut wrote:
> The DWMAC4 IP has the possibility to skip up to 7 64bit words after
> the descriptor, use this to pad the descriptors to cacheline size.
> diff --git a/drivers/net/dwc_eth_qos.c b/drivers/net/dwc_eth_qos.c
> /* Descriptors */
> +/*
Nit: Blank line between those two comments to match the existing style.
> + * #if EQOS_DESCRIPTOR_SIZE < ARCH_DMA_MINALIGN fails if we use sizeof()
> + * or offsetof() to calculate descriptor size, since neither is allowed
> + * in C preprocessor macros, so just hard-code this to 16=4*sizeof(u32).
> + */
> +#define EQOS_DESCRIPTOR_SIZE 16
> +#define EQOS_DESCRIPTOR_PAD ((ARCH_DMA_MINALIGN - EQOS_DESCRIPTOR_SIZE) / 4)
> +struct eqos_desc {
> + u32 des0;
> + u32 des1;
> + u32 des2;
> + u32 des3;
> + u32 __pad[EQOS_DESCRIPTOR_PAD];
> +};
I think the padding needs to be optional based on the same condition in
the following existing warning logic, and the warning logic may need to
be removed/updated to account for the fact that padding is now being
used to avoid the issue:
(quoting this from existing code)
> /*
> * Warn if the cache-line size is larger than the descriptor size. In such
> * cases the driver will likely fail because the CPU needs to flush the cache
> * when requeuing RX buffers, therefore descriptors written by the hardware
> * may be discarded. Architectures with full IO coherence, such as x86, do not
> * experience this issue, and hence are excluded from this condition.
> *
> * This can be fixed by defining CONFIG_SYS_NONCACHED_MEMORY which will cause
> * the driver to allocate descriptors from a pool of non-cached memory.
> */
> #if EQOS_DESCRIPTOR_SIZE < ARCH_DMA_MINALIGN
> #if !defined(CONFIG_SYS_NONCACHED_MEMORY) && \
> !CONFIG_IS_ENABLED(SYS_DCACHE_OFF) && !defined(CONFIG_X86)
> #warning Cache line size is larger than descriptor size
> #endif
> #endif
(back to quoting from the patch)
> -#define EQOS_DESCRIPTOR_WORDS 4
> -#define EQOS_DESCRIPTOR_SIZE (EQOS_DESCRIPTOR_WORDS * 4)
...
> -struct eqos_desc {
> - u32 des0;
> - u32 des1;
> - u32 des2;
> - u32 des3;
> -};
This patch would be a lot smaller if those definitions were kept in
their existing location instead of moving them...
More information about the U-Boot
mailing list