From: <wdavis@nvidia.com> To: <joro@8bytes.org>, <bhelgaas@google.com> Cc: <iommu@lists.linux-foundation.org>, <linux-pci@vger.kernel.org>, <tripperda@nvidia.com>, <jhubbard@nvidia.com>, <jglisse@redhat.com>, <konrad.wilk@oracle.com>, Will Davis <wdavis@nvidia.com> Subject: [PATCH v2 2/7] DMA-API: Introduce dma_(un)map_resource Date: Mon, 18 May 2015 13:24:59 -0500 [thread overview] Message-ID: <1431973504-5903-3-git-send-email-wdavis@nvidia.com> (raw) In-Reply-To: <1431973504-5903-1-git-send-email-wdavis@nvidia.com> From: Will Davis <wdavis@nvidia.com> Add functions to DMA-map and -unmap a resource for a given device. This will allow devices to DMA-map a peer device's resource (for example, another device's BAR region on PCI) to enable peer-to-peer transactions. Signed-off-by: Will Davis <wdavis@nvidia.com> Reviewed-by: Terence Ripperda <tripperda@nvidia.com> Reviewed-by: John Hubbard <jhubbard@nvidia.com> --- include/asm-generic/dma-mapping-broken.h | 9 +++++++++ include/asm-generic/dma-mapping-common.h | 34 ++++++++++++++++++++++++++++++++ include/linux/dma-mapping.h | 7 +++++++ 3 files changed, 50 insertions(+) diff --git a/include/asm-generic/dma-mapping-broken.h b/include/asm-generic/dma-mapping-broken.h index 6c32af9..d171f01 100644 --- a/include/asm-generic/dma-mapping-broken.h +++ b/include/asm-generic/dma-mapping-broken.h @@ -59,6 +59,15 @@ extern void dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size, enum dma_data_direction direction); +extern dma_addr_t +dma_map_resource(struct device *dev, struct resource *res, + unsigned long offset, size_t size, + enum dma_data_direction direction); + +extern void +dma_unmap_resource(struct device *dev, dma_addr_t dma_address, size_t size, + enum dma_data_direction direction); + extern void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, enum dma_data_direction direction); diff --git a/include/asm-generic/dma-mapping-common.h b/include/asm-generic/dma-mapping-common.h index 940d5ec..cd9948d 100644 --- a/include/asm-generic/dma-mapping-common.h +++ b/include/asm-generic/dma-mapping-common.h @@ -73,6 +73,36 @@ static inline void dma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg ops->unmap_sg(dev, sg, nents, dir, attrs); } +static inline dma_addr_t dma_map_resource_attrs(struct device *dev, + struct resource *res, + size_t offset, size_t size, + enum dma_data_direction dir, + struct dma_attrs *attrs) +{ + const struct dma_map_ops *ops = get_dma_ops(dev); + dma_addr_t addr = 0; + + BUG_ON(!valid_dma_direction(dir)); + if (ops->map_resource) + addr = ops->map_resource(dev, res, offset, size, dir, attrs); + debug_dma_map_resource(dev, res, offset, size, dir, addr); + + return addr; +} + +static inline void dma_unmap_resource_attrs(struct device *dev, dma_addr_t addr, + size_t size, + enum dma_data_direction dir, + struct dma_attrs *attrs) +{ + const struct dma_map_ops *ops = get_dma_ops(dev); + + BUG_ON(!valid_dma_direction(dir)); + if (ops->unmap_resource) + ops->unmap_resource(dev, addr, size, dir, attrs); + debug_dma_unmap_resource(dev, addr, size, dir); +} + 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) @@ -180,6 +210,10 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, #define dma_unmap_single(d, a, s, r) dma_unmap_single_attrs(d, a, s, r, NULL) #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) +#define dma_map_resource(d, e, o, s, r) \ + dma_map_resource_attrs(d, e, o, s, r, NULL) +#define dma_unmap_resource(d, a, s, r) \ + dma_unmap_resource_attrs(d, a, s, r, NULL) 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..05b0b51 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h @@ -34,6 +34,13 @@ 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); + dma_addr_t (*map_resource)(struct device *dev, struct resource *res, + unsigned long offset, size_t size, + enum dma_data_direction dir, + struct dma_attrs *attrs); + void (*unmap_resource)(struct device *dev, dma_addr_t dma_handle, + size_t size, enum dma_data_direction dir, + struct dma_attrs *attrs); /* * map_sg returns 0 on error and a value > 0 on success. * It should never return a value < 0. -- 2.4.0
WARNING: multiple messages have this Message-ID (diff)
From: <wdavis@nvidia.com> To: joro@8bytes.org, bhelgaas@google.com Cc: iommu@lists.linux-foundation.org, linux-pci@vger.kernel.org, tripperda@nvidia.com, jhubbard@nvidia.com, jglisse@redhat.com, konrad.wilk@oracle.com, Will Davis <wdavis@nvidia.com> Subject: [PATCH v2 2/7] DMA-API: Introduce dma_(un)map_resource Date: Mon, 18 May 2015 13:24:59 -0500 [thread overview] Message-ID: <1431973504-5903-3-git-send-email-wdavis@nvidia.com> (raw) In-Reply-To: <1431973504-5903-1-git-send-email-wdavis@nvidia.com> From: Will Davis <wdavis@nvidia.com> Add functions to DMA-map and -unmap a resource for a given device. This will allow devices to DMA-map a peer device's resource (for example, another device's BAR region on PCI) to enable peer-to-peer transactions. Signed-off-by: Will Davis <wdavis@nvidia.com> Reviewed-by: Terence Ripperda <tripperda@nvidia.com> Reviewed-by: John Hubbard <jhubbard@nvidia.com> --- include/asm-generic/dma-mapping-broken.h | 9 +++++++++ include/asm-generic/dma-mapping-common.h | 34 ++++++++++++++++++++++++++++++++ include/linux/dma-mapping.h | 7 +++++++ 3 files changed, 50 insertions(+) diff --git a/include/asm-generic/dma-mapping-broken.h b/include/asm-generic/dma-mapping-broken.h index 6c32af9..d171f01 100644 --- a/include/asm-generic/dma-mapping-broken.h +++ b/include/asm-generic/dma-mapping-broken.h @@ -59,6 +59,15 @@ extern void dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size, enum dma_data_direction direction); +extern dma_addr_t +dma_map_resource(struct device *dev, struct resource *res, + unsigned long offset, size_t size, + enum dma_data_direction direction); + +extern void +dma_unmap_resource(struct device *dev, dma_addr_t dma_address, size_t size, + enum dma_data_direction direction); + extern void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, enum dma_data_direction direction); diff --git a/include/asm-generic/dma-mapping-common.h b/include/asm-generic/dma-mapping-common.h index 940d5ec..cd9948d 100644 --- a/include/asm-generic/dma-mapping-common.h +++ b/include/asm-generic/dma-mapping-common.h @@ -73,6 +73,36 @@ static inline void dma_unmap_sg_attrs(struct device *dev, struct scatterlist *sg ops->unmap_sg(dev, sg, nents, dir, attrs); } +static inline dma_addr_t dma_map_resource_attrs(struct device *dev, + struct resource *res, + size_t offset, size_t size, + enum dma_data_direction dir, + struct dma_attrs *attrs) +{ + const struct dma_map_ops *ops = get_dma_ops(dev); + dma_addr_t addr = 0; + + BUG_ON(!valid_dma_direction(dir)); + if (ops->map_resource) + addr = ops->map_resource(dev, res, offset, size, dir, attrs); + debug_dma_map_resource(dev, res, offset, size, dir, addr); + + return addr; +} + +static inline void dma_unmap_resource_attrs(struct device *dev, dma_addr_t addr, + size_t size, + enum dma_data_direction dir, + struct dma_attrs *attrs) +{ + const struct dma_map_ops *ops = get_dma_ops(dev); + + BUG_ON(!valid_dma_direction(dir)); + if (ops->unmap_resource) + ops->unmap_resource(dev, addr, size, dir, attrs); + debug_dma_unmap_resource(dev, addr, size, dir); +} + 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) @@ -180,6 +210,10 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, #define dma_unmap_single(d, a, s, r) dma_unmap_single_attrs(d, a, s, r, NULL) #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) +#define dma_map_resource(d, e, o, s, r) \ + dma_map_resource_attrs(d, e, o, s, r, NULL) +#define dma_unmap_resource(d, a, s, r) \ + dma_unmap_resource_attrs(d, a, s, r, NULL) 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..05b0b51 100644 --- a/include/linux/dma-mapping.h +++ b/include/linux/dma-mapping.h @@ -34,6 +34,13 @@ 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); + dma_addr_t (*map_resource)(struct device *dev, struct resource *res, + unsigned long offset, size_t size, + enum dma_data_direction dir, + struct dma_attrs *attrs); + void (*unmap_resource)(struct device *dev, dma_addr_t dma_handle, + size_t size, enum dma_data_direction dir, + struct dma_attrs *attrs); /* * map_sg returns 0 on error and a value > 0 on success. * It should never return a value < 0. -- 2.4.0
next prev parent reply other threads:[~2015-05-18 18:38 UTC|newest] Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-05-18 18:24 [PATCH v2 0/7] IOMMU/DMA map_resource support for peer-to-peer wdavis 2015-05-18 18:24 ` wdavis 2015-05-18 18:24 ` [PATCH v2 1/7] dma-debug: add checking for map/unmap_resource wdavis 2015-05-18 18:24 ` wdavis 2015-05-18 18:24 ` wdavis [this message] 2015-05-18 18:24 ` [PATCH v2 2/7] DMA-API: Introduce dma_(un)map_resource wdavis 2015-05-29 8:16 ` Joerg Roedel 2015-05-18 18:25 ` [PATCH v2 3/7] dma-mapping: pci: add pci_(un)map_resource wdavis 2015-05-18 18:25 ` wdavis 2015-05-18 18:25 ` [PATCH v2 4/7] DMA-API: Add dma_(un)map_resource() documentation wdavis 2015-05-18 18:25 ` wdavis 2015-05-19 23:43 ` Bjorn Helgaas 2015-05-20 12:11 ` Mark Hounschell 2015-05-20 12:11 ` Mark Hounschell 2015-05-20 17:30 ` William Davis 2015-05-20 17:30 ` William Davis 2015-05-20 19:15 ` Mark Hounschell 2015-05-20 19:51 ` William Davis 2015-05-20 20:07 ` Mark Hounschell 2015-05-27 18:31 ` William Davis 2015-05-29 8:24 ` joro 2015-07-07 15:15 ` Bjorn Helgaas 2015-07-07 15:15 ` Bjorn Helgaas 2015-07-07 15:41 ` Alex Williamson 2015-07-07 16:16 ` Bjorn Helgaas 2015-07-07 16:41 ` Alex Williamson 2015-07-07 16:41 ` Alex Williamson 2015-07-07 17:14 ` Mark Hounschell 2015-07-07 17:14 ` Mark Hounschell 2015-07-07 17:28 ` Alex Williamson 2015-07-07 19:17 ` Mark Hounschell 2015-07-07 19:54 ` Alex Williamson 2015-07-07 19:54 ` Alex Williamson 2015-07-08 15:11 ` Bjorn Helgaas 2015-07-08 16:40 ` Mark Hounschell 2015-07-09 0:50 ` Rafael J. Wysocki 2015-06-01 21:25 ` Konrad Rzeszutek Wilk 2015-06-01 21:25 ` Konrad Rzeszutek Wilk 2015-06-02 14:27 ` William Davis 2015-05-18 18:25 ` [PATCH v2 5/7] iommu/amd: Implement (un)map_resource wdavis 2015-05-18 18:25 ` wdavis 2015-05-18 18:25 ` [PATCH v2 6/7] iommu/vt-d: implement (un)map_resource wdavis 2015-05-18 18:25 ` wdavis 2015-05-18 18:25 ` [PATCH v2 7/7] x86: add pci-nommu implementation of map_resource wdavis 2015-05-18 18:25 ` wdavis
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1431973504-5903-3-git-send-email-wdavis@nvidia.com \ --to=wdavis@nvidia.com \ --cc=bhelgaas@google.com \ --cc=iommu@lists.linux-foundation.org \ --cc=jglisse@redhat.com \ --cc=jhubbard@nvidia.com \ --cc=joro@8bytes.org \ --cc=konrad.wilk@oracle.com \ --cc=linux-pci@vger.kernel.org \ --cc=tripperda@nvidia.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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.