Re: [PATCH v2 2/2] dmaengine: fsl-edma: use _Generic to handle difference type

From: Frank Li
Date: Tue Apr 09 2024 - 12:33:34 EST


On Fri, Feb 09, 2024 at 04:36:04PM -0500, Frank Li wrote:
> Introduce the use of C11 standard _Generic in the fsl-edma driver for
> handling different TCD field types. Improve code clarity and help
> compiler optimization.
>
> Signed-off-by: Frank Li <Frank.Li@xxxxxxx>
> ---

Vinod:
Do you have chance to check these two patches?

Frank

>
> Notes:
> Change from v1 to v2
> - Fixed sparse build warnings
>
> drivers/dma/fsl-edma-common.h | 61 +++++++++++++----------------------
> 1 file changed, 22 insertions(+), 39 deletions(-)
>
> diff --git a/drivers/dma/fsl-edma-common.h b/drivers/dma/fsl-edma-common.h
> index 365affd5b0764..cb3e0f00c80eb 100644
> --- a/drivers/dma/fsl-edma-common.h
> +++ b/drivers/dma/fsl-edma-common.h
> @@ -255,12 +255,11 @@ static inline u32 fsl_edma_drvflags(struct fsl_edma_chan *fsl_chan)
> }
>
> #define edma_read_tcdreg_c(chan, _tcd, __name) \
> -(sizeof((_tcd)->__name) == sizeof(u64) ? \
> - edma_readq(chan->edma, &(_tcd)->__name) : \
> - ((sizeof((_tcd)->__name) == sizeof(u32)) ? \
> - edma_readl(chan->edma, &(_tcd)->__name) : \
> - edma_readw(chan->edma, &(_tcd)->__name) \
> - ))
> +_Generic(((_tcd)->__name), \
> + __iomem __le64 : edma_readq(chan->edma, &(_tcd)->__name), \
> + __iomem __le32 : edma_readl(chan->edma, &(_tcd)->__name), \
> + __iomem __le16 : edma_readw(chan->edma, &(_tcd)->__name) \
> + )
>
> #define edma_read_tcdreg(chan, __name) \
> ((fsl_edma_drvflags(chan) & FSL_EDMA_DRV_TCD64) ? \
> @@ -268,23 +267,13 @@ static inline u32 fsl_edma_drvflags(struct fsl_edma_chan *fsl_chan)
> edma_read_tcdreg_c(chan, ((struct fsl_edma_hw_tcd __iomem *)chan->tcd), __name) \
> )
>
> -#define edma_write_tcdreg_c(chan, _tcd, _val, __name) \
> -do { \
> - switch (sizeof(_tcd->__name)) { \
> - case sizeof(u64): \
> - edma_writeq(chan->edma, (u64 __force)_val, &_tcd->__name); \
> - break; \
> - case sizeof(u32): \
> - edma_writel(chan->edma, (u32 __force)_val, &_tcd->__name); \
> - break; \
> - case sizeof(u16): \
> - edma_writew(chan->edma, (u16 __force)_val, &_tcd->__name); \
> - break; \
> - case sizeof(u8): \
> - edma_writeb(chan->edma, (u8 __force)_val, &_tcd->__name); \
> - break; \
> - } \
> -} while (0)
> +#define edma_write_tcdreg_c(chan, _tcd, _val, __name) \
> +_Generic((_tcd->__name), \
> + __iomem __le64 : edma_writeq(chan->edma, (u64 __force)(_val), &_tcd->__name), \
> + __iomem __le32 : edma_writel(chan->edma, (u32 __force)(_val), &_tcd->__name), \
> + __iomem __le16 : edma_writew(chan->edma, (u16 __force)(_val), &_tcd->__name), \
> + __iomem u8 : edma_writeb(chan->edma, _val, &_tcd->__name) \
> + )
>
> #define edma_write_tcdreg(chan, val, __name) \
> do { \
> @@ -325,9 +314,11 @@ do { \
> (((struct fsl_edma_hw_tcd *)_tcd)->_field))
>
> #define fsl_edma_le_to_cpu(x) \
> -(sizeof(x) == sizeof(u64) ? le64_to_cpu((__force __le64)(x)) : \
> - (sizeof(x) == sizeof(u32) ? le32_to_cpu((__force __le32)(x)) : \
> - le16_to_cpu((__force __le16)(x))))
> +_Generic((x), \
> + __le64 : le64_to_cpu((x)), \
> + __le32 : le32_to_cpu((x)), \
> + __le16 : le16_to_cpu((x)) \
> +)
>
> #define fsl_edma_get_tcd_to_cpu(_chan, _tcd, _field) \
> (fsl_edma_drvflags(_chan) & FSL_EDMA_DRV_TCD64 ? \
> @@ -335,19 +326,11 @@ do { \
> fsl_edma_le_to_cpu(((struct fsl_edma_hw_tcd *)_tcd)->_field))
>
> #define fsl_edma_set_tcd_to_le_c(_tcd, _val, _field) \
> -do { \
> - switch (sizeof((_tcd)->_field)) { \
> - case sizeof(u64): \
> - *(__force __le64 *)(&((_tcd)->_field)) = cpu_to_le64(_val); \
> - break; \
> - case sizeof(u32): \
> - *(__force __le32 *)(&((_tcd)->_field)) = cpu_to_le32(_val); \
> - break; \
> - case sizeof(u16): \
> - *(__force __le16 *)(&((_tcd)->_field)) = cpu_to_le16(_val); \
> - break; \
> - } \
> -} while (0)
> +_Generic(((_tcd)->_field), \
> + __le64 : (_tcd)->_field = cpu_to_le64(_val), \
> + __le32 : (_tcd)->_field = cpu_to_le32(_val), \
> + __le16 : (_tcd)->_field = cpu_to_le16(_val) \
> +)
>
> #define fsl_edma_set_tcd_to_le(_chan, _tcd, _val, _field) \
> do { \
> --
> 2.34.1
>