1 /*- 2 * Copyright (c) 2011-2012 Semihalf. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD$ 27 */ 28 29 #ifndef _BMAN_H 30 #define _BMAN_H 31 32 #include <machine/vmparam.h> 33 34 #include <contrib/ncsw/inc/Peripherals/bm_ext.h> 35 36 /* 37 * BMAN Configuration 38 */ 39 40 /* Maximum number of buffers in all BMAN pools */ 41 #define BMAN_MAX_BUFFERS 4096 42 43 /* 44 * Portal definitions 45 */ 46 #define BMAN_CE_PA(base) (base) 47 #define BMAN_CI_PA(base) ((base) + 0x100000) 48 49 #define BMAN_PORTAL_CE_PA(base, n) \ 50 (BMAN_CE_PA(base) + ((n) * BMAN_PORTAL_CE_SIZE)) 51 #define BMAN_PORTAL_CI_PA(base, n) \ 52 (BMAN_CI_PA(base) + ((n) * BMAN_PORTAL_CI_SIZE)) 53 54 #define BMAN_CCSR_SIZE 0x1000 55 56 struct bman_softc { 57 device_t sc_dev; /* device handle */ 58 int sc_rrid; /* register rid */ 59 struct resource *sc_rres; /* register resource */ 60 int sc_irid; /* interrupt rid */ 61 struct resource *sc_ires; /* interrupt resource */ 62 63 bool sc_regs_mapped[MAXCPU]; /* register mapping status */ 64 65 t_Handle sc_bh; /* BMAN handle */ 66 t_Handle sc_bph[MAXCPU]; /* BMAN portal handles */ 67 vm_paddr_t sc_bp_pa; /* BMAN portals PA */ 68 unsigned int sc_bpool_cpu[BM_MAX_NUM_OF_POOLS]; 69 }; 70 71 /* 72 * External API 73 */ 74 75 /* 76 * @brief Function to create BMAN pool. 77 * 78 * @param bpid The pointer to variable where Buffer Pool ID will be 79 * stored. 80 * 81 * @param bufferSize The size of buffers in newly created pool. 82 * 83 * @param maxBuffers The maximum number of buffers in software stockpile. 84 * Set to 0 if software stockpile should not be created. 85 * 86 * @param minBuffers The minimum number of buffers in software stockpile. 87 * Set to 0 if software stockpile should not be created. 88 * 89 * @param allocBuffers The number of buffers to preallocate during pool 90 * creation. 91 * 92 * @param f_GetBuf The buffer allocating function. Called only by 93 * bman_pool_create() and bman_pool_fill(). 94 * 95 * @param f_PutBuf The buffer freeing function. Called only by 96 * bman_pool_destroy(). 97 * 98 * @param dep_sw_entry The software portal depletion entry threshold. 99 * Set to 0 if depletion should not be signaled on 100 * software portal. 101 * 102 * @param dep_sw_exit The software portal depletion exit threshold. 103 * Set to 0 if depletion should not be signaled on 104 * software portal. 105 * 106 * @param dep_hw_entry The hardware portal depletion entry threshold. 107 * Set to 0 if depletion should not be signaled on 108 * hardware portal. 109 * 110 * @param dep_hw_exit The hardware portal depletion exit threshold. 111 * Set to 0 if depletion should not be signaled on 112 * hardware portal. 113 * 114 * @param f_Depletion The software portal depletion notification function. 115 * Set to NULL if depletion notification is not used. 116 * 117 * @param h_BufferPool The user provided buffer pool context passed to 118 * f_GetBuf, f_PutBuf and f_Depletion functions. 119 * 120 * @param f_PhysToVirt The PA to VA translation function. Set to NULL if 121 * default one should be used. 122 * 123 * @param f_VirtToPhys The VA to PA translation function. Set to NULL if 124 * default one should be used. 125 * 126 * @returns Handle to newly created BMAN pool or NULL on error. 127 * 128 * @cautions If pool uses software stockpile, all accesses to given 129 * pool must be protected by lock. Even if only hardware 130 * portal depletion notification is used, the caller must 131 * provide valid @p f_Depletion function. 132 */ 133 t_Handle bman_pool_create(uint8_t *bpid, uint16_t bufferSize, 134 uint16_t maxBuffers, uint16_t minBuffers, uint16_t allocBuffers, 135 t_GetBufFunction *f_GetBuf, t_PutBufFunction *f_PutBuf, 136 uint32_t dep_sw_entry, uint32_t dep_sw_exit, uint32_t dep_hw_entry, 137 uint32_t dep_hw_exit, t_BmDepletionCallback *f_Depletion, 138 t_Handle h_BufferPool, t_PhysToVirt *f_PhysToVirt, 139 t_VirtToPhys *f_VirtToPhys); 140 141 /* 142 * @brief Fill pool with buffers. 143 * 144 * The bman_pool_fill() function fills the BMAN pool with buffers. The buffers 145 * are allocated through f_GetBuf function (see bman_pool_create() description). 146 * 147 * @param pool The BMAN pool handle. 148 * @param nbufs The number of buffers to allocate. To maximize 149 * performance this value should be multiple of 8. 150 * 151 * @returns Zero on success or error code on failure. 152 */ 153 int bman_pool_fill(t_Handle pool, uint16_t nbufs); 154 155 /* 156 * @brief Destroy pool. 157 * 158 * The bman_pool_destroy() function destroys the BMAN pool. Buffers for pool 159 * are free through f_PutBuf function (see bman_pool_create() description). 160 * 161 * @param pool The BMAN pool handle. 162 * 163 * @returns Zero on success or error code on failure. 164 */ 165 int bman_pool_destroy(t_Handle pool); 166 167 /* 168 * @brief Get a buffer from BMAN pool. 169 * 170 * @param pool The BMAN pool handle. 171 * 172 * @returns Pointer to the buffer or NULL if pool is empty. 173 */ 174 void *bman_get_buffer(t_Handle pool); 175 176 /* 177 * @brief Put a buffer to BMAN pool. 178 * 179 * @param pool The BMAN pool handle. 180 * @param buffer The pointer to buffer. 181 * 182 * @returns Zero on success or error code on failure. 183 */ 184 int bman_put_buffer(t_Handle pool, void *buffer); 185 186 /* 187 * @brief Count free buffers in given pool. 188 * 189 * @param pool The BMAN pool handle. 190 * 191 * @returns Number of free buffers in pool. 192 */ 193 uint32_t bman_count(t_Handle pool); 194 195 /* 196 * Bus i/f 197 */ 198 int bman_attach(device_t dev); 199 int bman_detach(device_t dev); 200 int bman_suspend(device_t dev); 201 int bman_resume(device_t dev); 202 int bman_shutdown(device_t dev); 203 204 #endif /* BMAN_H */ 205