diff options
Diffstat (limited to 'sys/dev/i40e/i40e_osdep.c')
-rwxr-xr-x | sys/dev/i40e/i40e_osdep.c | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/sys/dev/i40e/i40e_osdep.c b/sys/dev/i40e/i40e_osdep.c new file mode 100755 index 0000000..e55d734 --- /dev/null +++ b/sys/dev/i40e/i40e_osdep.c @@ -0,0 +1,198 @@ +/****************************************************************************** + + Copyright (c) 2013-2014, Intel Corporation + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + 3. Neither the name of the Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +******************************************************************************/ +/*$FreeBSD$*/ + +#include <machine/stdarg.h> + +#include "i40e.h" + +/******************************************************************** + * Manage DMA'able memory. + *******************************************************************/ +static void +i40e_dmamap_cb(void *arg, bus_dma_segment_t * segs, int nseg, int error) +{ + if (error) + return; + *(bus_addr_t *) arg = segs->ds_addr; + return; +} + +i40e_status +i40e_allocate_virt(struct i40e_hw *hw, struct i40e_virt_mem *m, u32 size) +{ + m->va = malloc(size, M_DEVBUF, M_NOWAIT | M_ZERO); + return(m->va == NULL); +} + +i40e_status +i40e_free_virt(struct i40e_hw *hw, struct i40e_virt_mem *m) +{ + free(m->va, M_DEVBUF); + return(0); +} + +i40e_status +i40e_allocate_dma(struct i40e_hw *hw, struct i40e_dma_mem *dma, + bus_size_t size, u32 alignment) +{ + device_t dev = ((struct i40e_osdep *)hw->back)->dev; + int err; + + + err = bus_dma_tag_create(bus_get_dma_tag(dev), /* parent */ + alignment, 0, /* alignment, bounds */ + BUS_SPACE_MAXADDR, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + size, /* maxsize */ + 1, /* nsegments */ + size, /* maxsegsize */ + BUS_DMA_ALLOCNOW, /* flags */ + NULL, /* lockfunc */ + NULL, /* lockfuncarg */ + &dma->tag); + if (err != 0) { + device_printf(dev, + "i40e_allocate_dma: bus_dma_tag_create failed, " + "error %u\n", err); + goto fail_0; + } + err = bus_dmamem_alloc(dma->tag, (void **)&dma->va, + BUS_DMA_NOWAIT | M_ZERO, &dma->map); + if (err != 0) { + device_printf(dev, + "i40e_allocate_dma: bus_dmamem_alloc failed, " + "error %u\n", err); + goto fail_1; + } + err = bus_dmamap_load(dma->tag, dma->map, dma->va, + size, + i40e_dmamap_cb, + &dma->pa, + BUS_DMA_NOWAIT); + if (err != 0) { + device_printf(dev, + "i40e_allocate_dma: bus_dmamap_load failed, " + "error %u\n", err); + goto fail_2; + } + dma->size = size; + bus_dmamap_sync(dma->tag, dma->map, + BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); + return (0); +fail_2: + bus_dmamem_free(dma->tag, dma->va, dma->map); +fail_1: + bus_dma_tag_destroy(dma->tag); +fail_0: + dma->map = NULL; + dma->tag = NULL; + return (err); +} + +i40e_status +i40e_free_dma(struct i40e_hw *hw, struct i40e_dma_mem *dma) +{ + bus_dmamap_sync(dma->tag, dma->map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(dma->tag, dma->map); + bus_dmamem_free(dma->tag, dma->va, dma->map); + bus_dma_tag_destroy(dma->tag); + return (0); +} + +void +i40e_init_spinlock(struct i40e_spinlock *lock) +{ + mtx_init(&lock->mutex, "mutex", + MTX_NETWORK_LOCK, MTX_DEF | MTX_DUPOK); +} + +void +i40e_acquire_spinlock(struct i40e_spinlock *lock) +{ + mtx_lock(&lock->mutex); +} + +void +i40e_release_spinlock(struct i40e_spinlock *lock) +{ + mtx_unlock(&lock->mutex); +} + +void +i40e_destroy_spinlock(struct i40e_spinlock *lock) +{ + mtx_destroy(&lock->mutex); +} + +/* +** i40e_debug_d - OS dependent version of shared code debug printing +*/ +void i40e_debug_d(void *hw, u32 mask, char *fmt, ...) +{ + char buf[512]; + va_list args; + + if (!(mask & ((struct i40e_hw *)hw)->debug_mask)) + return; + + va_start(args, fmt); + vsnprintf(buf, sizeof(buf), fmt, args); + va_end(args); + + /* the debug string is already formatted with a newline */ + printf("%s", buf); +} + +u16 +i40e_read_pci_cfg(struct i40e_hw *hw, u32 reg) +{ + u16 value; + + value = pci_read_config(((struct i40e_osdep *)hw->back)->dev, + reg, 2); + + return (value); +} + +void +i40e_write_pci_cfg(struct i40e_hw *hw, u32 reg, u16 value) +{ + pci_write_config(((struct i40e_osdep *)hw->back)->dev, + reg, value, 2); + + return; +} + |