Changeset View
Changeset View
Standalone View
Standalone View
head/sys/compat/linuxkpi/common/include/linux/dmapool.h
Show All 31 Lines | |||||
#define _LINUX_DMAPOOL_H_ | #define _LINUX_DMAPOOL_H_ | ||||
#include <linux/types.h> | #include <linux/types.h> | ||||
#include <linux/io.h> | #include <linux/io.h> | ||||
#include <linux/scatterlist.h> | #include <linux/scatterlist.h> | ||||
#include <linux/device.h> | #include <linux/device.h> | ||||
#include <linux/slab.h> | #include <linux/slab.h> | ||||
struct dma_pool *linux_dma_pool_create(char *name, struct device *dev, | |||||
size_t size, size_t align, size_t boundary); | |||||
void linux_dma_pool_destroy(struct dma_pool *pool); | |||||
void *linux_dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags, | |||||
dma_addr_t *handle); | |||||
void linux_dma_pool_free(struct dma_pool *pool, void *vaddr, | |||||
dma_addr_t dma_addr); | |||||
struct dma_pool { | struct dma_pool { | ||||
struct pci_dev *pool_pdev; | |||||
uma_zone_t pool_zone; | uma_zone_t pool_zone; | ||||
struct mtx pool_dma_lock; | |||||
bus_dma_tag_t pool_dmat; | |||||
size_t pool_entry_size; | |||||
struct mtx pool_ptree_lock; | |||||
struct pctrie pool_ptree; | |||||
}; | }; | ||||
static inline struct dma_pool * | static inline struct dma_pool * | ||||
dma_pool_create(char *name, struct device *dev, size_t size, | dma_pool_create(char *name, struct device *dev, size_t size, | ||||
size_t align, size_t boundary) | size_t align, size_t boundary) | ||||
{ | { | ||||
struct dma_pool *pool; | |||||
pool = kmalloc(sizeof(*pool), GFP_KERNEL); | return (linux_dma_pool_create(name, dev, size, align, boundary)); | ||||
align--; | |||||
/* | |||||
* XXX Eventually this could use a separate 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|UMA_ZONE_HASH); | |||||
return (pool); | |||||
} | } | ||||
static inline void | static inline void | ||||
dma_pool_destroy(struct dma_pool *pool) | dma_pool_destroy(struct dma_pool *pool) | ||||
{ | { | ||||
uma_zdestroy(pool->pool_zone); | |||||
kfree(pool); | linux_dma_pool_destroy(pool); | ||||
} | } | ||||
static inline void * | static inline void * | ||||
dma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags, dma_addr_t *handle) | 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); | return (linux_dma_pool_alloc(pool, mem_flags, handle)); | ||||
if (vaddr) | |||||
*handle = vtophys(vaddr); | |||||
return (vaddr); | |||||
} | } | ||||
static inline void * | static inline void * | ||||
dma_pool_zalloc(struct dma_pool *pool, gfp_t mem_flags, dma_addr_t *handle) | dma_pool_zalloc(struct dma_pool *pool, gfp_t mem_flags, dma_addr_t *handle) | ||||
{ | { | ||||
return (dma_pool_alloc(pool, mem_flags | __GFP_ZERO, handle)); | return (dma_pool_alloc(pool, mem_flags | __GFP_ZERO, handle)); | ||||
} | } | ||||
static inline void | static inline void | ||||
dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t addr) | dma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t dma_addr) | ||||
{ | { | ||||
uma_zfree(pool->pool_zone, vaddr); | |||||
linux_dma_pool_free(pool, vaddr, dma_addr); | |||||
} | } | ||||
#endif /* _LINUX_DMAPOOL_H_ */ | #endif /* _LINUX_DMAPOOL_H_ */ |