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 5/7] iommu/amd: Implement (un)map_resource Date: Mon, 18 May 2015 13:25:02 -0500 [thread overview] Message-ID: <1431973504-5903-6-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> Implement 'map_resource' for the AMD IOMMU driver. Generalize the existing map_page implementation to operate on a physical address, and make both map_page and map_resource wrappers around that helper (and similiarly, for unmap_page and unmap_resource). This allows a device to map another's resource, 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> --- drivers/iommu/amd_iommu.c | 76 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 63 insertions(+), 13 deletions(-) diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index e43d489..ca2dac6 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -503,6 +503,8 @@ DECLARE_STATS_COUNTER(cnt_map_single); DECLARE_STATS_COUNTER(cnt_unmap_single); DECLARE_STATS_COUNTER(cnt_map_sg); DECLARE_STATS_COUNTER(cnt_unmap_sg); +DECLARE_STATS_COUNTER(cnt_map_resource); +DECLARE_STATS_COUNTER(cnt_unmap_resource); DECLARE_STATS_COUNTER(cnt_alloc_coherent); DECLARE_STATS_COUNTER(cnt_free_coherent); DECLARE_STATS_COUNTER(cross_page); @@ -541,6 +543,8 @@ static void amd_iommu_stats_init(void) amd_iommu_stats_add(&cnt_unmap_single); amd_iommu_stats_add(&cnt_map_sg); amd_iommu_stats_add(&cnt_unmap_sg); + amd_iommu_stats_add(&cnt_map_resource); + amd_iommu_stats_add(&cnt_unmap_resource); amd_iommu_stats_add(&cnt_alloc_coherent); amd_iommu_stats_add(&cnt_free_coherent); amd_iommu_stats_add(&cross_page); @@ -2752,20 +2756,16 @@ static void __unmap_single(struct dma_ops_domain *dma_dom, } /* - * The exported map_single function for dma_ops. + * Wrapper function that contains code common to mapping a physical address + * range from a page or a resource. */ -static dma_addr_t map_page(struct device *dev, struct page *page, - unsigned long offset, size_t size, - enum dma_data_direction dir, - struct dma_attrs *attrs) +static dma_addr_t __map_phys(struct device *dev, phys_addr_t paddr, + size_t size, enum dma_data_direction dir) { unsigned long flags; struct protection_domain *domain; dma_addr_t addr; u64 dma_mask; - phys_addr_t paddr = page_to_phys(page) + offset; - - INC_STATS_COUNTER(cnt_map_single); domain = get_domain(dev); if (PTR_ERR(domain) == -EINVAL) @@ -2791,16 +2791,15 @@ out: } /* - * The exported unmap_single function for dma_ops. + * Wrapper function that contains code common to unmapping a physical address + * range from a page or a resource. */ -static void unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, - enum dma_data_direction dir, struct dma_attrs *attrs) +static void __unmap_phys(struct device *dev, dma_addr_t dma_addr, size_t size, + enum dma_data_direction dir) { unsigned long flags; struct protection_domain *domain; - INC_STATS_COUNTER(cnt_unmap_single); - domain = get_domain(dev); if (IS_ERR(domain)) return; @@ -2815,6 +2814,55 @@ static void unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, } /* + * The exported map_single function for dma_ops. + */ +static dma_addr_t map_page(struct device *dev, struct page *page, + unsigned long offset, size_t size, + enum dma_data_direction dir, + struct dma_attrs *attrs) +{ + INC_STATS_COUNTER(cnt_map_single); + + return __map_phys(dev, page_to_phys(page) + offset, size, dir); +} + +/* + * The exported unmap_single function for dma_ops. + */ +static void unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, + enum dma_data_direction dir, struct dma_attrs *attrs) +{ + INC_STATS_COUNTER(cnt_unmap_single); + + __unmap_phys(dev, dma_addr, size, dir); +} + +/* + * The exported map_resource function for dma_ops. + */ +static 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) +{ + INC_STATS_COUNTER(cnt_map_resource); + + return __map_phys(dev, res->start + offset, size, dir); +} + +/* + * The exported unmap_resource function for dma_ops. + */ +static void unmap_resource(struct device *dev, dma_addr_t dma_addr, + size_t size, enum dma_data_direction dir, + struct dma_attrs *attrs) +{ + INC_STATS_COUNTER(cnt_unmap_resource); + + __unmap_phys(dev, dma_addr, size, dir); +} + +/* * The exported map_sg function for dma_ops (handles scatter-gather * lists). */ @@ -3066,6 +3114,8 @@ static struct dma_map_ops amd_iommu_dma_ops = { .unmap_page = unmap_page, .map_sg = map_sg, .unmap_sg = unmap_sg, + .map_resource = map_resource, + .unmap_resource = unmap_resource, .dma_supported = amd_iommu_dma_supported, }; -- 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 5/7] iommu/amd: Implement (un)map_resource Date: Mon, 18 May 2015 13:25:02 -0500 [thread overview] Message-ID: <1431973504-5903-6-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> Implement 'map_resource' for the AMD IOMMU driver. Generalize the existing map_page implementation to operate on a physical address, and make both map_page and map_resource wrappers around that helper (and similiarly, for unmap_page and unmap_resource). This allows a device to map another's resource, 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> --- drivers/iommu/amd_iommu.c | 76 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 63 insertions(+), 13 deletions(-) diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index e43d489..ca2dac6 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c @@ -503,6 +503,8 @@ DECLARE_STATS_COUNTER(cnt_map_single); DECLARE_STATS_COUNTER(cnt_unmap_single); DECLARE_STATS_COUNTER(cnt_map_sg); DECLARE_STATS_COUNTER(cnt_unmap_sg); +DECLARE_STATS_COUNTER(cnt_map_resource); +DECLARE_STATS_COUNTER(cnt_unmap_resource); DECLARE_STATS_COUNTER(cnt_alloc_coherent); DECLARE_STATS_COUNTER(cnt_free_coherent); DECLARE_STATS_COUNTER(cross_page); @@ -541,6 +543,8 @@ static void amd_iommu_stats_init(void) amd_iommu_stats_add(&cnt_unmap_single); amd_iommu_stats_add(&cnt_map_sg); amd_iommu_stats_add(&cnt_unmap_sg); + amd_iommu_stats_add(&cnt_map_resource); + amd_iommu_stats_add(&cnt_unmap_resource); amd_iommu_stats_add(&cnt_alloc_coherent); amd_iommu_stats_add(&cnt_free_coherent); amd_iommu_stats_add(&cross_page); @@ -2752,20 +2756,16 @@ static void __unmap_single(struct dma_ops_domain *dma_dom, } /* - * The exported map_single function for dma_ops. + * Wrapper function that contains code common to mapping a physical address + * range from a page or a resource. */ -static dma_addr_t map_page(struct device *dev, struct page *page, - unsigned long offset, size_t size, - enum dma_data_direction dir, - struct dma_attrs *attrs) +static dma_addr_t __map_phys(struct device *dev, phys_addr_t paddr, + size_t size, enum dma_data_direction dir) { unsigned long flags; struct protection_domain *domain; dma_addr_t addr; u64 dma_mask; - phys_addr_t paddr = page_to_phys(page) + offset; - - INC_STATS_COUNTER(cnt_map_single); domain = get_domain(dev); if (PTR_ERR(domain) == -EINVAL) @@ -2791,16 +2791,15 @@ out: } /* - * The exported unmap_single function for dma_ops. + * Wrapper function that contains code common to unmapping a physical address + * range from a page or a resource. */ -static void unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, - enum dma_data_direction dir, struct dma_attrs *attrs) +static void __unmap_phys(struct device *dev, dma_addr_t dma_addr, size_t size, + enum dma_data_direction dir) { unsigned long flags; struct protection_domain *domain; - INC_STATS_COUNTER(cnt_unmap_single); - domain = get_domain(dev); if (IS_ERR(domain)) return; @@ -2815,6 +2814,55 @@ static void unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, } /* + * The exported map_single function for dma_ops. + */ +static dma_addr_t map_page(struct device *dev, struct page *page, + unsigned long offset, size_t size, + enum dma_data_direction dir, + struct dma_attrs *attrs) +{ + INC_STATS_COUNTER(cnt_map_single); + + return __map_phys(dev, page_to_phys(page) + offset, size, dir); +} + +/* + * The exported unmap_single function for dma_ops. + */ +static void unmap_page(struct device *dev, dma_addr_t dma_addr, size_t size, + enum dma_data_direction dir, struct dma_attrs *attrs) +{ + INC_STATS_COUNTER(cnt_unmap_single); + + __unmap_phys(dev, dma_addr, size, dir); +} + +/* + * The exported map_resource function for dma_ops. + */ +static 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) +{ + INC_STATS_COUNTER(cnt_map_resource); + + return __map_phys(dev, res->start + offset, size, dir); +} + +/* + * The exported unmap_resource function for dma_ops. + */ +static void unmap_resource(struct device *dev, dma_addr_t dma_addr, + size_t size, enum dma_data_direction dir, + struct dma_attrs *attrs) +{ + INC_STATS_COUNTER(cnt_unmap_resource); + + __unmap_phys(dev, dma_addr, size, dir); +} + +/* * The exported map_sg function for dma_ops (handles scatter-gather * lists). */ @@ -3066,6 +3114,8 @@ static struct dma_map_ops amd_iommu_dma_ops = { .unmap_page = unmap_page, .map_sg = map_sg, .unmap_sg = unmap_sg, + .map_resource = map_resource, + .unmap_resource = unmap_resource, .dma_supported = amd_iommu_dma_supported, }; -- 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 ` [PATCH v2 2/7] DMA-API: Introduce dma_(un)map_resource wdavis 2015-05-18 18:24 ` 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 ` wdavis [this message] 2015-05-18 18:25 ` [PATCH v2 5/7] iommu/amd: Implement (un)map_resource 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-6-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.