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 27 #ifndef _BMAN_H 28 #define _BMAN_H 29 30 #include <machine/vmparam.h> 31 32 #include <contrib/ncsw/inc/Peripherals/bm_ext.h> 33 34 /* 35 * BMAN Configuration 36 */ 37 38 /* Maximum number of buffers in all BMAN pools */ 39 #define BMAN_MAX_BUFFERS 4096 40 41 /* 42 * Portal definitions 43 */ 44 #define BMAN_CE_PA(base) (base) 45 #define BMAN_CI_PA(base) ((base) + 0x100000) 46 47 #define BMAN_PORTAL_CE_PA(base, n) \ 48 (BMAN_CE_PA(base) + ((n) * BMAN_PORTAL_CE_SIZE)) 49 #define BMAN_PORTAL_CI_PA(base, n) \ 50 (BMAN_CI_PA(base) + ((n) * BMAN_PORTAL_CI_SIZE)) 51 52 #define BMAN_CCSR_SIZE 0x1000 53 54 struct bman_softc { 55 device_t sc_dev; /* device handle */ 56 int sc_rrid; /* register rid */ 57 struct resource *sc_rres; /* register resource */ 58 int sc_irid; /* interrupt rid */ 59 struct resource *sc_ires; /* interrupt resource */ 60 61 bool sc_regs_mapped[MAXCPU]; /* register mapping status */ 62 63 t_Handle sc_bh; /* BMAN handle */ 64 t_Handle sc_bph[MAXCPU]; /* BMAN portal handles */ 65 vm_paddr_t sc_bp_pa; /* BMAN portals PA */ 66 unsigned int sc_bpool_cpu[BM_MAX_NUM_OF_POOLS]; 67 }; 68 69 /* 70 * External API 71 */ 72 73 /* 74 * @brief Function to create BMAN pool. 75 * 76 * @param bpid The pointer to variable where Buffer Pool ID will be 77 * stored. 78 * 79 * @param bufferSize The size of buffers in newly created pool. 80 * 81 * @param maxBuffers The maximum number of buffers in software stockpile. 82 * Set to 0 if software stockpile should not be created. 83 * 84 * @param minBuffers The minimum number of buffers in software stockpile. 85 * Set to 0 if software stockpile should not be created. 86 * 87 * @param allocBuffers The number of buffers to preallocate during pool 88 * creation. 89 * 90 * @param f_GetBuf The buffer allocating function. Called only by 91 * bman_pool_create() and bman_pool_fill(). 92 * 93 * @param f_PutBuf The buffer freeing function. Called only by 94 * bman_pool_destroy(). 95 * 96 * @param dep_sw_entry The software portal depletion entry threshold. 97 * Set to 0 if depletion should not be signaled on 98 * software portal. 99 * 100 * @param dep_sw_exit The software portal depletion exit threshold. 101 * Set to 0 if depletion should not be signaled on 102 * software portal. 103 * 104 * @param dep_hw_entry The hardware portal depletion entry threshold. 105 * Set to 0 if depletion should not be signaled on 106 * hardware portal. 107 * 108 * @param dep_hw_exit The hardware portal depletion exit threshold. 109 * Set to 0 if depletion should not be signaled on 110 * hardware portal. 111 * 112 * @param f_Depletion The software portal depletion notification function. 113 * Set to NULL if depletion notification is not used. 114 * 115 * @param h_BufferPool The user provided buffer pool context passed to 116 * f_GetBuf, f_PutBuf and f_Depletion functions. 117 * 118 * @param f_PhysToVirt The PA to VA translation function. Set to NULL if 119 * default one should be used. 120 * 121 * @param f_VirtToPhys The VA to PA translation function. Set to NULL if 122 * default one should be used. 123 * 124 * @returns Handle to newly created BMAN pool or NULL on error. 125 * 126 * @cautions If pool uses software stockpile, all accesses to given 127 * pool must be protected by lock. Even if only hardware 128 * portal depletion notification is used, the caller must 129 * provide valid @p f_Depletion function. 130 */ 131 t_Handle bman_pool_create(uint8_t *bpid, uint16_t bufferSize, 132 uint16_t maxBuffers, uint16_t minBuffers, uint16_t allocBuffers, 133 t_GetBufFunction *f_GetBuf, t_PutBufFunction *f_PutBuf, 134 uint32_t dep_sw_entry, uint32_t dep_sw_exit, uint32_t dep_hw_entry, 135 uint32_t dep_hw_exit, t_BmDepletionCallback *f_Depletion, 136 t_Handle h_BufferPool, t_PhysToVirt *f_PhysToVirt, 137 t_VirtToPhys *f_VirtToPhys); 138 139 /* 140 * @brief Fill pool with buffers. 141 * 142 * The bman_pool_fill() function fills the BMAN pool with buffers. The buffers 143 * are allocated through f_GetBuf function (see bman_pool_create() description). 144 * 145 * @param pool The BMAN pool handle. 146 * @param nbufs The number of buffers to allocate. To maximize 147 * performance this value should be multiple of 8. 148 * 149 * @returns Zero on success or error code on failure. 150 */ 151 int bman_pool_fill(t_Handle pool, uint16_t nbufs); 152 153 /* 154 * @brief Destroy pool. 155 * 156 * The bman_pool_destroy() function destroys the BMAN pool. Buffers for pool 157 * are free through f_PutBuf function (see bman_pool_create() description). 158 * 159 * @param pool The BMAN pool handle. 160 * 161 * @returns Zero on success or error code on failure. 162 */ 163 int bman_pool_destroy(t_Handle pool); 164 165 /* 166 * @brief Get a buffer from BMAN pool. 167 * 168 * @param pool The BMAN pool handle. 169 * 170 * @returns Pointer to the buffer or NULL if pool is empty. 171 */ 172 void *bman_get_buffer(t_Handle pool); 173 174 /* 175 * @brief Put a buffer to BMAN pool. 176 * 177 * @param pool The BMAN pool handle. 178 * @param buffer The pointer to buffer. 179 * 180 * @returns Zero on success or error code on failure. 181 */ 182 int bman_put_buffer(t_Handle pool, void *buffer); 183 184 /* 185 * @brief Count free buffers in given pool. 186 * 187 * @param pool The BMAN pool handle. 188 * 189 * @returns Number of free buffers in pool. 190 */ 191 uint32_t bman_count(t_Handle pool); 192 193 /* 194 * Bus i/f 195 */ 196 int bman_attach(device_t dev); 197 int bman_detach(device_t dev); 198 int bman_suspend(device_t dev); 199 int bman_resume(device_t dev); 200 int bman_shutdown(device_t dev); 201 202 #endif /* BMAN_H */ 203