* [PATCH v4 00/44] dma-mapping: Use unsigned long for dma_attrs
@ 2016-06-10 10:11 Krzysztof Kozlowski
2016-06-10 10:11 ` [PATCH v4 04/44] ARM: " Krzysztof Kozlowski
` (4 more replies)
0 siblings, 5 replies; 8+ messages in thread
From: Krzysztof Kozlowski @ 2016-06-10 10:11 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
This is fourth approach for replacing struct dma_attrs with unsigned
long.
The main patch (1/44) doing the change is split into many subpatches
for easier review (2-42). They should be squashed together when
applying.
*Important:* Patchset is tested on my ARM platforms and *only* build
tested on allyesconfigs: ARM, ARM64, i386, x86_64 and powerpc.
Please kindly provide reviewes and tests for other platforms.
Rebased on next-20160607.
For easier testing the patchset is available here:
repo: https://github.com/krzk/linux
branch: for-next/dma-attrs-const-v4
Changes since v3
================
1. Collect some acks.
2. Drop wrong patch 1/45 ("powerpc: dma-mapping: Don't hard-code
the value of DMA_ATTR_WEAK_ORDERING").
3. Minor fix pointed out by Michael Ellerman.
Changes since v2
================
1. Follow Christoph Hellwig's comments (don't use BIT add
documentation, remove dma_get_attr).
Rationale
=========
The dma-mapping core and the implementations do not change the
DMA attributes passed by pointer. Thus the pointer can point to const
data. However the attributes do not have to be a bitfield. Instead
unsigned long will do fine:
1. This is just simpler. Both in terms of reading the code and setting
attributes. Instead of initializing local attributes on the stack
and passing pointer to it to dma_set_attr(), just set the bits.
2. It brings safeness and checking for const correctness because the
attributes are passed by value.
Best regards,
Krzysztof
Krzysztof Kozlowski (44):
dma-mapping: Use unsigned long for dma_attrs
alpha: dma-mapping: Use unsigned long for dma_attrs
arc: dma-mapping: Use unsigned long for dma_attrs
ARM: dma-mapping: Use unsigned long for dma_attrs
arm64: dma-mapping: Use unsigned long for dma_attrs
avr32: dma-mapping: Use unsigned long for dma_attrs
blackfin: dma-mapping: Use unsigned long for dma_attrs
c6x: dma-mapping: Use unsigned long for dma_attrs
cris: dma-mapping: Use unsigned long for dma_attrs
frv: dma-mapping: Use unsigned long for dma_attrs
drm/exynos: dma-mapping: Use unsigned long for dma_attrs
drm/mediatek: dma-mapping: Use unsigned long for dma_attrs
drm/msm: dma-mapping: Use unsigned long for dma_attrs
drm/nouveau: dma-mapping: Use unsigned long for dma_attrs
drm/rockship: dma-mapping: Use unsigned long for dma_attrs
infiniband: dma-mapping: Use unsigned long for dma_attrs
iommu: dma-mapping: Use unsigned long for dma_attrs
[media] dma-mapping: Use unsigned long for dma_attrs
xen: dma-mapping: Use unsigned long for dma_attrs
swiotlb: dma-mapping: Use unsigned long for dma_attrs
powerpc: dma-mapping: Use unsigned long for dma_attrs
video: dma-mapping: Use unsigned long for dma_attrs
x86: dma-mapping: Use unsigned long for dma_attrs
iommu: intel: dma-mapping: Use unsigned long for dma_attrs
h8300: dma-mapping: Use unsigned long for dma_attrs
hexagon: dma-mapping: Use unsigned long for dma_attrs
ia64: dma-mapping: Use unsigned long for dma_attrs
m68k: dma-mapping: Use unsigned long for dma_attrs
metag: dma-mapping: Use unsigned long for dma_attrs
microblaze: dma-mapping: Use unsigned long for dma_attrs
mips: dma-mapping: Use unsigned long for dma_attrs
mn10300: dma-mapping: Use unsigned long for dma_attrs
nios2: dma-mapping: Use unsigned long for dma_attrs
openrisc: dma-mapping: Use unsigned long for dma_attrs
parisc: dma-mapping: Use unsigned long for dma_attrs
misc: mic: dma-mapping: Use unsigned long for dma_attrs
s390: dma-mapping: Use unsigned long for dma_attrs
sh: dma-mapping: Use unsigned long for dma_attrs
sparc: dma-mapping: Use unsigned long for dma_attrs
tile: dma-mapping: Use unsigned long for dma_attrs
unicore32: dma-mapping: Use unsigned long for dma_attrs
xtensa: dma-mapping: Use unsigned long for dma_attrs
dma-mapping: Remove dma_get_attr
dma-mapping: Document the DMA attributes next to the declaration
Documentation/DMA-API.txt | 33 +++---
Documentation/DMA-attributes.txt | 2 +-
arch/alpha/include/asm/dma-mapping.h | 2 -
arch/alpha/kernel/pci-noop.c | 2 +-
arch/alpha/kernel/pci_iommu.c | 12 +-
arch/arc/mm/dma.c | 12 +-
arch/arm/common/dmabounce.c | 4 +-
arch/arm/include/asm/dma-mapping.h | 13 +--
arch/arm/include/asm/xen/page-coherent.h | 16 +--
arch/arm/mm/dma-mapping.c | 121 ++++++++++---------
arch/arm/xen/mm.c | 8 +-
arch/arm64/mm/dma-mapping.c | 67 +++++------
arch/avr32/mm/dma-coherent.c | 12 +-
arch/blackfin/kernel/dma-mapping.c | 8 +-
arch/c6x/include/asm/dma-mapping.h | 4 +-
arch/c6x/kernel/dma.c | 9 +-
arch/c6x/mm/dma-coherent.c | 4 +-
arch/cris/arch-v32/drivers/pci/dma.c | 9 +-
arch/frv/mb93090-mb00/pci-dma-nommu.c | 8 +-
arch/frv/mb93090-mb00/pci-dma.c | 9 +-
arch/h8300/kernel/dma.c | 8 +-
arch/hexagon/include/asm/dma-mapping.h | 1 -
arch/hexagon/kernel/dma.c | 8 +-
arch/ia64/hp/common/sba_iommu.c | 22 ++--
arch/ia64/include/asm/machvec.h | 1 -
arch/ia64/kernel/pci-swiotlb.c | 4 +-
arch/ia64/sn/pci/pci_dma.c | 22 ++--
arch/m68k/kernel/dma.c | 12 +-
arch/metag/kernel/dma.c | 16 +--
arch/microblaze/include/asm/dma-mapping.h | 1 -
arch/microblaze/kernel/dma.c | 12 +-
arch/mips/cavium-octeon/dma-octeon.c | 8 +-
arch/mips/loongson64/common/dma-swiotlb.c | 10 +-
arch/mips/mm/dma-default.c | 20 ++--
arch/mips/netlogic/common/nlm-dma.c | 4 +-
arch/mn10300/mm/dma-alloc.c | 8 +-
arch/nios2/mm/dma-mapping.c | 12 +-
arch/openrisc/kernel/dma.c | 21 ++--
arch/parisc/kernel/pci-dma.c | 18 +--
arch/powerpc/include/asm/dma-mapping.h | 7 +-
arch/powerpc/include/asm/iommu.h | 10 +-
arch/powerpc/kernel/dma-iommu.c | 12 +-
arch/powerpc/kernel/dma.c | 18 +--
arch/powerpc/kernel/ibmebus.c | 12 +-
arch/powerpc/kernel/iommu.c | 12 +-
arch/powerpc/kernel/vio.c | 12 +-
arch/powerpc/platforms/cell/iommu.c | 28 ++---
arch/powerpc/platforms/pasemi/iommu.c | 2 +-
arch/powerpc/platforms/powernv/npu-dma.c | 8 +-
arch/powerpc/platforms/powernv/pci-ioda.c | 4 +-
arch/powerpc/platforms/powernv/pci.c | 2 +-
arch/powerpc/platforms/powernv/pci.h | 2 +-
arch/powerpc/platforms/ps3/system-bus.c | 18 +--
arch/powerpc/platforms/pseries/iommu.c | 6 +-
arch/powerpc/sysdev/dart_iommu.c | 2 +-
arch/s390/include/asm/dma-mapping.h | 1 -
arch/s390/pci/pci_dma.c | 23 ++--
arch/sh/include/asm/dma-mapping.h | 4 +-
arch/sh/kernel/dma-nommu.c | 4 +-
arch/sh/mm/consistent.c | 4 +-
arch/sparc/kernel/iommu.c | 12 +-
arch/sparc/kernel/ioport.c | 24 ++--
arch/sparc/kernel/pci_sun4v.c | 12 +-
arch/tile/kernel/pci-dma.c | 28 ++---
arch/unicore32/mm/dma-swiotlb.c | 4 +-
arch/x86/include/asm/dma-mapping.h | 5 +-
arch/x86/include/asm/swiotlb.h | 4 +-
arch/x86/include/asm/xen/page-coherent.h | 9 +-
arch/x86/kernel/amd_gart_64.c | 20 ++--
arch/x86/kernel/pci-calgary_64.c | 14 +--
arch/x86/kernel/pci-dma.c | 4 +-
arch/x86/kernel/pci-nommu.c | 4 +-
arch/x86/kernel/pci-swiotlb.c | 4 +-
arch/x86/pci/sta2x11-fixup.c | 2 +-
arch/x86/pci/vmd.c | 16 +--
arch/xtensa/kernel/pci-dma.c | 12 +-
drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 2 +-
drivers/gpu/drm/exynos/exynos_drm_g2d.c | 12 +-
drivers/gpu/drm/exynos/exynos_drm_gem.c | 20 ++--
drivers/gpu/drm/exynos/exynos_drm_gem.h | 2 +-
drivers/gpu/drm/mediatek/mtk_drm_gem.c | 13 +--
drivers/gpu/drm/mediatek/mtk_drm_gem.h | 2 +-
drivers/gpu/drm/msm/msm_drv.c | 13 +--
.../gpu/drm/nouveau/nvkm/subdev/instmem/gk20a.c | 13 +--
drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 17 ++-
drivers/gpu/drm/rockchip/rockchip_drm_gem.h | 2 +-
drivers/infiniband/core/umem.c | 7 +-
drivers/iommu/amd_iommu.c | 12 +-
drivers/iommu/dma-iommu.c | 8 +-
drivers/iommu/intel-iommu.c | 12 +-
drivers/media/platform/sti/bdisp/bdisp-hw.c | 26 ++---
drivers/media/v4l2-core/videobuf2-dma-contig.c | 30 ++---
drivers/media/v4l2-core/videobuf2-dma-sg.c | 19 +--
drivers/misc/mic/host/mic_boot.c | 20 ++--
drivers/parisc/ccio-dma.c | 16 +--
drivers/parisc/sba_iommu.c | 16 +--
drivers/video/fbdev/omap2/omapfb/omapfb-main.c | 12 +-
drivers/video/fbdev/omap2/omapfb/omapfb.h | 3 +-
drivers/xen/swiotlb-xen.c | 14 +--
include/linux/dma-attrs.h | 72 ------------
include/linux/dma-iommu.h | 6 +-
include/linux/dma-mapping.h | 128 ++++++++++++++-------
include/linux/swiotlb.h | 10 +-
include/media/videobuf2-dma-contig.h | 7 +-
include/rdma/ib_verbs.h | 8 +-
include/xen/swiotlb-xen.h | 12 +-
lib/dma-noop.c | 9 +-
lib/swiotlb.c | 13 ++-
108 files changed, 691 insertions(+), 793 deletions(-)
delete mode 100644 include/linux/dma-attrs.h
--
1.9.1
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH v4 04/44] ARM: dma-mapping: Use unsigned long for dma_attrs 2016-06-10 10:11 [PATCH v4 00/44] dma-mapping: Use unsigned long for dma_attrs Krzysztof Kozlowski @ 2016-06-10 10:11 ` Krzysztof Kozlowski 2016-06-10 10:11 ` [PATCH v4 05/44] arm64: " Krzysztof Kozlowski ` (3 subsequent siblings) 4 siblings, 0 replies; 8+ messages in thread From: Krzysztof Kozlowski @ 2016-06-10 10:11 UTC (permalink / raw) To: linux-arm-kernel Split out subsystem specific changes for easier reviews. This will be squashed with main commit. Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> --- arch/arm/common/dmabounce.c | 4 +- arch/arm/include/asm/dma-mapping.h | 13 +++-- arch/arm/include/asm/xen/page-coherent.h | 16 +++--- arch/arm/mm/dma-mapping.c | 85 +++++++++++++++----------------- arch/arm/xen/mm.c | 4 +- 5 files changed, 57 insertions(+), 65 deletions(-) diff --git a/arch/arm/common/dmabounce.c b/arch/arm/common/dmabounce.c index 1143c4d5c567..301281645d08 100644 --- a/arch/arm/common/dmabounce.c +++ b/arch/arm/common/dmabounce.c @@ -310,7 +310,7 @@ static inline void unmap_single(struct device *dev, struct safe_buffer *buf, */ static dma_addr_t dmabounce_map_page(struct device *dev, struct page *page, unsigned long offset, size_t size, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { dma_addr_t dma_addr; int ret; @@ -344,7 +344,7 @@ static dma_addr_t dmabounce_map_page(struct device *dev, struct page *page, * should be) */ static void dmabounce_unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, - enum dma_data_direction dir, struct dma_attrs *attrs) + enum dma_data_direction dir, unsigned long attrs) { struct safe_buffer *buf; diff --git a/arch/arm/include/asm/dma-mapping.h b/arch/arm/include/asm/dma-mapping.h index a83570f10124..d009f7911ffc 100644 --- a/arch/arm/include/asm/dma-mapping.h +++ b/arch/arm/include/asm/dma-mapping.h @@ -5,7 +5,6 @@ #include <linux/mm_types.h> #include <linux/scatterlist.h> -#include <linux/dma-attrs.h> #include <linux/dma-debug.h> #include <asm/memory.h> @@ -174,7 +173,7 @@ static inline void dma_mark_clean(void *addr, size_t size) { } * to be the device-viewed address. */ extern void *arm_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, - gfp_t gfp, struct dma_attrs *attrs); + gfp_t gfp, unsigned long attrs); /** * arm_dma_free - free memory allocated by arm_dma_alloc @@ -191,7 +190,7 @@ extern void *arm_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, * during and after this call executing are illegal. */ extern void arm_dma_free(struct device *dev, size_t size, void *cpu_addr, - dma_addr_t handle, struct dma_attrs *attrs); + dma_addr_t handle, unsigned long attrs); /** * arm_dma_mmap - map a coherent DMA allocation into user space @@ -208,7 +207,7 @@ extern void arm_dma_free(struct device *dev, size_t size, void *cpu_addr, */ extern int arm_dma_mmap(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, dma_addr_t dma_addr, size_t size, - struct dma_attrs *attrs); + unsigned long attrs); /* * This can be called during early boot to increase the size of the atomic @@ -262,16 +261,16 @@ extern void dmabounce_unregister_dev(struct device *); * The scatter list versions of the above methods. */ extern int arm_dma_map_sg(struct device *, struct scatterlist *, int, - enum dma_data_direction, struct dma_attrs *attrs); + enum dma_data_direction, unsigned long attrs); extern void arm_dma_unmap_sg(struct device *, struct scatterlist *, int, - enum dma_data_direction, struct dma_attrs *attrs); + enum dma_data_direction, unsigned long attrs); extern void arm_dma_sync_sg_for_cpu(struct device *, struct scatterlist *, int, enum dma_data_direction); extern void arm_dma_sync_sg_for_device(struct device *, struct scatterlist *, int, enum dma_data_direction); extern int arm_dma_get_sgtable(struct device *dev, struct sg_table *sgt, void *cpu_addr, dma_addr_t dma_addr, size_t size, - struct dma_attrs *attrs); + unsigned long attrs); #endif /* __KERNEL__ */ #endif diff --git a/arch/arm/include/asm/xen/page-coherent.h b/arch/arm/include/asm/xen/page-coherent.h index 9408a994cc91..95ce6ac3a971 100644 --- a/arch/arm/include/asm/xen/page-coherent.h +++ b/arch/arm/include/asm/xen/page-coherent.h @@ -2,15 +2,14 @@ #define _ASM_ARM_XEN_PAGE_COHERENT_H #include <asm/page.h> -#include <linux/dma-attrs.h> #include <linux/dma-mapping.h> void __xen_dma_map_page(struct device *hwdev, struct page *page, dma_addr_t dev_addr, unsigned long offset, size_t size, - enum dma_data_direction dir, struct dma_attrs *attrs); + enum dma_data_direction dir, unsigned long attrs); void __xen_dma_unmap_page(struct device *hwdev, dma_addr_t handle, size_t size, enum dma_data_direction dir, - struct dma_attrs *attrs); + unsigned long attrs); void __xen_dma_sync_single_for_cpu(struct device *hwdev, dma_addr_t handle, size_t size, enum dma_data_direction dir); @@ -18,22 +17,20 @@ void __xen_dma_sync_single_for_device(struct device *hwdev, dma_addr_t handle, size_t size, enum dma_data_direction dir); static inline void *xen_alloc_coherent_pages(struct device *hwdev, size_t size, - dma_addr_t *dma_handle, gfp_t flags, - struct dma_attrs *attrs) + dma_addr_t *dma_handle, gfp_t flags, unsigned long attrs) { return __generic_dma_ops(hwdev)->alloc(hwdev, size, dma_handle, flags, attrs); } static inline void xen_free_coherent_pages(struct device *hwdev, size_t size, - void *cpu_addr, dma_addr_t dma_handle, - struct dma_attrs *attrs) + void *cpu_addr, dma_addr_t dma_handle, unsigned long attrs) { __generic_dma_ops(hwdev)->free(hwdev, size, cpu_addr, dma_handle, attrs); } static inline void xen_dma_map_page(struct device *hwdev, struct page *page, dma_addr_t dev_addr, unsigned long offset, size_t size, - enum dma_data_direction dir, struct dma_attrs *attrs) + enum dma_data_direction dir, unsigned long attrs) { unsigned long page_pfn = page_to_xen_pfn(page); unsigned long dev_pfn = XEN_PFN_DOWN(dev_addr); @@ -58,8 +55,7 @@ static inline void xen_dma_map_page(struct device *hwdev, struct page *page, } static inline void xen_dma_unmap_page(struct device *hwdev, dma_addr_t handle, - size_t size, enum dma_data_direction dir, - struct dma_attrs *attrs) + size_t size, enum dma_data_direction dir, unsigned long attrs) { unsigned long pfn = PFN_DOWN(handle); /* diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 4abc50952451..ebb3fde99043 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -124,7 +124,7 @@ static void __dma_page_dev_to_cpu(struct page *, unsigned long, */ static dma_addr_t arm_dma_map_page(struct device *dev, struct page *page, unsigned long offset, size_t size, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { if (!dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs)) __dma_page_cpu_to_dev(page, offset, size, dir); @@ -133,7 +133,7 @@ static dma_addr_t arm_dma_map_page(struct device *dev, struct page *page, static dma_addr_t arm_coherent_dma_map_page(struct device *dev, struct page *page, unsigned long offset, size_t size, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { return pfn_to_dma(dev, page_to_pfn(page)) + offset; } @@ -153,8 +153,7 @@ static dma_addr_t arm_coherent_dma_map_page(struct device *dev, struct page *pag * whatever the device wrote there. */ static void arm_dma_unmap_page(struct device *dev, dma_addr_t handle, - size_t size, enum dma_data_direction dir, - struct dma_attrs *attrs) + size_t size, enum dma_data_direction dir, unsigned long attrs) { if (!dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs)) __dma_page_dev_to_cpu(pfn_to_page(dma_to_pfn(dev, handle)), @@ -194,12 +193,12 @@ struct dma_map_ops arm_dma_ops = { EXPORT_SYMBOL(arm_dma_ops); static void *arm_coherent_dma_alloc(struct device *dev, size_t size, - dma_addr_t *handle, gfp_t gfp, struct dma_attrs *attrs); + dma_addr_t *handle, gfp_t gfp, unsigned long attrs); static void arm_coherent_dma_free(struct device *dev, size_t size, void *cpu_addr, - dma_addr_t handle, struct dma_attrs *attrs); + dma_addr_t handle, unsigned long attrs); static int arm_coherent_dma_mmap(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, dma_addr_t dma_addr, size_t size, - struct dma_attrs *attrs); + unsigned long attrs); struct dma_map_ops arm_coherent_dma_ops = { .alloc = arm_coherent_dma_alloc, @@ -621,7 +620,7 @@ static void __free_from_contiguous(struct device *dev, struct page *page, dma_release_from_contiguous(dev, page, size >> PAGE_SHIFT); } -static inline pgprot_t __get_dma_pgprot(const struct dma_attrs *attrs, pgprot_t prot) +static inline pgprot_t __get_dma_pgprot(unsigned long attrs, pgprot_t prot) { prot = dma_get_attr(DMA_ATTR_WRITE_COMBINE, attrs) ? pgprot_writecombine(prot) : @@ -732,7 +731,7 @@ static struct arm_dma_allocator remap_allocator = { static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, pgprot_t prot, bool is_coherent, - const struct dma_attrs *attrs, const void *caller) + unsigned long attrs, const void *caller) { u64 mask = get_coherent_dma_mask(dev); struct page *page = NULL; @@ -814,7 +813,7 @@ static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, * virtual and bus address for that space. */ void *arm_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, - gfp_t gfp, struct dma_attrs *attrs) + gfp_t gfp, unsigned long attrs) { pgprot_t prot = __get_dma_pgprot(attrs, PAGE_KERNEL); @@ -823,7 +822,7 @@ void *arm_dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, } static void *arm_coherent_dma_alloc(struct device *dev, size_t size, - dma_addr_t *handle, gfp_t gfp, struct dma_attrs *attrs) + dma_addr_t *handle, gfp_t gfp, unsigned long attrs) { return __dma_alloc(dev, size, handle, gfp, PAGE_KERNEL, true, attrs, __builtin_return_address(0)); @@ -831,7 +830,7 @@ static void *arm_coherent_dma_alloc(struct device *dev, size_t size, static int __arm_dma_mmap(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, dma_addr_t dma_addr, size_t size, - struct dma_attrs *attrs) + unsigned long attrs) { int ret = -ENXIO; #ifdef CONFIG_MMU @@ -859,14 +858,14 @@ static int __arm_dma_mmap(struct device *dev, struct vm_area_struct *vma, */ static int arm_coherent_dma_mmap(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, dma_addr_t dma_addr, size_t size, - struct dma_attrs *attrs) + unsigned long attrs) { return __arm_dma_mmap(dev, vma, cpu_addr, dma_addr, size, attrs); } int arm_dma_mmap(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, dma_addr_t dma_addr, size_t size, - struct dma_attrs *attrs) + unsigned long attrs) { #ifdef CONFIG_MMU vma->vm_page_prot = __get_dma_pgprot(attrs, vma->vm_page_prot); @@ -878,7 +877,7 @@ int arm_dma_mmap(struct device *dev, struct vm_area_struct *vma, * Free a buffer as defined by the above mapping. */ static void __arm_dma_free(struct device *dev, size_t size, void *cpu_addr, - dma_addr_t handle, const struct dma_attrs *attrs, + dma_addr_t handle, unsigned long attrs, bool is_coherent) { struct page *page = pfn_to_page(dma_to_pfn(dev, handle)); @@ -900,20 +899,20 @@ static void __arm_dma_free(struct device *dev, size_t size, void *cpu_addr, } void arm_dma_free(struct device *dev, size_t size, void *cpu_addr, - dma_addr_t handle, struct dma_attrs *attrs) + dma_addr_t handle, unsigned long attrs) { __arm_dma_free(dev, size, cpu_addr, handle, attrs, false); } static void arm_coherent_dma_free(struct device *dev, size_t size, void *cpu_addr, - dma_addr_t handle, struct dma_attrs *attrs) + dma_addr_t handle, unsigned long attrs) { __arm_dma_free(dev, size, cpu_addr, handle, attrs, true); } int arm_dma_get_sgtable(struct device *dev, struct sg_table *sgt, void *cpu_addr, dma_addr_t handle, size_t size, - struct dma_attrs *attrs) + unsigned long attrs) { struct page *page = pfn_to_page(dma_to_pfn(dev, handle)); int ret; @@ -1046,7 +1045,7 @@ static void __dma_page_dev_to_cpu(struct page *page, unsigned long off, * here. */ int arm_dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, - enum dma_data_direction dir, struct dma_attrs *attrs) + enum dma_data_direction dir, unsigned long attrs) { struct dma_map_ops *ops = get_dma_ops(dev); struct scatterlist *s; @@ -1080,7 +1079,7 @@ int arm_dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, * rules concerning calls here are the same as for dma_unmap_single(). */ void arm_dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents, - enum dma_data_direction dir, struct dma_attrs *attrs) + enum dma_data_direction dir, unsigned long attrs) { struct dma_map_ops *ops = get_dma_ops(dev); struct scatterlist *s; @@ -1253,8 +1252,7 @@ static inline void __free_iova(struct dma_iommu_mapping *mapping, static const int iommu_order_array[] = { 9, 8, 4, 0 }; static struct page **__iommu_alloc_buffer(struct device *dev, size_t size, - gfp_t gfp, - const struct dma_attrs *attrs) + gfp_t gfp, unsigned long attrs) { struct page **pages; int count = size >> PAGE_SHIFT; @@ -1343,7 +1341,7 @@ error: } static int __iommu_free_buffer(struct device *dev, struct page **pages, - size_t size, const struct dma_attrs *attrs) + size_t size, unsigned long attrs) { int count = size >> PAGE_SHIFT; int i; @@ -1440,8 +1438,7 @@ static struct page **__atomic_get_pages(void *addr) return (struct page **)page; } -static struct page **__iommu_get_pages(void *cpu_addr, - const struct dma_attrs *attrs) +static struct page **__iommu_get_pages(void *cpu_addr, unsigned long attrs) { struct vm_struct *area; @@ -1486,7 +1483,7 @@ static void __iommu_free_atomic(struct device *dev, void *cpu_addr, } static void *arm_iommu_alloc_attrs(struct device *dev, size_t size, - dma_addr_t *handle, gfp_t gfp, struct dma_attrs *attrs) + dma_addr_t *handle, gfp_t gfp, unsigned long attrs) { pgprot_t prot = __get_dma_pgprot(attrs, PAGE_KERNEL); struct page **pages; @@ -1534,7 +1531,7 @@ err_buffer: static int arm_iommu_mmap_attrs(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, dma_addr_t dma_addr, size_t size, - struct dma_attrs *attrs) + unsigned long attrs) { unsigned long uaddr = vma->vm_start; unsigned long usize = vma->vm_end - vma->vm_start; @@ -1570,7 +1567,7 @@ static int arm_iommu_mmap_attrs(struct device *dev, struct vm_area_struct *vma, * Must not be called with IRQs disabled. */ void arm_iommu_free_attrs(struct device *dev, size_t size, void *cpu_addr, - dma_addr_t handle, struct dma_attrs *attrs) + dma_addr_t handle, unsigned long attrs) { struct page **pages; size = PAGE_ALIGN(size); @@ -1597,7 +1594,7 @@ void arm_iommu_free_attrs(struct device *dev, size_t size, void *cpu_addr, static int arm_iommu_get_sgtable(struct device *dev, struct sg_table *sgt, void *cpu_addr, dma_addr_t dma_addr, - size_t size, struct dma_attrs *attrs) + size_t size, unsigned long attrs) { unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT; struct page **pages = __iommu_get_pages(cpu_addr, attrs); @@ -1635,8 +1632,8 @@ static int __dma_direction_to_prot(enum dma_data_direction dir) */ static int __map_sg_chunk(struct device *dev, struct scatterlist *sg, size_t size, dma_addr_t *handle, - enum dma_data_direction dir, - const struct dma_attrs *attrs, bool is_coherent) + enum dma_data_direction dir, unsigned long attrs, + bool is_coherent) { struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); dma_addr_t iova, iova_base; @@ -1678,8 +1675,8 @@ fail: } static int __iommu_map_sg(struct device *dev, struct scatterlist *sg, int nents, - enum dma_data_direction dir, - const struct dma_attrs *attrs, bool is_coherent) + enum dma_data_direction dir, unsigned long attrs, + bool is_coherent) { struct scatterlist *s = sg, *dma = sg, *start = sg; int i, count = 0; @@ -1736,7 +1733,7 @@ bad_mapping: * obtained via sg_dma_{address,length}. */ int arm_coherent_iommu_map_sg(struct device *dev, struct scatterlist *sg, - int nents, enum dma_data_direction dir, struct dma_attrs *attrs) + int nents, enum dma_data_direction dir, unsigned long attrs) { return __iommu_map_sg(dev, sg, nents, dir, attrs, true); } @@ -1754,14 +1751,14 @@ int arm_coherent_iommu_map_sg(struct device *dev, struct scatterlist *sg, * sg_dma_{address,length}. */ int arm_iommu_map_sg(struct device *dev, struct scatterlist *sg, - int nents, enum dma_data_direction dir, struct dma_attrs *attrs) + int nents, enum dma_data_direction dir, unsigned long attrs) { return __iommu_map_sg(dev, sg, nents, dir, attrs, false); } static void __iommu_unmap_sg(struct device *dev, struct scatterlist *sg, int nents, enum dma_data_direction dir, - const struct dma_attrs *attrs, bool is_coherent) + unsigned long attrs, bool is_coherent) { struct scatterlist *s; int i; @@ -1788,7 +1785,8 @@ static void __iommu_unmap_sg(struct device *dev, struct scatterlist *sg, * rules concerning calls here are the same as for dma_unmap_single(). */ void arm_coherent_iommu_unmap_sg(struct device *dev, struct scatterlist *sg, - int nents, enum dma_data_direction dir, struct dma_attrs *attrs) + int nents, enum dma_data_direction dir, + unsigned long attrs) { __iommu_unmap_sg(dev, sg, nents, dir, attrs, true); } @@ -1804,7 +1802,8 @@ void arm_coherent_iommu_unmap_sg(struct device *dev, struct scatterlist *sg, * rules concerning calls here are the same as for dma_unmap_single(). */ void arm_iommu_unmap_sg(struct device *dev, struct scatterlist *sg, int nents, - enum dma_data_direction dir, struct dma_attrs *attrs) + enum dma_data_direction dir, + unsigned long attrs) { __iommu_unmap_sg(dev, sg, nents, dir, attrs, false); } @@ -1857,7 +1856,7 @@ void arm_iommu_sync_sg_for_device(struct device *dev, struct scatterlist *sg, */ static dma_addr_t arm_coherent_iommu_map_page(struct device *dev, struct page *page, unsigned long offset, size_t size, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); dma_addr_t dma_addr; @@ -1891,7 +1890,7 @@ fail: */ static dma_addr_t arm_iommu_map_page(struct device *dev, struct page *page, unsigned long offset, size_t size, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { if (!dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs)) __dma_page_cpu_to_dev(page, offset, size, dir); @@ -1909,8 +1908,7 @@ static dma_addr_t arm_iommu_map_page(struct device *dev, struct page *page, * Coherent IOMMU aware version of arm_dma_unmap_page() */ static void arm_coherent_iommu_unmap_page(struct device *dev, dma_addr_t handle, - size_t size, enum dma_data_direction dir, - struct dma_attrs *attrs) + size_t size, enum dma_data_direction dir, unsigned long attrs) { struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); dma_addr_t iova = handle & PAGE_MASK; @@ -1934,8 +1932,7 @@ static void arm_coherent_iommu_unmap_page(struct device *dev, dma_addr_t handle, * IOMMU aware version of arm_dma_unmap_page() */ static void arm_iommu_unmap_page(struct device *dev, dma_addr_t handle, - size_t size, enum dma_data_direction dir, - struct dma_attrs *attrs) + size_t size, enum dma_data_direction dir, unsigned long attrs) { struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); dma_addr_t iova = handle & PAGE_MASK; diff --git a/arch/arm/xen/mm.c b/arch/arm/xen/mm.c index c5f9a9e3d1f3..fc67ed236a10 100644 --- a/arch/arm/xen/mm.c +++ b/arch/arm/xen/mm.c @@ -98,7 +98,7 @@ static void __xen_dma_page_cpu_to_dev(struct device *hwdev, dma_addr_t handle, void __xen_dma_map_page(struct device *hwdev, struct page *page, dma_addr_t dev_addr, unsigned long offset, size_t size, - enum dma_data_direction dir, struct dma_attrs *attrs) + enum dma_data_direction dir, unsigned long attrs) { if (is_device_dma_coherent(hwdev)) return; @@ -110,7 +110,7 @@ void __xen_dma_map_page(struct device *hwdev, struct page *page, void __xen_dma_unmap_page(struct device *hwdev, dma_addr_t handle, size_t size, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { if (is_device_dma_coherent(hwdev)) -- 1.9.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v4 05/44] arm64: dma-mapping: Use unsigned long for dma_attrs 2016-06-10 10:11 [PATCH v4 00/44] dma-mapping: Use unsigned long for dma_attrs Krzysztof Kozlowski 2016-06-10 10:11 ` [PATCH v4 04/44] ARM: " Krzysztof Kozlowski @ 2016-06-10 10:11 ` Krzysztof Kozlowski 2016-06-10 10:51 ` Robin Murphy 2016-06-10 10:11 ` [PATCH v4 11/44] drm/exynos: " Krzysztof Kozlowski ` (2 subsequent siblings) 4 siblings, 1 reply; 8+ messages in thread From: Krzysztof Kozlowski @ 2016-06-10 10:11 UTC (permalink / raw) To: linux-arm-kernel Split out subsystem specific changes for easier reviews. This will be squashed with main commit. Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> --- arch/arm64/mm/dma-mapping.c | 57 +++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c index 0ef620a34c4e..a7686028dfeb 100644 --- a/arch/arm64/mm/dma-mapping.c +++ b/arch/arm64/mm/dma-mapping.c @@ -29,7 +29,7 @@ #include <asm/cacheflush.h> -static pgprot_t __get_dma_pgprot(const struct dma_attrs *attrs, pgprot_t prot, +static pgprot_t __get_dma_pgprot(unsigned long attrs, pgprot_t prot, bool coherent) { if (!coherent || dma_get_attr(DMA_ATTR_WRITE_COMBINE, attrs)) @@ -88,7 +88,7 @@ static int __free_from_pool(void *start, size_t size) static void *__dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flags, - const struct dma_attrs *attrs) + unsigned long attrs) { if (dev == NULL) { WARN_ONCE(1, "Use an actual device structure for DMA allocation\n"); @@ -118,7 +118,7 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size, static void __dma_free_coherent(struct device *dev, size_t size, void *vaddr, dma_addr_t dma_handle, - const struct dma_attrs *attrs) + unsigned long attrs) { bool freed; phys_addr_t paddr = dma_to_phys(dev, dma_handle); @@ -137,7 +137,7 @@ static void __dma_free_coherent(struct device *dev, size_t size, static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flags, - struct dma_attrs *attrs) + unsigned long attrs) { struct page *page; void *ptr, *coherent_ptr; @@ -185,7 +185,7 @@ no_mem: static void __dma_free(struct device *dev, size_t size, void *vaddr, dma_addr_t dma_handle, - struct dma_attrs *attrs) + unsigned long attrs) { void *swiotlb_addr = phys_to_virt(dma_to_phys(dev, dma_handle)); @@ -202,7 +202,7 @@ static void __dma_free(struct device *dev, size_t size, static dma_addr_t __swiotlb_map_page(struct device *dev, struct page *page, unsigned long offset, size_t size, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { dma_addr_t dev_addr; @@ -216,7 +216,7 @@ static dma_addr_t __swiotlb_map_page(struct device *dev, struct page *page, static void __swiotlb_unmap_page(struct device *dev, dma_addr_t dev_addr, size_t size, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { if (!is_device_dma_coherent(dev)) __dma_unmap_area(phys_to_virt(dma_to_phys(dev, dev_addr)), size, dir); @@ -225,7 +225,7 @@ static void __swiotlb_unmap_page(struct device *dev, dma_addr_t dev_addr, static int __swiotlb_map_sg_attrs(struct device *dev, struct scatterlist *sgl, int nelems, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { struct scatterlist *sg; int i, ret; @@ -242,7 +242,7 @@ static int __swiotlb_map_sg_attrs(struct device *dev, struct scatterlist *sgl, static void __swiotlb_unmap_sg_attrs(struct device *dev, struct scatterlist *sgl, int nelems, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { struct scatterlist *sg; int i; @@ -303,7 +303,7 @@ static void __swiotlb_sync_sg_for_device(struct device *dev, static int __swiotlb_mmap(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, dma_addr_t dma_addr, size_t size, - struct dma_attrs *attrs) + unsigned long attrs) { int ret = -ENXIO; unsigned long nr_vma_pages = (vma->vm_end - vma->vm_start) >> @@ -330,7 +330,7 @@ static int __swiotlb_mmap(struct device *dev, static int __swiotlb_get_sgtable(struct device *dev, struct sg_table *sgt, void *cpu_addr, dma_addr_t handle, size_t size, - struct dma_attrs *attrs) + unsigned long attrs) { int ret = sg_alloc_table(sgt, 1, GFP_KERNEL); @@ -425,21 +425,21 @@ out: static void *__dummy_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flags, - struct dma_attrs *attrs) + unsigned long attrs) { return NULL; } static void __dummy_free(struct device *dev, size_t size, void *vaddr, dma_addr_t dma_handle, - struct dma_attrs *attrs) + unsigned long attrs) { } static int __dummy_mmap(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, dma_addr_t dma_addr, size_t size, - struct dma_attrs *attrs) + unsigned long attrs) { return -ENXIO; } @@ -447,20 +447,20 @@ static int __dummy_mmap(struct device *dev, static dma_addr_t __dummy_map_page(struct device *dev, struct page *page, unsigned long offset, size_t size, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { return DMA_ERROR_CODE; } static void __dummy_unmap_page(struct device *dev, dma_addr_t dev_addr, size_t size, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { } static int __dummy_map_sg(struct device *dev, struct scatterlist *sgl, int nelems, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { return 0; } @@ -468,7 +468,7 @@ static int __dummy_map_sg(struct device *dev, struct scatterlist *sgl, static void __dummy_unmap_sg(struct device *dev, struct scatterlist *sgl, int nelems, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { } @@ -540,7 +540,7 @@ static void flush_page(struct device *dev, const void *virt, phys_addr_t phys) static void *__iommu_alloc_attrs(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp, - struct dma_attrs *attrs) + unsigned long attrs) { bool coherent = is_device_dma_coherent(dev); int ioprot = dma_direction_to_prot(DMA_BIDIRECTIONAL, coherent); @@ -600,7 +600,8 @@ static void *__iommu_alloc_attrs(struct device *dev, size_t size, } static void __iommu_free_attrs(struct device *dev, size_t size, void *cpu_addr, - dma_addr_t handle, struct dma_attrs *attrs) + dma_addr_t handle, + unsigned long attrs) { size_t iosize = size; @@ -616,7 +617,7 @@ static void __iommu_free_attrs(struct device *dev, size_t size, void *cpu_addr, * Hence how dodgy the below logic looks... */ if (__in_atomic_pool(cpu_addr, size)) { - iommu_dma_unmap_page(dev, handle, iosize, 0, NULL); + iommu_dma_unmap_page(dev, handle, iosize, 0, 0); __free_from_pool(cpu_addr, size); } else if (is_vmalloc_addr(cpu_addr)){ struct vm_struct *area = find_vm_area(cpu_addr); @@ -626,14 +627,14 @@ static void __iommu_free_attrs(struct device *dev, size_t size, void *cpu_addr, iommu_dma_free(dev, area->pages, iosize, &handle); dma_common_free_remap(cpu_addr, size, VM_USERMAP); } else { - iommu_dma_unmap_page(dev, handle, iosize, 0, NULL); + iommu_dma_unmap_page(dev, handle, iosize, 0, 0); __free_pages(virt_to_page(cpu_addr), get_order(size)); } } static int __iommu_mmap_attrs(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, dma_addr_t dma_addr, size_t size, - struct dma_attrs *attrs) + unsigned long attrs) { struct vm_struct *area; int ret; @@ -653,7 +654,7 @@ static int __iommu_mmap_attrs(struct device *dev, struct vm_area_struct *vma, static int __iommu_get_sgtable(struct device *dev, struct sg_table *sgt, void *cpu_addr, dma_addr_t dma_addr, - size_t size, struct dma_attrs *attrs) + size_t size, unsigned long attrs) { unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT; struct vm_struct *area = find_vm_area(cpu_addr); @@ -694,7 +695,7 @@ static void __iommu_sync_single_for_device(struct device *dev, static dma_addr_t __iommu_map_page(struct device *dev, struct page *page, unsigned long offset, size_t size, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { bool coherent = is_device_dma_coherent(dev); int prot = dma_direction_to_prot(dir, coherent); @@ -709,7 +710,7 @@ static dma_addr_t __iommu_map_page(struct device *dev, struct page *page, static void __iommu_unmap_page(struct device *dev, dma_addr_t dev_addr, size_t size, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { if (!dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs)) __iommu_sync_single_for_cpu(dev, dev_addr, size, dir); @@ -747,7 +748,7 @@ static void __iommu_sync_sg_for_device(struct device *dev, static int __iommu_map_sg_attrs(struct device *dev, struct scatterlist *sgl, int nelems, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { bool coherent = is_device_dma_coherent(dev); @@ -761,7 +762,7 @@ static int __iommu_map_sg_attrs(struct device *dev, struct scatterlist *sgl, static void __iommu_unmap_sg_attrs(struct device *dev, struct scatterlist *sgl, int nelems, enum dma_data_direction dir, - struct dma_attrs *attrs) + unsigned long attrs) { if (!dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs)) __iommu_sync_sg_for_cpu(dev, sgl, nelems, dir); -- 1.9.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v4 05/44] arm64: dma-mapping: Use unsigned long for dma_attrs 2016-06-10 10:11 ` [PATCH v4 05/44] arm64: " Krzysztof Kozlowski @ 2016-06-10 10:51 ` Robin Murphy 2016-06-10 10:55 ` Krzysztof Kozlowski 0 siblings, 1 reply; 8+ messages in thread From: Robin Murphy @ 2016-06-10 10:51 UTC (permalink / raw) To: linux-arm-kernel Hi Krzysztof, On 10/06/16 11:11, Krzysztof Kozlowski wrote: > Split out subsystem specific changes for easier reviews. This will be > squashed with main commit. > > Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> > --- > arch/arm64/mm/dma-mapping.c | 57 +++++++++++++++++++++++---------------------- > 1 file changed, 29 insertions(+), 28 deletions(-) > > diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c > index 0ef620a34c4e..a7686028dfeb 100644 > --- a/arch/arm64/mm/dma-mapping.c > +++ b/arch/arm64/mm/dma-mapping.c > @@ -29,7 +29,7 @@ > > #include <asm/cacheflush.h> > > -static pgprot_t __get_dma_pgprot(const struct dma_attrs *attrs, pgprot_t prot, > +static pgprot_t __get_dma_pgprot(unsigned long attrs, pgprot_t prot, > bool coherent) Is this series intended to replace the patches currently in -next adding that "const"? (I was momentarily puzzled why this wouldn't apply locally) > { > if (!coherent || dma_get_attr(DMA_ATTR_WRITE_COMBINE, attrs)) > @@ -88,7 +88,7 @@ static int __free_from_pool(void *start, size_t size) > > static void *__dma_alloc_coherent(struct device *dev, size_t size, > dma_addr_t *dma_handle, gfp_t flags, > - const struct dma_attrs *attrs) > + unsigned long attrs) > { > if (dev == NULL) { > WARN_ONCE(1, "Use an actual device structure for DMA allocation\n"); > @@ -118,7 +118,7 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size, > > static void __dma_free_coherent(struct device *dev, size_t size, > void *vaddr, dma_addr_t dma_handle, > - const struct dma_attrs *attrs) > + unsigned long attrs) > { > bool freed; > phys_addr_t paddr = dma_to_phys(dev, dma_handle); > @@ -137,7 +137,7 @@ static void __dma_free_coherent(struct device *dev, size_t size, > > static void *__dma_alloc(struct device *dev, size_t size, > dma_addr_t *dma_handle, gfp_t flags, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > struct page *page; > void *ptr, *coherent_ptr; > @@ -185,7 +185,7 @@ no_mem: > > static void __dma_free(struct device *dev, size_t size, > void *vaddr, dma_addr_t dma_handle, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > void *swiotlb_addr = phys_to_virt(dma_to_phys(dev, dma_handle)); > > @@ -202,7 +202,7 @@ static void __dma_free(struct device *dev, size_t size, > static dma_addr_t __swiotlb_map_page(struct device *dev, struct page *page, > unsigned long offset, size_t size, > enum dma_data_direction dir, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > dma_addr_t dev_addr; > > @@ -216,7 +216,7 @@ static dma_addr_t __swiotlb_map_page(struct device *dev, struct page *page, > > static void __swiotlb_unmap_page(struct device *dev, dma_addr_t dev_addr, > size_t size, enum dma_data_direction dir, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > if (!is_device_dma_coherent(dev)) > __dma_unmap_area(phys_to_virt(dma_to_phys(dev, dev_addr)), size, dir); > @@ -225,7 +225,7 @@ static void __swiotlb_unmap_page(struct device *dev, dma_addr_t dev_addr, > > static int __swiotlb_map_sg_attrs(struct device *dev, struct scatterlist *sgl, > int nelems, enum dma_data_direction dir, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > struct scatterlist *sg; > int i, ret; > @@ -242,7 +242,7 @@ static int __swiotlb_map_sg_attrs(struct device *dev, struct scatterlist *sgl, > static void __swiotlb_unmap_sg_attrs(struct device *dev, > struct scatterlist *sgl, int nelems, > enum dma_data_direction dir, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > struct scatterlist *sg; > int i; > @@ -303,7 +303,7 @@ static void __swiotlb_sync_sg_for_device(struct device *dev, > static int __swiotlb_mmap(struct device *dev, > struct vm_area_struct *vma, > void *cpu_addr, dma_addr_t dma_addr, size_t size, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > int ret = -ENXIO; > unsigned long nr_vma_pages = (vma->vm_end - vma->vm_start) >> > @@ -330,7 +330,7 @@ static int __swiotlb_mmap(struct device *dev, > > static int __swiotlb_get_sgtable(struct device *dev, struct sg_table *sgt, > void *cpu_addr, dma_addr_t handle, size_t size, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > int ret = sg_alloc_table(sgt, 1, GFP_KERNEL); > > @@ -425,21 +425,21 @@ out: > > static void *__dummy_alloc(struct device *dev, size_t size, > dma_addr_t *dma_handle, gfp_t flags, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > return NULL; > } > > static void __dummy_free(struct device *dev, size_t size, > void *vaddr, dma_addr_t dma_handle, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > } > > static int __dummy_mmap(struct device *dev, > struct vm_area_struct *vma, > void *cpu_addr, dma_addr_t dma_addr, size_t size, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > return -ENXIO; > } > @@ -447,20 +447,20 @@ static int __dummy_mmap(struct device *dev, > static dma_addr_t __dummy_map_page(struct device *dev, struct page *page, > unsigned long offset, size_t size, > enum dma_data_direction dir, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > return DMA_ERROR_CODE; > } > > static void __dummy_unmap_page(struct device *dev, dma_addr_t dev_addr, > size_t size, enum dma_data_direction dir, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > } > > static int __dummy_map_sg(struct device *dev, struct scatterlist *sgl, > int nelems, enum dma_data_direction dir, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > return 0; > } > @@ -468,7 +468,7 @@ static int __dummy_map_sg(struct device *dev, struct scatterlist *sgl, > static void __dummy_unmap_sg(struct device *dev, > struct scatterlist *sgl, int nelems, > enum dma_data_direction dir, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > } > > @@ -540,7 +540,7 @@ static void flush_page(struct device *dev, const void *virt, phys_addr_t phys) > > static void *__iommu_alloc_attrs(struct device *dev, size_t size, > dma_addr_t *handle, gfp_t gfp, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > bool coherent = is_device_dma_coherent(dev); > int ioprot = dma_direction_to_prot(DMA_BIDIRECTIONAL, coherent); > @@ -600,7 +600,8 @@ static void *__iommu_alloc_attrs(struct device *dev, size_t size, > } > > static void __iommu_free_attrs(struct device *dev, size_t size, void *cpu_addr, > - dma_addr_t handle, struct dma_attrs *attrs) > + dma_addr_t handle, > + unsigned long attrs) Nit: unnecessary line break? Otherwise, though, I'm all for the idea; Acked-by: Robin Murphy <robin.murphy@arm.com> > { > size_t iosize = size; > > @@ -616,7 +617,7 @@ static void __iommu_free_attrs(struct device *dev, size_t size, void *cpu_addr, > * Hence how dodgy the below logic looks... > */ > if (__in_atomic_pool(cpu_addr, size)) { > - iommu_dma_unmap_page(dev, handle, iosize, 0, NULL); > + iommu_dma_unmap_page(dev, handle, iosize, 0, 0); > __free_from_pool(cpu_addr, size); > } else if (is_vmalloc_addr(cpu_addr)){ > struct vm_struct *area = find_vm_area(cpu_addr); > @@ -626,14 +627,14 @@ static void __iommu_free_attrs(struct device *dev, size_t size, void *cpu_addr, > iommu_dma_free(dev, area->pages, iosize, &handle); > dma_common_free_remap(cpu_addr, size, VM_USERMAP); > } else { > - iommu_dma_unmap_page(dev, handle, iosize, 0, NULL); > + iommu_dma_unmap_page(dev, handle, iosize, 0, 0); > __free_pages(virt_to_page(cpu_addr), get_order(size)); > } > } > > static int __iommu_mmap_attrs(struct device *dev, struct vm_area_struct *vma, > void *cpu_addr, dma_addr_t dma_addr, size_t size, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > struct vm_struct *area; > int ret; > @@ -653,7 +654,7 @@ static int __iommu_mmap_attrs(struct device *dev, struct vm_area_struct *vma, > > static int __iommu_get_sgtable(struct device *dev, struct sg_table *sgt, > void *cpu_addr, dma_addr_t dma_addr, > - size_t size, struct dma_attrs *attrs) > + size_t size, unsigned long attrs) > { > unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT; > struct vm_struct *area = find_vm_area(cpu_addr); > @@ -694,7 +695,7 @@ static void __iommu_sync_single_for_device(struct device *dev, > static dma_addr_t __iommu_map_page(struct device *dev, struct page *page, > unsigned long offset, size_t size, > enum dma_data_direction dir, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > bool coherent = is_device_dma_coherent(dev); > int prot = dma_direction_to_prot(dir, coherent); > @@ -709,7 +710,7 @@ static dma_addr_t __iommu_map_page(struct device *dev, struct page *page, > > static void __iommu_unmap_page(struct device *dev, dma_addr_t dev_addr, > size_t size, enum dma_data_direction dir, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > if (!dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs)) > __iommu_sync_single_for_cpu(dev, dev_addr, size, dir); > @@ -747,7 +748,7 @@ static void __iommu_sync_sg_for_device(struct device *dev, > > static int __iommu_map_sg_attrs(struct device *dev, struct scatterlist *sgl, > int nelems, enum dma_data_direction dir, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > bool coherent = is_device_dma_coherent(dev); > > @@ -761,7 +762,7 @@ static int __iommu_map_sg_attrs(struct device *dev, struct scatterlist *sgl, > static void __iommu_unmap_sg_attrs(struct device *dev, > struct scatterlist *sgl, int nelems, > enum dma_data_direction dir, > - struct dma_attrs *attrs) > + unsigned long attrs) > { > if (!dma_get_attr(DMA_ATTR_SKIP_CPU_SYNC, attrs)) > __iommu_sync_sg_for_cpu(dev, sgl, nelems, dir); > ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v4 05/44] arm64: dma-mapping: Use unsigned long for dma_attrs 2016-06-10 10:51 ` Robin Murphy @ 2016-06-10 10:55 ` Krzysztof Kozlowski 0 siblings, 0 replies; 8+ messages in thread From: Krzysztof Kozlowski @ 2016-06-10 10:55 UTC (permalink / raw) To: linux-arm-kernel On 06/10/2016 12:51 PM, Robin Murphy wrote: > Hi Krzysztof, > > On 10/06/16 11:11, Krzysztof Kozlowski wrote: >> Split out subsystem specific changes for easier reviews. This will be >> squashed with main commit. >> >> Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> >> --- >> arch/arm64/mm/dma-mapping.c | 57 >> +++++++++++++++++++++++---------------------- >> 1 file changed, 29 insertions(+), 28 deletions(-) >> >> diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c >> index 0ef620a34c4e..a7686028dfeb 100644 >> --- a/arch/arm64/mm/dma-mapping.c >> +++ b/arch/arm64/mm/dma-mapping.c >> @@ -29,7 +29,7 @@ >> >> #include <asm/cacheflush.h> >> >> -static pgprot_t __get_dma_pgprot(const struct dma_attrs *attrs, >> pgprot_t prot, >> +static pgprot_t __get_dma_pgprot(unsigned long attrs, pgprot_t prot, >> bool coherent) > > Is this series intended to replace the patches currently in -next adding > that "const"? (I was momentarily puzzled why this wouldn't apply locally) Yes, the series replace completely my previous const changes (applied by Andrew Morton). I rebased the patchset on linux-next so I could grab all recent changes around dma_attrs. Probably that should be changed before applying - choose one tree to base on (Andrew's?). If you would like to play with the entire series (on top of next): https://github.com/krzk/linux/tree/for-next/dma-attrs-const-v4 > >> { >> if (!coherent || dma_get_attr(DMA_ATTR_WRITE_COMBINE, attrs)) >> @@ -88,7 +88,7 @@ static int __free_from_pool(void *start, size_t size) >> >> static void *__dma_alloc_coherent(struct device *dev, size_t size, >> dma_addr_t *dma_handle, gfp_t flags, >> - const struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> if (dev == NULL) { >> WARN_ONCE(1, "Use an actual device structure for DMA >> allocation\n"); >> @@ -118,7 +118,7 @@ static void *__dma_alloc_coherent(struct device >> *dev, size_t size, >> >> static void __dma_free_coherent(struct device *dev, size_t size, >> void *vaddr, dma_addr_t dma_handle, >> - const struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> bool freed; >> phys_addr_t paddr = dma_to_phys(dev, dma_handle); >> @@ -137,7 +137,7 @@ static void __dma_free_coherent(struct device >> *dev, size_t size, >> >> static void *__dma_alloc(struct device *dev, size_t size, >> dma_addr_t *dma_handle, gfp_t flags, >> - struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> struct page *page; >> void *ptr, *coherent_ptr; >> @@ -185,7 +185,7 @@ no_mem: >> >> static void __dma_free(struct device *dev, size_t size, >> void *vaddr, dma_addr_t dma_handle, >> - struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> void *swiotlb_addr = phys_to_virt(dma_to_phys(dev, dma_handle)); >> >> @@ -202,7 +202,7 @@ static void __dma_free(struct device *dev, size_t >> size, >> static dma_addr_t __swiotlb_map_page(struct device *dev, struct page >> *page, >> unsigned long offset, size_t size, >> enum dma_data_direction dir, >> - struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> dma_addr_t dev_addr; >> >> @@ -216,7 +216,7 @@ static dma_addr_t __swiotlb_map_page(struct device >> *dev, struct page *page, >> >> static void __swiotlb_unmap_page(struct device *dev, dma_addr_t >> dev_addr, >> size_t size, enum dma_data_direction dir, >> - struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> if (!is_device_dma_coherent(dev)) >> __dma_unmap_area(phys_to_virt(dma_to_phys(dev, dev_addr)), >> size, dir); >> @@ -225,7 +225,7 @@ static void __swiotlb_unmap_page(struct device >> *dev, dma_addr_t dev_addr, >> >> static int __swiotlb_map_sg_attrs(struct device *dev, struct >> scatterlist *sgl, >> int nelems, enum dma_data_direction dir, >> - struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> struct scatterlist *sg; >> int i, ret; >> @@ -242,7 +242,7 @@ static int __swiotlb_map_sg_attrs(struct device >> *dev, struct scatterlist *sgl, >> static void __swiotlb_unmap_sg_attrs(struct device *dev, >> struct scatterlist *sgl, int nelems, >> enum dma_data_direction dir, >> - struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> struct scatterlist *sg; >> int i; >> @@ -303,7 +303,7 @@ static void __swiotlb_sync_sg_for_device(struct >> device *dev, >> static int __swiotlb_mmap(struct device *dev, >> struct vm_area_struct *vma, >> void *cpu_addr, dma_addr_t dma_addr, size_t size, >> - struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> int ret = -ENXIO; >> unsigned long nr_vma_pages = (vma->vm_end - vma->vm_start) >> >> @@ -330,7 +330,7 @@ static int __swiotlb_mmap(struct device *dev, >> >> static int __swiotlb_get_sgtable(struct device *dev, struct sg_table >> *sgt, >> void *cpu_addr, dma_addr_t handle, size_t size, >> - struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> int ret = sg_alloc_table(sgt, 1, GFP_KERNEL); >> >> @@ -425,21 +425,21 @@ out: >> >> static void *__dummy_alloc(struct device *dev, size_t size, >> dma_addr_t *dma_handle, gfp_t flags, >> - struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> return NULL; >> } >> >> static void __dummy_free(struct device *dev, size_t size, >> void *vaddr, dma_addr_t dma_handle, >> - struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> } >> >> static int __dummy_mmap(struct device *dev, >> struct vm_area_struct *vma, >> void *cpu_addr, dma_addr_t dma_addr, size_t size, >> - struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> return -ENXIO; >> } >> @@ -447,20 +447,20 @@ static int __dummy_mmap(struct device *dev, >> static dma_addr_t __dummy_map_page(struct device *dev, struct page >> *page, >> unsigned long offset, size_t size, >> enum dma_data_direction dir, >> - struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> return DMA_ERROR_CODE; >> } >> >> static void __dummy_unmap_page(struct device *dev, dma_addr_t dev_addr, >> size_t size, enum dma_data_direction dir, >> - struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> } >> >> static int __dummy_map_sg(struct device *dev, struct scatterlist *sgl, >> int nelems, enum dma_data_direction dir, >> - struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> return 0; >> } >> @@ -468,7 +468,7 @@ static int __dummy_map_sg(struct device *dev, >> struct scatterlist *sgl, >> static void __dummy_unmap_sg(struct device *dev, >> struct scatterlist *sgl, int nelems, >> enum dma_data_direction dir, >> - struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> } >> >> @@ -540,7 +540,7 @@ static void flush_page(struct device *dev, const >> void *virt, phys_addr_t phys) >> >> static void *__iommu_alloc_attrs(struct device *dev, size_t size, >> dma_addr_t *handle, gfp_t gfp, >> - struct dma_attrs *attrs) >> + unsigned long attrs) >> { >> bool coherent = is_device_dma_coherent(dev); >> int ioprot = dma_direction_to_prot(DMA_BIDIRECTIONAL, coherent); >> @@ -600,7 +600,8 @@ static void *__iommu_alloc_attrs(struct device >> *dev, size_t size, >> } >> >> static void __iommu_free_attrs(struct device *dev, size_t size, void >> *cpu_addr, >> - dma_addr_t handle, struct dma_attrs *attrs) >> + dma_addr_t handle, >> + unsigned long attrs) > > Nit: unnecessary line break? > > Otherwise, though, I'm all for the idea; > > Acked-by: Robin Murphy <robin.murphy@arm.com> Right, thanks! Best regards, Krzysztof ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v4 11/44] drm/exynos: dma-mapping: Use unsigned long for dma_attrs 2016-06-10 10:11 [PATCH v4 00/44] dma-mapping: Use unsigned long for dma_attrs Krzysztof Kozlowski 2016-06-10 10:11 ` [PATCH v4 04/44] ARM: " Krzysztof Kozlowski 2016-06-10 10:11 ` [PATCH v4 05/44] arm64: " Krzysztof Kozlowski @ 2016-06-10 10:11 ` Krzysztof Kozlowski 2016-06-10 10:11 ` [PATCH v4 12/44] drm/mediatek: " Krzysztof Kozlowski 2016-06-10 10:11 ` [PATCH v4 15/44] drm/rockship: " Krzysztof Kozlowski 4 siblings, 0 replies; 8+ messages in thread From: Krzysztof Kozlowski @ 2016-06-10 10:11 UTC (permalink / raw) To: linux-arm-kernel Split out subsystem specific changes for easier reviews. This will be squashed with main commit. Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> --- drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 2 +- drivers/gpu/drm/exynos/exynos_drm_g2d.c | 12 +++++------- drivers/gpu/drm/exynos/exynos_drm_gem.c | 20 ++++++++++---------- drivers/gpu/drm/exynos/exynos_drm_gem.h | 2 +- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c index 67dcd6831291..dd091175fc2d 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c @@ -52,7 +52,7 @@ static int exynos_drm_fb_mmap(struct fb_info *info, ret = dma_mmap_attrs(to_dma_dev(helper->dev), vma, exynos_gem->cookie, exynos_gem->dma_addr, exynos_gem->size, - &exynos_gem->dma_attrs); + exynos_gem->dma_attrs); if (ret < 0) { DRM_ERROR("failed to mmap.\n"); return ret; diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c index 493552368295..15539aea8415 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c +++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c @@ -17,7 +17,6 @@ #include <linux/slab.h> #include <linux/workqueue.h> #include <linux/dma-mapping.h> -#include <linux/dma-attrs.h> #include <linux/of.h> #include <drm/drmP.h> @@ -235,7 +234,7 @@ struct g2d_data { struct mutex cmdlist_mutex; dma_addr_t cmdlist_pool; void *cmdlist_pool_virt; - struct dma_attrs cmdlist_dma_attrs; + unsigned long cmdlist_dma_attrs; /* runqueue*/ struct g2d_runqueue_node *runqueue_node; @@ -256,13 +255,12 @@ static int g2d_init_cmdlist(struct g2d_data *g2d) int ret; struct g2d_buf_info *buf_info; - init_dma_attrs(&g2d->cmdlist_dma_attrs); - dma_set_attr(DMA_ATTR_WRITE_COMBINE, &g2d->cmdlist_dma_attrs); + g2d->cmdlist_dma_attrs = DMA_ATTR_WRITE_COMBINE; g2d->cmdlist_pool_virt = dma_alloc_attrs(to_dma_dev(subdrv->drm_dev), G2D_CMDLIST_POOL_SIZE, &g2d->cmdlist_pool, GFP_KERNEL, - &g2d->cmdlist_dma_attrs); + g2d->cmdlist_dma_attrs); if (!g2d->cmdlist_pool_virt) { dev_err(dev, "failed to allocate dma memory\n"); return -ENOMEM; @@ -295,7 +293,7 @@ static int g2d_init_cmdlist(struct g2d_data *g2d) err: dma_free_attrs(to_dma_dev(subdrv->drm_dev), G2D_CMDLIST_POOL_SIZE, g2d->cmdlist_pool_virt, - g2d->cmdlist_pool, &g2d->cmdlist_dma_attrs); + g2d->cmdlist_pool, g2d->cmdlist_dma_attrs); return ret; } @@ -309,7 +307,7 @@ static void g2d_fini_cmdlist(struct g2d_data *g2d) dma_free_attrs(to_dma_dev(subdrv->drm_dev), G2D_CMDLIST_POOL_SIZE, g2d->cmdlist_pool_virt, - g2d->cmdlist_pool, &g2d->cmdlist_dma_attrs); + g2d->cmdlist_pool, g2d->cmdlist_dma_attrs); } } diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index cdf9f1af4347..f2ae72ba7d5a 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c @@ -24,7 +24,7 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem) { struct drm_device *dev = exynos_gem->base.dev; - enum dma_attr attr; + unsigned long attr; unsigned int nr_pages; struct sg_table sgt; int ret = -ENOMEM; @@ -34,7 +34,7 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem) return 0; } - init_dma_attrs(&exynos_gem->dma_attrs); + exynos_gem->dma_attrs = 0; /* * if EXYNOS_BO_CONTIG, fully physically contiguous memory @@ -42,7 +42,7 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem) * as possible. */ if (!(exynos_gem->flags & EXYNOS_BO_NONCONTIG)) - dma_set_attr(DMA_ATTR_FORCE_CONTIGUOUS, &exynos_gem->dma_attrs); + exynos_gem->dma_attrs |= DMA_ATTR_FORCE_CONTIGUOUS; /* * if EXYNOS_BO_WC or EXYNOS_BO_NONCACHABLE, writecombine mapping @@ -54,8 +54,8 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem) else attr = DMA_ATTR_NON_CONSISTENT; - dma_set_attr(attr, &exynos_gem->dma_attrs); - dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &exynos_gem->dma_attrs); + exynos_gem->dma_attrs |= attr; + exynos_gem->dma_attrs |= DMA_ATTR_NO_KERNEL_MAPPING; nr_pages = exynos_gem->size >> PAGE_SHIFT; @@ -67,7 +67,7 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem) exynos_gem->cookie = dma_alloc_attrs(to_dma_dev(dev), exynos_gem->size, &exynos_gem->dma_addr, GFP_KERNEL, - &exynos_gem->dma_attrs); + exynos_gem->dma_attrs); if (!exynos_gem->cookie) { DRM_ERROR("failed to allocate buffer.\n"); goto err_free; @@ -75,7 +75,7 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem) ret = dma_get_sgtable_attrs(to_dma_dev(dev), &sgt, exynos_gem->cookie, exynos_gem->dma_addr, exynos_gem->size, - &exynos_gem->dma_attrs); + exynos_gem->dma_attrs); if (ret < 0) { DRM_ERROR("failed to get sgtable.\n"); goto err_dma_free; @@ -99,7 +99,7 @@ err_sgt_free: sg_free_table(&sgt); err_dma_free: dma_free_attrs(to_dma_dev(dev), exynos_gem->size, exynos_gem->cookie, - exynos_gem->dma_addr, &exynos_gem->dma_attrs); + exynos_gem->dma_addr, exynos_gem->dma_attrs); err_free: drm_free_large(exynos_gem->pages); @@ -120,7 +120,7 @@ static void exynos_drm_free_buf(struct exynos_drm_gem *exynos_gem) dma_free_attrs(to_dma_dev(dev), exynos_gem->size, exynos_gem->cookie, (dma_addr_t)exynos_gem->dma_addr, - &exynos_gem->dma_attrs); + exynos_gem->dma_attrs); drm_free_large(exynos_gem->pages); } @@ -346,7 +346,7 @@ static int exynos_drm_gem_mmap_buffer(struct exynos_drm_gem *exynos_gem, ret = dma_mmap_attrs(to_dma_dev(drm_dev), vma, exynos_gem->cookie, exynos_gem->dma_addr, exynos_gem->size, - &exynos_gem->dma_attrs); + exynos_gem->dma_attrs); if (ret < 0) { DRM_ERROR("failed to mmap.\n"); return ret; diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.h b/drivers/gpu/drm/exynos/exynos_drm_gem.h index 78100742281d..df7c543d6558 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.h +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.h @@ -50,7 +50,7 @@ struct exynos_drm_gem { void *cookie; void __iomem *kvaddr; dma_addr_t dma_addr; - struct dma_attrs dma_attrs; + unsigned long dma_attrs; struct page **pages; struct sg_table *sgt; }; -- 1.9.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v4 12/44] drm/mediatek: dma-mapping: Use unsigned long for dma_attrs 2016-06-10 10:11 [PATCH v4 00/44] dma-mapping: Use unsigned long for dma_attrs Krzysztof Kozlowski ` (2 preceding siblings ...) 2016-06-10 10:11 ` [PATCH v4 11/44] drm/exynos: " Krzysztof Kozlowski @ 2016-06-10 10:11 ` Krzysztof Kozlowski 2016-06-10 10:11 ` [PATCH v4 15/44] drm/rockship: " Krzysztof Kozlowski 4 siblings, 0 replies; 8+ messages in thread From: Krzysztof Kozlowski @ 2016-06-10 10:11 UTC (permalink / raw) To: linux-arm-kernel Split out subsystem specific changes for easier reviews. This will be squashed with main commit. Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> --- drivers/gpu/drm/mediatek/mtk_drm_gem.c | 13 ++++++------- drivers/gpu/drm/mediatek/mtk_drm_gem.h | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/mediatek/mtk_drm_gem.c b/drivers/gpu/drm/mediatek/mtk_drm_gem.c index fa2ec0cd00e8..7abc550ebc00 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_gem.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_gem.c @@ -54,15 +54,14 @@ struct mtk_drm_gem_obj *mtk_drm_gem_create(struct drm_device *dev, obj = &mtk_gem->base; - init_dma_attrs(&mtk_gem->dma_attrs); - dma_set_attr(DMA_ATTR_WRITE_COMBINE, &mtk_gem->dma_attrs); + mtk_gem->dma_attrs = DMA_ATTR_WRITE_COMBINE; if (!alloc_kmap) - dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &mtk_gem->dma_attrs); + mtk_gem->dma_attrs |= DMA_ATTR_NO_KERNEL_MAPPING; mtk_gem->cookie = dma_alloc_attrs(priv->dma_dev, obj->size, &mtk_gem->dma_addr, GFP_KERNEL, - &mtk_gem->dma_attrs); + mtk_gem->dma_attrs); if (!mtk_gem->cookie) { DRM_ERROR("failed to allocate %zx byte dma buffer", obj->size); ret = -ENOMEM; @@ -93,7 +92,7 @@ void mtk_drm_gem_free_object(struct drm_gem_object *obj) drm_prime_gem_destroy(obj, mtk_gem->sg); else dma_free_attrs(priv->dma_dev, obj->size, mtk_gem->cookie, - mtk_gem->dma_addr, &mtk_gem->dma_attrs); + mtk_gem->dma_addr, mtk_gem->dma_attrs); /* release file pointer to gem object. */ drm_gem_object_release(obj); @@ -173,7 +172,7 @@ static int mtk_drm_gem_object_mmap(struct drm_gem_object *obj, vma->vm_pgoff = 0; ret = dma_mmap_attrs(priv->dma_dev, vma, mtk_gem->cookie, - mtk_gem->dma_addr, obj->size, &mtk_gem->dma_attrs); + mtk_gem->dma_addr, obj->size, mtk_gem->dma_attrs); if (ret) drm_gem_vm_close(vma); @@ -224,7 +223,7 @@ struct sg_table *mtk_gem_prime_get_sg_table(struct drm_gem_object *obj) ret = dma_get_sgtable_attrs(priv->dma_dev, sgt, mtk_gem->cookie, mtk_gem->dma_addr, obj->size, - &mtk_gem->dma_attrs); + mtk_gem->dma_attrs); if (ret) { DRM_ERROR("failed to allocate sgt, %d\n", ret); kfree(sgt); diff --git a/drivers/gpu/drm/mediatek/mtk_drm_gem.h b/drivers/gpu/drm/mediatek/mtk_drm_gem.h index 3a2a5624a1cb..2752718fa5b2 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_gem.h +++ b/drivers/gpu/drm/mediatek/mtk_drm_gem.h @@ -35,7 +35,7 @@ struct mtk_drm_gem_obj { void *cookie; void *kvaddr; dma_addr_t dma_addr; - struct dma_attrs dma_attrs; + unsigned long dma_attrs; struct sg_table *sg; }; -- 1.9.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v4 15/44] drm/rockship: dma-mapping: Use unsigned long for dma_attrs 2016-06-10 10:11 [PATCH v4 00/44] dma-mapping: Use unsigned long for dma_attrs Krzysztof Kozlowski ` (3 preceding siblings ...) 2016-06-10 10:11 ` [PATCH v4 12/44] drm/mediatek: " Krzysztof Kozlowski @ 2016-06-10 10:11 ` Krzysztof Kozlowski 4 siblings, 0 replies; 8+ messages in thread From: Krzysztof Kozlowski @ 2016-06-10 10:11 UTC (permalink / raw) To: linux-arm-kernel Split out subsystem specific changes for easier reviews. This will be squashed with main commit. Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> --- drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 17 +++++++---------- drivers/gpu/drm/rockchip/rockchip_drm_gem.h | 2 +- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c index 9c2d8a894093..7b1788e2a808 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c @@ -17,8 +17,6 @@ #include <drm/drm_gem.h> #include <drm/drm_vma_manager.h> -#include <linux/dma-attrs.h> - #include "rockchip_drm_drv.h" #include "rockchip_drm_gem.h" @@ -28,15 +26,14 @@ static int rockchip_gem_alloc_buf(struct rockchip_gem_object *rk_obj, struct drm_gem_object *obj = &rk_obj->base; struct drm_device *drm = obj->dev; - init_dma_attrs(&rk_obj->dma_attrs); - dma_set_attr(DMA_ATTR_WRITE_COMBINE, &rk_obj->dma_attrs); + rk_obj->dma_attrs = DMA_ATTR_WRITE_COMBINE; if (!alloc_kmap) - dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &rk_obj->dma_attrs); + rk_obj->dma_attrs |= DMA_ATTR_NO_KERNEL_MAPPING; rk_obj->kvaddr = dma_alloc_attrs(drm->dev, obj->size, &rk_obj->dma_addr, GFP_KERNEL, - &rk_obj->dma_attrs); + rk_obj->dma_attrs); if (!rk_obj->kvaddr) { DRM_ERROR("failed to allocate %#x byte dma buffer", obj->size); return -ENOMEM; @@ -51,7 +48,7 @@ static void rockchip_gem_free_buf(struct rockchip_gem_object *rk_obj) struct drm_device *drm = obj->dev; dma_free_attrs(drm->dev, obj->size, rk_obj->kvaddr, rk_obj->dma_addr, - &rk_obj->dma_attrs); + rk_obj->dma_attrs); } static int rockchip_drm_gem_object_mmap(struct drm_gem_object *obj, @@ -70,7 +67,7 @@ static int rockchip_drm_gem_object_mmap(struct drm_gem_object *obj, vma->vm_pgoff = 0; ret = dma_mmap_attrs(drm->dev, vma, rk_obj->kvaddr, rk_obj->dma_addr, - obj->size, &rk_obj->dma_attrs); + obj->size, rk_obj->dma_attrs); if (ret) drm_gem_vm_close(vma); @@ -262,7 +259,7 @@ struct sg_table *rockchip_gem_prime_get_sg_table(struct drm_gem_object *obj) ret = dma_get_sgtable_attrs(drm->dev, sgt, rk_obj->kvaddr, rk_obj->dma_addr, obj->size, - &rk_obj->dma_attrs); + rk_obj->dma_attrs); if (ret) { DRM_ERROR("failed to allocate sgt, %d\n", ret); kfree(sgt); @@ -276,7 +273,7 @@ void *rockchip_gem_prime_vmap(struct drm_gem_object *obj) { struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj); - if (dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, &rk_obj->dma_attrs)) + if (dma_get_attr(DMA_ATTR_NO_KERNEL_MAPPING, rk_obj->dma_attrs)) return NULL; return rk_obj->kvaddr; diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h index ad22618473a4..18b3488db4ec 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h @@ -23,7 +23,7 @@ struct rockchip_gem_object { void *kvaddr; dma_addr_t dma_addr; - struct dma_attrs dma_attrs; + unsigned long dma_attrs; }; struct sg_table *rockchip_gem_prime_get_sg_table(struct drm_gem_object *obj); -- 1.9.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2016-06-10 10:55 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-06-10 10:11 [PATCH v4 00/44] dma-mapping: Use unsigned long for dma_attrs Krzysztof Kozlowski 2016-06-10 10:11 ` [PATCH v4 04/44] ARM: " Krzysztof Kozlowski 2016-06-10 10:11 ` [PATCH v4 05/44] arm64: " Krzysztof Kozlowski 2016-06-10 10:51 ` Robin Murphy 2016-06-10 10:55 ` Krzysztof Kozlowski 2016-06-10 10:11 ` [PATCH v4 11/44] drm/exynos: " Krzysztof Kozlowski 2016-06-10 10:11 ` [PATCH v4 12/44] drm/mediatek: " Krzysztof Kozlowski 2016-06-10 10:11 ` [PATCH v4 15/44] drm/rockship: " Krzysztof Kozlowski
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox