svn commit: r210139 - projects/ofed/head/sys/ofed/include/linux
Jeff Roberson
jeff at FreeBSD.org
Thu Jul 15 21:44:27 UTC 2010
Author: jeff
Date: Thu Jul 15 21:44:26 2010
New Revision: 210139
URL: http://svn.freebsd.org/changeset/base/210139
Log:
- Add a dma pool implementation which simply uses uma. This is not fully
compatible with the linux implementation but satisfies the needs of
existing consumers. Any further requirements can be met by using
contigmalloc as the backing for the zone.
Sponsored by: Isilon Systems, iX Systems, and Panasas.
Modified:
projects/ofed/head/sys/ofed/include/linux/dmapool.h
Modified: projects/ofed/head/sys/ofed/include/linux/dmapool.h
==============================================================================
--- projects/ofed/head/sys/ofed/include/linux/dmapool.h Thu Jul 15 20:24:37 2010 (r210138)
+++ projects/ofed/head/sys/ofed/include/linux/dmapool.h Thu Jul 15 21:44:26 2010 (r210139)
@@ -29,15 +29,57 @@
#ifndef _LINUX_DMAPOOL_H_
#define _LINUX_DMAPOOL_H_
+#include <linux/types.h>
#include <linux/io.h>
#include <linux/scatterlist.h>
#include <linux/device.h>
+#include <linux/slab.h>
+
+struct dma_pool {
+ uma_zone_t pool_zone;
+};
+
+static inline struct dma_pool *
+dma_pool_create(char *name, struct linux_device *dev, size_t size,
+ size_t align, size_t boundary)
+{
+ struct dma_pool *pool;
+
+ pool = kmalloc(sizeof(*pool), GFP_KERNEL);
+ align--;
+ /*
+ * XXX Eventually this could use a seperate allocf to honor boundary
+ * and physical address requirements of the device.
+ */
+ pool->pool_zone = uma_zcreate(name, size, NULL, NULL, NULL, NULL,
+ align, UMA_ZONE_OFFPAGE);
+
+ return (pool);
+}
+
+static inline void
+dma_pool_destroy(struct dma_pool *pool)
+{
+ uma_zdestroy(pool->pool_zone);
+ kfree(pool);
+}
+
+static inline void *
+dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags, dma_addr_t *handle)
+{
+ void *vaddr;
+
+ vaddr = uma_zalloc(pool->pool_zone, mem_flags);
+ if (vaddr)
+ *handle = vtophys(vaddr);
+ return (vaddr);
+}
+
+static inline void
+dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t addr)
+{
+ uma_zfree(pool->pool_zone, vaddr);
+}
-struct dma_pool *dma_pool_create(const char *name, struct linux_device *dev,
- size_t size, size_t align, size_t allocation);
-void dma_pool_destroy(struct dma_pool *pool);
-void *dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags,
- dma_addr_t *handle);
-void dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t addr);
#endif /* _LINUX_DMAPOOL_H_ */
More information about the svn-src-projects
mailing list