Subject: Re: [PATCH] powerpc/powernv: Fix sparse data type warnings in pci-ioda.c

From: Michael Ellerman <[email-masked]>
Date: Wed, 28 Mar 2018 15:53:05 +1100

Paul Mackerras <[email-masked]> writes:
> From: Gavin Shan <[email-masked]>
>
> The value passed to __raw_rm_writeq() and __raw_writeq() should be "u64"
> and "unsigned long". This fixes warning reported by sparse:
>
>   gwshan@gwshan:~/sandbox/l$ make C=2 CF=-D__CHECK_ENDIAN__ \
>                              arch/powerpc/platforms/powernv/pci-ioda.o
>   arch/powerpc/platforms/powernv/pci-ioda.c:1794:41: \
>   warning: incorrect type in argument 1 (different base types)
>   arch/powerpc/platforms/powernv/pci-ioda.c:1794:41: \
>   expected unsigned long long [unsigned] [usertype] val
>   arch/powerpc/platforms/powernv/pci-ioda.c:1794:41: \
>   got restricted __be64 [usertype] <noident>
>   arch/powerpc/platforms/powernv/pci-ioda.c:1796:38: \
>   warning: incorrect type in argument 1 (different base types)
>   arch/powerpc/platforms/powernv/pci-ioda.c:1796:38: \
>   expected unsigned long [unsigned] v
>   arch/powerpc/platforms/powernv/pci-ioda.c:1796:38: \
>   got restricted __be64 [usertype] <noident>
>
> This also fixes another warning reported by sparse:
>
>   gwshan@gwshan:~/sandbox/l$ make C=2 CF=-D__CHECK_ENDIAN__ \
>                              arch/powerpc/platforms/powernv/pci-ioda.o
>         :
>   arch/powerpc/platforms/powernv/pci-ioda.c:2647:45: \
>   warning: cast to restricted __be64
>
> Signed-off-by: Gavin Shan <[email-masked]>
> Signed-off-by: Paul Mackerras <[email-masked]>
> ---
> diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
> index a6c92c7..71de087 100644
> --- a/arch/powerpc/platforms/powernv/pci-ioda.c
> +++ b/arch/powerpc/platforms/powernv/pci-ioda.c
> @@ -1976,9 +1976,11 @@ static void pnv_pci_p7ioc_tce_invalidate(struct iommu_table *tbl,
>          mb(); /* Ensure above stores are visible */
>          while (start <= end) {
>  		if (rm)
> -			__raw_rm_writeq(cpu_to_be64(start), invalidate);
> +			__raw_rm_writeq((__force u64)cpu_to_be64(start),
> +					invalidate);
>  		else
> -			__raw_writeq(cpu_to_be64(start), invalidate);
> +			__raw_writeq((__force unsigned long)cpu_to_be64(start),
> +				     invalidate);

I didn't merge this when it was originally sent because sprinkling
__force casts everywhere is not a good strategy for producing
maintainable code IMHO.

There's a writeq_be() which does the byte swap, I think we should
probably just mirror that for these __raw versions.

I'll do a patch.

cheers