All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bart Van Assche <bart.vanassche@sandisk.com>
To: Doug Ledford <dledford@redhat.com>
Cc: linux-rdma@vger.kernel.org, linux-kernel@vger.kernel.org,
	Christian Borntraeger <borntraeger@de.ibm.com>,
	Joerg Roedel <jroedel@suse.de>, Andy Lutomirski <luto@kernel.org>,
	"Michael S . Tsirkin" <mst@redhat.com>
Subject: [PATCH 3/9] dma: Add dma_virt_ops
Date: Tue, 10 Jan 2017 16:56:42 -0800	[thread overview]
Message-ID: <20170111005648.14988-4-bart.vanassche@sandisk.com> (raw)
In-Reply-To: <20170111005648.14988-1-bart.vanassche@sandisk.com>

Several RDMA drivers need to provide a DMA mapping API but use the
CPU to transfer data. Provide DMA mapping operations that are
suitable for these drivers.

Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: Joerg Roedel <jroedel@suse.de>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Michael S. Tsirkin <mst@redhat.com>
---
 include/linux/dma-mapping.h |  1 +
 lib/Makefile                |  1 +
 lib/dma-noop.c              |  2 +-
 lib/dma-virt.c              | 73 +++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 76 insertions(+), 1 deletion(-)
 create mode 100644 lib/dma-virt.c

diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
index ab8710888ddf..426c43d4fdbf 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -128,6 +128,7 @@ struct dma_map_ops {
 };
 
 extern const struct dma_map_ops dma_noop_ops;
+extern const struct dma_map_ops dma_virt_ops;
 
 #define DMA_BIT_MASK(n)	(((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
 
diff --git a/lib/Makefile b/lib/Makefile
index bc4073a8cd08..2d6c3fcd432c 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -27,6 +27,7 @@ lib-y := ctype.o string.o vsprintf.o cmdline.o \
 lib-$(CONFIG_MMU) += ioremap.o
 lib-$(CONFIG_SMP) += cpumask.o
 lib-$(CONFIG_HAS_DMA) += dma-noop.o
+lib-$(CONFIG_HAS_DMA) += dma-virt.o
 
 lib-y	+= kobject.o klist.o
 obj-y	+= lockref.o
diff --git a/lib/dma-noop.c b/lib/dma-noop.c
index 65e49dd35b7b..de26c8b68f34 100644
--- a/lib/dma-noop.c
+++ b/lib/dma-noop.c
@@ -1,7 +1,7 @@
 /*
  *	lib/dma-noop.c
  *
- * Simple DMA noop-ops that map 1:1 with memory
+ * DMA operations that map to physical addresses without flushing memory.
  */
 #include <linux/export.h>
 #include <linux/mm.h>
diff --git a/lib/dma-virt.c b/lib/dma-virt.c
new file mode 100644
index 000000000000..b3573b6ad5b1
--- /dev/null
+++ b/lib/dma-virt.c
@@ -0,0 +1,73 @@
+/*
+ *	lib/dma-virt.c
+ *
+ * DMA operations that map to virtual addresses without flushing memory.
+ */
+#include <linux/export.h>
+#include <linux/mm.h>
+#include <linux/dma-mapping.h>
+#include <linux/scatterlist.h>
+
+static void *dma_virt_alloc(struct device *dev, size_t size,
+			    dma_addr_t *dma_handle, gfp_t gfp,
+			    unsigned long attrs)
+{
+	void *ret;
+
+	ret = (void *)__get_free_pages(gfp, get_order(size));
+	if (ret)
+		*dma_handle = (uintptr_t)ret;
+	return ret;
+}
+
+static void dma_virt_free(struct device *dev, size_t size,
+			  void *cpu_addr, dma_addr_t dma_addr,
+			  unsigned long attrs)
+{
+	free_pages((unsigned long)cpu_addr, get_order(size));
+}
+
+static dma_addr_t dma_virt_map_page(struct device *dev, struct page *page,
+				      unsigned long offset, size_t size,
+				      enum dma_data_direction dir,
+				      unsigned long attrs)
+{
+	return (uintptr_t)(page_address(page) + offset);
+}
+
+static int dma_virt_map_sg(struct device *dev, struct scatterlist *sgl, int nents,
+			     enum dma_data_direction dir,
+			     unsigned long attrs)
+{
+	int i;
+	struct scatterlist *sg;
+
+	for_each_sg(sgl, sg, nents, i) {
+		BUG_ON(!sg_page(sg));
+		sg_dma_address(sg) = (uintptr_t)sg_virt(sg);
+		sg_dma_len(sg) = sg->length;
+	}
+
+	return nents;
+}
+
+static int dma_virt_mapping_error(struct device *dev, dma_addr_t dma_addr)
+{
+	return false;
+}
+
+static int dma_virt_supported(struct device *dev, u64 mask)
+{
+	return true;
+}
+
+const struct dma_map_ops dma_virt_ops = {
+	.alloc			= dma_virt_alloc,
+	.free			= dma_virt_free,
+	.map_page		= dma_virt_map_page,
+	.map_sg			= dma_virt_map_sg,
+	.mapping_error		= dma_virt_mapping_error,
+	.dma_supported		= dma_virt_supported,
+};
+
+EXPORT_SYMBOL(dma_virt_ops);
-- 
2.11.0

WARNING: multiple messages have this Message-ID (diff)
From: Bart Van Assche <bart.vanassche@sandisk.com>
To: Doug Ledford <dledford@redhat.com>
Cc: <linux-rdma@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	"Christian Borntraeger" <borntraeger@de.ibm.com>,
	Joerg Roedel <jroedel@suse.de>,
	"Andy Lutomirski" <luto@kernel.org>,
	"Michael S . Tsirkin" <mst@redhat.com>
Subject: [PATCH 3/9] dma: Add dma_virt_ops
Date: Tue, 10 Jan 2017 16:56:42 -0800	[thread overview]
Message-ID: <20170111005648.14988-4-bart.vanassche@sandisk.com> (raw)
In-Reply-To: <20170111005648.14988-1-bart.vanassche@sandisk.com>

Several RDMA drivers need to provide a DMA mapping API but use the
CPU to transfer data. Provide DMA mapping operations that are
suitable for these drivers.

Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: Joerg Roedel <jroedel@suse.de>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Michael S. Tsirkin <mst@redhat.com>
---
 include/linux/dma-mapping.h |  1 +
 lib/Makefile                |  1 +
 lib/dma-noop.c              |  2 +-
 lib/dma-virt.c              | 73 +++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 76 insertions(+), 1 deletion(-)
 create mode 100644 lib/dma-virt.c

diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h
index ab8710888ddf..426c43d4fdbf 100644
--- a/include/linux/dma-mapping.h
+++ b/include/linux/dma-mapping.h
@@ -128,6 +128,7 @@ struct dma_map_ops {
 };
 
 extern const struct dma_map_ops dma_noop_ops;
+extern const struct dma_map_ops dma_virt_ops;
 
 #define DMA_BIT_MASK(n)	(((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
 
diff --git a/lib/Makefile b/lib/Makefile
index bc4073a8cd08..2d6c3fcd432c 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -27,6 +27,7 @@ lib-y := ctype.o string.o vsprintf.o cmdline.o \
 lib-$(CONFIG_MMU) += ioremap.o
 lib-$(CONFIG_SMP) += cpumask.o
 lib-$(CONFIG_HAS_DMA) += dma-noop.o
+lib-$(CONFIG_HAS_DMA) += dma-virt.o
 
 lib-y	+= kobject.o klist.o
 obj-y	+= lockref.o
diff --git a/lib/dma-noop.c b/lib/dma-noop.c
index 65e49dd35b7b..de26c8b68f34 100644
--- a/lib/dma-noop.c
+++ b/lib/dma-noop.c
@@ -1,7 +1,7 @@
 /*
  *	lib/dma-noop.c
  *
- * Simple DMA noop-ops that map 1:1 with memory
+ * DMA operations that map to physical addresses without flushing memory.
  */
 #include <linux/export.h>
 #include <linux/mm.h>
diff --git a/lib/dma-virt.c b/lib/dma-virt.c
new file mode 100644
index 000000000000..b3573b6ad5b1
--- /dev/null
+++ b/lib/dma-virt.c
@@ -0,0 +1,73 @@
+/*
+ *	lib/dma-virt.c
+ *
+ * DMA operations that map to virtual addresses without flushing memory.
+ */
+#include <linux/export.h>
+#include <linux/mm.h>
+#include <linux/dma-mapping.h>
+#include <linux/scatterlist.h>
+
+static void *dma_virt_alloc(struct device *dev, size_t size,
+			    dma_addr_t *dma_handle, gfp_t gfp,
+			    unsigned long attrs)
+{
+	void *ret;
+
+	ret = (void *)__get_free_pages(gfp, get_order(size));
+	if (ret)
+		*dma_handle = (uintptr_t)ret;
+	return ret;
+}
+
+static void dma_virt_free(struct device *dev, size_t size,
+			  void *cpu_addr, dma_addr_t dma_addr,
+			  unsigned long attrs)
+{
+	free_pages((unsigned long)cpu_addr, get_order(size));
+}
+
+static dma_addr_t dma_virt_map_page(struct device *dev, struct page *page,
+				      unsigned long offset, size_t size,
+				      enum dma_data_direction dir,
+				      unsigned long attrs)
+{
+	return (uintptr_t)(page_address(page) + offset);
+}
+
+static int dma_virt_map_sg(struct device *dev, struct scatterlist *sgl, int nents,
+			     enum dma_data_direction dir,
+			     unsigned long attrs)
+{
+	int i;
+	struct scatterlist *sg;
+
+	for_each_sg(sgl, sg, nents, i) {
+		BUG_ON(!sg_page(sg));
+		sg_dma_address(sg) = (uintptr_t)sg_virt(sg);
+		sg_dma_len(sg) = sg->length;
+	}
+
+	return nents;
+}
+
+static int dma_virt_mapping_error(struct device *dev, dma_addr_t dma_addr)
+{
+	return false;
+}
+
+static int dma_virt_supported(struct device *dev, u64 mask)
+{
+	return true;
+}
+
+const struct dma_map_ops dma_virt_ops = {
+	.alloc			= dma_virt_alloc,
+	.free			= dma_virt_free,
+	.map_page		= dma_virt_map_page,
+	.map_sg			= dma_virt_map_sg,
+	.mapping_error		= dma_virt_mapping_error,
+	.dma_supported		= dma_virt_supported,
+};
+
+EXPORT_SYMBOL(dma_virt_ops);
-- 
2.11.0

  parent reply	other threads:[~2017-01-11  0:56 UTC|newest]

Thread overview: 101+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-11  0:56 [PATCH 0/9] IB: Optimize DMA mapping Bart Van Assche
2017-01-11  0:56 ` Bart Van Assche
2017-01-11  0:56 ` [PATCH 1/9] treewide: Constify most dma_map_ops structures Bart Van Assche
2017-01-11  0:56 ` Bart Van Assche
2017-01-11  0:56   ` [OpenRISC] " Bart Van Assche
2017-01-11  0:56   ` Bart Van Assche
2017-01-11  0:56   ` Bart Van Assche
2017-01-11  0:56   ` Bart Van Assche
2017-01-11  0:56   ` Bart Van Assche
2017-01-11  0:56 ` [PATCH 2/9] Move dma_ops from archdata into struct device Bart Van Assche
2017-01-11  0:56   ` [OpenRISC] " Bart Van Assche
2017-01-11  0:56   ` Bart Van Assche
2017-01-11  0:56   ` Bart Van Assche
2017-01-11  0:56   ` Bart Van Assche
2017-01-11  0:56   ` Bart Van Assche
     [not found]   ` <20170111005648.14988-3-bart.vanassche-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2017-01-11  6:46     ` Greg Kroah-Hartman
2017-01-11  6:46       ` [OpenRISC] " Greg Kroah-Hartman
2017-01-11  6:46       ` Greg Kroah-Hartman
2017-01-11  6:46       ` Greg Kroah-Hartman
2017-01-11  6:46       ` Greg Kroah-Hartman
     [not found]       ` <20170111064624.GA26893-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2017-01-11 18:03         ` Bart Van Assche
2017-01-11 18:03           ` Bart Van Assche
2017-01-11 18:03           ` [OpenRISC] " Bart Van Assche
2017-01-11 18:03           ` Bart Van Assche
2017-01-11 18:03           ` Bart Van Assche
2017-01-11 18:03           ` Bart Van Assche
2017-01-11 18:03           ` Bart Van Assche
2017-01-11 18:03           ` Bart Van Assche
     [not found]           ` <1484157772.2619.12.camel-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2017-01-11 20:29             ` gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r
2017-01-11 20:29               ` [OpenRISC] " gregkh
2017-01-11 20:29               ` gregkh
2017-01-11 20:29               ` gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r
2017-01-11 20:29               ` gregkh
2017-01-11 20:29               ` gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r
2017-01-11  6:48     ` Greg Kroah-Hartman
2017-01-11  6:48       ` [OpenRISC] " Greg Kroah-Hartman
2017-01-11  6:48       ` Greg Kroah-Hartman
2017-01-11  6:48       ` Greg Kroah-Hartman
2017-01-11  6:48       ` Greg Kroah-Hartman
     [not found]       ` <20170111064803.GB26893-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2017-01-11 18:17         ` Bart Van Assche
2017-01-11 18:17           ` Bart Van Assche
2017-01-11 18:17           ` [OpenRISC] " Bart Van Assche
2017-01-11 18:17           ` Bart Van Assche
2017-01-11 18:17           ` Bart Van Assche
2017-01-11 18:17           ` Bart Van Assche
2017-01-11 18:17           ` Bart Van Assche
2017-01-11 18:17           ` Bart Van Assche
     [not found]           ` <1484158589.2619.14.camel-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2017-01-11 20:31             ` gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r
2017-01-11 20:31               ` [OpenRISC] " gregkh
2017-01-11 20:31               ` gregkh
2017-01-11 20:31               ` gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r
2017-01-11 20:31               ` gregkh
2017-01-11 20:31               ` gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r
     [not found]               ` <20170111203100.GB17895-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2017-01-11 22:28                 ` Bart Van Assche
2017-01-11 22:28                   ` [OpenRISC] " Bart Van Assche
2017-01-11 22:28                   ` Bart Van Assche
2017-01-11 22:28                   ` Bart Van Assche
2017-01-11 22:28                   ` Bart Van Assche
2017-01-11 22:28                   ` Bart Van Assche
     [not found]                   ` <1484173670.2619.28.camel-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2017-01-12  7:35                     ` gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r
2017-01-12  7:35                       ` [OpenRISC] " gregkh
2017-01-12  7:35                       ` gregkh
2017-01-12  7:35                       ` gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r
2017-01-12  7:35                       ` gregkh
2017-01-12  7:35                       ` gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r
2017-01-11  0:56 ` Bart Van Assche [this message]
2017-01-11  0:56   ` [PATCH 3/9] dma: Add dma_virt_ops Bart Van Assche
2017-01-11  8:56   ` Christoph Hellwig
     [not found]     ` <20170111085625.GA15575-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2017-01-12  0:07       ` Bart Van Assche
2017-01-12  0:07         ` Bart Van Assche
     [not found] ` <20170111005648.14988-1-bart.vanassche-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2017-01-11  0:56   ` [PATCH 4/9] IB/hf1: Remove DMA mapping code Bart Van Assche
2017-01-11  0:56     ` Bart Van Assche
2017-01-11  1:28   ` [PATCH 0/9] IB: Optimize DMA mapping santosh.shilimkar-QHcLZuEGTsvQT0dZR+AlfA
2017-01-11  1:28     ` santosh.shilimkar
2017-01-11  0:56 ` [PATCH 5/9] IB/qib: Remove DMA mapping code Bart Van Assche
2017-01-11  0:56   ` Bart Van Assche
2017-01-12 13:15   ` Leon Romanovsky
2017-01-11  0:56 ` [PATCH 6/9] IB: Use dma_virt_ops instead of duplicating it Bart Van Assche
2017-01-11  0:56   ` Bart Van Assche
     [not found]   ` <20170111005648.14988-7-bart.vanassche-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2017-01-12 13:17     ` Leon Romanovsky
2017-01-12 13:17       ` Leon Romanovsky
2017-01-11  0:56 ` [PATCH 7/9] RDS: IB: Remove an unused structure member Bart Van Assche
2017-01-11  0:56   ` Bart Van Assche
     [not found]   ` <20170111005648.14988-8-bart.vanassche-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2017-01-11  1:21     ` santosh.shilimkar-QHcLZuEGTsvQT0dZR+AlfA
2017-01-11  1:21       ` santosh.shilimkar
2017-01-11  0:56 ` [PATCH 8/9] IB: Convert ib_dma_*_coherent() argument type from u64 into dma_addr_t Bart Van Assche
2017-01-11  0:56   ` Bart Van Assche
     [not found]   ` <20170111005648.14988-9-bart.vanassche-XdAiOPVOjttBDgjK7y7TUQ@public.gmane.org>
2017-01-12 13:12     ` Leon Romanovsky
2017-01-12 13:12       ` Leon Romanovsky
2017-01-11  0:56 ` [PATCH 9/9] treewide: Inline ib_dma_map_*() functions Bart Van Assche
2017-01-11  0:56   ` Bart Van Assche
2017-01-11  0:56   ` [lustre-devel] " Bart Van Assche
2017-01-11  0:56   ` Bart Van Assche
2017-01-12 11:45   ` Sagi Grimberg
2017-01-12 11:45     ` [lustre-devel] " Sagi Grimberg
2017-01-12 11:45     ` Sagi Grimberg
2017-01-12 11:45     ` Sagi Grimberg
2017-01-12 13:09   ` Leon Romanovsky
2017-01-12 13:09     ` [lustre-devel] " Leon Romanovsky
2017-01-12 13:09     ` Leon Romanovsky
2017-01-12 13:09     ` Leon Romanovsky

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=20170111005648.14988-4-bart.vanassche@sandisk.com \
    --to=bart.vanassche@sandisk.com \
    --cc=borntraeger@de.ibm.com \
    --cc=dledford@redhat.com \
    --cc=jroedel@suse.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rdma@vger.kernel.org \
    --cc=luto@kernel.org \
    --cc=mst@redhat.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: link
Be 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.