* [PATCH v5 04/13] DMA-API: Introduce dma_(un)map_peer_resource
2015-08-18 19:03 [PATCH v5 00/13] DMA-API/PCI map_peer_resource support for peer-to-peer Will Davis
@ 2015-08-18 19:04 ` Will Davis
0 siblings, 0 replies; 3+ messages in thread
From: Will Davis @ 2015-08-18 19:04 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: Alex Williamson, Joerg Roedel, iommu, linux-pci, Konrad Wilk,
Mark Hounschell, David S. Miller, Jonathan Corbet,
Terence Ripperda, John Hubbard, Jerome Glisse, Will Davis
Add functions to DMA-map and -unmap a peer device's resource for a given
device. This will allow devices to DMA-map, for example, another device's
BAR region on PCI to enable peer-to-peer transactions.
Guard these new functions behind CONFIG_HAS_DMA_P2P.
Signed-off-by: Will Davis <wdavis@nvidia.com>
---
include/asm-generic/dma-mapping-common.h | 43 ++++++++++++++++++++++++++++++++
include/linux/dma-mapping.h | 12 +++++++++
2 files changed, 55 insertions(+)
diff --git a/include/asm-generic/dma-mapping-common.h b/include/asm-generic/dma-mapping-common.h
index 940d5ec..45eec17 100644
--- a/include/asm-generic/dma-mapping-common.h
+++ b/include/asm-generic/dma-mapping-common.h
@@ -73,6 +73,42 @@ static inline void dma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg
ops->unmap_sg(dev, sg, nents, dir, attrs);
}
+#ifdef CONFIG_HAS_DMA_P2P
+static inline dma_peer_addr_t dma_map_peer_resource_attrs(struct device *dev,
+ struct device *peer,
+ struct resource *res,
+ size_t offset,
+ size_t size,
+ enum dma_data_direction dir,
+ struct dma_attrs *attrs)
+{
+ struct dma_map_ops *ops = get_dma_ops(dev);
+ dma_peer_addr_t addr;
+
+ BUG_ON(!valid_dma_direction(dir));
+ BUG_ON(ops->map_peer_resource == NULL);
+ addr = ops->map_peer_resource(dev, peer, res, offset, size, dir,
+ attrs);
+ debug_dma_map_peer_resource(dev, peer, res, offset, size, dir, addr);
+
+ return addr;
+}
+
+static inline void dma_unmap_peer_resource_attrs(struct device *dev,
+ dma_peer_addr_t addr,
+ size_t size,
+ enum dma_data_direction dir,
+ struct dma_attrs *attrs)
+{
+ struct dma_map_ops *ops = get_dma_ops(dev);
+
+ BUG_ON(!valid_dma_direction(dir));
+ if (ops->unmap_peer_resource)
+ ops->unmap_peer_resource(dev, addr, size, dir, attrs);
+ debug_dma_unmap_peer_resource(dev, addr, size, dir);
+}
+#endif
+
static inline dma_addr_t dma_map_page(struct device *dev, struct page *page,
size_t offset, size_t size,
enum dma_data_direction dir)
@@ -181,6 +217,13 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,
#define dma_map_sg(d, s, n, r) dma_map_sg_attrs(d, s, n, r, NULL)
#define dma_unmap_sg(d, s, n, r) dma_unmap_sg_attrs(d, s, n, r, NULL)
+#ifdef CONFIG_HAS_DMA_P2P
+#define dma_map_peer_resource(d, p, e, o, s, r) \
+ dma_map_peer_resource_attrs(d, p, e, o, s, r, NULL)
+#define dma_unmap_peer_resource(d, a, s, r) \
+ dma_unmap_peer_resource_attrs(d, a, s, r, NULL)
+#endif
+
extern int dma_common_mmap(struct device *dev, struct vm_area_struct *vma,
void *cpu_addr, dma_addr_t dma_addr, size_t size);
diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
index ac07ff0..7b8fddc 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -34,6 +34,18 @@ struct dma_map_ops {
void (*unmap_page)(struct device *dev, dma_addr_t dma_handle,
size_t size, enum dma_data_direction dir,
struct dma_attrs *attrs);
+#ifdef CONFIG_HAS_DMA_P2P
+ dma_peer_addr_t (*map_peer_resource)(struct device *dev,
+ struct device *peer,
+ struct resource *res,
+ unsigned long offset, size_t size,
+ enum dma_data_direction dir,
+ struct dma_attrs *attrs);
+ void (*unmap_peer_resource)(struct device *dev,
+ dma_peer_addr_t dma_handle,
+ size_t size, enum dma_data_direction dir,
+ struct dma_attrs *attrs);
+#endif
/*
* map_sg returns 0 on error and a value > 0 on success.
* It should never return a value < 0.
--
2.5.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH v5 04/13] DMA-API: Introduce dma_(un)map_peer_resource
@ 2015-08-18 23:26 Konrad Wilk
2015-08-19 14:32 ` William Davis
0 siblings, 1 reply; 3+ messages in thread
From: Konrad Wilk @ 2015-08-18 23:26 UTC (permalink / raw)
To: wdavis-DDmLM1+adcrQT0dZR+AlfA
Cc: corbet-T1hC0tSOHrs, jhubbard-DDmLM1+adcrQT0dZR+AlfA,
jglisse-H+wXaHxf7aLQT0dZR+AlfA,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA,
linux-pci-u79uwXL29TY76Z2rM5mHXA, bhelgaas-hpIqsD4AKlfQT0dZR+AlfA,
tripperda-DDmLM1+adcrQT0dZR+AlfA, davem-fT/PcQaiUtIeIZ0/mPfg9Q
> +#ifdef CONFIG_HAS_DMA_P2P
> +static inline dma_peer_addr_t dma_map_peer_resource_attrs(struct
> device *dev,
> + struct device *peer,
> + struct resource *res,
> + size_t offset,
> + size_t size,
> + enum dma_data_direction dir,
> + struct dma_attrs *attrs)
> +{
> + struct dma_map_ops *ops = get_dma_ops(dev);
> + dma_peer_addr_t addr;
> +
> + BUG_ON(!valid_dma_direction(dir));
> + BUG_ON(ops->map_peer_resource == NULL);
> + addr = ops->map_peer_resource(dev, peer, res, offset, size, dir,
> + attrs);
> + debug_dma_map_peer_resource(dev, peer, res, offset, size, dir,
> addr);
> +
> + return addr;
> +
With those 'BUG_ON' you need to make sure that every dma_map_ops has
this implemented. That means the calgary_dma_ops, gart_dma_ops, swiotlb_dma_ops,
and xen_swiotlb_dma_ops MUST have something implemented.
Please keep in mind that on one can do 'iommu=soft swiotbl=force' on the
command line which will force the IOMMUs to be ignored and only the
SWIOTLB code will be used.
^ permalink raw reply [flat|nested] 3+ messages in thread
* RE: [PATCH v5 04/13] DMA-API: Introduce dma_(un)map_peer_resource
2015-08-18 23:26 [PATCH v5 04/13] DMA-API: Introduce dma_(un)map_peer_resource Konrad Wilk
@ 2015-08-19 14:32 ` William Davis
0 siblings, 0 replies; 3+ messages in thread
From: William Davis @ 2015-08-19 14:32 UTC (permalink / raw)
To: Konrad Wilk
Cc: corbet-T1hC0tSOHrs@public.gmane.org, John Hubbard,
jglisse-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
bhelgaas-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org,
Terence Ripperda, davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org
> > +#ifdef CONFIG_HAS_DMA_P2P
> > +static inline dma_peer_addr_t dma_map_peer_resource_attrs(struct
> > device *dev,
> > + struct device *peer,
> > + struct resource *res,
> > + size_t offset,
> > + size_t size,
> > + enum dma_data_direction dir,
> > + struct dma_attrs *attrs)
> > +{
> > + struct dma_map_ops *ops = get_dma_ops(dev);
> > + dma_peer_addr_t addr;
> > +
> > + BUG_ON(!valid_dma_direction(dir));
> > + BUG_ON(ops->map_peer_resource == NULL);
> > + addr = ops->map_peer_resource(dev, peer, res, offset, size, dir,
> > + attrs);
> > + debug_dma_map_peer_resource(dev, peer, res, offset, size, dir,
> > addr);
> > +
> > + return addr;
> > +
>
> With those 'BUG_ON' you need to make sure that every dma_map_ops has
> this implemented. That means the calgary_dma_ops, gart_dma_ops, swiotlb_dma_ops,
> and xen_swiotlb_dma_ops MUST have something implemented.
>
> Please keep in mind that on one can do 'iommu=soft swiotbl=force' on the
> command line which will force the IOMMUs to be ignored and only the
> SWIOTLB code will be used.
Thanks for the feedback, Konrad. I will add implementations for those
dma_map_ops in v6.
Will
--
nvpublic
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-08-19 14:32 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-18 23:26 [PATCH v5 04/13] DMA-API: Introduce dma_(un)map_peer_resource Konrad Wilk
2015-08-19 14:32 ` William Davis
-- strict thread matches above, loose matches on Subject: below --
2015-08-18 19:03 [PATCH v5 00/13] DMA-API/PCI map_peer_resource support for peer-to-peer Will Davis
2015-08-18 19:04 ` [PATCH v5 04/13] DMA-API: Introduce dma_(un)map_peer_resource Will Davis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox