* [PATCH v3 1/2] iommu/dma: Implement dma_{map,unmap}_resource()
@ 2016-11-11 18:27 Robin Murphy
[not found] ` <7d54803d32968be46a1a525d7160feb13af72f00.1478887214.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
0 siblings, 1 reply; 4+ messages in thread
From: Robin Murphy @ 2016-11-11 18:27 UTC (permalink / raw)
To: will.deacon-5wv7dgnIgG8, catalin.marinas-5wv7dgnIgG8,
joro-zLv9SwRftAIdnm+yROfE0A
Cc: iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
With the new dma_{map,unmap}_resource() functions added to the DMA API
for the benefit of cases like slave DMA, add suitable implementations to
the arsenal of our generic layer. Since cache maintenance should not be
a concern, these can both be standalone callback implementations without
the need for arch code wrappers.
CC: Joerg Roedel <joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
Signed-off-by: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
---
v3: Don't misuse phys_to_page()
drivers/iommu/dma-iommu.c | 24 +++++++++++++++++++++---
include/linux/dma-iommu.h | 4 ++++
2 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c
index c5ab8667e6f2..8b745260b3bc 100644
--- a/drivers/iommu/dma-iommu.c
+++ b/drivers/iommu/dma-iommu.c
@@ -432,13 +432,12 @@ int iommu_dma_mmap(struct page **pages, size_t size, struct vm_area_struct *vma)
return ret;
}
-dma_addr_t iommu_dma_map_page(struct device *dev, struct page *page,
- unsigned long offset, size_t size, int prot)
+dma_addr_t __iommu_dma_map(struct device *dev, phys_addr_t phys,
+ size_t size, int prot)
{
dma_addr_t dma_addr;
struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
struct iova_domain *iovad = cookie_iovad(domain);
- phys_addr_t phys = page_to_phys(page) + offset;
size_t iova_off = iova_offset(iovad, phys);
size_t len = iova_align(iovad, size + iova_off);
struct iova *iova = __alloc_iova(domain, len, dma_get_mask(dev));
@@ -454,6 +453,12 @@ dma_addr_t iommu_dma_map_page(struct device *dev, struct page *page,
return dma_addr + iova_off;
}
+dma_addr_t iommu_dma_map_page(struct device *dev, struct page *page,
+ unsigned long offset, size_t size, int prot)
+{
+ return __iommu_dma_map(dev, page_to_phys(page) + offset, size, prot);
+}
+
void iommu_dma_unmap_page(struct device *dev, dma_addr_t handle, size_t size,
enum dma_data_direction dir, unsigned long attrs)
{
@@ -624,6 +629,19 @@ void iommu_dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents,
__iommu_dma_unmap(iommu_get_domain_for_dev(dev), sg_dma_address(sg));
}
+dma_addr_t iommu_dma_map_resource(struct device *dev, phys_addr_t phys,
+ size_t size, enum dma_data_direction dir, unsigned long attrs)
+{
+ return __iommu_dma_map(dev, phys, size,
+ dma_direction_to_prot(dir, false) | IOMMU_MMIO);
+}
+
+void iommu_dma_unmap_resource(struct device *dev, dma_addr_t handle,
+ size_t size, enum dma_data_direction dir, unsigned long attrs)
+{
+ __iommu_dma_unmap(iommu_get_domain_for_dev(dev), handle);
+}
+
int iommu_dma_supported(struct device *dev, u64 mask)
{
/*
diff --git a/include/linux/dma-iommu.h b/include/linux/dma-iommu.h
index 32c589062bd9..7f7e9a7e3839 100644
--- a/include/linux/dma-iommu.h
+++ b/include/linux/dma-iommu.h
@@ -61,6 +61,10 @@ void iommu_dma_unmap_page(struct device *dev, dma_addr_t handle, size_t size,
enum dma_data_direction dir, unsigned long attrs);
void iommu_dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents,
enum dma_data_direction dir, unsigned long attrs);
+dma_addr_t iommu_dma_map_resource(struct device *dev, phys_addr_t phys,
+ size_t size, enum dma_data_direction dir, unsigned long attrs);
+void iommu_dma_unmap_resource(struct device *dev, dma_addr_t handle,
+ size_t size, enum dma_data_direction dir, unsigned long attrs);
int iommu_dma_supported(struct device *dev, u64 mask);
int iommu_dma_mapping_error(struct device *dev, dma_addr_t dma_addr);
--
2.10.2.dirty
^ permalink raw reply related [flat|nested] 4+ messages in thread[parent not found: <7d54803d32968be46a1a525d7160feb13af72f00.1478887214.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>]
* [PATCH v3 2/2] arm64: Wire up iommu_dma_{map, unmap}_resource() [not found] ` <7d54803d32968be46a1a525d7160feb13af72f00.1478887214.git.robin.murphy-5wv7dgnIgG8@public.gmane.org> @ 2016-11-11 18:27 ` Robin Murphy [not found] ` <706f6bc883775206d661f38d9c1cbaa4cc4d04b7.1478887214.git.robin.murphy-5wv7dgnIgG8@public.gmane.org> 2016-11-13 11:41 ` [PATCH v3 1/2] iommu/dma: Implement dma_{map,unmap}_resource() Catalin Marinas 1 sibling, 1 reply; 4+ messages in thread From: Robin Murphy @ 2016-11-11 18:27 UTC (permalink / raw) To: will.deacon-5wv7dgnIgG8, catalin.marinas-5wv7dgnIgG8, joro-zLv9SwRftAIdnm+yROfE0A Cc: iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r With no coherency to worry about, just plug'em straight in. CC: Catalin Marinas <catalin.marinas-5wv7dgnIgG8@public.gmane.org> CC: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org> Signed-off-by: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org> --- arch/arm64/mm/dma-mapping.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c index 3f74d0d98de6..5cd0a383b14b 100644 --- a/arch/arm64/mm/dma-mapping.c +++ b/arch/arm64/mm/dma-mapping.c @@ -796,6 +796,8 @@ static struct dma_map_ops iommu_dma_ops = { .sync_single_for_device = __iommu_sync_single_for_device, .sync_sg_for_cpu = __iommu_sync_sg_for_cpu, .sync_sg_for_device = __iommu_sync_sg_for_device, + .map_resource = iommu_dma_map_resource, + .unmap_resource = iommu_dma_unmap_resource, .dma_supported = iommu_dma_supported, .mapping_error = iommu_dma_mapping_error, }; -- 2.10.2.dirty ^ permalink raw reply related [flat|nested] 4+ messages in thread
[parent not found: <706f6bc883775206d661f38d9c1cbaa4cc4d04b7.1478887214.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>]
* Re: [PATCH v3 2/2] arm64: Wire up iommu_dma_{map, unmap}_resource() [not found] ` <706f6bc883775206d661f38d9c1cbaa4cc4d04b7.1478887214.git.robin.murphy-5wv7dgnIgG8@public.gmane.org> @ 2016-11-13 11:42 ` Catalin Marinas 0 siblings, 0 replies; 4+ messages in thread From: Catalin Marinas @ 2016-11-13 11:42 UTC (permalink / raw) To: Robin Murphy Cc: will.deacon-5wv7dgnIgG8, iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On Fri, Nov 11, 2016 at 06:27:35PM +0000, Robin Murphy wrote: > With no coherency to worry about, just plug'em straight in. > > CC: Catalin Marinas <catalin.marinas-5wv7dgnIgG8@public.gmane.org> > CC: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org> > Signed-off-by: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org> > --- > arch/arm64/mm/dma-mapping.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c > index 3f74d0d98de6..5cd0a383b14b 100644 > --- a/arch/arm64/mm/dma-mapping.c > +++ b/arch/arm64/mm/dma-mapping.c > @@ -796,6 +796,8 @@ static struct dma_map_ops iommu_dma_ops = { > .sync_single_for_device = __iommu_sync_single_for_device, > .sync_sg_for_cpu = __iommu_sync_sg_for_cpu, > .sync_sg_for_device = __iommu_sync_sg_for_device, > + .map_resource = iommu_dma_map_resource, > + .unmap_resource = iommu_dma_unmap_resource, > .dma_supported = iommu_dma_supported, > .mapping_error = iommu_dma_mapping_error, Acked-by: Catalin Marinas <catalin.marinas-5wv7dgnIgG8@public.gmane.org> I guess these two patches would go in via the iommu tree. -- Catalin ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v3 1/2] iommu/dma: Implement dma_{map,unmap}_resource() [not found] ` <7d54803d32968be46a1a525d7160feb13af72f00.1478887214.git.robin.murphy-5wv7dgnIgG8@public.gmane.org> 2016-11-11 18:27 ` [PATCH v3 2/2] arm64: Wire up iommu_dma_{map, unmap}_resource() Robin Murphy @ 2016-11-13 11:41 ` Catalin Marinas 1 sibling, 0 replies; 4+ messages in thread From: Catalin Marinas @ 2016-11-13 11:41 UTC (permalink / raw) To: Robin Murphy Cc: will.deacon-5wv7dgnIgG8, iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r On Fri, Nov 11, 2016 at 06:27:34PM +0000, Robin Murphy wrote: > diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c > index c5ab8667e6f2..8b745260b3bc 100644 > --- a/drivers/iommu/dma-iommu.c > +++ b/drivers/iommu/dma-iommu.c > @@ -432,13 +432,12 @@ int iommu_dma_mmap(struct page **pages, size_t size, struct vm_area_struct *vma) > return ret; > } > > -dma_addr_t iommu_dma_map_page(struct device *dev, struct page *page, > - unsigned long offset, size_t size, int prot) > +dma_addr_t __iommu_dma_map(struct device *dev, phys_addr_t phys, > + size_t size, int prot) This should be static. -- Catalin ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-11-13 11:42 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-11-11 18:27 [PATCH v3 1/2] iommu/dma: Implement dma_{map,unmap}_resource() Robin Murphy
[not found] ` <7d54803d32968be46a1a525d7160feb13af72f00.1478887214.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-11-11 18:27 ` [PATCH v3 2/2] arm64: Wire up iommu_dma_{map, unmap}_resource() Robin Murphy
[not found] ` <706f6bc883775206d661f38d9c1cbaa4cc4d04b7.1478887214.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-11-13 11:42 ` Catalin Marinas
2016-11-13 11:41 ` [PATCH v3 1/2] iommu/dma: Implement dma_{map,unmap}_resource() Catalin Marinas
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).