1219820Sjeff/*- 2219820Sjeff * Copyright (c) 2010 Isilon Systems, Inc. 3219820Sjeff * Copyright (c) 2010 iX Systems, Inc. 4219820Sjeff * Copyright (c) 2010 Panasas, Inc. 5270710Shselasky * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd. 6219820Sjeff * All rights reserved. 7219820Sjeff * 8219820Sjeff * Redistribution and use in source and binary forms, with or without 9219820Sjeff * modification, are permitted provided that the following conditions 10219820Sjeff * are met: 11219820Sjeff * 1. Redistributions of source code must retain the above copyright 12219820Sjeff * notice unmodified, this list of conditions, and the following 13219820Sjeff * disclaimer. 14219820Sjeff * 2. Redistributions in binary form must reproduce the above copyright 15219820Sjeff * notice, this list of conditions and the following disclaimer in the 16219820Sjeff * documentation and/or other materials provided with the distribution. 17219820Sjeff * 18219820Sjeff * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19219820Sjeff * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20219820Sjeff * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21219820Sjeff * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22219820Sjeff * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23219820Sjeff * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24219820Sjeff * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25219820Sjeff * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26219820Sjeff * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27219820Sjeff * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28289644Shselasky * 29289644Shselasky * $FreeBSD: stable/11/sys/compat/linuxkpi/common/include/linux/dmapool.h 339987 2018-11-01 09:00:37Z hselasky $ 30219820Sjeff */ 31219820Sjeff#ifndef _LINUX_DMAPOOL_H_ 32219820Sjeff#define _LINUX_DMAPOOL_H_ 33219820Sjeff 34219820Sjeff#include <linux/types.h> 35219820Sjeff#include <linux/io.h> 36219820Sjeff#include <linux/scatterlist.h> 37219820Sjeff#include <linux/device.h> 38219820Sjeff#include <linux/slab.h> 39219820Sjeff 40219820Sjeffstruct dma_pool { 41219820Sjeff uma_zone_t pool_zone; 42219820Sjeff}; 43219820Sjeff 44219820Sjeffstatic inline struct dma_pool * 45219820Sjeffdma_pool_create(char *name, struct device *dev, size_t size, 46219820Sjeff size_t align, size_t boundary) 47219820Sjeff{ 48219820Sjeff struct dma_pool *pool; 49219820Sjeff 50219820Sjeff pool = kmalloc(sizeof(*pool), GFP_KERNEL); 51219820Sjeff align--; 52219820Sjeff /* 53298829Spfg * XXX Eventually this could use a separate allocf to honor boundary 54219820Sjeff * and physical address requirements of the device. 55219820Sjeff */ 56219820Sjeff pool->pool_zone = uma_zcreate(name, size, NULL, NULL, NULL, NULL, 57219820Sjeff align, UMA_ZONE_OFFPAGE|UMA_ZONE_HASH); 58219820Sjeff 59219820Sjeff return (pool); 60219820Sjeff} 61219820Sjeff 62219820Sjeffstatic inline void 63219820Sjeffdma_pool_destroy(struct dma_pool *pool) 64219820Sjeff{ 65219820Sjeff uma_zdestroy(pool->pool_zone); 66219820Sjeff kfree(pool); 67219820Sjeff} 68219820Sjeff 69219820Sjeffstatic inline void * 70219820Sjeffdma_pool_alloc(struct dma_pool *pool, gfp_t mem_flags, dma_addr_t *handle) 71219820Sjeff{ 72219820Sjeff void *vaddr; 73219820Sjeff 74219820Sjeff vaddr = uma_zalloc(pool->pool_zone, mem_flags); 75219820Sjeff if (vaddr) 76219820Sjeff *handle = vtophys(vaddr); 77219820Sjeff return (vaddr); 78219820Sjeff} 79219820Sjeff 80339987Shselaskystatic inline void * 81339987Shselaskydma_pool_zalloc(struct dma_pool *pool, gfp_t mem_flags, dma_addr_t *handle) 82339987Shselasky{ 83339987Shselasky 84339987Shselasky return (dma_pool_alloc(pool, mem_flags | __GFP_ZERO, handle)); 85339987Shselasky} 86339987Shselasky 87219820Sjeffstatic inline void 88219820Sjeffdma_pool_free(struct dma_pool *pool, void *vaddr, dma_addr_t addr) 89219820Sjeff{ 90219820Sjeff uma_zfree(pool->pool_zone, vaddr); 91219820Sjeff} 92219820Sjeff 93219820Sjeff 94219820Sjeff#endif /* _LINUX_DMAPOOL_H_ */ 95