[PATCH] powerpc: use the generic dma coherent remap allocator
Christophe Leroy
christophe.leroy at c-s.fr
Thu Aug 15 00:20:34 AEST 2019
Le 14/08/2019 à 15:22, Christoph Hellwig a écrit :
> This switches to using common code for the DMA allocations, including
> potential use of the CMA allocator if configured.
>
> Switching to the generic code enables DMA allocations from atomic
> context, which is required by the DMA API documentation, and also
> adds various other minor features drivers start relying upon. It
> also makes sure we have on tested code base for all architectures
> that require uncached pte bits for coherent DMA allocations.
>
> Another advantage is that consistent memory allocations now share
> the general vmalloc pool instead of needing an explicit careout
> from it.
>
> Signed-off-by: Christoph Hellwig <hch at lst.de>
> ---
> arch/powerpc/Kconfig | 12 -
> arch/powerpc/include/asm/book3s/32/pgtable.h | 12 +-
> arch/powerpc/include/asm/nohash/32/pgtable.h | 12 +-
> arch/powerpc/mm/dma-noncoherent.c | 318 +------------------
> arch/powerpc/mm/mem.c | 4 -
> arch/powerpc/mm/ptdump/ptdump.c | 9 -
> arch/powerpc/platforms/Kconfig.cputype | 2 +
> 7 files changed, 17 insertions(+), 352 deletions(-)
>
[...]
> diff --git a/arch/powerpc/mm/dma-noncoherent.c b/arch/powerpc/mm/dma-noncoherent.c
> index c617282d5b2a..4272ca5e8159 100644
> --- a/arch/powerpc/mm/dma-noncoherent.c
> +++ b/arch/powerpc/mm/dma-noncoherent.c
[...]
> @@ -408,23 +116,15 @@ void arch_sync_dma_for_cpu(struct device *dev, phys_addr_t paddr,
> __dma_sync_page(paddr, size, dir);
> }
>
> -/*
> - * Return the PFN for a given cpu virtual address returned by arch_dma_alloc.
> - */
> -long arch_dma_coherent_to_pfn(struct device *dev, void *vaddr,
> - dma_addr_t dma_addr)
> +void arch_dma_prep_coherent(struct page *page, size_t size)
> {
> - /* This should always be populated, so we don't test every
> - * level. If that fails, we'll have a nice crash which
> - * will be as good as a BUG_ON()
> - */
> - unsigned long cpu_addr = (unsigned long)vaddr;
> - pgd_t *pgd = pgd_offset_k(cpu_addr);
> - pud_t *pud = pud_offset(pgd, cpu_addr);
> - pmd_t *pmd = pmd_offset(pud, cpu_addr);
> - pte_t *ptep = pte_offset_kernel(pmd, cpu_addr);
> + unsigned long kaddr = (unsigned long)page_address(page);
>
> - if (pte_none(*ptep) || !pte_present(*ptep))
> - return 0;
> - return pte_pfn(*ptep);
> + flush_dcache_range(kaddr, kaddr + size);
> +}
> +
> +static int __init atomic_pool_init(void)
> +{
> + return dma_atomic_pool_init(GFP_KERNEL, pgprot_noncached(PAGE_KERNEL));
> }
> +postcore_initcall(atomic_pool_init);
[...]
> diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype
> index 56a7c814160d..afe71b89dec3 100644
> --- a/arch/powerpc/platforms/Kconfig.cputype
> +++ b/arch/powerpc/platforms/Kconfig.cputype
> @@ -450,8 +450,10 @@ config NOT_COHERENT_CACHE
> depends on 4xx || PPC_8xx || E200 || PPC_MPC512x || \
> GAMECUBE_COMMON || AMIGAONE
> select ARCH_HAS_DMA_COHERENT_TO_PFN
You drop arch_dma_coherent_to_pfn(), it's surprising to see
ARCH_HAS_DMA_COHERENT_TO_PFN remains. At first I thought I'd get a build
failure.
After looking more, I see there is a arch_dma_coherent_to_pfn()
defined in kernel/dma/remap.c when DMA_DIRECT_REMAP is selected.
I think the naming is not really consistant and should be fixed some
how, because that's misleading to have an arch_something() being common
to all.
Christophe
> + select ARCH_HAS_DMA_PREP_COHERENT
> select ARCH_HAS_SYNC_DMA_FOR_DEVICE
> select ARCH_HAS_SYNC_DMA_FOR_CPU
> + select DMA_DIRECT_REMAP
> default n if PPC_47x
> default y
>
>
More information about the Linuxppc-dev
mailing list