1 /****************************************************************************** 2 3 � 1995-2003, 2004, 2005-2011 Freescale Semiconductor, Inc. 4 All rights reserved. 5 6 This is proprietary source code of Freescale Semiconductor Inc., 7 and its use is subject to the NetComm Device Drivers EULA. 8 The copyright notice above does not evidence any actual or intended 9 publication of such source code. 10 11 ALTERNATIVELY, redistribution and use in source and binary forms, with 12 or without modification, are permitted provided that the following 13 conditions are met: 14 * Redistributions of source code must retain the above copyright 15 notice, this list of conditions and the following disclaimer. 16 * Redistributions in binary form must reproduce the above copyright 17 notice, this list of conditions and the following disclaimer in the 18 documentation and/or other materials provided with the distribution. 19 * Neither the name of Freescale Semiconductor nor the 20 names of its contributors may be used to endorse or promote products 21 derived from this software without specific prior written permission. 22 23 THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY 24 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 25 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 26 DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY 27 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 28 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 29 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 30 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 32 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 * 34 35 **************************************************************************/ 36 /****************************************************************************** 37 @File bm.h 38 39 @Description BM header 40 *//***************************************************************************/ 41 #ifndef __BM_H 42 #define __BM_H 43 44 #include "xx_common.h" 45 #include "bm_ext.h" 46 #include "mm_ext.h" 47 48 #include "bman_private.h" 49 #include "bm_ipc.h" 50 51 52 #define __ERR_MODULE__ MODULE_BM 53 54 #define BM_NUM_OF_POOLS 64 55 #define BM_NUM_OF_PM 8 56 57 /**************************************************************************//** 58 @Description Exceptions 59 *//***************************************************************************/ 60 #define BM_EX_INVALID_COMMAND 0x00000010 61 #define BM_EX_FBPR_THRESHOLD 0x00000008 62 #define BM_EX_MULTI_ECC 0x00000004 63 #define BM_EX_SINGLE_ECC 0x00000002 64 #define BM_EX_POOLS_AVAIL_STATE 0x00000001 65 66 #define GET_EXCEPTION_FLAG(bitMask, exception) \ 67 switch(exception){ \ 68 case e_BM_EX_INVALID_COMMAND: \ 69 bitMask = BM_EX_INVALID_COMMAND; break; \ 70 case e_BM_EX_FBPR_THRESHOLD: \ 71 bitMask = BM_EX_FBPR_THRESHOLD; break; \ 72 case e_BM_EX_SINGLE_ECC: \ 73 bitMask = BM_EX_SINGLE_ECC; break; \ 74 case e_BM_EX_MULTI_ECC: \ 75 bitMask = BM_EX_MULTI_ECC; break; \ 76 default: bitMask = 0;break; \ 77 } 78 79 /**************************************************************************//** 80 @Description defaults 81 *//***************************************************************************/ 82 /* BM defaults */ 83 #define DEFAULT_exceptions (BM_EX_INVALID_COMMAND |\ 84 BM_EX_FBPR_THRESHOLD |\ 85 BM_EX_MULTI_ECC |\ 86 BM_EX_SINGLE_ECC ) 87 88 #define DEFAULT_fbprThreshold 0 89 /* BM-Portal defaults */ 90 #define DEFAULT_memAttr MEMORY_ATTR_CACHEABLE 91 92 /* BM-Pool defaults */ 93 #define DEFAULT_dynamicBpid TRUE 94 #define DEFAULT_useDepletion FALSE 95 #define DEFAULT_useStockpile FALSE 96 #define DEFAULT_numOfBufsPerCmd 8 97 98 /**************************************************************************//** 99 @Description Memory Mapped Registers 100 *//***************************************************************************/ 101 102 #if defined(__MWERKS__) && !defined(__GNUC__) 103 #pragma pack(push,1) 104 #endif /* defined(__MWERKS__) && ... */ 105 #define MEM_MAP_START 106 107 typedef _Packed struct 108 { 109 /* BMan Buffer Pool Configuration & Status Registers */ 110 volatile uint32_t swdet[BM_NUM_OF_POOLS]; /**< S/W Portal depletion entry threshold */ 111 volatile uint32_t hwdet[BM_NUM_OF_POOLS]; /**< H/W Portal depletion entry threshold */ 112 volatile uint32_t swdxt[BM_NUM_OF_POOLS]; /**< S/W Portal depletion exit threshold */ 113 volatile uint32_t hwdxt[BM_NUM_OF_POOLS]; /**< H/W Portal depletion exit threshold */ 114 volatile uint32_t sdcnt[BM_NUM_OF_POOLS]; /**< S/W Portal depletion count */ 115 volatile uint32_t hdcnt[BM_NUM_OF_POOLS]; /**< H/W Portal depletion count */ 116 volatile uint32_t content[BM_NUM_OF_POOLS]; /**< Snapshot of buffer count in Pool */ 117 volatile uint32_t hdptr[BM_NUM_OF_POOLS]; /**< Head Pointer for Pool's FBPR list. */ 118 119 /* Free Buffer Proxy Record (FBPR) Manager Query Registers */ 120 volatile uint32_t fbpr_fpc; /**< FBPR Free Pool Count */ 121 volatile uint32_t fbpr_fp_lwit; /**< FBPR Free Pool Low Watermark Interrupt Threshold */ 122 volatile uint8_t res1[248]; /**< reserved */ 123 124 /* Performance Monitor (PM) Configuration Register */ 125 volatile uint32_t cmd_pm_cfg[BM_NUM_OF_PM]; /**< BMan Command Performance Monitor configuration registers. */ 126 volatile uint32_t fl_pm_cfg[BM_NUM_OF_PM]; /**< BMan Free List Performance Monitor configuration registers */ 127 volatile uint8_t res2[192]; /**< reserved */ 128 129 /* BMan Error Capture Registers */ 130 volatile uint32_t ecsr; /**< BMan Error Capture Status Register */ 131 volatile uint32_t ecir; /**< BMan Error Capture Information Register */ 132 volatile uint32_t eadr; /**< BMan Error Capture Address Register */ 133 volatile uint8_t res3[4]; /**< reserved */ 134 volatile uint32_t edata[8]; /**< BMan ECC Error Data Register */ 135 volatile uint32_t sbet; /**< BMan Single Bit ECC Error Threshold Register */ 136 volatile uint32_t efcr; /**< BMan Error Fetch Capture Register */ 137 volatile uint32_t efar; /**< BMan Error Fetch Address Register */ 138 volatile uint8_t res4[68]; /**< reserved */ 139 volatile uint32_t sbec0; /**< BMan Single Bit ECC Error Count 0 Register */ 140 volatile uint32_t sbec1; /**< BMan Single Bit ECC Error Count 1 Register */ 141 volatile uint8_t res5[368]; /**< reserved */ 142 143 /* BMan ID/Revision Registers */ 144 volatile uint32_t ip_rev_1; /**< BMan IP Block Revision 1 register */ 145 volatile uint32_t ip_rev_2; /**< BMan IP Block Revision 2 register */ 146 147 /* CoreNet Initiator Interface Memory Window Configuration Registers */ 148 volatile uint32_t fbpr_bare; /**< Data Structure Extended Base Address Register */ 149 volatile uint32_t fbpr_bar; /**< Data Structure Base Address Register */ 150 volatile uint8_t res6[8]; /**< reserved */ 151 volatile uint32_t fbpr_ar; /**< Data Structure Attributes Register */ 152 volatile uint8_t res7[240]; /**< reserved */ 153 volatile uint32_t srcidr; /**< BMan Source ID Register */ 154 volatile uint32_t liodnr; /**< BMan Logical I/O Device Number Register */ 155 volatile uint8_t res8[244]; /**< reserved */ 156 157 /* BMan Interrupt and Error Registers */ 158 volatile uint32_t err_isr; /**< BMan Error Interrupt Status Register */ 159 volatile uint32_t err_ier; /**< BMan Error Interrupt Enable Register */ 160 volatile uint32_t err_isdr; /**< BMan Error Interrupt Status Disable Register */ 161 volatile uint32_t err_iir; /**< BMan Error Interrupt Inhibit Register */ 162 volatile uint32_t err_ifr; /**< BMan Error Interrupt Force Register */ 163 } _PackedType t_BmRegs; 164 165 #define MEM_MAP_END 166 #if defined(__MWERKS__) && !defined(__GNUC__) 167 #pragma pack(pop) 168 #endif /* defined(__MWERKS__) && ... */ 169 170 /**************************************************************************//** 171 @Description General defines 172 *//***************************************************************************/ 173 #define MODULE_NAME_SIZE 30 174 175 #define FBPR_ENTRY_SIZE 64 /* 64 bytes */ 176 177 /* Compilation constants */ 178 #define RCR_THRESH 2 /* reread h/w CI when running out of space */ 179 #define RCR_ITHRESH 4 /* if RCR congests, interrupt threshold */ 180 181 /* Lock/unlock portals, subject to "UNLOCKED" flag */ 182 #define NCSW_PLOCK(p) ((t_BmPortal*)(p))->irq_flags = XX_DisableAllIntr() 183 #define PUNLOCK(p) XX_RestoreAllIntr(((t_BmPortal*)(p))->irq_flags) 184 185 #define BM_RCR_RING 0 186 #define BM_NUM_OF_RINGS 1 187 188 /**************************************************************************//** 189 @Description Register defines 190 *//***************************************************************************/ 191 192 /* masks */ 193 #define REV1_MAJOR_MASK 0x0000FF00 194 #define REV1_MINOR_MASK 0x000000FF 195 196 #define REV2_INTEG_MASK 0x00FF0000 197 #define REV2_ERR_MASK 0x0000FF00 198 #define REV2_CFG_MASK 0x000000FF 199 200 #define AR_PRIORITY 0x40000000 201 #define AR_SIZE_MASK 0x0000003f 202 203 /* shifts */ 204 #define REV1_MAJOR_SHIFT 8 205 #define REV1_MINOR_SHIFT 0 206 207 #define REV2_INTEG_SHIFT 16 208 #define REV2_ERR_SHIFT 8 209 #define REV2_CFG_SHIFT 0 210 211 #define AR_SIZE_SHIFT 0 212 213 typedef uint8_t bmRingType_t; 214 typedef uint8_t (t_BmUpdateCb)(struct bm_portal *p_BmPortalLow); 215 typedef void (t_BmPrefetchCb)(struct bm_portal *p_BmPortalLow); 216 typedef void (t_BmCommitCb)(struct bm_portal *p_BmPortalLow, uint8_t myverb); 217 218 typedef struct { 219 bool useStockpile; /**< */ 220 bool dynamicBpid; /**< boolean indicates use of dynamic Bpid */ 221 bool useDepletion; /**< boolean indicates use of depletion */ 222 uint32_t depletionThresholds[MAX_DEPLETION_THRESHOLDS]; /**< depletion-entry/exit thresholds, if useThresholds is set. NB: 223 this is only allowed if useThresholds is used and 224 when run in the control plane (which controls Bman CCSR) */ 225 } t_BmPoolDriverParams; 226 227 typedef struct BmPool { 228 uint8_t bpid; /**< index of the buffer pool to encapsulate (0-63) */ 229 t_Handle h_Bm; 230 t_Handle h_BmPortal; 231 bool shadowMode; 232 uint32_t numOfBuffers; /**< Number of buffers use by this pool */ 233 t_BufferPoolInfo bufferPoolInfo; /**< Data buffers pool information */ 234 uint32_t flags; /**< bit-mask of BMAN_POOL_FLAG_*** options */ 235 t_Handle h_App; /**< opaque user value passed as a parameter to 'cb' */ 236 t_BmDepletionCallback *f_Depletion; /**< depletion-entry/exit callback, if BMAN_POOL_FLAG_DEPLETION is set */ 237 uint32_t swDepletionCount; 238 uint32_t hwDepletionCount; 239 /* stockpile state - NULL unless BMAN_POOL_FLAG_STOCKPILE is set */ 240 struct bm_buffer *sp; 241 uint16_t spFill; 242 uint8_t spBufsCmd; 243 uint16_t spMaxBufs; 244 uint16_t spMinBufs; 245 bool noBuffCtxt; 246 247 t_BmPoolDriverParams *p_BmPoolDriverParams; 248 } t_BmPool; 249 250 typedef struct { 251 t_BmUpdateCb *f_BmUpdateCb; 252 t_BmPrefetchCb *f_BmPrefetchCb; 253 t_BmCommitCb *f_BmCommitCb; 254 } t_BmPortalCallbacks; 255 256 typedef struct { 257 uint32_t hwExtStructsMemAttr; 258 struct bman_depletion mask; 259 } t_BmPortalDriverParams; 260 261 typedef struct { 262 t_Handle h_Bm; 263 struct bm_portal *p_BmPortalLow; 264 t_BmPortalCallbacks cbs[BM_NUM_OF_RINGS]; 265 uintptr_t irq; 266 int cpu; /* This is used for any "core-affine" portals, ie. default portals 267 * associated to the corresponding cpu. -1 implies that there is no core 268 * affinity configured. */ 269 struct bman_depletion pools[2]; /**< 2-element array. pools[0] is mask, pools[1] is snapshot. */ 270 uint32_t flags; /**< BMAN_PORTAL_FLAG_*** - static, caller-provided */ 271 uint32_t irq_flags; 272 int thresh_set; 273 uint32_t slowpoll; 274 uint32_t rcrProd; /**< The wrap-around rcr_[prod|cons] counters are used to support BMAN_RELEASE_FLAG_WAIT_SYNC. */ 275 uint32_t rcrCons; 276 /**< 64-entry hash-table of pool objects that are tracking depletion 277 * entry/exit (ie. BMAN_POOL_FLAG_DEPLETION). This isn't fast-path, so 278 * we're not fussy about cache-misses and so forth - whereas the above 279 * members should all fit in one cacheline. 280 * BTW, with BM_MAX_NUM_OF_POOLS entries in the hash table and BM_MAX_NUM_OF_POOLS buffer pools to track, 281 * you'll never guess the hash-function ... */ 282 t_BmPool *depletionPoolsTable[BM_MAX_NUM_OF_POOLS]; 283 t_BmPortalDriverParams *p_BmPortalDriverParams; 284 } t_BmPortal; 285 286 typedef struct { 287 uint8_t partBpidBase; 288 uint8_t partNumOfPools; 289 uint32_t totalNumOfBuffers; /**< total number of buffers */ 290 uint32_t fbprMemPartitionId; 291 uint32_t fbprThreshold; 292 uint16_t liodn; 293 } t_BmDriverParams; 294 295 typedef struct { 296 uint8_t guestId; 297 t_Handle h_BpidMm; 298 t_Handle h_SpinLock; 299 t_Handle h_Portals[DPAA_MAX_NUM_OF_SW_PORTALS]; 300 t_Handle h_Session; 301 char moduleName[MODULE_NAME_SIZE]; 302 t_BmRegs *p_BmRegs; 303 void *p_FbprBase; 304 uint32_t exceptions; 305 t_BmExceptionsCallback *f_Exception; 306 t_Handle h_App; 307 uintptr_t errIrq; /**< error interrupt line; NO_IRQ if interrupts not used */ 308 t_BmDriverParams *p_BmDriverParams; 309 } t_Bm; 310 311 static __inline__ void BmSetPortalHandle(t_Handle h_Bm, t_Handle h_Portal, e_DpaaSwPortal portalId) 312 { 313 ASSERT_COND(!((t_Bm*)h_Bm)->h_Portals[portalId] || !h_Portal); 314 ((t_Bm*)h_Bm)->h_Portals[portalId] = h_Portal; 315 } 316 317 static __inline__ t_Handle BmGetPortalHandle(t_Handle h_Bm) 318 { 319 t_Bm *p_Bm = (t_Bm*)h_Bm; 320 ASSERT_COND(p_Bm); 321 return p_Bm->h_Portals[CORE_GetId()]; 322 } 323 324 static __inline__ uint8_t BmUpdate(t_BmPortal *p_BmPortal, bmRingType_t type) 325 { 326 return p_BmPortal->cbs[type].f_BmUpdateCb(p_BmPortal->p_BmPortalLow); 327 } 328 329 static __inline__ void BmPrefetch(t_BmPortal *p_BmPortal, bmRingType_t type) 330 { 331 if (p_BmPortal->cbs[type].f_BmPrefetchCb) 332 p_BmPortal->cbs[type].f_BmPrefetchCb(p_BmPortal->p_BmPortalLow); 333 } 334 335 static __inline__ void BmCommit(t_BmPortal *p_BmPortal, bmRingType_t type, uint8_t myverb) 336 { 337 p_BmPortal->cbs[type].f_BmCommitCb(p_BmPortal->p_BmPortalLow, myverb); 338 } 339 340 static __inline__ uint32_t BmBpidGet(t_Bm *p_Bm, bool force, uint32_t base) 341 { 342 uint64_t ans, size = 1; 343 uint64_t alignment = 1; 344 345 if (force) 346 { 347 if (MM_InRange(p_Bm->h_BpidMm, (uint64_t)base)) 348 { 349 ans = MM_GetForce(p_Bm->h_BpidMm, 350 base, 351 size, 352 "BM BPID MEM"); 353 ans = base; 354 } 355 else if (p_Bm->h_Session) 356 { 357 t_BmIpcMsg msg; 358 t_BmIpcReply reply; 359 uint32_t replyLength; 360 t_BmIpcBpidParams ipcBpid; 361 t_Error errCode = E_OK; 362 363 memset(&msg, 0, sizeof(t_BmIpcMsg)); 364 memset(&reply, 0, sizeof(t_BmIpcReply)); 365 ipcBpid.bpid = (uint8_t)base; 366 msg.msgId = BM_FORCE_BPID; 367 memcpy(msg.msgBody, &ipcBpid, sizeof(t_BmIpcBpidParams)); 368 replyLength = sizeof(uint32_t) + sizeof(uint32_t); 369 if ((errCode = XX_IpcSendMessage(p_Bm->h_Session, 370 (uint8_t*)&msg, 371 sizeof(msg.msgId) + sizeof(t_BmIpcBpidParams), 372 (uint8_t*)&reply, 373 &replyLength, 374 NULL, 375 NULL)) != E_OK) 376 { 377 REPORT_ERROR(MAJOR, errCode, NO_MSG); 378 return (uint32_t)ILLEGAL_BASE; 379 } 380 if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t))) 381 { 382 REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 383 return (uint32_t)ILLEGAL_BASE; 384 } 385 memcpy((uint8_t*)&ans, reply.replyBody, sizeof(uint32_t)); 386 } 387 else 388 { 389 DBG(WARNING, ("No Ipc - can't validate bpid.")); 390 ans = base; 391 } 392 } 393 else 394 ans = MM_Get(p_Bm->h_BpidMm, 395 size, 396 alignment, 397 "BM BPID MEM"); 398 KASSERT(ans < UINT32_MAX, ("Oops, %lx > UINT32_MAX!\n", ans)); 399 return (uint32_t)ans; 400 } 401 402 static __inline__ t_Error BmBpidPut(t_Bm *p_Bm, uint32_t base) 403 { 404 if (MM_InRange(p_Bm->h_BpidMm, (uint64_t)base)) 405 { 406 if (MM_Put(p_Bm->h_BpidMm, (uint64_t)base) != base) 407 return E_OK; 408 else 409 return ERROR_CODE(E_NOT_FOUND); 410 } 411 else if (p_Bm->h_Session) 412 { 413 t_BmIpcMsg msg; 414 t_BmIpcBpidParams ipcBpid; 415 t_Error errCode = E_OK; 416 417 memset(&msg, 0, sizeof(t_BmIpcMsg)); 418 ipcBpid.bpid = (uint8_t)base; 419 msg.msgId = BM_PUT_BPID; 420 memcpy(msg.msgBody, &ipcBpid, sizeof(t_BmIpcBpidParams)); 421 if ((errCode = XX_IpcSendMessage(p_Bm->h_Session, 422 (uint8_t*)&msg, 423 sizeof(msg.msgId) + sizeof(t_BmIpcBpidParams), 424 NULL, 425 NULL, 426 NULL, 427 NULL)) != E_OK) 428 RETURN_ERROR(MAJOR, errCode, NO_MSG); 429 } 430 else 431 DBG(WARNING, ("No Ipc - can't validate bpid.")); 432 return E_OK; 433 } 434 435 /****************************************/ 436 /* Inter-Module functions */ 437 /****************************************/ 438 typedef enum e_BmInterModuleCounters { 439 e_BM_IM_COUNTERS_FBPR = 0, 440 e_BM_IM_COUNTERS_POOL_CONTENT, 441 e_BM_IM_COUNTERS_POOL_SW_DEPLETION, 442 e_BM_IM_COUNTERS_POOL_HW_DEPLETION 443 } e_BmInterModuleCounters; 444 445 446 t_Error BmSetPoolThresholds(t_Handle h_Bm, uint8_t bpid, const uint32_t *thresholds); 447 t_Error BmUnSetPoolThresholds(t_Handle h_Bm, uint8_t bpid); 448 uint8_t BmPortalAcquire(t_Handle h_BmPortal, uint8_t bpid, struct bm_buffer *bufs, uint8_t num); 449 t_Error BmPortalRelease(t_Handle h_BmPortal, uint8_t bpid, struct bm_buffer *bufs, uint8_t num, uint32_t flags); 450 t_Error BmPortalQuery(t_Handle h_BmPortal, struct bman_depletion *p_Pools, bool depletion); 451 uint32_t BmGetCounter(t_Handle h_Bm, e_BmInterModuleCounters counter, uint8_t bpid); 452 t_Error BmGetRevision(t_Handle h_Bm, t_BmRevisionInfo *p_BmRevisionInfo); 453 454 455 #endif /* __BM_H */ 456