/*- * Copyright (c) 2011-2012 Semihalf. * 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. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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$ */ #ifndef _BMAN_H #define _BMAN_H #include #include /* * BMAN Configuration */ /* Maximum number of buffers in all BMAN pools */ #define BMAN_MAX_BUFFERS 4096 /* * Portal definitions */ #define BMAN_CE_PA(base) (base) #define BMAN_CI_PA(base) ((base) + 0x100000) #define BMAN_PORTAL_CE_PA(base, n) \ (BMAN_CE_PA(base) + ((n) * BMAN_PORTAL_CE_SIZE)) #define BMAN_PORTAL_CI_PA(base, n) \ (BMAN_CI_PA(base) + ((n) * BMAN_PORTAL_CI_SIZE)) #define BMAN_CCSR_SIZE 0x1000 struct bman_softc { device_t sc_dev; /* device handle */ int sc_rrid; /* register rid */ struct resource *sc_rres; /* register resource */ int sc_irid; /* interrupt rid */ struct resource *sc_ires; /* interrupt resource */ bool sc_regs_mapped[MAXCPU]; /* register mapping status */ t_Handle sc_bh; /* BMAN handle */ t_Handle sc_bph[MAXCPU]; /* BMAN portal handles */ vm_paddr_t sc_bp_pa; /* BMAN portals PA */ unsigned int sc_bpool_cpu[BM_MAX_NUM_OF_POOLS]; }; /* * External API */ /* * @brief Function to create BMAN pool. * * @param bpid The pointer to variable where Buffer Pool ID will be * stored. * * @param bufferSize The size of buffers in newly created pool. * * @param maxBuffers The maximum number of buffers in software stockpile. * Set to 0 if software stockpile should not be created. * * @param minBuffers The minimum number of buffers in software stockpile. * Set to 0 if software stockpile should not be created. * * @param allocBuffers The number of buffers to preallocate during pool * creation. * * @param f_GetBuf The buffer allocating function. Called only by * bman_pool_create() and bman_pool_fill(). * * @param f_PutBuf The buffer freeing function. Called only by * bman_pool_destroy(). * * @param dep_sw_entry The software portal depletion entry threshold. * Set to 0 if depletion should not be signaled on * software portal. * * @param dep_sw_exit The software portal depletion exit threshold. * Set to 0 if depletion should not be signaled on * software portal. * * @param dep_hw_entry The hardware portal depletion entry threshold. * Set to 0 if depletion should not be signaled on * hardware portal. * * @param dep_hw_exit The hardware portal depletion exit threshold. * Set to 0 if depletion should not be signaled on * hardware portal. * * @param f_Depletion The software portal depletion notification function. * Set to NULL if depletion notification is not used. * * @param h_BufferPool The user provided buffer pool context passed to * f_GetBuf, f_PutBuf and f_Depletion functions. * * @param f_PhysToVirt The PA to VA translation function. Set to NULL if * default one should be used. * * @param f_VirtToPhys The VA to PA translation function. Set to NULL if * default one should be used. * * @returns Handle to newly created BMAN pool or NULL on error. * * @cautions If pool uses software stockpile, all accesses to given * pool must be protected by lock. Even if only hardware * portal depletion notification is used, the caller must * provide valid @p f_Depletion function. */ t_Handle bman_pool_create(uint8_t *bpid, uint16_t bufferSize, uint16_t maxBuffers, uint16_t minBuffers, uint16_t allocBuffers, t_GetBufFunction *f_GetBuf, t_PutBufFunction *f_PutBuf, uint32_t dep_sw_entry, uint32_t dep_sw_exit, uint32_t dep_hw_entry, uint32_t dep_hw_exit, t_BmDepletionCallback *f_Depletion, t_Handle h_BufferPool, t_PhysToVirt *f_PhysToVirt, t_VirtToPhys *f_VirtToPhys); /* * @brief Fill pool with buffers. * * The bman_pool_fill() function fills the BMAN pool with buffers. The buffers * are allocated through f_GetBuf function (see bman_pool_create() description). * * @param pool The BMAN pool handle. * @param nbufs The number of buffers to allocate. To maximize * performance this value should be multiple of 8. * * @returns Zero on success or error code on failure. */ int bman_pool_fill(t_Handle pool, uint16_t nbufs); /* * @brief Destroy pool. * * The bman_pool_destroy() function destroys the BMAN pool. Buffers for pool * are free through f_PutBuf function (see bman_pool_create() description). * * @param pool The BMAN pool handle. * * @returns Zero on success or error code on failure. */ int bman_pool_destroy(t_Handle pool); /* * @brief Get a buffer from BMAN pool. * * @param pool The BMAN pool handle. * * @returns Pointer to the buffer or NULL if pool is empty. */ void *bman_get_buffer(t_Handle pool); /* * @brief Put a buffer to BMAN pool. * * @param pool The BMAN pool handle. * @param buffer The pointer to buffer. * * @returns Zero on success or error code on failure. */ int bman_put_buffer(t_Handle pool, void *buffer); /* * @brief Count free buffers in given pool. * * @param pool The BMAN pool handle. * * @returns Number of free buffers in pool. */ uint32_t bman_count(t_Handle pool); /* * Bus i/f */ int bman_attach(device_t dev); int bman_detach(device_t dev); int bman_suspend(device_t dev); int bman_resume(device_t dev); int bman_shutdown(device_t dev); #endif /* BMAN_H */