1*0aeed3e9SJustin Hibbits /****************************************************************************** 2*0aeed3e9SJustin Hibbits 3*0aeed3e9SJustin Hibbits � 1995-2003, 2004, 2005-2011 Freescale Semiconductor, Inc. 4*0aeed3e9SJustin Hibbits All rights reserved. 5*0aeed3e9SJustin Hibbits 6*0aeed3e9SJustin Hibbits This is proprietary source code of Freescale Semiconductor Inc., 7*0aeed3e9SJustin Hibbits and its use is subject to the NetComm Device Drivers EULA. 8*0aeed3e9SJustin Hibbits The copyright notice above does not evidence any actual or intended 9*0aeed3e9SJustin Hibbits publication of such source code. 10*0aeed3e9SJustin Hibbits 11*0aeed3e9SJustin Hibbits ALTERNATIVELY, redistribution and use in source and binary forms, with 12*0aeed3e9SJustin Hibbits or without modification, are permitted provided that the following 13*0aeed3e9SJustin Hibbits conditions are met: 14*0aeed3e9SJustin Hibbits * Redistributions of source code must retain the above copyright 15*0aeed3e9SJustin Hibbits notice, this list of conditions and the following disclaimer. 16*0aeed3e9SJustin Hibbits * Redistributions in binary form must reproduce the above copyright 17*0aeed3e9SJustin Hibbits notice, this list of conditions and the following disclaimer in the 18*0aeed3e9SJustin Hibbits documentation and/or other materials provided with the distribution. 19*0aeed3e9SJustin Hibbits * Neither the name of Freescale Semiconductor nor the 20*0aeed3e9SJustin Hibbits names of its contributors may be used to endorse or promote products 21*0aeed3e9SJustin Hibbits derived from this software without specific prior written permission. 22*0aeed3e9SJustin Hibbits 23*0aeed3e9SJustin Hibbits THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY 24*0aeed3e9SJustin Hibbits EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 25*0aeed3e9SJustin Hibbits WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 26*0aeed3e9SJustin Hibbits DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY 27*0aeed3e9SJustin Hibbits DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 28*0aeed3e9SJustin Hibbits (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 29*0aeed3e9SJustin Hibbits LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 30*0aeed3e9SJustin Hibbits ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31*0aeed3e9SJustin Hibbits (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 32*0aeed3e9SJustin Hibbits SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33*0aeed3e9SJustin Hibbits * 34*0aeed3e9SJustin Hibbits 35*0aeed3e9SJustin Hibbits **************************************************************************/ 36*0aeed3e9SJustin Hibbits /****************************************************************************** 37*0aeed3e9SJustin Hibbits @File bm.c 38*0aeed3e9SJustin Hibbits 39*0aeed3e9SJustin Hibbits @Description BM 40*0aeed3e9SJustin Hibbits *//***************************************************************************/ 41*0aeed3e9SJustin Hibbits #include "error_ext.h" 42*0aeed3e9SJustin Hibbits #include "std_ext.h" 43*0aeed3e9SJustin Hibbits #include "string_ext.h" 44*0aeed3e9SJustin Hibbits #include "mem_ext.h" 45*0aeed3e9SJustin Hibbits #include "core_ext.h" 46*0aeed3e9SJustin Hibbits 47*0aeed3e9SJustin Hibbits #include "bm.h" 48*0aeed3e9SJustin Hibbits 49*0aeed3e9SJustin Hibbits 50*0aeed3e9SJustin Hibbits #define __ERR_MODULE__ MODULE_BM 51*0aeed3e9SJustin Hibbits 52*0aeed3e9SJustin Hibbits 53*0aeed3e9SJustin Hibbits /****************************************/ 54*0aeed3e9SJustin Hibbits /* static functions */ 55*0aeed3e9SJustin Hibbits /****************************************/ 56*0aeed3e9SJustin Hibbits 57*0aeed3e9SJustin Hibbits /* (De)Registration of depletion notification callbacks */ 58*0aeed3e9SJustin Hibbits static void depletion_link(t_BmPool *p_BmPool) 59*0aeed3e9SJustin Hibbits { 60*0aeed3e9SJustin Hibbits t_BmPortal *p_Portal = (t_BmPortal *)p_BmPool->h_BmPortal; 61*0aeed3e9SJustin Hibbits 62*0aeed3e9SJustin Hibbits NCSW_PLOCK(p_Portal); 63*0aeed3e9SJustin Hibbits p_Portal->depletionPoolsTable[p_BmPool->bpid] = p_BmPool; 64*0aeed3e9SJustin Hibbits bm_isr_bscn_mask(p_Portal->p_BmPortalLow, (uint8_t)p_BmPool->bpid, 1); 65*0aeed3e9SJustin Hibbits PUNLOCK(p_Portal); 66*0aeed3e9SJustin Hibbits } 67*0aeed3e9SJustin Hibbits 68*0aeed3e9SJustin Hibbits static void depletion_unlink(t_BmPool *p_BmPool) 69*0aeed3e9SJustin Hibbits { 70*0aeed3e9SJustin Hibbits t_BmPortal *p_Portal = (t_BmPortal *)p_BmPool->h_BmPortal; 71*0aeed3e9SJustin Hibbits 72*0aeed3e9SJustin Hibbits NCSW_PLOCK(p_Portal); 73*0aeed3e9SJustin Hibbits p_Portal->depletionPoolsTable[p_BmPool->bpid] = NULL; 74*0aeed3e9SJustin Hibbits bm_isr_bscn_mask(p_Portal->p_BmPortalLow, (uint8_t)p_BmPool->bpid, 0); 75*0aeed3e9SJustin Hibbits PUNLOCK(p_Portal); 76*0aeed3e9SJustin Hibbits } 77*0aeed3e9SJustin Hibbits 78*0aeed3e9SJustin Hibbits static t_Error BmPoolRelease(t_BmPool *p_BmPool, 79*0aeed3e9SJustin Hibbits t_Handle h_BmPortal, 80*0aeed3e9SJustin Hibbits struct bm_buffer *bufs, 81*0aeed3e9SJustin Hibbits uint8_t num, 82*0aeed3e9SJustin Hibbits uint32_t flags) 83*0aeed3e9SJustin Hibbits { 84*0aeed3e9SJustin Hibbits ASSERT_COND(num && (num <= 8)); 85*0aeed3e9SJustin Hibbits if (p_BmPool->flags & BMAN_POOL_FLAG_NO_RELEASE) 86*0aeed3e9SJustin Hibbits return ERROR_CODE(E_INVALID_VALUE); 87*0aeed3e9SJustin Hibbits 88*0aeed3e9SJustin Hibbits /* Without stockpile, this API is a pass-through to the h/w operation */ 89*0aeed3e9SJustin Hibbits if (!(p_BmPool->flags & BMAN_POOL_FLAG_STOCKPILE)) 90*0aeed3e9SJustin Hibbits return BmPortalRelease(h_BmPortal, p_BmPool->bpid, bufs, num, flags); 91*0aeed3e9SJustin Hibbits 92*0aeed3e9SJustin Hibbits /* This needs some explanation. Adding the given buffers may take the 93*0aeed3e9SJustin Hibbits * stockpile over the threshold, but in fact the stockpile may already 94*0aeed3e9SJustin Hibbits * *be* over the threshold if a previous release-to-hw attempt had 95*0aeed3e9SJustin Hibbits * failed. So we have 3 cases to cover; 96*0aeed3e9SJustin Hibbits * 1. we add to the stockpile and don't hit the threshold, 97*0aeed3e9SJustin Hibbits * 2. we add to the stockpile, hit the threshold and release-to-hw, 98*0aeed3e9SJustin Hibbits * 3. we have to release-to-hw before adding to the stockpile 99*0aeed3e9SJustin Hibbits * (not enough room in the stockpile for case 2). 100*0aeed3e9SJustin Hibbits * Our constraints on thresholds guarantee that in case 3, there must be 101*0aeed3e9SJustin Hibbits * at least 8 bufs already in the stockpile, so all release-to-hw ops 102*0aeed3e9SJustin Hibbits * are for 8 bufs. Despite all this, the API must indicate whether the 103*0aeed3e9SJustin Hibbits * given buffers were taken off the caller's hands, irrespective of 104*0aeed3e9SJustin Hibbits * whether a release-to-hw was attempted. */ 105*0aeed3e9SJustin Hibbits while (num) 106*0aeed3e9SJustin Hibbits { 107*0aeed3e9SJustin Hibbits /* Add buffers to stockpile if they fit */ 108*0aeed3e9SJustin Hibbits if ((p_BmPool->spFill + num) <= p_BmPool->spMaxBufs) 109*0aeed3e9SJustin Hibbits { 110*0aeed3e9SJustin Hibbits memcpy(PTR_MOVE(p_BmPool->sp, sizeof(struct bm_buffer) * (p_BmPool->spFill)), 111*0aeed3e9SJustin Hibbits bufs, 112*0aeed3e9SJustin Hibbits sizeof(struct bm_buffer) * num); 113*0aeed3e9SJustin Hibbits p_BmPool->spFill += num; 114*0aeed3e9SJustin Hibbits num = 0; /* --> will return success no matter what */ 115*0aeed3e9SJustin Hibbits } 116*0aeed3e9SJustin Hibbits else 117*0aeed3e9SJustin Hibbits /* Do hw op if hitting the high-water threshold */ 118*0aeed3e9SJustin Hibbits { 119*0aeed3e9SJustin Hibbits t_Error ret = BmPortalRelease(h_BmPortal, 120*0aeed3e9SJustin Hibbits p_BmPool->bpid, 121*0aeed3e9SJustin Hibbits (struct bm_buffer *)PTR_MOVE(p_BmPool->sp, sizeof(struct bm_buffer) * (p_BmPool->spFill - p_BmPool->spBufsCmd)), 122*0aeed3e9SJustin Hibbits p_BmPool->spBufsCmd, 123*0aeed3e9SJustin Hibbits flags); 124*0aeed3e9SJustin Hibbits if (ret) 125*0aeed3e9SJustin Hibbits return (num ? ret : E_OK); 126*0aeed3e9SJustin Hibbits p_BmPool->spFill -= p_BmPool->spBufsCmd; 127*0aeed3e9SJustin Hibbits } 128*0aeed3e9SJustin Hibbits } 129*0aeed3e9SJustin Hibbits 130*0aeed3e9SJustin Hibbits return E_OK; 131*0aeed3e9SJustin Hibbits } 132*0aeed3e9SJustin Hibbits 133*0aeed3e9SJustin Hibbits static int BmPoolAcquire(t_BmPool *p_BmPool,t_Handle h_BmPortal, 134*0aeed3e9SJustin Hibbits struct bm_buffer *bufs, uint8_t num, uint32_t flags) 135*0aeed3e9SJustin Hibbits { 136*0aeed3e9SJustin Hibbits ASSERT_COND(IN_RANGE(1, num, 8)); 137*0aeed3e9SJustin Hibbits if (p_BmPool->flags & BMAN_POOL_FLAG_ONLY_RELEASE) 138*0aeed3e9SJustin Hibbits return 0; 139*0aeed3e9SJustin Hibbits 140*0aeed3e9SJustin Hibbits /* Without stockpile, this API is a pass-through to the h/w operation */ 141*0aeed3e9SJustin Hibbits if (!(p_BmPool->flags & BMAN_POOL_FLAG_STOCKPILE)) 142*0aeed3e9SJustin Hibbits return BmPortalAcquire(h_BmPortal, p_BmPool->bpid, bufs, num); 143*0aeed3e9SJustin Hibbits /* Only need a h/w op if we'll hit the low-water thresh */ 144*0aeed3e9SJustin Hibbits if (!(flags & BMAN_ACQUIRE_FLAG_STOCKPILE) && 145*0aeed3e9SJustin Hibbits ((p_BmPool->spFill - num) < p_BmPool->spMinBufs)) 146*0aeed3e9SJustin Hibbits { 147*0aeed3e9SJustin Hibbits p_BmPool->spFill += BmPortalAcquire(h_BmPortal, 148*0aeed3e9SJustin Hibbits p_BmPool->bpid, 149*0aeed3e9SJustin Hibbits (struct bm_buffer *)PTR_MOVE(p_BmPool->sp, sizeof(struct bm_buffer) * (p_BmPool->spFill)), 150*0aeed3e9SJustin Hibbits p_BmPool->spBufsCmd); 151*0aeed3e9SJustin Hibbits } 152*0aeed3e9SJustin Hibbits else if (p_BmPool->spFill < num) 153*0aeed3e9SJustin Hibbits return 0; 154*0aeed3e9SJustin Hibbits if (!p_BmPool->spFill) 155*0aeed3e9SJustin Hibbits return 0; 156*0aeed3e9SJustin Hibbits memcpy(bufs, 157*0aeed3e9SJustin Hibbits PTR_MOVE(p_BmPool->sp, sizeof(struct bm_buffer) * (p_BmPool->spFill - num)), 158*0aeed3e9SJustin Hibbits sizeof(struct bm_buffer) * num); 159*0aeed3e9SJustin Hibbits p_BmPool->spFill -= num; 160*0aeed3e9SJustin Hibbits return num; 161*0aeed3e9SJustin Hibbits } 162*0aeed3e9SJustin Hibbits 163*0aeed3e9SJustin Hibbits static t_Error BmPoolFree(t_BmPool *p_BmPool, bool discardBuffers) 164*0aeed3e9SJustin Hibbits { 165*0aeed3e9SJustin Hibbits t_Handle h_BufContext; 166*0aeed3e9SJustin Hibbits void *p_Data; 167*0aeed3e9SJustin Hibbits 168*0aeed3e9SJustin Hibbits ASSERT_COND(p_BmPool); 169*0aeed3e9SJustin Hibbits 170*0aeed3e9SJustin Hibbits if (!p_BmPool->shadowMode) 171*0aeed3e9SJustin Hibbits { 172*0aeed3e9SJustin Hibbits if (p_BmPool->flags & BMAN_POOL_FLAG_DEPLETION) 173*0aeed3e9SJustin Hibbits { 174*0aeed3e9SJustin Hibbits depletion_unlink(p_BmPool); 175*0aeed3e9SJustin Hibbits BmUnSetPoolThresholds(p_BmPool->h_Bm, p_BmPool->bpid); 176*0aeed3e9SJustin Hibbits } 177*0aeed3e9SJustin Hibbits while (TRUE) 178*0aeed3e9SJustin Hibbits { 179*0aeed3e9SJustin Hibbits p_Data = BM_POOL_GetBuf(p_BmPool, p_BmPool->h_BmPortal); 180*0aeed3e9SJustin Hibbits if (!p_Data) 181*0aeed3e9SJustin Hibbits break; 182*0aeed3e9SJustin Hibbits h_BufContext = BM_POOL_GetBufferContext(p_BmPool, p_Data); 183*0aeed3e9SJustin Hibbits if (!discardBuffers) 184*0aeed3e9SJustin Hibbits p_BmPool->bufferPoolInfo.f_PutBuf(p_BmPool->bufferPoolInfo.h_BufferPool, p_Data, h_BufContext); 185*0aeed3e9SJustin Hibbits } 186*0aeed3e9SJustin Hibbits BmBpidPut(p_BmPool->h_Bm, p_BmPool->bpid); 187*0aeed3e9SJustin Hibbits } 188*0aeed3e9SJustin Hibbits 189*0aeed3e9SJustin Hibbits if (p_BmPool->sp) 190*0aeed3e9SJustin Hibbits XX_Free(p_BmPool->sp); 191*0aeed3e9SJustin Hibbits 192*0aeed3e9SJustin Hibbits XX_Free(p_BmPool); 193*0aeed3e9SJustin Hibbits 194*0aeed3e9SJustin Hibbits return E_OK; 195*0aeed3e9SJustin Hibbits } 196*0aeed3e9SJustin Hibbits 197*0aeed3e9SJustin Hibbits /****************************************/ 198*0aeed3e9SJustin Hibbits /* API Init unit functions */ 199*0aeed3e9SJustin Hibbits /****************************************/ 200*0aeed3e9SJustin Hibbits 201*0aeed3e9SJustin Hibbits t_Handle BM_POOL_Config(t_BmPoolParam *p_BmPoolParam) 202*0aeed3e9SJustin Hibbits { 203*0aeed3e9SJustin Hibbits t_BmPool *p_BmPool; 204*0aeed3e9SJustin Hibbits 205*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_BmPoolParam, E_INVALID_HANDLE, NULL); 206*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_BmPoolParam->h_Bm, E_INVALID_HANDLE, NULL); 207*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE((p_BmPoolParam->shadowMode || 208*0aeed3e9SJustin Hibbits (p_BmPoolParam->bufferPoolInfo.h_BufferPool && 209*0aeed3e9SJustin Hibbits p_BmPoolParam->bufferPoolInfo.f_GetBuf && 210*0aeed3e9SJustin Hibbits p_BmPoolParam->bufferPoolInfo.f_PutBuf && 211*0aeed3e9SJustin Hibbits p_BmPoolParam->bufferPoolInfo.bufferSize)), E_INVALID_STATE, NULL); 212*0aeed3e9SJustin Hibbits 213*0aeed3e9SJustin Hibbits p_BmPool = (t_BmPool*)XX_Malloc(sizeof(t_BmPool)); 214*0aeed3e9SJustin Hibbits if (!p_BmPool) 215*0aeed3e9SJustin Hibbits { 216*0aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("BM Pool obj!!!")); 217*0aeed3e9SJustin Hibbits return NULL; 218*0aeed3e9SJustin Hibbits } 219*0aeed3e9SJustin Hibbits memset(p_BmPool, 0, sizeof(t_BmPool)); 220*0aeed3e9SJustin Hibbits 221*0aeed3e9SJustin Hibbits p_BmPool->p_BmPoolDriverParams = (t_BmPoolDriverParams *)XX_Malloc(sizeof(t_BmPoolDriverParams)); 222*0aeed3e9SJustin Hibbits if (!p_BmPool->p_BmPoolDriverParams) 223*0aeed3e9SJustin Hibbits { 224*0aeed3e9SJustin Hibbits XX_Free(p_BmPool); 225*0aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Bm Pool driver parameters")); 226*0aeed3e9SJustin Hibbits return NULL; 227*0aeed3e9SJustin Hibbits } 228*0aeed3e9SJustin Hibbits memset(p_BmPool->p_BmPoolDriverParams, 0, sizeof(t_BmPoolDriverParams)); 229*0aeed3e9SJustin Hibbits 230*0aeed3e9SJustin Hibbits p_BmPool->h_Bm = p_BmPoolParam->h_Bm; 231*0aeed3e9SJustin Hibbits p_BmPool->h_BmPortal = p_BmPoolParam->h_BmPortal; 232*0aeed3e9SJustin Hibbits p_BmPool->h_App = p_BmPoolParam->h_App; 233*0aeed3e9SJustin Hibbits p_BmPool->numOfBuffers = p_BmPoolParam->numOfBuffers; 234*0aeed3e9SJustin Hibbits p_BmPool->shadowMode = p_BmPoolParam->shadowMode; 235*0aeed3e9SJustin Hibbits 236*0aeed3e9SJustin Hibbits if (!p_BmPool->h_BmPortal) 237*0aeed3e9SJustin Hibbits { 238*0aeed3e9SJustin Hibbits p_BmPool->h_BmPortal = BmGetPortalHandle(p_BmPool->h_Bm); 239*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_BmPool->h_BmPortal, E_INVALID_HANDLE, NULL); 240*0aeed3e9SJustin Hibbits } 241*0aeed3e9SJustin Hibbits 242*0aeed3e9SJustin Hibbits memcpy(&p_BmPool->bufferPoolInfo, &p_BmPoolParam->bufferPoolInfo, sizeof(t_BufferPoolInfo)); 243*0aeed3e9SJustin Hibbits if (!p_BmPool->bufferPoolInfo.f_PhysToVirt) 244*0aeed3e9SJustin Hibbits p_BmPool->bufferPoolInfo.f_PhysToVirt = XX_PhysToVirt; 245*0aeed3e9SJustin Hibbits if (!p_BmPool->bufferPoolInfo.f_VirtToPhys) 246*0aeed3e9SJustin Hibbits p_BmPool->bufferPoolInfo.f_VirtToPhys = XX_VirtToPhys; 247*0aeed3e9SJustin Hibbits 248*0aeed3e9SJustin Hibbits p_BmPool->p_BmPoolDriverParams->dynamicBpid = DEFAULT_dynamicBpid; 249*0aeed3e9SJustin Hibbits p_BmPool->p_BmPoolDriverParams->useDepletion = DEFAULT_useDepletion; 250*0aeed3e9SJustin Hibbits p_BmPool->p_BmPoolDriverParams->useStockpile = DEFAULT_useStockpile; 251*0aeed3e9SJustin Hibbits 252*0aeed3e9SJustin Hibbits if (p_BmPool->shadowMode) 253*0aeed3e9SJustin Hibbits { 254*0aeed3e9SJustin Hibbits p_BmPool->numOfBuffers = 0; 255*0aeed3e9SJustin Hibbits BM_POOL_ConfigBpid(p_BmPool, p_BmPoolParam->bpid); 256*0aeed3e9SJustin Hibbits } 257*0aeed3e9SJustin Hibbits 258*0aeed3e9SJustin Hibbits return p_BmPool; 259*0aeed3e9SJustin Hibbits } 260*0aeed3e9SJustin Hibbits 261*0aeed3e9SJustin Hibbits t_Error BM_POOL_Init(t_Handle h_BmPool) 262*0aeed3e9SJustin Hibbits { 263*0aeed3e9SJustin Hibbits t_BmPool *p_BmPool = (t_BmPool *)h_BmPool; 264*0aeed3e9SJustin Hibbits t_Error err; 265*0aeed3e9SJustin Hibbits 266*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_BmPool, E_INVALID_HANDLE); 267*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE); 268*0aeed3e9SJustin Hibbits 269*0aeed3e9SJustin Hibbits p_BmPool->flags |= (p_BmPool->p_BmPoolDriverParams->dynamicBpid)?BMAN_POOL_FLAG_DYNAMIC_BPID:0; 270*0aeed3e9SJustin Hibbits p_BmPool->flags |= (p_BmPool->p_BmPoolDriverParams->useStockpile)?BMAN_POOL_FLAG_STOCKPILE:0; 271*0aeed3e9SJustin Hibbits p_BmPool->flags |= ((!p_BmPool->shadowMode) && 272*0aeed3e9SJustin Hibbits (p_BmPool->p_BmPoolDriverParams->useDepletion))?BMAN_POOL_FLAG_DEPLETION:0; 273*0aeed3e9SJustin Hibbits 274*0aeed3e9SJustin Hibbits if (p_BmPool->flags & BMAN_POOL_FLAG_DYNAMIC_BPID) 275*0aeed3e9SJustin Hibbits { 276*0aeed3e9SJustin Hibbits if((p_BmPool->bpid = (uint8_t)BmBpidGet(p_BmPool->h_Bm, FALSE, (uint32_t)0)) == (uint8_t)ILLEGAL_BASE) 277*0aeed3e9SJustin Hibbits { 278*0aeed3e9SJustin Hibbits BM_POOL_Free(p_BmPool); 279*0aeed3e9SJustin Hibbits RETURN_ERROR(CRITICAL, E_INVALID_STATE, ("can't allocate new dynamic pool id")); 280*0aeed3e9SJustin Hibbits } 281*0aeed3e9SJustin Hibbits } 282*0aeed3e9SJustin Hibbits else 283*0aeed3e9SJustin Hibbits { 284*0aeed3e9SJustin Hibbits if (BmBpidGet(p_BmPool->h_Bm, TRUE, (uint32_t)p_BmPool->bpid) == (uint32_t)ILLEGAL_BASE) 285*0aeed3e9SJustin Hibbits { 286*0aeed3e9SJustin Hibbits BM_POOL_Free(p_BmPool); 287*0aeed3e9SJustin Hibbits RETURN_ERROR(CRITICAL, E_INVALID_STATE, ("can't force pool id %d", p_BmPool->bpid)); 288*0aeed3e9SJustin Hibbits } 289*0aeed3e9SJustin Hibbits } 290*0aeed3e9SJustin Hibbits if (p_BmPool->flags & BMAN_POOL_FLAG_DEPLETION) 291*0aeed3e9SJustin Hibbits { 292*0aeed3e9SJustin Hibbits if(BmSetPoolThresholds(p_BmPool->h_Bm, p_BmPool->bpid, p_BmPool->p_BmPoolDriverParams->depletionThresholds)) 293*0aeed3e9SJustin Hibbits { 294*0aeed3e9SJustin Hibbits BM_POOL_Free(p_BmPool); 295*0aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("can't set thresh for pool bpid %d",p_BmPool->bpid)); 296*0aeed3e9SJustin Hibbits } 297*0aeed3e9SJustin Hibbits 298*0aeed3e9SJustin Hibbits depletion_link(p_BmPool); 299*0aeed3e9SJustin Hibbits } 300*0aeed3e9SJustin Hibbits 301*0aeed3e9SJustin Hibbits if (p_BmPool->flags & BMAN_POOL_FLAG_STOCKPILE) 302*0aeed3e9SJustin Hibbits { 303*0aeed3e9SJustin Hibbits p_BmPool->sp = (struct bm_buffer *)XX_Malloc(sizeof(struct bm_buffer) * p_BmPool->spMaxBufs); 304*0aeed3e9SJustin Hibbits if (!p_BmPool->sp) 305*0aeed3e9SJustin Hibbits { 306*0aeed3e9SJustin Hibbits BM_POOL_Free(p_BmPool); 307*0aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Bm Pool Stockpile")); 308*0aeed3e9SJustin Hibbits } 309*0aeed3e9SJustin Hibbits memset(p_BmPool->sp, 0, sizeof(struct bm_buffer) * p_BmPool->spMaxBufs); 310*0aeed3e9SJustin Hibbits } 311*0aeed3e9SJustin Hibbits 312*0aeed3e9SJustin Hibbits XX_Free(p_BmPool->p_BmPoolDriverParams); 313*0aeed3e9SJustin Hibbits p_BmPool->p_BmPoolDriverParams = NULL; 314*0aeed3e9SJustin Hibbits 315*0aeed3e9SJustin Hibbits /*******************/ 316*0aeed3e9SJustin Hibbits /* Create buffers */ 317*0aeed3e9SJustin Hibbits /*******************/ 318*0aeed3e9SJustin Hibbits if ((err = BM_POOL_FillBufs (p_BmPool, p_BmPool->h_BmPortal, p_BmPool->numOfBuffers)) != E_OK) 319*0aeed3e9SJustin Hibbits { 320*0aeed3e9SJustin Hibbits BM_POOL_Free(p_BmPool); 321*0aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG); 322*0aeed3e9SJustin Hibbits } 323*0aeed3e9SJustin Hibbits 324*0aeed3e9SJustin Hibbits return E_OK; 325*0aeed3e9SJustin Hibbits } 326*0aeed3e9SJustin Hibbits 327*0aeed3e9SJustin Hibbits t_Error BM_POOL_Free(t_Handle h_BmPool) 328*0aeed3e9SJustin Hibbits { 329*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_BmPool, E_INVALID_HANDLE); 330*0aeed3e9SJustin Hibbits 331*0aeed3e9SJustin Hibbits return BmPoolFree(h_BmPool, FALSE); 332*0aeed3e9SJustin Hibbits } 333*0aeed3e9SJustin Hibbits 334*0aeed3e9SJustin Hibbits t_Error BM_POOL_ConfigBpid(t_Handle h_BmPool, uint8_t bpid) 335*0aeed3e9SJustin Hibbits { 336*0aeed3e9SJustin Hibbits t_BmPool *p_BmPool = (t_BmPool *)h_BmPool; 337*0aeed3e9SJustin Hibbits 338*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_BmPool, E_INVALID_HANDLE); 339*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE); 340*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(bpid < BM_MAX_NUM_OF_POOLS, E_INVALID_VALUE); 341*0aeed3e9SJustin Hibbits 342*0aeed3e9SJustin Hibbits p_BmPool->p_BmPoolDriverParams->dynamicBpid = FALSE; 343*0aeed3e9SJustin Hibbits p_BmPool->bpid = bpid; 344*0aeed3e9SJustin Hibbits 345*0aeed3e9SJustin Hibbits return E_OK; 346*0aeed3e9SJustin Hibbits } 347*0aeed3e9SJustin Hibbits 348*0aeed3e9SJustin Hibbits 349*0aeed3e9SJustin Hibbits t_Error BM_POOL_ConfigDepletion(t_Handle h_BmPool, t_BmDepletionCallback *f_Depletion, uint32_t *p_Thresholds) 350*0aeed3e9SJustin Hibbits { 351*0aeed3e9SJustin Hibbits t_BmPool *p_BmPool = (t_BmPool *)h_BmPool; 352*0aeed3e9SJustin Hibbits 353*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_BmPool, E_INVALID_HANDLE); 354*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE); 355*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(f_Depletion, E_INVALID_HANDLE); 356*0aeed3e9SJustin Hibbits 357*0aeed3e9SJustin Hibbits p_BmPool->p_BmPoolDriverParams->useDepletion = TRUE; 358*0aeed3e9SJustin Hibbits p_BmPool->f_Depletion = f_Depletion; 359*0aeed3e9SJustin Hibbits memcpy(&p_BmPool->p_BmPoolDriverParams->depletionThresholds, 360*0aeed3e9SJustin Hibbits p_Thresholds, 361*0aeed3e9SJustin Hibbits sizeof(p_BmPool->p_BmPoolDriverParams->depletionThresholds)); 362*0aeed3e9SJustin Hibbits 363*0aeed3e9SJustin Hibbits return E_OK; 364*0aeed3e9SJustin Hibbits } 365*0aeed3e9SJustin Hibbits 366*0aeed3e9SJustin Hibbits t_Error BM_POOL_ConfigStockpile(t_Handle h_BmPool, uint16_t maxBuffers, uint16_t minBuffers) 367*0aeed3e9SJustin Hibbits { 368*0aeed3e9SJustin Hibbits t_BmPool *p_BmPool = (t_BmPool *)h_BmPool; 369*0aeed3e9SJustin Hibbits 370*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_BmPool, E_INVALID_HANDLE); 371*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE); 372*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(maxBuffers, E_INVALID_STATE); 373*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(maxBuffers >= minBuffers, E_INVALID_STATE); 374*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR((p_BmPool->shadowMode || 375*0aeed3e9SJustin Hibbits ((maxBuffers * 2) <= p_BmPool->numOfBuffers)), 376*0aeed3e9SJustin Hibbits E_INVALID_STATE); 377*0aeed3e9SJustin Hibbits 378*0aeed3e9SJustin Hibbits p_BmPool->p_BmPoolDriverParams->useStockpile = TRUE; 379*0aeed3e9SJustin Hibbits p_BmPool->spMaxBufs = maxBuffers; 380*0aeed3e9SJustin Hibbits p_BmPool->spMinBufs = minBuffers; 381*0aeed3e9SJustin Hibbits p_BmPool->spBufsCmd = DEFAULT_numOfBufsPerCmd; 382*0aeed3e9SJustin Hibbits 383*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR((p_BmPool->spMaxBufs >= 384*0aeed3e9SJustin Hibbits (p_BmPool->spMinBufs + p_BmPool->spBufsCmd)), 385*0aeed3e9SJustin Hibbits E_INVALID_STATE); 386*0aeed3e9SJustin Hibbits 387*0aeed3e9SJustin Hibbits return E_OK; 388*0aeed3e9SJustin Hibbits } 389*0aeed3e9SJustin Hibbits 390*0aeed3e9SJustin Hibbits t_Error BM_POOL_ConfigBuffContextMode(t_Handle h_BmPool, bool en) 391*0aeed3e9SJustin Hibbits { 392*0aeed3e9SJustin Hibbits t_BmPool *p_BmPool = (t_BmPool *)h_BmPool; 393*0aeed3e9SJustin Hibbits 394*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_BmPool, E_INVALID_HANDLE); 395*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE); 396*0aeed3e9SJustin Hibbits 397*0aeed3e9SJustin Hibbits p_BmPool->noBuffCtxt = !en; 398*0aeed3e9SJustin Hibbits 399*0aeed3e9SJustin Hibbits return E_OK; 400*0aeed3e9SJustin Hibbits } 401*0aeed3e9SJustin Hibbits 402*0aeed3e9SJustin Hibbits void * BM_POOL_GetBuf(t_Handle h_BmPool, t_Handle h_BmPortal) 403*0aeed3e9SJustin Hibbits { 404*0aeed3e9SJustin Hibbits t_BmPool *p_BmPool = (t_BmPool *)h_BmPool; 405*0aeed3e9SJustin Hibbits struct bm_buffer bufs[1]; 406*0aeed3e9SJustin Hibbits uint8_t retBufsNum; 407*0aeed3e9SJustin Hibbits uint64_t physAddr; 408*0aeed3e9SJustin Hibbits uint32_t flags = 0; 409*0aeed3e9SJustin Hibbits 410*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_BmPool, E_INVALID_HANDLE, NULL); 411*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(!p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE, NULL); 412*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_BmPool->bufferPoolInfo.f_PhysToVirt, E_INVALID_STATE, NULL); 413*0aeed3e9SJustin Hibbits 414*0aeed3e9SJustin Hibbits if (!h_BmPortal) 415*0aeed3e9SJustin Hibbits { 416*0aeed3e9SJustin Hibbits if (p_BmPool->h_BmPortal) 417*0aeed3e9SJustin Hibbits h_BmPortal = p_BmPool->h_BmPortal; 418*0aeed3e9SJustin Hibbits else 419*0aeed3e9SJustin Hibbits { 420*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_BmPool->h_Bm, E_INVALID_HANDLE, NULL); 421*0aeed3e9SJustin Hibbits h_BmPortal = BmGetPortalHandle(p_BmPool->h_Bm); 422*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(h_BmPortal, E_INVALID_HANDLE, NULL); 423*0aeed3e9SJustin Hibbits } 424*0aeed3e9SJustin Hibbits } 425*0aeed3e9SJustin Hibbits 426*0aeed3e9SJustin Hibbits retBufsNum = (uint8_t)BmPoolAcquire(p_BmPool, h_BmPortal, bufs, 1, flags); 427*0aeed3e9SJustin Hibbits if (!retBufsNum) 428*0aeed3e9SJustin Hibbits { 429*0aeed3e9SJustin Hibbits REPORT_ERROR(TRACE, E_NOT_AVAILABLE, ("buffer")); 430*0aeed3e9SJustin Hibbits return NULL; 431*0aeed3e9SJustin Hibbits } 432*0aeed3e9SJustin Hibbits physAddr = (uint64_t)bufs[0].lo; 433*0aeed3e9SJustin Hibbits physAddr |= (uint64_t)(((uint64_t)bufs[0].hi << 32) & 0x000000ff00000000LL); 434*0aeed3e9SJustin Hibbits DBG(TRACE,("Get Buffer : poolId %d, address 0x%016llx", 435*0aeed3e9SJustin Hibbits p_BmPool->bpid, 436*0aeed3e9SJustin Hibbits p_BmPool->bufferPoolInfo.f_PhysToVirt((physAddress_t)physAddr))); 437*0aeed3e9SJustin Hibbits 438*0aeed3e9SJustin Hibbits return p_BmPool->bufferPoolInfo.f_PhysToVirt((physAddress_t)physAddr); 439*0aeed3e9SJustin Hibbits } 440*0aeed3e9SJustin Hibbits 441*0aeed3e9SJustin Hibbits t_Error BM_POOL_PutBuf(t_Handle h_BmPool, t_Handle h_BmPortal, void *p_Buff) 442*0aeed3e9SJustin Hibbits { 443*0aeed3e9SJustin Hibbits t_BmPool *p_BmPool = (t_BmPool *)h_BmPool; 444*0aeed3e9SJustin Hibbits uint64_t physAddress; 445*0aeed3e9SJustin Hibbits struct bm_buffer bufs[1]; 446*0aeed3e9SJustin Hibbits 447*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_BmPool, E_INVALID_HANDLE); 448*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_BmPool->p_BmPoolDriverParams, E_INVALID_STATE); 449*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Buff, E_NULL_POINTER); 450*0aeed3e9SJustin Hibbits 451*0aeed3e9SJustin Hibbits physAddress = (uint64_t)(XX_VirtToPhys(p_Buff)); 452*0aeed3e9SJustin Hibbits 453*0aeed3e9SJustin Hibbits bufs[0].bpid = p_BmPool->bpid; 454*0aeed3e9SJustin Hibbits bufs[0].hi = (uint8_t)((physAddress & 0x000000ff00000000LL) >> 32); 455*0aeed3e9SJustin Hibbits bufs[0].lo = (uint32_t)(physAddress & 0xffffffff); 456*0aeed3e9SJustin Hibbits 457*0aeed3e9SJustin Hibbits DBG(TRACE,("Put Buffer : poolId %d, address 0x%016llx, phys 0x%016llx", 458*0aeed3e9SJustin Hibbits p_BmPool->bpid, (uint64_t)PTR_TO_UINT(p_Buff), physAddress)); 459*0aeed3e9SJustin Hibbits 460*0aeed3e9SJustin Hibbits if (!h_BmPortal) 461*0aeed3e9SJustin Hibbits { 462*0aeed3e9SJustin Hibbits if (p_BmPool->h_BmPortal) 463*0aeed3e9SJustin Hibbits h_BmPortal = p_BmPool->h_BmPortal; 464*0aeed3e9SJustin Hibbits else 465*0aeed3e9SJustin Hibbits { 466*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_BmPool->h_Bm, E_INVALID_HANDLE); 467*0aeed3e9SJustin Hibbits h_BmPortal = BmGetPortalHandle(p_BmPool->h_Bm); 468*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_BmPortal, E_INVALID_HANDLE); 469*0aeed3e9SJustin Hibbits } 470*0aeed3e9SJustin Hibbits } 471*0aeed3e9SJustin Hibbits 472*0aeed3e9SJustin Hibbits return BmPoolRelease(p_BmPool, h_BmPortal, bufs, 1, BMAN_RELEASE_FLAG_WAIT); 473*0aeed3e9SJustin Hibbits } 474*0aeed3e9SJustin Hibbits 475*0aeed3e9SJustin Hibbits t_Error BM_POOL_FillBufs(t_Handle h_BmPool, t_Handle h_BmPortal, uint32_t numBufs) 476*0aeed3e9SJustin Hibbits { 477*0aeed3e9SJustin Hibbits t_BmPool *p_BmPool = (t_BmPool *)h_BmPool; 478*0aeed3e9SJustin Hibbits 479*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_BmPool, E_INVALID_HANDLE); 480*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_BmPool->p_BmPoolDriverParams, E_INVALID_STATE); 481*0aeed3e9SJustin Hibbits 482*0aeed3e9SJustin Hibbits if (!h_BmPortal) 483*0aeed3e9SJustin Hibbits { 484*0aeed3e9SJustin Hibbits if (p_BmPool->h_BmPortal) 485*0aeed3e9SJustin Hibbits h_BmPortal = p_BmPool->h_BmPortal; 486*0aeed3e9SJustin Hibbits else 487*0aeed3e9SJustin Hibbits { 488*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_BmPool->h_Bm, E_INVALID_HANDLE); 489*0aeed3e9SJustin Hibbits h_BmPortal = BmGetPortalHandle(p_BmPool->h_Bm); 490*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(h_BmPortal, E_INVALID_HANDLE); 491*0aeed3e9SJustin Hibbits } 492*0aeed3e9SJustin Hibbits } 493*0aeed3e9SJustin Hibbits 494*0aeed3e9SJustin Hibbits while (numBufs--) 495*0aeed3e9SJustin Hibbits { 496*0aeed3e9SJustin Hibbits uint8_t *p_Data; 497*0aeed3e9SJustin Hibbits t_Error res; 498*0aeed3e9SJustin Hibbits t_Handle h_BufContext; 499*0aeed3e9SJustin Hibbits 500*0aeed3e9SJustin Hibbits p_Data = p_BmPool->bufferPoolInfo.f_GetBuf(p_BmPool->bufferPoolInfo.h_BufferPool, &h_BufContext); 501*0aeed3e9SJustin Hibbits if(!p_Data) 502*0aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("run-out of buffers for bpid %d",p_BmPool->bpid)); 503*0aeed3e9SJustin Hibbits 504*0aeed3e9SJustin Hibbits if (!p_BmPool->noBuffCtxt) 505*0aeed3e9SJustin Hibbits *(t_Handle *)(p_Data - sizeof(t_Handle)) = h_BufContext; 506*0aeed3e9SJustin Hibbits 507*0aeed3e9SJustin Hibbits if ((res = BM_POOL_PutBuf(p_BmPool, h_BmPortal, p_Data)) != E_OK) 508*0aeed3e9SJustin Hibbits RETURN_ERROR(CRITICAL, res, ("Seeding reserved buffer pool failed")); 509*0aeed3e9SJustin Hibbits } 510*0aeed3e9SJustin Hibbits 511*0aeed3e9SJustin Hibbits return E_OK; 512*0aeed3e9SJustin Hibbits } 513*0aeed3e9SJustin Hibbits 514*0aeed3e9SJustin Hibbits uint8_t BM_POOL_GetId(t_Handle h_BmPool) 515*0aeed3e9SJustin Hibbits { 516*0aeed3e9SJustin Hibbits t_BmPool *p_BmPool = (t_BmPool *)h_BmPool; 517*0aeed3e9SJustin Hibbits 518*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_BmPool, E_INVALID_HANDLE, 0); 519*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(!p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE, 0); 520*0aeed3e9SJustin Hibbits 521*0aeed3e9SJustin Hibbits return p_BmPool->bpid; 522*0aeed3e9SJustin Hibbits } 523*0aeed3e9SJustin Hibbits 524*0aeed3e9SJustin Hibbits uint16_t BM_POOL_GetBufferSize(t_Handle h_BmPool) 525*0aeed3e9SJustin Hibbits { 526*0aeed3e9SJustin Hibbits t_BmPool *p_BmPool = (t_BmPool *)h_BmPool; 527*0aeed3e9SJustin Hibbits 528*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_BmPool, E_INVALID_HANDLE, 0); 529*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(!p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE, 0); 530*0aeed3e9SJustin Hibbits 531*0aeed3e9SJustin Hibbits return p_BmPool->bufferPoolInfo.bufferSize; 532*0aeed3e9SJustin Hibbits } 533*0aeed3e9SJustin Hibbits 534*0aeed3e9SJustin Hibbits t_Handle BM_POOL_GetBufferContext(t_Handle h_BmPool, void *p_Buff) 535*0aeed3e9SJustin Hibbits { 536*0aeed3e9SJustin Hibbits t_BmPool *p_BmPool = (t_BmPool *)h_BmPool; 537*0aeed3e9SJustin Hibbits 538*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_BmPool, E_INVALID_HANDLE, NULL); 539*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(!p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE, NULL); 540*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_Buff, E_NULL_POINTER, NULL); 541*0aeed3e9SJustin Hibbits 542*0aeed3e9SJustin Hibbits if (p_BmPool->noBuffCtxt) 543*0aeed3e9SJustin Hibbits return NULL; 544*0aeed3e9SJustin Hibbits 545*0aeed3e9SJustin Hibbits return *(t_Handle *)PTR_MOVE(p_Buff, -(sizeof(t_Handle))); 546*0aeed3e9SJustin Hibbits } 547*0aeed3e9SJustin Hibbits 548*0aeed3e9SJustin Hibbits void * BM_POOL_PhysToVirt(t_Handle h_BmPool, physAddress_t addr) 549*0aeed3e9SJustin Hibbits { 550*0aeed3e9SJustin Hibbits t_BmPool *p_BmPool = (t_BmPool *)h_BmPool; 551*0aeed3e9SJustin Hibbits 552*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_BmPool, E_INVALID_HANDLE, NULL); 553*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(!p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE, NULL); 554*0aeed3e9SJustin Hibbits 555*0aeed3e9SJustin Hibbits return p_BmPool->bufferPoolInfo.f_PhysToVirt(addr); 556*0aeed3e9SJustin Hibbits } 557*0aeed3e9SJustin Hibbits 558*0aeed3e9SJustin Hibbits physAddress_t BM_POOL_VirtToPhys(t_Handle h_BmPool, void *p_Buff) 559*0aeed3e9SJustin Hibbits { 560*0aeed3e9SJustin Hibbits t_BmPool *p_BmPool = (t_BmPool *)h_BmPool; 561*0aeed3e9SJustin Hibbits 562*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_BmPool, E_INVALID_HANDLE, (physAddress_t)0); 563*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(!p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE, (physAddress_t)0); 564*0aeed3e9SJustin Hibbits 565*0aeed3e9SJustin Hibbits return p_BmPool->bufferPoolInfo.f_VirtToPhys(p_Buff); 566*0aeed3e9SJustin Hibbits } 567*0aeed3e9SJustin Hibbits 568*0aeed3e9SJustin Hibbits uint32_t BM_POOL_GetCounter(t_Handle h_BmPool, e_BmPoolCounters counter) 569*0aeed3e9SJustin Hibbits { 570*0aeed3e9SJustin Hibbits t_BmPool *p_BmPool = (t_BmPool *)h_BmPool; 571*0aeed3e9SJustin Hibbits 572*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_BmPool, E_INVALID_HANDLE, 0); 573*0aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(!p_BmPool->p_BmPoolDriverParams, E_INVALID_HANDLE, 0); 574*0aeed3e9SJustin Hibbits 575*0aeed3e9SJustin Hibbits switch(counter) 576*0aeed3e9SJustin Hibbits { 577*0aeed3e9SJustin Hibbits case(e_BM_POOL_COUNTERS_CONTENT): 578*0aeed3e9SJustin Hibbits return BmGetCounter(p_BmPool->h_Bm, e_BM_IM_COUNTERS_POOL_CONTENT, p_BmPool->bpid); 579*0aeed3e9SJustin Hibbits case(e_BM_POOL_COUNTERS_SW_DEPLETION): 580*0aeed3e9SJustin Hibbits return (p_BmPool->swDepletionCount += 581*0aeed3e9SJustin Hibbits BmGetCounter(p_BmPool->h_Bm, e_BM_IM_COUNTERS_POOL_SW_DEPLETION, p_BmPool->bpid)); 582*0aeed3e9SJustin Hibbits case(e_BM_POOL_COUNTERS_HW_DEPLETION): 583*0aeed3e9SJustin Hibbits return (p_BmPool->hwDepletionCount += 584*0aeed3e9SJustin Hibbits BmGetCounter(p_BmPool->h_Bm, e_BM_IM_COUNTERS_POOL_HW_DEPLETION, p_BmPool->bpid)); 585*0aeed3e9SJustin Hibbits default: 586*0aeed3e9SJustin Hibbits break; 587*0aeed3e9SJustin Hibbits } 588*0aeed3e9SJustin Hibbits 589*0aeed3e9SJustin Hibbits /* should never get here */ 590*0aeed3e9SJustin Hibbits ASSERT_COND(FALSE); 591*0aeed3e9SJustin Hibbits 592*0aeed3e9SJustin Hibbits return 0; 593*0aeed3e9SJustin Hibbits } 594