Message ID | 20191024124130.16871-3-laurentiu.tudor@nxp.com |
---|---|
State | Not Applicable |
Delegated to: | David Miller |
Headers | show |
Series | dma-mapping: introduce new dma unmap and sync variants | expand |
On 24/10/2019 13:41, Laurentiu Tudor wrote: > From: Laurentiu Tudor <laurentiu.tudor@nxp.com> > > Add an implementation of the newly introduced dma map op in the > generic DMA IOMMU generic glue layer and wire it up. > > Signed-off-by: Laurentiu Tudor <laurentiu.tudor@nxp.com> > --- > drivers/iommu/dma-iommu.c | 16 ++++++++++++++++ > 1 file changed, 16 insertions(+) > > diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c > index f321279baf9e..15e76232d697 100644 > --- a/drivers/iommu/dma-iommu.c > +++ b/drivers/iommu/dma-iommu.c > @@ -1091,6 +1091,21 @@ static unsigned long iommu_dma_get_merge_boundary(struct device *dev) > return (1UL << __ffs(domain->pgsize_bitmap)) - 1; > } > > +static void *iommu_dma_get_virt_addr(struct device *dev, dma_addr_t dma_handle) > +{ > + struct iommu_domain *domain = iommu_get_domain_for_dev(dev); Note that we'd generally use the iommu_get_dma_domain() fastpath... > + > + if (domain) { ...wherein we can also assume that the device having iommu_dma_ops assigned at all implies that a DMA ops domain is in place. Robin. > + phys_addr_t phys; > + > + phys = iommu_iova_to_phys(domain, dma_handle); > + if (phys) > + return phys_to_virt(phys); > + } > + > + return NULL; > +} > + > static const struct dma_map_ops iommu_dma_ops = { > .alloc = iommu_dma_alloc, > .free = iommu_dma_free, > @@ -1107,6 +1122,7 @@ static const struct dma_map_ops iommu_dma_ops = { > .map_resource = iommu_dma_map_resource, > .unmap_resource = iommu_dma_unmap_resource, > .get_merge_boundary = iommu_dma_get_merge_boundary, > + .get_virt_addr = iommu_dma_get_virt_addr, > }; > > /* >
diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index f321279baf9e..15e76232d697 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -1091,6 +1091,21 @@ static unsigned long iommu_dma_get_merge_boundary(struct device *dev) return (1UL << __ffs(domain->pgsize_bitmap)) - 1; } +static void *iommu_dma_get_virt_addr(struct device *dev, dma_addr_t dma_handle) +{ + struct iommu_domain *domain = iommu_get_domain_for_dev(dev); + + if (domain) { + phys_addr_t phys; + + phys = iommu_iova_to_phys(domain, dma_handle); + if (phys) + return phys_to_virt(phys); + } + + return NULL; +} + static const struct dma_map_ops iommu_dma_ops = { .alloc = iommu_dma_alloc, .free = iommu_dma_free, @@ -1107,6 +1122,7 @@ static const struct dma_map_ops iommu_dma_ops = { .map_resource = iommu_dma_map_resource, .unmap_resource = iommu_dma_unmap_resource, .get_merge_boundary = iommu_dma_get_merge_boundary, + .get_virt_addr = iommu_dma_get_virt_addr, }; /*