Message ID | 53FCBCC3.5040901@codeaurora.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 26/08/14 17:58, Laura Abbott wrote: > On 8/26/2014 3:05 AM, James Hogan wrote: >> On 12 August 2014 00:40, Laura Abbott <lauraa@codeaurora.org> wrote: >>> >>> For architectures without coherent DMA, memory for DMA may >>> need to be remapped with coherent attributes. Factor out >>> the the remapping code from arm and put it in a >>> common location to reduce code duplication. >>> >>> As part of this, the arm APIs are now migrated away from >>> ioremap_page_range to the common APIs which use map_vm_area for remapping. >>> This should be an equivalent change and using map_vm_area is more >>> correct as ioremap_page_range is intended to bring in io addresses >>> into the cpu space and not regular kernel managed memory. >>> >>> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> >>> Signed-off-by: Laura Abbott <lauraa@codeaurora.org> >> >> This commit in linux-next () breaks the build for metag: >> >> drivers/base/dma-mapping.c: In function ‘dma_common_contiguous_remap’: >> drivers/base/dma-mapping.c:294: error: implicit declaration of >> function ‘dma_common_pages_remap’ >> drivers/base/dma-mapping.c:294: warning: assignment makes pointer from >> integer without a cast >> drivers/base/dma-mapping.c: At top level: >> drivers/base/dma-mapping.c:308: error: conflicting types for >> ‘dma_common_pages_remap’ >> drivers/base/dma-mapping.c:294: error: previous implicit declaration >> of ‘dma_common_pages_remap’ was here >> >> Looks like metag isn't alone either: >> >> $ git grep -L dma-mapping-common arch/*/include/asm/dma-mapping.h >> arch/arc/include/asm/dma-mapping.h >> arch/avr32/include/asm/dma-mapping.h >> arch/blackfin/include/asm/dma-mapping.h >> arch/c6x/include/asm/dma-mapping.h >> arch/cris/include/asm/dma-mapping.h >> arch/frv/include/asm/dma-mapping.h >> arch/m68k/include/asm/dma-mapping.h >> arch/metag/include/asm/dma-mapping.h >> arch/mn10300/include/asm/dma-mapping.h >> arch/parisc/include/asm/dma-mapping.h >> arch/xtensa/include/asm/dma-mapping.h >> >> I've checked a couple of these arches (blackfin, xtensa) which don't >> include dma-mapping-common.h and their builds seem to be broken too. >> >> Cheers >> James >> > > Thanks for the report. Would you mind giving the following patch > a test (this is theoretical only but I think it should work) It certainly fixes the build for metag. Thanks James > > -----8<------ > > From 81c9a5504cbc1d72ff1df084d48502b248cd79d0 Mon Sep 17 00:00:00 2001 > From: Laura Abbott <lauraa@codeaurora.org> > Date: Tue, 26 Aug 2014 09:50:49 -0700 > Subject: [PATCH] common: dma-mapping: Swap function order > > Fix the order of dma_common_contiguous_remap and > dma_common_pages_remap to avoid function declaration errors: > > drivers/base/dma-mapping.c: In function 'dma_common_contiguous_remap': > drivers/base/dma-mapping.c:294: error: implicit declaration of > function 'dma_common_pages_remap' > drivers/base/dma-mapping.c:294: warning: assignment makes pointer from > integer without a cast > drivers/base/dma-mapping.c: At top level: > drivers/base/dma-mapping.c:308: error: conflicting types for > 'dma_common_pages_remap' > drivers/base/dma-mapping.c:294: error: previous implicit declaration > of 'dma_common_pages_remap' was here > > Change-Id: I65db739114e8f5816a24a279a2ff1a6dc92e2b83 > Reported-by: James Hogan <james.hogan@imgtec.com> > Reported-by: kbuild test robot <fengguang.wu@intel.com> > Signed-off-by: Laura Abbott <lauraa@codeaurora.org> > --- > drivers/base/dma-mapping.c | 44 ++++++++++++++++++++++---------------------- > 1 file changed, 22 insertions(+), 22 deletions(-) > > diff --git a/drivers/base/dma-mapping.c b/drivers/base/dma-mapping.c > index 1bc46df..056fd46 100644 > --- a/drivers/base/dma-mapping.c > +++ b/drivers/base/dma-mapping.c > @@ -271,6 +271,28 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > EXPORT_SYMBOL(dma_common_mmap); > > /* > + * remaps an array of PAGE_SIZE pages into another vm_area > + * Cannot be used in non-sleeping contexts > + */ > +void *dma_common_pages_remap(struct page **pages, size_t size, > + unsigned long vm_flags, pgprot_t prot, > + const void *caller) > +{ > + struct vm_struct *area; > + > + area = get_vm_area_caller(size, vm_flags, caller); > + if (!area) > + return NULL; > + > + if (map_vm_area(area, prot, pages)) { > + vunmap(area->addr); > + return NULL; > + } > + > + return area->addr; > +} > + > +/* > * remaps an allocated contiguous region into another vm_area. > * Cannot be used in non-sleeping contexts > */ > @@ -299,28 +321,6 @@ void *dma_common_contiguous_remap(struct page *page, size_t size, > } > > /* > - * remaps an array of PAGE_SIZE pages into another vm_area > - * Cannot be used in non-sleeping contexts > - */ > -void *dma_common_pages_remap(struct page **pages, size_t size, > - unsigned long vm_flags, pgprot_t prot, > - const void *caller) > -{ > - struct vm_struct *area; > - > - area = get_vm_area_caller(size, vm_flags, caller); > - if (!area) > - return NULL; > - > - if (map_vm_area(area, prot, pages)) { > - vunmap(area->addr); > - return NULL; > - } > - > - return area->addr; > -} > - > -/* > * unmaps a range previously mapped by dma_common_*_remap > */ > void dma_common_free_remap(void *cpu_addr, size_t size, unsigned long vm_flags) >
On Tue, 2014-08-26 at 09:58 -0700, Laura Abbott wrote: > On 8/26/2014 3:05 AM, James Hogan wrote: > > On 12 August 2014 00:40, Laura Abbott <lauraa@codeaurora.org> wrote: > >> > >> For architectures without coherent DMA, memory for DMA may > >> need to be remapped with coherent attributes. Factor out > >> the the remapping code from arm and put it in a > >> common location to reduce code duplication. > >> > >> As part of this, the arm APIs are now migrated away from > >> ioremap_page_range to the common APIs which use map_vm_area for remapping. > >> This should be an equivalent change and using map_vm_area is more > >> correct as ioremap_page_range is intended to bring in io addresses > >> into the cpu space and not regular kernel managed memory. > >> > >> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> > >> Signed-off-by: Laura Abbott <lauraa@codeaurora.org> > > > > This commit in linux-next () breaks the build for metag: > > > > drivers/base/dma-mapping.c: In function ‘dma_common_contiguous_remap’: > > drivers/base/dma-mapping.c:294: error: implicit declaration of > > function ‘dma_common_pages_remap’ > > drivers/base/dma-mapping.c:294: warning: assignment makes pointer from > > integer without a cast > > drivers/base/dma-mapping.c: At top level: > > drivers/base/dma-mapping.c:308: error: conflicting types for > > ‘dma_common_pages_remap’ > > drivers/base/dma-mapping.c:294: error: previous implicit declaration > > of ‘dma_common_pages_remap’ was here > > > > Looks like metag isn't alone either: > > > > $ git grep -L dma-mapping-common arch/*/include/asm/dma-mapping.h > > arch/arc/include/asm/dma-mapping.h > > arch/avr32/include/asm/dma-mapping.h > > arch/blackfin/include/asm/dma-mapping.h > > arch/c6x/include/asm/dma-mapping.h > > arch/cris/include/asm/dma-mapping.h > > arch/frv/include/asm/dma-mapping.h > > arch/m68k/include/asm/dma-mapping.h > > arch/metag/include/asm/dma-mapping.h > > arch/mn10300/include/asm/dma-mapping.h > > arch/parisc/include/asm/dma-mapping.h > > arch/xtensa/include/asm/dma-mapping.h > > > > I've checked a couple of these arches (blackfin, xtensa) which don't > > include dma-mapping-common.h and their builds seem to be broken too. > > > > Cheers > > James > > > > Thanks for the report. Would you mind giving the following patch > a test (this is theoretical only but I think it should work) There's a further problem with c6x (no MMU): drivers/built-in.o: In function `dma_common_pages_remap': (.text+0x220c4): undefined reference to `get_vm_area_caller' drivers/built-in.o: In function `dma_common_pages_remap': (.text+0x22108): undefined reference to `map_vm_area' drivers/built-in.o: In function `dma_common_free_remap': (.text+0x22278): undefined reference to `find_vm_area'
diff --git a/drivers/base/dma-mapping.c b/drivers/base/dma-mapping.c index 1bc46df..056fd46 100644 --- a/drivers/base/dma-mapping.c +++ b/drivers/base/dma-mapping.c @@ -271,6 +271,28 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, EXPORT_SYMBOL(dma_common_mmap); /* + * remaps an array of PAGE_SIZE pages into another vm_area + * Cannot be used in non-sleeping contexts + */ +void *dma_common_pages_remap(struct page **pages, size_t size, + unsigned long vm_flags, pgprot_t prot, + const void *caller) +{ + struct vm_struct *area; + + area = get_vm_area_caller(size, vm_flags, caller); + if (!area) + return NULL; + + if (map_vm_area(area, prot, pages)) { + vunmap(area->addr); + return NULL; + } + + return area->addr; +} + +/* * remaps an allocated contiguous region into another vm_area. * Cannot be used in non-sleeping contexts */ @@ -299,28 +321,6 @@ void *dma_common_contiguous_remap(struct page *page, size_t size, } /* - * remaps an array of PAGE_SIZE pages into another vm_area - * Cannot be used in non-sleeping contexts - */ -void *dma_common_pages_remap(struct page **pages, size_t size, - unsigned long vm_flags, pgprot_t prot, - const void *caller) -{ - struct vm_struct *area; - - area = get_vm_area_caller(size, vm_flags, caller); - if (!area) - return NULL; - - if (map_vm_area(area, prot, pages)) { - vunmap(area->addr); - return NULL; - } - - return area->addr; -} - -/* * unmaps a range previously mapped by dma_common_*_remap */ void dma_common_free_remap(void *cpu_addr, size_t size, unsigned long vm_flags)