* remove default fallbacks in dma_map_ops @ 2019-07-25 6:33 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel Hi all, we have a few places where the DMA mapping layer has non-trivial default actions that are questionable and/or dangerous. This series instead wires up the mmap, get_sgtable and get_required_mask methods explicitly and cleans up some surrounding areas. This also means we could get rid of the ARCH_NO_COHERENT_DMA_MMAP kconfig option, as we now require a mmap method wired up, or in case of non-coherent dma-direct the presence of the arch_dma_coherent_to_pfn hook. The only interesting case is that the sound code also checked the ARCH_NO_COHERENT_DMA_MMAP symbol in somewhat odd ways, so I'd like to see a review of the sound situation before going forward with that patch. _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply [flat|nested] 60+ messages in thread
* remove default fallbacks in dma_map_ops @ 2019-07-25 6:33 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel Hi all, we have a few places where the DMA mapping layer has non-trivial default actions that are questionable and/or dangerous. This series instead wires up the mmap, get_sgtable and get_required_mask methods explicitly and cleans up some surrounding areas. This also means we could get rid of the ARCH_NO_COHERENT_DMA_MMAP kconfig option, as we now require a mmap method wired up, or in case of non-coherent dma-direct the presence of the arch_dma_coherent_to_pfn hook. The only interesting case is that the sound code also checked the ARCH_NO_COHERENT_DMA_MMAP symbol in somewhat odd ways, so I'd like to see a review of the sound situation before going forward with that patch. _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 60+ messages in thread
* remove default fallbacks in dma_map_ops @ 2019-07-25 6:33 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel Hi all, we have a few places where the DMA mapping layer has non-trivial default actions that are questionable and/or dangerous. This series instead wires up the mmap, get_sgtable and get_required_mask methods explicitly and cleans up some surrounding areas. This also means we could get rid of the ARCH_NO_COHERENT_DMA_MMAP kconfig option, as we now require a mmap method wired up, or in case of non-coherent dma-direct the presence of the arch_dma_coherent_to_pfn hook. The only interesting case is that the sound code also checked the ARCH_NO_COHERENT_DMA_MMAP symbol in somewhat odd ways, so I'd like to see a review of the sound situation before going forward with that patch. ^ permalink raw reply [flat|nested] 60+ messages in thread
* remove default fallbacks in dma_map_ops @ 2019-07-25 6:33 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel Hi all, we have a few places where the DMA mapping layer has non-trivial default actions that are questionable and/or dangerous. This series instead wires up the mmap, get_sgtable and get_required_mask methods explicitly and cleans up some surrounding areas. This also means we could get rid of the ARCH_NO_COHERENT_DMA_MMAP kconfig option, as we now require a mmap method wired up, or in case of non-coherent dma-direct the presence of the arch_dma_coherent_to_pfn hook. The only interesting case is that the sound code also checked the ARCH_NO_COHERENT_DMA_MMAP symbol in somewhat odd ways, so I'd like to see a review of the sound situation before going forward with that patch. ^ permalink raw reply [flat|nested] 60+ messages in thread
* remove default fallbacks in dma_map_ops @ 2019-07-25 6:33 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: Takashi Iwai, Robin Murphy, Michal Simek, linux-arm-kernel, linux-m68k, linux-parisc, linux-sh, linux-xtensa, linuxppc-dev, x86, linux-kernel Hi all, we have a few places where the DMA mapping layer has non-trivial default actions that are questionable and/or dangerous. This series instead wires up the mmap, get_sgtable and get_required_mask methods explicitly and cleans up some surrounding areas. This also means we could get rid of the ARCH_NO_COHERENT_DMA_MMAP kconfig option, as we now require a mmap method wired up, or in case of non-coherent dma-direct the presence of the arch_dma_coherent_to_pfn hook. The only interesting case is that the sound code also checked the ARCH_NO_COHERENT_DMA_MMAP symbol in somewhat odd ways, so I'd like to see a review of the sound situation before going forward with that patch. ^ permalink raw reply [flat|nested] 60+ messages in thread
* [PATCH 1/5] m68knommu: add a pgprot_noncached stub 2019-07-25 6:33 ` Christoph Hellwig ` (2 preceding siblings ...) (?) @ 2019-07-25 6:33 ` Christoph Hellwig -1 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel Provide a pgprot_noncached like all the other nommu ports so that common code can rely on it being able to be present. Note that this is generally code that is not actually run on nommu, but at least we can avoid nasty ifdefs by having a stub. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/m68k/include/asm/pgtable_no.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/m68k/include/asm/pgtable_no.h b/arch/m68k/include/asm/pgtable_no.h index fc3a96c77bd8..06194c7ba151 100644 --- a/arch/m68k/include/asm/pgtable_no.h +++ b/arch/m68k/include/asm/pgtable_no.h @@ -29,6 +29,8 @@ #define PAGE_READONLY __pgprot(0) #define PAGE_KERNEL __pgprot(0) +#define pgprot_noncached(prot) (prot) + extern void paging_init(void); #define swapper_pg_dir ((pgd_t *) 0) -- 2.20.1 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 1/5] m68knommu: add a pgprot_noncached stub @ 2019-07-25 6:33 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel Provide a pgprot_noncached like all the other nommu ports so that common code can rely on it being able to be present. Note that this is generally code that is not actually run on nommu, but at least we can avoid nasty ifdefs by having a stub. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/m68k/include/asm/pgtable_no.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/m68k/include/asm/pgtable_no.h b/arch/m68k/include/asm/pgtable_no.h index fc3a96c77bd8..06194c7ba151 100644 --- a/arch/m68k/include/asm/pgtable_no.h +++ b/arch/m68k/include/asm/pgtable_no.h @@ -29,6 +29,8 @@ #define PAGE_READONLY __pgprot(0) #define PAGE_KERNEL __pgprot(0) +#define pgprot_noncached(prot) (prot) + extern void paging_init(void); #define swapper_pg_dir ((pgd_t *) 0) -- 2.20.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 1/5] m68knommu: add a pgprot_noncached stub @ 2019-07-25 6:33 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel Provide a pgprot_noncached like all the other nommu ports so that common code can rely on it being able to be present. Note that this is generally code that is not actually run on nommu, but at least we can avoid nasty ifdefs by having a stub. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/m68k/include/asm/pgtable_no.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/m68k/include/asm/pgtable_no.h b/arch/m68k/include/asm/pgtable_no.h index fc3a96c77bd8..06194c7ba151 100644 --- a/arch/m68k/include/asm/pgtable_no.h +++ b/arch/m68k/include/asm/pgtable_no.h @@ -29,6 +29,8 @@ #define PAGE_READONLY __pgprot(0) #define PAGE_KERNEL __pgprot(0) +#define pgprot_noncached(prot) (prot) + extern void paging_init(void); #define swapper_pg_dir ((pgd_t *) 0) -- 2.20.1 ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 1/5] m68knommu: add a pgprot_noncached stub @ 2019-07-25 6:33 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel Provide a pgprot_noncached like all the other nommu ports so that common code can rely on it being able to be present. Note that this is generally code that is not actually run on nommu, but at least we can avoid nasty ifdefs by having a stub. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/m68k/include/asm/pgtable_no.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/m68k/include/asm/pgtable_no.h b/arch/m68k/include/asm/pgtable_no.h index fc3a96c77bd8..06194c7ba151 100644 --- a/arch/m68k/include/asm/pgtable_no.h +++ b/arch/m68k/include/asm/pgtable_no.h @@ -29,6 +29,8 @@ #define PAGE_READONLY __pgprot(0) #define PAGE_KERNEL __pgprot(0) +#define pgprot_noncached(prot) (prot) + extern void paging_init(void); #define swapper_pg_dir ((pgd_t *) 0) -- 2.20.1 ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 1/5] m68knommu: add a pgprot_noncached stub @ 2019-07-25 6:33 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: Takashi Iwai, Robin Murphy, Michal Simek, linux-arm-kernel, linux-m68k, linux-parisc, linux-sh, linux-xtensa, linuxppc-dev, x86, linux-kernel Provide a pgprot_noncached like all the other nommu ports so that common code can rely on it being able to be present. Note that this is generally code that is not actually run on nommu, but at least we can avoid nasty ifdefs by having a stub. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/m68k/include/asm/pgtable_no.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/m68k/include/asm/pgtable_no.h b/arch/m68k/include/asm/pgtable_no.h index fc3a96c77bd8..06194c7ba151 100644 --- a/arch/m68k/include/asm/pgtable_no.h +++ b/arch/m68k/include/asm/pgtable_no.h @@ -29,6 +29,8 @@ #define PAGE_READONLY __pgprot(0) #define PAGE_KERNEL __pgprot(0) +#define pgprot_noncached(prot) (prot) + extern void paging_init(void); #define swapper_pg_dir ((pgd_t *) 0) -- 2.20.1 ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 2/5] dma-mapping: move the dma_get_sgtable API comments from arm to common code 2019-07-25 6:33 ` Christoph Hellwig ` (2 preceding siblings ...) (?) @ 2019-07-25 6:33 ` Christoph Hellwig -1 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel The comments are spot on and should be near the central API, not just near a single implementation. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/arm/mm/dma-mapping.c | 11 ----------- kernel/dma/mapping.c | 11 +++++++++++ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 6774b03aa405..4410af33c5c4 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -877,17 +877,6 @@ static void arm_coherent_dma_free(struct device *dev, size_t size, void *cpu_add __arm_dma_free(dev, size, cpu_addr, handle, attrs, true); } -/* - * The whole dma_get_sgtable() idea is fundamentally unsafe - it seems - * that the intention is to allow exporting memory allocated via the - * coherent DMA APIs through the dma_buf API, which only accepts a - * scattertable. This presents a couple of problems: - * 1. Not all memory allocated via the coherent DMA APIs is backed by - * a struct page - * 2. Passing coherent DMA memory into the streaming APIs is not allowed - * as we will try to flush the memory through a different alias to that - * actually being used (and the flushes are redundant.) - */ int arm_dma_get_sgtable(struct device *dev, struct sg_table *sgt, void *cpu_addr, dma_addr_t handle, size_t size, unsigned long attrs) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index b945239621d8..4ceb5b9016d8 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -136,6 +136,17 @@ int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, return ret; } +/* + * The whole dma_get_sgtable() idea is fundamentally unsafe - it seems + * that the intention is to allow exporting memory allocated via the + * coherent DMA APIs through the dma_buf API, which only accepts a + * scattertable. This presents a couple of problems: + * 1. Not all memory allocated via the coherent DMA APIs is backed by + * a struct page + * 2. Passing coherent DMA memory into the streaming APIs is not allowed + * as we will try to flush the memory through a different alias to that + * actually being used (and the flushes are redundant.) + */ int dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, void *cpu_addr, dma_addr_t dma_addr, size_t size, unsigned long attrs) -- 2.20.1 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 2/5] dma-mapping: move the dma_get_sgtable API comments from arm to common code @ 2019-07-25 6:33 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel The comments are spot on and should be near the central API, not just near a single implementation. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/arm/mm/dma-mapping.c | 11 ----------- kernel/dma/mapping.c | 11 +++++++++++ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 6774b03aa405..4410af33c5c4 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -877,17 +877,6 @@ static void arm_coherent_dma_free(struct device *dev, size_t size, void *cpu_add __arm_dma_free(dev, size, cpu_addr, handle, attrs, true); } -/* - * The whole dma_get_sgtable() idea is fundamentally unsafe - it seems - * that the intention is to allow exporting memory allocated via the - * coherent DMA APIs through the dma_buf API, which only accepts a - * scattertable. This presents a couple of problems: - * 1. Not all memory allocated via the coherent DMA APIs is backed by - * a struct page - * 2. Passing coherent DMA memory into the streaming APIs is not allowed - * as we will try to flush the memory through a different alias to that - * actually being used (and the flushes are redundant.) - */ int arm_dma_get_sgtable(struct device *dev, struct sg_table *sgt, void *cpu_addr, dma_addr_t handle, size_t size, unsigned long attrs) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index b945239621d8..4ceb5b9016d8 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -136,6 +136,17 @@ int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, return ret; } +/* + * The whole dma_get_sgtable() idea is fundamentally unsafe - it seems + * that the intention is to allow exporting memory allocated via the + * coherent DMA APIs through the dma_buf API, which only accepts a + * scattertable. This presents a couple of problems: + * 1. Not all memory allocated via the coherent DMA APIs is backed by + * a struct page + * 2. Passing coherent DMA memory into the streaming APIs is not allowed + * as we will try to flush the memory through a different alias to that + * actually being used (and the flushes are redundant.) + */ int dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, void *cpu_addr, dma_addr_t dma_addr, size_t size, unsigned long attrs) -- 2.20.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 2/5] dma-mapping: move the dma_get_sgtable API comments from arm to common code @ 2019-07-25 6:33 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel The comments are spot on and should be near the central API, not just near a single implementation. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/arm/mm/dma-mapping.c | 11 ----------- kernel/dma/mapping.c | 11 +++++++++++ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 6774b03aa405..4410af33c5c4 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -877,17 +877,6 @@ static void arm_coherent_dma_free(struct device *dev, size_t size, void *cpu_add __arm_dma_free(dev, size, cpu_addr, handle, attrs, true); } -/* - * The whole dma_get_sgtable() idea is fundamentally unsafe - it seems - * that the intention is to allow exporting memory allocated via the - * coherent DMA APIs through the dma_buf API, which only accepts a - * scattertable. This presents a couple of problems: - * 1. Not all memory allocated via the coherent DMA APIs is backed by - * a struct page - * 2. Passing coherent DMA memory into the streaming APIs is not allowed - * as we will try to flush the memory through a different alias to that - * actually being used (and the flushes are redundant.) - */ int arm_dma_get_sgtable(struct device *dev, struct sg_table *sgt, void *cpu_addr, dma_addr_t handle, size_t size, unsigned long attrs) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index b945239621d8..4ceb5b9016d8 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -136,6 +136,17 @@ int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, return ret; } +/* + * The whole dma_get_sgtable() idea is fundamentally unsafe - it seems + * that the intention is to allow exporting memory allocated via the + * coherent DMA APIs through the dma_buf API, which only accepts a + * scattertable. This presents a couple of problems: + * 1. Not all memory allocated via the coherent DMA APIs is backed by + * a struct page + * 2. Passing coherent DMA memory into the streaming APIs is not allowed + * as we will try to flush the memory through a different alias to that + * actually being used (and the flushes are redundant.) + */ int dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, void *cpu_addr, dma_addr_t dma_addr, size_t size, unsigned long attrs) -- 2.20.1 ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 2/5] dma-mapping: move the dma_get_sgtable API comments from arm to common code @ 2019-07-25 6:33 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel The comments are spot on and should be near the central API, not just near a single implementation. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/arm/mm/dma-mapping.c | 11 ----------- kernel/dma/mapping.c | 11 +++++++++++ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 6774b03aa405..4410af33c5c4 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -877,17 +877,6 @@ static void arm_coherent_dma_free(struct device *dev, size_t size, void *cpu_add __arm_dma_free(dev, size, cpu_addr, handle, attrs, true); } -/* - * The whole dma_get_sgtable() idea is fundamentally unsafe - it seems - * that the intention is to allow exporting memory allocated via the - * coherent DMA APIs through the dma_buf API, which only accepts a - * scattertable. This presents a couple of problems: - * 1. Not all memory allocated via the coherent DMA APIs is backed by - * a struct page - * 2. Passing coherent DMA memory into the streaming APIs is not allowed - * as we will try to flush the memory through a different alias to that - * actually being used (and the flushes are redundant.) - */ int arm_dma_get_sgtable(struct device *dev, struct sg_table *sgt, void *cpu_addr, dma_addr_t handle, size_t size, unsigned long attrs) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index b945239621d8..4ceb5b9016d8 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -136,6 +136,17 @@ int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, return ret; } +/* + * The whole dma_get_sgtable() idea is fundamentally unsafe - it seems + * that the intention is to allow exporting memory allocated via the + * coherent DMA APIs through the dma_buf API, which only accepts a + * scattertable. This presents a couple of problems: + * 1. Not all memory allocated via the coherent DMA APIs is backed by + * a struct page + * 2. Passing coherent DMA memory into the streaming APIs is not allowed + * as we will try to flush the memory through a different alias to that + * actually being used (and the flushes are redundant.) + */ int dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, void *cpu_addr, dma_addr_t dma_addr, size_t size, unsigned long attrs) -- 2.20.1 ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 2/5] dma-mapping: move the dma_get_sgtable API comments from arm to common code @ 2019-07-25 6:33 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: Takashi Iwai, Robin Murphy, Michal Simek, linux-arm-kernel, linux-m68k, linux-parisc, linux-sh, linux-xtensa, linuxppc-dev, x86, linux-kernel The comments are spot on and should be near the central API, not just near a single implementation. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/arm/mm/dma-mapping.c | 11 ----------- kernel/dma/mapping.c | 11 +++++++++++ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 6774b03aa405..4410af33c5c4 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -877,17 +877,6 @@ static void arm_coherent_dma_free(struct device *dev, size_t size, void *cpu_add __arm_dma_free(dev, size, cpu_addr, handle, attrs, true); } -/* - * The whole dma_get_sgtable() idea is fundamentally unsafe - it seems - * that the intention is to allow exporting memory allocated via the - * coherent DMA APIs through the dma_buf API, which only accepts a - * scattertable. This presents a couple of problems: - * 1. Not all memory allocated via the coherent DMA APIs is backed by - * a struct page - * 2. Passing coherent DMA memory into the streaming APIs is not allowed - * as we will try to flush the memory through a different alias to that - * actually being used (and the flushes are redundant.) - */ int arm_dma_get_sgtable(struct device *dev, struct sg_table *sgt, void *cpu_addr, dma_addr_t handle, size_t size, unsigned long attrs) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index b945239621d8..4ceb5b9016d8 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -136,6 +136,17 @@ int dma_common_get_sgtable(struct device *dev, struct sg_table *sgt, return ret; } +/* + * The whole dma_get_sgtable() idea is fundamentally unsafe - it seems + * that the intention is to allow exporting memory allocated via the + * coherent DMA APIs through the dma_buf API, which only accepts a + * scattertable. This presents a couple of problems: + * 1. Not all memory allocated via the coherent DMA APIs is backed by + * a struct page + * 2. Passing coherent DMA memory into the streaming APIs is not allowed + * as we will try to flush the memory through a different alias to that + * actually being used (and the flushes are redundant.) + */ int dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, void *cpu_addr, dma_addr_t dma_addr, size_t size, unsigned long attrs) -- 2.20.1 ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 3/5] dma-mapping: explicitly wire up ->mmap and ->get_sgtable 2019-07-25 6:33 ` Christoph Hellwig ` (2 preceding siblings ...) (?) @ 2019-07-25 6:33 ` Christoph Hellwig -1 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel While the default ->mmap and ->get_sgtable implementations work for the majority of our dma_map_ops impementations they are inherently safe for others that don't use the page allocator or CMA and/or use their own way of remapping not covered by the common code. So remove the defaults if these methods are not wired up, but instead wire up the default implementations for all safe instances. Fixes: e1c7e324539a ("dma-mapping: always provide the dma_map_ops based implementation") Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/alpha/kernel/pci_iommu.c | 2 ++ arch/ia64/hp/common/sba_iommu.c | 2 ++ arch/ia64/sn/pci/pci_dma.c | 2 ++ arch/mips/jazz/jazzdma.c | 2 ++ arch/powerpc/kernel/dma-iommu.c | 2 ++ arch/powerpc/platforms/ps3/system-bus.c | 4 ++++ arch/powerpc/platforms/pseries/vio.c | 2 ++ arch/s390/pci/pci_dma.c | 2 ++ arch/sparc/kernel/iommu.c | 2 ++ arch/sparc/kernel/pci_sun4v.c | 2 ++ arch/x86/kernel/amd_gart_64.c | 2 ++ arch/x86/kernel/pci-calgary_64.c | 2 ++ drivers/iommu/amd_iommu.c | 2 ++ drivers/iommu/intel-iommu.c | 2 ++ kernel/dma/mapping.c | 20 ++++++++++++-------- 15 files changed, 42 insertions(+), 8 deletions(-) diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c index 242108439f42..7f1925a32c99 100644 --- a/arch/alpha/kernel/pci_iommu.c +++ b/arch/alpha/kernel/pci_iommu.c @@ -955,5 +955,7 @@ const struct dma_map_ops alpha_pci_ops = { .map_sg = alpha_pci_map_sg, .unmap_sg = alpha_pci_unmap_sg, .dma_supported = alpha_pci_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; EXPORT_SYMBOL(alpha_pci_ops); diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c index 3d24cc43385b..4c0ea6c2833d 100644 --- a/arch/ia64/hp/common/sba_iommu.c +++ b/arch/ia64/hp/common/sba_iommu.c @@ -2183,6 +2183,8 @@ const struct dma_map_ops sba_dma_ops = { .map_sg = sba_map_sg_attrs, .unmap_sg = sba_unmap_sg_attrs, .dma_supported = sba_dma_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; void sba_dma_init(void) diff --git a/arch/ia64/sn/pci/pci_dma.c b/arch/ia64/sn/pci/pci_dma.c index b7d42e4edc1f..12ffb9c0d738 100644 --- a/arch/ia64/sn/pci/pci_dma.c +++ b/arch/ia64/sn/pci/pci_dma.c @@ -438,6 +438,8 @@ static struct dma_map_ops sn_dma_ops = { .unmap_sg = sn_dma_unmap_sg, .dma_supported = sn_dma_supported, .get_required_mask = sn_dma_get_required_mask, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; void sn_dma_init(void) diff --git a/arch/mips/jazz/jazzdma.c b/arch/mips/jazz/jazzdma.c index 1804dc9d8136..a01e14955187 100644 --- a/arch/mips/jazz/jazzdma.c +++ b/arch/mips/jazz/jazzdma.c @@ -682,5 +682,7 @@ const struct dma_map_ops jazz_dma_ops = { .sync_sg_for_device = jazz_dma_sync_sg_for_device, .dma_supported = dma_direct_supported, .cache_sync = arch_dma_cache_sync, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; EXPORT_SYMBOL(jazz_dma_ops); diff --git a/arch/powerpc/kernel/dma-iommu.c b/arch/powerpc/kernel/dma-iommu.c index a0879674a9c8..2f5a53874f6d 100644 --- a/arch/powerpc/kernel/dma-iommu.c +++ b/arch/powerpc/kernel/dma-iommu.c @@ -208,4 +208,6 @@ const struct dma_map_ops dma_iommu_ops = { .sync_single_for_device = dma_iommu_sync_for_device, .sync_sg_for_cpu = dma_iommu_sync_sg_for_cpu, .sync_sg_for_device = dma_iommu_sync_sg_for_device, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c index 98410119c47b..70fcc9736a8c 100644 --- a/arch/powerpc/platforms/ps3/system-bus.c +++ b/arch/powerpc/platforms/ps3/system-bus.c @@ -700,6 +700,8 @@ static const struct dma_map_ops ps3_sb_dma_ops = { .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_sb_map_page, .unmap_page = ps3_unmap_page, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static const struct dma_map_ops ps3_ioc0_dma_ops = { @@ -711,6 +713,8 @@ static const struct dma_map_ops ps3_ioc0_dma_ops = { .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_ioc0_map_page, .unmap_page = ps3_unmap_page, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; /** diff --git a/arch/powerpc/platforms/pseries/vio.c b/arch/powerpc/platforms/pseries/vio.c index 6601b9d404dc..3473eef7628c 100644 --- a/arch/powerpc/platforms/pseries/vio.c +++ b/arch/powerpc/platforms/pseries/vio.c @@ -605,6 +605,8 @@ static const struct dma_map_ops vio_dma_mapping_ops = { .unmap_page = vio_dma_iommu_unmap_page, .dma_supported = dma_iommu_dma_supported, .get_required_mask = dma_iommu_get_required_mask, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; /** diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c index 9e52d1527f71..03d8c1c9f82f 100644 --- a/arch/s390/pci/pci_dma.c +++ b/arch/s390/pci/pci_dma.c @@ -668,6 +668,8 @@ const struct dma_map_ops s390_pci_dma_ops = { .unmap_sg = s390_dma_unmap_sg, .map_page = s390_dma_map_pages, .unmap_page = s390_dma_unmap_pages, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, /* dma_supported is unconditionally true without a callback */ }; EXPORT_SYMBOL_GPL(s390_pci_dma_ops); diff --git a/arch/sparc/kernel/iommu.c b/arch/sparc/kernel/iommu.c index 4ae7388b1bff..c915a7cbcc91 100644 --- a/arch/sparc/kernel/iommu.c +++ b/arch/sparc/kernel/iommu.c @@ -763,6 +763,8 @@ static const struct dma_map_ops sun4u_dma_ops = { .sync_single_for_cpu = dma_4u_sync_single_for_cpu, .sync_sg_for_cpu = dma_4u_sync_sg_for_cpu, .dma_supported = dma_4u_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; const struct dma_map_ops *dma_ops = &sun4u_dma_ops; diff --git a/arch/sparc/kernel/pci_sun4v.c b/arch/sparc/kernel/pci_sun4v.c index 14b93c5564e3..ab6909642ae1 100644 --- a/arch/sparc/kernel/pci_sun4v.c +++ b/arch/sparc/kernel/pci_sun4v.c @@ -692,6 +692,8 @@ static const struct dma_map_ops sun4v_dma_ops = { .map_sg = dma_4v_map_sg, .unmap_sg = dma_4v_unmap_sg, .dma_supported = dma_4v_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static void pci_sun4v_scan_bus(struct pci_pbm_info *pbm, struct device *parent) diff --git a/arch/x86/kernel/amd_gart_64.c b/arch/x86/kernel/amd_gart_64.c index a585ea6f686a..a65b4a9c7f87 100644 --- a/arch/x86/kernel/amd_gart_64.c +++ b/arch/x86/kernel/amd_gart_64.c @@ -678,6 +678,8 @@ static const struct dma_map_ops gart_dma_ops = { .alloc = gart_alloc_coherent, .free = gart_free_coherent, .dma_supported = dma_direct_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static void gart_iommu_shutdown(void) diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c index 9d4343aa481b..23fdec030c37 100644 --- a/arch/x86/kernel/pci-calgary_64.c +++ b/arch/x86/kernel/pci-calgary_64.c @@ -468,6 +468,8 @@ static const struct dma_map_ops calgary_dma_ops = { .map_page = calgary_map_page, .unmap_page = calgary_unmap_page, .dma_supported = dma_direct_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static inline void __iomem * busno_to_bbar(unsigned char num) diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index b607a92791d3..2e74ad659985 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -2722,6 +2722,8 @@ static const struct dma_map_ops amd_iommu_dma_ops = { .map_sg = map_sg, .unmap_sg = unmap_sg, .dma_supported = amd_iommu_dma_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static int init_reserved_iova_ranges(void) diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index ac4172c02244..f6776b359977 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -3737,6 +3737,8 @@ static const struct dma_map_ops intel_dma_ops = { .map_resource = intel_map_resource, .unmap_resource = intel_unmap_resource, .dma_supported = dma_direct_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static inline int iommu_domain_cache_init(void) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index 4ceb5b9016d8..cdb157cd70e7 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -153,11 +153,12 @@ int dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, { const struct dma_map_ops *ops = get_dma_ops(dev); - if (!dma_is_direct(ops) && ops->get_sgtable) - return ops->get_sgtable(dev, sgt, cpu_addr, dma_addr, size, - attrs); - return dma_common_get_sgtable(dev, sgt, cpu_addr, dma_addr, size, - attrs); + if (dma_is_direct(ops)) + return dma_common_get_sgtable(dev, sgt, cpu_addr, dma_addr, + size, attrs); + if (!ops->get_sgtable) + return -ENXIO; + return ops->get_sgtable(dev, sgt, cpu_addr, dma_addr, size, attrs); } EXPORT_SYMBOL(dma_get_sgtable_attrs); @@ -221,9 +222,12 @@ int dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, { const struct dma_map_ops *ops = get_dma_ops(dev); - if (!dma_is_direct(ops) && ops->mmap) - return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs); - return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size, attrs); + if (dma_is_direct(ops)) + return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size, + attrs); + if (!ops->mmap) + return -ENXIO; + return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs); } EXPORT_SYMBOL(dma_mmap_attrs); -- 2.20.1 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 3/5] dma-mapping: explicitly wire up ->mmap and ->get_sgtable @ 2019-07-25 6:33 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel While the default ->mmap and ->get_sgtable implementations work for the majority of our dma_map_ops impementations they are inherently safe for others that don't use the page allocator or CMA and/or use their own way of remapping not covered by the common code. So remove the defaults if these methods are not wired up, but instead wire up the default implementations for all safe instances. Fixes: e1c7e324539a ("dma-mapping: always provide the dma_map_ops based implementation") Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/alpha/kernel/pci_iommu.c | 2 ++ arch/ia64/hp/common/sba_iommu.c | 2 ++ arch/ia64/sn/pci/pci_dma.c | 2 ++ arch/mips/jazz/jazzdma.c | 2 ++ arch/powerpc/kernel/dma-iommu.c | 2 ++ arch/powerpc/platforms/ps3/system-bus.c | 4 ++++ arch/powerpc/platforms/pseries/vio.c | 2 ++ arch/s390/pci/pci_dma.c | 2 ++ arch/sparc/kernel/iommu.c | 2 ++ arch/sparc/kernel/pci_sun4v.c | 2 ++ arch/x86/kernel/amd_gart_64.c | 2 ++ arch/x86/kernel/pci-calgary_64.c | 2 ++ drivers/iommu/amd_iommu.c | 2 ++ drivers/iommu/intel-iommu.c | 2 ++ kernel/dma/mapping.c | 20 ++++++++++++-------- 15 files changed, 42 insertions(+), 8 deletions(-) diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c index 242108439f42..7f1925a32c99 100644 --- a/arch/alpha/kernel/pci_iommu.c +++ b/arch/alpha/kernel/pci_iommu.c @@ -955,5 +955,7 @@ const struct dma_map_ops alpha_pci_ops = { .map_sg = alpha_pci_map_sg, .unmap_sg = alpha_pci_unmap_sg, .dma_supported = alpha_pci_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; EXPORT_SYMBOL(alpha_pci_ops); diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c index 3d24cc43385b..4c0ea6c2833d 100644 --- a/arch/ia64/hp/common/sba_iommu.c +++ b/arch/ia64/hp/common/sba_iommu.c @@ -2183,6 +2183,8 @@ const struct dma_map_ops sba_dma_ops = { .map_sg = sba_map_sg_attrs, .unmap_sg = sba_unmap_sg_attrs, .dma_supported = sba_dma_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; void sba_dma_init(void) diff --git a/arch/ia64/sn/pci/pci_dma.c b/arch/ia64/sn/pci/pci_dma.c index b7d42e4edc1f..12ffb9c0d738 100644 --- a/arch/ia64/sn/pci/pci_dma.c +++ b/arch/ia64/sn/pci/pci_dma.c @@ -438,6 +438,8 @@ static struct dma_map_ops sn_dma_ops = { .unmap_sg = sn_dma_unmap_sg, .dma_supported = sn_dma_supported, .get_required_mask = sn_dma_get_required_mask, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; void sn_dma_init(void) diff --git a/arch/mips/jazz/jazzdma.c b/arch/mips/jazz/jazzdma.c index 1804dc9d8136..a01e14955187 100644 --- a/arch/mips/jazz/jazzdma.c +++ b/arch/mips/jazz/jazzdma.c @@ -682,5 +682,7 @@ const struct dma_map_ops jazz_dma_ops = { .sync_sg_for_device = jazz_dma_sync_sg_for_device, .dma_supported = dma_direct_supported, .cache_sync = arch_dma_cache_sync, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; EXPORT_SYMBOL(jazz_dma_ops); diff --git a/arch/powerpc/kernel/dma-iommu.c b/arch/powerpc/kernel/dma-iommu.c index a0879674a9c8..2f5a53874f6d 100644 --- a/arch/powerpc/kernel/dma-iommu.c +++ b/arch/powerpc/kernel/dma-iommu.c @@ -208,4 +208,6 @@ const struct dma_map_ops dma_iommu_ops = { .sync_single_for_device = dma_iommu_sync_for_device, .sync_sg_for_cpu = dma_iommu_sync_sg_for_cpu, .sync_sg_for_device = dma_iommu_sync_sg_for_device, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c index 98410119c47b..70fcc9736a8c 100644 --- a/arch/powerpc/platforms/ps3/system-bus.c +++ b/arch/powerpc/platforms/ps3/system-bus.c @@ -700,6 +700,8 @@ static const struct dma_map_ops ps3_sb_dma_ops = { .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_sb_map_page, .unmap_page = ps3_unmap_page, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static const struct dma_map_ops ps3_ioc0_dma_ops = { @@ -711,6 +713,8 @@ static const struct dma_map_ops ps3_ioc0_dma_ops = { .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_ioc0_map_page, .unmap_page = ps3_unmap_page, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; /** diff --git a/arch/powerpc/platforms/pseries/vio.c b/arch/powerpc/platforms/pseries/vio.c index 6601b9d404dc..3473eef7628c 100644 --- a/arch/powerpc/platforms/pseries/vio.c +++ b/arch/powerpc/platforms/pseries/vio.c @@ -605,6 +605,8 @@ static const struct dma_map_ops vio_dma_mapping_ops = { .unmap_page = vio_dma_iommu_unmap_page, .dma_supported = dma_iommu_dma_supported, .get_required_mask = dma_iommu_get_required_mask, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; /** diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c index 9e52d1527f71..03d8c1c9f82f 100644 --- a/arch/s390/pci/pci_dma.c +++ b/arch/s390/pci/pci_dma.c @@ -668,6 +668,8 @@ const struct dma_map_ops s390_pci_dma_ops = { .unmap_sg = s390_dma_unmap_sg, .map_page = s390_dma_map_pages, .unmap_page = s390_dma_unmap_pages, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, /* dma_supported is unconditionally true without a callback */ }; EXPORT_SYMBOL_GPL(s390_pci_dma_ops); diff --git a/arch/sparc/kernel/iommu.c b/arch/sparc/kernel/iommu.c index 4ae7388b1bff..c915a7cbcc91 100644 --- a/arch/sparc/kernel/iommu.c +++ b/arch/sparc/kernel/iommu.c @@ -763,6 +763,8 @@ static const struct dma_map_ops sun4u_dma_ops = { .sync_single_for_cpu = dma_4u_sync_single_for_cpu, .sync_sg_for_cpu = dma_4u_sync_sg_for_cpu, .dma_supported = dma_4u_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; const struct dma_map_ops *dma_ops = &sun4u_dma_ops; diff --git a/arch/sparc/kernel/pci_sun4v.c b/arch/sparc/kernel/pci_sun4v.c index 14b93c5564e3..ab6909642ae1 100644 --- a/arch/sparc/kernel/pci_sun4v.c +++ b/arch/sparc/kernel/pci_sun4v.c @@ -692,6 +692,8 @@ static const struct dma_map_ops sun4v_dma_ops = { .map_sg = dma_4v_map_sg, .unmap_sg = dma_4v_unmap_sg, .dma_supported = dma_4v_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static void pci_sun4v_scan_bus(struct pci_pbm_info *pbm, struct device *parent) diff --git a/arch/x86/kernel/amd_gart_64.c b/arch/x86/kernel/amd_gart_64.c index a585ea6f686a..a65b4a9c7f87 100644 --- a/arch/x86/kernel/amd_gart_64.c +++ b/arch/x86/kernel/amd_gart_64.c @@ -678,6 +678,8 @@ static const struct dma_map_ops gart_dma_ops = { .alloc = gart_alloc_coherent, .free = gart_free_coherent, .dma_supported = dma_direct_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static void gart_iommu_shutdown(void) diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c index 9d4343aa481b..23fdec030c37 100644 --- a/arch/x86/kernel/pci-calgary_64.c +++ b/arch/x86/kernel/pci-calgary_64.c @@ -468,6 +468,8 @@ static const struct dma_map_ops calgary_dma_ops = { .map_page = calgary_map_page, .unmap_page = calgary_unmap_page, .dma_supported = dma_direct_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static inline void __iomem * busno_to_bbar(unsigned char num) diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index b607a92791d3..2e74ad659985 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -2722,6 +2722,8 @@ static const struct dma_map_ops amd_iommu_dma_ops = { .map_sg = map_sg, .unmap_sg = unmap_sg, .dma_supported = amd_iommu_dma_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static int init_reserved_iova_ranges(void) diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index ac4172c02244..f6776b359977 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -3737,6 +3737,8 @@ static const struct dma_map_ops intel_dma_ops = { .map_resource = intel_map_resource, .unmap_resource = intel_unmap_resource, .dma_supported = dma_direct_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static inline int iommu_domain_cache_init(void) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index 4ceb5b9016d8..cdb157cd70e7 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -153,11 +153,12 @@ int dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, { const struct dma_map_ops *ops = get_dma_ops(dev); - if (!dma_is_direct(ops) && ops->get_sgtable) - return ops->get_sgtable(dev, sgt, cpu_addr, dma_addr, size, - attrs); - return dma_common_get_sgtable(dev, sgt, cpu_addr, dma_addr, size, - attrs); + if (dma_is_direct(ops)) + return dma_common_get_sgtable(dev, sgt, cpu_addr, dma_addr, + size, attrs); + if (!ops->get_sgtable) + return -ENXIO; + return ops->get_sgtable(dev, sgt, cpu_addr, dma_addr, size, attrs); } EXPORT_SYMBOL(dma_get_sgtable_attrs); @@ -221,9 +222,12 @@ int dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, { const struct dma_map_ops *ops = get_dma_ops(dev); - if (!dma_is_direct(ops) && ops->mmap) - return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs); - return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size, attrs); + if (dma_is_direct(ops)) + return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size, + attrs); + if (!ops->mmap) + return -ENXIO; + return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs); } EXPORT_SYMBOL(dma_mmap_attrs); -- 2.20.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 3/5] dma-mapping: explicitly wire up ->mmap and ->get_sgtable @ 2019-07-25 6:33 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel While the default ->mmap and ->get_sgtable implementations work for the majority of our dma_map_ops impementations they are inherently safe for others that don't use the page allocator or CMA and/or use their own way of remapping not covered by the common code. So remove the defaults if these methods are not wired up, but instead wire up the default implementations for all safe instances. Fixes: e1c7e324539a ("dma-mapping: always provide the dma_map_ops based implementation") Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/alpha/kernel/pci_iommu.c | 2 ++ arch/ia64/hp/common/sba_iommu.c | 2 ++ arch/ia64/sn/pci/pci_dma.c | 2 ++ arch/mips/jazz/jazzdma.c | 2 ++ arch/powerpc/kernel/dma-iommu.c | 2 ++ arch/powerpc/platforms/ps3/system-bus.c | 4 ++++ arch/powerpc/platforms/pseries/vio.c | 2 ++ arch/s390/pci/pci_dma.c | 2 ++ arch/sparc/kernel/iommu.c | 2 ++ arch/sparc/kernel/pci_sun4v.c | 2 ++ arch/x86/kernel/amd_gart_64.c | 2 ++ arch/x86/kernel/pci-calgary_64.c | 2 ++ drivers/iommu/amd_iommu.c | 2 ++ drivers/iommu/intel-iommu.c | 2 ++ kernel/dma/mapping.c | 20 ++++++++++++-------- 15 files changed, 42 insertions(+), 8 deletions(-) diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c index 242108439f42..7f1925a32c99 100644 --- a/arch/alpha/kernel/pci_iommu.c +++ b/arch/alpha/kernel/pci_iommu.c @@ -955,5 +955,7 @@ const struct dma_map_ops alpha_pci_ops = { .map_sg = alpha_pci_map_sg, .unmap_sg = alpha_pci_unmap_sg, .dma_supported = alpha_pci_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; EXPORT_SYMBOL(alpha_pci_ops); diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c index 3d24cc43385b..4c0ea6c2833d 100644 --- a/arch/ia64/hp/common/sba_iommu.c +++ b/arch/ia64/hp/common/sba_iommu.c @@ -2183,6 +2183,8 @@ const struct dma_map_ops sba_dma_ops = { .map_sg = sba_map_sg_attrs, .unmap_sg = sba_unmap_sg_attrs, .dma_supported = sba_dma_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; void sba_dma_init(void) diff --git a/arch/ia64/sn/pci/pci_dma.c b/arch/ia64/sn/pci/pci_dma.c index b7d42e4edc1f..12ffb9c0d738 100644 --- a/arch/ia64/sn/pci/pci_dma.c +++ b/arch/ia64/sn/pci/pci_dma.c @@ -438,6 +438,8 @@ static struct dma_map_ops sn_dma_ops = { .unmap_sg = sn_dma_unmap_sg, .dma_supported = sn_dma_supported, .get_required_mask = sn_dma_get_required_mask, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; void sn_dma_init(void) diff --git a/arch/mips/jazz/jazzdma.c b/arch/mips/jazz/jazzdma.c index 1804dc9d8136..a01e14955187 100644 --- a/arch/mips/jazz/jazzdma.c +++ b/arch/mips/jazz/jazzdma.c @@ -682,5 +682,7 @@ const struct dma_map_ops jazz_dma_ops = { .sync_sg_for_device = jazz_dma_sync_sg_for_device, .dma_supported = dma_direct_supported, .cache_sync = arch_dma_cache_sync, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; EXPORT_SYMBOL(jazz_dma_ops); diff --git a/arch/powerpc/kernel/dma-iommu.c b/arch/powerpc/kernel/dma-iommu.c index a0879674a9c8..2f5a53874f6d 100644 --- a/arch/powerpc/kernel/dma-iommu.c +++ b/arch/powerpc/kernel/dma-iommu.c @@ -208,4 +208,6 @@ const struct dma_map_ops dma_iommu_ops = { .sync_single_for_device = dma_iommu_sync_for_device, .sync_sg_for_cpu = dma_iommu_sync_sg_for_cpu, .sync_sg_for_device = dma_iommu_sync_sg_for_device, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c index 98410119c47b..70fcc9736a8c 100644 --- a/arch/powerpc/platforms/ps3/system-bus.c +++ b/arch/powerpc/platforms/ps3/system-bus.c @@ -700,6 +700,8 @@ static const struct dma_map_ops ps3_sb_dma_ops = { .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_sb_map_page, .unmap_page = ps3_unmap_page, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static const struct dma_map_ops ps3_ioc0_dma_ops = { @@ -711,6 +713,8 @@ static const struct dma_map_ops ps3_ioc0_dma_ops = { .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_ioc0_map_page, .unmap_page = ps3_unmap_page, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; /** diff --git a/arch/powerpc/platforms/pseries/vio.c b/arch/powerpc/platforms/pseries/vio.c index 6601b9d404dc..3473eef7628c 100644 --- a/arch/powerpc/platforms/pseries/vio.c +++ b/arch/powerpc/platforms/pseries/vio.c @@ -605,6 +605,8 @@ static const struct dma_map_ops vio_dma_mapping_ops = { .unmap_page = vio_dma_iommu_unmap_page, .dma_supported = dma_iommu_dma_supported, .get_required_mask = dma_iommu_get_required_mask, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; /** diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c index 9e52d1527f71..03d8c1c9f82f 100644 --- a/arch/s390/pci/pci_dma.c +++ b/arch/s390/pci/pci_dma.c @@ -668,6 +668,8 @@ const struct dma_map_ops s390_pci_dma_ops = { .unmap_sg = s390_dma_unmap_sg, .map_page = s390_dma_map_pages, .unmap_page = s390_dma_unmap_pages, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, /* dma_supported is unconditionally true without a callback */ }; EXPORT_SYMBOL_GPL(s390_pci_dma_ops); diff --git a/arch/sparc/kernel/iommu.c b/arch/sparc/kernel/iommu.c index 4ae7388b1bff..c915a7cbcc91 100644 --- a/arch/sparc/kernel/iommu.c +++ b/arch/sparc/kernel/iommu.c @@ -763,6 +763,8 @@ static const struct dma_map_ops sun4u_dma_ops = { .sync_single_for_cpu = dma_4u_sync_single_for_cpu, .sync_sg_for_cpu = dma_4u_sync_sg_for_cpu, .dma_supported = dma_4u_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; const struct dma_map_ops *dma_ops = &sun4u_dma_ops; diff --git a/arch/sparc/kernel/pci_sun4v.c b/arch/sparc/kernel/pci_sun4v.c index 14b93c5564e3..ab6909642ae1 100644 --- a/arch/sparc/kernel/pci_sun4v.c +++ b/arch/sparc/kernel/pci_sun4v.c @@ -692,6 +692,8 @@ static const struct dma_map_ops sun4v_dma_ops = { .map_sg = dma_4v_map_sg, .unmap_sg = dma_4v_unmap_sg, .dma_supported = dma_4v_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static void pci_sun4v_scan_bus(struct pci_pbm_info *pbm, struct device *parent) diff --git a/arch/x86/kernel/amd_gart_64.c b/arch/x86/kernel/amd_gart_64.c index a585ea6f686a..a65b4a9c7f87 100644 --- a/arch/x86/kernel/amd_gart_64.c +++ b/arch/x86/kernel/amd_gart_64.c @@ -678,6 +678,8 @@ static const struct dma_map_ops gart_dma_ops = { .alloc = gart_alloc_coherent, .free = gart_free_coherent, .dma_supported = dma_direct_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static void gart_iommu_shutdown(void) diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c index 9d4343aa481b..23fdec030c37 100644 --- a/arch/x86/kernel/pci-calgary_64.c +++ b/arch/x86/kernel/pci-calgary_64.c @@ -468,6 +468,8 @@ static const struct dma_map_ops calgary_dma_ops = { .map_page = calgary_map_page, .unmap_page = calgary_unmap_page, .dma_supported = dma_direct_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static inline void __iomem * busno_to_bbar(unsigned char num) diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index b607a92791d3..2e74ad659985 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -2722,6 +2722,8 @@ static const struct dma_map_ops amd_iommu_dma_ops = { .map_sg = map_sg, .unmap_sg = unmap_sg, .dma_supported = amd_iommu_dma_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static int init_reserved_iova_ranges(void) diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index ac4172c02244..f6776b359977 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -3737,6 +3737,8 @@ static const struct dma_map_ops intel_dma_ops = { .map_resource = intel_map_resource, .unmap_resource = intel_unmap_resource, .dma_supported = dma_direct_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static inline int iommu_domain_cache_init(void) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index 4ceb5b9016d8..cdb157cd70e7 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -153,11 +153,12 @@ int dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, { const struct dma_map_ops *ops = get_dma_ops(dev); - if (!dma_is_direct(ops) && ops->get_sgtable) - return ops->get_sgtable(dev, sgt, cpu_addr, dma_addr, size, - attrs); - return dma_common_get_sgtable(dev, sgt, cpu_addr, dma_addr, size, - attrs); + if (dma_is_direct(ops)) + return dma_common_get_sgtable(dev, sgt, cpu_addr, dma_addr, + size, attrs); + if (!ops->get_sgtable) + return -ENXIO; + return ops->get_sgtable(dev, sgt, cpu_addr, dma_addr, size, attrs); } EXPORT_SYMBOL(dma_get_sgtable_attrs); @@ -221,9 +222,12 @@ int dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, { const struct dma_map_ops *ops = get_dma_ops(dev); - if (!dma_is_direct(ops) && ops->mmap) - return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs); - return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size, attrs); + if (dma_is_direct(ops)) + return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size, + attrs); + if (!ops->mmap) + return -ENXIO; + return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs); } EXPORT_SYMBOL(dma_mmap_attrs); -- 2.20.1 ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 3/5] dma-mapping: explicitly wire up ->mmap and ->get_sgtable @ 2019-07-25 6:33 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel While the default ->mmap and ->get_sgtable implementations work for the majority of our dma_map_ops impementations they are inherently safe for others that don't use the page allocator or CMA and/or use their own way of remapping not covered by the common code. So remove the defaults if these methods are not wired up, but instead wire up the default implementations for all safe instances. Fixes: e1c7e324539a ("dma-mapping: always provide the dma_map_ops based implementation") Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/alpha/kernel/pci_iommu.c | 2 ++ arch/ia64/hp/common/sba_iommu.c | 2 ++ arch/ia64/sn/pci/pci_dma.c | 2 ++ arch/mips/jazz/jazzdma.c | 2 ++ arch/powerpc/kernel/dma-iommu.c | 2 ++ arch/powerpc/platforms/ps3/system-bus.c | 4 ++++ arch/powerpc/platforms/pseries/vio.c | 2 ++ arch/s390/pci/pci_dma.c | 2 ++ arch/sparc/kernel/iommu.c | 2 ++ arch/sparc/kernel/pci_sun4v.c | 2 ++ arch/x86/kernel/amd_gart_64.c | 2 ++ arch/x86/kernel/pci-calgary_64.c | 2 ++ drivers/iommu/amd_iommu.c | 2 ++ drivers/iommu/intel-iommu.c | 2 ++ kernel/dma/mapping.c | 20 ++++++++++++-------- 15 files changed, 42 insertions(+), 8 deletions(-) diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c index 242108439f42..7f1925a32c99 100644 --- a/arch/alpha/kernel/pci_iommu.c +++ b/arch/alpha/kernel/pci_iommu.c @@ -955,5 +955,7 @@ const struct dma_map_ops alpha_pci_ops = { .map_sg = alpha_pci_map_sg, .unmap_sg = alpha_pci_unmap_sg, .dma_supported = alpha_pci_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; EXPORT_SYMBOL(alpha_pci_ops); diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c index 3d24cc43385b..4c0ea6c2833d 100644 --- a/arch/ia64/hp/common/sba_iommu.c +++ b/arch/ia64/hp/common/sba_iommu.c @@ -2183,6 +2183,8 @@ const struct dma_map_ops sba_dma_ops = { .map_sg = sba_map_sg_attrs, .unmap_sg = sba_unmap_sg_attrs, .dma_supported = sba_dma_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; void sba_dma_init(void) diff --git a/arch/ia64/sn/pci/pci_dma.c b/arch/ia64/sn/pci/pci_dma.c index b7d42e4edc1f..12ffb9c0d738 100644 --- a/arch/ia64/sn/pci/pci_dma.c +++ b/arch/ia64/sn/pci/pci_dma.c @@ -438,6 +438,8 @@ static struct dma_map_ops sn_dma_ops = { .unmap_sg = sn_dma_unmap_sg, .dma_supported = sn_dma_supported, .get_required_mask = sn_dma_get_required_mask, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; void sn_dma_init(void) diff --git a/arch/mips/jazz/jazzdma.c b/arch/mips/jazz/jazzdma.c index 1804dc9d8136..a01e14955187 100644 --- a/arch/mips/jazz/jazzdma.c +++ b/arch/mips/jazz/jazzdma.c @@ -682,5 +682,7 @@ const struct dma_map_ops jazz_dma_ops = { .sync_sg_for_device = jazz_dma_sync_sg_for_device, .dma_supported = dma_direct_supported, .cache_sync = arch_dma_cache_sync, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; EXPORT_SYMBOL(jazz_dma_ops); diff --git a/arch/powerpc/kernel/dma-iommu.c b/arch/powerpc/kernel/dma-iommu.c index a0879674a9c8..2f5a53874f6d 100644 --- a/arch/powerpc/kernel/dma-iommu.c +++ b/arch/powerpc/kernel/dma-iommu.c @@ -208,4 +208,6 @@ const struct dma_map_ops dma_iommu_ops = { .sync_single_for_device = dma_iommu_sync_for_device, .sync_sg_for_cpu = dma_iommu_sync_sg_for_cpu, .sync_sg_for_device = dma_iommu_sync_sg_for_device, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c index 98410119c47b..70fcc9736a8c 100644 --- a/arch/powerpc/platforms/ps3/system-bus.c +++ b/arch/powerpc/platforms/ps3/system-bus.c @@ -700,6 +700,8 @@ static const struct dma_map_ops ps3_sb_dma_ops = { .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_sb_map_page, .unmap_page = ps3_unmap_page, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static const struct dma_map_ops ps3_ioc0_dma_ops = { @@ -711,6 +713,8 @@ static const struct dma_map_ops ps3_ioc0_dma_ops = { .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_ioc0_map_page, .unmap_page = ps3_unmap_page, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; /** diff --git a/arch/powerpc/platforms/pseries/vio.c b/arch/powerpc/platforms/pseries/vio.c index 6601b9d404dc..3473eef7628c 100644 --- a/arch/powerpc/platforms/pseries/vio.c +++ b/arch/powerpc/platforms/pseries/vio.c @@ -605,6 +605,8 @@ static const struct dma_map_ops vio_dma_mapping_ops = { .unmap_page = vio_dma_iommu_unmap_page, .dma_supported = dma_iommu_dma_supported, .get_required_mask = dma_iommu_get_required_mask, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; /** diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c index 9e52d1527f71..03d8c1c9f82f 100644 --- a/arch/s390/pci/pci_dma.c +++ b/arch/s390/pci/pci_dma.c @@ -668,6 +668,8 @@ const struct dma_map_ops s390_pci_dma_ops = { .unmap_sg = s390_dma_unmap_sg, .map_page = s390_dma_map_pages, .unmap_page = s390_dma_unmap_pages, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, /* dma_supported is unconditionally true without a callback */ }; EXPORT_SYMBOL_GPL(s390_pci_dma_ops); diff --git a/arch/sparc/kernel/iommu.c b/arch/sparc/kernel/iommu.c index 4ae7388b1bff..c915a7cbcc91 100644 --- a/arch/sparc/kernel/iommu.c +++ b/arch/sparc/kernel/iommu.c @@ -763,6 +763,8 @@ static const struct dma_map_ops sun4u_dma_ops = { .sync_single_for_cpu = dma_4u_sync_single_for_cpu, .sync_sg_for_cpu = dma_4u_sync_sg_for_cpu, .dma_supported = dma_4u_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; const struct dma_map_ops *dma_ops = &sun4u_dma_ops; diff --git a/arch/sparc/kernel/pci_sun4v.c b/arch/sparc/kernel/pci_sun4v.c index 14b93c5564e3..ab6909642ae1 100644 --- a/arch/sparc/kernel/pci_sun4v.c +++ b/arch/sparc/kernel/pci_sun4v.c @@ -692,6 +692,8 @@ static const struct dma_map_ops sun4v_dma_ops = { .map_sg = dma_4v_map_sg, .unmap_sg = dma_4v_unmap_sg, .dma_supported = dma_4v_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static void pci_sun4v_scan_bus(struct pci_pbm_info *pbm, struct device *parent) diff --git a/arch/x86/kernel/amd_gart_64.c b/arch/x86/kernel/amd_gart_64.c index a585ea6f686a..a65b4a9c7f87 100644 --- a/arch/x86/kernel/amd_gart_64.c +++ b/arch/x86/kernel/amd_gart_64.c @@ -678,6 +678,8 @@ static const struct dma_map_ops gart_dma_ops = { .alloc = gart_alloc_coherent, .free = gart_free_coherent, .dma_supported = dma_direct_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static void gart_iommu_shutdown(void) diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c index 9d4343aa481b..23fdec030c37 100644 --- a/arch/x86/kernel/pci-calgary_64.c +++ b/arch/x86/kernel/pci-calgary_64.c @@ -468,6 +468,8 @@ static const struct dma_map_ops calgary_dma_ops = { .map_page = calgary_map_page, .unmap_page = calgary_unmap_page, .dma_supported = dma_direct_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static inline void __iomem * busno_to_bbar(unsigned char num) diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index b607a92791d3..2e74ad659985 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -2722,6 +2722,8 @@ static const struct dma_map_ops amd_iommu_dma_ops = { .map_sg = map_sg, .unmap_sg = unmap_sg, .dma_supported = amd_iommu_dma_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static int init_reserved_iova_ranges(void) diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index ac4172c02244..f6776b359977 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -3737,6 +3737,8 @@ static const struct dma_map_ops intel_dma_ops = { .map_resource = intel_map_resource, .unmap_resource = intel_unmap_resource, .dma_supported = dma_direct_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static inline int iommu_domain_cache_init(void) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index 4ceb5b9016d8..cdb157cd70e7 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -153,11 +153,12 @@ int dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, { const struct dma_map_ops *ops = get_dma_ops(dev); - if (!dma_is_direct(ops) && ops->get_sgtable) - return ops->get_sgtable(dev, sgt, cpu_addr, dma_addr, size, - attrs); - return dma_common_get_sgtable(dev, sgt, cpu_addr, dma_addr, size, - attrs); + if (dma_is_direct(ops)) + return dma_common_get_sgtable(dev, sgt, cpu_addr, dma_addr, + size, attrs); + if (!ops->get_sgtable) + return -ENXIO; + return ops->get_sgtable(dev, sgt, cpu_addr, dma_addr, size, attrs); } EXPORT_SYMBOL(dma_get_sgtable_attrs); @@ -221,9 +222,12 @@ int dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, { const struct dma_map_ops *ops = get_dma_ops(dev); - if (!dma_is_direct(ops) && ops->mmap) - return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs); - return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size, attrs); + if (dma_is_direct(ops)) + return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size, + attrs); + if (!ops->mmap) + return -ENXIO; + return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs); } EXPORT_SYMBOL(dma_mmap_attrs); -- 2.20.1 ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 3/5] dma-mapping: explicitly wire up ->mmap and ->get_sgtable @ 2019-07-25 6:33 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:33 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: Takashi Iwai, Robin Murphy, Michal Simek, linux-arm-kernel, linux-m68k, linux-parisc, linux-sh, linux-xtensa, linuxppc-dev, x86, linux-kernel While the default ->mmap and ->get_sgtable implementations work for the majority of our dma_map_ops impementations they are inherently safe for others that don't use the page allocator or CMA and/or use their own way of remapping not covered by the common code. So remove the defaults if these methods are not wired up, but instead wire up the default implementations for all safe instances. Fixes: e1c7e324539a ("dma-mapping: always provide the dma_map_ops based implementation") Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/alpha/kernel/pci_iommu.c | 2 ++ arch/ia64/hp/common/sba_iommu.c | 2 ++ arch/ia64/sn/pci/pci_dma.c | 2 ++ arch/mips/jazz/jazzdma.c | 2 ++ arch/powerpc/kernel/dma-iommu.c | 2 ++ arch/powerpc/platforms/ps3/system-bus.c | 4 ++++ arch/powerpc/platforms/pseries/vio.c | 2 ++ arch/s390/pci/pci_dma.c | 2 ++ arch/sparc/kernel/iommu.c | 2 ++ arch/sparc/kernel/pci_sun4v.c | 2 ++ arch/x86/kernel/amd_gart_64.c | 2 ++ arch/x86/kernel/pci-calgary_64.c | 2 ++ drivers/iommu/amd_iommu.c | 2 ++ drivers/iommu/intel-iommu.c | 2 ++ kernel/dma/mapping.c | 20 ++++++++++++-------- 15 files changed, 42 insertions(+), 8 deletions(-) diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c index 242108439f42..7f1925a32c99 100644 --- a/arch/alpha/kernel/pci_iommu.c +++ b/arch/alpha/kernel/pci_iommu.c @@ -955,5 +955,7 @@ const struct dma_map_ops alpha_pci_ops = { .map_sg = alpha_pci_map_sg, .unmap_sg = alpha_pci_unmap_sg, .dma_supported = alpha_pci_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; EXPORT_SYMBOL(alpha_pci_ops); diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c index 3d24cc43385b..4c0ea6c2833d 100644 --- a/arch/ia64/hp/common/sba_iommu.c +++ b/arch/ia64/hp/common/sba_iommu.c @@ -2183,6 +2183,8 @@ const struct dma_map_ops sba_dma_ops = { .map_sg = sba_map_sg_attrs, .unmap_sg = sba_unmap_sg_attrs, .dma_supported = sba_dma_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; void sba_dma_init(void) diff --git a/arch/ia64/sn/pci/pci_dma.c b/arch/ia64/sn/pci/pci_dma.c index b7d42e4edc1f..12ffb9c0d738 100644 --- a/arch/ia64/sn/pci/pci_dma.c +++ b/arch/ia64/sn/pci/pci_dma.c @@ -438,6 +438,8 @@ static struct dma_map_ops sn_dma_ops = { .unmap_sg = sn_dma_unmap_sg, .dma_supported = sn_dma_supported, .get_required_mask = sn_dma_get_required_mask, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; void sn_dma_init(void) diff --git a/arch/mips/jazz/jazzdma.c b/arch/mips/jazz/jazzdma.c index 1804dc9d8136..a01e14955187 100644 --- a/arch/mips/jazz/jazzdma.c +++ b/arch/mips/jazz/jazzdma.c @@ -682,5 +682,7 @@ const struct dma_map_ops jazz_dma_ops = { .sync_sg_for_device = jazz_dma_sync_sg_for_device, .dma_supported = dma_direct_supported, .cache_sync = arch_dma_cache_sync, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; EXPORT_SYMBOL(jazz_dma_ops); diff --git a/arch/powerpc/kernel/dma-iommu.c b/arch/powerpc/kernel/dma-iommu.c index a0879674a9c8..2f5a53874f6d 100644 --- a/arch/powerpc/kernel/dma-iommu.c +++ b/arch/powerpc/kernel/dma-iommu.c @@ -208,4 +208,6 @@ const struct dma_map_ops dma_iommu_ops = { .sync_single_for_device = dma_iommu_sync_for_device, .sync_sg_for_cpu = dma_iommu_sync_sg_for_cpu, .sync_sg_for_device = dma_iommu_sync_sg_for_device, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c index 98410119c47b..70fcc9736a8c 100644 --- a/arch/powerpc/platforms/ps3/system-bus.c +++ b/arch/powerpc/platforms/ps3/system-bus.c @@ -700,6 +700,8 @@ static const struct dma_map_ops ps3_sb_dma_ops = { .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_sb_map_page, .unmap_page = ps3_unmap_page, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static const struct dma_map_ops ps3_ioc0_dma_ops = { @@ -711,6 +713,8 @@ static const struct dma_map_ops ps3_ioc0_dma_ops = { .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_ioc0_map_page, .unmap_page = ps3_unmap_page, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; /** diff --git a/arch/powerpc/platforms/pseries/vio.c b/arch/powerpc/platforms/pseries/vio.c index 6601b9d404dc..3473eef7628c 100644 --- a/arch/powerpc/platforms/pseries/vio.c +++ b/arch/powerpc/platforms/pseries/vio.c @@ -605,6 +605,8 @@ static const struct dma_map_ops vio_dma_mapping_ops = { .unmap_page = vio_dma_iommu_unmap_page, .dma_supported = dma_iommu_dma_supported, .get_required_mask = dma_iommu_get_required_mask, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; /** diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c index 9e52d1527f71..03d8c1c9f82f 100644 --- a/arch/s390/pci/pci_dma.c +++ b/arch/s390/pci/pci_dma.c @@ -668,6 +668,8 @@ const struct dma_map_ops s390_pci_dma_ops = { .unmap_sg = s390_dma_unmap_sg, .map_page = s390_dma_map_pages, .unmap_page = s390_dma_unmap_pages, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, /* dma_supported is unconditionally true without a callback */ }; EXPORT_SYMBOL_GPL(s390_pci_dma_ops); diff --git a/arch/sparc/kernel/iommu.c b/arch/sparc/kernel/iommu.c index 4ae7388b1bff..c915a7cbcc91 100644 --- a/arch/sparc/kernel/iommu.c +++ b/arch/sparc/kernel/iommu.c @@ -763,6 +763,8 @@ static const struct dma_map_ops sun4u_dma_ops = { .sync_single_for_cpu = dma_4u_sync_single_for_cpu, .sync_sg_for_cpu = dma_4u_sync_sg_for_cpu, .dma_supported = dma_4u_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; const struct dma_map_ops *dma_ops = &sun4u_dma_ops; diff --git a/arch/sparc/kernel/pci_sun4v.c b/arch/sparc/kernel/pci_sun4v.c index 14b93c5564e3..ab6909642ae1 100644 --- a/arch/sparc/kernel/pci_sun4v.c +++ b/arch/sparc/kernel/pci_sun4v.c @@ -692,6 +692,8 @@ static const struct dma_map_ops sun4v_dma_ops = { .map_sg = dma_4v_map_sg, .unmap_sg = dma_4v_unmap_sg, .dma_supported = dma_4v_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static void pci_sun4v_scan_bus(struct pci_pbm_info *pbm, struct device *parent) diff --git a/arch/x86/kernel/amd_gart_64.c b/arch/x86/kernel/amd_gart_64.c index a585ea6f686a..a65b4a9c7f87 100644 --- a/arch/x86/kernel/amd_gart_64.c +++ b/arch/x86/kernel/amd_gart_64.c @@ -678,6 +678,8 @@ static const struct dma_map_ops gart_dma_ops = { .alloc = gart_alloc_coherent, .free = gart_free_coherent, .dma_supported = dma_direct_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static void gart_iommu_shutdown(void) diff --git a/arch/x86/kernel/pci-calgary_64.c b/arch/x86/kernel/pci-calgary_64.c index 9d4343aa481b..23fdec030c37 100644 --- a/arch/x86/kernel/pci-calgary_64.c +++ b/arch/x86/kernel/pci-calgary_64.c @@ -468,6 +468,8 @@ static const struct dma_map_ops calgary_dma_ops = { .map_page = calgary_map_page, .unmap_page = calgary_unmap_page, .dma_supported = dma_direct_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static inline void __iomem * busno_to_bbar(unsigned char num) diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index b607a92791d3..2e74ad659985 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -2722,6 +2722,8 @@ static const struct dma_map_ops amd_iommu_dma_ops = { .map_sg = map_sg, .unmap_sg = unmap_sg, .dma_supported = amd_iommu_dma_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static int init_reserved_iova_ranges(void) diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index ac4172c02244..f6776b359977 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -3737,6 +3737,8 @@ static const struct dma_map_ops intel_dma_ops = { .map_resource = intel_map_resource, .unmap_resource = intel_unmap_resource, .dma_supported = dma_direct_supported, + .mmap = dma_common_mmap, + .get_sgtable = dma_common_get_sgtable, }; static inline int iommu_domain_cache_init(void) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index 4ceb5b9016d8..cdb157cd70e7 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -153,11 +153,12 @@ int dma_get_sgtable_attrs(struct device *dev, struct sg_table *sgt, { const struct dma_map_ops *ops = get_dma_ops(dev); - if (!dma_is_direct(ops) && ops->get_sgtable) - return ops->get_sgtable(dev, sgt, cpu_addr, dma_addr, size, - attrs); - return dma_common_get_sgtable(dev, sgt, cpu_addr, dma_addr, size, - attrs); + if (dma_is_direct(ops)) + return dma_common_get_sgtable(dev, sgt, cpu_addr, dma_addr, + size, attrs); + if (!ops->get_sgtable) + return -ENXIO; + return ops->get_sgtable(dev, sgt, cpu_addr, dma_addr, size, attrs); } EXPORT_SYMBOL(dma_get_sgtable_attrs); @@ -221,9 +222,12 @@ int dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, { const struct dma_map_ops *ops = get_dma_ops(dev); - if (!dma_is_direct(ops) && ops->mmap) - return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs); - return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size, attrs); + if (dma_is_direct(ops)) + return dma_common_mmap(dev, vma, cpu_addr, dma_addr, size, + attrs); + if (!ops->mmap) + return -ENXIO; + return ops->mmap(dev, vma, cpu_addr, dma_addr, size, attrs); } EXPORT_SYMBOL(dma_mmap_attrs); -- 2.20.1 ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 4/5] dma-mapping: provide a better default ->get_required_mask 2019-07-25 6:33 ` Christoph Hellwig ` (2 preceding siblings ...) (?) @ 2019-07-25 6:34 ` Christoph Hellwig -1 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:34 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel Most dma_map_ops instances are IOMMUs that work perfectly fine in 32-bits of IOVA space, and the generic direct mapping code already provides its own routines that is intelligent based on the amount of memory actually present. Wire up the dma-direct routine for the ARM direct mapping code as well, and otherwise default to the constant 32-bit mask. This way we only need to override it for the occasional odd IOMMU that requires 64-bit IOVA support, or IOMMU drivers that are more efficient if they can fall back to the direct mapping. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/arm/mm/dma-mapping.c | 3 +++ arch/powerpc/platforms/ps3/system-bus.c | 7 ------ arch/x86/kernel/amd_gart_64.c | 1 + kernel/dma/mapping.c | 30 +++++++++---------------- 4 files changed, 14 insertions(+), 27 deletions(-) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 4410af33c5c4..9c9a23e5600d 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -14,6 +14,7 @@ #include <linux/list.h> #include <linux/init.h> #include <linux/device.h> +#include <linux/dma-direct.h> #include <linux/dma-mapping.h> #include <linux/dma-noncoherent.h> #include <linux/dma-contiguous.h> @@ -192,6 +193,7 @@ const struct dma_map_ops arm_dma_ops = { .sync_sg_for_cpu = arm_dma_sync_sg_for_cpu, .sync_sg_for_device = arm_dma_sync_sg_for_device, .dma_supported = arm_dma_supported, + .get_required_mask = dma_direct_get_required_mask, }; EXPORT_SYMBOL(arm_dma_ops); @@ -212,6 +214,7 @@ const struct dma_map_ops arm_coherent_dma_ops = { .map_sg = arm_dma_map_sg, .map_resource = dma_direct_map_resource, .dma_supported = arm_dma_supported, + .get_required_mask = dma_direct_get_required_mask, }; EXPORT_SYMBOL(arm_coherent_dma_ops); diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c index 70fcc9736a8c..3542b7bd6a46 100644 --- a/arch/powerpc/platforms/ps3/system-bus.c +++ b/arch/powerpc/platforms/ps3/system-bus.c @@ -686,18 +686,12 @@ static int ps3_dma_supported(struct device *_dev, u64 mask) return mask >= DMA_BIT_MASK(32); } -static u64 ps3_dma_get_required_mask(struct device *_dev) -{ - return DMA_BIT_MASK(32); -} - static const struct dma_map_ops ps3_sb_dma_ops = { .alloc = ps3_alloc_coherent, .free = ps3_free_coherent, .map_sg = ps3_sb_map_sg, .unmap_sg = ps3_sb_unmap_sg, .dma_supported = ps3_dma_supported, - .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_sb_map_page, .unmap_page = ps3_unmap_page, .mmap = dma_common_mmap, @@ -710,7 +704,6 @@ static const struct dma_map_ops ps3_ioc0_dma_ops = { .map_sg = ps3_ioc0_map_sg, .unmap_sg = ps3_ioc0_unmap_sg, .dma_supported = ps3_dma_supported, - .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_ioc0_map_page, .unmap_page = ps3_unmap_page, .mmap = dma_common_mmap, diff --git a/arch/x86/kernel/amd_gart_64.c b/arch/x86/kernel/amd_gart_64.c index a65b4a9c7f87..d02662238b57 100644 --- a/arch/x86/kernel/amd_gart_64.c +++ b/arch/x86/kernel/amd_gart_64.c @@ -680,6 +680,7 @@ static const struct dma_map_ops gart_dma_ops = { .dma_supported = dma_direct_supported, .mmap = dma_common_mmap, .get_sgtable = dma_common_get_sgtable, + .get_required_mask = dma_direct_get_required_mask, }; static void gart_iommu_shutdown(void) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index cdb157cd70e7..7dff1829c8c5 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -231,25 +231,6 @@ int dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, } EXPORT_SYMBOL(dma_mmap_attrs); -static u64 dma_default_get_required_mask(struct device *dev) -{ - u32 low_totalram = ((max_pfn - 1) << PAGE_SHIFT); - u32 high_totalram = ((max_pfn - 1) >> (32 - PAGE_SHIFT)); - u64 mask; - - if (!high_totalram) { - /* convert to mask just covering totalram */ - low_totalram = (1 << (fls(low_totalram) - 1)); - low_totalram += low_totalram - 1; - mask = low_totalram; - } else { - high_totalram = (1 << (fls(high_totalram) - 1)); - high_totalram += high_totalram - 1; - mask = (((u64)high_totalram) << 32) + 0xffffffff; - } - return mask; -} - u64 dma_get_required_mask(struct device *dev) { const struct dma_map_ops *ops = get_dma_ops(dev); @@ -258,7 +239,16 @@ u64 dma_get_required_mask(struct device *dev) return dma_direct_get_required_mask(dev); if (ops->get_required_mask) return ops->get_required_mask(dev); - return dma_default_get_required_mask(dev); + + /* + * We require every DMA ops implementation to at least support a 32-bit + * DMA mask (and use bounce buffering if that isn't supported in + * hardware). As the direct mapping code has its own routine to + * actually report an optimal mask we default to 32-bit here as that + * is the right thing for most IOMMUs, and at least not actively + * harmful in general. + */ + return DMA_BIT_MASK(32); } EXPORT_SYMBOL_GPL(dma_get_required_mask); -- 2.20.1 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 4/5] dma-mapping: provide a better default ->get_required_mask @ 2019-07-25 6:34 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:34 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel Most dma_map_ops instances are IOMMUs that work perfectly fine in 32-bits of IOVA space, and the generic direct mapping code already provides its own routines that is intelligent based on the amount of memory actually present. Wire up the dma-direct routine for the ARM direct mapping code as well, and otherwise default to the constant 32-bit mask. This way we only need to override it for the occasional odd IOMMU that requires 64-bit IOVA support, or IOMMU drivers that are more efficient if they can fall back to the direct mapping. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/arm/mm/dma-mapping.c | 3 +++ arch/powerpc/platforms/ps3/system-bus.c | 7 ------ arch/x86/kernel/amd_gart_64.c | 1 + kernel/dma/mapping.c | 30 +++++++++---------------- 4 files changed, 14 insertions(+), 27 deletions(-) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 4410af33c5c4..9c9a23e5600d 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -14,6 +14,7 @@ #include <linux/list.h> #include <linux/init.h> #include <linux/device.h> +#include <linux/dma-direct.h> #include <linux/dma-mapping.h> #include <linux/dma-noncoherent.h> #include <linux/dma-contiguous.h> @@ -192,6 +193,7 @@ const struct dma_map_ops arm_dma_ops = { .sync_sg_for_cpu = arm_dma_sync_sg_for_cpu, .sync_sg_for_device = arm_dma_sync_sg_for_device, .dma_supported = arm_dma_supported, + .get_required_mask = dma_direct_get_required_mask, }; EXPORT_SYMBOL(arm_dma_ops); @@ -212,6 +214,7 @@ const struct dma_map_ops arm_coherent_dma_ops = { .map_sg = arm_dma_map_sg, .map_resource = dma_direct_map_resource, .dma_supported = arm_dma_supported, + .get_required_mask = dma_direct_get_required_mask, }; EXPORT_SYMBOL(arm_coherent_dma_ops); diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c index 70fcc9736a8c..3542b7bd6a46 100644 --- a/arch/powerpc/platforms/ps3/system-bus.c +++ b/arch/powerpc/platforms/ps3/system-bus.c @@ -686,18 +686,12 @@ static int ps3_dma_supported(struct device *_dev, u64 mask) return mask >= DMA_BIT_MASK(32); } -static u64 ps3_dma_get_required_mask(struct device *_dev) -{ - return DMA_BIT_MASK(32); -} - static const struct dma_map_ops ps3_sb_dma_ops = { .alloc = ps3_alloc_coherent, .free = ps3_free_coherent, .map_sg = ps3_sb_map_sg, .unmap_sg = ps3_sb_unmap_sg, .dma_supported = ps3_dma_supported, - .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_sb_map_page, .unmap_page = ps3_unmap_page, .mmap = dma_common_mmap, @@ -710,7 +704,6 @@ static const struct dma_map_ops ps3_ioc0_dma_ops = { .map_sg = ps3_ioc0_map_sg, .unmap_sg = ps3_ioc0_unmap_sg, .dma_supported = ps3_dma_supported, - .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_ioc0_map_page, .unmap_page = ps3_unmap_page, .mmap = dma_common_mmap, diff --git a/arch/x86/kernel/amd_gart_64.c b/arch/x86/kernel/amd_gart_64.c index a65b4a9c7f87..d02662238b57 100644 --- a/arch/x86/kernel/amd_gart_64.c +++ b/arch/x86/kernel/amd_gart_64.c @@ -680,6 +680,7 @@ static const struct dma_map_ops gart_dma_ops = { .dma_supported = dma_direct_supported, .mmap = dma_common_mmap, .get_sgtable = dma_common_get_sgtable, + .get_required_mask = dma_direct_get_required_mask, }; static void gart_iommu_shutdown(void) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index cdb157cd70e7..7dff1829c8c5 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -231,25 +231,6 @@ int dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, } EXPORT_SYMBOL(dma_mmap_attrs); -static u64 dma_default_get_required_mask(struct device *dev) -{ - u32 low_totalram = ((max_pfn - 1) << PAGE_SHIFT); - u32 high_totalram = ((max_pfn - 1) >> (32 - PAGE_SHIFT)); - u64 mask; - - if (!high_totalram) { - /* convert to mask just covering totalram */ - low_totalram = (1 << (fls(low_totalram) - 1)); - low_totalram += low_totalram - 1; - mask = low_totalram; - } else { - high_totalram = (1 << (fls(high_totalram) - 1)); - high_totalram += high_totalram - 1; - mask = (((u64)high_totalram) << 32) + 0xffffffff; - } - return mask; -} - u64 dma_get_required_mask(struct device *dev) { const struct dma_map_ops *ops = get_dma_ops(dev); @@ -258,7 +239,16 @@ u64 dma_get_required_mask(struct device *dev) return dma_direct_get_required_mask(dev); if (ops->get_required_mask) return ops->get_required_mask(dev); - return dma_default_get_required_mask(dev); + + /* + * We require every DMA ops implementation to at least support a 32-bit + * DMA mask (and use bounce buffering if that isn't supported in + * hardware). As the direct mapping code has its own routine to + * actually report an optimal mask we default to 32-bit here as that + * is the right thing for most IOMMUs, and at least not actively + * harmful in general. + */ + return DMA_BIT_MASK(32); } EXPORT_SYMBOL_GPL(dma_get_required_mask); -- 2.20.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 4/5] dma-mapping: provide a better default ->get_required_mask @ 2019-07-25 6:34 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:34 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel Most dma_map_ops instances are IOMMUs that work perfectly fine in 32-bits of IOVA space, and the generic direct mapping code already provides its own routines that is intelligent based on the amount of memory actually present. Wire up the dma-direct routine for the ARM direct mapping code as well, and otherwise default to the constant 32-bit mask. This way we only need to override it for the occasional odd IOMMU that requires 64-bit IOVA support, or IOMMU drivers that are more efficient if they can fall back to the direct mapping. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/arm/mm/dma-mapping.c | 3 +++ arch/powerpc/platforms/ps3/system-bus.c | 7 ------ arch/x86/kernel/amd_gart_64.c | 1 + kernel/dma/mapping.c | 30 +++++++++---------------- 4 files changed, 14 insertions(+), 27 deletions(-) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 4410af33c5c4..9c9a23e5600d 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -14,6 +14,7 @@ #include <linux/list.h> #include <linux/init.h> #include <linux/device.h> +#include <linux/dma-direct.h> #include <linux/dma-mapping.h> #include <linux/dma-noncoherent.h> #include <linux/dma-contiguous.h> @@ -192,6 +193,7 @@ const struct dma_map_ops arm_dma_ops = { .sync_sg_for_cpu = arm_dma_sync_sg_for_cpu, .sync_sg_for_device = arm_dma_sync_sg_for_device, .dma_supported = arm_dma_supported, + .get_required_mask = dma_direct_get_required_mask, }; EXPORT_SYMBOL(arm_dma_ops); @@ -212,6 +214,7 @@ const struct dma_map_ops arm_coherent_dma_ops = { .map_sg = arm_dma_map_sg, .map_resource = dma_direct_map_resource, .dma_supported = arm_dma_supported, + .get_required_mask = dma_direct_get_required_mask, }; EXPORT_SYMBOL(arm_coherent_dma_ops); diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c index 70fcc9736a8c..3542b7bd6a46 100644 --- a/arch/powerpc/platforms/ps3/system-bus.c +++ b/arch/powerpc/platforms/ps3/system-bus.c @@ -686,18 +686,12 @@ static int ps3_dma_supported(struct device *_dev, u64 mask) return mask >= DMA_BIT_MASK(32); } -static u64 ps3_dma_get_required_mask(struct device *_dev) -{ - return DMA_BIT_MASK(32); -} - static const struct dma_map_ops ps3_sb_dma_ops = { .alloc = ps3_alloc_coherent, .free = ps3_free_coherent, .map_sg = ps3_sb_map_sg, .unmap_sg = ps3_sb_unmap_sg, .dma_supported = ps3_dma_supported, - .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_sb_map_page, .unmap_page = ps3_unmap_page, .mmap = dma_common_mmap, @@ -710,7 +704,6 @@ static const struct dma_map_ops ps3_ioc0_dma_ops = { .map_sg = ps3_ioc0_map_sg, .unmap_sg = ps3_ioc0_unmap_sg, .dma_supported = ps3_dma_supported, - .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_ioc0_map_page, .unmap_page = ps3_unmap_page, .mmap = dma_common_mmap, diff --git a/arch/x86/kernel/amd_gart_64.c b/arch/x86/kernel/amd_gart_64.c index a65b4a9c7f87..d02662238b57 100644 --- a/arch/x86/kernel/amd_gart_64.c +++ b/arch/x86/kernel/amd_gart_64.c @@ -680,6 +680,7 @@ static const struct dma_map_ops gart_dma_ops = { .dma_supported = dma_direct_supported, .mmap = dma_common_mmap, .get_sgtable = dma_common_get_sgtable, + .get_required_mask = dma_direct_get_required_mask, }; static void gart_iommu_shutdown(void) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index cdb157cd70e7..7dff1829c8c5 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -231,25 +231,6 @@ int dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, } EXPORT_SYMBOL(dma_mmap_attrs); -static u64 dma_default_get_required_mask(struct device *dev) -{ - u32 low_totalram = ((max_pfn - 1) << PAGE_SHIFT); - u32 high_totalram = ((max_pfn - 1) >> (32 - PAGE_SHIFT)); - u64 mask; - - if (!high_totalram) { - /* convert to mask just covering totalram */ - low_totalram = (1 << (fls(low_totalram) - 1)); - low_totalram += low_totalram - 1; - mask = low_totalram; - } else { - high_totalram = (1 << (fls(high_totalram) - 1)); - high_totalram += high_totalram - 1; - mask = (((u64)high_totalram) << 32) + 0xffffffff; - } - return mask; -} - u64 dma_get_required_mask(struct device *dev) { const struct dma_map_ops *ops = get_dma_ops(dev); @@ -258,7 +239,16 @@ u64 dma_get_required_mask(struct device *dev) return dma_direct_get_required_mask(dev); if (ops->get_required_mask) return ops->get_required_mask(dev); - return dma_default_get_required_mask(dev); + + /* + * We require every DMA ops implementation to at least support a 32-bit + * DMA mask (and use bounce buffering if that isn't supported in + * hardware). As the direct mapping code has its own routine to + * actually report an optimal mask we default to 32-bit here as that + * is the right thing for most IOMMUs, and at least not actively + * harmful in general. + */ + return DMA_BIT_MASK(32); } EXPORT_SYMBOL_GPL(dma_get_required_mask); -- 2.20.1 ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 4/5] dma-mapping: provide a better default ->get_required_mask @ 2019-07-25 6:34 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:34 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel Most dma_map_ops instances are IOMMUs that work perfectly fine in 32-bits of IOVA space, and the generic direct mapping code already provides its own routines that is intelligent based on the amount of memory actually present. Wire up the dma-direct routine for the ARM direct mapping code as well, and otherwise default to the constant 32-bit mask. This way we only need to override it for the occasional odd IOMMU that requires 64-bit IOVA support, or IOMMU drivers that are more efficient if they can fall back to the direct mapping. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/arm/mm/dma-mapping.c | 3 +++ arch/powerpc/platforms/ps3/system-bus.c | 7 ------ arch/x86/kernel/amd_gart_64.c | 1 + kernel/dma/mapping.c | 30 +++++++++---------------- 4 files changed, 14 insertions(+), 27 deletions(-) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 4410af33c5c4..9c9a23e5600d 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -14,6 +14,7 @@ #include <linux/list.h> #include <linux/init.h> #include <linux/device.h> +#include <linux/dma-direct.h> #include <linux/dma-mapping.h> #include <linux/dma-noncoherent.h> #include <linux/dma-contiguous.h> @@ -192,6 +193,7 @@ const struct dma_map_ops arm_dma_ops = { .sync_sg_for_cpu = arm_dma_sync_sg_for_cpu, .sync_sg_for_device = arm_dma_sync_sg_for_device, .dma_supported = arm_dma_supported, + .get_required_mask = dma_direct_get_required_mask, }; EXPORT_SYMBOL(arm_dma_ops); @@ -212,6 +214,7 @@ const struct dma_map_ops arm_coherent_dma_ops = { .map_sg = arm_dma_map_sg, .map_resource = dma_direct_map_resource, .dma_supported = arm_dma_supported, + .get_required_mask = dma_direct_get_required_mask, }; EXPORT_SYMBOL(arm_coherent_dma_ops); diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c index 70fcc9736a8c..3542b7bd6a46 100644 --- a/arch/powerpc/platforms/ps3/system-bus.c +++ b/arch/powerpc/platforms/ps3/system-bus.c @@ -686,18 +686,12 @@ static int ps3_dma_supported(struct device *_dev, u64 mask) return mask >= DMA_BIT_MASK(32); } -static u64 ps3_dma_get_required_mask(struct device *_dev) -{ - return DMA_BIT_MASK(32); -} - static const struct dma_map_ops ps3_sb_dma_ops = { .alloc = ps3_alloc_coherent, .free = ps3_free_coherent, .map_sg = ps3_sb_map_sg, .unmap_sg = ps3_sb_unmap_sg, .dma_supported = ps3_dma_supported, - .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_sb_map_page, .unmap_page = ps3_unmap_page, .mmap = dma_common_mmap, @@ -710,7 +704,6 @@ static const struct dma_map_ops ps3_ioc0_dma_ops = { .map_sg = ps3_ioc0_map_sg, .unmap_sg = ps3_ioc0_unmap_sg, .dma_supported = ps3_dma_supported, - .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_ioc0_map_page, .unmap_page = ps3_unmap_page, .mmap = dma_common_mmap, diff --git a/arch/x86/kernel/amd_gart_64.c b/arch/x86/kernel/amd_gart_64.c index a65b4a9c7f87..d02662238b57 100644 --- a/arch/x86/kernel/amd_gart_64.c +++ b/arch/x86/kernel/amd_gart_64.c @@ -680,6 +680,7 @@ static const struct dma_map_ops gart_dma_ops = { .dma_supported = dma_direct_supported, .mmap = dma_common_mmap, .get_sgtable = dma_common_get_sgtable, + .get_required_mask = dma_direct_get_required_mask, }; static void gart_iommu_shutdown(void) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index cdb157cd70e7..7dff1829c8c5 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -231,25 +231,6 @@ int dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, } EXPORT_SYMBOL(dma_mmap_attrs); -static u64 dma_default_get_required_mask(struct device *dev) -{ - u32 low_totalram = ((max_pfn - 1) << PAGE_SHIFT); - u32 high_totalram = ((max_pfn - 1) >> (32 - PAGE_SHIFT)); - u64 mask; - - if (!high_totalram) { - /* convert to mask just covering totalram */ - low_totalram = (1 << (fls(low_totalram) - 1)); - low_totalram += low_totalram - 1; - mask = low_totalram; - } else { - high_totalram = (1 << (fls(high_totalram) - 1)); - high_totalram += high_totalram - 1; - mask = (((u64)high_totalram) << 32) + 0xffffffff; - } - return mask; -} - u64 dma_get_required_mask(struct device *dev) { const struct dma_map_ops *ops = get_dma_ops(dev); @@ -258,7 +239,16 @@ u64 dma_get_required_mask(struct device *dev) return dma_direct_get_required_mask(dev); if (ops->get_required_mask) return ops->get_required_mask(dev); - return dma_default_get_required_mask(dev); + + /* + * We require every DMA ops implementation to at least support a 32-bit + * DMA mask (and use bounce buffering if that isn't supported in + * hardware). As the direct mapping code has its own routine to + * actually report an optimal mask we default to 32-bit here as that + * is the right thing for most IOMMUs, and at least not actively + * harmful in general. + */ + return DMA_BIT_MASK(32); } EXPORT_SYMBOL_GPL(dma_get_required_mask); -- 2.20.1 ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 4/5] dma-mapping: provide a better default ->get_required_mask @ 2019-07-25 6:34 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:34 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: Takashi Iwai, Robin Murphy, Michal Simek, linux-arm-kernel, linux-m68k, linux-parisc, linux-sh, linux-xtensa, linuxppc-dev, x86, linux-kernel Most dma_map_ops instances are IOMMUs that work perfectly fine in 32-bits of IOVA space, and the generic direct mapping code already provides its own routines that is intelligent based on the amount of memory actually present. Wire up the dma-direct routine for the ARM direct mapping code as well, and otherwise default to the constant 32-bit mask. This way we only need to override it for the occasional odd IOMMU that requires 64-bit IOVA support, or IOMMU drivers that are more efficient if they can fall back to the direct mapping. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/arm/mm/dma-mapping.c | 3 +++ arch/powerpc/platforms/ps3/system-bus.c | 7 ------ arch/x86/kernel/amd_gart_64.c | 1 + kernel/dma/mapping.c | 30 +++++++++---------------- 4 files changed, 14 insertions(+), 27 deletions(-) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 4410af33c5c4..9c9a23e5600d 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -14,6 +14,7 @@ #include <linux/list.h> #include <linux/init.h> #include <linux/device.h> +#include <linux/dma-direct.h> #include <linux/dma-mapping.h> #include <linux/dma-noncoherent.h> #include <linux/dma-contiguous.h> @@ -192,6 +193,7 @@ const struct dma_map_ops arm_dma_ops = { .sync_sg_for_cpu = arm_dma_sync_sg_for_cpu, .sync_sg_for_device = arm_dma_sync_sg_for_device, .dma_supported = arm_dma_supported, + .get_required_mask = dma_direct_get_required_mask, }; EXPORT_SYMBOL(arm_dma_ops); @@ -212,6 +214,7 @@ const struct dma_map_ops arm_coherent_dma_ops = { .map_sg = arm_dma_map_sg, .map_resource = dma_direct_map_resource, .dma_supported = arm_dma_supported, + .get_required_mask = dma_direct_get_required_mask, }; EXPORT_SYMBOL(arm_coherent_dma_ops); diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c index 70fcc9736a8c..3542b7bd6a46 100644 --- a/arch/powerpc/platforms/ps3/system-bus.c +++ b/arch/powerpc/platforms/ps3/system-bus.c @@ -686,18 +686,12 @@ static int ps3_dma_supported(struct device *_dev, u64 mask) return mask >= DMA_BIT_MASK(32); } -static u64 ps3_dma_get_required_mask(struct device *_dev) -{ - return DMA_BIT_MASK(32); -} - static const struct dma_map_ops ps3_sb_dma_ops = { .alloc = ps3_alloc_coherent, .free = ps3_free_coherent, .map_sg = ps3_sb_map_sg, .unmap_sg = ps3_sb_unmap_sg, .dma_supported = ps3_dma_supported, - .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_sb_map_page, .unmap_page = ps3_unmap_page, .mmap = dma_common_mmap, @@ -710,7 +704,6 @@ static const struct dma_map_ops ps3_ioc0_dma_ops = { .map_sg = ps3_ioc0_map_sg, .unmap_sg = ps3_ioc0_unmap_sg, .dma_supported = ps3_dma_supported, - .get_required_mask = ps3_dma_get_required_mask, .map_page = ps3_ioc0_map_page, .unmap_page = ps3_unmap_page, .mmap = dma_common_mmap, diff --git a/arch/x86/kernel/amd_gart_64.c b/arch/x86/kernel/amd_gart_64.c index a65b4a9c7f87..d02662238b57 100644 --- a/arch/x86/kernel/amd_gart_64.c +++ b/arch/x86/kernel/amd_gart_64.c @@ -680,6 +680,7 @@ static const struct dma_map_ops gart_dma_ops = { .dma_supported = dma_direct_supported, .mmap = dma_common_mmap, .get_sgtable = dma_common_get_sgtable, + .get_required_mask = dma_direct_get_required_mask, }; static void gart_iommu_shutdown(void) diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index cdb157cd70e7..7dff1829c8c5 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -231,25 +231,6 @@ int dma_mmap_attrs(struct device *dev, struct vm_area_struct *vma, } EXPORT_SYMBOL(dma_mmap_attrs); -static u64 dma_default_get_required_mask(struct device *dev) -{ - u32 low_totalram = ((max_pfn - 1) << PAGE_SHIFT); - u32 high_totalram = ((max_pfn - 1) >> (32 - PAGE_SHIFT)); - u64 mask; - - if (!high_totalram) { - /* convert to mask just covering totalram */ - low_totalram = (1 << (fls(low_totalram) - 1)); - low_totalram += low_totalram - 1; - mask = low_totalram; - } else { - high_totalram = (1 << (fls(high_totalram) - 1)); - high_totalram += high_totalram - 1; - mask = (((u64)high_totalram) << 32) + 0xffffffff; - } - return mask; -} - u64 dma_get_required_mask(struct device *dev) { const struct dma_map_ops *ops = get_dma_ops(dev); @@ -258,7 +239,16 @@ u64 dma_get_required_mask(struct device *dev) return dma_direct_get_required_mask(dev); if (ops->get_required_mask) return ops->get_required_mask(dev); - return dma_default_get_required_mask(dev); + + /* + * We require every DMA ops implementation to at least support a 32-bit + * DMA mask (and use bounce buffering if that isn't supported in + * hardware). As the direct mapping code has its own routine to + * actually report an optimal mask we default to 32-bit here as that + * is the right thing for most IOMMUs, and at least not actively + * harmful in general. + */ + return DMA_BIT_MASK(32); } EXPORT_SYMBOL_GPL(dma_get_required_mask); -- 2.20.1 ^ permalink raw reply related [flat|nested] 60+ messages in thread
* Re: [PATCH 4/5] dma-mapping: provide a better default ->get_required_mask 2019-07-25 6:34 ` Christoph Hellwig ` (2 preceding siblings ...) (?) @ 2019-07-29 9:57 ` Geert Uytterhoeven -1 siblings, 0 replies; 60+ messages in thread From: Geert Uytterhoeven @ 2019-07-29 9:57 UTC (permalink / raw) To: Christoph Hellwig Cc: linux-xtensa, Michal Simek, Parisc List, Linux-sh list, Takashi Iwai, linuxppc-dev, the arch/x86 maintainers, linux-m68k, Linux Kernel Mailing List, Linux IOMMU, Robin Murphy, Linux ARM Hi Christoph, On Thu, Jul 25, 2019 at 8:35 AM Christoph Hellwig <hch@lst.de> wrote: > Most dma_map_ops instances are IOMMUs that work perfectly fine in 32-bits > of IOVA space, and the generic direct mapping code already provides its > own routines that is intelligent based on the amount of memory actually > present. Wire up the dma-direct routine for the ARM direct mapping code > as well, and otherwise default to the constant 32-bit mask. This way > we only need to override it for the occasional odd IOMMU that requires > 64-bit IOVA support, or IOMMU drivers that are more efficient if they > can fall back to the direct mapping. As I know you like diving into cans of worms ;-) Does 64-bit IOVA support actually work in general? Or only on 64-bit platforms, due to dma_addr_t to unsigned long truncation on 32-bit? https://lore.kernel.org/linux-renesas-soc/CAMuHMdWkQ918Y61tMJbHEu29AGLEyNwbvZbSBB-RRH7YYUNRcA@mail.gmail.com/ Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 4/5] dma-mapping: provide a better default ->get_required_mask @ 2019-07-29 9:57 ` Geert Uytterhoeven 0 siblings, 0 replies; 60+ messages in thread From: Geert Uytterhoeven @ 2019-07-29 9:57 UTC (permalink / raw) To: Christoph Hellwig Cc: linux-xtensa, Michal Simek, Parisc List, Linux-sh list, Takashi Iwai, linuxppc-dev, the arch/x86 maintainers, linux-m68k, Linux Kernel Mailing List, Linux IOMMU, Robin Murphy, Linux ARM, Marek Szyprowski Hi Christoph, On Thu, Jul 25, 2019 at 8:35 AM Christoph Hellwig <hch@lst.de> wrote: > Most dma_map_ops instances are IOMMUs that work perfectly fine in 32-bits > of IOVA space, and the generic direct mapping code already provides its > own routines that is intelligent based on the amount of memory actually > present. Wire up the dma-direct routine for the ARM direct mapping code > as well, and otherwise default to the constant 32-bit mask. This way > we only need to override it for the occasional odd IOMMU that requires > 64-bit IOVA support, or IOMMU drivers that are more efficient if they > can fall back to the direct mapping. As I know you like diving into cans of worms ;-) Does 64-bit IOVA support actually work in general? Or only on 64-bit platforms, due to dma_addr_t to unsigned long truncation on 32-bit? https://lore.kernel.org/linux-renesas-soc/CAMuHMdWkQ918Y61tMJbHEu29AGLEyNwbvZbSBB-RRH7YYUNRcA@mail.gmail.com/ Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 4/5] dma-mapping: provide a better default ->get_required_mask @ 2019-07-29 9:57 ` Geert Uytterhoeven 0 siblings, 0 replies; 60+ messages in thread From: Geert Uytterhoeven @ 2019-07-29 9:57 UTC (permalink / raw) To: Christoph Hellwig Cc: linux-xtensa, Michal Simek, Parisc List, Linux-sh list, Takashi Iwai, linuxppc-dev, the arch/x86 maintainers, linux-m68k, Linux Kernel Mailing List, Linux IOMMU, Robin Murphy, Linux ARM, Marek Szyprowski Hi Christoph, On Thu, Jul 25, 2019 at 8:35 AM Christoph Hellwig <hch@lst.de> wrote: > Most dma_map_ops instances are IOMMUs that work perfectly fine in 32-bits > of IOVA space, and the generic direct mapping code already provides its > own routines that is intelligent based on the amount of memory actually > present. Wire up the dma-direct routine for the ARM direct mapping code > as well, and otherwise default to the constant 32-bit mask. This way > we only need to override it for the occasional odd IOMMU that requires > 64-bit IOVA support, or IOMMU drivers that are more efficient if they > can fall back to the direct mapping. As I know you like diving into cans of worms ;-) Does 64-bit IOVA support actually work in general? Or only on 64-bit platforms, due to dma_addr_t to unsigned long truncation on 32-bit? https://lore.kernel.org/linux-renesas-soc/CAMuHMdWkQ918Y61tMJbHEu29AGLEyNwbvZbSBB-RRH7YYUNRcA@mail.gmail.com/ Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 4/5] dma-mapping: provide a better default ->get_required_mask @ 2019-07-29 9:57 ` Geert Uytterhoeven 0 siblings, 0 replies; 60+ messages in thread From: Geert Uytterhoeven @ 2019-07-29 9:57 UTC (permalink / raw) To: Christoph Hellwig Cc: linux-xtensa, Michal Simek, Parisc List, Linux-sh list, Takashi Iwai, linuxppc-dev, the arch/x86 maintainers, linux-m68k, Linux Kernel Mailing List, Linux IOMMU, Robin Murphy, Linux ARM, Marek Szyprowski Hi Christoph, On Thu, Jul 25, 2019 at 8:35 AM Christoph Hellwig <hch@lst.de> wrote: > Most dma_map_ops instances are IOMMUs that work perfectly fine in 32-bits > of IOVA space, and the generic direct mapping code already provides its > own routines that is intelligent based on the amount of memory actually > present. Wire up the dma-direct routine for the ARM direct mapping code > as well, and otherwise default to the constant 32-bit mask. This way > we only need to override it for the occasional odd IOMMU that requires > 64-bit IOVA support, or IOMMU drivers that are more efficient if they > can fall back to the direct mapping. As I know you like diving into cans of worms ;-) Does 64-bit IOVA support actually work in general? Or only on 64-bit platforms, due to dma_addr_t to unsigned long truncation on 32-bit? https://lore.kernel.org/linux-renesas-soc/CAMuHMdWkQ918Y61tMJbHEu29AGLEyNwbvZbSBB-RRH7YYUNRcA@mail.gmail.com/ Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 4/5] dma-mapping: provide a better default ->get_required_mask @ 2019-07-29 9:57 ` Geert Uytterhoeven 0 siblings, 0 replies; 60+ messages in thread From: Geert Uytterhoeven @ 2019-07-29 9:57 UTC (permalink / raw) To: Christoph Hellwig Cc: Linux IOMMU, Marek Szyprowski, Takashi Iwai, Robin Murphy, Michal Simek, Linux ARM, linux-m68k, Parisc List, Linux-sh list, linux-xtensa, linuxppc-dev, the arch/x86 maintainers, Linux Kernel Mailing List Hi Christoph, On Thu, Jul 25, 2019 at 8:35 AM Christoph Hellwig <hch@lst.de> wrote: > Most dma_map_ops instances are IOMMUs that work perfectly fine in 32-bits > of IOVA space, and the generic direct mapping code already provides its > own routines that is intelligent based on the amount of memory actually > present. Wire up the dma-direct routine for the ARM direct mapping code > as well, and otherwise default to the constant 32-bit mask. This way > we only need to override it for the occasional odd IOMMU that requires > 64-bit IOVA support, or IOMMU drivers that are more efficient if they > can fall back to the direct mapping. As I know you like diving into cans of worms ;-) Does 64-bit IOVA support actually work in general? Or only on 64-bit platforms, due to dma_addr_t to unsigned long truncation on 32-bit? https://lore.kernel.org/linux-renesas-soc/CAMuHMdWkQ918Y61tMJbHEu29AGLEyNwbvZbSBB-RRH7YYUNRcA@mail.gmail.com/ Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 4/5] dma-mapping: provide a better default ->get_required_mask 2019-07-29 9:57 ` Geert Uytterhoeven ` (2 preceding siblings ...) (?) @ 2019-07-30 6:26 ` Christoph Hellwig -1 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-30 6:26 UTC (permalink / raw) To: Geert Uytterhoeven Cc: linux-xtensa, Michal Simek, Parisc List, Linux-sh list, Takashi Iwai, linuxppc-dev, the arch/x86 maintainers, linux-m68k, Linux Kernel Mailing List, Linux IOMMU, Robin Murphy, Christoph Hellwig, Linux ARM On Mon, Jul 29, 2019 at 11:57:19AM +0200, Geert Uytterhoeven wrote: > Hi Christoph, > > On Thu, Jul 25, 2019 at 8:35 AM Christoph Hellwig <hch@lst.de> wrote: > > Most dma_map_ops instances are IOMMUs that work perfectly fine in 32-bits > > of IOVA space, and the generic direct mapping code already provides its > > own routines that is intelligent based on the amount of memory actually > > present. Wire up the dma-direct routine for the ARM direct mapping code > > as well, and otherwise default to the constant 32-bit mask. This way > > we only need to override it for the occasional odd IOMMU that requires > > 64-bit IOVA support, or IOMMU drivers that are more efficient if they > > can fall back to the direct mapping. > > As I know you like diving into cans of worms ;-) > > Does 64-bit IOVA support actually work in general? Or only on 64-bit > platforms, due to dma_addr_t to unsigned long truncation on 32-bit? Most IOMMUs use 32-bit IOVAs, and thus we default to the 32-bit mask because it is common and failsafe vs the normal linux assumptions. However the ia64 SGI SN2 platform, and the powerpc IBM ebus implementations seem to require a 64-bit mask already, so we keep that behavior as is. _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 4/5] dma-mapping: provide a better default ->get_required_mask @ 2019-07-30 6:26 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-30 6:26 UTC (permalink / raw) To: Geert Uytterhoeven Cc: linux-xtensa, Michal Simek, Parisc List, Linux-sh list, Takashi Iwai, linuxppc-dev, the arch/x86 maintainers, linux-m68k, Linux Kernel Mailing List, Linux IOMMU, Robin Murphy, Christoph Hellwig, Linux ARM, Marek Szyprowski On Mon, Jul 29, 2019 at 11:57:19AM +0200, Geert Uytterhoeven wrote: > Hi Christoph, > > On Thu, Jul 25, 2019 at 8:35 AM Christoph Hellwig <hch@lst.de> wrote: > > Most dma_map_ops instances are IOMMUs that work perfectly fine in 32-bits > > of IOVA space, and the generic direct mapping code already provides its > > own routines that is intelligent based on the amount of memory actually > > present. Wire up the dma-direct routine for the ARM direct mapping code > > as well, and otherwise default to the constant 32-bit mask. This way > > we only need to override it for the occasional odd IOMMU that requires > > 64-bit IOVA support, or IOMMU drivers that are more efficient if they > > can fall back to the direct mapping. > > As I know you like diving into cans of worms ;-) > > Does 64-bit IOVA support actually work in general? Or only on 64-bit > platforms, due to dma_addr_t to unsigned long truncation on 32-bit? Most IOMMUs use 32-bit IOVAs, and thus we default to the 32-bit mask because it is common and failsafe vs the normal linux assumptions. However the ia64 SGI SN2 platform, and the powerpc IBM ebus implementations seem to require a 64-bit mask already, so we keep that behavior as is. _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 4/5] dma-mapping: provide a better default ->get_required_mask @ 2019-07-30 6:26 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-30 6:26 UTC (permalink / raw) To: Geert Uytterhoeven Cc: linux-xtensa, Michal Simek, Parisc List, Linux-sh list, Takashi Iwai, linuxppc-dev, the arch/x86 maintainers, linux-m68k, Linux Kernel Mailing List, Linux IOMMU, Robin Murphy, Christoph Hellwig, Linux ARM, Marek Szyprowski On Mon, Jul 29, 2019 at 11:57:19AM +0200, Geert Uytterhoeven wrote: > Hi Christoph, > > On Thu, Jul 25, 2019 at 8:35 AM Christoph Hellwig <hch@lst.de> wrote: > > Most dma_map_ops instances are IOMMUs that work perfectly fine in 32-bits > > of IOVA space, and the generic direct mapping code already provides its > > own routines that is intelligent based on the amount of memory actually > > present. Wire up the dma-direct routine for the ARM direct mapping code > > as well, and otherwise default to the constant 32-bit mask. This way > > we only need to override it for the occasional odd IOMMU that requires > > 64-bit IOVA support, or IOMMU drivers that are more efficient if they > > can fall back to the direct mapping. > > As I know you like diving into cans of worms ;-) > > Does 64-bit IOVA support actually work in general? Or only on 64-bit > platforms, due to dma_addr_t to unsigned long truncation on 32-bit? Most IOMMUs use 32-bit IOVAs, and thus we default to the 32-bit mask because it is common and failsafe vs the normal linux assumptions. However the ia64 SGI SN2 platform, and the powerpc IBM ebus implementations seem to require a 64-bit mask already, so we keep that behavior as is. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 4/5] dma-mapping: provide a better default ->get_required_mask @ 2019-07-30 6:26 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-30 6:26 UTC (permalink / raw) To: Geert Uytterhoeven Cc: linux-xtensa, Michal Simek, Parisc List, Linux-sh list, Takashi Iwai, linuxppc-dev, the arch/x86 maintainers, linux-m68k, Linux Kernel Mailing List, Linux IOMMU, Robin Murphy, Christoph Hellwig, Linux ARM, Marek Szyprowski On Mon, Jul 29, 2019 at 11:57:19AM +0200, Geert Uytterhoeven wrote: > Hi Christoph, > > On Thu, Jul 25, 2019 at 8:35 AM Christoph Hellwig <hch@lst.de> wrote: > > Most dma_map_ops instances are IOMMUs that work perfectly fine in 32-bits > > of IOVA space, and the generic direct mapping code already provides its > > own routines that is intelligent based on the amount of memory actually > > present. Wire up the dma-direct routine for the ARM direct mapping code > > as well, and otherwise default to the constant 32-bit mask. This way > > we only need to override it for the occasional odd IOMMU that requires > > 64-bit IOVA support, or IOMMU drivers that are more efficient if they > > can fall back to the direct mapping. > > As I know you like diving into cans of worms ;-) > > Does 64-bit IOVA support actually work in general? Or only on 64-bit > platforms, due to dma_addr_t to unsigned long truncation on 32-bit? Most IOMMUs use 32-bit IOVAs, and thus we default to the 32-bit mask because it is common and failsafe vs the normal linux assumptions. However the ia64 SGI SN2 platform, and the powerpc IBM ebus implementations seem to require a 64-bit mask already, so we keep that behavior as is. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 4/5] dma-mapping: provide a better default ->get_required_mask @ 2019-07-30 6:26 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-30 6:26 UTC (permalink / raw) To: Geert Uytterhoeven Cc: Christoph Hellwig, Linux IOMMU, Marek Szyprowski, Takashi Iwai, Robin Murphy, Michal Simek, Linux ARM, linux-m68k, Parisc List, Linux-sh list, linux-xtensa, linuxppc-dev, the arch/x86 maintainers, Linux Kernel Mailing List On Mon, Jul 29, 2019 at 11:57:19AM +0200, Geert Uytterhoeven wrote: > Hi Christoph, > > On Thu, Jul 25, 2019 at 8:35 AM Christoph Hellwig <hch@lst.de> wrote: > > Most dma_map_ops instances are IOMMUs that work perfectly fine in 32-bits > > of IOVA space, and the generic direct mapping code already provides its > > own routines that is intelligent based on the amount of memory actually > > present. Wire up the dma-direct routine for the ARM direct mapping code > > as well, and otherwise default to the constant 32-bit mask. This way > > we only need to override it for the occasional odd IOMMU that requires > > 64-bit IOVA support, or IOMMU drivers that are more efficient if they > > can fall back to the direct mapping. > > As I know you like diving into cans of worms ;-) > > Does 64-bit IOVA support actually work in general? Or only on 64-bit > platforms, due to dma_addr_t to unsigned long truncation on 32-bit? Most IOMMUs use 32-bit IOVAs, and thus we default to the 32-bit mask because it is common and failsafe vs the normal linux assumptions. However the ia64 SGI SN2 platform, and the powerpc IBM ebus implementations seem to require a 64-bit mask already, so we keep that behavior as is. ^ permalink raw reply [flat|nested] 60+ messages in thread
* [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP 2019-07-25 6:33 ` Christoph Hellwig ` (2 preceding siblings ...) (?) @ 2019-07-25 6:34 ` Christoph Hellwig -1 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:34 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel Now that we never use a default ->mmap implementation, and non-coherent architectures can control the presence of ->mmap support by enabling ARCH_HAS_DMA_COHERENT_TO_PFN for the dma direct implementation there is no need for a global config option to control the availability of dma_common_mmap. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/Kconfig | 3 --- arch/c6x/Kconfig | 1 - arch/m68k/Kconfig | 1 - arch/microblaze/Kconfig | 1 - arch/parisc/Kconfig | 1 - arch/sh/Kconfig | 1 - arch/xtensa/Kconfig | 1 - kernel/dma/mapping.c | 4 ---- sound/core/pcm_native.c | 10 +--------- 9 files changed, 1 insertion(+), 22 deletions(-) diff --git a/arch/Kconfig b/arch/Kconfig index a7b57dd42c26..ec2834206d08 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -790,9 +790,6 @@ config COMPAT_32BIT_TIME This is relevant on all 32-bit architectures, and 64-bit architectures as part of compat syscall handling. -config ARCH_NO_COHERENT_DMA_MMAP - bool - config ARCH_NO_PREEMPT bool diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig index b4fb61c83494..e65e8d82442a 100644 --- a/arch/c6x/Kconfig +++ b/arch/c6x/Kconfig @@ -20,7 +20,6 @@ config C6X select OF_EARLY_FLATTREE select GENERIC_CLOCKEVENTS select MODULES_USE_ELF_RELA - select ARCH_NO_COHERENT_DMA_MMAP select MMU_GATHER_NO_RANGE if MMU config MMU diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index c518d695c376..614b355ae338 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig @@ -8,7 +8,6 @@ config M68K select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA select ARCH_MIGHT_HAVE_PC_PARPORT if ISA - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select ARCH_NO_PREEMPT if !COLDFIRE select BINFMT_FLAT_ARGVP_ENVP_ON_STACK select DMA_DIRECT_REMAP if HAS_DMA && MMU && !COLDFIRE diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index d411de05b628..632c9477a0f6 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig @@ -9,7 +9,6 @@ config MICROBLAZE select ARCH_HAS_SYNC_DMA_FOR_CPU select ARCH_HAS_SYNC_DMA_FOR_DEVICE select ARCH_MIGHT_HAVE_PC_PARPORT - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select ARCH_WANT_IPC_PARSE_VERSION select BUILDTIME_EXTABLE_SORT select TIMER_OF diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 6d732e451071..e9dd88b7f81e 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig @@ -52,7 +52,6 @@ config PARISC select GENERIC_SCHED_CLOCK select HAVE_UNSTABLE_SCHED_CLOCK if SMP select GENERIC_CLOCKEVENTS - select ARCH_NO_COHERENT_DMA_MMAP select CPU_NO_EFFICIENT_FFS select NEED_DMA_MAP_STATE select NEED_SG_DMA_LENGTH diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 6b1b5941b618..f356ee674d89 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig @@ -5,7 +5,6 @@ config SUPERH select ARCH_HAS_PTE_SPECIAL select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST select ARCH_MIGHT_HAVE_PC_PARPORT - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select HAVE_PATA_PLATFORM select CLKDEV_LOOKUP select DMA_DECLARE_COHERENT diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index ebc135bda921..70653aed3005 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig @@ -5,7 +5,6 @@ config XTENSA select ARCH_HAS_BINFMT_FLAT if !MMU select ARCH_HAS_SYNC_DMA_FOR_CPU select ARCH_HAS_SYNC_DMA_FOR_DEVICE - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select ARCH_USE_QUEUED_RWLOCKS select ARCH_USE_QUEUED_SPINLOCKS select ARCH_WANT_FRAME_POINTERS diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index 7dff1829c8c5..815446f76995 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -169,7 +169,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, dma_addr_t dma_addr, size_t size, unsigned long attrs) { -#ifndef CONFIG_ARCH_NO_COHERENT_DMA_MMAP unsigned long user_count = vma_pages(vma); unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; unsigned long off = vma->vm_pgoff; @@ -198,9 +197,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff, user_count << PAGE_SHIFT, vma->vm_page_prot); -#else - return -ENXIO; -#endif /* !CONFIG_ARCH_NO_COHERENT_DMA_MMAP */ } /** diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 860543a4c840..2dadc708343a 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -218,15 +218,7 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, static bool hw_support_mmap(struct snd_pcm_substream *substream) { - if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) - return false; - /* architecture supports dma_mmap_coherent()? */ -#if defined(CONFIG_ARCH_NO_COHERENT_DMA_MMAP) || !defined(CONFIG_HAS_DMA) - if (!substream->ops->mmap && - substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) - return false; -#endif - return true; + return substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP; } static int constrain_mask_params(struct snd_pcm_substream *substream, -- 2.20.1 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-07-25 6:34 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:34 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel Now that we never use a default ->mmap implementation, and non-coherent architectures can control the presence of ->mmap support by enabling ARCH_HAS_DMA_COHERENT_TO_PFN for the dma direct implementation there is no need for a global config option to control the availability of dma_common_mmap. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/Kconfig | 3 --- arch/c6x/Kconfig | 1 - arch/m68k/Kconfig | 1 - arch/microblaze/Kconfig | 1 - arch/parisc/Kconfig | 1 - arch/sh/Kconfig | 1 - arch/xtensa/Kconfig | 1 - kernel/dma/mapping.c | 4 ---- sound/core/pcm_native.c | 10 +--------- 9 files changed, 1 insertion(+), 22 deletions(-) diff --git a/arch/Kconfig b/arch/Kconfig index a7b57dd42c26..ec2834206d08 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -790,9 +790,6 @@ config COMPAT_32BIT_TIME This is relevant on all 32-bit architectures, and 64-bit architectures as part of compat syscall handling. -config ARCH_NO_COHERENT_DMA_MMAP - bool - config ARCH_NO_PREEMPT bool diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig index b4fb61c83494..e65e8d82442a 100644 --- a/arch/c6x/Kconfig +++ b/arch/c6x/Kconfig @@ -20,7 +20,6 @@ config C6X select OF_EARLY_FLATTREE select GENERIC_CLOCKEVENTS select MODULES_USE_ELF_RELA - select ARCH_NO_COHERENT_DMA_MMAP select MMU_GATHER_NO_RANGE if MMU config MMU diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index c518d695c376..614b355ae338 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig @@ -8,7 +8,6 @@ config M68K select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA select ARCH_MIGHT_HAVE_PC_PARPORT if ISA - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select ARCH_NO_PREEMPT if !COLDFIRE select BINFMT_FLAT_ARGVP_ENVP_ON_STACK select DMA_DIRECT_REMAP if HAS_DMA && MMU && !COLDFIRE diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index d411de05b628..632c9477a0f6 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig @@ -9,7 +9,6 @@ config MICROBLAZE select ARCH_HAS_SYNC_DMA_FOR_CPU select ARCH_HAS_SYNC_DMA_FOR_DEVICE select ARCH_MIGHT_HAVE_PC_PARPORT - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select ARCH_WANT_IPC_PARSE_VERSION select BUILDTIME_EXTABLE_SORT select TIMER_OF diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 6d732e451071..e9dd88b7f81e 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig @@ -52,7 +52,6 @@ config PARISC select GENERIC_SCHED_CLOCK select HAVE_UNSTABLE_SCHED_CLOCK if SMP select GENERIC_CLOCKEVENTS - select ARCH_NO_COHERENT_DMA_MMAP select CPU_NO_EFFICIENT_FFS select NEED_DMA_MAP_STATE select NEED_SG_DMA_LENGTH diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 6b1b5941b618..f356ee674d89 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig @@ -5,7 +5,6 @@ config SUPERH select ARCH_HAS_PTE_SPECIAL select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST select ARCH_MIGHT_HAVE_PC_PARPORT - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select HAVE_PATA_PLATFORM select CLKDEV_LOOKUP select DMA_DECLARE_COHERENT diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index ebc135bda921..70653aed3005 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig @@ -5,7 +5,6 @@ config XTENSA select ARCH_HAS_BINFMT_FLAT if !MMU select ARCH_HAS_SYNC_DMA_FOR_CPU select ARCH_HAS_SYNC_DMA_FOR_DEVICE - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select ARCH_USE_QUEUED_RWLOCKS select ARCH_USE_QUEUED_SPINLOCKS select ARCH_WANT_FRAME_POINTERS diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index 7dff1829c8c5..815446f76995 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -169,7 +169,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, dma_addr_t dma_addr, size_t size, unsigned long attrs) { -#ifndef CONFIG_ARCH_NO_COHERENT_DMA_MMAP unsigned long user_count = vma_pages(vma); unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; unsigned long off = vma->vm_pgoff; @@ -198,9 +197,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff, user_count << PAGE_SHIFT, vma->vm_page_prot); -#else - return -ENXIO; -#endif /* !CONFIG_ARCH_NO_COHERENT_DMA_MMAP */ } /** diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 860543a4c840..2dadc708343a 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -218,15 +218,7 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, static bool hw_support_mmap(struct snd_pcm_substream *substream) { - if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) - return false; - /* architecture supports dma_mmap_coherent()? */ -#if defined(CONFIG_ARCH_NO_COHERENT_DMA_MMAP) || !defined(CONFIG_HAS_DMA) - if (!substream->ops->mmap && - substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) - return false; -#endif - return true; + return substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP; } static int constrain_mask_params(struct snd_pcm_substream *substream, -- 2.20.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-07-25 6:34 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:34 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel Now that we never use a default ->mmap implementation, and non-coherent architectures can control the presence of ->mmap support by enabling ARCH_HAS_DMA_COHERENT_TO_PFN for the dma direct implementation there is no need for a global config option to control the availability of dma_common_mmap. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/Kconfig | 3 --- arch/c6x/Kconfig | 1 - arch/m68k/Kconfig | 1 - arch/microblaze/Kconfig | 1 - arch/parisc/Kconfig | 1 - arch/sh/Kconfig | 1 - arch/xtensa/Kconfig | 1 - kernel/dma/mapping.c | 4 ---- sound/core/pcm_native.c | 10 +--------- 9 files changed, 1 insertion(+), 22 deletions(-) diff --git a/arch/Kconfig b/arch/Kconfig index a7b57dd42c26..ec2834206d08 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -790,9 +790,6 @@ config COMPAT_32BIT_TIME This is relevant on all 32-bit architectures, and 64-bit architectures as part of compat syscall handling. -config ARCH_NO_COHERENT_DMA_MMAP - bool - config ARCH_NO_PREEMPT bool diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig index b4fb61c83494..e65e8d82442a 100644 --- a/arch/c6x/Kconfig +++ b/arch/c6x/Kconfig @@ -20,7 +20,6 @@ config C6X select OF_EARLY_FLATTREE select GENERIC_CLOCKEVENTS select MODULES_USE_ELF_RELA - select ARCH_NO_COHERENT_DMA_MMAP select MMU_GATHER_NO_RANGE if MMU config MMU diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index c518d695c376..614b355ae338 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig @@ -8,7 +8,6 @@ config M68K select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA select ARCH_MIGHT_HAVE_PC_PARPORT if ISA - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select ARCH_NO_PREEMPT if !COLDFIRE select BINFMT_FLAT_ARGVP_ENVP_ON_STACK select DMA_DIRECT_REMAP if HAS_DMA && MMU && !COLDFIRE diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index d411de05b628..632c9477a0f6 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig @@ -9,7 +9,6 @@ config MICROBLAZE select ARCH_HAS_SYNC_DMA_FOR_CPU select ARCH_HAS_SYNC_DMA_FOR_DEVICE select ARCH_MIGHT_HAVE_PC_PARPORT - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select ARCH_WANT_IPC_PARSE_VERSION select BUILDTIME_EXTABLE_SORT select TIMER_OF diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 6d732e451071..e9dd88b7f81e 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig @@ -52,7 +52,6 @@ config PARISC select GENERIC_SCHED_CLOCK select HAVE_UNSTABLE_SCHED_CLOCK if SMP select GENERIC_CLOCKEVENTS - select ARCH_NO_COHERENT_DMA_MMAP select CPU_NO_EFFICIENT_FFS select NEED_DMA_MAP_STATE select NEED_SG_DMA_LENGTH diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 6b1b5941b618..f356ee674d89 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig @@ -5,7 +5,6 @@ config SUPERH select ARCH_HAS_PTE_SPECIAL select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST select ARCH_MIGHT_HAVE_PC_PARPORT - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select HAVE_PATA_PLATFORM select CLKDEV_LOOKUP select DMA_DECLARE_COHERENT diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index ebc135bda921..70653aed3005 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig @@ -5,7 +5,6 @@ config XTENSA select ARCH_HAS_BINFMT_FLAT if !MMU select ARCH_HAS_SYNC_DMA_FOR_CPU select ARCH_HAS_SYNC_DMA_FOR_DEVICE - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select ARCH_USE_QUEUED_RWLOCKS select ARCH_USE_QUEUED_SPINLOCKS select ARCH_WANT_FRAME_POINTERS diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index 7dff1829c8c5..815446f76995 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -169,7 +169,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, dma_addr_t dma_addr, size_t size, unsigned long attrs) { -#ifndef CONFIG_ARCH_NO_COHERENT_DMA_MMAP unsigned long user_count = vma_pages(vma); unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; unsigned long off = vma->vm_pgoff; @@ -198,9 +197,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff, user_count << PAGE_SHIFT, vma->vm_page_prot); -#else - return -ENXIO; -#endif /* !CONFIG_ARCH_NO_COHERENT_DMA_MMAP */ } /** diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 860543a4c840..2dadc708343a 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -218,15 +218,7 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, static bool hw_support_mmap(struct snd_pcm_substream *substream) { - if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) - return false; - /* architecture supports dma_mmap_coherent()? */ -#if defined(CONFIG_ARCH_NO_COHERENT_DMA_MMAP) || !defined(CONFIG_HAS_DMA) - if (!substream->ops->mmap && - substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) - return false; -#endif - return true; + return substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP; } static int constrain_mask_params(struct snd_pcm_substream *substream, -- 2.20.1 ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-07-25 6:34 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:34 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel Now that we never use a default ->mmap implementation, and non-coherent architectures can control the presence of ->mmap support by enabling ARCH_HAS_DMA_COHERENT_TO_PFN for the dma direct implementation there is no need for a global config option to control the availability of dma_common_mmap. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/Kconfig | 3 --- arch/c6x/Kconfig | 1 - arch/m68k/Kconfig | 1 - arch/microblaze/Kconfig | 1 - arch/parisc/Kconfig | 1 - arch/sh/Kconfig | 1 - arch/xtensa/Kconfig | 1 - kernel/dma/mapping.c | 4 ---- sound/core/pcm_native.c | 10 +--------- 9 files changed, 1 insertion(+), 22 deletions(-) diff --git a/arch/Kconfig b/arch/Kconfig index a7b57dd42c26..ec2834206d08 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -790,9 +790,6 @@ config COMPAT_32BIT_TIME This is relevant on all 32-bit architectures, and 64-bit architectures as part of compat syscall handling. -config ARCH_NO_COHERENT_DMA_MMAP - bool - config ARCH_NO_PREEMPT bool diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig index b4fb61c83494..e65e8d82442a 100644 --- a/arch/c6x/Kconfig +++ b/arch/c6x/Kconfig @@ -20,7 +20,6 @@ config C6X select OF_EARLY_FLATTREE select GENERIC_CLOCKEVENTS select MODULES_USE_ELF_RELA - select ARCH_NO_COHERENT_DMA_MMAP select MMU_GATHER_NO_RANGE if MMU config MMU diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index c518d695c376..614b355ae338 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig @@ -8,7 +8,6 @@ config M68K select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA select ARCH_MIGHT_HAVE_PC_PARPORT if ISA - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select ARCH_NO_PREEMPT if !COLDFIRE select BINFMT_FLAT_ARGVP_ENVP_ON_STACK select DMA_DIRECT_REMAP if HAS_DMA && MMU && !COLDFIRE diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index d411de05b628..632c9477a0f6 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig @@ -9,7 +9,6 @@ config MICROBLAZE select ARCH_HAS_SYNC_DMA_FOR_CPU select ARCH_HAS_SYNC_DMA_FOR_DEVICE select ARCH_MIGHT_HAVE_PC_PARPORT - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select ARCH_WANT_IPC_PARSE_VERSION select BUILDTIME_EXTABLE_SORT select TIMER_OF diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 6d732e451071..e9dd88b7f81e 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig @@ -52,7 +52,6 @@ config PARISC select GENERIC_SCHED_CLOCK select HAVE_UNSTABLE_SCHED_CLOCK if SMP select GENERIC_CLOCKEVENTS - select ARCH_NO_COHERENT_DMA_MMAP select CPU_NO_EFFICIENT_FFS select NEED_DMA_MAP_STATE select NEED_SG_DMA_LENGTH diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 6b1b5941b618..f356ee674d89 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig @@ -5,7 +5,6 @@ config SUPERH select ARCH_HAS_PTE_SPECIAL select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST select ARCH_MIGHT_HAVE_PC_PARPORT - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select HAVE_PATA_PLATFORM select CLKDEV_LOOKUP select DMA_DECLARE_COHERENT diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index ebc135bda921..70653aed3005 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig @@ -5,7 +5,6 @@ config XTENSA select ARCH_HAS_BINFMT_FLAT if !MMU select ARCH_HAS_SYNC_DMA_FOR_CPU select ARCH_HAS_SYNC_DMA_FOR_DEVICE - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select ARCH_USE_QUEUED_RWLOCKS select ARCH_USE_QUEUED_SPINLOCKS select ARCH_WANT_FRAME_POINTERS diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index 7dff1829c8c5..815446f76995 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -169,7 +169,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, dma_addr_t dma_addr, size_t size, unsigned long attrs) { -#ifndef CONFIG_ARCH_NO_COHERENT_DMA_MMAP unsigned long user_count = vma_pages(vma); unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; unsigned long off = vma->vm_pgoff; @@ -198,9 +197,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff, user_count << PAGE_SHIFT, vma->vm_page_prot); -#else - return -ENXIO; -#endif /* !CONFIG_ARCH_NO_COHERENT_DMA_MMAP */ } /** diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 860543a4c840..2dadc708343a 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -218,15 +218,7 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, static bool hw_support_mmap(struct snd_pcm_substream *substream) { - if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) - return false; - /* architecture supports dma_mmap_coherent()? */ -#if defined(CONFIG_ARCH_NO_COHERENT_DMA_MMAP) || !defined(CONFIG_HAS_DMA) - if (!substream->ops->mmap && - substream->dma_buffer.dev.type = SNDRV_DMA_TYPE_DEV) - return false; -#endif - return true; + return substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP; } static int constrain_mask_params(struct snd_pcm_substream *substream, -- 2.20.1 ^ permalink raw reply related [flat|nested] 60+ messages in thread
* [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-07-25 6:34 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-07-25 6:34 UTC (permalink / raw) To: iommu, Marek Szyprowski Cc: Takashi Iwai, Robin Murphy, Michal Simek, linux-arm-kernel, linux-m68k, linux-parisc, linux-sh, linux-xtensa, linuxppc-dev, x86, linux-kernel Now that we never use a default ->mmap implementation, and non-coherent architectures can control the presence of ->mmap support by enabling ARCH_HAS_DMA_COHERENT_TO_PFN for the dma direct implementation there is no need for a global config option to control the availability of dma_common_mmap. Signed-off-by: Christoph Hellwig <hch@lst.de> --- arch/Kconfig | 3 --- arch/c6x/Kconfig | 1 - arch/m68k/Kconfig | 1 - arch/microblaze/Kconfig | 1 - arch/parisc/Kconfig | 1 - arch/sh/Kconfig | 1 - arch/xtensa/Kconfig | 1 - kernel/dma/mapping.c | 4 ---- sound/core/pcm_native.c | 10 +--------- 9 files changed, 1 insertion(+), 22 deletions(-) diff --git a/arch/Kconfig b/arch/Kconfig index a7b57dd42c26..ec2834206d08 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -790,9 +790,6 @@ config COMPAT_32BIT_TIME This is relevant on all 32-bit architectures, and 64-bit architectures as part of compat syscall handling. -config ARCH_NO_COHERENT_DMA_MMAP - bool - config ARCH_NO_PREEMPT bool diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig index b4fb61c83494..e65e8d82442a 100644 --- a/arch/c6x/Kconfig +++ b/arch/c6x/Kconfig @@ -20,7 +20,6 @@ config C6X select OF_EARLY_FLATTREE select GENERIC_CLOCKEVENTS select MODULES_USE_ELF_RELA - select ARCH_NO_COHERENT_DMA_MMAP select MMU_GATHER_NO_RANGE if MMU config MMU diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig index c518d695c376..614b355ae338 100644 --- a/arch/m68k/Kconfig +++ b/arch/m68k/Kconfig @@ -8,7 +8,6 @@ config M68K select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA select ARCH_MIGHT_HAVE_PC_PARPORT if ISA - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select ARCH_NO_PREEMPT if !COLDFIRE select BINFMT_FLAT_ARGVP_ENVP_ON_STACK select DMA_DIRECT_REMAP if HAS_DMA && MMU && !COLDFIRE diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index d411de05b628..632c9477a0f6 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig @@ -9,7 +9,6 @@ config MICROBLAZE select ARCH_HAS_SYNC_DMA_FOR_CPU select ARCH_HAS_SYNC_DMA_FOR_DEVICE select ARCH_MIGHT_HAVE_PC_PARPORT - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select ARCH_WANT_IPC_PARSE_VERSION select BUILDTIME_EXTABLE_SORT select TIMER_OF diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig index 6d732e451071..e9dd88b7f81e 100644 --- a/arch/parisc/Kconfig +++ b/arch/parisc/Kconfig @@ -52,7 +52,6 @@ config PARISC select GENERIC_SCHED_CLOCK select HAVE_UNSTABLE_SCHED_CLOCK if SMP select GENERIC_CLOCKEVENTS - select ARCH_NO_COHERENT_DMA_MMAP select CPU_NO_EFFICIENT_FFS select NEED_DMA_MAP_STATE select NEED_SG_DMA_LENGTH diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 6b1b5941b618..f356ee674d89 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig @@ -5,7 +5,6 @@ config SUPERH select ARCH_HAS_PTE_SPECIAL select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST select ARCH_MIGHT_HAVE_PC_PARPORT - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select HAVE_PATA_PLATFORM select CLKDEV_LOOKUP select DMA_DECLARE_COHERENT diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index ebc135bda921..70653aed3005 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig @@ -5,7 +5,6 @@ config XTENSA select ARCH_HAS_BINFMT_FLAT if !MMU select ARCH_HAS_SYNC_DMA_FOR_CPU select ARCH_HAS_SYNC_DMA_FOR_DEVICE - select ARCH_NO_COHERENT_DMA_MMAP if !MMU select ARCH_USE_QUEUED_RWLOCKS select ARCH_USE_QUEUED_SPINLOCKS select ARCH_WANT_FRAME_POINTERS diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c index 7dff1829c8c5..815446f76995 100644 --- a/kernel/dma/mapping.c +++ b/kernel/dma/mapping.c @@ -169,7 +169,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, void *cpu_addr, dma_addr_t dma_addr, size_t size, unsigned long attrs) { -#ifndef CONFIG_ARCH_NO_COHERENT_DMA_MMAP unsigned long user_count = vma_pages(vma); unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; unsigned long off = vma->vm_pgoff; @@ -198,9 +197,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff, user_count << PAGE_SHIFT, vma->vm_page_prot); -#else - return -ENXIO; -#endif /* !CONFIG_ARCH_NO_COHERENT_DMA_MMAP */ } /** diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 860543a4c840..2dadc708343a 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -218,15 +218,7 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, static bool hw_support_mmap(struct snd_pcm_substream *substream) { - if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) - return false; - /* architecture supports dma_mmap_coherent()? */ -#if defined(CONFIG_ARCH_NO_COHERENT_DMA_MMAP) || !defined(CONFIG_HAS_DMA) - if (!substream->ops->mmap && - substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) - return false; -#endif - return true; + return substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP; } static int constrain_mask_params(struct snd_pcm_substream *substream, -- 2.20.1 ^ permalink raw reply related [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP 2019-07-25 6:34 ` Christoph Hellwig ` (2 preceding siblings ...) (?) @ 2019-08-02 7:03 ` Christoph Hellwig -1 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-08-02 7:03 UTC (permalink / raw) To: Takashi Iwai, iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Robin Murphy, x86, linux-kernel, linux-m68k, linuxppc-dev, linux-arm-kernel Takashi, any comments on the sounds/ side of this? On Thu, Jul 25, 2019 at 08:34:01AM +0200, Christoph Hellwig wrote: > Now that we never use a default ->mmap implementation, and non-coherent > architectures can control the presence of ->mmap support by enabling > ARCH_HAS_DMA_COHERENT_TO_PFN for the dma direct implementation there > is no need for a global config option to control the availability > of dma_common_mmap. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > arch/Kconfig | 3 --- > arch/c6x/Kconfig | 1 - > arch/m68k/Kconfig | 1 - > arch/microblaze/Kconfig | 1 - > arch/parisc/Kconfig | 1 - > arch/sh/Kconfig | 1 - > arch/xtensa/Kconfig | 1 - > kernel/dma/mapping.c | 4 ---- > sound/core/pcm_native.c | 10 +--------- > 9 files changed, 1 insertion(+), 22 deletions(-) > > diff --git a/arch/Kconfig b/arch/Kconfig > index a7b57dd42c26..ec2834206d08 100644 > --- a/arch/Kconfig > +++ b/arch/Kconfig > @@ -790,9 +790,6 @@ config COMPAT_32BIT_TIME > This is relevant on all 32-bit architectures, and 64-bit architectures > as part of compat syscall handling. > > -config ARCH_NO_COHERENT_DMA_MMAP > - bool > - > config ARCH_NO_PREEMPT > bool > > diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig > index b4fb61c83494..e65e8d82442a 100644 > --- a/arch/c6x/Kconfig > +++ b/arch/c6x/Kconfig > @@ -20,7 +20,6 @@ config C6X > select OF_EARLY_FLATTREE > select GENERIC_CLOCKEVENTS > select MODULES_USE_ELF_RELA > - select ARCH_NO_COHERENT_DMA_MMAP > select MMU_GATHER_NO_RANGE if MMU > > config MMU > diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig > index c518d695c376..614b355ae338 100644 > --- a/arch/m68k/Kconfig > +++ b/arch/m68k/Kconfig > @@ -8,7 +8,6 @@ config M68K > select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE > select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA > select ARCH_MIGHT_HAVE_PC_PARPORT if ISA > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select ARCH_NO_PREEMPT if !COLDFIRE > select BINFMT_FLAT_ARGVP_ENVP_ON_STACK > select DMA_DIRECT_REMAP if HAS_DMA && MMU && !COLDFIRE > diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig > index d411de05b628..632c9477a0f6 100644 > --- a/arch/microblaze/Kconfig > +++ b/arch/microblaze/Kconfig > @@ -9,7 +9,6 @@ config MICROBLAZE > select ARCH_HAS_SYNC_DMA_FOR_CPU > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > select ARCH_MIGHT_HAVE_PC_PARPORT > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select ARCH_WANT_IPC_PARSE_VERSION > select BUILDTIME_EXTABLE_SORT > select TIMER_OF > diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig > index 6d732e451071..e9dd88b7f81e 100644 > --- a/arch/parisc/Kconfig > +++ b/arch/parisc/Kconfig > @@ -52,7 +52,6 @@ config PARISC > select GENERIC_SCHED_CLOCK > select HAVE_UNSTABLE_SCHED_CLOCK if SMP > select GENERIC_CLOCKEVENTS > - select ARCH_NO_COHERENT_DMA_MMAP > select CPU_NO_EFFICIENT_FFS > select NEED_DMA_MAP_STATE > select NEED_SG_DMA_LENGTH > diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig > index 6b1b5941b618..f356ee674d89 100644 > --- a/arch/sh/Kconfig > +++ b/arch/sh/Kconfig > @@ -5,7 +5,6 @@ config SUPERH > select ARCH_HAS_PTE_SPECIAL > select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST > select ARCH_MIGHT_HAVE_PC_PARPORT > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select HAVE_PATA_PLATFORM > select CLKDEV_LOOKUP > select DMA_DECLARE_COHERENT > diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig > index ebc135bda921..70653aed3005 100644 > --- a/arch/xtensa/Kconfig > +++ b/arch/xtensa/Kconfig > @@ -5,7 +5,6 @@ config XTENSA > select ARCH_HAS_BINFMT_FLAT if !MMU > select ARCH_HAS_SYNC_DMA_FOR_CPU > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select ARCH_USE_QUEUED_RWLOCKS > select ARCH_USE_QUEUED_SPINLOCKS > select ARCH_WANT_FRAME_POINTERS > diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c > index 7dff1829c8c5..815446f76995 100644 > --- a/kernel/dma/mapping.c > +++ b/kernel/dma/mapping.c > @@ -169,7 +169,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > void *cpu_addr, dma_addr_t dma_addr, size_t size, > unsigned long attrs) > { > -#ifndef CONFIG_ARCH_NO_COHERENT_DMA_MMAP > unsigned long user_count = vma_pages(vma); > unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; > unsigned long off = vma->vm_pgoff; > @@ -198,9 +197,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > > return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff, > user_count << PAGE_SHIFT, vma->vm_page_prot); > -#else > - return -ENXIO; > -#endif /* !CONFIG_ARCH_NO_COHERENT_DMA_MMAP */ > } > > /** > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c > index 860543a4c840..2dadc708343a 100644 > --- a/sound/core/pcm_native.c > +++ b/sound/core/pcm_native.c > @@ -218,15 +218,7 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, > > static bool hw_support_mmap(struct snd_pcm_substream *substream) > { > - if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) > - return false; > - /* architecture supports dma_mmap_coherent()? */ > -#if defined(CONFIG_ARCH_NO_COHERENT_DMA_MMAP) || !defined(CONFIG_HAS_DMA) > - if (!substream->ops->mmap && > - substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) > - return false; > -#endif > - return true; > + return substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP; > } > > static int constrain_mask_params(struct snd_pcm_substream *substream, > -- > 2.20.1 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ---end quoted text--- _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-08-02 7:03 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-08-02 7:03 UTC (permalink / raw) To: Takashi Iwai, iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Robin Murphy, x86, linux-kernel, linux-m68k, linuxppc-dev, linux-arm-kernel Takashi, any comments on the sounds/ side of this? On Thu, Jul 25, 2019 at 08:34:01AM +0200, Christoph Hellwig wrote: > Now that we never use a default ->mmap implementation, and non-coherent > architectures can control the presence of ->mmap support by enabling > ARCH_HAS_DMA_COHERENT_TO_PFN for the dma direct implementation there > is no need for a global config option to control the availability > of dma_common_mmap. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > arch/Kconfig | 3 --- > arch/c6x/Kconfig | 1 - > arch/m68k/Kconfig | 1 - > arch/microblaze/Kconfig | 1 - > arch/parisc/Kconfig | 1 - > arch/sh/Kconfig | 1 - > arch/xtensa/Kconfig | 1 - > kernel/dma/mapping.c | 4 ---- > sound/core/pcm_native.c | 10 +--------- > 9 files changed, 1 insertion(+), 22 deletions(-) > > diff --git a/arch/Kconfig b/arch/Kconfig > index a7b57dd42c26..ec2834206d08 100644 > --- a/arch/Kconfig > +++ b/arch/Kconfig > @@ -790,9 +790,6 @@ config COMPAT_32BIT_TIME > This is relevant on all 32-bit architectures, and 64-bit architectures > as part of compat syscall handling. > > -config ARCH_NO_COHERENT_DMA_MMAP > - bool > - > config ARCH_NO_PREEMPT > bool > > diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig > index b4fb61c83494..e65e8d82442a 100644 > --- a/arch/c6x/Kconfig > +++ b/arch/c6x/Kconfig > @@ -20,7 +20,6 @@ config C6X > select OF_EARLY_FLATTREE > select GENERIC_CLOCKEVENTS > select MODULES_USE_ELF_RELA > - select ARCH_NO_COHERENT_DMA_MMAP > select MMU_GATHER_NO_RANGE if MMU > > config MMU > diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig > index c518d695c376..614b355ae338 100644 > --- a/arch/m68k/Kconfig > +++ b/arch/m68k/Kconfig > @@ -8,7 +8,6 @@ config M68K > select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE > select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA > select ARCH_MIGHT_HAVE_PC_PARPORT if ISA > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select ARCH_NO_PREEMPT if !COLDFIRE > select BINFMT_FLAT_ARGVP_ENVP_ON_STACK > select DMA_DIRECT_REMAP if HAS_DMA && MMU && !COLDFIRE > diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig > index d411de05b628..632c9477a0f6 100644 > --- a/arch/microblaze/Kconfig > +++ b/arch/microblaze/Kconfig > @@ -9,7 +9,6 @@ config MICROBLAZE > select ARCH_HAS_SYNC_DMA_FOR_CPU > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > select ARCH_MIGHT_HAVE_PC_PARPORT > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select ARCH_WANT_IPC_PARSE_VERSION > select BUILDTIME_EXTABLE_SORT > select TIMER_OF > diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig > index 6d732e451071..e9dd88b7f81e 100644 > --- a/arch/parisc/Kconfig > +++ b/arch/parisc/Kconfig > @@ -52,7 +52,6 @@ config PARISC > select GENERIC_SCHED_CLOCK > select HAVE_UNSTABLE_SCHED_CLOCK if SMP > select GENERIC_CLOCKEVENTS > - select ARCH_NO_COHERENT_DMA_MMAP > select CPU_NO_EFFICIENT_FFS > select NEED_DMA_MAP_STATE > select NEED_SG_DMA_LENGTH > diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig > index 6b1b5941b618..f356ee674d89 100644 > --- a/arch/sh/Kconfig > +++ b/arch/sh/Kconfig > @@ -5,7 +5,6 @@ config SUPERH > select ARCH_HAS_PTE_SPECIAL > select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST > select ARCH_MIGHT_HAVE_PC_PARPORT > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select HAVE_PATA_PLATFORM > select CLKDEV_LOOKUP > select DMA_DECLARE_COHERENT > diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig > index ebc135bda921..70653aed3005 100644 > --- a/arch/xtensa/Kconfig > +++ b/arch/xtensa/Kconfig > @@ -5,7 +5,6 @@ config XTENSA > select ARCH_HAS_BINFMT_FLAT if !MMU > select ARCH_HAS_SYNC_DMA_FOR_CPU > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select ARCH_USE_QUEUED_RWLOCKS > select ARCH_USE_QUEUED_SPINLOCKS > select ARCH_WANT_FRAME_POINTERS > diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c > index 7dff1829c8c5..815446f76995 100644 > --- a/kernel/dma/mapping.c > +++ b/kernel/dma/mapping.c > @@ -169,7 +169,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > void *cpu_addr, dma_addr_t dma_addr, size_t size, > unsigned long attrs) > { > -#ifndef CONFIG_ARCH_NO_COHERENT_DMA_MMAP > unsigned long user_count = vma_pages(vma); > unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; > unsigned long off = vma->vm_pgoff; > @@ -198,9 +197,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > > return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff, > user_count << PAGE_SHIFT, vma->vm_page_prot); > -#else > - return -ENXIO; > -#endif /* !CONFIG_ARCH_NO_COHERENT_DMA_MMAP */ > } > > /** > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c > index 860543a4c840..2dadc708343a 100644 > --- a/sound/core/pcm_native.c > +++ b/sound/core/pcm_native.c > @@ -218,15 +218,7 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, > > static bool hw_support_mmap(struct snd_pcm_substream *substream) > { > - if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) > - return false; > - /* architecture supports dma_mmap_coherent()? */ > -#if defined(CONFIG_ARCH_NO_COHERENT_DMA_MMAP) || !defined(CONFIG_HAS_DMA) > - if (!substream->ops->mmap && > - substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) > - return false; > -#endif > - return true; > + return substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP; > } > > static int constrain_mask_params(struct snd_pcm_substream *substream, > -- > 2.20.1 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ---end quoted text--- _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-08-02 7:03 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-08-02 7:03 UTC (permalink / raw) To: Takashi Iwai, iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Robin Murphy, x86, linux-kernel, linux-m68k, linuxppc-dev, linux-arm-kernel Takashi, any comments on the sounds/ side of this? On Thu, Jul 25, 2019 at 08:34:01AM +0200, Christoph Hellwig wrote: > Now that we never use a default ->mmap implementation, and non-coherent > architectures can control the presence of ->mmap support by enabling > ARCH_HAS_DMA_COHERENT_TO_PFN for the dma direct implementation there > is no need for a global config option to control the availability > of dma_common_mmap. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > arch/Kconfig | 3 --- > arch/c6x/Kconfig | 1 - > arch/m68k/Kconfig | 1 - > arch/microblaze/Kconfig | 1 - > arch/parisc/Kconfig | 1 - > arch/sh/Kconfig | 1 - > arch/xtensa/Kconfig | 1 - > kernel/dma/mapping.c | 4 ---- > sound/core/pcm_native.c | 10 +--------- > 9 files changed, 1 insertion(+), 22 deletions(-) > > diff --git a/arch/Kconfig b/arch/Kconfig > index a7b57dd42c26..ec2834206d08 100644 > --- a/arch/Kconfig > +++ b/arch/Kconfig > @@ -790,9 +790,6 @@ config COMPAT_32BIT_TIME > This is relevant on all 32-bit architectures, and 64-bit architectures > as part of compat syscall handling. > > -config ARCH_NO_COHERENT_DMA_MMAP > - bool > - > config ARCH_NO_PREEMPT > bool > > diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig > index b4fb61c83494..e65e8d82442a 100644 > --- a/arch/c6x/Kconfig > +++ b/arch/c6x/Kconfig > @@ -20,7 +20,6 @@ config C6X > select OF_EARLY_FLATTREE > select GENERIC_CLOCKEVENTS > select MODULES_USE_ELF_RELA > - select ARCH_NO_COHERENT_DMA_MMAP > select MMU_GATHER_NO_RANGE if MMU > > config MMU > diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig > index c518d695c376..614b355ae338 100644 > --- a/arch/m68k/Kconfig > +++ b/arch/m68k/Kconfig > @@ -8,7 +8,6 @@ config M68K > select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE > select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA > select ARCH_MIGHT_HAVE_PC_PARPORT if ISA > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select ARCH_NO_PREEMPT if !COLDFIRE > select BINFMT_FLAT_ARGVP_ENVP_ON_STACK > select DMA_DIRECT_REMAP if HAS_DMA && MMU && !COLDFIRE > diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig > index d411de05b628..632c9477a0f6 100644 > --- a/arch/microblaze/Kconfig > +++ b/arch/microblaze/Kconfig > @@ -9,7 +9,6 @@ config MICROBLAZE > select ARCH_HAS_SYNC_DMA_FOR_CPU > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > select ARCH_MIGHT_HAVE_PC_PARPORT > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select ARCH_WANT_IPC_PARSE_VERSION > select BUILDTIME_EXTABLE_SORT > select TIMER_OF > diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig > index 6d732e451071..e9dd88b7f81e 100644 > --- a/arch/parisc/Kconfig > +++ b/arch/parisc/Kconfig > @@ -52,7 +52,6 @@ config PARISC > select GENERIC_SCHED_CLOCK > select HAVE_UNSTABLE_SCHED_CLOCK if SMP > select GENERIC_CLOCKEVENTS > - select ARCH_NO_COHERENT_DMA_MMAP > select CPU_NO_EFFICIENT_FFS > select NEED_DMA_MAP_STATE > select NEED_SG_DMA_LENGTH > diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig > index 6b1b5941b618..f356ee674d89 100644 > --- a/arch/sh/Kconfig > +++ b/arch/sh/Kconfig > @@ -5,7 +5,6 @@ config SUPERH > select ARCH_HAS_PTE_SPECIAL > select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST > select ARCH_MIGHT_HAVE_PC_PARPORT > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select HAVE_PATA_PLATFORM > select CLKDEV_LOOKUP > select DMA_DECLARE_COHERENT > diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig > index ebc135bda921..70653aed3005 100644 > --- a/arch/xtensa/Kconfig > +++ b/arch/xtensa/Kconfig > @@ -5,7 +5,6 @@ config XTENSA > select ARCH_HAS_BINFMT_FLAT if !MMU > select ARCH_HAS_SYNC_DMA_FOR_CPU > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select ARCH_USE_QUEUED_RWLOCKS > select ARCH_USE_QUEUED_SPINLOCKS > select ARCH_WANT_FRAME_POINTERS > diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c > index 7dff1829c8c5..815446f76995 100644 > --- a/kernel/dma/mapping.c > +++ b/kernel/dma/mapping.c > @@ -169,7 +169,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > void *cpu_addr, dma_addr_t dma_addr, size_t size, > unsigned long attrs) > { > -#ifndef CONFIG_ARCH_NO_COHERENT_DMA_MMAP > unsigned long user_count = vma_pages(vma); > unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; > unsigned long off = vma->vm_pgoff; > @@ -198,9 +197,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > > return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff, > user_count << PAGE_SHIFT, vma->vm_page_prot); > -#else > - return -ENXIO; > -#endif /* !CONFIG_ARCH_NO_COHERENT_DMA_MMAP */ > } > > /** > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c > index 860543a4c840..2dadc708343a 100644 > --- a/sound/core/pcm_native.c > +++ b/sound/core/pcm_native.c > @@ -218,15 +218,7 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, > > static bool hw_support_mmap(struct snd_pcm_substream *substream) > { > - if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) > - return false; > - /* architecture supports dma_mmap_coherent()? */ > -#if defined(CONFIG_ARCH_NO_COHERENT_DMA_MMAP) || !defined(CONFIG_HAS_DMA) > - if (!substream->ops->mmap && > - substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) > - return false; > -#endif > - return true; > + return substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP; > } > > static int constrain_mask_params(struct snd_pcm_substream *substream, > -- > 2.20.1 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ---end quoted text--- ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-08-02 7:03 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-08-02 7:03 UTC (permalink / raw) To: Takashi Iwai, iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Robin Murphy, x86, linux-kernel, linux-m68k, linuxppc-dev, linux-arm-kernel Takashi, any comments on the sounds/ side of this? On Thu, Jul 25, 2019 at 08:34:01AM +0200, Christoph Hellwig wrote: > Now that we never use a default ->mmap implementation, and non-coherent > architectures can control the presence of ->mmap support by enabling > ARCH_HAS_DMA_COHERENT_TO_PFN for the dma direct implementation there > is no need for a global config option to control the availability > of dma_common_mmap. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > arch/Kconfig | 3 --- > arch/c6x/Kconfig | 1 - > arch/m68k/Kconfig | 1 - > arch/microblaze/Kconfig | 1 - > arch/parisc/Kconfig | 1 - > arch/sh/Kconfig | 1 - > arch/xtensa/Kconfig | 1 - > kernel/dma/mapping.c | 4 ---- > sound/core/pcm_native.c | 10 +--------- > 9 files changed, 1 insertion(+), 22 deletions(-) > > diff --git a/arch/Kconfig b/arch/Kconfig > index a7b57dd42c26..ec2834206d08 100644 > --- a/arch/Kconfig > +++ b/arch/Kconfig > @@ -790,9 +790,6 @@ config COMPAT_32BIT_TIME > This is relevant on all 32-bit architectures, and 64-bit architectures > as part of compat syscall handling. > > -config ARCH_NO_COHERENT_DMA_MMAP > - bool > - > config ARCH_NO_PREEMPT > bool > > diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig > index b4fb61c83494..e65e8d82442a 100644 > --- a/arch/c6x/Kconfig > +++ b/arch/c6x/Kconfig > @@ -20,7 +20,6 @@ config C6X > select OF_EARLY_FLATTREE > select GENERIC_CLOCKEVENTS > select MODULES_USE_ELF_RELA > - select ARCH_NO_COHERENT_DMA_MMAP > select MMU_GATHER_NO_RANGE if MMU > > config MMU > diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig > index c518d695c376..614b355ae338 100644 > --- a/arch/m68k/Kconfig > +++ b/arch/m68k/Kconfig > @@ -8,7 +8,6 @@ config M68K > select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE > select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA > select ARCH_MIGHT_HAVE_PC_PARPORT if ISA > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select ARCH_NO_PREEMPT if !COLDFIRE > select BINFMT_FLAT_ARGVP_ENVP_ON_STACK > select DMA_DIRECT_REMAP if HAS_DMA && MMU && !COLDFIRE > diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig > index d411de05b628..632c9477a0f6 100644 > --- a/arch/microblaze/Kconfig > +++ b/arch/microblaze/Kconfig > @@ -9,7 +9,6 @@ config MICROBLAZE > select ARCH_HAS_SYNC_DMA_FOR_CPU > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > select ARCH_MIGHT_HAVE_PC_PARPORT > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select ARCH_WANT_IPC_PARSE_VERSION > select BUILDTIME_EXTABLE_SORT > select TIMER_OF > diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig > index 6d732e451071..e9dd88b7f81e 100644 > --- a/arch/parisc/Kconfig > +++ b/arch/parisc/Kconfig > @@ -52,7 +52,6 @@ config PARISC > select GENERIC_SCHED_CLOCK > select HAVE_UNSTABLE_SCHED_CLOCK if SMP > select GENERIC_CLOCKEVENTS > - select ARCH_NO_COHERENT_DMA_MMAP > select CPU_NO_EFFICIENT_FFS > select NEED_DMA_MAP_STATE > select NEED_SG_DMA_LENGTH > diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig > index 6b1b5941b618..f356ee674d89 100644 > --- a/arch/sh/Kconfig > +++ b/arch/sh/Kconfig > @@ -5,7 +5,6 @@ config SUPERH > select ARCH_HAS_PTE_SPECIAL > select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST > select ARCH_MIGHT_HAVE_PC_PARPORT > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select HAVE_PATA_PLATFORM > select CLKDEV_LOOKUP > select DMA_DECLARE_COHERENT > diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig > index ebc135bda921..70653aed3005 100644 > --- a/arch/xtensa/Kconfig > +++ b/arch/xtensa/Kconfig > @@ -5,7 +5,6 @@ config XTENSA > select ARCH_HAS_BINFMT_FLAT if !MMU > select ARCH_HAS_SYNC_DMA_FOR_CPU > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select ARCH_USE_QUEUED_RWLOCKS > select ARCH_USE_QUEUED_SPINLOCKS > select ARCH_WANT_FRAME_POINTERS > diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c > index 7dff1829c8c5..815446f76995 100644 > --- a/kernel/dma/mapping.c > +++ b/kernel/dma/mapping.c > @@ -169,7 +169,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > void *cpu_addr, dma_addr_t dma_addr, size_t size, > unsigned long attrs) > { > -#ifndef CONFIG_ARCH_NO_COHERENT_DMA_MMAP > unsigned long user_count = vma_pages(vma); > unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; > unsigned long off = vma->vm_pgoff; > @@ -198,9 +197,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > > return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff, > user_count << PAGE_SHIFT, vma->vm_page_prot); > -#else > - return -ENXIO; > -#endif /* !CONFIG_ARCH_NO_COHERENT_DMA_MMAP */ > } > > /** > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c > index 860543a4c840..2dadc708343a 100644 > --- a/sound/core/pcm_native.c > +++ b/sound/core/pcm_native.c > @@ -218,15 +218,7 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, > > static bool hw_support_mmap(struct snd_pcm_substream *substream) > { > - if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) > - return false; > - /* architecture supports dma_mmap_coherent()? */ > -#if defined(CONFIG_ARCH_NO_COHERENT_DMA_MMAP) || !defined(CONFIG_HAS_DMA) > - if (!substream->ops->mmap && > - substream->dma_buffer.dev.type = SNDRV_DMA_TYPE_DEV) > - return false; > -#endif > - return true; > + return substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP; > } > > static int constrain_mask_params(struct snd_pcm_substream *substream, > -- > 2.20.1 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ---end quoted text--- ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-08-02 7:03 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-08-02 7:03 UTC (permalink / raw) To: Takashi Iwai, iommu, Marek Szyprowski Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel Takashi, any comments on the sounds/ side of this? On Thu, Jul 25, 2019 at 08:34:01AM +0200, Christoph Hellwig wrote: > Now that we never use a default ->mmap implementation, and non-coherent > architectures can control the presence of ->mmap support by enabling > ARCH_HAS_DMA_COHERENT_TO_PFN for the dma direct implementation there > is no need for a global config option to control the availability > of dma_common_mmap. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > arch/Kconfig | 3 --- > arch/c6x/Kconfig | 1 - > arch/m68k/Kconfig | 1 - > arch/microblaze/Kconfig | 1 - > arch/parisc/Kconfig | 1 - > arch/sh/Kconfig | 1 - > arch/xtensa/Kconfig | 1 - > kernel/dma/mapping.c | 4 ---- > sound/core/pcm_native.c | 10 +--------- > 9 files changed, 1 insertion(+), 22 deletions(-) > > diff --git a/arch/Kconfig b/arch/Kconfig > index a7b57dd42c26..ec2834206d08 100644 > --- a/arch/Kconfig > +++ b/arch/Kconfig > @@ -790,9 +790,6 @@ config COMPAT_32BIT_TIME > This is relevant on all 32-bit architectures, and 64-bit architectures > as part of compat syscall handling. > > -config ARCH_NO_COHERENT_DMA_MMAP > - bool > - > config ARCH_NO_PREEMPT > bool > > diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig > index b4fb61c83494..e65e8d82442a 100644 > --- a/arch/c6x/Kconfig > +++ b/arch/c6x/Kconfig > @@ -20,7 +20,6 @@ config C6X > select OF_EARLY_FLATTREE > select GENERIC_CLOCKEVENTS > select MODULES_USE_ELF_RELA > - select ARCH_NO_COHERENT_DMA_MMAP > select MMU_GATHER_NO_RANGE if MMU > > config MMU > diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig > index c518d695c376..614b355ae338 100644 > --- a/arch/m68k/Kconfig > +++ b/arch/m68k/Kconfig > @@ -8,7 +8,6 @@ config M68K > select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE > select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA > select ARCH_MIGHT_HAVE_PC_PARPORT if ISA > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select ARCH_NO_PREEMPT if !COLDFIRE > select BINFMT_FLAT_ARGVP_ENVP_ON_STACK > select DMA_DIRECT_REMAP if HAS_DMA && MMU && !COLDFIRE > diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig > index d411de05b628..632c9477a0f6 100644 > --- a/arch/microblaze/Kconfig > +++ b/arch/microblaze/Kconfig > @@ -9,7 +9,6 @@ config MICROBLAZE > select ARCH_HAS_SYNC_DMA_FOR_CPU > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > select ARCH_MIGHT_HAVE_PC_PARPORT > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select ARCH_WANT_IPC_PARSE_VERSION > select BUILDTIME_EXTABLE_SORT > select TIMER_OF > diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig > index 6d732e451071..e9dd88b7f81e 100644 > --- a/arch/parisc/Kconfig > +++ b/arch/parisc/Kconfig > @@ -52,7 +52,6 @@ config PARISC > select GENERIC_SCHED_CLOCK > select HAVE_UNSTABLE_SCHED_CLOCK if SMP > select GENERIC_CLOCKEVENTS > - select ARCH_NO_COHERENT_DMA_MMAP > select CPU_NO_EFFICIENT_FFS > select NEED_DMA_MAP_STATE > select NEED_SG_DMA_LENGTH > diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig > index 6b1b5941b618..f356ee674d89 100644 > --- a/arch/sh/Kconfig > +++ b/arch/sh/Kconfig > @@ -5,7 +5,6 @@ config SUPERH > select ARCH_HAS_PTE_SPECIAL > select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST > select ARCH_MIGHT_HAVE_PC_PARPORT > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select HAVE_PATA_PLATFORM > select CLKDEV_LOOKUP > select DMA_DECLARE_COHERENT > diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig > index ebc135bda921..70653aed3005 100644 > --- a/arch/xtensa/Kconfig > +++ b/arch/xtensa/Kconfig > @@ -5,7 +5,6 @@ config XTENSA > select ARCH_HAS_BINFMT_FLAT if !MMU > select ARCH_HAS_SYNC_DMA_FOR_CPU > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > select ARCH_USE_QUEUED_RWLOCKS > select ARCH_USE_QUEUED_SPINLOCKS > select ARCH_WANT_FRAME_POINTERS > diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c > index 7dff1829c8c5..815446f76995 100644 > --- a/kernel/dma/mapping.c > +++ b/kernel/dma/mapping.c > @@ -169,7 +169,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > void *cpu_addr, dma_addr_t dma_addr, size_t size, > unsigned long attrs) > { > -#ifndef CONFIG_ARCH_NO_COHERENT_DMA_MMAP > unsigned long user_count = vma_pages(vma); > unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; > unsigned long off = vma->vm_pgoff; > @@ -198,9 +197,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > > return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff, > user_count << PAGE_SHIFT, vma->vm_page_prot); > -#else > - return -ENXIO; > -#endif /* !CONFIG_ARCH_NO_COHERENT_DMA_MMAP */ > } > > /** > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c > index 860543a4c840..2dadc708343a 100644 > --- a/sound/core/pcm_native.c > +++ b/sound/core/pcm_native.c > @@ -218,15 +218,7 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, > > static bool hw_support_mmap(struct snd_pcm_substream *substream) > { > - if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) > - return false; > - /* architecture supports dma_mmap_coherent()? */ > -#if defined(CONFIG_ARCH_NO_COHERENT_DMA_MMAP) || !defined(CONFIG_HAS_DMA) > - if (!substream->ops->mmap && > - substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) > - return false; > -#endif > - return true; > + return substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP; > } > > static int constrain_mask_params(struct snd_pcm_substream *substream, > -- > 2.20.1 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ---end quoted text--- ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP 2019-08-02 7:03 ` Christoph Hellwig ` (2 preceding siblings ...) (?) @ 2019-08-02 8:24 ` Takashi Iwai -1 siblings, 0 replies; 60+ messages in thread From: Takashi Iwai @ 2019-08-02 8:24 UTC (permalink / raw) To: Christoph Hellwig Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, Robin Murphy, x86, linux-kernel, iommu, linux-m68k, linuxppc-dev, linux-arm-kernel On Fri, 02 Aug 2019 09:03:54 +0200, Christoph Hellwig wrote: > > Takashi, > > any comments on the sounds/ side of this? I wasn't careful enough to look at that change, sorry. The code there tries to check whether dma_mmap_coherent() would always fail on some platforms. Then the driver clears the mmap capability flag at the device open time and notifies user-space to fall back to the dumb read/write mode. So I'm afraid that simply dropping the check would cause the behavior regression, e.g. on PARISC. Is there any simple way to test whether dma_mmap_coherent() would work or not in general on the target platform? It's not necessarily in an ifdef at all. thanks, Takashi > On Thu, Jul 25, 2019 at 08:34:01AM +0200, Christoph Hellwig wrote: > > Now that we never use a default ->mmap implementation, and non-coherent > > architectures can control the presence of ->mmap support by enabling > > ARCH_HAS_DMA_COHERENT_TO_PFN for the dma direct implementation there > > is no need for a global config option to control the availability > > of dma_common_mmap. > > > > Signed-off-by: Christoph Hellwig <hch@lst.de> > > --- > > arch/Kconfig | 3 --- > > arch/c6x/Kconfig | 1 - > > arch/m68k/Kconfig | 1 - > > arch/microblaze/Kconfig | 1 - > > arch/parisc/Kconfig | 1 - > > arch/sh/Kconfig | 1 - > > arch/xtensa/Kconfig | 1 - > > kernel/dma/mapping.c | 4 ---- > > sound/core/pcm_native.c | 10 +--------- > > 9 files changed, 1 insertion(+), 22 deletions(-) > > > > diff --git a/arch/Kconfig b/arch/Kconfig > > index a7b57dd42c26..ec2834206d08 100644 > > --- a/arch/Kconfig > > +++ b/arch/Kconfig > > @@ -790,9 +790,6 @@ config COMPAT_32BIT_TIME > > This is relevant on all 32-bit architectures, and 64-bit architectures > > as part of compat syscall handling. > > > > -config ARCH_NO_COHERENT_DMA_MMAP > > - bool > > - > > config ARCH_NO_PREEMPT > > bool > > > > diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig > > index b4fb61c83494..e65e8d82442a 100644 > > --- a/arch/c6x/Kconfig > > +++ b/arch/c6x/Kconfig > > @@ -20,7 +20,6 @@ config C6X > > select OF_EARLY_FLATTREE > > select GENERIC_CLOCKEVENTS > > select MODULES_USE_ELF_RELA > > - select ARCH_NO_COHERENT_DMA_MMAP > > select MMU_GATHER_NO_RANGE if MMU > > > > config MMU > > diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig > > index c518d695c376..614b355ae338 100644 > > --- a/arch/m68k/Kconfig > > +++ b/arch/m68k/Kconfig > > @@ -8,7 +8,6 @@ config M68K > > select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE > > select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA > > select ARCH_MIGHT_HAVE_PC_PARPORT if ISA > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select ARCH_NO_PREEMPT if !COLDFIRE > > select BINFMT_FLAT_ARGVP_ENVP_ON_STACK > > select DMA_DIRECT_REMAP if HAS_DMA && MMU && !COLDFIRE > > diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig > > index d411de05b628..632c9477a0f6 100644 > > --- a/arch/microblaze/Kconfig > > +++ b/arch/microblaze/Kconfig > > @@ -9,7 +9,6 @@ config MICROBLAZE > > select ARCH_HAS_SYNC_DMA_FOR_CPU > > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > > select ARCH_MIGHT_HAVE_PC_PARPORT > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select ARCH_WANT_IPC_PARSE_VERSION > > select BUILDTIME_EXTABLE_SORT > > select TIMER_OF > > diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig > > index 6d732e451071..e9dd88b7f81e 100644 > > --- a/arch/parisc/Kconfig > > +++ b/arch/parisc/Kconfig > > @@ -52,7 +52,6 @@ config PARISC > > select GENERIC_SCHED_CLOCK > > select HAVE_UNSTABLE_SCHED_CLOCK if SMP > > select GENERIC_CLOCKEVENTS > > - select ARCH_NO_COHERENT_DMA_MMAP > > select CPU_NO_EFFICIENT_FFS > > select NEED_DMA_MAP_STATE > > select NEED_SG_DMA_LENGTH > > diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig > > index 6b1b5941b618..f356ee674d89 100644 > > --- a/arch/sh/Kconfig > > +++ b/arch/sh/Kconfig > > @@ -5,7 +5,6 @@ config SUPERH > > select ARCH_HAS_PTE_SPECIAL > > select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST > > select ARCH_MIGHT_HAVE_PC_PARPORT > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select HAVE_PATA_PLATFORM > > select CLKDEV_LOOKUP > > select DMA_DECLARE_COHERENT > > diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig > > index ebc135bda921..70653aed3005 100644 > > --- a/arch/xtensa/Kconfig > > +++ b/arch/xtensa/Kconfig > > @@ -5,7 +5,6 @@ config XTENSA > > select ARCH_HAS_BINFMT_FLAT if !MMU > > select ARCH_HAS_SYNC_DMA_FOR_CPU > > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select ARCH_USE_QUEUED_RWLOCKS > > select ARCH_USE_QUEUED_SPINLOCKS > > select ARCH_WANT_FRAME_POINTERS > > diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c > > index 7dff1829c8c5..815446f76995 100644 > > --- a/kernel/dma/mapping.c > > +++ b/kernel/dma/mapping.c > > @@ -169,7 +169,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > > void *cpu_addr, dma_addr_t dma_addr, size_t size, > > unsigned long attrs) > > { > > -#ifndef CONFIG_ARCH_NO_COHERENT_DMA_MMAP > > unsigned long user_count = vma_pages(vma); > > unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; > > unsigned long off = vma->vm_pgoff; > > @@ -198,9 +197,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > > > > return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff, > > user_count << PAGE_SHIFT, vma->vm_page_prot); > > -#else > > - return -ENXIO; > > -#endif /* !CONFIG_ARCH_NO_COHERENT_DMA_MMAP */ > > } > > > > /** > > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c > > index 860543a4c840..2dadc708343a 100644 > > --- a/sound/core/pcm_native.c > > +++ b/sound/core/pcm_native.c > > @@ -218,15 +218,7 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, > > > > static bool hw_support_mmap(struct snd_pcm_substream *substream) > > { > > - if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) > > - return false; > > - /* architecture supports dma_mmap_coherent()? */ > > -#if defined(CONFIG_ARCH_NO_COHERENT_DMA_MMAP) || !defined(CONFIG_HAS_DMA) > > - if (!substream->ops->mmap && > > - substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) > > - return false; > > -#endif > > - return true; > > + return substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP; > > } > > > > static int constrain_mask_params(struct snd_pcm_substream *substream, > > -- > > 2.20.1 > > > > > > _______________________________________________ > > linux-arm-kernel mailing list > > linux-arm-kernel@lists.infradead.org > > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > ---end quoted text--- > _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-08-02 8:24 ` Takashi Iwai 0 siblings, 0 replies; 60+ messages in thread From: Takashi Iwai @ 2019-08-02 8:24 UTC (permalink / raw) To: Christoph Hellwig Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, Robin Murphy, x86, linux-kernel, iommu, linux-m68k, linuxppc-dev, linux-arm-kernel, Marek Szyprowski On Fri, 02 Aug 2019 09:03:54 +0200, Christoph Hellwig wrote: > > Takashi, > > any comments on the sounds/ side of this? I wasn't careful enough to look at that change, sorry. The code there tries to check whether dma_mmap_coherent() would always fail on some platforms. Then the driver clears the mmap capability flag at the device open time and notifies user-space to fall back to the dumb read/write mode. So I'm afraid that simply dropping the check would cause the behavior regression, e.g. on PARISC. Is there any simple way to test whether dma_mmap_coherent() would work or not in general on the target platform? It's not necessarily in an ifdef at all. thanks, Takashi > On Thu, Jul 25, 2019 at 08:34:01AM +0200, Christoph Hellwig wrote: > > Now that we never use a default ->mmap implementation, and non-coherent > > architectures can control the presence of ->mmap support by enabling > > ARCH_HAS_DMA_COHERENT_TO_PFN for the dma direct implementation there > > is no need for a global config option to control the availability > > of dma_common_mmap. > > > > Signed-off-by: Christoph Hellwig <hch@lst.de> > > --- > > arch/Kconfig | 3 --- > > arch/c6x/Kconfig | 1 - > > arch/m68k/Kconfig | 1 - > > arch/microblaze/Kconfig | 1 - > > arch/parisc/Kconfig | 1 - > > arch/sh/Kconfig | 1 - > > arch/xtensa/Kconfig | 1 - > > kernel/dma/mapping.c | 4 ---- > > sound/core/pcm_native.c | 10 +--------- > > 9 files changed, 1 insertion(+), 22 deletions(-) > > > > diff --git a/arch/Kconfig b/arch/Kconfig > > index a7b57dd42c26..ec2834206d08 100644 > > --- a/arch/Kconfig > > +++ b/arch/Kconfig > > @@ -790,9 +790,6 @@ config COMPAT_32BIT_TIME > > This is relevant on all 32-bit architectures, and 64-bit architectures > > as part of compat syscall handling. > > > > -config ARCH_NO_COHERENT_DMA_MMAP > > - bool > > - > > config ARCH_NO_PREEMPT > > bool > > > > diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig > > index b4fb61c83494..e65e8d82442a 100644 > > --- a/arch/c6x/Kconfig > > +++ b/arch/c6x/Kconfig > > @@ -20,7 +20,6 @@ config C6X > > select OF_EARLY_FLATTREE > > select GENERIC_CLOCKEVENTS > > select MODULES_USE_ELF_RELA > > - select ARCH_NO_COHERENT_DMA_MMAP > > select MMU_GATHER_NO_RANGE if MMU > > > > config MMU > > diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig > > index c518d695c376..614b355ae338 100644 > > --- a/arch/m68k/Kconfig > > +++ b/arch/m68k/Kconfig > > @@ -8,7 +8,6 @@ config M68K > > select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE > > select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA > > select ARCH_MIGHT_HAVE_PC_PARPORT if ISA > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select ARCH_NO_PREEMPT if !COLDFIRE > > select BINFMT_FLAT_ARGVP_ENVP_ON_STACK > > select DMA_DIRECT_REMAP if HAS_DMA && MMU && !COLDFIRE > > diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig > > index d411de05b628..632c9477a0f6 100644 > > --- a/arch/microblaze/Kconfig > > +++ b/arch/microblaze/Kconfig > > @@ -9,7 +9,6 @@ config MICROBLAZE > > select ARCH_HAS_SYNC_DMA_FOR_CPU > > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > > select ARCH_MIGHT_HAVE_PC_PARPORT > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select ARCH_WANT_IPC_PARSE_VERSION > > select BUILDTIME_EXTABLE_SORT > > select TIMER_OF > > diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig > > index 6d732e451071..e9dd88b7f81e 100644 > > --- a/arch/parisc/Kconfig > > +++ b/arch/parisc/Kconfig > > @@ -52,7 +52,6 @@ config PARISC > > select GENERIC_SCHED_CLOCK > > select HAVE_UNSTABLE_SCHED_CLOCK if SMP > > select GENERIC_CLOCKEVENTS > > - select ARCH_NO_COHERENT_DMA_MMAP > > select CPU_NO_EFFICIENT_FFS > > select NEED_DMA_MAP_STATE > > select NEED_SG_DMA_LENGTH > > diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig > > index 6b1b5941b618..f356ee674d89 100644 > > --- a/arch/sh/Kconfig > > +++ b/arch/sh/Kconfig > > @@ -5,7 +5,6 @@ config SUPERH > > select ARCH_HAS_PTE_SPECIAL > > select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST > > select ARCH_MIGHT_HAVE_PC_PARPORT > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select HAVE_PATA_PLATFORM > > select CLKDEV_LOOKUP > > select DMA_DECLARE_COHERENT > > diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig > > index ebc135bda921..70653aed3005 100644 > > --- a/arch/xtensa/Kconfig > > +++ b/arch/xtensa/Kconfig > > @@ -5,7 +5,6 @@ config XTENSA > > select ARCH_HAS_BINFMT_FLAT if !MMU > > select ARCH_HAS_SYNC_DMA_FOR_CPU > > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select ARCH_USE_QUEUED_RWLOCKS > > select ARCH_USE_QUEUED_SPINLOCKS > > select ARCH_WANT_FRAME_POINTERS > > diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c > > index 7dff1829c8c5..815446f76995 100644 > > --- a/kernel/dma/mapping.c > > +++ b/kernel/dma/mapping.c > > @@ -169,7 +169,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > > void *cpu_addr, dma_addr_t dma_addr, size_t size, > > unsigned long attrs) > > { > > -#ifndef CONFIG_ARCH_NO_COHERENT_DMA_MMAP > > unsigned long user_count = vma_pages(vma); > > unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; > > unsigned long off = vma->vm_pgoff; > > @@ -198,9 +197,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > > > > return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff, > > user_count << PAGE_SHIFT, vma->vm_page_prot); > > -#else > > - return -ENXIO; > > -#endif /* !CONFIG_ARCH_NO_COHERENT_DMA_MMAP */ > > } > > > > /** > > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c > > index 860543a4c840..2dadc708343a 100644 > > --- a/sound/core/pcm_native.c > > +++ b/sound/core/pcm_native.c > > @@ -218,15 +218,7 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, > > > > static bool hw_support_mmap(struct snd_pcm_substream *substream) > > { > > - if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) > > - return false; > > - /* architecture supports dma_mmap_coherent()? */ > > -#if defined(CONFIG_ARCH_NO_COHERENT_DMA_MMAP) || !defined(CONFIG_HAS_DMA) > > - if (!substream->ops->mmap && > > - substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) > > - return false; > > -#endif > > - return true; > > + return substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP; > > } > > > > static int constrain_mask_params(struct snd_pcm_substream *substream, > > -- > > 2.20.1 > > > > > > _______________________________________________ > > linux-arm-kernel mailing list > > linux-arm-kernel@lists.infradead.org > > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > ---end quoted text--- > _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-08-02 8:24 ` Takashi Iwai 0 siblings, 0 replies; 60+ messages in thread From: Takashi Iwai @ 2019-08-02 8:24 UTC (permalink / raw) To: Christoph Hellwig Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, Robin Murphy, x86, linux-kernel, iommu, linux-m68k, linuxppc-dev, linux-arm-kernel, Marek Szyprowski On Fri, 02 Aug 2019 09:03:54 +0200, Christoph Hellwig wrote: > > Takashi, > > any comments on the sounds/ side of this? I wasn't careful enough to look at that change, sorry. The code there tries to check whether dma_mmap_coherent() would always fail on some platforms. Then the driver clears the mmap capability flag at the device open time and notifies user-space to fall back to the dumb read/write mode. So I'm afraid that simply dropping the check would cause the behavior regression, e.g. on PARISC. Is there any simple way to test whether dma_mmap_coherent() would work or not in general on the target platform? It's not necessarily in an ifdef at all. thanks, Takashi > On Thu, Jul 25, 2019 at 08:34:01AM +0200, Christoph Hellwig wrote: > > Now that we never use a default ->mmap implementation, and non-coherent > > architectures can control the presence of ->mmap support by enabling > > ARCH_HAS_DMA_COHERENT_TO_PFN for the dma direct implementation there > > is no need for a global config option to control the availability > > of dma_common_mmap. > > > > Signed-off-by: Christoph Hellwig <hch@lst.de> > > --- > > arch/Kconfig | 3 --- > > arch/c6x/Kconfig | 1 - > > arch/m68k/Kconfig | 1 - > > arch/microblaze/Kconfig | 1 - > > arch/parisc/Kconfig | 1 - > > arch/sh/Kconfig | 1 - > > arch/xtensa/Kconfig | 1 - > > kernel/dma/mapping.c | 4 ---- > > sound/core/pcm_native.c | 10 +--------- > > 9 files changed, 1 insertion(+), 22 deletions(-) > > > > diff --git a/arch/Kconfig b/arch/Kconfig > > index a7b57dd42c26..ec2834206d08 100644 > > --- a/arch/Kconfig > > +++ b/arch/Kconfig > > @@ -790,9 +790,6 @@ config COMPAT_32BIT_TIME > > This is relevant on all 32-bit architectures, and 64-bit architectures > > as part of compat syscall handling. > > > > -config ARCH_NO_COHERENT_DMA_MMAP > > - bool > > - > > config ARCH_NO_PREEMPT > > bool > > > > diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig > > index b4fb61c83494..e65e8d82442a 100644 > > --- a/arch/c6x/Kconfig > > +++ b/arch/c6x/Kconfig > > @@ -20,7 +20,6 @@ config C6X > > select OF_EARLY_FLATTREE > > select GENERIC_CLOCKEVENTS > > select MODULES_USE_ELF_RELA > > - select ARCH_NO_COHERENT_DMA_MMAP > > select MMU_GATHER_NO_RANGE if MMU > > > > config MMU > > diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig > > index c518d695c376..614b355ae338 100644 > > --- a/arch/m68k/Kconfig > > +++ b/arch/m68k/Kconfig > > @@ -8,7 +8,6 @@ config M68K > > select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE > > select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA > > select ARCH_MIGHT_HAVE_PC_PARPORT if ISA > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select ARCH_NO_PREEMPT if !COLDFIRE > > select BINFMT_FLAT_ARGVP_ENVP_ON_STACK > > select DMA_DIRECT_REMAP if HAS_DMA && MMU && !COLDFIRE > > diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig > > index d411de05b628..632c9477a0f6 100644 > > --- a/arch/microblaze/Kconfig > > +++ b/arch/microblaze/Kconfig > > @@ -9,7 +9,6 @@ config MICROBLAZE > > select ARCH_HAS_SYNC_DMA_FOR_CPU > > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > > select ARCH_MIGHT_HAVE_PC_PARPORT > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select ARCH_WANT_IPC_PARSE_VERSION > > select BUILDTIME_EXTABLE_SORT > > select TIMER_OF > > diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig > > index 6d732e451071..e9dd88b7f81e 100644 > > --- a/arch/parisc/Kconfig > > +++ b/arch/parisc/Kconfig > > @@ -52,7 +52,6 @@ config PARISC > > select GENERIC_SCHED_CLOCK > > select HAVE_UNSTABLE_SCHED_CLOCK if SMP > > select GENERIC_CLOCKEVENTS > > - select ARCH_NO_COHERENT_DMA_MMAP > > select CPU_NO_EFFICIENT_FFS > > select NEED_DMA_MAP_STATE > > select NEED_SG_DMA_LENGTH > > diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig > > index 6b1b5941b618..f356ee674d89 100644 > > --- a/arch/sh/Kconfig > > +++ b/arch/sh/Kconfig > > @@ -5,7 +5,6 @@ config SUPERH > > select ARCH_HAS_PTE_SPECIAL > > select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST > > select ARCH_MIGHT_HAVE_PC_PARPORT > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select HAVE_PATA_PLATFORM > > select CLKDEV_LOOKUP > > select DMA_DECLARE_COHERENT > > diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig > > index ebc135bda921..70653aed3005 100644 > > --- a/arch/xtensa/Kconfig > > +++ b/arch/xtensa/Kconfig > > @@ -5,7 +5,6 @@ config XTENSA > > select ARCH_HAS_BINFMT_FLAT if !MMU > > select ARCH_HAS_SYNC_DMA_FOR_CPU > > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select ARCH_USE_QUEUED_RWLOCKS > > select ARCH_USE_QUEUED_SPINLOCKS > > select ARCH_WANT_FRAME_POINTERS > > diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c > > index 7dff1829c8c5..815446f76995 100644 > > --- a/kernel/dma/mapping.c > > +++ b/kernel/dma/mapping.c > > @@ -169,7 +169,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > > void *cpu_addr, dma_addr_t dma_addr, size_t size, > > unsigned long attrs) > > { > > -#ifndef CONFIG_ARCH_NO_COHERENT_DMA_MMAP > > unsigned long user_count = vma_pages(vma); > > unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; > > unsigned long off = vma->vm_pgoff; > > @@ -198,9 +197,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > > > > return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff, > > user_count << PAGE_SHIFT, vma->vm_page_prot); > > -#else > > - return -ENXIO; > > -#endif /* !CONFIG_ARCH_NO_COHERENT_DMA_MMAP */ > > } > > > > /** > > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c > > index 860543a4c840..2dadc708343a 100644 > > --- a/sound/core/pcm_native.c > > +++ b/sound/core/pcm_native.c > > @@ -218,15 +218,7 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, > > > > static bool hw_support_mmap(struct snd_pcm_substream *substream) > > { > > - if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) > > - return false; > > - /* architecture supports dma_mmap_coherent()? */ > > -#if defined(CONFIG_ARCH_NO_COHERENT_DMA_MMAP) || !defined(CONFIG_HAS_DMA) > > - if (!substream->ops->mmap && > > - substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) > > - return false; > > -#endif > > - return true; > > + return substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP; > > } > > > > static int constrain_mask_params(struct snd_pcm_substream *substream, > > -- > > 2.20.1 > > > > > > _______________________________________________ > > linux-arm-kernel mailing list > > linux-arm-kernel@lists.infradead.org > > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > ---end quoted text--- > ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-08-02 8:24 ` Takashi Iwai 0 siblings, 0 replies; 60+ messages in thread From: Takashi Iwai @ 2019-08-02 8:24 UTC (permalink / raw) To: Christoph Hellwig Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, Takashi Iwai, Robin Murphy, x86, linux-kernel, iommu, linux-m68k, linuxppc-dev, linux-arm-kernel, Marek Szyprowski On Fri, 02 Aug 2019 09:03:54 +0200, Christoph Hellwig wrote: > > Takashi, > > any comments on the sounds/ side of this? I wasn't careful enough to look at that change, sorry. The code there tries to check whether dma_mmap_coherent() would always fail on some platforms. Then the driver clears the mmap capability flag at the device open time and notifies user-space to fall back to the dumb read/write mode. So I'm afraid that simply dropping the check would cause the behavior regression, e.g. on PARISC. Is there any simple way to test whether dma_mmap_coherent() would work or not in general on the target platform? It's not necessarily in an ifdef at all. thanks, Takashi > On Thu, Jul 25, 2019 at 08:34:01AM +0200, Christoph Hellwig wrote: > > Now that we never use a default ->mmap implementation, and non-coherent > > architectures can control the presence of ->mmap support by enabling > > ARCH_HAS_DMA_COHERENT_TO_PFN for the dma direct implementation there > > is no need for a global config option to control the availability > > of dma_common_mmap. > > > > Signed-off-by: Christoph Hellwig <hch@lst.de> > > --- > > arch/Kconfig | 3 --- > > arch/c6x/Kconfig | 1 - > > arch/m68k/Kconfig | 1 - > > arch/microblaze/Kconfig | 1 - > > arch/parisc/Kconfig | 1 - > > arch/sh/Kconfig | 1 - > > arch/xtensa/Kconfig | 1 - > > kernel/dma/mapping.c | 4 ---- > > sound/core/pcm_native.c | 10 +--------- > > 9 files changed, 1 insertion(+), 22 deletions(-) > > > > diff --git a/arch/Kconfig b/arch/Kconfig > > index a7b57dd42c26..ec2834206d08 100644 > > --- a/arch/Kconfig > > +++ b/arch/Kconfig > > @@ -790,9 +790,6 @@ config COMPAT_32BIT_TIME > > This is relevant on all 32-bit architectures, and 64-bit architectures > > as part of compat syscall handling. > > > > -config ARCH_NO_COHERENT_DMA_MMAP > > - bool > > - > > config ARCH_NO_PREEMPT > > bool > > > > diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig > > index b4fb61c83494..e65e8d82442a 100644 > > --- a/arch/c6x/Kconfig > > +++ b/arch/c6x/Kconfig > > @@ -20,7 +20,6 @@ config C6X > > select OF_EARLY_FLATTREE > > select GENERIC_CLOCKEVENTS > > select MODULES_USE_ELF_RELA > > - select ARCH_NO_COHERENT_DMA_MMAP > > select MMU_GATHER_NO_RANGE if MMU > > > > config MMU > > diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig > > index c518d695c376..614b355ae338 100644 > > --- a/arch/m68k/Kconfig > > +++ b/arch/m68k/Kconfig > > @@ -8,7 +8,6 @@ config M68K > > select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE > > select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA > > select ARCH_MIGHT_HAVE_PC_PARPORT if ISA > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select ARCH_NO_PREEMPT if !COLDFIRE > > select BINFMT_FLAT_ARGVP_ENVP_ON_STACK > > select DMA_DIRECT_REMAP if HAS_DMA && MMU && !COLDFIRE > > diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig > > index d411de05b628..632c9477a0f6 100644 > > --- a/arch/microblaze/Kconfig > > +++ b/arch/microblaze/Kconfig > > @@ -9,7 +9,6 @@ config MICROBLAZE > > select ARCH_HAS_SYNC_DMA_FOR_CPU > > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > > select ARCH_MIGHT_HAVE_PC_PARPORT > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select ARCH_WANT_IPC_PARSE_VERSION > > select BUILDTIME_EXTABLE_SORT > > select TIMER_OF > > diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig > > index 6d732e451071..e9dd88b7f81e 100644 > > --- a/arch/parisc/Kconfig > > +++ b/arch/parisc/Kconfig > > @@ -52,7 +52,6 @@ config PARISC > > select GENERIC_SCHED_CLOCK > > select HAVE_UNSTABLE_SCHED_CLOCK if SMP > > select GENERIC_CLOCKEVENTS > > - select ARCH_NO_COHERENT_DMA_MMAP > > select CPU_NO_EFFICIENT_FFS > > select NEED_DMA_MAP_STATE > > select NEED_SG_DMA_LENGTH > > diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig > > index 6b1b5941b618..f356ee674d89 100644 > > --- a/arch/sh/Kconfig > > +++ b/arch/sh/Kconfig > > @@ -5,7 +5,6 @@ config SUPERH > > select ARCH_HAS_PTE_SPECIAL > > select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST > > select ARCH_MIGHT_HAVE_PC_PARPORT > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select HAVE_PATA_PLATFORM > > select CLKDEV_LOOKUP > > select DMA_DECLARE_COHERENT > > diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig > > index ebc135bda921..70653aed3005 100644 > > --- a/arch/xtensa/Kconfig > > +++ b/arch/xtensa/Kconfig > > @@ -5,7 +5,6 @@ config XTENSA > > select ARCH_HAS_BINFMT_FLAT if !MMU > > select ARCH_HAS_SYNC_DMA_FOR_CPU > > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select ARCH_USE_QUEUED_RWLOCKS > > select ARCH_USE_QUEUED_SPINLOCKS > > select ARCH_WANT_FRAME_POINTERS > > diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c > > index 7dff1829c8c5..815446f76995 100644 > > --- a/kernel/dma/mapping.c > > +++ b/kernel/dma/mapping.c > > @@ -169,7 +169,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > > void *cpu_addr, dma_addr_t dma_addr, size_t size, > > unsigned long attrs) > > { > > -#ifndef CONFIG_ARCH_NO_COHERENT_DMA_MMAP > > unsigned long user_count = vma_pages(vma); > > unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; > > unsigned long off = vma->vm_pgoff; > > @@ -198,9 +197,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > > > > return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff, > > user_count << PAGE_SHIFT, vma->vm_page_prot); > > -#else > > - return -ENXIO; > > -#endif /* !CONFIG_ARCH_NO_COHERENT_DMA_MMAP */ > > } > > > > /** > > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c > > index 860543a4c840..2dadc708343a 100644 > > --- a/sound/core/pcm_native.c > > +++ b/sound/core/pcm_native.c > > @@ -218,15 +218,7 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, > > > > static bool hw_support_mmap(struct snd_pcm_substream *substream) > > { > > - if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) > > - return false; > > - /* architecture supports dma_mmap_coherent()? */ > > -#if defined(CONFIG_ARCH_NO_COHERENT_DMA_MMAP) || !defined(CONFIG_HAS_DMA) > > - if (!substream->ops->mmap && > > - substream->dma_buffer.dev.type = SNDRV_DMA_TYPE_DEV) > > - return false; > > -#endif > > - return true; > > + return substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP; > > } > > > > static int constrain_mask_params(struct snd_pcm_substream *substream, > > -- > > 2.20.1 > > > > > > _______________________________________________ > > linux-arm-kernel mailing list > > linux-arm-kernel@lists.infradead.org > > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > ---end quoted text--- > ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-08-02 8:24 ` Takashi Iwai 0 siblings, 0 replies; 60+ messages in thread From: Takashi Iwai @ 2019-08-02 8:24 UTC (permalink / raw) To: Christoph Hellwig Cc: Takashi Iwai, iommu, Marek Szyprowski, linux-xtensa, Michal Simek, linux-parisc, linux-sh, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel On Fri, 02 Aug 2019 09:03:54 +0200, Christoph Hellwig wrote: > > Takashi, > > any comments on the sounds/ side of this? I wasn't careful enough to look at that change, sorry. The code there tries to check whether dma_mmap_coherent() would always fail on some platforms. Then the driver clears the mmap capability flag at the device open time and notifies user-space to fall back to the dumb read/write mode. So I'm afraid that simply dropping the check would cause the behavior regression, e.g. on PARISC. Is there any simple way to test whether dma_mmap_coherent() would work or not in general on the target platform? It's not necessarily in an ifdef at all. thanks, Takashi > On Thu, Jul 25, 2019 at 08:34:01AM +0200, Christoph Hellwig wrote: > > Now that we never use a default ->mmap implementation, and non-coherent > > architectures can control the presence of ->mmap support by enabling > > ARCH_HAS_DMA_COHERENT_TO_PFN for the dma direct implementation there > > is no need for a global config option to control the availability > > of dma_common_mmap. > > > > Signed-off-by: Christoph Hellwig <hch@lst.de> > > --- > > arch/Kconfig | 3 --- > > arch/c6x/Kconfig | 1 - > > arch/m68k/Kconfig | 1 - > > arch/microblaze/Kconfig | 1 - > > arch/parisc/Kconfig | 1 - > > arch/sh/Kconfig | 1 - > > arch/xtensa/Kconfig | 1 - > > kernel/dma/mapping.c | 4 ---- > > sound/core/pcm_native.c | 10 +--------- > > 9 files changed, 1 insertion(+), 22 deletions(-) > > > > diff --git a/arch/Kconfig b/arch/Kconfig > > index a7b57dd42c26..ec2834206d08 100644 > > --- a/arch/Kconfig > > +++ b/arch/Kconfig > > @@ -790,9 +790,6 @@ config COMPAT_32BIT_TIME > > This is relevant on all 32-bit architectures, and 64-bit architectures > > as part of compat syscall handling. > > > > -config ARCH_NO_COHERENT_DMA_MMAP > > - bool > > - > > config ARCH_NO_PREEMPT > > bool > > > > diff --git a/arch/c6x/Kconfig b/arch/c6x/Kconfig > > index b4fb61c83494..e65e8d82442a 100644 > > --- a/arch/c6x/Kconfig > > +++ b/arch/c6x/Kconfig > > @@ -20,7 +20,6 @@ config C6X > > select OF_EARLY_FLATTREE > > select GENERIC_CLOCKEVENTS > > select MODULES_USE_ELF_RELA > > - select ARCH_NO_COHERENT_DMA_MMAP > > select MMU_GATHER_NO_RANGE if MMU > > > > config MMU > > diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig > > index c518d695c376..614b355ae338 100644 > > --- a/arch/m68k/Kconfig > > +++ b/arch/m68k/Kconfig > > @@ -8,7 +8,6 @@ config M68K > > select ARCH_HAS_DMA_PREP_COHERENT if HAS_DMA && MMU && !COLDFIRE > > select ARCH_HAS_SYNC_DMA_FOR_DEVICE if HAS_DMA > > select ARCH_MIGHT_HAVE_PC_PARPORT if ISA > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select ARCH_NO_PREEMPT if !COLDFIRE > > select BINFMT_FLAT_ARGVP_ENVP_ON_STACK > > select DMA_DIRECT_REMAP if HAS_DMA && MMU && !COLDFIRE > > diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig > > index d411de05b628..632c9477a0f6 100644 > > --- a/arch/microblaze/Kconfig > > +++ b/arch/microblaze/Kconfig > > @@ -9,7 +9,6 @@ config MICROBLAZE > > select ARCH_HAS_SYNC_DMA_FOR_CPU > > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > > select ARCH_MIGHT_HAVE_PC_PARPORT > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select ARCH_WANT_IPC_PARSE_VERSION > > select BUILDTIME_EXTABLE_SORT > > select TIMER_OF > > diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig > > index 6d732e451071..e9dd88b7f81e 100644 > > --- a/arch/parisc/Kconfig > > +++ b/arch/parisc/Kconfig > > @@ -52,7 +52,6 @@ config PARISC > > select GENERIC_SCHED_CLOCK > > select HAVE_UNSTABLE_SCHED_CLOCK if SMP > > select GENERIC_CLOCKEVENTS > > - select ARCH_NO_COHERENT_DMA_MMAP > > select CPU_NO_EFFICIENT_FFS > > select NEED_DMA_MAP_STATE > > select NEED_SG_DMA_LENGTH > > diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig > > index 6b1b5941b618..f356ee674d89 100644 > > --- a/arch/sh/Kconfig > > +++ b/arch/sh/Kconfig > > @@ -5,7 +5,6 @@ config SUPERH > > select ARCH_HAS_PTE_SPECIAL > > select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST > > select ARCH_MIGHT_HAVE_PC_PARPORT > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select HAVE_PATA_PLATFORM > > select CLKDEV_LOOKUP > > select DMA_DECLARE_COHERENT > > diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig > > index ebc135bda921..70653aed3005 100644 > > --- a/arch/xtensa/Kconfig > > +++ b/arch/xtensa/Kconfig > > @@ -5,7 +5,6 @@ config XTENSA > > select ARCH_HAS_BINFMT_FLAT if !MMU > > select ARCH_HAS_SYNC_DMA_FOR_CPU > > select ARCH_HAS_SYNC_DMA_FOR_DEVICE > > - select ARCH_NO_COHERENT_DMA_MMAP if !MMU > > select ARCH_USE_QUEUED_RWLOCKS > > select ARCH_USE_QUEUED_SPINLOCKS > > select ARCH_WANT_FRAME_POINTERS > > diff --git a/kernel/dma/mapping.c b/kernel/dma/mapping.c > > index 7dff1829c8c5..815446f76995 100644 > > --- a/kernel/dma/mapping.c > > +++ b/kernel/dma/mapping.c > > @@ -169,7 +169,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > > void *cpu_addr, dma_addr_t dma_addr, size_t size, > > unsigned long attrs) > > { > > -#ifndef CONFIG_ARCH_NO_COHERENT_DMA_MMAP > > unsigned long user_count = vma_pages(vma); > > unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT; > > unsigned long off = vma->vm_pgoff; > > @@ -198,9 +197,6 @@ int dma_common_mmap(struct device *dev, struct vm_area_struct *vma, > > > > return remap_pfn_range(vma, vma->vm_start, pfn + vma->vm_pgoff, > > user_count << PAGE_SHIFT, vma->vm_page_prot); > > -#else > > - return -ENXIO; > > -#endif /* !CONFIG_ARCH_NO_COHERENT_DMA_MMAP */ > > } > > > > /** > > diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c > > index 860543a4c840..2dadc708343a 100644 > > --- a/sound/core/pcm_native.c > > +++ b/sound/core/pcm_native.c > > @@ -218,15 +218,7 @@ int snd_pcm_info_user(struct snd_pcm_substream *substream, > > > > static bool hw_support_mmap(struct snd_pcm_substream *substream) > > { > > - if (!(substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP)) > > - return false; > > - /* architecture supports dma_mmap_coherent()? */ > > -#if defined(CONFIG_ARCH_NO_COHERENT_DMA_MMAP) || !defined(CONFIG_HAS_DMA) > > - if (!substream->ops->mmap && > > - substream->dma_buffer.dev.type == SNDRV_DMA_TYPE_DEV) > > - return false; > > -#endif > > - return true; > > + return substream->runtime->hw.info & SNDRV_PCM_INFO_MMAP; > > } > > > > static int constrain_mask_params(struct snd_pcm_substream *substream, > > -- > > 2.20.1 > > > > > > _______________________________________________ > > linux-arm-kernel mailing list > > linux-arm-kernel@lists.infradead.org > > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel > ---end quoted text--- > ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP 2019-08-02 8:24 ` Takashi Iwai ` (2 preceding siblings ...) (?) @ 2019-08-03 10:30 ` Christoph Hellwig -1 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-08-03 10:30 UTC (permalink / raw) To: Takashi Iwai Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, linux-m68k, Robin Murphy, x86, linux-kernel, iommu, linuxppc-dev, Christoph Hellwig, linux-arm-kernel On Fri, Aug 02, 2019 at 10:24:02AM +0200, Takashi Iwai wrote: > I wasn't careful enough to look at that change, sorry. > > The code there tries to check whether dma_mmap_coherent() would always > fail on some platforms. Then the driver clears the mmap capability > flag at the device open time and notifies user-space to fall back to > the dumb read/write mode. > > So I'm afraid that simply dropping the check would cause the behavior > regression, e.g. on PARISC. > > Is there any simple way to test whether dma_mmap_coherent() would work > or not in general on the target platform? It's not necessarily in an > ifdef at all. This isn't really a platform, but a per-device question. I can add a "bool dma_can_mmap(struct device *dev)" helper to check that. But how do I get at a suitable struct device in hw_support_mmap()? _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-08-03 10:30 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-08-03 10:30 UTC (permalink / raw) To: Takashi Iwai Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, linux-m68k, Robin Murphy, x86, linux-kernel, iommu, linuxppc-dev, Christoph Hellwig, linux-arm-kernel, Marek Szyprowski On Fri, Aug 02, 2019 at 10:24:02AM +0200, Takashi Iwai wrote: > I wasn't careful enough to look at that change, sorry. > > The code there tries to check whether dma_mmap_coherent() would always > fail on some platforms. Then the driver clears the mmap capability > flag at the device open time and notifies user-space to fall back to > the dumb read/write mode. > > So I'm afraid that simply dropping the check would cause the behavior > regression, e.g. on PARISC. > > Is there any simple way to test whether dma_mmap_coherent() would work > or not in general on the target platform? It's not necessarily in an > ifdef at all. This isn't really a platform, but a per-device question. I can add a "bool dma_can_mmap(struct device *dev)" helper to check that. But how do I get at a suitable struct device in hw_support_mmap()? _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-08-03 10:30 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-08-03 10:30 UTC (permalink / raw) To: Takashi Iwai Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, linux-m68k, Robin Murphy, x86, linux-kernel, iommu, linuxppc-dev, Christoph Hellwig, linux-arm-kernel, Marek Szyprowski On Fri, Aug 02, 2019 at 10:24:02AM +0200, Takashi Iwai wrote: > I wasn't careful enough to look at that change, sorry. > > The code there tries to check whether dma_mmap_coherent() would always > fail on some platforms. Then the driver clears the mmap capability > flag at the device open time and notifies user-space to fall back to > the dumb read/write mode. > > So I'm afraid that simply dropping the check would cause the behavior > regression, e.g. on PARISC. > > Is there any simple way to test whether dma_mmap_coherent() would work > or not in general on the target platform? It's not necessarily in an > ifdef at all. This isn't really a platform, but a per-device question. I can add a "bool dma_can_mmap(struct device *dev)" helper to check that. But how do I get at a suitable struct device in hw_support_mmap()? ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-08-03 10:30 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-08-03 10:30 UTC (permalink / raw) To: Takashi Iwai Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, linux-m68k, Robin Murphy, x86, linux-kernel, iommu, linuxppc-dev, Christoph Hellwig, linux-arm-kernel, Marek Szyprowski On Fri, Aug 02, 2019 at 10:24:02AM +0200, Takashi Iwai wrote: > I wasn't careful enough to look at that change, sorry. > > The code there tries to check whether dma_mmap_coherent() would always > fail on some platforms. Then the driver clears the mmap capability > flag at the device open time and notifies user-space to fall back to > the dumb read/write mode. > > So I'm afraid that simply dropping the check would cause the behavior > regression, e.g. on PARISC. > > Is there any simple way to test whether dma_mmap_coherent() would work > or not in general on the target platform? It's not necessarily in an > ifdef at all. This isn't really a platform, but a per-device question. I can add a "bool dma_can_mmap(struct device *dev)" helper to check that. But how do I get at a suitable struct device in hw_support_mmap()? ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-08-03 10:30 ` Christoph Hellwig 0 siblings, 0 replies; 60+ messages in thread From: Christoph Hellwig @ 2019-08-03 10:30 UTC (permalink / raw) To: Takashi Iwai Cc: Christoph Hellwig, iommu, Marek Szyprowski, linux-xtensa, Michal Simek, linux-parisc, linux-sh, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel On Fri, Aug 02, 2019 at 10:24:02AM +0200, Takashi Iwai wrote: > I wasn't careful enough to look at that change, sorry. > > The code there tries to check whether dma_mmap_coherent() would always > fail on some platforms. Then the driver clears the mmap capability > flag at the device open time and notifies user-space to fall back to > the dumb read/write mode. > > So I'm afraid that simply dropping the check would cause the behavior > regression, e.g. on PARISC. > > Is there any simple way to test whether dma_mmap_coherent() would work > or not in general on the target platform? It's not necessarily in an > ifdef at all. This isn't really a platform, but a per-device question. I can add a "bool dma_can_mmap(struct device *dev)" helper to check that. But how do I get at a suitable struct device in hw_support_mmap()? ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP 2019-08-03 10:30 ` Christoph Hellwig ` (2 preceding siblings ...) (?) @ 2019-08-03 11:22 ` Takashi Iwai -1 siblings, 0 replies; 60+ messages in thread From: Takashi Iwai @ 2019-08-03 11:22 UTC (permalink / raw) To: Christoph Hellwig Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, linux-m68k, Robin Murphy, x86, linux-kernel, iommu, linuxppc-dev, linux-arm-kernel On Sat, 03 Aug 2019 12:30:24 +0200, Christoph Hellwig wrote: > > On Fri, Aug 02, 2019 at 10:24:02AM +0200, Takashi Iwai wrote: > > I wasn't careful enough to look at that change, sorry. > > > > The code there tries to check whether dma_mmap_coherent() would always > > fail on some platforms. Then the driver clears the mmap capability > > flag at the device open time and notifies user-space to fall back to > > the dumb read/write mode. > > > > So I'm afraid that simply dropping the check would cause the behavior > > regression, e.g. on PARISC. > > > > Is there any simple way to test whether dma_mmap_coherent() would work > > or not in general on the target platform? It's not necessarily in an > > ifdef at all. > > This isn't really a platform, but a per-device question. I can add a > "bool dma_can_mmap(struct device *dev)" helper to check that. Yes, this would fit perfect. > But how > do I get at a suitable struct device in hw_support_mmap()? substream->dma_buffer.dev.dev can be that, which is used in the mmap helper side, snd_pcm_lib_default_mmap(). Thanks! Takashi _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-08-03 11:22 ` Takashi Iwai 0 siblings, 0 replies; 60+ messages in thread From: Takashi Iwai @ 2019-08-03 11:22 UTC (permalink / raw) To: Christoph Hellwig Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, linux-m68k, Robin Murphy, x86, linux-kernel, iommu, linuxppc-dev, linux-arm-kernel, Marek Szyprowski On Sat, 03 Aug 2019 12:30:24 +0200, Christoph Hellwig wrote: > > On Fri, Aug 02, 2019 at 10:24:02AM +0200, Takashi Iwai wrote: > > I wasn't careful enough to look at that change, sorry. > > > > The code there tries to check whether dma_mmap_coherent() would always > > fail on some platforms. Then the driver clears the mmap capability > > flag at the device open time and notifies user-space to fall back to > > the dumb read/write mode. > > > > So I'm afraid that simply dropping the check would cause the behavior > > regression, e.g. on PARISC. > > > > Is there any simple way to test whether dma_mmap_coherent() would work > > or not in general on the target platform? It's not necessarily in an > > ifdef at all. > > This isn't really a platform, but a per-device question. I can add a > "bool dma_can_mmap(struct device *dev)" helper to check that. Yes, this would fit perfect. > But how > do I get at a suitable struct device in hw_support_mmap()? substream->dma_buffer.dev.dev can be that, which is used in the mmap helper side, snd_pcm_lib_default_mmap(). Thanks! Takashi _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-08-03 11:22 ` Takashi Iwai 0 siblings, 0 replies; 60+ messages in thread From: Takashi Iwai @ 2019-08-03 11:22 UTC (permalink / raw) To: Christoph Hellwig Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, linux-m68k, Robin Murphy, x86, linux-kernel, iommu, linuxppc-dev, linux-arm-kernel, Marek Szyprowski On Sat, 03 Aug 2019 12:30:24 +0200, Christoph Hellwig wrote: > > On Fri, Aug 02, 2019 at 10:24:02AM +0200, Takashi Iwai wrote: > > I wasn't careful enough to look at that change, sorry. > > > > The code there tries to check whether dma_mmap_coherent() would always > > fail on some platforms. Then the driver clears the mmap capability > > flag at the device open time and notifies user-space to fall back to > > the dumb read/write mode. > > > > So I'm afraid that simply dropping the check would cause the behavior > > regression, e.g. on PARISC. > > > > Is there any simple way to test whether dma_mmap_coherent() would work > > or not in general on the target platform? It's not necessarily in an > > ifdef at all. > > This isn't really a platform, but a per-device question. I can add a > "bool dma_can_mmap(struct device *dev)" helper to check that. Yes, this would fit perfect. > But how > do I get at a suitable struct device in hw_support_mmap()? substream->dma_buffer.dev.dev can be that, which is used in the mmap helper side, snd_pcm_lib_default_mmap(). Thanks! Takashi ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-08-03 11:22 ` Takashi Iwai 0 siblings, 0 replies; 60+ messages in thread From: Takashi Iwai @ 2019-08-03 11:22 UTC (permalink / raw) To: Christoph Hellwig Cc: linux-xtensa, Michal Simek, linux-parisc, linux-sh, linux-m68k, Robin Murphy, x86, linux-kernel, iommu, linuxppc-dev, linux-arm-kernel, Marek Szyprowski On Sat, 03 Aug 2019 12:30:24 +0200, Christoph Hellwig wrote: > > On Fri, Aug 02, 2019 at 10:24:02AM +0200, Takashi Iwai wrote: > > I wasn't careful enough to look at that change, sorry. > > > > The code there tries to check whether dma_mmap_coherent() would always > > fail on some platforms. Then the driver clears the mmap capability > > flag at the device open time and notifies user-space to fall back to > > the dumb read/write mode. > > > > So I'm afraid that simply dropping the check would cause the behavior > > regression, e.g. on PARISC. > > > > Is there any simple way to test whether dma_mmap_coherent() would work > > or not in general on the target platform? It's not necessarily in an > > ifdef at all. > > This isn't really a platform, but a per-device question. I can add a > "bool dma_can_mmap(struct device *dev)" helper to check that. Yes, this would fit perfect. > But how > do I get at a suitable struct device in hw_support_mmap()? substream->dma_buffer.dev.dev can be that, which is used in the mmap helper side, snd_pcm_lib_default_mmap(). Thanks! Takashi ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP @ 2019-08-03 11:22 ` Takashi Iwai 0 siblings, 0 replies; 60+ messages in thread From: Takashi Iwai @ 2019-08-03 11:22 UTC (permalink / raw) To: Christoph Hellwig Cc: iommu, Marek Szyprowski, linux-xtensa, Michal Simek, linux-parisc, linux-sh, linuxppc-dev, x86, linux-kernel, linux-m68k, Robin Murphy, linux-arm-kernel On Sat, 03 Aug 2019 12:30:24 +0200, Christoph Hellwig wrote: > > On Fri, Aug 02, 2019 at 10:24:02AM +0200, Takashi Iwai wrote: > > I wasn't careful enough to look at that change, sorry. > > > > The code there tries to check whether dma_mmap_coherent() would always > > fail on some platforms. Then the driver clears the mmap capability > > flag at the device open time and notifies user-space to fall back to > > the dumb read/write mode. > > > > So I'm afraid that simply dropping the check would cause the behavior > > regression, e.g. on PARISC. > > > > Is there any simple way to test whether dma_mmap_coherent() would work > > or not in general on the target platform? It's not necessarily in an > > ifdef at all. > > This isn't really a platform, but a per-device question. I can add a > "bool dma_can_mmap(struct device *dev)" helper to check that. Yes, this would fit perfect. > But how > do I get at a suitable struct device in hw_support_mmap()? substream->dma_buffer.dev.dev can be that, which is used in the mmap helper side, snd_pcm_lib_default_mmap(). Thanks! Takashi ^ permalink raw reply [flat|nested] 60+ messages in thread
end of thread, other threads:[~2019-08-03 11:24 UTC | newest] Thread overview: 60+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2019-07-25 6:33 remove default fallbacks in dma_map_ops Christoph Hellwig 2019-07-25 6:33 ` Christoph Hellwig 2019-07-25 6:33 ` Christoph Hellwig 2019-07-25 6:33 ` Christoph Hellwig 2019-07-25 6:33 ` Christoph Hellwig 2019-07-25 6:33 ` [PATCH 1/5] m68knommu: add a pgprot_noncached stub Christoph Hellwig 2019-07-25 6:33 ` Christoph Hellwig 2019-07-25 6:33 ` Christoph Hellwig 2019-07-25 6:33 ` Christoph Hellwig 2019-07-25 6:33 ` Christoph Hellwig 2019-07-25 6:33 ` [PATCH 2/5] dma-mapping: move the dma_get_sgtable API comments from arm to common code Christoph Hellwig 2019-07-25 6:33 ` Christoph Hellwig 2019-07-25 6:33 ` Christoph Hellwig 2019-07-25 6:33 ` Christoph Hellwig 2019-07-25 6:33 ` Christoph Hellwig 2019-07-25 6:33 ` [PATCH 3/5] dma-mapping: explicitly wire up ->mmap and ->get_sgtable Christoph Hellwig 2019-07-25 6:33 ` Christoph Hellwig 2019-07-25 6:33 ` Christoph Hellwig 2019-07-25 6:33 ` Christoph Hellwig 2019-07-25 6:33 ` Christoph Hellwig 2019-07-25 6:34 ` [PATCH 4/5] dma-mapping: provide a better default ->get_required_mask Christoph Hellwig 2019-07-25 6:34 ` Christoph Hellwig 2019-07-25 6:34 ` Christoph Hellwig 2019-07-25 6:34 ` Christoph Hellwig 2019-07-25 6:34 ` Christoph Hellwig 2019-07-29 9:57 ` Geert Uytterhoeven 2019-07-29 9:57 ` Geert Uytterhoeven 2019-07-29 9:57 ` Geert Uytterhoeven 2019-07-29 9:57 ` Geert Uytterhoeven 2019-07-29 9:57 ` Geert Uytterhoeven 2019-07-30 6:26 ` Christoph Hellwig 2019-07-30 6:26 ` Christoph Hellwig 2019-07-30 6:26 ` Christoph Hellwig 2019-07-30 6:26 ` Christoph Hellwig 2019-07-30 6:26 ` Christoph Hellwig 2019-07-25 6:34 ` [PATCH 5/5] dma-mapping: remove ARCH_NO_COHERENT_DMA_MMAP Christoph Hellwig 2019-07-25 6:34 ` Christoph Hellwig 2019-07-25 6:34 ` Christoph Hellwig 2019-07-25 6:34 ` Christoph Hellwig 2019-07-25 6:34 ` Christoph Hellwig 2019-08-02 7:03 ` Christoph Hellwig 2019-08-02 7:03 ` Christoph Hellwig 2019-08-02 7:03 ` Christoph Hellwig 2019-08-02 7:03 ` Christoph Hellwig 2019-08-02 7:03 ` Christoph Hellwig 2019-08-02 8:24 ` Takashi Iwai 2019-08-02 8:24 ` Takashi Iwai 2019-08-02 8:24 ` Takashi Iwai 2019-08-02 8:24 ` Takashi Iwai 2019-08-02 8:24 ` Takashi Iwai 2019-08-03 10:30 ` Christoph Hellwig 2019-08-03 10:30 ` Christoph Hellwig 2019-08-03 10:30 ` Christoph Hellwig 2019-08-03 10:30 ` Christoph Hellwig 2019-08-03 10:30 ` Christoph Hellwig 2019-08-03 11:22 ` Takashi Iwai 2019-08-03 11:22 ` Takashi Iwai 2019-08-03 11:22 ` Takashi Iwai 2019-08-03 11:22 ` Takashi Iwai 2019-08-03 11:22 ` Takashi Iwai
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.