1 /* 2 * Copyright 2008-2012 Freescale Semiconductor Inc. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are met: 6 * * Redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer. 8 * * Redistributions in binary form must reproduce the above copyright 9 * notice, this list of conditions and the following disclaimer in the 10 * documentation and/or other materials provided with the distribution. 11 * * Neither the name of Freescale Semiconductor nor the 12 * names of its contributors may be used to endorse or promote products 13 * derived from this software without specific prior written permission. 14 * 15 * 16 * ALTERNATIVELY, this software may be distributed under the terms of the 17 * GNU General Public License ("GPL") as published by the Free Software 18 * Foundation, either version 2 of that License or (at your option) any 19 * later version. 20 * 21 * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY 22 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 23 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 24 * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY 25 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 27 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 28 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 34 #include "std_ext.h" 35 #include "error_ext.h" 36 #include "sprint_ext.h" 37 #include "string_ext.h" 38 39 #include "fm_common.h" 40 #include "fm_hc.h" 41 42 43 /**************************************************************************//** 44 @Description defaults 45 *//***************************************************************************/ 46 #define DEFAULT_dataMemId 0 47 48 #define HC_HCOR_OPCODE_PLCR_PRFL 0x0 49 #define HC_HCOR_OPCODE_KG_SCM 0x1 50 #define HC_HCOR_OPCODE_SYNC 0x2 51 #define HC_HCOR_OPCODE_CC 0x3 52 #define HC_HCOR_OPCODE_CC_AGE_MASK 0x4 53 #define HC_HCOR_OPCODE_CC_CAPWAP_REASSM_TIMEOUT 0x5 54 #define HC_HCOR_OPCODE_CC_REASSM_TIMEOUT 0x10 55 #define HC_HCOR_OPCODE_CC_IP_FRAG_INITIALIZATION 0x11 56 #define HC_HCOR_OPCODE_CC_UPDATE_WITH_AGING 0x13 57 #define HC_HCOR_ACTION_REG_REASSM_TIMEOUT_ACTIVE_SHIFT 24 58 #define HC_HCOR_EXTRA_REG_REASSM_TIMEOUT_TSBS_SHIFT 24 59 #define HC_HCOR_EXTRA_REG_CC_AGING_ADD 0x80000000 60 #define HC_HCOR_EXTRA_REG_CC_AGING_REMOVE 0x40000000 61 #define HC_HCOR_EXTRA_REG_CC_AGING_CHANGE_MASK 0xC0000000 62 #define HC_HCOR_EXTRA_REG_CC_REMOVE_INDX_SHIFT 24 63 #define HC_HCOR_EXTRA_REG_CC_REMOVE_INDX_MASK 0x1F000000 64 #define HC_HCOR_ACTION_REG_REASSM_TIMEOUT_RES_SHIFT 16 65 #define HC_HCOR_ACTION_REG_REASSM_TIMEOUT_RES_MASK 0xF 66 #define HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_CMD_SHIFT 24 67 #define HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_BPID 16 68 69 #define HC_HCOR_GBL 0x20000000 70 71 #define HC_HCOR_KG_SCHEME_COUNTER 0x00000400 72 73 #if (DPAA_VERSION == 10) 74 #define HC_HCOR_KG_SCHEME_REGS_MASK 0xFFFFF800 75 #else 76 #define HC_HCOR_KG_SCHEME_REGS_MASK 0xFFFFFE00 77 #endif /* (DPAA_VERSION == 10) */ 78 79 #define SIZE_OF_HC_FRAME_PORT_REGS (sizeof(t_HcFrame)-sizeof(struct fman_kg_scheme_regs)+sizeof(t_FmPcdKgPortRegs)) 80 #define SIZE_OF_HC_FRAME_SCHEME_REGS sizeof(t_HcFrame) 81 #define SIZE_OF_HC_FRAME_PROFILES_REGS (sizeof(t_HcFrame)-sizeof(struct fman_kg_scheme_regs)+sizeof(t_FmPcdPlcrProfileRegs)) 82 #define SIZE_OF_HC_FRAME_PROFILE_CNT (sizeof(t_HcFrame)-sizeof(t_FmPcdPlcrProfileRegs)+sizeof(uint32_t)) 83 #define SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC 16 84 85 #define HC_CMD_POOL_SIZE (INTG_MAX_NUM_OF_CORES) 86 87 #define BUILD_FD(len) \ 88 do { \ 89 memset(&fmFd, 0, sizeof(t_DpaaFD)); \ 90 DPAA_FD_SET_ADDR(&fmFd, p_HcFrame); \ 91 DPAA_FD_SET_OFFSET(&fmFd, 0); \ 92 DPAA_FD_SET_LENGTH(&fmFd, len); \ 93 } while (0) 94 95 96 #if defined(__MWERKS__) && !defined(__GNUC__) 97 #pragma pack(push,1) 98 #endif /* defined(__MWERKS__) && ... */ 99 100 typedef struct t_FmPcdKgPortRegs { 101 volatile uint32_t spReg; 102 volatile uint32_t cppReg; 103 } t_FmPcdKgPortRegs; 104 105 typedef struct t_HcFrame { 106 volatile uint32_t opcode; 107 volatile uint32_t actionReg; 108 volatile uint32_t extraReg; 109 volatile uint32_t commandSequence; 110 union { 111 struct fman_kg_scheme_regs schemeRegs; 112 struct fman_kg_scheme_regs schemeRegsWithoutCounter; 113 t_FmPcdPlcrProfileRegs profileRegs; 114 volatile uint32_t singleRegForWrite; /* for writing SP, CPP, profile counter */ 115 t_FmPcdKgPortRegs portRegsForRead; 116 volatile uint32_t clsPlanEntries[CLS_PLAN_NUM_PER_GRP]; 117 t_FmPcdCcCapwapReassmTimeoutParams ccCapwapReassmTimeout; 118 t_FmPcdCcReassmTimeoutParams ccReassmTimeout; 119 } hcSpecificData; 120 } t_HcFrame; 121 122 #if defined(__MWERKS__) && !defined(__GNUC__) 123 #pragma pack(pop) 124 #endif /* defined(__MWERKS__) && ... */ 125 126 127 typedef struct t_FmHc { 128 t_Handle h_FmPcd; 129 t_Handle h_HcPortDev; 130 t_FmPcdQmEnqueueCallback *f_QmEnqueue; /**< A callback for enqueuing frames to the QM */ 131 t_Handle h_QmArg; /**< A handle to the QM module */ 132 uint8_t dataMemId; /**< Memory partition ID for data buffers */ 133 134 uint32_t seqNum[HC_CMD_POOL_SIZE]; /* FIFO of seqNum to use when 135 taking buffer */ 136 uint32_t nextSeqNumLocation; /* seqNum location in seqNum[] for next buffer */ 137 volatile bool enqueued[HC_CMD_POOL_SIZE]; /* HC is active - frame is enqueued 138 and not confirmed yet */ 139 t_HcFrame *p_Frm[HC_CMD_POOL_SIZE]; 140 } t_FmHc; 141 142 143 static t_Error FillBufPool(t_FmHc *p_FmHc) 144 { 145 uint32_t i; 146 147 ASSERT_COND(p_FmHc); 148 149 for (i = 0; i < HC_CMD_POOL_SIZE; i++) 150 { 151 #ifdef FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004 152 p_FmHc->p_Frm[i] = (t_HcFrame *)XX_MallocSmart((sizeof(t_HcFrame) + (16 - (sizeof(t_FmHc) % 16))), 153 p_FmHc->dataMemId, 154 16); 155 #else 156 p_FmHc->p_Frm[i] = (t_HcFrame *)XX_MallocSmart(sizeof(t_HcFrame), 157 p_FmHc->dataMemId, 158 16); 159 #endif /* FM_LOCKUP_ALIGNMENT_ERRATA_FMAN_SW004 */ 160 if (!p_FmHc->p_Frm[i]) 161 RETURN_ERROR(MAJOR, E_NO_MEMORY, ("FM HC frames!")); 162 } 163 164 /* Initialize FIFO of seqNum to use during GetBuf */ 165 for (i = 0; i < HC_CMD_POOL_SIZE; i++) 166 { 167 p_FmHc->seqNum[i] = i; 168 } 169 p_FmHc->nextSeqNumLocation = 0; 170 171 return E_OK; 172 } 173 174 static __inline__ t_HcFrame * GetBuf(t_FmHc *p_FmHc, uint32_t *p_SeqNum) 175 { 176 uint32_t intFlags; 177 178 ASSERT_COND(p_FmHc); 179 180 intFlags = FmPcdLock(p_FmHc->h_FmPcd); 181 182 if (p_FmHc->nextSeqNumLocation == HC_CMD_POOL_SIZE) 183 { 184 /* No more buffers */ 185 FmPcdUnlock(p_FmHc->h_FmPcd, intFlags); 186 return NULL; 187 } 188 189 *p_SeqNum = p_FmHc->seqNum[p_FmHc->nextSeqNumLocation]; 190 p_FmHc->nextSeqNumLocation++; 191 192 FmPcdUnlock(p_FmHc->h_FmPcd, intFlags); 193 return p_FmHc->p_Frm[*p_SeqNum]; 194 } 195 196 static __inline__ void PutBuf(t_FmHc *p_FmHc, t_HcFrame *p_Buf, uint32_t seqNum) 197 { 198 uint32_t intFlags; 199 200 UNUSED(p_Buf); 201 202 intFlags = FmPcdLock(p_FmHc->h_FmPcd); 203 ASSERT_COND(p_FmHc->nextSeqNumLocation); 204 p_FmHc->nextSeqNumLocation--; 205 p_FmHc->seqNum[p_FmHc->nextSeqNumLocation] = seqNum; 206 FmPcdUnlock(p_FmHc->h_FmPcd, intFlags); 207 } 208 209 static __inline__ t_Error EnQFrm(t_FmHc *p_FmHc, t_DpaaFD *p_FmFd, uint32_t seqNum) 210 { 211 t_Error err = E_OK; 212 uint32_t intFlags; 213 uint32_t timeout=100; 214 215 intFlags = FmPcdLock(p_FmHc->h_FmPcd); 216 ASSERT_COND(!p_FmHc->enqueued[seqNum]); 217 p_FmHc->enqueued[seqNum] = TRUE; 218 FmPcdUnlock(p_FmHc->h_FmPcd, intFlags); 219 DBG(TRACE, ("Send Hc, SeqNum %d, buff@0x%x, fd offset 0x%x", 220 seqNum, 221 DPAA_FD_GET_ADDR(p_FmFd), 222 DPAA_FD_GET_OFFSET(p_FmFd))); 223 err = p_FmHc->f_QmEnqueue(p_FmHc->h_QmArg, (void *)p_FmFd); 224 if (err) 225 RETURN_ERROR(MINOR, err, ("HC enqueue failed")); 226 227 while (p_FmHc->enqueued[seqNum] && --timeout) 228 XX_UDelay(100); 229 230 if (!timeout) 231 RETURN_ERROR(MINOR, E_TIMEOUT, ("HC Callback, timeout exceeded")); 232 233 return err; 234 } 235 236 237 t_Handle FmHcConfigAndInit(t_FmHcParams *p_FmHcParams) 238 { 239 t_FmHc *p_FmHc; 240 t_FmPortParams fmPortParam; 241 t_Error err; 242 243 p_FmHc = (t_FmHc *)XX_Malloc(sizeof(t_FmHc)); 244 if (!p_FmHc) 245 { 246 REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC obj")); 247 return NULL; 248 } 249 memset(p_FmHc,0,sizeof(t_FmHc)); 250 251 p_FmHc->h_FmPcd = p_FmHcParams->h_FmPcd; 252 p_FmHc->f_QmEnqueue = p_FmHcParams->params.f_QmEnqueue; 253 p_FmHc->h_QmArg = p_FmHcParams->params.h_QmArg; 254 p_FmHc->dataMemId = DEFAULT_dataMemId; 255 256 err = FillBufPool(p_FmHc); 257 if (err != E_OK) 258 { 259 REPORT_ERROR(MAJOR, err, NO_MSG); 260 FmHcFree(p_FmHc); 261 return NULL; 262 } 263 264 if (!FmIsMaster(p_FmHcParams->h_Fm)) 265 return (t_Handle)p_FmHc; 266 267 memset(&fmPortParam, 0, sizeof(fmPortParam)); 268 fmPortParam.baseAddr = p_FmHcParams->params.portBaseAddr; 269 fmPortParam.portType = e_FM_PORT_TYPE_OH_HOST_COMMAND; 270 fmPortParam.portId = p_FmHcParams->params.portId; 271 fmPortParam.liodnBase = p_FmHcParams->params.liodnBase; 272 fmPortParam.h_Fm = p_FmHcParams->h_Fm; 273 274 fmPortParam.specificParams.nonRxParams.errFqid = p_FmHcParams->params.errFqid; 275 fmPortParam.specificParams.nonRxParams.dfltFqid = p_FmHcParams->params.confFqid; 276 fmPortParam.specificParams.nonRxParams.qmChannel = p_FmHcParams->params.qmChannel; 277 278 p_FmHc->h_HcPortDev = FM_PORT_Config(&fmPortParam); 279 if (!p_FmHc->h_HcPortDev) 280 { 281 REPORT_ERROR(MAJOR, E_INVALID_HANDLE, ("FM HC port!")); 282 XX_Free(p_FmHc); 283 return NULL; 284 } 285 286 err = FM_PORT_ConfigMaxFrameLength(p_FmHc->h_HcPortDev, 287 (uint16_t)sizeof(t_HcFrame)); 288 289 if (err != E_OK) 290 { 291 REPORT_ERROR(MAJOR, err, ("FM HC port init!")); 292 FmHcFree(p_FmHc); 293 return NULL; 294 } 295 296 /* final init */ 297 err = FM_PORT_Init(p_FmHc->h_HcPortDev); 298 if (err != E_OK) 299 { 300 REPORT_ERROR(MAJOR, err, ("FM HC port init!")); 301 FmHcFree(p_FmHc); 302 return NULL; 303 } 304 305 err = FM_PORT_Enable(p_FmHc->h_HcPortDev); 306 if (err != E_OK) 307 { 308 REPORT_ERROR(MAJOR, err, ("FM HC port enable!")); 309 FmHcFree(p_FmHc); 310 return NULL; 311 } 312 313 return (t_Handle)p_FmHc; 314 } 315 316 void FmHcFree(t_Handle h_FmHc) 317 { 318 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 319 int i; 320 321 if (!p_FmHc) 322 return; 323 324 for (i=0; i<HC_CMD_POOL_SIZE; i++) 325 if (p_FmHc->p_Frm[i]) 326 XX_FreeSmart(p_FmHc->p_Frm[i]); 327 else 328 break; 329 330 if (p_FmHc->h_HcPortDev) 331 FM_PORT_Free(p_FmHc->h_HcPortDev); 332 333 XX_Free(p_FmHc); 334 } 335 336 /*****************************************************************************/ 337 t_Error FmHcSetFramesDataMemory(t_Handle h_FmHc, 338 uint8_t memId) 339 { 340 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 341 int i; 342 343 SANITY_CHECK_RETURN_ERROR(p_FmHc, E_INVALID_HANDLE); 344 345 p_FmHc->dataMemId = memId; 346 347 for (i=0; i<HC_CMD_POOL_SIZE; i++) 348 if (p_FmHc->p_Frm[i]) 349 XX_FreeSmart(p_FmHc->p_Frm[i]); 350 351 return FillBufPool(p_FmHc); 352 } 353 354 void FmHcTxConf(t_Handle h_FmHc, t_DpaaFD *p_Fd) 355 { 356 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 357 t_HcFrame *p_HcFrame; 358 uint32_t intFlags; 359 360 ASSERT_COND(p_FmHc); 361 362 intFlags = FmPcdLock(p_FmHc->h_FmPcd); 363 p_HcFrame = (t_HcFrame *)PTR_MOVE(DPAA_FD_GET_ADDR(p_Fd), DPAA_FD_GET_OFFSET(p_Fd)); 364 365 DBG(TRACE, ("Hc Conf, SeqNum %d, FD@0x%x, fd offset 0x%x", 366 p_HcFrame->commandSequence, DPAA_FD_GET_ADDR(p_Fd), DPAA_FD_GET_OFFSET(p_Fd))); 367 368 if (!(p_FmHc->enqueued[p_HcFrame->commandSequence])) 369 REPORT_ERROR(MINOR, E_INVALID_FRAME, ("Not an Host-Command frame received!")); 370 else 371 p_FmHc->enqueued[p_HcFrame->commandSequence] = FALSE; 372 FmPcdUnlock(p_FmHc->h_FmPcd, intFlags); 373 } 374 375 t_Error FmHcPcdKgSetScheme(t_Handle h_FmHc, 376 t_Handle h_Scheme, 377 struct fman_kg_scheme_regs *p_SchemeRegs, 378 bool updateCounter) 379 { 380 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 381 t_Error err = E_OK; 382 t_HcFrame *p_HcFrame; 383 t_DpaaFD fmFd; 384 uint8_t physicalSchemeId; 385 uint32_t seqNum; 386 387 p_HcFrame = GetBuf(p_FmHc, &seqNum); 388 if (!p_HcFrame) 389 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 390 391 physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme); 392 393 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 394 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM); 395 p_HcFrame->actionReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, updateCounter); 396 p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK; 397 memcpy(&p_HcFrame->hcSpecificData.schemeRegs, p_SchemeRegs, sizeof(struct fman_kg_scheme_regs)); 398 if (!updateCounter) 399 { 400 p_HcFrame->hcSpecificData.schemeRegs.kgse_dv0 = p_SchemeRegs->kgse_dv0; 401 p_HcFrame->hcSpecificData.schemeRegs.kgse_dv1 = p_SchemeRegs->kgse_dv1; 402 p_HcFrame->hcSpecificData.schemeRegs.kgse_ccbs = p_SchemeRegs->kgse_ccbs; 403 p_HcFrame->hcSpecificData.schemeRegs.kgse_mv = p_SchemeRegs->kgse_mv; 404 } 405 p_HcFrame->commandSequence = seqNum; 406 407 BUILD_FD(sizeof(t_HcFrame)); 408 409 err = EnQFrm(p_FmHc, &fmFd, seqNum); 410 411 PutBuf(p_FmHc, p_HcFrame, seqNum); 412 413 if (err != E_OK) 414 RETURN_ERROR(MINOR, err, NO_MSG); 415 416 return E_OK; 417 } 418 419 t_Error FmHcPcdKgDeleteScheme(t_Handle h_FmHc, t_Handle h_Scheme) 420 { 421 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 422 t_Error err = E_OK; 423 t_HcFrame *p_HcFrame; 424 t_DpaaFD fmFd; 425 uint8_t physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme); 426 uint32_t seqNum; 427 428 p_HcFrame = GetBuf(p_FmHc, &seqNum); 429 if (!p_HcFrame) 430 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 431 432 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 433 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM); 434 p_HcFrame->actionReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, TRUE); 435 p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK; 436 memset(&p_HcFrame->hcSpecificData.schemeRegs, 0, sizeof(struct fman_kg_scheme_regs)); 437 p_HcFrame->commandSequence = seqNum; 438 439 BUILD_FD(sizeof(t_HcFrame)); 440 441 err = EnQFrm(p_FmHc, &fmFd, seqNum); 442 443 PutBuf(p_FmHc, p_HcFrame, seqNum); 444 445 if (err != E_OK) 446 RETURN_ERROR(MINOR, err, NO_MSG); 447 448 return E_OK; 449 } 450 451 t_Error FmHcPcdKgCcGetSetParams(t_Handle h_FmHc, t_Handle h_Scheme, uint32_t requiredAction, uint32_t value) 452 { 453 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 454 t_Error err = E_OK; 455 t_HcFrame *p_HcFrame; 456 t_DpaaFD fmFd; 457 uint8_t relativeSchemeId; 458 uint8_t physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme); 459 uint32_t tmpReg32 = 0; 460 uint32_t seqNum; 461 462 /* Scheme is locked by calling routine */ 463 /* WARNING - this lock will not be efficient if other HC routine will attempt to change 464 * "kgse_mode" or "kgse_om" without locking scheme ! 465 */ 466 467 relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId); 468 if ( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES) 469 RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG); 470 471 if (!FmPcdKgGetRequiredActionFlag(p_FmHc->h_FmPcd, relativeSchemeId) || 472 !(FmPcdKgGetRequiredAction(p_FmHc->h_FmPcd, relativeSchemeId) & requiredAction)) 473 { 474 if ((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA) && 475 (FmPcdKgGetNextEngine(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_PLCR)) 476 { 477 if ((FmPcdKgIsDirectPlcr(p_FmHc->h_FmPcd, relativeSchemeId) == FALSE) || 478 (FmPcdKgIsDistrOnPlcrProfile(p_FmHc->h_FmPcd, relativeSchemeId) == TRUE)) 479 RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("In this situation PP can not be with distribution and has to be shared")); 480 err = FmPcdPlcrCcGetSetParams(p_FmHc->h_FmPcd, FmPcdKgGetRelativeProfileId(p_FmHc->h_FmPcd, relativeSchemeId), requiredAction); 481 if (err) 482 RETURN_ERROR(MAJOR, err, NO_MSG); 483 } 484 else /* From here we deal with KG-Schemes only */ 485 { 486 /* Pre change general code */ 487 p_HcFrame = GetBuf(p_FmHc, &seqNum); 488 if (!p_HcFrame) 489 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 490 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 491 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM); 492 p_HcFrame->actionReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId); 493 p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK; 494 p_HcFrame->commandSequence = seqNum; 495 BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC); 496 if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK) 497 { 498 PutBuf(p_FmHc, p_HcFrame, seqNum); 499 RETURN_ERROR(MINOR, err, NO_MSG); 500 } 501 502 /* specific change */ 503 if ((requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA) && 504 ((FmPcdKgGetNextEngine(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_DONE) && 505 (FmPcdKgGetDoneAction(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_ENQ_FRAME))) 506 { 507 tmpReg32 = p_HcFrame->hcSpecificData.schemeRegs.kgse_mode; 508 ASSERT_COND(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME)); 509 p_HcFrame->hcSpecificData.schemeRegs.kgse_mode = tmpReg32 | NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA; 510 } 511 512 if ((requiredAction & UPDATE_KG_NIA_CC_WA) && 513 (FmPcdKgGetNextEngine(p_FmHc->h_FmPcd, relativeSchemeId) == e_FM_PCD_CC)) 514 { 515 tmpReg32 = p_HcFrame->hcSpecificData.schemeRegs.kgse_mode; 516 ASSERT_COND(tmpReg32 & (NIA_ENG_FM_CTL | NIA_FM_CTL_AC_CC)); 517 tmpReg32 &= ~NIA_FM_CTL_AC_CC; 518 p_HcFrame->hcSpecificData.schemeRegs.kgse_mode = tmpReg32 | NIA_FM_CTL_AC_PRE_CC; 519 } 520 521 if (requiredAction & UPDATE_KG_OPT_MODE) 522 p_HcFrame->hcSpecificData.schemeRegs.kgse_om = value; 523 524 if (requiredAction & UPDATE_KG_NIA) 525 { 526 tmpReg32 = p_HcFrame->hcSpecificData.schemeRegs.kgse_mode; 527 tmpReg32 &= ~(NIA_ENG_MASK | NIA_AC_MASK); 528 tmpReg32 |= value; 529 p_HcFrame->hcSpecificData.schemeRegs.kgse_mode = tmpReg32; 530 } 531 532 /* Post change general code */ 533 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM); 534 p_HcFrame->actionReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, FALSE); 535 p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK; 536 537 BUILD_FD(sizeof(t_HcFrame)); 538 err = EnQFrm(p_FmHc, &fmFd, seqNum); 539 540 PutBuf(p_FmHc, p_HcFrame, seqNum); 541 542 if (err != E_OK) 543 RETURN_ERROR(MINOR, err, NO_MSG); 544 } 545 } 546 547 return E_OK; 548 } 549 550 uint32_t FmHcPcdKgGetSchemeCounter(t_Handle h_FmHc, t_Handle h_Scheme) 551 { 552 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 553 t_Error err; 554 t_HcFrame *p_HcFrame; 555 t_DpaaFD fmFd; 556 uint32_t retVal; 557 uint8_t relativeSchemeId; 558 uint8_t physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme); 559 uint32_t seqNum; 560 561 relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId); 562 if ( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES) 563 { 564 REPORT_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG); 565 return 0; 566 } 567 568 /* first read scheme and check that it is valid */ 569 p_HcFrame = GetBuf(p_FmHc, &seqNum); 570 if (!p_HcFrame) 571 { 572 REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 573 return 0; 574 } 575 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 576 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM); 577 p_HcFrame->actionReg = FmPcdKgBuildReadSchemeActionReg(physicalSchemeId); 578 p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK; 579 p_HcFrame->commandSequence = seqNum; 580 581 BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC); 582 583 err = EnQFrm(p_FmHc, &fmFd, seqNum); 584 if (err != E_OK) 585 { 586 PutBuf(p_FmHc, p_HcFrame, seqNum); 587 REPORT_ERROR(MINOR, err, NO_MSG); 588 return 0; 589 } 590 591 if (!FmPcdKgHwSchemeIsValid(p_HcFrame->hcSpecificData.schemeRegs.kgse_mode)) 592 { 593 PutBuf(p_FmHc, p_HcFrame, seqNum); 594 REPORT_ERROR(MAJOR, E_ALREADY_EXISTS, ("Scheme is invalid")); 595 return 0; 596 } 597 598 retVal = p_HcFrame->hcSpecificData.schemeRegs.kgse_spc; 599 PutBuf(p_FmHc, p_HcFrame, seqNum); 600 601 return retVal; 602 } 603 604 t_Error FmHcPcdKgSetSchemeCounter(t_Handle h_FmHc, t_Handle h_Scheme, uint32_t value) 605 { 606 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 607 t_Error err = E_OK; 608 t_HcFrame *p_HcFrame; 609 t_DpaaFD fmFd; 610 uint8_t relativeSchemeId, physicalSchemeId; 611 uint32_t seqNum; 612 613 physicalSchemeId = FmPcdKgGetSchemeId(h_Scheme); 614 relativeSchemeId = FmPcdKgGetRelativeSchemeId(p_FmHc->h_FmPcd, physicalSchemeId); 615 if ( relativeSchemeId == FM_PCD_KG_NUM_OF_SCHEMES) 616 RETURN_ERROR(MAJOR, E_NOT_IN_RANGE, NO_MSG); 617 618 /* first read scheme and check that it is valid */ 619 p_HcFrame = GetBuf(p_FmHc, &seqNum); 620 if (!p_HcFrame) 621 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 622 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 623 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM); 624 p_HcFrame->actionReg = FmPcdKgBuildWriteSchemeActionReg(physicalSchemeId, TRUE); 625 p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_COUNTER; 626 /* write counter */ 627 p_HcFrame->hcSpecificData.singleRegForWrite = value; 628 p_HcFrame->commandSequence = seqNum; 629 630 BUILD_FD(sizeof(t_HcFrame)); 631 632 err = EnQFrm(p_FmHc, &fmFd, seqNum); 633 634 PutBuf(p_FmHc, p_HcFrame, seqNum); 635 return err; 636 } 637 638 t_Error FmHcPcdKgSetClsPlan(t_Handle h_FmHc, t_FmPcdKgInterModuleClsPlanSet *p_Set) 639 { 640 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 641 t_HcFrame *p_HcFrame; 642 t_DpaaFD fmFd; 643 uint8_t i, idx; 644 uint32_t seqNum; 645 t_Error err = E_OK; 646 647 ASSERT_COND(p_FmHc); 648 649 p_HcFrame = GetBuf(p_FmHc, &seqNum); 650 if (!p_HcFrame) 651 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 652 653 for (i = p_Set->baseEntry; i < (p_Set->baseEntry+p_Set->numOfClsPlanEntries); i+=8) 654 { 655 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 656 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM); 657 p_HcFrame->actionReg = FmPcdKgBuildWriteClsPlanBlockActionReg((uint8_t)(i / CLS_PLAN_NUM_PER_GRP)); 658 p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK; 659 660 idx = (uint8_t)(i - p_Set->baseEntry); 661 memcpy(__DEVOLATILE(uint32_t *, &p_HcFrame->hcSpecificData.clsPlanEntries), &p_Set->vectors[idx], CLS_PLAN_NUM_PER_GRP*sizeof(uint32_t)); 662 p_HcFrame->commandSequence = seqNum; 663 664 BUILD_FD(sizeof(t_HcFrame)); 665 666 if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK) 667 { 668 PutBuf(p_FmHc, p_HcFrame, seqNum); 669 RETURN_ERROR(MINOR, err, NO_MSG); 670 } 671 } 672 673 PutBuf(p_FmHc, p_HcFrame, seqNum); 674 return err; 675 } 676 677 t_Error FmHcPcdKgDeleteClsPlan(t_Handle h_FmHc, uint8_t grpId) 678 { 679 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 680 t_FmPcdKgInterModuleClsPlanSet *p_ClsPlanSet; 681 682 p_ClsPlanSet = (t_FmPcdKgInterModuleClsPlanSet *)XX_Malloc(sizeof(t_FmPcdKgInterModuleClsPlanSet)); 683 if (!p_ClsPlanSet) 684 RETURN_ERROR(MAJOR, E_NO_MEMORY, ("Classification plan set")); 685 686 memset(p_ClsPlanSet, 0, sizeof(t_FmPcdKgInterModuleClsPlanSet)); 687 688 p_ClsPlanSet->baseEntry = FmPcdKgGetClsPlanGrpBase(p_FmHc->h_FmPcd, grpId); 689 p_ClsPlanSet->numOfClsPlanEntries = FmPcdKgGetClsPlanGrpSize(p_FmHc->h_FmPcd, grpId); 690 ASSERT_COND(p_ClsPlanSet->numOfClsPlanEntries <= FM_PCD_MAX_NUM_OF_CLS_PLANS); 691 692 if (FmHcPcdKgSetClsPlan(p_FmHc, p_ClsPlanSet) != E_OK) 693 { 694 XX_Free(p_ClsPlanSet); 695 RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG); 696 } 697 698 XX_Free(p_ClsPlanSet); 699 FmPcdKgDestroyClsPlanGrp(p_FmHc->h_FmPcd, grpId); 700 701 return E_OK; 702 } 703 704 t_Error FmHcPcdCcCapwapTimeoutReassm(t_Handle h_FmHc, t_FmPcdCcCapwapReassmTimeoutParams *p_CcCapwapReassmTimeoutParams ) 705 { 706 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 707 t_HcFrame *p_HcFrame; 708 t_DpaaFD fmFd; 709 t_Error err; 710 uint32_t seqNum; 711 712 SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0); 713 714 p_HcFrame = GetBuf(p_FmHc, &seqNum); 715 if (!p_HcFrame) 716 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 717 718 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 719 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC_CAPWAP_REASSM_TIMEOUT); 720 memcpy(&p_HcFrame->hcSpecificData.ccCapwapReassmTimeout, p_CcCapwapReassmTimeoutParams, sizeof(t_FmPcdCcCapwapReassmTimeoutParams)); 721 p_HcFrame->commandSequence = seqNum; 722 BUILD_FD(sizeof(t_HcFrame)); 723 724 err = EnQFrm(p_FmHc, &fmFd, seqNum); 725 726 PutBuf(p_FmHc, p_HcFrame, seqNum); 727 return err; 728 } 729 730 t_Error FmHcPcdCcIpFragScratchPollCmd(t_Handle h_FmHc, bool fill, t_FmPcdCcFragScratchPoolCmdParams *p_FmPcdCcFragScratchPoolCmdParams) 731 { 732 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 733 t_HcFrame *p_HcFrame; 734 t_DpaaFD fmFd; 735 t_Error err; 736 uint32_t seqNum; 737 738 SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0); 739 740 p_HcFrame = GetBuf(p_FmHc, &seqNum); 741 if (!p_HcFrame) 742 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 743 744 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 745 746 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC_IP_FRAG_INITIALIZATION); 747 p_HcFrame->actionReg = (uint32_t)(((fill == TRUE) ? 0 : 1) << HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_CMD_SHIFT); 748 p_HcFrame->actionReg |= p_FmPcdCcFragScratchPoolCmdParams->bufferPoolId << HC_HCOR_ACTION_REG_IP_FRAG_SCRATCH_POOL_BPID; 749 if (fill == TRUE) 750 { 751 p_HcFrame->extraReg = p_FmPcdCcFragScratchPoolCmdParams->numOfBuffers; 752 } 753 p_HcFrame->commandSequence = seqNum; 754 755 BUILD_FD(sizeof(t_HcFrame)); 756 if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK) 757 { 758 PutBuf(p_FmHc, p_HcFrame, seqNum); 759 RETURN_ERROR(MINOR, err, NO_MSG); 760 } 761 762 p_FmPcdCcFragScratchPoolCmdParams->numOfBuffers = p_HcFrame->extraReg; 763 764 PutBuf(p_FmHc, p_HcFrame, seqNum); 765 return E_OK; 766 } 767 768 t_Error FmHcPcdCcTimeoutReassm(t_Handle h_FmHc, t_FmPcdCcReassmTimeoutParams *p_CcReassmTimeoutParams, uint8_t *p_Result) 769 { 770 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 771 t_HcFrame *p_HcFrame; 772 t_DpaaFD fmFd; 773 t_Error err; 774 uint32_t seqNum; 775 776 SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0); 777 778 p_HcFrame = GetBuf(p_FmHc, &seqNum); 779 if (!p_HcFrame) 780 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 781 782 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 783 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC_REASSM_TIMEOUT); 784 p_HcFrame->actionReg = (uint32_t)((p_CcReassmTimeoutParams->activate ? 0 : 1) << HC_HCOR_ACTION_REG_REASSM_TIMEOUT_ACTIVE_SHIFT); 785 p_HcFrame->extraReg = (p_CcReassmTimeoutParams->tsbs << HC_HCOR_EXTRA_REG_REASSM_TIMEOUT_TSBS_SHIFT) | p_CcReassmTimeoutParams->iprcpt; 786 p_HcFrame->commandSequence = seqNum; 787 788 BUILD_FD(sizeof(t_HcFrame)); 789 if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK) 790 { 791 PutBuf(p_FmHc, p_HcFrame, seqNum); 792 RETURN_ERROR(MINOR, err, NO_MSG); 793 } 794 795 *p_Result = (uint8_t) 796 ((p_HcFrame->actionReg >> HC_HCOR_ACTION_REG_REASSM_TIMEOUT_RES_SHIFT) & HC_HCOR_ACTION_REG_REASSM_TIMEOUT_RES_MASK); 797 798 PutBuf(p_FmHc, p_HcFrame, seqNum); 799 return E_OK; 800 } 801 802 t_Error FmHcPcdPlcrCcGetSetParams(t_Handle h_FmHc,uint16_t absoluteProfileId, uint32_t requiredAction) 803 { 804 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 805 t_HcFrame *p_HcFrame; 806 t_DpaaFD fmFd; 807 t_Error err; 808 uint32_t tmpReg32 = 0; 809 uint32_t requiredActionTmp, requiredActionFlag; 810 uint32_t seqNum; 811 812 SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0); 813 814 /* Profile is locked by calling routine */ 815 /* WARNING - this lock will not be efficient if other HC routine will attempt to change 816 * "fmpl_pegnia" "fmpl_peynia" or "fmpl_pernia" without locking Profile ! 817 */ 818 819 requiredActionTmp = FmPcdPlcrGetRequiredAction(p_FmHc->h_FmPcd, absoluteProfileId); 820 requiredActionFlag = FmPcdPlcrGetRequiredActionFlag(p_FmHc->h_FmPcd, absoluteProfileId); 821 822 if (!requiredActionFlag || !(requiredActionTmp & requiredAction)) 823 { 824 if (requiredAction & UPDATE_NIA_ENQ_WITHOUT_DMA) 825 { 826 p_HcFrame = GetBuf(p_FmHc, &seqNum); 827 if (!p_HcFrame) 828 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 829 /* first read scheme and check that it is valid */ 830 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 831 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL); 832 p_HcFrame->actionReg = FmPcdPlcrBuildReadPlcrActionReg(absoluteProfileId); 833 p_HcFrame->extraReg = 0x00008000; 834 p_HcFrame->commandSequence = seqNum; 835 836 BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC); 837 838 if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK) 839 { 840 PutBuf(p_FmHc, p_HcFrame, seqNum); 841 RETURN_ERROR(MINOR, err, NO_MSG); 842 } 843 844 tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_pegnia; 845 if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME))) 846 { 847 PutBuf(p_FmHc, p_HcFrame, seqNum); 848 RETURN_ERROR(MAJOR, E_INVALID_STATE, 849 ("Next engine of this policer profile has to be assigned to FM_PCD_DONE")); 850 } 851 852 tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA; 853 854 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL); 855 p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId); 856 p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(TRUE, FALSE, FALSE); 857 p_HcFrame->extraReg = 0x00008000; 858 p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32; 859 860 BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT); 861 862 if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK) 863 { 864 PutBuf(p_FmHc, p_HcFrame, seqNum); 865 RETURN_ERROR(MINOR, err, NO_MSG); 866 } 867 868 tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_peynia; 869 if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME))) 870 { 871 PutBuf(p_FmHc, p_HcFrame, seqNum); 872 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine of this policer profile has to be assigned to FM_PCD_DONE")); 873 } 874 875 tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA; 876 877 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL); 878 p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId); 879 p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(FALSE, TRUE, FALSE); 880 p_HcFrame->extraReg = 0x00008000; 881 p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32; 882 883 BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT); 884 885 if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK) 886 { 887 PutBuf(p_FmHc, p_HcFrame, seqNum); 888 RETURN_ERROR(MINOR, err, NO_MSG); 889 } 890 891 tmpReg32 = p_HcFrame->hcSpecificData.profileRegs.fmpl_pernia; 892 if (!(tmpReg32 & (NIA_ENG_BMI | NIA_BMI_AC_ENQ_FRAME))) 893 { 894 PutBuf(p_FmHc, p_HcFrame, seqNum); 895 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Next engine of this policer profile has to be assigned to FM_PCD_DONE")); 896 } 897 898 tmpReg32 |= NIA_BMI_AC_ENQ_FRAME_WITHOUT_DMA; 899 900 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL); 901 p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId); 902 p_HcFrame->actionReg |= FmPcdPlcrBuildNiaProfileReg(FALSE, FALSE, TRUE); 903 p_HcFrame->extraReg = 0x00008000; 904 p_HcFrame->hcSpecificData.singleRegForWrite = tmpReg32; 905 906 BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT); 907 908 if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK) 909 { 910 PutBuf(p_FmHc, p_HcFrame, seqNum); 911 RETURN_ERROR(MINOR, err, NO_MSG); 912 } 913 914 PutBuf(p_FmHc, p_HcFrame, seqNum); 915 } 916 } 917 918 return E_OK; 919 } 920 921 t_Error FmHcPcdPlcrSetProfile(t_Handle h_FmHc, t_Handle h_Profile, t_FmPcdPlcrProfileRegs *p_PlcrRegs) 922 { 923 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 924 t_Error err = E_OK; 925 uint16_t profileIndx; 926 t_HcFrame *p_HcFrame; 927 t_DpaaFD fmFd; 928 uint32_t seqNum; 929 930 p_HcFrame = GetBuf(p_FmHc, &seqNum); 931 if (!p_HcFrame) 932 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 933 934 profileIndx = FmPcdPlcrProfileGetAbsoluteId(h_Profile); 935 936 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 937 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL); 938 p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionRegs(profileIndx); 939 p_HcFrame->extraReg = 0x00008000; 940 memcpy(&p_HcFrame->hcSpecificData.profileRegs, p_PlcrRegs, sizeof(t_FmPcdPlcrProfileRegs)); 941 p_HcFrame->commandSequence = seqNum; 942 943 BUILD_FD(sizeof(t_HcFrame)); 944 945 err = EnQFrm(p_FmHc, &fmFd, seqNum); 946 947 PutBuf(p_FmHc, p_HcFrame, seqNum); 948 949 if (err != E_OK) 950 RETURN_ERROR(MINOR, err, NO_MSG); 951 952 return E_OK; 953 } 954 955 t_Error FmHcPcdPlcrDeleteProfile(t_Handle h_FmHc, t_Handle h_Profile) 956 { 957 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 958 uint16_t absoluteProfileId = FmPcdPlcrProfileGetAbsoluteId(h_Profile); 959 t_Error err = E_OK; 960 t_HcFrame *p_HcFrame; 961 t_DpaaFD fmFd; 962 uint32_t seqNum; 963 964 p_HcFrame = GetBuf(p_FmHc, &seqNum); 965 if (!p_HcFrame) 966 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 967 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 968 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL); 969 p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId); 970 p_HcFrame->actionReg |= 0x00008000; 971 p_HcFrame->extraReg = 0x00008000; 972 memset(&p_HcFrame->hcSpecificData.profileRegs, 0, sizeof(t_FmPcdPlcrProfileRegs)); 973 p_HcFrame->commandSequence = seqNum; 974 975 BUILD_FD(sizeof(t_HcFrame)); 976 977 err = EnQFrm(p_FmHc, &fmFd, seqNum); 978 979 PutBuf(p_FmHc, p_HcFrame, seqNum); 980 981 if (err != E_OK) 982 RETURN_ERROR(MINOR, err, NO_MSG); 983 984 return E_OK; 985 } 986 987 t_Error FmHcPcdPlcrSetProfileCounter(t_Handle h_FmHc, t_Handle h_Profile, e_FmPcdPlcrProfileCounters counter, uint32_t value) 988 { 989 990 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 991 uint16_t absoluteProfileId = FmPcdPlcrProfileGetAbsoluteId(h_Profile); 992 t_Error err = E_OK; 993 t_HcFrame *p_HcFrame; 994 t_DpaaFD fmFd; 995 uint32_t seqNum; 996 997 /* first read scheme and check that it is valid */ 998 p_HcFrame = GetBuf(p_FmHc, &seqNum); 999 if (!p_HcFrame) 1000 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 1001 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 1002 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL); 1003 p_HcFrame->actionReg = FmPcdPlcrBuildWritePlcrActionReg(absoluteProfileId); 1004 p_HcFrame->actionReg |= FmPcdPlcrBuildCounterProfileReg(counter); 1005 p_HcFrame->extraReg = 0x00008000; 1006 p_HcFrame->hcSpecificData.singleRegForWrite = value; 1007 p_HcFrame->commandSequence = seqNum; 1008 1009 BUILD_FD(SIZE_OF_HC_FRAME_PROFILE_CNT); 1010 1011 err = EnQFrm(p_FmHc, &fmFd, seqNum); 1012 1013 PutBuf(p_FmHc, p_HcFrame, seqNum); 1014 1015 if (err != E_OK) 1016 RETURN_ERROR(MINOR, err, NO_MSG); 1017 1018 return E_OK; 1019 } 1020 1021 uint32_t FmHcPcdPlcrGetProfileCounter(t_Handle h_FmHc, t_Handle h_Profile, e_FmPcdPlcrProfileCounters counter) 1022 { 1023 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 1024 uint16_t absoluteProfileId = FmPcdPlcrProfileGetAbsoluteId(h_Profile); 1025 t_Error err; 1026 t_HcFrame *p_HcFrame; 1027 t_DpaaFD fmFd; 1028 uint32_t retVal = 0; 1029 uint32_t seqNum; 1030 1031 SANITY_CHECK_RETURN_VALUE(h_FmHc, E_INVALID_HANDLE,0); 1032 1033 /* first read scheme and check that it is valid */ 1034 p_HcFrame = GetBuf(p_FmHc, &seqNum); 1035 if (!p_HcFrame) 1036 { 1037 REPORT_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 1038 return 0; 1039 } 1040 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 1041 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_PLCR_PRFL); 1042 p_HcFrame->actionReg = FmPcdPlcrBuildReadPlcrActionReg(absoluteProfileId); 1043 p_HcFrame->extraReg = 0x00008000; 1044 p_HcFrame->commandSequence = seqNum; 1045 1046 BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC); 1047 1048 err = EnQFrm(p_FmHc, &fmFd, seqNum); 1049 if (err != E_OK) 1050 { 1051 PutBuf(p_FmHc, p_HcFrame, seqNum); 1052 REPORT_ERROR(MINOR, err, NO_MSG); 1053 return 0; 1054 } 1055 1056 switch (counter) 1057 { 1058 case e_FM_PCD_PLCR_PROFILE_GREEN_PACKET_TOTAL_COUNTER: 1059 retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_pegpc; 1060 break; 1061 case e_FM_PCD_PLCR_PROFILE_YELLOW_PACKET_TOTAL_COUNTER: 1062 retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_peypc; 1063 break; 1064 case e_FM_PCD_PLCR_PROFILE_RED_PACKET_TOTAL_COUNTER: 1065 retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perpc; 1066 break; 1067 case e_FM_PCD_PLCR_PROFILE_RECOLOURED_YELLOW_PACKET_TOTAL_COUNTER: 1068 retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perypc; 1069 break; 1070 case e_FM_PCD_PLCR_PROFILE_RECOLOURED_RED_PACKET_TOTAL_COUNTER: 1071 retVal = p_HcFrame->hcSpecificData.profileRegs.fmpl_perrpc; 1072 break; 1073 default: 1074 REPORT_ERROR(MAJOR, E_INVALID_SELECTION, NO_MSG); 1075 } 1076 1077 PutBuf(p_FmHc, p_HcFrame, seqNum); 1078 return retVal; 1079 } 1080 1081 t_Error FmHcKgWriteSp(t_Handle h_FmHc, uint8_t hardwarePortId, uint32_t spReg, bool add) 1082 { 1083 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 1084 t_HcFrame *p_HcFrame; 1085 t_DpaaFD fmFd; 1086 t_Error err = E_OK; 1087 uint32_t seqNum; 1088 1089 ASSERT_COND(p_FmHc); 1090 1091 p_HcFrame = GetBuf(p_FmHc, &seqNum); 1092 if (!p_HcFrame) 1093 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 1094 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 1095 /* first read SP register */ 1096 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM); 1097 p_HcFrame->actionReg = FmPcdKgBuildReadPortSchemeBindActionReg(hardwarePortId); 1098 p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK; 1099 p_HcFrame->commandSequence = seqNum; 1100 1101 BUILD_FD(SIZE_OF_HC_FRAME_PORT_REGS); 1102 1103 if ((err = EnQFrm(p_FmHc, &fmFd, seqNum)) != E_OK) 1104 { 1105 PutBuf(p_FmHc, p_HcFrame, seqNum); 1106 RETURN_ERROR(MINOR, err, NO_MSG); 1107 } 1108 1109 /* spReg is the first reg, so we can use it both for read and for write */ 1110 if (add) 1111 p_HcFrame->hcSpecificData.portRegsForRead.spReg |= spReg; 1112 else 1113 p_HcFrame->hcSpecificData.portRegsForRead.spReg &= ~spReg; 1114 1115 p_HcFrame->actionReg = FmPcdKgBuildWritePortSchemeBindActionReg(hardwarePortId); 1116 1117 BUILD_FD(sizeof(t_HcFrame)); 1118 1119 err = EnQFrm(p_FmHc, &fmFd, seqNum); 1120 1121 PutBuf(p_FmHc, p_HcFrame, seqNum); 1122 1123 if (err != E_OK) 1124 RETURN_ERROR(MINOR, err, NO_MSG); 1125 1126 return E_OK; 1127 } 1128 1129 t_Error FmHcKgWriteCpp(t_Handle h_FmHc, uint8_t hardwarePortId, uint32_t cppReg) 1130 { 1131 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 1132 t_HcFrame *p_HcFrame; 1133 t_DpaaFD fmFd; 1134 t_Error err = E_OK; 1135 uint32_t seqNum; 1136 1137 ASSERT_COND(p_FmHc); 1138 1139 p_HcFrame = GetBuf(p_FmHc, &seqNum); 1140 if (!p_HcFrame) 1141 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 1142 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 1143 /* first read SP register */ 1144 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_KG_SCM); 1145 p_HcFrame->actionReg = FmPcdKgBuildWritePortClsPlanBindActionReg(hardwarePortId); 1146 p_HcFrame->extraReg = HC_HCOR_KG_SCHEME_REGS_MASK; 1147 p_HcFrame->hcSpecificData.singleRegForWrite = cppReg; 1148 p_HcFrame->commandSequence = seqNum; 1149 1150 BUILD_FD(sizeof(t_HcFrame)); 1151 1152 err = EnQFrm(p_FmHc, &fmFd, seqNum); 1153 1154 PutBuf(p_FmHc, p_HcFrame, seqNum); 1155 1156 if (err != E_OK) 1157 RETURN_ERROR(MINOR, err, NO_MSG); 1158 1159 return E_OK; 1160 } 1161 1162 t_Error FmHcPcdCcDoDynamicChange(t_Handle h_FmHc, uint32_t oldAdAddrOffset, uint32_t newAdAddrOffset) 1163 { 1164 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 1165 t_HcFrame *p_HcFrame; 1166 t_DpaaFD fmFd; 1167 t_Error err = E_OK; 1168 uint32_t seqNum; 1169 1170 SANITY_CHECK_RETURN_ERROR(p_FmHc, E_INVALID_HANDLE); 1171 1172 p_HcFrame = GetBuf(p_FmHc, &seqNum); 1173 if (!p_HcFrame) 1174 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 1175 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 1176 1177 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_CC); 1178 p_HcFrame->actionReg = newAdAddrOffset; 1179 p_HcFrame->actionReg |= 0xc0000000; 1180 p_HcFrame->extraReg = oldAdAddrOffset; 1181 p_HcFrame->commandSequence = seqNum; 1182 1183 BUILD_FD(SIZE_OF_HC_FRAME_READ_OR_CC_DYNAMIC); 1184 1185 err = EnQFrm(p_FmHc, &fmFd, seqNum); 1186 1187 PutBuf(p_FmHc, p_HcFrame, seqNum); 1188 1189 if (err != E_OK) 1190 RETURN_ERROR(MAJOR, err, NO_MSG); 1191 1192 return E_OK; 1193 } 1194 1195 t_Error FmHcPcdSync(t_Handle h_FmHc) 1196 { 1197 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 1198 t_HcFrame *p_HcFrame; 1199 t_DpaaFD fmFd; 1200 t_Error err = E_OK; 1201 uint32_t seqNum; 1202 1203 ASSERT_COND(p_FmHc); 1204 1205 p_HcFrame = GetBuf(p_FmHc, &seqNum); 1206 if (!p_HcFrame) 1207 RETURN_ERROR(MINOR, E_NO_MEMORY, ("HC Frame object")); 1208 memset(p_HcFrame, 0, sizeof(t_HcFrame)); 1209 /* first read SP register */ 1210 p_HcFrame->opcode = (uint32_t)(HC_HCOR_GBL | HC_HCOR_OPCODE_SYNC); 1211 p_HcFrame->actionReg = 0; 1212 p_HcFrame->extraReg = 0; 1213 p_HcFrame->commandSequence = seqNum; 1214 1215 BUILD_FD(sizeof(t_HcFrame)); 1216 1217 err = EnQFrm(p_FmHc, &fmFd, seqNum); 1218 1219 PutBuf(p_FmHc, p_HcFrame, seqNum); 1220 1221 if (err != E_OK) 1222 RETURN_ERROR(MINOR, err, NO_MSG); 1223 1224 return E_OK; 1225 } 1226 1227 t_Handle FmHcGetPort(t_Handle h_FmHc) 1228 { 1229 t_FmHc *p_FmHc = (t_FmHc*)h_FmHc; 1230 return p_FmHc->h_HcPortDev; 1231 } 1232