[PATCH] powerpc/asm/cacheflush: Cleanup cacheflush function params

Christophe LEROY christophe.leroy at c-s.fr
Mon Jul 31 01:41:35 PDT 2017



Le 20/07/2017 à 08:28, Matt Brown a écrit :
> The cacheflush prototypes currently use start and stop values and each
> call requires typecasting the address to an unsigned long.
> This patch changes the cacheflush prototypes to follow the x86 style of
> using a base and size values, with base being a void pointer.
> 
> All callers of the cacheflush functions, including drivers, have been
> modified to conform to the new prototypes.
> 
> The 64 bit cacheflush functions which were implemented in assembly code
> (flush_dcache_range, flush_inval_dcache_range) have been translated into
> C for readability and coherence.
> 
> Signed-off-by: Matt Brown <matthew.brown.dev at gmail.com>
> ---
>   arch/powerpc/include/asm/cacheflush.h        | 47 +++++++++++++++++--------
>   arch/powerpc/kernel/misc_64.S                | 52 ----------------------------
>   arch/powerpc/mm/dma-noncoherent.c            | 15 ++++----
>   arch/powerpc/platforms/512x/mpc512x_shared.c | 10 +++---
>   arch/powerpc/platforms/85xx/smp.c            |  6 ++--
>   arch/powerpc/sysdev/dart_iommu.c             |  5 +--
>   drivers/ata/pata_bf54x.c                     |  3 +-
>   drivers/char/agp/uninorth-agp.c              |  6 ++--
>   drivers/gpu/drm/drm_cache.c                  |  3 +-
>   drivers/macintosh/smu.c                      | 15 ++++----
>   drivers/mmc/host/bfin_sdh.c                  |  3 +-
>   drivers/mtd/nand/bf5xx_nand.c                |  6 ++--
>   drivers/soc/fsl/qbman/dpaa_sys.h             |  2 +-
>   drivers/soc/fsl/qbman/qman_ccsr.c            |  3 +-
>   drivers/spi/spi-bfin5xx.c                    | 10 +++---
>   drivers/tty/serial/mpsc.c                    | 46 ++++++++----------------
>   drivers/usb/musb/blackfin.c                  |  6 ++--
>   17 files changed, 86 insertions(+), 152 deletions(-)
> 

[...]

> diff --git a/arch/powerpc/mm/dma-noncoherent.c b/arch/powerpc/mm/dma-noncoherent.c
> index 3825284..5fd3171 100644
> --- a/arch/powerpc/mm/dma-noncoherent.c
> +++ b/arch/powerpc/mm/dma-noncoherent.c
> @@ -204,9 +204,9 @@ __dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t
>   	 * kernel direct-mapped region for device DMA.
>   	 */
>   	{
> -		unsigned long kaddr = (unsigned long)page_address(page);
> +		void *kaddr = page_address(page);
>   		memset(page_address(page), 0, size);
> -		flush_dcache_range(kaddr, kaddr + size);
> +		flush_dcache_range(kaddr, size);
>   	}
>   
>   	/*
> @@ -316,9 +316,6 @@ EXPORT_SYMBOL(__dma_free_coherent);
>    */
>   void __dma_sync(void *vaddr, size_t size, int direction)
>   {
> -	unsigned long start = (unsigned long)vaddr;
> -	unsigned long end   = start + size;
> -
>   	switch (direction) {
>   	case DMA_NONE:
>   		BUG();
> @@ -328,15 +325,15 @@ void __dma_sync(void *vaddr, size_t size, int direction)
>   		 * the potential for discarding uncommitted data from the cache
>   		 */
>   		if ((start | end) & (L1_CACHE_BYTES - 1))

How can the above compile when 'start' and 'end' are removed ?
Shouldn't it be replaced by

if ((vaddr | size) & (L1_CACHE_BYTES - 1))

> -			flush_dcache_range(start, end);
> +			flush_dcache_range(vaddr, size);
>   		else
> -			invalidate_dcache_range(start, end);
> +			invalidate_dcache_range(vaddr, size);
>   		break;
>   	case DMA_TO_DEVICE:		/* writeback only */
> -		clean_dcache_range(start, end);
> +		clean_dcache_range(vaddr, size);
>   		break;
>   	case DMA_BIDIRECTIONAL:	/* writeback and invalidate */
> -		flush_dcache_range(start, end);
> +		flush_dcache_range(vaddr, size);
>   		break;
>   	}
>   }

[...]

Christophe



More information about the linux-arm-kernel mailing list