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 /****************************************************************************** 35 @File fm.c 36 37 @Description FM driver routines implementation. 38 *//***************************************************************************/ 39 #include "std_ext.h" 40 #include "error_ext.h" 41 #include "xx_ext.h" 42 #include "string_ext.h" 43 #include "sprint_ext.h" 44 #include "debug_ext.h" 45 #include "fm_muram_ext.h" 46 #include <linux/math64.h> 47 48 #include "fm_common.h" 49 #include "fm_ipc.h" 50 #include "fm.h" 51 #include "fsl_fman.h" 52 53 54 /****************************************/ 55 /* static functions */ 56 /****************************************/ 57 58 static volatile bool blockingFlag = FALSE; 59 static void IpcMsgCompletionCB(t_Handle h_Fm, 60 uint8_t *p_Msg, 61 uint8_t *p_Reply, 62 uint32_t replyLength, 63 t_Error status) 64 { 65 UNUSED(h_Fm);UNUSED(p_Msg);UNUSED(p_Reply);UNUSED(replyLength);UNUSED(status); 66 blockingFlag = FALSE; 67 } 68 69 static void FreeInitResources(t_Fm *p_Fm) 70 { 71 if (p_Fm->camBaseAddr) 72 FM_MURAM_FreeMem(p_Fm->h_FmMuram, UINT_TO_PTR(p_Fm->camBaseAddr)); 73 if (p_Fm->fifoBaseAddr) 74 FM_MURAM_FreeMem(p_Fm->h_FmMuram, UINT_TO_PTR(p_Fm->fifoBaseAddr)); 75 if (p_Fm->resAddr) 76 FM_MURAM_FreeMem(p_Fm->h_FmMuram, UINT_TO_PTR(p_Fm->resAddr)); 77 } 78 79 static bool IsFmanCtrlCodeLoaded(t_Fm *p_Fm) 80 { 81 t_FMIramRegs *p_Iram; 82 83 ASSERT_COND(p_Fm); 84 p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM); 85 86 return (bool)!!(GET_UINT32(p_Iram->iready) & IRAM_READY); 87 } 88 89 static t_Error CheckFmParameters(t_Fm *p_Fm) 90 { 91 if (IsFmanCtrlCodeLoaded(p_Fm) && !p_Fm->resetOnInit) 92 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Old FMan CTRL code is loaded; FM must be reset!")); 93 #if (DPAA_VERSION < 11) 94 if (!p_Fm->p_FmDriverParam->dma_axi_dbg_num_of_beats || 95 (p_Fm->p_FmDriverParam->dma_axi_dbg_num_of_beats > DMA_MODE_MAX_AXI_DBG_NUM_OF_BEATS)) 96 RETURN_ERROR(MAJOR, E_INVALID_VALUE, 97 ("axiDbgNumOfBeats has to be in the range 1 - %d", DMA_MODE_MAX_AXI_DBG_NUM_OF_BEATS)); 98 #endif /* (DPAA_VERSION < 11) */ 99 if (p_Fm->p_FmDriverParam->dma_cam_num_of_entries % DMA_CAM_UNITS) 100 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_cam_num_of_entries has to be divisble by %d", DMA_CAM_UNITS)); 101 // if (!p_Fm->p_FmDriverParam->dma_cam_num_of_entries || (p_Fm->p_FmDriverParam->dma_cam_num_of_entries > DMA_MODE_MAX_CAM_NUM_OF_ENTRIES)) 102 // RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_cam_num_of_entries has to be in the range 1 - %d", DMA_MODE_MAX_CAM_NUM_OF_ENTRIES)); 103 if (p_Fm->p_FmDriverParam->dma_comm_qtsh_asrt_emer > DMA_THRESH_MAX_COMMQ) 104 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_comm_qtsh_asrt_emer can not be larger than %d", DMA_THRESH_MAX_COMMQ)); 105 if (p_Fm->p_FmDriverParam->dma_comm_qtsh_clr_emer > DMA_THRESH_MAX_COMMQ) 106 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_comm_qtsh_clr_emer can not be larger than %d", DMA_THRESH_MAX_COMMQ)); 107 if (p_Fm->p_FmDriverParam->dma_comm_qtsh_clr_emer >= p_Fm->p_FmDriverParam->dma_comm_qtsh_asrt_emer) 108 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_comm_qtsh_clr_emer must be smaller than dma_comm_qtsh_asrt_emer")); 109 #if (DPAA_VERSION < 11) 110 if (p_Fm->p_FmDriverParam->dma_read_buf_tsh_asrt_emer > DMA_THRESH_MAX_BUF) 111 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_read_buf_tsh_asrt_emer can not be larger than %d", DMA_THRESH_MAX_BUF)); 112 if (p_Fm->p_FmDriverParam->dma_read_buf_tsh_clr_emer > DMA_THRESH_MAX_BUF) 113 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_read_buf_tsh_clr_emer can not be larger than %d", DMA_THRESH_MAX_BUF)); 114 if (p_Fm->p_FmDriverParam->dma_read_buf_tsh_clr_emer >= p_Fm->p_FmDriverParam->dma_read_buf_tsh_asrt_emer) 115 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_read_buf_tsh_clr_emer must be smaller than dma_read_buf_tsh_asrt_emer")); 116 if (p_Fm->p_FmDriverParam->dma_write_buf_tsh_asrt_emer > DMA_THRESH_MAX_BUF) 117 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_write_buf_tsh_asrt_emer can not be larger than %d", DMA_THRESH_MAX_BUF)); 118 if (p_Fm->p_FmDriverParam->dma_write_buf_tsh_clr_emer > DMA_THRESH_MAX_BUF) 119 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_write_buf_tsh_clr_emer can not be larger than %d", DMA_THRESH_MAX_BUF)); 120 if (p_Fm->p_FmDriverParam->dma_write_buf_tsh_clr_emer >= p_Fm->p_FmDriverParam->dma_write_buf_tsh_asrt_emer) 121 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_write_buf_tsh_clr_emer must be smaller than dma_write_buf_tsh_asrt_emer")); 122 #else /* (DPAA_VERSION >= 11) */ 123 if ((p_Fm->p_FmDriverParam->dma_dbg_cnt_mode == E_FMAN_DMA_DBG_CNT_INT_READ_EM)|| 124 (p_Fm->p_FmDriverParam->dma_dbg_cnt_mode == E_FMAN_DMA_DBG_CNT_INT_WRITE_EM) || 125 (p_Fm->p_FmDriverParam->dma_dbg_cnt_mode == E_FMAN_DMA_DBG_CNT_RAW_WAR_PROT)) 126 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_dbg_cnt_mode value not supported by this integration.")); 127 if ((p_Fm->p_FmDriverParam->dma_emergency_bus_select == FM_DMA_MURAM_READ_EMERGENCY)|| 128 (p_Fm->p_FmDriverParam->dma_emergency_bus_select == FM_DMA_MURAM_WRITE_EMERGENCY)) 129 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("emergencyBusSelect value not supported by this integration.")); 130 if (p_Fm->p_FmDriverParam->dma_stop_on_bus_error) 131 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_stop_on_bus_error not supported by this integration.")); 132 #ifdef FM_AID_MODE_NO_TNUM_SW005 133 if (p_Fm->p_FmDriverParam->dma_aid_mode != E_FMAN_DMA_AID_OUT_PORT_ID) 134 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_aid_mode not supported by this integration.")); 135 #endif /* FM_AID_MODE_NO_TNUM_SW005 */ 136 if (p_Fm->p_FmDriverParam->dma_axi_dbg_num_of_beats) 137 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_axi_dbg_num_of_beats not supported by this integration.")); 138 #endif /* (DPAA_VERSION < 11) */ 139 140 if (!p_Fm->p_FmStateStruct->fmClkFreq) 141 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fmClkFreq must be set.")); 142 if (USEC_TO_CLK(p_Fm->p_FmDriverParam->dma_watchdog, p_Fm->p_FmStateStruct->fmClkFreq) > DMA_MAX_WATCHDOG) 143 RETURN_ERROR(MAJOR, E_INVALID_VALUE, 144 ("dma_watchdog depends on FM clock. dma_watchdog(in microseconds) * clk (in Mhz), may not exceed 0x08x", DMA_MAX_WATCHDOG)); 145 146 #if (DPAA_VERSION >= 11) 147 if ((p_Fm->partVSPBase + p_Fm->partNumOfVSPs) > FM_VSP_MAX_NUM_OF_ENTRIES) 148 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("partVSPBase+partNumOfVSPs out of range!!!")); 149 #endif /* (DPAA_VERSION >= 11) */ 150 151 if (p_Fm->p_FmStateStruct->totalFifoSize % BMI_FIFO_UNITS) 152 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("totalFifoSize number has to be divisible by %d", BMI_FIFO_UNITS)); 153 if (!p_Fm->p_FmStateStruct->totalFifoSize || 154 (p_Fm->p_FmStateStruct->totalFifoSize > BMI_MAX_FIFO_SIZE)) 155 RETURN_ERROR(MAJOR, E_INVALID_VALUE, 156 ("totalFifoSize (currently defined as %d) has to be in the range of 256 to %d", 157 p_Fm->p_FmStateStruct->totalFifoSize, 158 BMI_MAX_FIFO_SIZE)); 159 if (!p_Fm->p_FmStateStruct->totalNumOfTasks || 160 (p_Fm->p_FmStateStruct->totalNumOfTasks > BMI_MAX_NUM_OF_TASKS)) 161 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("totalNumOfTasks number has to be in the range 1 - %d", BMI_MAX_NUM_OF_TASKS)); 162 163 #ifdef FM_HAS_TOTAL_DMAS 164 if (!p_Fm->p_FmStateStruct->maxNumOfOpenDmas || 165 (p_Fm->p_FmStateStruct->maxNumOfOpenDmas > BMI_MAX_NUM_OF_DMAS)) 166 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("maxNumOfOpenDmas number has to be in the range 1 - %d", BMI_MAX_NUM_OF_DMAS)); 167 #endif /* FM_HAS_TOTAL_DMAS */ 168 169 if (p_Fm->p_FmDriverParam->disp_limit_tsh > FPM_MAX_DISP_LIMIT) 170 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("disp_limit_tsh can't be greater than %d", FPM_MAX_DISP_LIMIT)); 171 172 if (!p_Fm->f_Exception) 173 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Exceptions callback not provided")); 174 if (!p_Fm->f_BusError) 175 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Exceptions callback not provided")); 176 177 #ifdef FM_NO_WATCHDOG 178 if ((p_Fm->p_FmStateStruct->revInfo.majorRev == 2) && 179 (p_Fm->p_FmDriverParam->dma_watchdog)) 180 RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("watchdog!")); 181 #endif /* FM_NO_WATCHDOG */ 182 183 #ifdef FM_ECC_HALT_NO_SYNC_ERRATA_10GMAC_A008 184 if ((p_Fm->p_FmStateStruct->revInfo.majorRev < 6) && 185 (p_Fm->p_FmDriverParam->halt_on_unrecov_ecc_err)) 186 RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("HaltOnEccError!")); 187 #endif /* FM_ECC_HALT_NO_SYNC_ERRATA_10GMAC_A008 */ 188 189 #ifdef FM_NO_TNUM_AGING 190 if ((p_Fm->p_FmStateStruct->revInfo.majorRev != 4) && 191 (p_Fm->p_FmStateStruct->revInfo.majorRev < 6)) 192 if (p_Fm->p_FmDriverParam->tnum_aging_period) 193 RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Tnum aging!")); 194 #endif /* FM_NO_TNUM_AGING */ 195 196 /* check that user did not set revision-dependent exceptions */ 197 #ifdef FM_NO_DISPATCH_RAM_ECC 198 if ((p_Fm->p_FmStateStruct->revInfo.majorRev != 4) && 199 (p_Fm->p_FmStateStruct->revInfo.majorRev < 6)) 200 if (p_Fm->userSetExceptions & FM_EX_BMI_DISPATCH_RAM_ECC) 201 RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("exception e_FM_EX_BMI_DISPATCH_RAM_ECC!")); 202 #endif /* FM_NO_DISPATCH_RAM_ECC */ 203 204 #ifdef FM_QMI_NO_ECC_EXCEPTIONS 205 if (p_Fm->p_FmStateStruct->revInfo.majorRev == 4) 206 if (p_Fm->userSetExceptions & (FM_EX_QMI_SINGLE_ECC | FM_EX_QMI_DOUBLE_ECC)) 207 RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("exception e_FM_EX_QMI_SINGLE_ECC/e_FM_EX_QMI_DOUBLE_ECC!")); 208 #endif /* FM_QMI_NO_ECC_EXCEPTIONS */ 209 210 #ifdef FM_QMI_NO_SINGLE_ECC_EXCEPTION 211 if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6) 212 if (p_Fm->userSetExceptions & FM_EX_QMI_SINGLE_ECC) 213 RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("exception e_FM_EX_QMI_SINGLE_ECC!")); 214 #endif /* FM_QMI_NO_SINGLE_ECC_EXCEPTION */ 215 216 return E_OK; 217 } 218 219 220 static void SendIpcIsr(t_Fm *p_Fm, uint32_t macEvent, uint32_t pendingReg) 221 { 222 ASSERT_COND(p_Fm->guestId == NCSW_MASTER_ID); 223 224 if (p_Fm->intrMng[macEvent].guestId == NCSW_MASTER_ID) 225 p_Fm->intrMng[macEvent].f_Isr(p_Fm->intrMng[macEvent].h_SrcHandle); 226 227 /* If the MAC is running on guest-partition and we have IPC session with it, 228 we inform him about the event through IPC; otherwise, we ignore the event. */ 229 else if (p_Fm->h_IpcSessions[p_Fm->intrMng[macEvent].guestId]) 230 { 231 t_Error err; 232 t_FmIpcIsr fmIpcIsr; 233 t_FmIpcMsg msg; 234 235 memset(&msg, 0, sizeof(msg)); 236 msg.msgId = FM_GUEST_ISR; 237 fmIpcIsr.pendingReg = pendingReg; 238 fmIpcIsr.boolErr = FALSE; 239 memcpy(msg.msgBody, &fmIpcIsr, sizeof(fmIpcIsr)); 240 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[p_Fm->intrMng[macEvent].guestId], 241 (uint8_t*)&msg, 242 sizeof(msg.msgId) + sizeof(fmIpcIsr), 243 NULL, 244 NULL, 245 NULL, 246 NULL); 247 if (err != E_OK) 248 REPORT_ERROR(MINOR, err, NO_MSG); 249 } 250 else 251 DBG(TRACE, ("FM Guest mode, without IPC - can't call ISR!")); 252 } 253 254 static void BmiErrEvent(t_Fm *p_Fm) 255 { 256 uint32_t event; 257 struct fman_bmi_regs *bmi_rg = p_Fm->p_FmBmiRegs; 258 259 260 event = fman_get_bmi_err_event(bmi_rg); 261 262 if (event & BMI_ERR_INTR_EN_STORAGE_PROFILE_ECC) 263 p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_BMI_STORAGE_PROFILE_ECC); 264 if (event & BMI_ERR_INTR_EN_LIST_RAM_ECC) 265 p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_BMI_LIST_RAM_ECC); 266 if (event & BMI_ERR_INTR_EN_STATISTICS_RAM_ECC) 267 p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_BMI_STATISTICS_RAM_ECC); 268 if (event & BMI_ERR_INTR_EN_DISPATCH_RAM_ECC) 269 p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_BMI_DISPATCH_RAM_ECC); 270 } 271 272 static void QmiErrEvent(t_Fm *p_Fm) 273 { 274 uint32_t event; 275 struct fman_qmi_regs *qmi_rg = p_Fm->p_FmQmiRegs; 276 277 event = fman_get_qmi_err_event(qmi_rg); 278 279 if (event & QMI_ERR_INTR_EN_DOUBLE_ECC) 280 p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_QMI_DOUBLE_ECC); 281 if (event & QMI_ERR_INTR_EN_DEQ_FROM_DEF) 282 p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_QMI_DEQ_FROM_UNKNOWN_PORTID); 283 } 284 285 static void DmaErrEvent(t_Fm *p_Fm) 286 { 287 uint32_t status, com_id; 288 uint8_t tnum; 289 uint8_t hardwarePortId; 290 uint8_t relativePortId; 291 uint16_t liodn; 292 struct fman_dma_regs *dma_rg = p_Fm->p_FmDmaRegs; 293 294 status = fman_get_dma_err_event(dma_rg); 295 296 if (status & DMA_STATUS_BUS_ERR) 297 { 298 com_id = fman_get_dma_com_id(dma_rg); 299 hardwarePortId = (uint8_t)(((com_id & DMA_TRANSFER_PORTID_MASK) >> DMA_TRANSFER_PORTID_SHIFT)); 300 ASSERT_COND(IN_RANGE(1, hardwarePortId, 63)); 301 HW_PORT_ID_TO_SW_PORT_ID(relativePortId, hardwarePortId); 302 tnum = (uint8_t)((com_id & DMA_TRANSFER_TNUM_MASK) >> DMA_TRANSFER_TNUM_SHIFT); 303 liodn = (uint16_t)(com_id & DMA_TRANSFER_LIODN_MASK); 304 ASSERT_COND(p_Fm->p_FmStateStruct->portsTypes[hardwarePortId] != e_FM_PORT_TYPE_DUMMY); 305 p_Fm->f_BusError(p_Fm->h_App, 306 p_Fm->p_FmStateStruct->portsTypes[hardwarePortId], 307 relativePortId, 308 fman_get_dma_addr(dma_rg), 309 tnum, 310 liodn); 311 } 312 if (status & DMA_STATUS_FM_SPDAT_ECC) 313 p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_DMA_SINGLE_PORT_ECC); 314 if (status & DMA_STATUS_READ_ECC) 315 p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_DMA_READ_ECC); 316 if (status & DMA_STATUS_SYSTEM_WRITE_ECC) 317 p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_DMA_SYSTEM_WRITE_ECC); 318 if (status & DMA_STATUS_FM_WRITE_ECC) 319 p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_DMA_FM_WRITE_ECC); 320 } 321 322 static void FpmErrEvent(t_Fm *p_Fm) 323 { 324 uint32_t event; 325 struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs; 326 327 event = fman_get_fpm_err_event(fpm_rg); 328 329 if ((event & FPM_EV_MASK_DOUBLE_ECC) && (event & FPM_EV_MASK_DOUBLE_ECC_EN)) 330 p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_FPM_DOUBLE_ECC); 331 if ((event & FPM_EV_MASK_STALL) && (event & FPM_EV_MASK_STALL_EN)) 332 p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_FPM_STALL_ON_TASKS); 333 if ((event & FPM_EV_MASK_SINGLE_ECC) && (event & FPM_EV_MASK_SINGLE_ECC_EN)) 334 p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_FPM_SINGLE_ECC); 335 } 336 337 static void MuramErrIntr(t_Fm *p_Fm) 338 { 339 uint32_t event; 340 struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs; 341 342 event = fman_get_muram_err_event(fpm_rg); 343 344 if (event & FPM_RAM_MURAM_ECC) 345 p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_MURAM_ECC); 346 } 347 348 static void IramErrIntr(t_Fm *p_Fm) 349 { 350 uint32_t event; 351 struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs; 352 353 event = fman_get_iram_err_event(fpm_rg); 354 355 if (event & FPM_RAM_IRAM_ECC) 356 p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_IRAM_ECC); 357 } 358 359 static void QmiEvent(t_Fm *p_Fm) 360 { 361 uint32_t event; 362 struct fman_qmi_regs *qmi_rg = p_Fm->p_FmQmiRegs; 363 364 event = fman_get_qmi_event(qmi_rg); 365 366 if (event & QMI_INTR_EN_SINGLE_ECC) 367 p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_QMI_SINGLE_ECC); 368 } 369 370 static void UnimplementedIsr(t_Handle h_Arg) 371 { 372 UNUSED(h_Arg); 373 374 REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Unimplemented ISR!")); 375 } 376 377 static void UnimplementedFmanCtrlIsr(t_Handle h_Arg, uint32_t event) 378 { 379 UNUSED(h_Arg); UNUSED(event); 380 381 REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Unimplemented FmCtl ISR!")); 382 } 383 384 static void EnableTimeStamp(t_Fm *p_Fm) 385 { 386 struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs; 387 388 ASSERT_COND(p_Fm->p_FmStateStruct); 389 ASSERT_COND(p_Fm->p_FmStateStruct->count1MicroBit); 390 391 fman_enable_time_stamp(fpm_rg, p_Fm->p_FmStateStruct->count1MicroBit, p_Fm->p_FmStateStruct->fmClkFreq); 392 393 p_Fm->p_FmStateStruct->enabledTimeStamp = TRUE; 394 } 395 396 static t_Error ClearIRam(t_Fm *p_Fm) 397 { 398 t_FMIramRegs *p_Iram; 399 int i; 400 int iram_size; 401 402 ASSERT_COND(p_Fm); 403 p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM); 404 iram_size = FM_IRAM_SIZE(p_Fm->p_FmStateStruct->revInfo.majorRev,p_Fm->p_FmStateStruct->revInfo.minorRev); 405 406 /* Enable the auto-increment */ 407 WRITE_UINT32(p_Iram->iadd, IRAM_IADD_AIE); 408 while (GET_UINT32(p_Iram->iadd) != IRAM_IADD_AIE) ; 409 410 for (i=0; i < (iram_size/4); i++) 411 WRITE_UINT32(p_Iram->idata, 0xffffffff); 412 413 WRITE_UINT32(p_Iram->iadd, iram_size - 4); 414 CORE_MemoryBarrier(); 415 while (GET_UINT32(p_Iram->idata) != 0xffffffff) ; 416 417 return E_OK; 418 } 419 420 static t_Error LoadFmanCtrlCode(t_Fm *p_Fm) 421 { 422 t_FMIramRegs *p_Iram; 423 int i; 424 uint32_t tmp; 425 uint8_t compTo16; 426 427 ASSERT_COND(p_Fm); 428 p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM); 429 430 /* Enable the auto-increment */ 431 WRITE_UINT32(p_Iram->iadd, IRAM_IADD_AIE); 432 while (GET_UINT32(p_Iram->iadd) != IRAM_IADD_AIE) ; 433 434 for (i=0; i < (p_Fm->firmware.size / 4); i++) 435 WRITE_UINT32(p_Iram->idata, p_Fm->firmware.p_Code[i]); 436 437 compTo16 = (uint8_t)(p_Fm->firmware.size % 16); 438 if (compTo16) 439 for (i=0; i < ((16-compTo16) / 4); i++) 440 WRITE_UINT32(p_Iram->idata, 0xffffffff); 441 442 WRITE_UINT32(p_Iram->iadd,p_Fm->firmware.size-4); 443 while (GET_UINT32(p_Iram->iadd) != (p_Fm->firmware.size-4)) ; 444 445 /* verify that writing has completed */ 446 while (GET_UINT32(p_Iram->idata) != p_Fm->firmware.p_Code[(p_Fm->firmware.size / 4)-1]) ; 447 448 if (p_Fm->fwVerify) 449 { 450 WRITE_UINT32(p_Iram->iadd, IRAM_IADD_AIE); 451 while (GET_UINT32(p_Iram->iadd) != IRAM_IADD_AIE) ; 452 for (i=0; i < (p_Fm->firmware.size / 4); i++) 453 { 454 tmp = GET_UINT32(p_Iram->idata); 455 if (tmp != p_Fm->firmware.p_Code[i]) 456 RETURN_ERROR(MAJOR, E_WRITE_FAILED, 457 ("UCode write error : write 0x%x, read 0x%x", 458 p_Fm->firmware.p_Code[i],tmp)); 459 } 460 WRITE_UINT32(p_Iram->iadd, 0x0); 461 } 462 463 /* Enable patch from IRAM */ 464 WRITE_UINT32(p_Iram->iready, IRAM_READY); 465 XX_UDelay(1000); 466 467 DBG(INFO, ("FMan-Controller code (ver %d.%d.%d) loaded to IRAM.", 468 ((uint16_t *)p_Fm->firmware.p_Code)[2], 469 ((uint8_t *)p_Fm->firmware.p_Code)[6], 470 ((uint8_t *)p_Fm->firmware.p_Code)[7])); 471 472 return E_OK; 473 } 474 475 #ifdef FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 476 static t_Error FwNotResetErratumBugzilla6173WA(t_Fm *p_Fm) 477 { 478 t_FMIramRegs *p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM); 479 uint32_t tmpReg; 480 uint32_t savedSpliodn[63]; 481 482 /* write to IRAM first location the debug instruction */ 483 WRITE_UINT32(p_Iram->iadd, 0); 484 while (GET_UINT32(p_Iram->iadd) != 0) ; 485 WRITE_UINT32(p_Iram->idata, FM_FW_DEBUG_INSTRUCTION); 486 487 WRITE_UINT32(p_Iram->iadd, 0); 488 while (GET_UINT32(p_Iram->iadd) != 0) ; 489 while (GET_UINT32(p_Iram->idata) != FM_FW_DEBUG_INSTRUCTION) ; 490 491 /* Enable patch from IRAM */ 492 WRITE_UINT32(p_Iram->iready, IRAM_READY); 493 CORE_MemoryBarrier(); 494 XX_UDelay(100); 495 IO2MemCpy32((uint8_t *)savedSpliodn, 496 (uint8_t *)p_Fm->p_FmBmiRegs->fmbm_spliodn, 497 63*sizeof(uint32_t)); 498 499 /* reset FMAN */ 500 WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_rstc, FPM_RSTC_FM_RESET); 501 CORE_MemoryBarrier(); 502 XX_UDelay(100); 503 504 /* verify breakpoint debug status register */ 505 tmpReg = GET_UINT32(*(uint32_t *)UINT_TO_PTR(p_Fm->baseAddr + FM_DEBUG_STATUS_REGISTER_OFFSET)); 506 if (!tmpReg) 507 REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Invalid debug status register value is '0'")); 508 509 /*************************************/ 510 /* Load FMan-Controller code to IRAM */ 511 /*************************************/ 512 ClearIRam(p_Fm); 513 if (p_Fm->firmware.p_Code && 514 (LoadFmanCtrlCode(p_Fm) != E_OK)) 515 RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG); 516 XX_UDelay(100); 517 518 /* reset FMAN again to start the microcode */ 519 WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_rstc, FPM_RSTC_FM_RESET); 520 CORE_MemoryBarrier(); 521 XX_UDelay(100); 522 Mem2IOCpy32((uint8_t *)p_Fm->p_FmBmiRegs->fmbm_spliodn, 523 (uint8_t *)savedSpliodn, 524 63*sizeof(uint32_t)); 525 526 if (fman_is_qmi_halt_not_busy_state(p_Fm->p_FmQmiRegs)) 527 { 528 fman_resume(p_Fm->p_FmFpmRegs); 529 CORE_MemoryBarrier(); 530 XX_UDelay(100); 531 } 532 533 return E_OK; 534 } 535 #endif /* FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 */ 536 537 static void GuestErrorIsr(t_Fm *p_Fm, uint32_t pending) 538 { 539 #define FM_G_CALL_1G_MAC_ERR_ISR(_id) \ 540 do { \ 541 p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_1G_MAC0+_id)].f_Isr(p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_1G_MAC0+_id)].h_SrcHandle);\ 542 } while (0) 543 #define FM_G_CALL_10G_MAC_ERR_ISR(_id) \ 544 do { \ 545 p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_10G_MAC0+_id)].f_Isr(p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_10G_MAC0+_id)].h_SrcHandle);\ 546 } while (0) 547 548 /* error interrupts */ 549 if (pending & ERR_INTR_EN_1G_MAC0) 550 FM_G_CALL_1G_MAC_ERR_ISR(0); 551 if (pending & ERR_INTR_EN_1G_MAC1) 552 FM_G_CALL_1G_MAC_ERR_ISR(1); 553 if (pending & ERR_INTR_EN_1G_MAC2) 554 FM_G_CALL_1G_MAC_ERR_ISR(2); 555 if (pending & ERR_INTR_EN_1G_MAC3) 556 FM_G_CALL_1G_MAC_ERR_ISR(3); 557 if (pending & ERR_INTR_EN_1G_MAC4) 558 FM_G_CALL_1G_MAC_ERR_ISR(4); 559 if (pending & ERR_INTR_EN_1G_MAC5) 560 FM_G_CALL_1G_MAC_ERR_ISR(5); 561 if (pending & ERR_INTR_EN_1G_MAC6) 562 FM_G_CALL_1G_MAC_ERR_ISR(6); 563 if (pending & ERR_INTR_EN_1G_MAC7) 564 FM_G_CALL_1G_MAC_ERR_ISR(7); 565 if (pending & ERR_INTR_EN_10G_MAC0) 566 FM_G_CALL_10G_MAC_ERR_ISR(0); 567 if (pending & ERR_INTR_EN_10G_MAC1) 568 FM_G_CALL_10G_MAC_ERR_ISR(1); 569 } 570 571 static void GuestEventIsr(t_Fm *p_Fm, uint32_t pending) 572 { 573 #define FM_G_CALL_1G_MAC_ISR(_id) \ 574 do { \ 575 p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_1G_MAC0+_id)].f_Isr(p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_1G_MAC0+_id)].h_SrcHandle);\ 576 } while (0) 577 #define FM_G_CALL_10G_MAC_ISR(_id) \ 578 do { \ 579 p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_10G_MAC0+_id)].f_Isr(p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_10G_MAC0+_id)].h_SrcHandle);\ 580 } while (0) 581 582 if (pending & INTR_EN_1G_MAC0) 583 FM_G_CALL_1G_MAC_ISR(0); 584 if (pending & INTR_EN_1G_MAC1) 585 FM_G_CALL_1G_MAC_ISR(1); 586 if (pending & INTR_EN_1G_MAC2) 587 FM_G_CALL_1G_MAC_ISR(2); 588 if (pending & INTR_EN_1G_MAC3) 589 FM_G_CALL_1G_MAC_ISR(3); 590 if (pending & INTR_EN_1G_MAC4) 591 FM_G_CALL_1G_MAC_ISR(4); 592 if (pending & INTR_EN_1G_MAC5) 593 FM_G_CALL_1G_MAC_ISR(5); 594 if (pending & INTR_EN_1G_MAC6) 595 FM_G_CALL_1G_MAC_ISR(6); 596 if (pending & INTR_EN_1G_MAC7) 597 FM_G_CALL_1G_MAC_ISR(7); 598 if (pending & INTR_EN_10G_MAC0) 599 FM_G_CALL_10G_MAC_ISR(0); 600 if (pending & INTR_EN_10G_MAC1) 601 FM_G_CALL_10G_MAC_ISR(1); 602 if (pending & INTR_EN_TMR) 603 p_Fm->intrMng[e_FM_EV_TMR].f_Isr(p_Fm->intrMng[e_FM_EV_TMR].h_SrcHandle); 604 } 605 606 #if (DPAA_VERSION >= 11) 607 static t_Error SetVSPWindow(t_Handle h_Fm, 608 uint8_t hardwarePortId, 609 uint8_t baseStorageProfile, 610 uint8_t log2NumOfProfiles) 611 { 612 t_Fm *p_Fm = (t_Fm *)h_Fm; 613 614 ASSERT_COND(h_Fm); 615 ASSERT_COND(IN_RANGE(1, hardwarePortId, 63)); 616 617 if ((p_Fm->guestId != NCSW_MASTER_ID) && 618 !p_Fm->p_FmBmiRegs && 619 p_Fm->h_IpcSessions[0]) 620 { 621 t_FmIpcVspSetPortWindow fmIpcVspSetPortWindow; 622 t_FmIpcMsg msg; 623 t_Error err = E_OK; 624 625 memset(&msg, 0, sizeof(msg)); 626 memset(&fmIpcVspSetPortWindow, 0, sizeof(t_FmIpcVspSetPortWindow)); 627 fmIpcVspSetPortWindow.hardwarePortId = hardwarePortId; 628 fmIpcVspSetPortWindow.baseStorageProfile = baseStorageProfile; 629 fmIpcVspSetPortWindow.log2NumOfProfiles = log2NumOfProfiles; 630 msg.msgId = FM_VSP_SET_PORT_WINDOW; 631 memcpy(msg.msgBody, &fmIpcVspSetPortWindow, sizeof(t_FmIpcVspSetPortWindow)); 632 633 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 634 (uint8_t*)&msg, 635 sizeof(msg.msgId), 636 NULL, 637 NULL, 638 NULL, 639 NULL); 640 if (err != E_OK) 641 RETURN_ERROR(MINOR, err, NO_MSG); 642 return E_OK; 643 } 644 else if (!p_Fm->p_FmBmiRegs) 645 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, 646 ("Either IPC or 'baseAddress' is required!")); 647 648 fman_set_vsp_window(p_Fm->p_FmBmiRegs, 649 hardwarePortId, 650 baseStorageProfile, 651 log2NumOfProfiles); 652 653 return E_OK; 654 } 655 656 static uint8_t AllocVSPsForPartition(t_Handle h_Fm, uint8_t base, uint8_t numOfProfiles, uint8_t guestId) 657 { 658 t_Fm *p_Fm = (t_Fm *)h_Fm; 659 uint8_t profilesFound = 0; 660 int i = 0; 661 uint32_t intFlags; 662 663 if (!numOfProfiles) 664 return E_OK; 665 666 if ((numOfProfiles > FM_VSP_MAX_NUM_OF_ENTRIES) || 667 (base + numOfProfiles > FM_VSP_MAX_NUM_OF_ENTRIES)) 668 return (uint8_t)ILLEGAL_BASE; 669 670 if (p_Fm->h_IpcSessions[0]) 671 { 672 t_FmIpcResourceAllocParams ipcAllocParams; 673 t_FmIpcMsg msg; 674 t_FmIpcReply reply; 675 t_Error err; 676 uint32_t replyLength; 677 678 memset(&msg, 0, sizeof(msg)); 679 memset(&reply, 0, sizeof(reply)); 680 memset(&ipcAllocParams, 0, sizeof(t_FmIpcResourceAllocParams)); 681 ipcAllocParams.guestId = p_Fm->guestId; 682 ipcAllocParams.num = p_Fm->partNumOfVSPs; 683 ipcAllocParams.base = p_Fm->partVSPBase; 684 msg.msgId = FM_VSP_ALLOC; 685 memcpy(msg.msgBody, &ipcAllocParams, sizeof(t_FmIpcResourceAllocParams)); 686 replyLength = sizeof(uint32_t) + sizeof(uint8_t); 687 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 688 (uint8_t*)&msg, 689 sizeof(msg.msgId) + sizeof(t_FmIpcResourceAllocParams), 690 (uint8_t*)&reply, 691 &replyLength, 692 NULL, 693 NULL); 694 if ((err != E_OK) || 695 (replyLength != (sizeof(uint32_t) + sizeof(uint8_t)))) 696 RETURN_ERROR(MAJOR, err, NO_MSG); 697 else 698 memcpy((uint8_t*)&p_Fm->partVSPBase, reply.replyBody, sizeof(uint8_t)); 699 if (p_Fm->partVSPBase == (uint8_t)(ILLEGAL_BASE)) 700 RETURN_ERROR(MAJOR, err, NO_MSG); 701 } 702 if (p_Fm->guestId != NCSW_MASTER_ID) 703 { 704 DBG(WARNING, ("FM Guest mode, without IPC - can't validate VSP range!")); 705 return (uint8_t)ILLEGAL_BASE; 706 } 707 708 intFlags = XX_LockIntrSpinlock(p_Fm->h_Spinlock); 709 for (i = base; i < base + numOfProfiles; i++) 710 if (p_Fm->p_FmSp->profiles[i].profilesMng.ownerId == (uint8_t)ILLEGAL_BASE) 711 profilesFound++; 712 else 713 break; 714 715 if (profilesFound == numOfProfiles) 716 for (i = base; i<base + numOfProfiles; i++) 717 p_Fm->p_FmSp->profiles[i].profilesMng.ownerId = guestId; 718 else 719 { 720 XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags); 721 return (uint8_t)ILLEGAL_BASE; 722 } 723 XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags); 724 725 return base; 726 } 727 728 static void FreeVSPsForPartition(t_Handle h_Fm, uint8_t base, uint8_t numOfProfiles, uint8_t guestId) 729 { 730 t_Fm *p_Fm = (t_Fm *)h_Fm; 731 int i = 0; 732 733 ASSERT_COND(p_Fm); 734 735 if (p_Fm->h_IpcSessions[0]) 736 { 737 t_FmIpcResourceAllocParams ipcAllocParams; 738 t_FmIpcMsg msg; 739 t_FmIpcReply reply; 740 uint32_t replyLength; 741 t_Error err; 742 743 memset(&msg, 0, sizeof(msg)); 744 memset(&reply, 0, sizeof(reply)); 745 memset(&ipcAllocParams, 0, sizeof(t_FmIpcResourceAllocParams)); 746 ipcAllocParams.guestId = p_Fm->guestId; 747 ipcAllocParams.num = p_Fm->partNumOfVSPs; 748 ipcAllocParams.base = p_Fm->partVSPBase; 749 msg.msgId = FM_VSP_FREE; 750 memcpy(msg.msgBody, &ipcAllocParams, sizeof(t_FmIpcResourceAllocParams)); 751 replyLength = sizeof(uint32_t) + sizeof(uint8_t); 752 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 753 (uint8_t*)&msg, 754 sizeof(msg.msgId) + sizeof(t_FmIpcResourceAllocParams), 755 (uint8_t*)&reply, 756 &replyLength, 757 NULL, 758 NULL); 759 if (err != E_OK) 760 REPORT_ERROR(MAJOR, err, NO_MSG); 761 return; 762 } 763 if (p_Fm->guestId != NCSW_MASTER_ID) 764 { 765 DBG(WARNING, ("FM Guest mode, without IPC - can't validate VSP range!")); 766 return; 767 } 768 769 ASSERT_COND(p_Fm->p_FmSp); 770 771 for (i=base; i<numOfProfiles; i++) 772 { 773 if (p_Fm->p_FmSp->profiles[i].profilesMng.ownerId == guestId) 774 p_Fm->p_FmSp->profiles[i].profilesMng.ownerId = (uint8_t)ILLEGAL_BASE; 775 else 776 DBG(WARNING, ("Request for freeing storage profile window which wasn't allocated to this partition")); 777 } 778 } 779 #endif /* (DPAA_VERSION >= 11) */ 780 781 static t_Error FmGuestHandleIpcMsgCB(t_Handle h_Fm, 782 uint8_t *p_Msg, 783 uint32_t msgLength, 784 uint8_t *p_Reply, 785 uint32_t *p_ReplyLength) 786 { 787 t_Fm *p_Fm = (t_Fm*)h_Fm; 788 t_FmIpcMsg *p_IpcMsg = (t_FmIpcMsg*)p_Msg; 789 790 UNUSED(p_Reply); 791 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 792 SANITY_CHECK_RETURN_ERROR((msgLength > sizeof(uint32_t)), E_INVALID_VALUE); 793 794 #ifdef DISABLE_SANITY_CHECKS 795 UNUSED(msgLength); 796 #endif /* DISABLE_SANITY_CHECKS */ 797 798 ASSERT_COND(p_Msg); 799 800 *p_ReplyLength = 0; 801 802 switch (p_IpcMsg->msgId) 803 { 804 case (FM_GUEST_ISR): 805 { 806 t_FmIpcIsr ipcIsr; 807 808 memcpy((uint8_t*)&ipcIsr, p_IpcMsg->msgBody, sizeof(t_FmIpcIsr)); 809 if (ipcIsr.boolErr) 810 GuestErrorIsr(p_Fm, ipcIsr.pendingReg); 811 else 812 GuestEventIsr(p_Fm, ipcIsr.pendingReg); 813 break; 814 } 815 default: 816 *p_ReplyLength = 0; 817 RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("command not found!!!")); 818 } 819 return E_OK; 820 } 821 822 static t_Error FmHandleIpcMsgCB(t_Handle h_Fm, 823 uint8_t *p_Msg, 824 uint32_t msgLength, 825 uint8_t *p_Reply, 826 uint32_t *p_ReplyLength) 827 { 828 t_Error err; 829 t_Fm *p_Fm = (t_Fm*)h_Fm; 830 t_FmIpcMsg *p_IpcMsg = (t_FmIpcMsg*)p_Msg; 831 t_FmIpcReply *p_IpcReply = (t_FmIpcReply*)p_Reply; 832 833 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 834 SANITY_CHECK_RETURN_ERROR((msgLength >= sizeof(uint32_t)), E_INVALID_VALUE); 835 836 #ifdef DISABLE_SANITY_CHECKS 837 UNUSED(msgLength); 838 #endif /* DISABLE_SANITY_CHECKS */ 839 840 ASSERT_COND(p_IpcMsg); 841 842 memset(p_IpcReply, 0, (sizeof(uint8_t) * FM_IPC_MAX_REPLY_SIZE)); 843 *p_ReplyLength = 0; 844 845 switch (p_IpcMsg->msgId) 846 { 847 case (FM_GET_SET_PORT_PARAMS): 848 { 849 t_FmIpcPortInInitParams ipcInitParams; 850 t_FmInterModulePortInitParams initParams; 851 t_FmIpcPortOutInitParams ipcOutInitParams; 852 853 memcpy((uint8_t*)&ipcInitParams, p_IpcMsg->msgBody, sizeof(t_FmIpcPortInInitParams)); 854 initParams.hardwarePortId = ipcInitParams.hardwarePortId; 855 initParams.portType = (e_FmPortType)ipcInitParams.enumPortType; 856 initParams.independentMode = (bool)(ipcInitParams.boolIndependentMode); 857 initParams.liodnOffset = ipcInitParams.liodnOffset; 858 initParams.numOfTasks = ipcInitParams.numOfTasks; 859 initParams.numOfExtraTasks = ipcInitParams.numOfExtraTasks; 860 initParams.numOfOpenDmas = ipcInitParams.numOfOpenDmas; 861 initParams.numOfExtraOpenDmas = ipcInitParams.numOfExtraOpenDmas; 862 initParams.sizeOfFifo = ipcInitParams.sizeOfFifo; 863 initParams.extraSizeOfFifo = ipcInitParams.extraSizeOfFifo; 864 initParams.deqPipelineDepth = ipcInitParams.deqPipelineDepth; 865 initParams.maxFrameLength = ipcInitParams.maxFrameLength; 866 initParams.liodnBase = ipcInitParams.liodnBase; 867 868 p_IpcReply->error = (uint32_t)FmGetSetPortParams(h_Fm, &initParams); 869 870 ipcOutInitParams.ipcPhysAddr.high = initParams.fmMuramPhysBaseAddr.high; 871 ipcOutInitParams.ipcPhysAddr.low = initParams.fmMuramPhysBaseAddr.low; 872 ipcOutInitParams.sizeOfFifo = initParams.sizeOfFifo; 873 ipcOutInitParams.extraSizeOfFifo = initParams.extraSizeOfFifo; 874 ipcOutInitParams.numOfTasks = initParams.numOfTasks; 875 ipcOutInitParams.numOfExtraTasks = initParams.numOfExtraTasks; 876 ipcOutInitParams.numOfOpenDmas = initParams.numOfOpenDmas; 877 ipcOutInitParams.numOfExtraOpenDmas = initParams.numOfExtraOpenDmas; 878 memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcOutInitParams, sizeof(ipcOutInitParams)); 879 *p_ReplyLength = sizeof(uint32_t) + sizeof(t_FmIpcPortOutInitParams); 880 break; 881 } 882 case (FM_SET_SIZE_OF_FIFO): 883 { 884 t_FmIpcPortRsrcParams ipcPortRsrcParams; 885 886 memcpy((uint8_t*)&ipcPortRsrcParams, p_IpcMsg->msgBody, sizeof(t_FmIpcPortRsrcParams)); 887 p_IpcReply->error = (uint32_t)FmSetSizeOfFifo(h_Fm, 888 ipcPortRsrcParams.hardwarePortId, 889 &ipcPortRsrcParams.val, 890 &ipcPortRsrcParams.extra, 891 (bool)ipcPortRsrcParams.boolInitialConfig); 892 *p_ReplyLength = sizeof(uint32_t); 893 break; 894 } 895 case (FM_SET_NUM_OF_TASKS): 896 { 897 t_FmIpcPortRsrcParams ipcPortRsrcParams; 898 899 memcpy((uint8_t*)&ipcPortRsrcParams, p_IpcMsg->msgBody, sizeof(t_FmIpcPortRsrcParams)); 900 p_IpcReply->error = (uint32_t)FmSetNumOfTasks(h_Fm, ipcPortRsrcParams.hardwarePortId, 901 (uint8_t*)&ipcPortRsrcParams.val, 902 (uint8_t*)&ipcPortRsrcParams.extra, 903 (bool)ipcPortRsrcParams.boolInitialConfig); 904 *p_ReplyLength = sizeof(uint32_t); 905 break; 906 } 907 case (FM_SET_NUM_OF_OPEN_DMAS): 908 { 909 t_FmIpcPortRsrcParams ipcPortRsrcParams; 910 911 memcpy((uint8_t*)&ipcPortRsrcParams, p_IpcMsg->msgBody, sizeof(t_FmIpcPortRsrcParams)); 912 p_IpcReply->error = (uint32_t)FmSetNumOfOpenDmas(h_Fm, ipcPortRsrcParams.hardwarePortId, 913 (uint8_t*)&ipcPortRsrcParams.val, 914 (uint8_t*)&ipcPortRsrcParams.extra, 915 (bool)ipcPortRsrcParams.boolInitialConfig); 916 *p_ReplyLength = sizeof(uint32_t); 917 break; 918 } 919 case (FM_RESUME_STALLED_PORT): 920 *p_ReplyLength = sizeof(uint32_t); 921 p_IpcReply->error = (uint32_t)FmResumeStalledPort(h_Fm, p_IpcMsg->msgBody[0]); 922 break; 923 case (FM_MASTER_IS_ALIVE): 924 { 925 uint8_t guestId = p_IpcMsg->msgBody[0]; 926 /* build the FM master partition IPC address */ 927 memset(p_Fm->fmIpcHandlerModuleName[guestId], 0, (sizeof(char)) * MODULE_NAME_SIZE); 928 if (Sprint (p_Fm->fmIpcHandlerModuleName[guestId], "FM_%d_%d",p_Fm->p_FmStateStruct->fmId, guestId) != (guestId<10 ? 6:7)) 929 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed")); 930 p_Fm->h_IpcSessions[guestId] = XX_IpcInitSession(p_Fm->fmIpcHandlerModuleName[guestId], p_Fm->fmModuleName); 931 if (p_Fm->h_IpcSessions[guestId] == NULL) 932 RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("FM Master IPC session for guest %d", guestId)); 933 *(uint8_t*)(p_IpcReply->replyBody) = 1; 934 *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t); 935 break; 936 } 937 case (FM_IS_PORT_STALLED): 938 { 939 bool tmp; 940 941 p_IpcReply->error = (uint32_t)FmIsPortStalled(h_Fm, p_IpcMsg->msgBody[0], &tmp); 942 *(uint8_t*)(p_IpcReply->replyBody) = (uint8_t)tmp; 943 *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t); 944 break; 945 } 946 case (FM_RESET_MAC): 947 { 948 t_FmIpcMacParams ipcMacParams; 949 950 memcpy((uint8_t*)&ipcMacParams, p_IpcMsg->msgBody, sizeof(t_FmIpcMacParams)); 951 p_IpcReply->error = (uint32_t)FmResetMac(p_Fm, 952 (e_FmMacType)(ipcMacParams.enumType), 953 ipcMacParams.id); 954 *p_ReplyLength = sizeof(uint32_t); 955 break; 956 } 957 case (FM_SET_MAC_MAX_FRAME): 958 { 959 t_FmIpcMacMaxFrameParams ipcMacMaxFrameParams; 960 961 memcpy((uint8_t*)&ipcMacMaxFrameParams, p_IpcMsg->msgBody, sizeof(t_FmIpcMacMaxFrameParams)); 962 err = FmSetMacMaxFrame(p_Fm, 963 (e_FmMacType)(ipcMacMaxFrameParams.macParams.enumType), 964 ipcMacMaxFrameParams.macParams.id, 965 ipcMacMaxFrameParams.maxFrameLength); 966 if (err != E_OK) 967 REPORT_ERROR(MINOR, err, NO_MSG); 968 break; 969 } 970 #if (DPAA_VERSION >= 11) 971 case (FM_VSP_ALLOC) : 972 { 973 t_FmIpcResourceAllocParams ipcAllocParams; 974 uint8_t vspBase; 975 memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams)); 976 vspBase = AllocVSPsForPartition(h_Fm, (uint8_t)ipcAllocParams.base, (uint8_t)ipcAllocParams.num, ipcAllocParams.guestId); 977 memcpy(p_IpcReply->replyBody, (uint8_t*)&vspBase, sizeof(uint8_t)); 978 *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t); 979 break; 980 } 981 case (FM_VSP_FREE) : 982 { 983 t_FmIpcResourceAllocParams ipcAllocParams; 984 memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams)); 985 FreeVSPsForPartition(h_Fm, (uint8_t)ipcAllocParams.base, (uint8_t)ipcAllocParams.num, ipcAllocParams.guestId); 986 break; 987 } 988 case (FM_VSP_SET_PORT_WINDOW) : 989 { 990 t_FmIpcVspSetPortWindow ipcVspSetPortWindow; 991 memcpy(&ipcVspSetPortWindow, p_IpcMsg->msgBody, sizeof(t_FmIpcVspSetPortWindow)); 992 err = SetVSPWindow(h_Fm, 993 ipcVspSetPortWindow.hardwarePortId, 994 ipcVspSetPortWindow.baseStorageProfile, 995 ipcVspSetPortWindow.log2NumOfProfiles); 996 return err; 997 } 998 case (FM_SET_CONG_GRP_PFC_PRIO) : 999 { 1000 t_FmIpcSetCongestionGroupPfcPriority fmIpcSetCongestionGroupPfcPriority; 1001 memcpy(&fmIpcSetCongestionGroupPfcPriority, p_IpcMsg->msgBody, sizeof(t_FmIpcSetCongestionGroupPfcPriority)); 1002 err = FmSetCongestionGroupPFCpriority(h_Fm, 1003 fmIpcSetCongestionGroupPfcPriority.congestionGroupId, 1004 fmIpcSetCongestionGroupPfcPriority.priorityBitMap); 1005 return err; 1006 } 1007 #endif /* (DPAA_VERSION >= 11) */ 1008 1009 case (FM_FREE_PORT): 1010 { 1011 t_FmInterModulePortFreeParams portParams; 1012 t_FmIpcPortFreeParams ipcPortParams; 1013 1014 memcpy((uint8_t*)&ipcPortParams, p_IpcMsg->msgBody, sizeof(t_FmIpcPortFreeParams)); 1015 portParams.hardwarePortId = ipcPortParams.hardwarePortId; 1016 portParams.portType = (e_FmPortType)(ipcPortParams.enumPortType); 1017 portParams.deqPipelineDepth = ipcPortParams.deqPipelineDepth; 1018 FmFreePortParams(h_Fm, &portParams); 1019 break; 1020 } 1021 case (FM_REGISTER_INTR): 1022 { 1023 t_FmIpcRegisterIntr ipcRegIntr; 1024 1025 memcpy((uint8_t*)&ipcRegIntr, p_IpcMsg->msgBody, sizeof(ipcRegIntr)); 1026 p_Fm->intrMng[ipcRegIntr.event].guestId = ipcRegIntr.guestId; 1027 break; 1028 } 1029 case (FM_GET_PARAMS): 1030 { 1031 t_FmIpcParams ipcParams; 1032 1033 /* Get clock frequency */ 1034 ipcParams.fmClkFreq = p_Fm->p_FmStateStruct->fmClkFreq; 1035 ipcParams.fmMacClkFreq = p_Fm->p_FmStateStruct->fmMacClkFreq; 1036 1037 fman_get_revision(p_Fm->p_FmFpmRegs,&ipcParams.majorRev,&ipcParams.minorRev); 1038 1039 memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcParams, sizeof(t_FmIpcParams)); 1040 *p_ReplyLength = sizeof(uint32_t) + sizeof(t_FmIpcParams); 1041 break; 1042 } 1043 case (FM_GET_FMAN_CTRL_CODE_REV): 1044 { 1045 t_FmCtrlCodeRevisionInfo fmanCtrlRevInfo; 1046 t_FmIpcFmanCtrlCodeRevisionInfo ipcRevInfo; 1047 1048 p_IpcReply->error = (uint32_t)FM_GetFmanCtrlCodeRevision(h_Fm, &fmanCtrlRevInfo); 1049 ipcRevInfo.packageRev = fmanCtrlRevInfo.packageRev; 1050 ipcRevInfo.majorRev = fmanCtrlRevInfo.majorRev; 1051 ipcRevInfo.minorRev = fmanCtrlRevInfo.minorRev; 1052 memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcRevInfo, sizeof(t_FmIpcFmanCtrlCodeRevisionInfo)); 1053 *p_ReplyLength = sizeof(uint32_t) + sizeof(t_FmIpcFmanCtrlCodeRevisionInfo); 1054 break; 1055 } 1056 1057 case (FM_DMA_STAT): 1058 { 1059 t_FmDmaStatus dmaStatus; 1060 t_FmIpcDmaStatus ipcDmaStatus; 1061 1062 FM_GetDmaStatus(h_Fm, &dmaStatus); 1063 ipcDmaStatus.boolCmqNotEmpty = (uint8_t)dmaStatus.cmqNotEmpty; 1064 ipcDmaStatus.boolBusError = (uint8_t)dmaStatus.busError; 1065 ipcDmaStatus.boolReadBufEccError = (uint8_t)dmaStatus.readBufEccError; 1066 ipcDmaStatus.boolWriteBufEccSysError = (uint8_t)dmaStatus.writeBufEccSysError; 1067 ipcDmaStatus.boolWriteBufEccFmError = (uint8_t)dmaStatus.writeBufEccFmError; 1068 ipcDmaStatus.boolSinglePortEccError = (uint8_t)dmaStatus.singlePortEccError; 1069 memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcDmaStatus, sizeof(t_FmIpcDmaStatus)); 1070 *p_ReplyLength = sizeof(uint32_t) + sizeof(t_FmIpcDmaStatus); 1071 break; 1072 } 1073 case (FM_ALLOC_FMAN_CTRL_EVENT_REG): 1074 p_IpcReply->error = (uint32_t)FmAllocFmanCtrlEventReg(h_Fm, (uint8_t*)p_IpcReply->replyBody); 1075 *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t); 1076 break; 1077 case (FM_FREE_FMAN_CTRL_EVENT_REG): 1078 FmFreeFmanCtrlEventReg(h_Fm, p_IpcMsg->msgBody[0]); 1079 break; 1080 case (FM_GET_TIMESTAMP_SCALE): 1081 { 1082 uint32_t timeStamp = FmGetTimeStampScale(h_Fm); 1083 1084 memcpy(p_IpcReply->replyBody, (uint8_t*)&timeStamp, sizeof(uint32_t)); 1085 *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t); 1086 break; 1087 } 1088 case (FM_GET_COUNTER): 1089 { 1090 e_FmCounters inCounter; 1091 uint32_t outCounter; 1092 1093 memcpy((uint8_t*)&inCounter, p_IpcMsg->msgBody, sizeof(uint32_t)); 1094 outCounter = FM_GetCounter(h_Fm, inCounter); 1095 memcpy(p_IpcReply->replyBody, (uint8_t*)&outCounter, sizeof(uint32_t)); 1096 *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t); 1097 break; 1098 } 1099 case (FM_SET_FMAN_CTRL_EVENTS_ENABLE): 1100 { 1101 t_FmIpcFmanEvents ipcFmanEvents; 1102 1103 memcpy((uint8_t*)&ipcFmanEvents, p_IpcMsg->msgBody, sizeof(t_FmIpcFmanEvents)); 1104 FmSetFmanCtrlIntr(h_Fm, 1105 ipcFmanEvents.eventRegId, 1106 ipcFmanEvents.enableEvents); 1107 break; 1108 } 1109 case (FM_GET_FMAN_CTRL_EVENTS_ENABLE): 1110 { 1111 uint32_t tmp = FmGetFmanCtrlIntr(h_Fm, p_IpcMsg->msgBody[0]); 1112 1113 memcpy(p_IpcReply->replyBody, (uint8_t*)&tmp, sizeof(uint32_t)); 1114 *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t); 1115 break; 1116 } 1117 case (FM_GET_PHYS_MURAM_BASE): 1118 { 1119 t_FmPhysAddr physAddr; 1120 t_FmIpcPhysAddr ipcPhysAddr; 1121 1122 FmGetPhysicalMuramBase(h_Fm, &physAddr); 1123 ipcPhysAddr.high = physAddr.high; 1124 ipcPhysAddr.low = physAddr.low; 1125 memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcPhysAddr, sizeof(t_FmIpcPhysAddr)); 1126 *p_ReplyLength = sizeof(uint32_t) + sizeof(t_FmIpcPhysAddr); 1127 break; 1128 } 1129 case (FM_ENABLE_RAM_ECC): 1130 { 1131 if (((err = FM_EnableRamsEcc(h_Fm)) != E_OK) || 1132 ((err = FM_SetException(h_Fm, e_FM_EX_IRAM_ECC, TRUE)) != E_OK) || 1133 ((err = FM_SetException(h_Fm, e_FM_EX_MURAM_ECC, TRUE)) != E_OK)) 1134 #if (!(defined(DEBUG_ERRORS)) || (DEBUG_ERRORS == 0)) 1135 UNUSED(err); 1136 #else 1137 REPORT_ERROR(MINOR, err, NO_MSG); 1138 #endif /* (!(defined(DEBUG_ERRORS)) || (DEBUG_ERRORS == 0)) */ 1139 break; 1140 } 1141 case (FM_DISABLE_RAM_ECC): 1142 { 1143 1144 if (((err = FM_SetException(h_Fm, e_FM_EX_IRAM_ECC, FALSE)) != E_OK) || 1145 ((err = FM_SetException(h_Fm, e_FM_EX_MURAM_ECC, FALSE)) != E_OK) || 1146 ((err = FM_DisableRamsEcc(h_Fm)) != E_OK)) 1147 #if (!(defined(DEBUG_ERRORS)) || (DEBUG_ERRORS == 0)) 1148 UNUSED(err); 1149 #else 1150 REPORT_ERROR(MINOR, err, NO_MSG); 1151 #endif /* (!(defined(DEBUG_ERRORS)) || (DEBUG_ERRORS == 0)) */ 1152 break; 1153 } 1154 case (FM_SET_NUM_OF_FMAN_CTRL): 1155 { 1156 t_FmIpcPortNumOfFmanCtrls ipcPortNumOfFmanCtrls; 1157 1158 memcpy((uint8_t*)&ipcPortNumOfFmanCtrls, p_IpcMsg->msgBody, sizeof(t_FmIpcPortNumOfFmanCtrls)); 1159 err = FmSetNumOfRiscsPerPort(h_Fm, 1160 ipcPortNumOfFmanCtrls.hardwarePortId, 1161 ipcPortNumOfFmanCtrls.numOfFmanCtrls, 1162 ipcPortNumOfFmanCtrls.orFmanCtrl); 1163 if (err != E_OK) 1164 REPORT_ERROR(MINOR, err, NO_MSG); 1165 break; 1166 } 1167 #ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 1168 case (FM_10G_TX_ECC_WA): 1169 p_IpcReply->error = (uint32_t)Fm10GTxEccWorkaround(h_Fm, p_IpcMsg->msgBody[0]); 1170 *p_ReplyLength = sizeof(uint32_t); 1171 break; 1172 #endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */ 1173 default: 1174 *p_ReplyLength = 0; 1175 RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("command not found!!!")); 1176 } 1177 return E_OK; 1178 } 1179 1180 1181 /****************************************/ 1182 /* Inter-Module functions */ 1183 /****************************************/ 1184 #ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 1185 t_Error Fm10GTxEccWorkaround(t_Handle h_Fm, uint8_t macId) 1186 { 1187 t_Fm *p_Fm = (t_Fm*)h_Fm; 1188 t_Error err = E_OK; 1189 t_FmIpcMsg msg; 1190 t_FmIpcReply reply; 1191 uint32_t replyLength; 1192 uint8_t rxHardwarePortId, txHardwarePortId; 1193 struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs; 1194 1195 if (p_Fm->guestId != NCSW_MASTER_ID) 1196 { 1197 memset(&msg, 0, sizeof(msg)); 1198 memset(&reply, 0, sizeof(reply)); 1199 msg.msgId = FM_10G_TX_ECC_WA; 1200 msg.msgBody[0] = macId; 1201 replyLength = sizeof(uint32_t); 1202 if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 1203 (uint8_t*)&msg, 1204 sizeof(msg.msgId)+sizeof(macId), 1205 (uint8_t*)&reply, 1206 &replyLength, 1207 NULL, 1208 NULL)) != E_OK) 1209 RETURN_ERROR(MINOR, err, NO_MSG); 1210 if (replyLength != sizeof(uint32_t)) 1211 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 1212 return (t_Error)(reply.error); 1213 } 1214 1215 SANITY_CHECK_RETURN_ERROR((macId == 0), E_NOT_SUPPORTED); 1216 SANITY_CHECK_RETURN_ERROR(IsFmanCtrlCodeLoaded(p_Fm), E_INVALID_STATE); 1217 1218 rxHardwarePortId = SwPortIdToHwPortId(e_FM_PORT_TYPE_RX_10G, 1219 macId, 1220 p_Fm->p_FmStateStruct->revInfo.majorRev, 1221 p_Fm->p_FmStateStruct->revInfo.minorRev); 1222 txHardwarePortId = SwPortIdToHwPortId(e_FM_PORT_TYPE_TX_10G, 1223 macId, 1224 p_Fm->p_FmStateStruct->revInfo.majorRev, 1225 p_Fm->p_FmStateStruct->revInfo.minorRev); 1226 if ((p_Fm->p_FmStateStruct->portsTypes[rxHardwarePortId] != e_FM_PORT_TYPE_DUMMY) || 1227 (p_Fm->p_FmStateStruct->portsTypes[txHardwarePortId] != e_FM_PORT_TYPE_DUMMY)) 1228 RETURN_ERROR(MAJOR, E_INVALID_STATE, 1229 ("MAC should be initialized prior to Rx and Tx ports!")); 1230 1231 return fman_set_erratum_10gmac_a004_wa(fpm_rg); 1232 } 1233 #endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */ 1234 1235 uint16_t FmGetTnumAgingPeriod(t_Handle h_Fm) 1236 { 1237 t_Fm *p_Fm = (t_Fm *)h_Fm; 1238 1239 SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0); 1240 SANITY_CHECK_RETURN_VALUE(!p_Fm->p_FmDriverParam, E_INVALID_STATE, 0); 1241 1242 return p_Fm->tnumAgingPeriod; 1243 } 1244 1245 t_Error FmSetPortPreFetchConfiguration(t_Handle h_Fm, 1246 uint8_t portNum, 1247 bool preFetchConfigured) 1248 { 1249 t_Fm *p_Fm = (t_Fm*)h_Fm; 1250 1251 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 1252 SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE); 1253 1254 p_Fm->portsPreFetchConfigured[portNum] = TRUE; 1255 p_Fm->portsPreFetchValue[portNum] = preFetchConfigured; 1256 1257 return E_OK; 1258 } 1259 1260 t_Error FmGetPortPreFetchConfiguration(t_Handle h_Fm, 1261 uint8_t portNum, 1262 bool *p_PortConfigured, 1263 bool *p_PreFetchConfigured) 1264 { 1265 t_Fm *p_Fm = (t_Fm*)h_Fm; 1266 1267 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 1268 SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE); 1269 1270 /* If the prefetch wasn't configured yet (not enable or disabled) 1271 we return the value TRUE as it was already configured */ 1272 if (!p_Fm->portsPreFetchConfigured[portNum]) 1273 { 1274 *p_PortConfigured = FALSE; 1275 *p_PreFetchConfigured = FALSE; 1276 } 1277 else 1278 { 1279 *p_PortConfigured = TRUE; 1280 *p_PreFetchConfigured = (p_Fm->portsPreFetchConfigured[portNum]); 1281 } 1282 1283 return E_OK; 1284 } 1285 1286 t_Error FmSetCongestionGroupPFCpriority(t_Handle h_Fm, 1287 uint32_t congestionGroupId, 1288 uint8_t priorityBitMap) 1289 { 1290 t_Fm *p_Fm = (t_Fm *)h_Fm; 1291 uint32_t regNum; 1292 1293 ASSERT_COND(h_Fm); 1294 1295 if (congestionGroupId > FM_PORT_NUM_OF_CONGESTION_GRPS) 1296 RETURN_ERROR(MAJOR, E_INVALID_VALUE, 1297 ("Congestion group ID bigger than %d", 1298 FM_PORT_NUM_OF_CONGESTION_GRPS)); 1299 1300 if (p_Fm->guestId == NCSW_MASTER_ID) 1301 { 1302 ASSERT_COND(p_Fm->baseAddr); 1303 regNum = (FM_PORT_NUM_OF_CONGESTION_GRPS - 1 - congestionGroupId) / 4; 1304 fman_set_congestion_group_pfc_priority((uint32_t *)((p_Fm->baseAddr+FM_MM_CGP)), 1305 congestionGroupId, 1306 priorityBitMap, 1307 regNum); 1308 } 1309 else if (p_Fm->h_IpcSessions[0]) 1310 { 1311 t_Error err; 1312 t_FmIpcMsg msg; 1313 t_FmIpcSetCongestionGroupPfcPriority fmIpcSetCongestionGroupPfcPriority; 1314 1315 memset(&msg, 0, sizeof(msg)); 1316 memset(&fmIpcSetCongestionGroupPfcPriority, 0, sizeof(t_FmIpcSetCongestionGroupPfcPriority)); 1317 fmIpcSetCongestionGroupPfcPriority.congestionGroupId = congestionGroupId; 1318 fmIpcSetCongestionGroupPfcPriority.priorityBitMap = priorityBitMap; 1319 1320 msg.msgId = FM_SET_CONG_GRP_PFC_PRIO; 1321 memcpy(msg.msgBody, &fmIpcSetCongestionGroupPfcPriority, sizeof(t_FmIpcSetCongestionGroupPfcPriority)); 1322 1323 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 1324 (uint8_t*)&msg, 1325 sizeof(msg.msgId), 1326 NULL, 1327 NULL, 1328 NULL, 1329 NULL); 1330 if (err != E_OK) 1331 RETURN_ERROR(MINOR, err, NO_MSG); 1332 } 1333 else 1334 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("guest without IPC!")); 1335 1336 return E_OK; 1337 } 1338 1339 uintptr_t FmGetPcdPrsBaseAddr(t_Handle h_Fm) 1340 { 1341 t_Fm *p_Fm = (t_Fm*)h_Fm; 1342 1343 SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0); 1344 1345 if (!p_Fm->baseAddr) 1346 { 1347 REPORT_ERROR(MAJOR, E_INVALID_STATE, 1348 ("No base-addr; probably Guest with IPC!")); 1349 return 0; 1350 } 1351 1352 return (p_Fm->baseAddr + FM_MM_PRS); 1353 } 1354 1355 uintptr_t FmGetPcdKgBaseAddr(t_Handle h_Fm) 1356 { 1357 t_Fm *p_Fm = (t_Fm*)h_Fm; 1358 1359 SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0); 1360 1361 if (!p_Fm->baseAddr) 1362 { 1363 REPORT_ERROR(MAJOR, E_INVALID_STATE, 1364 ("No base-addr; probably Guest with IPC!")); 1365 return 0; 1366 } 1367 1368 return (p_Fm->baseAddr + FM_MM_KG); 1369 } 1370 1371 uintptr_t FmGetPcdPlcrBaseAddr(t_Handle h_Fm) 1372 { 1373 t_Fm *p_Fm = (t_Fm*)h_Fm; 1374 1375 SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0); 1376 1377 if (!p_Fm->baseAddr) 1378 { 1379 REPORT_ERROR(MAJOR, E_INVALID_STATE, 1380 ("No base-addr; probably Guest with IPC!")); 1381 return 0; 1382 } 1383 1384 return (p_Fm->baseAddr + FM_MM_PLCR); 1385 } 1386 1387 #if (DPAA_VERSION >= 11) 1388 uintptr_t FmGetVSPBaseAddr(t_Handle h_Fm) 1389 { 1390 t_Fm *p_Fm = (t_Fm*)h_Fm; 1391 1392 SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0); 1393 1394 return p_Fm->vspBaseAddr; 1395 } 1396 #endif /* (DPAA_VERSION >= 11) */ 1397 1398 t_Handle FmGetMuramHandle(t_Handle h_Fm) 1399 { 1400 t_Fm *p_Fm = (t_Fm*)h_Fm; 1401 1402 SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, NULL); 1403 1404 return (p_Fm->h_FmMuram); 1405 } 1406 1407 void FmGetPhysicalMuramBase(t_Handle h_Fm, t_FmPhysAddr *p_FmPhysAddr) 1408 { 1409 t_Fm *p_Fm = (t_Fm*)h_Fm; 1410 1411 if (p_Fm->fmMuramPhysBaseAddr) 1412 { 1413 /* General FM driver initialization */ 1414 p_FmPhysAddr->low = (uint32_t)p_Fm->fmMuramPhysBaseAddr; 1415 p_FmPhysAddr->high = (uint8_t)((p_Fm->fmMuramPhysBaseAddr & 0x000000ff00000000LL) >> 32); 1416 return; 1417 } 1418 1419 ASSERT_COND(p_Fm->guestId != NCSW_MASTER_ID); 1420 1421 if (p_Fm->h_IpcSessions[0]) 1422 { 1423 t_Error err; 1424 t_FmIpcMsg msg; 1425 t_FmIpcReply reply; 1426 uint32_t replyLength; 1427 t_FmIpcPhysAddr ipcPhysAddr; 1428 1429 memset(&msg, 0, sizeof(msg)); 1430 memset(&reply, 0, sizeof(reply)); 1431 msg.msgId = FM_GET_PHYS_MURAM_BASE; 1432 replyLength = sizeof(uint32_t) + sizeof(t_FmPhysAddr); 1433 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 1434 (uint8_t*)&msg, 1435 sizeof(msg.msgId), 1436 (uint8_t*)&reply, 1437 &replyLength, 1438 NULL, 1439 NULL); 1440 if (err != E_OK) 1441 { 1442 REPORT_ERROR(MINOR, err, NO_MSG); 1443 return; 1444 } 1445 if (replyLength != (sizeof(uint32_t) + sizeof(t_FmPhysAddr))) 1446 { 1447 REPORT_ERROR(MINOR, E_INVALID_VALUE,("IPC reply length mismatch")); 1448 return; 1449 } 1450 memcpy((uint8_t*)&ipcPhysAddr, reply.replyBody, sizeof(t_FmIpcPhysAddr)); 1451 p_FmPhysAddr->high = ipcPhysAddr.high; 1452 p_FmPhysAddr->low = ipcPhysAddr.low; 1453 } 1454 else 1455 REPORT_ERROR(MINOR, E_NOT_SUPPORTED, 1456 ("running in guest-mode without neither IPC nor mapped register!")); 1457 } 1458 1459 #if (DPAA_VERSION >= 11) 1460 t_Error FmVSPAllocForPort (t_Handle h_Fm, 1461 e_FmPortType portType, 1462 uint8_t portId, 1463 uint8_t numOfVSPs) 1464 { 1465 t_Fm *p_Fm = (t_Fm *)h_Fm; 1466 t_Error err = E_OK; 1467 uint32_t profilesFound, intFlags; 1468 uint8_t first, i; 1469 uint8_t log2Num; 1470 uint8_t swPortIndex=0, hardwarePortId; 1471 1472 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 1473 1474 if (!numOfVSPs) 1475 return E_OK; 1476 1477 if (numOfVSPs > FM_VSP_MAX_NUM_OF_ENTRIES) 1478 RETURN_ERROR(MINOR, E_INVALID_VALUE, ("numProfiles can not be bigger than %d.",FM_VSP_MAX_NUM_OF_ENTRIES)); 1479 1480 if (!POWER_OF_2(numOfVSPs)) 1481 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numProfiles must be a power of 2.")); 1482 1483 LOG2((uint64_t)numOfVSPs, log2Num); 1484 1485 if ((log2Num == 0) || (p_Fm->partVSPBase == 0)) 1486 first = 0; 1487 else 1488 first = 1<<log2Num; 1489 1490 if (first > (p_Fm->partVSPBase + p_Fm->partNumOfVSPs)) 1491 RETURN_ERROR(MINOR, E_INVALID_VALUE, ("can not allocate storage profile port window")); 1492 1493 if (first < p_Fm->partVSPBase) 1494 while (first < p_Fm->partVSPBase) 1495 first = first + numOfVSPs; 1496 1497 if ((first + numOfVSPs) > (p_Fm->partVSPBase + p_Fm->partNumOfVSPs)) 1498 RETURN_ERROR(MINOR, E_INVALID_VALUE, ("can not allocate storage profile port window")); 1499 1500 intFlags = XX_LockIntrSpinlock(p_Fm->h_Spinlock); 1501 profilesFound = 0; 1502 for (i=first; i < p_Fm->partVSPBase + p_Fm->partNumOfVSPs; ) 1503 { 1504 if (!p_Fm->p_FmSp->profiles[i].profilesMng.allocated) 1505 { 1506 profilesFound++; 1507 i++; 1508 if (profilesFound == numOfVSPs) 1509 break; 1510 } 1511 else 1512 { 1513 profilesFound = 0; 1514 /* advance i to the next aligned address */ 1515 first = i = (uint8_t)(first + numOfVSPs); 1516 } 1517 } 1518 if (profilesFound == numOfVSPs) 1519 for (i = first; i<first + numOfVSPs; i++) 1520 p_Fm->p_FmSp->profiles[i].profilesMng.allocated = TRUE; 1521 else 1522 { 1523 XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags); 1524 RETURN_ERROR(MINOR, E_FULL, ("No profiles.")); 1525 } 1526 1527 hardwarePortId = SwPortIdToHwPortId(portType, 1528 portId, 1529 p_Fm->p_FmStateStruct->revInfo.majorRev, 1530 p_Fm->p_FmStateStruct->revInfo.minorRev); 1531 HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId); 1532 1533 p_Fm->p_FmSp->portsMapping[swPortIndex].numOfProfiles = numOfVSPs; 1534 p_Fm->p_FmSp->portsMapping[swPortIndex].profilesBase = first; 1535 1536 if ((err = SetVSPWindow(h_Fm,hardwarePortId, first,log2Num)) != E_OK) 1537 for (i = first; i < first + numOfVSPs; i++) 1538 p_Fm->p_FmSp->profiles[i].profilesMng.allocated = FALSE; 1539 1540 XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags); 1541 1542 return err; 1543 } 1544 1545 t_Error FmVSPFreeForPort(t_Handle h_Fm, 1546 e_FmPortType portType, 1547 uint8_t portId) 1548 { 1549 t_Fm *p_Fm = (t_Fm *)h_Fm; 1550 uint8_t swPortIndex=0, hardwarePortId, first, numOfVSPs, i; 1551 uint32_t intFlags; 1552 1553 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 1554 1555 hardwarePortId = SwPortIdToHwPortId(portType, 1556 portId, 1557 p_Fm->p_FmStateStruct->revInfo.majorRev, 1558 p_Fm->p_FmStateStruct->revInfo.minorRev); 1559 HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId); 1560 1561 numOfVSPs = (uint8_t)p_Fm->p_FmSp->portsMapping[swPortIndex].numOfProfiles; 1562 first = (uint8_t)p_Fm->p_FmSp->portsMapping[swPortIndex].profilesBase; 1563 1564 intFlags = XX_LockIntrSpinlock(p_Fm->h_Spinlock); 1565 for (i = first; i < first + numOfVSPs; i++) 1566 p_Fm->p_FmSp->profiles[i].profilesMng.allocated = FALSE; 1567 XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags); 1568 1569 p_Fm->p_FmSp->portsMapping[swPortIndex].numOfProfiles = 0; 1570 p_Fm->p_FmSp->portsMapping[swPortIndex].profilesBase = 0; 1571 1572 return E_OK; 1573 } 1574 #endif /* (DPAA_VERSION >= 11) */ 1575 1576 t_Error FmAllocFmanCtrlEventReg(t_Handle h_Fm, uint8_t *p_EventId) 1577 { 1578 t_Fm *p_Fm = (t_Fm*)h_Fm; 1579 uint8_t i; 1580 1581 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 1582 1583 if ((p_Fm->guestId != NCSW_MASTER_ID) && 1584 p_Fm->h_IpcSessions[0]) 1585 { 1586 t_Error err; 1587 t_FmIpcMsg msg; 1588 t_FmIpcReply reply; 1589 uint32_t replyLength; 1590 1591 memset(&msg, 0, sizeof(msg)); 1592 memset(&reply, 0, sizeof(reply)); 1593 msg.msgId = FM_ALLOC_FMAN_CTRL_EVENT_REG; 1594 replyLength = sizeof(uint32_t) + sizeof(uint8_t); 1595 if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 1596 (uint8_t*)&msg, 1597 sizeof(msg.msgId), 1598 (uint8_t*)&reply, 1599 &replyLength, 1600 NULL, 1601 NULL)) != E_OK) 1602 RETURN_ERROR(MAJOR, err, NO_MSG); 1603 1604 if (replyLength != (sizeof(uint32_t) + sizeof(uint8_t))) 1605 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 1606 1607 *p_EventId = *(uint8_t*)(reply.replyBody); 1608 1609 return (t_Error)(reply.error); 1610 } 1611 else if (p_Fm->guestId != NCSW_MASTER_ID) 1612 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, 1613 ("running in guest-mode without IPC!")); 1614 1615 for (i=0;i<FM_NUM_OF_FMAN_CTRL_EVENT_REGS;i++) 1616 if (!p_Fm->usedEventRegs[i]) 1617 { 1618 p_Fm->usedEventRegs[i] = TRUE; 1619 *p_EventId = i; 1620 break; 1621 } 1622 1623 if (i==FM_NUM_OF_FMAN_CTRL_EVENT_REGS) 1624 RETURN_ERROR(MAJOR, E_BUSY, ("No resource - FMan controller event register.")); 1625 1626 return E_OK; 1627 } 1628 1629 void FmFreeFmanCtrlEventReg(t_Handle h_Fm, uint8_t eventId) 1630 { 1631 t_Fm *p_Fm = (t_Fm*)h_Fm; 1632 1633 SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE); 1634 1635 if ((p_Fm->guestId != NCSW_MASTER_ID) && 1636 p_Fm->h_IpcSessions[0]) 1637 { 1638 t_Error err; 1639 t_FmIpcMsg msg; 1640 1641 memset(&msg, 0, sizeof(msg)); 1642 msg.msgId = FM_FREE_FMAN_CTRL_EVENT_REG; 1643 msg.msgBody[0] = eventId; 1644 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 1645 (uint8_t*)&msg, 1646 sizeof(msg.msgId)+sizeof(eventId), 1647 NULL, 1648 NULL, 1649 NULL, 1650 NULL); 1651 if (err != E_OK) 1652 REPORT_ERROR(MINOR, err, NO_MSG); 1653 return; 1654 } 1655 else if (p_Fm->guestId != NCSW_MASTER_ID) 1656 { 1657 REPORT_ERROR(MINOR, E_NOT_SUPPORTED, 1658 ("running in guest-mode without IPC!")); 1659 return; 1660 } 1661 1662 ((t_Fm*)h_Fm)->usedEventRegs[eventId] = FALSE; 1663 } 1664 1665 void FmSetFmanCtrlIntr(t_Handle h_Fm, uint8_t eventRegId, uint32_t enableEvents) 1666 { 1667 t_Fm *p_Fm = (t_Fm*)h_Fm; 1668 struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs; 1669 1670 if ((p_Fm->guestId != NCSW_MASTER_ID) && 1671 !p_Fm->p_FmFpmRegs && 1672 p_Fm->h_IpcSessions[0]) 1673 { 1674 t_FmIpcFmanEvents fmanCtrl; 1675 t_Error err; 1676 t_FmIpcMsg msg; 1677 1678 fmanCtrl.eventRegId = eventRegId; 1679 fmanCtrl.enableEvents = enableEvents; 1680 memset(&msg, 0, sizeof(msg)); 1681 msg.msgId = FM_SET_FMAN_CTRL_EVENTS_ENABLE; 1682 memcpy(msg.msgBody, &fmanCtrl, sizeof(fmanCtrl)); 1683 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 1684 (uint8_t*)&msg, 1685 sizeof(msg.msgId)+sizeof(fmanCtrl), 1686 NULL, 1687 NULL, 1688 NULL, 1689 NULL); 1690 if (err != E_OK) 1691 REPORT_ERROR(MINOR, err, NO_MSG); 1692 return; 1693 } 1694 else if (!p_Fm->p_FmFpmRegs) 1695 { 1696 REPORT_ERROR(MINOR, E_NOT_SUPPORTED, 1697 ("Either IPC or 'baseAddress' is required!")); 1698 return; 1699 } 1700 1701 ASSERT_COND(eventRegId < FM_NUM_OF_FMAN_CTRL_EVENT_REGS); 1702 fman_set_ctrl_intr(fpm_rg, eventRegId, enableEvents); 1703 } 1704 1705 uint32_t FmGetFmanCtrlIntr(t_Handle h_Fm, uint8_t eventRegId) 1706 { 1707 t_Fm *p_Fm = (t_Fm*)h_Fm; 1708 struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs; 1709 1710 if ((p_Fm->guestId != NCSW_MASTER_ID) && 1711 !p_Fm->p_FmFpmRegs && 1712 p_Fm->h_IpcSessions[0]) 1713 { 1714 t_Error err; 1715 t_FmIpcMsg msg; 1716 t_FmIpcReply reply; 1717 uint32_t replyLength, ctrlIntr; 1718 1719 memset(&msg, 0, sizeof(msg)); 1720 memset(&reply, 0, sizeof(reply)); 1721 msg.msgId = FM_GET_FMAN_CTRL_EVENTS_ENABLE; 1722 msg.msgBody[0] = eventRegId; 1723 replyLength = sizeof(uint32_t) + sizeof(uint32_t); 1724 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 1725 (uint8_t*)&msg, 1726 sizeof(msg.msgId)+sizeof(eventRegId), 1727 (uint8_t*)&reply, 1728 &replyLength, 1729 NULL, 1730 NULL); 1731 if (err != E_OK) 1732 { 1733 REPORT_ERROR(MINOR, err, NO_MSG); 1734 return 0; 1735 } 1736 if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t))) 1737 { 1738 REPORT_ERROR(MINOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 1739 return 0; 1740 } 1741 memcpy((uint8_t*)&ctrlIntr, reply.replyBody, sizeof(uint32_t)); 1742 return ctrlIntr; 1743 } 1744 else if (!p_Fm->p_FmFpmRegs) 1745 { 1746 REPORT_ERROR(MINOR, E_NOT_SUPPORTED, 1747 ("Either IPC or 'baseAddress' is required!")); 1748 return 0; 1749 } 1750 1751 return fman_get_ctrl_intr(fpm_rg, eventRegId); 1752 } 1753 1754 void FmRegisterIntr(t_Handle h_Fm, 1755 e_FmEventModules module, 1756 uint8_t modId, 1757 e_FmIntrType intrType, 1758 void (*f_Isr) (t_Handle h_Arg), 1759 t_Handle h_Arg) 1760 { 1761 t_Fm *p_Fm = (t_Fm*)h_Fm; 1762 int event = 0; 1763 1764 ASSERT_COND(h_Fm); 1765 1766 GET_FM_MODULE_EVENT(module, modId, intrType, event); 1767 ASSERT_COND(event < e_FM_EV_DUMMY_LAST); 1768 1769 /* register in local FM structure */ 1770 p_Fm->intrMng[event].f_Isr = f_Isr; 1771 p_Fm->intrMng[event].h_SrcHandle = h_Arg; 1772 1773 if ((p_Fm->guestId != NCSW_MASTER_ID) && 1774 p_Fm->h_IpcSessions[0]) 1775 { 1776 t_FmIpcRegisterIntr fmIpcRegisterIntr; 1777 t_Error err; 1778 t_FmIpcMsg msg; 1779 1780 /* register in Master FM structure */ 1781 fmIpcRegisterIntr.event = (uint32_t)event; 1782 fmIpcRegisterIntr.guestId = p_Fm->guestId; 1783 memset(&msg, 0, sizeof(msg)); 1784 msg.msgId = FM_REGISTER_INTR; 1785 memcpy(msg.msgBody, &fmIpcRegisterIntr, sizeof(fmIpcRegisterIntr)); 1786 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 1787 (uint8_t*)&msg, 1788 sizeof(msg.msgId) + sizeof(fmIpcRegisterIntr), 1789 NULL, 1790 NULL, 1791 NULL, 1792 NULL); 1793 if (err != E_OK) 1794 REPORT_ERROR(MINOR, err, NO_MSG); 1795 } 1796 else if (p_Fm->guestId != NCSW_MASTER_ID) 1797 REPORT_ERROR(MINOR, E_NOT_SUPPORTED, 1798 ("running in guest-mode without IPC!")); 1799 } 1800 1801 void FmUnregisterIntr(t_Handle h_Fm, 1802 e_FmEventModules module, 1803 uint8_t modId, 1804 e_FmIntrType intrType) 1805 { 1806 t_Fm *p_Fm = (t_Fm*)h_Fm; 1807 int event = 0; 1808 1809 ASSERT_COND(h_Fm); 1810 1811 GET_FM_MODULE_EVENT(module, modId,intrType, event); 1812 ASSERT_COND(event < e_FM_EV_DUMMY_LAST); 1813 1814 p_Fm->intrMng[event].f_Isr = UnimplementedIsr; 1815 p_Fm->intrMng[event].h_SrcHandle = NULL; 1816 } 1817 1818 void FmRegisterFmanCtrlIntr(t_Handle h_Fm, uint8_t eventRegId, void (*f_Isr) (t_Handle h_Arg, uint32_t event), t_Handle h_Arg) 1819 { 1820 t_Fm *p_Fm = (t_Fm*)h_Fm; 1821 1822 ASSERT_COND(eventRegId<FM_NUM_OF_FMAN_CTRL_EVENT_REGS); 1823 1824 if (p_Fm->guestId != NCSW_MASTER_ID) 1825 { 1826 REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM in guest-mode")); 1827 return; 1828 } 1829 1830 p_Fm->fmanCtrlIntr[eventRegId].f_Isr = f_Isr; 1831 p_Fm->fmanCtrlIntr[eventRegId].h_SrcHandle = h_Arg; 1832 } 1833 1834 void FmUnregisterFmanCtrlIntr(t_Handle h_Fm, uint8_t eventRegId) 1835 { 1836 t_Fm *p_Fm = (t_Fm*)h_Fm; 1837 1838 ASSERT_COND(eventRegId<FM_NUM_OF_FMAN_CTRL_EVENT_REGS); 1839 1840 if (p_Fm->guestId != NCSW_MASTER_ID) 1841 { 1842 REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM in guest-mode")); 1843 return; 1844 } 1845 1846 p_Fm->fmanCtrlIntr[eventRegId].f_Isr = UnimplementedFmanCtrlIsr; 1847 p_Fm->fmanCtrlIntr[eventRegId].h_SrcHandle = NULL; 1848 } 1849 1850 void FmRegisterPcd(t_Handle h_Fm, t_Handle h_FmPcd) 1851 { 1852 t_Fm *p_Fm = (t_Fm*)h_Fm; 1853 1854 if (p_Fm->h_Pcd) 1855 REPORT_ERROR(MAJOR, E_ALREADY_EXISTS, ("PCD already set")); 1856 1857 p_Fm->h_Pcd = h_FmPcd; 1858 } 1859 1860 void FmUnregisterPcd(t_Handle h_Fm) 1861 { 1862 t_Fm *p_Fm = (t_Fm*)h_Fm; 1863 1864 if (!p_Fm->h_Pcd) 1865 REPORT_ERROR(MAJOR, E_NOT_FOUND, ("PCD handle!")); 1866 1867 p_Fm->h_Pcd = NULL; 1868 } 1869 1870 t_Handle FmGetPcdHandle(t_Handle h_Fm) 1871 { 1872 t_Fm *p_Fm = (t_Fm*)h_Fm; 1873 1874 return p_Fm->h_Pcd; 1875 } 1876 1877 uint8_t FmGetId(t_Handle h_Fm) 1878 { 1879 t_Fm *p_Fm = (t_Fm*)h_Fm; 1880 1881 SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0xff); 1882 1883 return p_Fm->p_FmStateStruct->fmId; 1884 } 1885 1886 t_Error FmReset(t_Handle h_Fm) 1887 { 1888 t_Fm *p_Fm = (t_Fm*)h_Fm; 1889 1890 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 1891 1892 WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_rstc, FPM_RSTC_FM_RESET); 1893 CORE_MemoryBarrier(); 1894 XX_UDelay(100); 1895 1896 return E_OK; 1897 } 1898 1899 t_Error FmSetNumOfRiscsPerPort(t_Handle h_Fm, 1900 uint8_t hardwarePortId, 1901 uint8_t numOfFmanCtrls, 1902 t_FmFmanCtrl orFmanCtrl) 1903 { 1904 1905 t_Fm *p_Fm = (t_Fm*)h_Fm; 1906 struct fman_fpm_regs *fpm_rg; 1907 1908 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 1909 SANITY_CHECK_RETURN_ERROR(((numOfFmanCtrls > 0) && (numOfFmanCtrls < 3)) , E_INVALID_HANDLE); 1910 1911 fpm_rg = p_Fm->p_FmFpmRegs; 1912 if ((p_Fm->guestId != NCSW_MASTER_ID) && 1913 !p_Fm->p_FmFpmRegs && 1914 p_Fm->h_IpcSessions[0]) 1915 { 1916 t_Error err; 1917 t_FmIpcPortNumOfFmanCtrls params; 1918 t_FmIpcMsg msg; 1919 1920 memset(&msg, 0, sizeof(msg)); 1921 params.hardwarePortId = hardwarePortId; 1922 params.numOfFmanCtrls = numOfFmanCtrls; 1923 params.orFmanCtrl = orFmanCtrl; 1924 msg.msgId = FM_SET_NUM_OF_FMAN_CTRL; 1925 memcpy(msg.msgBody, ¶ms, sizeof(params)); 1926 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 1927 (uint8_t*)&msg, 1928 sizeof(msg.msgId) +sizeof(params), 1929 NULL, 1930 NULL, 1931 NULL, 1932 NULL); 1933 if (err != E_OK) 1934 RETURN_ERROR(MINOR, err, NO_MSG); 1935 return E_OK; 1936 } 1937 else if (!p_Fm->p_FmFpmRegs) 1938 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, 1939 ("Either IPC or 'baseAddress' is required!")); 1940 1941 fman_set_num_of_riscs_per_port(fpm_rg, hardwarePortId, numOfFmanCtrls, orFmanCtrl); 1942 1943 return E_OK; 1944 } 1945 1946 t_Error FmGetSetPortParams(t_Handle h_Fm, t_FmInterModulePortInitParams *p_PortParams) 1947 { 1948 t_Fm *p_Fm = (t_Fm*)h_Fm; 1949 t_Error err; 1950 uint32_t intFlags; 1951 uint8_t hardwarePortId = p_PortParams->hardwarePortId, macId; 1952 struct fman_rg fman_rg; 1953 1954 fman_rg.bmi_rg = p_Fm->p_FmBmiRegs; 1955 fman_rg.qmi_rg = p_Fm->p_FmQmiRegs; 1956 fman_rg.fpm_rg = p_Fm->p_FmFpmRegs; 1957 fman_rg.dma_rg = p_Fm->p_FmDmaRegs; 1958 1959 if (p_Fm->guestId != NCSW_MASTER_ID) 1960 { 1961 t_FmIpcPortInInitParams portInParams; 1962 t_FmIpcPortOutInitParams portOutParams; 1963 t_FmIpcMsg msg; 1964 t_FmIpcReply reply; 1965 uint32_t replyLength; 1966 1967 portInParams.hardwarePortId = p_PortParams->hardwarePortId; 1968 portInParams.enumPortType = (uint32_t)p_PortParams->portType; 1969 portInParams.boolIndependentMode= (uint8_t)p_PortParams->independentMode; 1970 portInParams.liodnOffset = p_PortParams->liodnOffset; 1971 portInParams.numOfTasks = p_PortParams->numOfTasks; 1972 portInParams.numOfExtraTasks = p_PortParams->numOfExtraTasks; 1973 portInParams.numOfOpenDmas = p_PortParams->numOfOpenDmas; 1974 portInParams.numOfExtraOpenDmas = p_PortParams->numOfExtraOpenDmas; 1975 portInParams.sizeOfFifo = p_PortParams->sizeOfFifo; 1976 portInParams.extraSizeOfFifo = p_PortParams->extraSizeOfFifo; 1977 portInParams.deqPipelineDepth = p_PortParams->deqPipelineDepth; 1978 portInParams.maxFrameLength = p_PortParams->maxFrameLength; 1979 portInParams.liodnBase = p_PortParams->liodnBase; 1980 1981 memset(&msg, 0, sizeof(msg)); 1982 memset(&reply, 0, sizeof(reply)); 1983 msg.msgId = FM_GET_SET_PORT_PARAMS; 1984 memcpy(msg.msgBody, &portInParams, sizeof(portInParams)); 1985 replyLength = (sizeof(uint32_t) + sizeof(t_FmIpcPortOutInitParams)); 1986 if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 1987 (uint8_t*)&msg, 1988 sizeof(msg.msgId) +sizeof(portInParams), 1989 (uint8_t*)&reply, 1990 &replyLength, 1991 NULL, 1992 NULL)) != E_OK) 1993 RETURN_ERROR(MINOR, err, NO_MSG); 1994 if (replyLength != (sizeof(uint32_t) + sizeof(t_FmIpcPortOutInitParams))) 1995 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 1996 memcpy((uint8_t*)&portOutParams, reply.replyBody, sizeof(t_FmIpcPortOutInitParams)); 1997 1998 p_PortParams->fmMuramPhysBaseAddr.high = portOutParams.ipcPhysAddr.high; 1999 p_PortParams->fmMuramPhysBaseAddr.low = portOutParams.ipcPhysAddr.low; 2000 p_PortParams->numOfTasks = portOutParams.numOfTasks; 2001 p_PortParams->numOfExtraTasks = portOutParams.numOfExtraTasks; 2002 p_PortParams->numOfOpenDmas = portOutParams.numOfOpenDmas; 2003 p_PortParams->numOfExtraOpenDmas = portOutParams.numOfExtraOpenDmas; 2004 p_PortParams->sizeOfFifo = portOutParams.sizeOfFifo; 2005 p_PortParams->extraSizeOfFifo = portOutParams.extraSizeOfFifo; 2006 2007 return (t_Error)(reply.error); 2008 } 2009 2010 ASSERT_COND(IN_RANGE(1, hardwarePortId, 63)); 2011 2012 intFlags = XX_LockIntrSpinlock(p_Fm->h_Spinlock); 2013 if (p_PortParams->independentMode) 2014 { 2015 /* set port parameters */ 2016 p_Fm->independentMode = p_PortParams->independentMode; 2017 /* disable dispatch limit */ 2018 fman_qmi_disable_dispatch_limit(fman_rg.fpm_rg); 2019 } 2020 2021 if (p_PortParams->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND) 2022 { 2023 if (p_Fm->hcPortInitialized) 2024 { 2025 XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags); 2026 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Only one host command port is allowed.")); 2027 } 2028 else 2029 p_Fm->hcPortInitialized = TRUE; 2030 } 2031 p_Fm->p_FmStateStruct->portsTypes[hardwarePortId] = p_PortParams->portType; 2032 2033 err = FmSetNumOfTasks(p_Fm, hardwarePortId, &p_PortParams->numOfTasks, &p_PortParams->numOfExtraTasks, TRUE); 2034 if (err) 2035 { 2036 XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags); 2037 RETURN_ERROR(MAJOR, err, NO_MSG); 2038 } 2039 2040 #ifdef FM_QMI_NO_DEQ_OPTIONS_SUPPORT 2041 if (p_Fm->p_FmStateStruct->revInfo.majorRev != 4) 2042 #endif /* FM_QMI_NO_DEQ_OPTIONS_SUPPORT */ 2043 if ((p_PortParams->portType != e_FM_PORT_TYPE_RX) && 2044 (p_PortParams->portType != e_FM_PORT_TYPE_RX_10G)) 2045 /* for transmit & O/H ports */ 2046 { 2047 uint8_t enqTh; 2048 uint8_t deqTh; 2049 2050 /* update qmi ENQ/DEQ threshold */ 2051 p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums += p_PortParams->deqPipelineDepth; 2052 enqTh = fman_get_qmi_enq_th(fman_rg.qmi_rg); 2053 /* if enqTh is too big, we reduce it to the max value that is still OK */ 2054 if (enqTh >= (QMI_MAX_NUM_OF_TNUMS - p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums)) 2055 { 2056 enqTh = (uint8_t)(QMI_MAX_NUM_OF_TNUMS - p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums - 1); 2057 fman_set_qmi_enq_th(fman_rg.qmi_rg, enqTh); 2058 } 2059 2060 deqTh = fman_get_qmi_deq_th(fman_rg.qmi_rg); 2061 /* if deqTh is too small, we enlarge it to the min value that is still OK. 2062 deqTh may not be larger than 63 (QMI_MAX_NUM_OF_TNUMS-1). */ 2063 if ((deqTh <= p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums) && (deqTh < QMI_MAX_NUM_OF_TNUMS-1)) 2064 { 2065 deqTh = (uint8_t)(p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums + 1); 2066 fman_set_qmi_deq_th(fman_rg.qmi_rg, deqTh); 2067 } 2068 } 2069 2070 #ifdef FM_LOW_END_RESTRICTION 2071 if ((hardwarePortId==0x1) || (hardwarePortId==0x29)) 2072 { 2073 if (p_Fm->p_FmStateStruct->lowEndRestriction) 2074 { 2075 XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags); 2076 RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("OP #0 cannot work with Tx Port #1.")); 2077 } 2078 else 2079 p_Fm->p_FmStateStruct->lowEndRestriction = TRUE; 2080 } 2081 #endif /* FM_LOW_END_RESTRICTION */ 2082 2083 err = FmSetSizeOfFifo(p_Fm, 2084 hardwarePortId, 2085 &p_PortParams->sizeOfFifo, 2086 &p_PortParams->extraSizeOfFifo, 2087 TRUE); 2088 if (err) 2089 { 2090 XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags); 2091 RETURN_ERROR(MAJOR, err, NO_MSG); 2092 } 2093 2094 err = FmSetNumOfOpenDmas(p_Fm, 2095 hardwarePortId, 2096 &p_PortParams->numOfOpenDmas, 2097 &p_PortParams->numOfExtraOpenDmas, 2098 TRUE); 2099 if (err) 2100 { 2101 XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags); 2102 RETURN_ERROR(MAJOR, err, NO_MSG); 2103 } 2104 2105 fman_set_liodn_per_port(&fman_rg, 2106 hardwarePortId, 2107 p_PortParams->liodnBase, 2108 p_PortParams->liodnOffset); 2109 2110 if (p_Fm->p_FmStateStruct->revInfo.majorRev < 6) 2111 fman_set_order_restoration_per_port(fman_rg.fpm_rg, 2112 hardwarePortId, 2113 p_PortParams->independentMode, 2114 !!((p_PortParams->portType==e_FM_PORT_TYPE_RX) || (p_PortParams->portType==e_FM_PORT_TYPE_RX_10G))); 2115 2116 HW_PORT_ID_TO_SW_PORT_ID(macId, hardwarePortId); 2117 2118 #if defined(FM_MAX_NUM_OF_10G_MACS) && (FM_MAX_NUM_OF_10G_MACS) 2119 if ((p_PortParams->portType == e_FM_PORT_TYPE_TX_10G) || 2120 (p_PortParams->portType == e_FM_PORT_TYPE_RX_10G)) 2121 { 2122 ASSERT_COND(macId < FM_MAX_NUM_OF_10G_MACS); 2123 if (p_PortParams->maxFrameLength >= p_Fm->p_FmStateStruct->macMaxFrameLengths10G[macId]) 2124 p_Fm->p_FmStateStruct->portMaxFrameLengths10G[macId] = p_PortParams->maxFrameLength; 2125 else 2126 RETURN_ERROR(MINOR, E_INVALID_VALUE, ("Port maxFrameLength is smaller than MAC current MTU")); 2127 } 2128 else 2129 #endif /* defined(FM_MAX_NUM_OF_10G_MACS) && ... */ 2130 if ((p_PortParams->portType == e_FM_PORT_TYPE_TX) || 2131 (p_PortParams->portType == e_FM_PORT_TYPE_RX)) 2132 { 2133 ASSERT_COND(macId < FM_MAX_NUM_OF_1G_MACS); 2134 if (p_PortParams->maxFrameLength >= p_Fm->p_FmStateStruct->macMaxFrameLengths1G[macId]) 2135 p_Fm->p_FmStateStruct->portMaxFrameLengths1G[macId] = p_PortParams->maxFrameLength; 2136 else 2137 RETURN_ERROR(MINOR, E_INVALID_VALUE, ("Port maxFrameLength is smaller than MAC current MTU")); 2138 } 2139 2140 FmGetPhysicalMuramBase(p_Fm, &p_PortParams->fmMuramPhysBaseAddr); 2141 XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags); 2142 2143 return E_OK; 2144 } 2145 2146 void FmFreePortParams(t_Handle h_Fm,t_FmInterModulePortFreeParams *p_PortParams) 2147 { 2148 t_Fm *p_Fm = (t_Fm*)h_Fm; 2149 uint32_t intFlags; 2150 uint8_t hardwarePortId = p_PortParams->hardwarePortId; 2151 uint8_t numOfTasks, numOfDmas, macId; 2152 uint16_t sizeOfFifo; 2153 t_Error err; 2154 t_FmIpcPortFreeParams portParams; 2155 t_FmIpcMsg msg; 2156 struct fman_qmi_regs *qmi_rg = p_Fm->p_FmQmiRegs; 2157 struct fman_bmi_regs *bmi_rg = p_Fm->p_FmBmiRegs; 2158 2159 if (p_Fm->guestId != NCSW_MASTER_ID) 2160 { 2161 portParams.hardwarePortId = p_PortParams->hardwarePortId; 2162 portParams.enumPortType = (uint32_t)p_PortParams->portType; 2163 portParams.deqPipelineDepth = p_PortParams->deqPipelineDepth; 2164 memset(&msg, 0, sizeof(msg)); 2165 msg.msgId = FM_FREE_PORT; 2166 memcpy(msg.msgBody, &portParams, sizeof(portParams)); 2167 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 2168 (uint8_t*)&msg, 2169 sizeof(msg.msgId)+sizeof(portParams), 2170 NULL, 2171 NULL, 2172 NULL, 2173 NULL); 2174 if (err != E_OK) 2175 REPORT_ERROR(MINOR, err, NO_MSG); 2176 return; 2177 } 2178 2179 ASSERT_COND(IN_RANGE(1, hardwarePortId, 63)); 2180 2181 intFlags = XX_LockIntrSpinlock(p_Fm->h_Spinlock); 2182 2183 if (p_PortParams->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND) 2184 { 2185 ASSERT_COND(p_Fm->hcPortInitialized); 2186 p_Fm->hcPortInitialized = FALSE; 2187 } 2188 2189 p_Fm->p_FmStateStruct->portsTypes[hardwarePortId] = e_FM_PORT_TYPE_DUMMY; 2190 2191 /* free numOfTasks */ 2192 numOfTasks = fman_get_num_of_tasks(bmi_rg, hardwarePortId); 2193 ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedNumOfTasks >= numOfTasks); 2194 p_Fm->p_FmStateStruct->accumulatedNumOfTasks -= numOfTasks; 2195 2196 /* free numOfOpenDmas */ 2197 numOfDmas = fman_get_num_of_dmas(bmi_rg, hardwarePortId); 2198 ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas >= numOfDmas); 2199 p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas -= numOfDmas; 2200 2201 #ifdef FM_HAS_TOTAL_DMAS 2202 if (p_Fm->p_FmStateStruct->revInfo.majorRev < 6) 2203 { 2204 /* update total num of DMA's with committed number of open DMAS, and max uncommitted pool. */ 2205 fman_set_num_of_open_dmas(bmi_rg, 2206 hardwarePortId, 2207 1, 2208 0, 2209 (uint8_t)(p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas + p_Fm->p_FmStateStruct->extraOpenDmasPoolSize)); 2210 } 2211 #endif /* FM_HAS_TOTAL_DMAS */ 2212 2213 /* free sizeOfFifo */ 2214 sizeOfFifo = fman_get_size_of_fifo(bmi_rg, hardwarePortId); 2215 ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedFifoSize >= (sizeOfFifo * BMI_FIFO_UNITS)); 2216 p_Fm->p_FmStateStruct->accumulatedFifoSize -= (sizeOfFifo * BMI_FIFO_UNITS); 2217 2218 #ifdef FM_QMI_NO_DEQ_OPTIONS_SUPPORT 2219 if (p_Fm->p_FmStateStruct->revInfo.majorRev != 4) 2220 #endif /* FM_QMI_NO_DEQ_OPTIONS_SUPPORT */ 2221 if ((p_PortParams->portType != e_FM_PORT_TYPE_RX) && 2222 (p_PortParams->portType != e_FM_PORT_TYPE_RX_10G)) 2223 /* for transmit & O/H ports */ 2224 { 2225 uint8_t enqTh; 2226 uint8_t deqTh; 2227 2228 /* update qmi ENQ/DEQ threshold */ 2229 p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums -= p_PortParams->deqPipelineDepth; 2230 2231 /* p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums is now smaller, 2232 so we can enlarge enqTh */ 2233 enqTh = (uint8_t)(QMI_MAX_NUM_OF_TNUMS - p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums - 1); 2234 2235 /* p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums is now smaller, 2236 so we can reduce deqTh */ 2237 deqTh = (uint8_t)(p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums + 1); 2238 2239 fman_set_qmi_enq_th(qmi_rg, enqTh); 2240 fman_set_qmi_deq_th(qmi_rg, deqTh); 2241 } 2242 2243 HW_PORT_ID_TO_SW_PORT_ID(macId, hardwarePortId); 2244 2245 #if defined(FM_MAX_NUM_OF_10G_MACS) && (FM_MAX_NUM_OF_10G_MACS) 2246 if ((p_PortParams->portType == e_FM_PORT_TYPE_TX_10G) || 2247 (p_PortParams->portType == e_FM_PORT_TYPE_RX_10G)) 2248 { 2249 ASSERT_COND(macId < FM_MAX_NUM_OF_10G_MACS); 2250 p_Fm->p_FmStateStruct->portMaxFrameLengths10G[macId] = 0; 2251 } 2252 else 2253 #endif /* defined(FM_MAX_NUM_OF_10G_MACS) && ... */ 2254 if ((p_PortParams->portType == e_FM_PORT_TYPE_TX) || 2255 (p_PortParams->portType == e_FM_PORT_TYPE_RX)) 2256 { 2257 ASSERT_COND(macId < FM_MAX_NUM_OF_1G_MACS); 2258 p_Fm->p_FmStateStruct->portMaxFrameLengths1G[macId] = 0; 2259 } 2260 2261 #ifdef FM_LOW_END_RESTRICTION 2262 if ((hardwarePortId==0x1) || (hardwarePortId==0x29)) 2263 p_Fm->p_FmStateStruct->lowEndRestriction = FALSE; 2264 #endif /* FM_LOW_END_RESTRICTION */ 2265 XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags); 2266 } 2267 2268 t_Error FmIsPortStalled(t_Handle h_Fm, uint8_t hardwarePortId, bool *p_IsStalled) 2269 { 2270 t_Fm *p_Fm = (t_Fm*)h_Fm; 2271 t_Error err; 2272 t_FmIpcMsg msg; 2273 t_FmIpcReply reply; 2274 uint32_t replyLength; 2275 struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs; 2276 2277 if ((p_Fm->guestId != NCSW_MASTER_ID) && 2278 !p_Fm->baseAddr && 2279 p_Fm->h_IpcSessions[0]) 2280 { 2281 memset(&msg, 0, sizeof(msg)); 2282 memset(&reply, 0, sizeof(reply)); 2283 msg.msgId = FM_IS_PORT_STALLED; 2284 msg.msgBody[0] = hardwarePortId; 2285 replyLength = sizeof(uint32_t) + sizeof(uint8_t); 2286 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 2287 (uint8_t*)&msg, 2288 sizeof(msg.msgId)+sizeof(hardwarePortId), 2289 (uint8_t*)&reply, 2290 &replyLength, 2291 NULL, 2292 NULL); 2293 if (err != E_OK) 2294 RETURN_ERROR(MINOR, err, NO_MSG); 2295 if (replyLength != (sizeof(uint32_t) + sizeof(uint8_t))) 2296 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 2297 2298 *p_IsStalled = (bool)!!(*(uint8_t*)(reply.replyBody)); 2299 2300 return (t_Error)(reply.error); 2301 } 2302 else if (!p_Fm->baseAddr) 2303 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, 2304 ("Either IPC or 'baseAddress' is required!")); 2305 2306 *p_IsStalled = fman_is_port_stalled(fpm_rg, hardwarePortId); 2307 2308 return E_OK; 2309 } 2310 2311 t_Error FmResumeStalledPort(t_Handle h_Fm, uint8_t hardwarePortId) 2312 { 2313 t_Fm *p_Fm = (t_Fm*)h_Fm; 2314 t_Error err; 2315 bool isStalled; 2316 struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs; 2317 2318 if ((p_Fm->guestId != NCSW_MASTER_ID) && 2319 !p_Fm->baseAddr && 2320 p_Fm->h_IpcSessions[0]) 2321 { 2322 t_FmIpcMsg msg; 2323 t_FmIpcReply reply; 2324 uint32_t replyLength; 2325 2326 memset(&msg, 0, sizeof(msg)); 2327 memset(&reply, 0, sizeof(reply)); 2328 msg.msgId = FM_RESUME_STALLED_PORT; 2329 msg.msgBody[0] = hardwarePortId; 2330 replyLength = sizeof(uint32_t); 2331 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 2332 (uint8_t*)&msg, 2333 sizeof(msg.msgId) + sizeof(hardwarePortId), 2334 (uint8_t*)&reply, 2335 &replyLength, 2336 NULL, 2337 NULL); 2338 if (err != E_OK) 2339 RETURN_ERROR(MINOR, err, NO_MSG); 2340 if (replyLength != sizeof(uint32_t)) 2341 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 2342 return (t_Error)(reply.error); 2343 } 2344 else if (!p_Fm->baseAddr) 2345 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, 2346 ("Either IPC or 'baseAddress' is required!")); 2347 2348 if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6) 2349 RETURN_ERROR(MINOR, E_NOT_AVAILABLE, ("Not available for this FM revision!")); 2350 2351 /* Get port status */ 2352 err = FmIsPortStalled(h_Fm, hardwarePortId, &isStalled); 2353 if (err) 2354 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Can't get port status")); 2355 if (!isStalled) 2356 return E_OK; 2357 2358 fman_resume_stalled_port(fpm_rg, hardwarePortId); 2359 2360 return E_OK; 2361 } 2362 2363 t_Error FmResetMac(t_Handle h_Fm, e_FmMacType type, uint8_t macId) 2364 { 2365 t_Fm *p_Fm = (t_Fm*)h_Fm; 2366 t_Error err; 2367 struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs; 2368 2369 #if (DPAA_VERSION >= 11) 2370 if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6) 2371 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, 2372 ("FMan MAC reset!")); 2373 #endif /*(DPAA_VERSION >= 11)*/ 2374 2375 if ((p_Fm->guestId != NCSW_MASTER_ID) && 2376 !p_Fm->baseAddr && 2377 p_Fm->h_IpcSessions[0]) 2378 { 2379 t_FmIpcMacParams macParams; 2380 t_FmIpcMsg msg; 2381 t_FmIpcReply reply; 2382 uint32_t replyLength; 2383 2384 memset(&msg, 0, sizeof(msg)); 2385 memset(&reply, 0, sizeof(reply)); 2386 macParams.id = macId; 2387 macParams.enumType = (uint32_t)type; 2388 msg.msgId = FM_RESET_MAC; 2389 memcpy(msg.msgBody, &macParams, sizeof(macParams)); 2390 replyLength = sizeof(uint32_t); 2391 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 2392 (uint8_t*)&msg, 2393 sizeof(msg.msgId)+sizeof(macParams), 2394 (uint8_t*)&reply, 2395 &replyLength, 2396 NULL, 2397 NULL); 2398 if (err != E_OK) 2399 RETURN_ERROR(MINOR, err, NO_MSG); 2400 if (replyLength != sizeof(uint32_t)) 2401 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 2402 return (t_Error)(reply.error); 2403 } 2404 else if (!p_Fm->baseAddr) 2405 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, 2406 ("Either IPC or 'baseAddress' is required!")); 2407 2408 err = (t_Error)fman_reset_mac(fpm_rg, macId, !!(type == e_FM_MAC_10G)); 2409 2410 if (err == -EBUSY) 2411 return ERROR_CODE(E_TIMEOUT); 2412 else if (err) 2413 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Illegal MAC ID")); 2414 2415 return E_OK; 2416 } 2417 2418 t_Error FmSetMacMaxFrame(t_Handle h_Fm, e_FmMacType type, uint8_t macId, uint16_t mtu) 2419 { 2420 t_Fm *p_Fm = (t_Fm*)h_Fm; 2421 2422 if ((p_Fm->guestId != NCSW_MASTER_ID) && 2423 p_Fm->h_IpcSessions[0]) 2424 { 2425 t_FmIpcMacMaxFrameParams macMaxFrameLengthParams; 2426 t_Error err; 2427 t_FmIpcMsg msg; 2428 2429 memset(&msg, 0, sizeof(msg)); 2430 macMaxFrameLengthParams.macParams.id = macId; 2431 macMaxFrameLengthParams.macParams.enumType = (uint32_t)type; 2432 macMaxFrameLengthParams.maxFrameLength = (uint16_t)mtu; 2433 msg.msgId = FM_SET_MAC_MAX_FRAME; 2434 memcpy(msg.msgBody, &macMaxFrameLengthParams, sizeof(macMaxFrameLengthParams)); 2435 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 2436 (uint8_t*)&msg, 2437 sizeof(msg.msgId)+sizeof(macMaxFrameLengthParams), 2438 NULL, 2439 NULL, 2440 NULL, 2441 NULL); 2442 if (err != E_OK) 2443 RETURN_ERROR(MINOR, err, NO_MSG); 2444 return E_OK; 2445 } 2446 else if (p_Fm->guestId != NCSW_MASTER_ID) 2447 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, 2448 ("running in guest-mode without IPC!")); 2449 2450 /* if port is already initialized, check that MaxFrameLength is smaller 2451 * or equal to the port's max */ 2452 #if (defined(FM_MAX_NUM_OF_10G_MACS) && (FM_MAX_NUM_OF_10G_MACS)) 2453 if (type == e_FM_MAC_10G) 2454 { 2455 if ((!p_Fm->p_FmStateStruct->portMaxFrameLengths10G[macId]) 2456 || (p_Fm->p_FmStateStruct->portMaxFrameLengths10G[macId] && 2457 (mtu <= p_Fm->p_FmStateStruct->portMaxFrameLengths10G[macId]))) 2458 p_Fm->p_FmStateStruct->macMaxFrameLengths10G[macId] = mtu; 2459 else 2460 RETURN_ERROR(MINOR, E_INVALID_VALUE, ("MAC maxFrameLength is larger than Port maxFrameLength")); 2461 2462 } 2463 else 2464 #else 2465 UNUSED(type); 2466 #endif /* (defined(FM_MAX_NUM_OF_10G_MACS) && ... */ 2467 if ((!p_Fm->p_FmStateStruct->portMaxFrameLengths1G[macId]) 2468 || (p_Fm->p_FmStateStruct->portMaxFrameLengths1G[macId] && 2469 (mtu <= p_Fm->p_FmStateStruct->portMaxFrameLengths1G[macId]))) 2470 p_Fm->p_FmStateStruct->macMaxFrameLengths1G[macId] = mtu; 2471 else 2472 RETURN_ERROR(MINOR, E_INVALID_VALUE, ("MAC maxFrameLength is larger than Port maxFrameLength")); 2473 2474 return E_OK; 2475 } 2476 2477 uint16_t FmGetClockFreq(t_Handle h_Fm) 2478 { 2479 t_Fm *p_Fm = (t_Fm*)h_Fm; 2480 2481 /* for multicore environment: this depends on the 2482 * fact that fmClkFreq was properly initialized at "init". */ 2483 return p_Fm->p_FmStateStruct->fmClkFreq; 2484 } 2485 2486 uint16_t FmGetMacClockFreq(t_Handle h_Fm) 2487 { 2488 t_Fm *p_Fm = (t_Fm*)h_Fm; 2489 2490 return p_Fm->p_FmStateStruct->fmMacClkFreq; 2491 } 2492 2493 uint32_t FmGetTimeStampScale(t_Handle h_Fm) 2494 { 2495 t_Fm *p_Fm = (t_Fm*)h_Fm; 2496 2497 if ((p_Fm->guestId != NCSW_MASTER_ID) && 2498 !p_Fm->baseAddr && 2499 p_Fm->h_IpcSessions[0]) 2500 { 2501 t_Error err; 2502 t_FmIpcMsg msg; 2503 t_FmIpcReply reply; 2504 uint32_t replyLength, timeStamp; 2505 2506 memset(&msg, 0, sizeof(msg)); 2507 memset(&reply, 0, sizeof(reply)); 2508 msg.msgId = FM_GET_TIMESTAMP_SCALE; 2509 replyLength = sizeof(uint32_t) + sizeof(uint32_t); 2510 if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 2511 (uint8_t*)&msg, 2512 sizeof(msg.msgId), 2513 (uint8_t*)&reply, 2514 &replyLength, 2515 NULL, 2516 NULL)) != E_OK) 2517 { 2518 REPORT_ERROR(MAJOR, err, NO_MSG); 2519 return 0; 2520 } 2521 if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t))) 2522 { 2523 REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 2524 return 0; 2525 } 2526 2527 memcpy((uint8_t*)&timeStamp, reply.replyBody, sizeof(uint32_t)); 2528 return timeStamp; 2529 } 2530 else if ((p_Fm->guestId != NCSW_MASTER_ID) && 2531 p_Fm->baseAddr) 2532 { 2533 if (!(GET_UINT32(p_Fm->p_FmFpmRegs->fmfp_tsc1) & FPM_TS_CTL_EN)) 2534 { 2535 REPORT_ERROR(MAJOR, E_INVALID_STATE, ("timestamp is not enabled!")); 2536 return 0; 2537 } 2538 } 2539 else if (p_Fm->guestId != NCSW_MASTER_ID) 2540 DBG(WARNING, ("No IPC - can't validate FM if timestamp enabled.")); 2541 2542 return p_Fm->p_FmStateStruct->count1MicroBit; 2543 } 2544 2545 t_Error FmEnableRamsEcc(t_Handle h_Fm) 2546 { 2547 t_Fm *p_Fm = (t_Fm*)h_Fm; 2548 2549 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 2550 2551 p_Fm->p_FmStateStruct->ramsEccOwners++; 2552 p_Fm->p_FmStateStruct->internalCall = TRUE; 2553 2554 return FM_EnableRamsEcc(p_Fm); 2555 } 2556 2557 t_Error FmDisableRamsEcc(t_Handle h_Fm) 2558 { 2559 t_Fm *p_Fm = (t_Fm*)h_Fm; 2560 2561 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 2562 2563 ASSERT_COND(p_Fm->p_FmStateStruct->ramsEccOwners); 2564 p_Fm->p_FmStateStruct->ramsEccOwners--; 2565 2566 if (p_Fm->p_FmStateStruct->ramsEccOwners==0) 2567 { 2568 p_Fm->p_FmStateStruct->internalCall = TRUE; 2569 return FM_DisableRamsEcc(p_Fm); 2570 } 2571 2572 return E_OK; 2573 } 2574 2575 uint8_t FmGetGuestId(t_Handle h_Fm) 2576 { 2577 t_Fm *p_Fm = (t_Fm*)h_Fm; 2578 2579 return p_Fm->guestId; 2580 } 2581 2582 bool FmIsMaster(t_Handle h_Fm) 2583 { 2584 t_Fm *p_Fm = (t_Fm*)h_Fm; 2585 2586 return (p_Fm->guestId == NCSW_MASTER_ID); 2587 } 2588 2589 t_Error FmSetSizeOfFifo(t_Handle h_Fm, 2590 uint8_t hardwarePortId, 2591 uint32_t *p_SizeOfFifo, 2592 uint32_t *p_ExtraSizeOfFifo, 2593 bool initialConfig) 2594 { 2595 t_Fm *p_Fm = (t_Fm*)h_Fm; 2596 t_FmIpcPortRsrcParams rsrcParams; 2597 t_Error err; 2598 struct fman_bmi_regs *bmi_rg = p_Fm->p_FmBmiRegs; 2599 uint32_t sizeOfFifo = *p_SizeOfFifo, extraSizeOfFifo = *p_ExtraSizeOfFifo; 2600 uint16_t currentVal = 0, currentExtraVal = 0; 2601 2602 if ((p_Fm->guestId != NCSW_MASTER_ID) && 2603 !p_Fm->baseAddr && 2604 p_Fm->h_IpcSessions[0]) 2605 { 2606 t_FmIpcMsg msg; 2607 t_FmIpcReply reply; 2608 uint32_t replyLength; 2609 2610 rsrcParams.hardwarePortId = hardwarePortId; 2611 rsrcParams.val = sizeOfFifo; 2612 rsrcParams.extra = extraSizeOfFifo; 2613 rsrcParams.boolInitialConfig = (uint8_t)initialConfig; 2614 2615 memset(&msg, 0, sizeof(msg)); 2616 memset(&reply, 0, sizeof(reply)); 2617 msg.msgId = FM_SET_SIZE_OF_FIFO; 2618 memcpy(msg.msgBody, &rsrcParams, sizeof(rsrcParams)); 2619 replyLength = sizeof(uint32_t); 2620 if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 2621 (uint8_t*)&msg, 2622 sizeof(msg.msgId) + sizeof(rsrcParams), 2623 (uint8_t*)&reply, 2624 &replyLength, 2625 NULL, 2626 NULL)) != E_OK) 2627 RETURN_ERROR(MINOR, err, NO_MSG); 2628 if (replyLength != sizeof(uint32_t)) 2629 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 2630 return (t_Error)(reply.error); 2631 } 2632 else if ((p_Fm->guestId != NCSW_MASTER_ID) && 2633 p_Fm->baseAddr) 2634 { 2635 DBG(WARNING, ("No IPC - can't validate FM total-fifo size.")); 2636 fman_set_size_of_fifo(bmi_rg, hardwarePortId, sizeOfFifo, extraSizeOfFifo); 2637 } 2638 else if (p_Fm->guestId != NCSW_MASTER_ID) 2639 RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, 2640 ("running in guest-mode without neither IPC nor mapped register!")); 2641 2642 if (!initialConfig) 2643 { 2644 /* !initialConfig - runtime change of existing value. 2645 * - read the current FIFO and extra FIFO size */ 2646 currentExtraVal = fman_get_size_of_extra_fifo(bmi_rg, hardwarePortId); 2647 currentVal = fman_get_size_of_fifo(bmi_rg, hardwarePortId); 2648 } 2649 2650 if (extraSizeOfFifo > currentExtraVal) 2651 { 2652 if (extraSizeOfFifo && !p_Fm->p_FmStateStruct->extraFifoPoolSize) 2653 /* if this is the first time a port requires extraFifoPoolSize, the total extraFifoPoolSize 2654 * must be initialized to 1 buffer per port 2655 */ 2656 p_Fm->p_FmStateStruct->extraFifoPoolSize = FM_MAX_NUM_OF_RX_PORTS*BMI_FIFO_UNITS; 2657 2658 p_Fm->p_FmStateStruct->extraFifoPoolSize = MAX(p_Fm->p_FmStateStruct->extraFifoPoolSize, extraSizeOfFifo); 2659 } 2660 2661 /* check that there are enough uncommitted fifo size */ 2662 if ((p_Fm->p_FmStateStruct->accumulatedFifoSize - currentVal + sizeOfFifo) > 2663 (p_Fm->p_FmStateStruct->totalFifoSize - p_Fm->p_FmStateStruct->extraFifoPoolSize)){ 2664 REPORT_ERROR(MAJOR, E_INVALID_VALUE, 2665 ("Port request fifo size + accumulated size > total FIFO size:")); 2666 RETURN_ERROR(MAJOR, E_INVALID_VALUE, 2667 ("port 0x%x requested %d bytes, extra size = %d, accumulated size = %d total size = %d", 2668 hardwarePortId, sizeOfFifo, p_Fm->p_FmStateStruct->extraFifoPoolSize, 2669 p_Fm->p_FmStateStruct->accumulatedFifoSize, 2670 p_Fm->p_FmStateStruct->totalFifoSize)); 2671 } 2672 else 2673 { 2674 /* update accumulated */ 2675 ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedFifoSize >= currentVal); 2676 p_Fm->p_FmStateStruct->accumulatedFifoSize -= currentVal; 2677 p_Fm->p_FmStateStruct->accumulatedFifoSize += sizeOfFifo; 2678 fman_set_size_of_fifo(bmi_rg, hardwarePortId, sizeOfFifo, extraSizeOfFifo); 2679 } 2680 2681 return E_OK; 2682 } 2683 2684 t_Error FmSetNumOfTasks(t_Handle h_Fm, 2685 uint8_t hardwarePortId, 2686 uint8_t *p_NumOfTasks, 2687 uint8_t *p_NumOfExtraTasks, 2688 bool initialConfig) 2689 { 2690 t_Fm *p_Fm = (t_Fm *)h_Fm; 2691 t_Error err; 2692 struct fman_bmi_regs *bmi_rg = p_Fm->p_FmBmiRegs; 2693 uint8_t currentVal = 0, currentExtraVal = 0, numOfTasks = *p_NumOfTasks, numOfExtraTasks = *p_NumOfExtraTasks; 2694 2695 ASSERT_COND(IN_RANGE(1, hardwarePortId, 63)); 2696 2697 if ((p_Fm->guestId != NCSW_MASTER_ID) && 2698 !p_Fm->baseAddr && 2699 p_Fm->h_IpcSessions[0]) 2700 { 2701 t_FmIpcPortRsrcParams rsrcParams; 2702 t_FmIpcMsg msg; 2703 t_FmIpcReply reply; 2704 uint32_t replyLength; 2705 2706 rsrcParams.hardwarePortId = hardwarePortId; 2707 rsrcParams.val = numOfTasks; 2708 rsrcParams.extra = numOfExtraTasks; 2709 rsrcParams.boolInitialConfig = (uint8_t)initialConfig; 2710 2711 memset(&msg, 0, sizeof(msg)); 2712 memset(&reply, 0, sizeof(reply)); 2713 msg.msgId = FM_SET_NUM_OF_TASKS; 2714 memcpy(msg.msgBody, &rsrcParams, sizeof(rsrcParams)); 2715 replyLength = sizeof(uint32_t); 2716 if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 2717 (uint8_t*)&msg, 2718 sizeof(msg.msgId) + sizeof(rsrcParams), 2719 (uint8_t*)&reply, 2720 &replyLength, 2721 NULL, 2722 NULL)) != E_OK) 2723 RETURN_ERROR(MINOR, err, NO_MSG); 2724 if (replyLength != sizeof(uint32_t)) 2725 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 2726 return (t_Error)(reply.error); 2727 } 2728 else if ((p_Fm->guestId != NCSW_MASTER_ID) && 2729 p_Fm->baseAddr) 2730 { 2731 DBG(WARNING, ("No IPC - can't validate FM total-num-of-tasks.")); 2732 fman_set_num_of_tasks(bmi_rg, hardwarePortId, numOfTasks, numOfExtraTasks); 2733 } 2734 else if (p_Fm->guestId != NCSW_MASTER_ID) 2735 RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, 2736 ("running in guest-mode without neither IPC nor mapped register!")); 2737 2738 if (!initialConfig) 2739 { 2740 /* !initialConfig - runtime change of existing value. 2741 * - read the current number of tasks */ 2742 currentVal = fman_get_num_of_tasks(bmi_rg, hardwarePortId); 2743 currentExtraVal = fman_get_num_extra_tasks(bmi_rg, hardwarePortId); 2744 } 2745 2746 if (numOfExtraTasks > currentExtraVal) 2747 p_Fm->p_FmStateStruct->extraTasksPoolSize = 2748 (uint8_t)MAX(p_Fm->p_FmStateStruct->extraTasksPoolSize, numOfExtraTasks); 2749 2750 /* check that there are enough uncommitted tasks */ 2751 if ((p_Fm->p_FmStateStruct->accumulatedNumOfTasks - currentVal + numOfTasks) > 2752 (p_Fm->p_FmStateStruct->totalNumOfTasks - p_Fm->p_FmStateStruct->extraTasksPoolSize)) 2753 RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, 2754 ("Requested numOfTasks and extra tasks pool for fm%d exceed total numOfTasks.", 2755 p_Fm->p_FmStateStruct->fmId)); 2756 else 2757 { 2758 ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedNumOfTasks >= currentVal); 2759 /* update accumulated */ 2760 p_Fm->p_FmStateStruct->accumulatedNumOfTasks -= currentVal; 2761 p_Fm->p_FmStateStruct->accumulatedNumOfTasks += numOfTasks; 2762 fman_set_num_of_tasks(bmi_rg, hardwarePortId, numOfTasks, numOfExtraTasks); 2763 } 2764 2765 return E_OK; 2766 } 2767 2768 t_Error FmSetNumOfOpenDmas(t_Handle h_Fm, 2769 uint8_t hardwarePortId, 2770 uint8_t *p_NumOfOpenDmas, 2771 uint8_t *p_NumOfExtraOpenDmas, 2772 bool initialConfig) 2773 2774 { 2775 t_Fm *p_Fm = (t_Fm *)h_Fm; 2776 t_Error err; 2777 struct fman_bmi_regs *bmi_rg = p_Fm->p_FmBmiRegs; 2778 uint8_t numOfOpenDmas = *p_NumOfOpenDmas, numOfExtraOpenDmas = *p_NumOfExtraOpenDmas; 2779 uint8_t totalNumDmas = 0, currentVal = 0, currentExtraVal = 0; 2780 2781 ASSERT_COND(IN_RANGE(1, hardwarePortId, 63)); 2782 2783 if ((p_Fm->guestId != NCSW_MASTER_ID) && 2784 !p_Fm->baseAddr && 2785 p_Fm->h_IpcSessions[0]) 2786 { 2787 t_FmIpcPortRsrcParams rsrcParams; 2788 t_FmIpcMsg msg; 2789 t_FmIpcReply reply; 2790 uint32_t replyLength; 2791 2792 rsrcParams.hardwarePortId = hardwarePortId; 2793 rsrcParams.val = numOfOpenDmas; 2794 rsrcParams.extra = numOfExtraOpenDmas; 2795 rsrcParams.boolInitialConfig = (uint8_t)initialConfig; 2796 2797 memset(&msg, 0, sizeof(msg)); 2798 memset(&reply, 0, sizeof(reply)); 2799 msg.msgId = FM_SET_NUM_OF_OPEN_DMAS; 2800 memcpy(msg.msgBody, &rsrcParams, sizeof(rsrcParams)); 2801 replyLength = sizeof(uint32_t); 2802 if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 2803 (uint8_t*)&msg, 2804 sizeof(msg.msgId) + sizeof(rsrcParams), 2805 (uint8_t*)&reply, 2806 &replyLength, 2807 NULL, 2808 NULL)) != E_OK) 2809 RETURN_ERROR(MINOR, err, NO_MSG); 2810 if (replyLength != sizeof(uint32_t)) 2811 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 2812 return (t_Error)(reply.error); 2813 } 2814 #ifdef FM_HAS_TOTAL_DMAS 2815 else if (p_Fm->guestId != NCSW_MASTER_ID) 2816 RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("running in guest-mode without IPC!")); 2817 #else 2818 else if ((p_Fm->guestId != NCSW_MASTER_ID) && 2819 p_Fm->baseAddr && 2820 (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)) 2821 { 2822 /*DBG(WARNING, ("No IPC - can't validate FM total-num-of-dmas."));*/ 2823 2824 if (!numOfOpenDmas) 2825 { 2826 /* first config without explic it value: Do Nothing - reset value shouldn't be 2827 changed, read register for port save */ 2828 *p_NumOfOpenDmas = fman_get_num_of_dmas(bmi_rg, hardwarePortId); 2829 *p_NumOfExtraOpenDmas = fman_get_num_extra_dmas(bmi_rg, hardwarePortId); 2830 } 2831 else 2832 /* whether it is the first time with explicit value, or runtime "set" - write register */ 2833 fman_set_num_of_open_dmas(bmi_rg, 2834 hardwarePortId, 2835 numOfOpenDmas, 2836 numOfExtraOpenDmas, 2837 p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas + p_Fm->p_FmStateStruct->extraOpenDmasPoolSize); 2838 } 2839 else if (p_Fm->guestId != NCSW_MASTER_ID) 2840 RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, 2841 ("running in guest-mode without neither IPC nor mapped register!")); 2842 #endif /* FM_HAS_TOTAL_DMAS */ 2843 2844 if (!initialConfig) 2845 { 2846 /* !initialConfig - runtime change of existing value. 2847 * - read the current number of open Dma's */ 2848 currentExtraVal = fman_get_num_extra_dmas(bmi_rg, hardwarePortId); 2849 currentVal = fman_get_num_of_dmas(bmi_rg, hardwarePortId); 2850 } 2851 2852 #ifdef FM_NO_GUARANTEED_RESET_VALUES 2853 /* it's illegal to be in a state where this is not the first set and no value is specified */ 2854 ASSERT_COND(initialConfig || numOfOpenDmas); 2855 if (!numOfOpenDmas) 2856 { 2857 /* !numOfOpenDmas - first configuration according to values in regs. 2858 * - read the current number of open Dma's */ 2859 currentExtraVal = fman_get_num_extra_dmas(bmi_rg, hardwarePortId); 2860 currentVal = fman_get_num_of_dmas(bmi_rg, hardwarePortId); 2861 /* This is the first configuration and user did not specify value (!numOfOpenDmas), 2862 * reset values will be used and we just save these values for resource management */ 2863 p_Fm->p_FmStateStruct->extraOpenDmasPoolSize = 2864 (uint8_t)MAX(p_Fm->p_FmStateStruct->extraOpenDmasPoolSize, currentExtraVal); 2865 p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas += currentVal; 2866 *p_NumOfOpenDmas = currentVal; 2867 *p_NumOfExtraOpenDmas = currentExtraVal; 2868 return E_OK; 2869 } 2870 #endif /* FM_NO_GUARANTEED_RESET_VALUES */ 2871 2872 if (numOfExtraOpenDmas > currentExtraVal) 2873 p_Fm->p_FmStateStruct->extraOpenDmasPoolSize = 2874 (uint8_t)MAX(p_Fm->p_FmStateStruct->extraOpenDmasPoolSize, numOfExtraOpenDmas); 2875 2876 #ifdef FM_HAS_TOTAL_DMAS 2877 if ((p_Fm->p_FmStateStruct->revInfo.majorRev < 6) && 2878 (p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas - currentVal + numOfOpenDmas > 2879 p_Fm->p_FmStateStruct->maxNumOfOpenDmas)) 2880 RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, 2881 ("Requested numOfOpenDmas for fm%d exceeds total numOfOpenDmas.", 2882 p_Fm->p_FmStateStruct->fmId)); 2883 #else 2884 if ((p_Fm->p_FmStateStruct->revInfo.majorRev >= 6) && 2885 #ifdef FM_HEAVY_TRAFFIC_SEQUENCER_HANG_ERRATA_FMAN_A006981 2886 !((p_Fm->p_FmStateStruct->revInfo.majorRev == 6) && 2887 (p_Fm->p_FmStateStruct->revInfo.minorRev == 0)) && 2888 #endif /* FM_HEAVY_TRAFFIC_SEQUENCER_HANG_ERRATA_FMAN_A006981 */ 2889 (p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas - currentVal + numOfOpenDmas > DMA_THRESH_MAX_COMMQ + 1)) 2890 RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, 2891 ("Requested numOfOpenDmas for fm%d exceeds DMA Command queue (%d)", 2892 p_Fm->p_FmStateStruct->fmId, DMA_THRESH_MAX_COMMQ+1)); 2893 #endif /* FM_HAS_TOTAL_DMAS */ 2894 else 2895 { 2896 ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas >= currentVal); 2897 /* update acummulated */ 2898 p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas -= currentVal; 2899 p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas += numOfOpenDmas; 2900 2901 #ifdef FM_HAS_TOTAL_DMAS 2902 if (p_Fm->p_FmStateStruct->revInfo.majorRev < 6) 2903 totalNumDmas = (uint8_t)(p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas + p_Fm->p_FmStateStruct->extraOpenDmasPoolSize); 2904 #endif /* FM_HAS_TOTAL_DMAS */ 2905 fman_set_num_of_open_dmas(bmi_rg, 2906 hardwarePortId, 2907 numOfOpenDmas, 2908 numOfExtraOpenDmas, 2909 totalNumDmas); 2910 } 2911 2912 return E_OK; 2913 } 2914 2915 #if (DPAA_VERSION >= 11) 2916 t_Error FmVSPCheckRelativeProfile(t_Handle h_Fm, 2917 e_FmPortType portType, 2918 uint8_t portId, 2919 uint16_t relativeProfile) 2920 { 2921 t_Fm *p_Fm; 2922 t_FmSp *p_FmPcdSp; 2923 uint8_t swPortIndex=0, hardwarePortId; 2924 2925 ASSERT_COND(h_Fm); 2926 p_Fm = (t_Fm*)h_Fm; 2927 2928 hardwarePortId = SwPortIdToHwPortId(portType, 2929 portId, 2930 p_Fm->p_FmStateStruct->revInfo.majorRev, 2931 p_Fm->p_FmStateStruct->revInfo.minorRev); 2932 ASSERT_COND(hardwarePortId); 2933 HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId); 2934 2935 p_FmPcdSp = p_Fm->p_FmSp; 2936 ASSERT_COND(p_FmPcdSp); 2937 2938 if (!p_FmPcdSp->portsMapping[swPortIndex].numOfProfiles) 2939 RETURN_ERROR(MAJOR, E_INVALID_STATE , ("Port has no allocated profiles")); 2940 if (relativeProfile >= p_FmPcdSp->portsMapping[swPortIndex].numOfProfiles) 2941 RETURN_ERROR(MAJOR, E_NOT_IN_RANGE , ("Profile id is out of range")); 2942 2943 return E_OK; 2944 } 2945 2946 t_Error FmVSPGetAbsoluteProfileId(t_Handle h_Fm, 2947 e_FmPortType portType, 2948 uint8_t portId, 2949 uint16_t relativeProfile, 2950 uint16_t *p_AbsoluteId) 2951 { 2952 t_Fm *p_Fm; 2953 t_FmSp *p_FmPcdSp; 2954 uint8_t swPortIndex=0, hardwarePortId; 2955 t_Error err; 2956 2957 ASSERT_COND(h_Fm); 2958 p_Fm = (t_Fm*)h_Fm; 2959 2960 err = FmVSPCheckRelativeProfile(h_Fm, portType, portId, relativeProfile); 2961 if (err != E_OK) 2962 return err; 2963 2964 hardwarePortId = SwPortIdToHwPortId(portType, 2965 portId, 2966 p_Fm->p_FmStateStruct->revInfo.majorRev, 2967 p_Fm->p_FmStateStruct->revInfo.minorRev); 2968 ASSERT_COND(hardwarePortId); 2969 HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId); 2970 2971 p_FmPcdSp = p_Fm->p_FmSp; 2972 ASSERT_COND(p_FmPcdSp); 2973 2974 *p_AbsoluteId = (uint16_t)(p_FmPcdSp->portsMapping[swPortIndex].profilesBase + relativeProfile); 2975 2976 return E_OK; 2977 } 2978 #endif /* (DPAA_VERSION >= 11) */ 2979 2980 static t_Error InitFmDma(t_Fm *p_Fm) 2981 { 2982 t_Error err; 2983 2984 err = (t_Error)fman_dma_init(p_Fm->p_FmDmaRegs, p_Fm->p_FmDriverParam); 2985 if (err != E_OK) 2986 return err; 2987 2988 /* Allocate MURAM for CAM */ 2989 p_Fm->camBaseAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_Fm->h_FmMuram, 2990 (uint32_t)(p_Fm->p_FmDriverParam->dma_cam_num_of_entries*DMA_CAM_SIZEOF_ENTRY), 2991 DMA_CAM_ALIGN)); 2992 if (!p_Fm->camBaseAddr) 2993 RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for DMA CAM failed")); 2994 2995 WRITE_BLOCK(UINT_TO_PTR(p_Fm->camBaseAddr), 2996 0, 2997 (uint32_t)(p_Fm->p_FmDriverParam->dma_cam_num_of_entries*DMA_CAM_SIZEOF_ENTRY)); 2998 2999 if (p_Fm->p_FmStateStruct->revInfo.majorRev == 2) 3000 { 3001 FM_MURAM_FreeMem(p_Fm->h_FmMuram, UINT_TO_PTR(p_Fm->camBaseAddr)); 3002 3003 p_Fm->camBaseAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_Fm->h_FmMuram, 3004 (uint32_t)(p_Fm->p_FmDriverParam->dma_cam_num_of_entries*72 + 128), 3005 64)); 3006 if (!p_Fm->camBaseAddr) 3007 RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for DMA CAM failed")); 3008 3009 WRITE_BLOCK(UINT_TO_PTR(p_Fm->camBaseAddr), 3010 0, 3011 (uint32_t)(p_Fm->p_FmDriverParam->dma_cam_num_of_entries*72 + 128)); 3012 3013 switch(p_Fm->p_FmDriverParam->dma_cam_num_of_entries) 3014 { 3015 case (8): 3016 WRITE_UINT32(*(uint32_t*)p_Fm->camBaseAddr, 0xff000000); 3017 break; 3018 case (16): 3019 WRITE_UINT32(*(uint32_t*)p_Fm->camBaseAddr, 0xffff0000); 3020 break; 3021 case (24): 3022 WRITE_UINT32(*(uint32_t*)p_Fm->camBaseAddr, 0xffffff00); 3023 break; 3024 case (32): 3025 WRITE_UINT32(*(uint32_t*)p_Fm->camBaseAddr, 0xffffffff); 3026 break; 3027 default: 3028 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("wrong dma_cam_num_of_entries")); 3029 } 3030 } 3031 3032 p_Fm->p_FmDriverParam->cam_base_addr = 3033 (uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_Fm->camBaseAddr)) - p_Fm->fmMuramPhysBaseAddr); 3034 3035 return E_OK; 3036 } 3037 3038 static t_Error InitFmFpm(t_Fm *p_Fm) 3039 { 3040 return (t_Error)fman_fpm_init(p_Fm->p_FmFpmRegs, p_Fm->p_FmDriverParam); 3041 } 3042 3043 static t_Error InitFmBmi(t_Fm *p_Fm) 3044 { 3045 return (t_Error)fman_bmi_init(p_Fm->p_FmBmiRegs, p_Fm->p_FmDriverParam); 3046 } 3047 3048 static t_Error InitFmQmi(t_Fm *p_Fm) 3049 { 3050 return (t_Error)fman_qmi_init(p_Fm->p_FmQmiRegs, p_Fm->p_FmDriverParam); 3051 } 3052 3053 static t_Error InitGuestMode(t_Fm *p_Fm) 3054 { 3055 t_Error err = E_OK; 3056 int i; 3057 t_FmIpcMsg msg; 3058 t_FmIpcReply reply; 3059 uint32_t replyLength; 3060 3061 ASSERT_COND(p_Fm); 3062 ASSERT_COND(p_Fm->guestId != NCSW_MASTER_ID); 3063 3064 /* build the FM guest partition IPC address */ 3065 if (Sprint (p_Fm->fmModuleName, "FM_%d_%d",p_Fm->p_FmStateStruct->fmId, p_Fm->guestId) != (p_Fm->guestId<10 ? 6:7)) 3066 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed")); 3067 3068 /* build the FM master partition IPC address */ 3069 memset(p_Fm->fmIpcHandlerModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE); 3070 if (Sprint (p_Fm->fmIpcHandlerModuleName[0], "FM_%d_%d",p_Fm->p_FmStateStruct->fmId, NCSW_MASTER_ID) != 6) 3071 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed")); 3072 3073 for (i=0;i<e_FM_EV_DUMMY_LAST;i++) 3074 p_Fm->intrMng[i].f_Isr = UnimplementedIsr; 3075 3076 p_Fm->h_IpcSessions[0] = XX_IpcInitSession(p_Fm->fmIpcHandlerModuleName[0], p_Fm->fmModuleName); 3077 if (p_Fm->h_IpcSessions[0]) 3078 { 3079 uint8_t isMasterAlive; 3080 t_FmIpcParams ipcParams; 3081 3082 err = XX_IpcRegisterMsgHandler(p_Fm->fmModuleName, FmGuestHandleIpcMsgCB, p_Fm, FM_IPC_MAX_REPLY_SIZE); 3083 if (err) 3084 RETURN_ERROR(MAJOR, err, NO_MSG); 3085 3086 memset(&msg, 0, sizeof(msg)); 3087 memset(&reply, 0, sizeof(reply)); 3088 msg.msgId = FM_MASTER_IS_ALIVE; 3089 msg.msgBody[0] = p_Fm->guestId; 3090 replyLength = sizeof(uint32_t) + sizeof(uint8_t); 3091 do 3092 { 3093 blockingFlag = TRUE; 3094 if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 3095 (uint8_t*)&msg, 3096 sizeof(msg.msgId)+sizeof(p_Fm->guestId), 3097 (uint8_t*)&reply, 3098 &replyLength, 3099 IpcMsgCompletionCB, 3100 p_Fm)) != E_OK) 3101 REPORT_ERROR(MINOR, err, NO_MSG); 3102 while (blockingFlag) ; 3103 if (replyLength != (sizeof(uint32_t) + sizeof(uint8_t))) 3104 REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 3105 isMasterAlive = *(uint8_t*)(reply.replyBody); 3106 } while (!isMasterAlive); 3107 3108 /* read FM parameters and save */ 3109 memset(&msg, 0, sizeof(msg)); 3110 memset(&reply, 0, sizeof(reply)); 3111 msg.msgId = FM_GET_PARAMS; 3112 replyLength = sizeof(uint32_t) + sizeof(t_FmIpcParams); 3113 if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 3114 (uint8_t*)&msg, 3115 sizeof(msg.msgId), 3116 (uint8_t*)&reply, 3117 &replyLength, 3118 NULL, 3119 NULL)) != E_OK) 3120 RETURN_ERROR(MAJOR, err, NO_MSG); 3121 if (replyLength != (sizeof(uint32_t) + sizeof(t_FmIpcParams))) 3122 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 3123 memcpy((uint8_t*)&ipcParams, reply.replyBody, sizeof(t_FmIpcParams)); 3124 3125 p_Fm->p_FmStateStruct->fmClkFreq = ipcParams.fmClkFreq; 3126 p_Fm->p_FmStateStruct->fmMacClkFreq = ipcParams.fmMacClkFreq; 3127 p_Fm->p_FmStateStruct->revInfo.majorRev = ipcParams.majorRev; 3128 p_Fm->p_FmStateStruct->revInfo.minorRev = ipcParams.minorRev; 3129 } 3130 else 3131 { 3132 DBG(WARNING, ("FM Guest mode - without IPC")); 3133 if (!p_Fm->p_FmStateStruct->fmClkFreq) 3134 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("No fmClkFreq configured for guest without IPC")); 3135 if (p_Fm->baseAddr) 3136 { 3137 fman_get_revision(p_Fm->p_FmFpmRegs, 3138 &p_Fm->p_FmStateStruct->revInfo.majorRev, 3139 &p_Fm->p_FmStateStruct->revInfo.minorRev); 3140 3141 } 3142 } 3143 3144 #if (DPAA_VERSION >= 11) 3145 p_Fm->partVSPBase = AllocVSPsForPartition(p_Fm, p_Fm->partVSPBase, p_Fm->partNumOfVSPs, p_Fm->guestId); 3146 if (p_Fm->partVSPBase == (uint8_t)(ILLEGAL_BASE)) 3147 DBG(WARNING, ("partition VSPs allocation is FAILED")); 3148 #endif /* (DPAA_VERSION >= 11) */ 3149 3150 /* General FM driver initialization */ 3151 if (p_Fm->baseAddr) 3152 p_Fm->fmMuramPhysBaseAddr = 3153 (uint64_t)(XX_VirtToPhys(UINT_TO_PTR(p_Fm->baseAddr + FM_MM_MURAM))); 3154 3155 XX_Free(p_Fm->p_FmDriverParam); 3156 p_Fm->p_FmDriverParam = NULL; 3157 3158 if ((p_Fm->guestId == NCSW_MASTER_ID) || 3159 (p_Fm->h_IpcSessions[0])) 3160 { 3161 FM_DisableRamsEcc(p_Fm); 3162 FmMuramClear(p_Fm->h_FmMuram); 3163 FM_EnableRamsEcc(p_Fm); 3164 } 3165 3166 return E_OK; 3167 } 3168 3169 static __inline__ enum fman_exceptions FmanExceptionTrans(e_FmExceptions exception) 3170 { 3171 switch (exception) { 3172 case e_FM_EX_DMA_BUS_ERROR: 3173 return E_FMAN_EX_DMA_BUS_ERROR; 3174 case e_FM_EX_DMA_READ_ECC: 3175 return E_FMAN_EX_DMA_READ_ECC; 3176 case e_FM_EX_DMA_SYSTEM_WRITE_ECC: 3177 return E_FMAN_EX_DMA_SYSTEM_WRITE_ECC; 3178 case e_FM_EX_DMA_FM_WRITE_ECC: 3179 return E_FMAN_EX_DMA_FM_WRITE_ECC; 3180 case e_FM_EX_FPM_STALL_ON_TASKS: 3181 return E_FMAN_EX_FPM_STALL_ON_TASKS; 3182 case e_FM_EX_FPM_SINGLE_ECC: 3183 return E_FMAN_EX_FPM_SINGLE_ECC; 3184 case e_FM_EX_FPM_DOUBLE_ECC: 3185 return E_FMAN_EX_FPM_DOUBLE_ECC; 3186 case e_FM_EX_QMI_SINGLE_ECC: 3187 return E_FMAN_EX_QMI_SINGLE_ECC; 3188 case e_FM_EX_QMI_DOUBLE_ECC: 3189 return E_FMAN_EX_QMI_DOUBLE_ECC; 3190 case e_FM_EX_QMI_DEQ_FROM_UNKNOWN_PORTID: 3191 return E_FMAN_EX_QMI_DEQ_FROM_UNKNOWN_PORTID; 3192 case e_FM_EX_BMI_LIST_RAM_ECC: 3193 return E_FMAN_EX_BMI_LIST_RAM_ECC; 3194 case e_FM_EX_BMI_STORAGE_PROFILE_ECC: 3195 return E_FMAN_EX_BMI_STORAGE_PROFILE_ECC; 3196 case e_FM_EX_BMI_STATISTICS_RAM_ECC: 3197 return E_FMAN_EX_BMI_STATISTICS_RAM_ECC; 3198 case e_FM_EX_BMI_DISPATCH_RAM_ECC: 3199 return E_FMAN_EX_BMI_DISPATCH_RAM_ECC; 3200 case e_FM_EX_IRAM_ECC: 3201 return E_FMAN_EX_IRAM_ECC; 3202 case e_FM_EX_MURAM_ECC: 3203 return E_FMAN_EX_MURAM_ECC; 3204 default: 3205 return E_FMAN_EX_DMA_BUS_ERROR; 3206 } 3207 } 3208 3209 uint8_t SwPortIdToHwPortId(e_FmPortType type, uint8_t relativePortId, uint8_t majorRev, uint8_t minorRev) 3210 { 3211 switch (type) 3212 { 3213 case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING): 3214 case (e_FM_PORT_TYPE_OH_HOST_COMMAND): 3215 CHECK_PORT_ID_OH_PORTS(relativePortId); 3216 return (uint8_t)(BASE_OH_PORTID + (relativePortId)); 3217 case (e_FM_PORT_TYPE_RX): 3218 CHECK_PORT_ID_1G_RX_PORTS(relativePortId); 3219 return (uint8_t)(BASE_1G_RX_PORTID + (relativePortId)); 3220 case (e_FM_PORT_TYPE_RX_10G): 3221 /* The 10G port in T1024 (FMan Version 6.4) is the first port. 3222 * This is the reason why the 1G port offset is used. 3223 */ 3224 if (majorRev == 6 && minorRev == 4) 3225 { 3226 CHECK_PORT_ID_1G_RX_PORTS(relativePortId); 3227 return (uint8_t)(BASE_1G_RX_PORTID + (relativePortId)); 3228 } 3229 else 3230 { 3231 CHECK_PORT_ID_10G_RX_PORTS(relativePortId); 3232 return (uint8_t)(BASE_10G_RX_PORTID + (relativePortId)); 3233 } 3234 case (e_FM_PORT_TYPE_TX): 3235 CHECK_PORT_ID_1G_TX_PORTS(relativePortId); 3236 return (uint8_t)(BASE_1G_TX_PORTID + (relativePortId)); 3237 case (e_FM_PORT_TYPE_TX_10G): 3238 /* The 10G port in T1024 (FMan Version 6.4) is the first port. 3239 * This is the reason why the 1G port offset is used. 3240 */ 3241 if (majorRev == 6 && minorRev == 4) 3242 { 3243 CHECK_PORT_ID_1G_TX_PORTS(relativePortId); 3244 return (uint8_t)(BASE_1G_TX_PORTID + (relativePortId)); 3245 } 3246 else 3247 { 3248 CHECK_PORT_ID_10G_TX_PORTS(relativePortId); 3249 return (uint8_t)(BASE_10G_TX_PORTID + (relativePortId)); 3250 } 3251 default: 3252 REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("Illegal port type")); 3253 return 0; 3254 } 3255 } 3256 3257 #if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0)) 3258 t_Error FmDumpPortRegs (t_Handle h_Fm, uint8_t hardwarePortId) 3259 { 3260 t_Fm *p_Fm = (t_Fm *)h_Fm; 3261 3262 DECLARE_DUMP; 3263 3264 ASSERT_COND(IN_RANGE(1, hardwarePortId, 63)); 3265 3266 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 3267 SANITY_CHECK_RETURN_ERROR(((p_Fm->guestId == NCSW_MASTER_ID) || 3268 p_Fm->baseAddr), E_INVALID_OPERATION); 3269 3270 DUMP_TITLE(&p_Fm->p_FmBmiRegs->fmbm_pp[hardwarePortId-1], ("fmbm_pp for port %u", (hardwarePortId))); 3271 DUMP_MEMORY(&p_Fm->p_FmBmiRegs->fmbm_pp[hardwarePortId-1], sizeof(uint32_t)); 3272 3273 DUMP_TITLE(&p_Fm->p_FmBmiRegs->fmbm_pfs[hardwarePortId-1], ("fmbm_pfs for port %u", (hardwarePortId ))); 3274 DUMP_MEMORY(&p_Fm->p_FmBmiRegs->fmbm_pfs[hardwarePortId-1], sizeof(uint32_t)); 3275 3276 DUMP_TITLE(&p_Fm->p_FmBmiRegs->fmbm_spliodn[hardwarePortId-1], ("fmbm_spliodn for port %u", (hardwarePortId))); 3277 DUMP_MEMORY(&p_Fm->p_FmBmiRegs->fmbm_spliodn[hardwarePortId-1], sizeof(uint32_t)); 3278 3279 DUMP_TITLE(&p_Fm->p_FmFpmRegs->fmfp_ps[hardwarePortId], ("fmfp_ps for port %u", (hardwarePortId))); 3280 DUMP_MEMORY(&p_Fm->p_FmFpmRegs->fmfp_ps[hardwarePortId], sizeof(uint32_t)); 3281 3282 DUMP_TITLE(&p_Fm->p_FmDmaRegs->fmdmplr[hardwarePortId/2], ("fmdmplr for port %u", (hardwarePortId))); 3283 DUMP_MEMORY(&p_Fm->p_FmDmaRegs->fmdmplr[hardwarePortId/2], sizeof(uint32_t)); 3284 3285 return E_OK; 3286 } 3287 #endif /* (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0)) */ 3288 3289 3290 /*****************************************************************************/ 3291 /* API Init unit functions */ 3292 /*****************************************************************************/ 3293 t_Handle FM_Config(t_FmParams *p_FmParam) 3294 { 3295 t_Fm *p_Fm; 3296 uint8_t i; 3297 uintptr_t baseAddr; 3298 3299 SANITY_CHECK_RETURN_VALUE(p_FmParam, E_NULL_POINTER, NULL); 3300 SANITY_CHECK_RETURN_VALUE(((p_FmParam->firmware.p_Code && p_FmParam->firmware.size) || 3301 (!p_FmParam->firmware.p_Code && !p_FmParam->firmware.size)), 3302 E_INVALID_VALUE, NULL); 3303 3304 baseAddr = p_FmParam->baseAddr; 3305 3306 /* Allocate FM structure */ 3307 p_Fm = (t_Fm *) XX_Malloc(sizeof(t_Fm)); 3308 if (!p_Fm) 3309 { 3310 REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM driver structure")); 3311 return NULL; 3312 } 3313 memset(p_Fm, 0, sizeof(t_Fm)); 3314 3315 p_Fm->p_FmStateStruct = (t_FmStateStruct *) XX_Malloc(sizeof(t_FmStateStruct)); 3316 if (!p_Fm->p_FmStateStruct) 3317 { 3318 XX_Free(p_Fm); 3319 REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Status structure")); 3320 return NULL; 3321 } 3322 memset(p_Fm->p_FmStateStruct, 0, sizeof(t_FmStateStruct)); 3323 3324 /* Initialize FM parameters which will be kept by the driver */ 3325 p_Fm->p_FmStateStruct->fmId = p_FmParam->fmId; 3326 p_Fm->guestId = p_FmParam->guestId; 3327 3328 for (i=0; i<FM_MAX_NUM_OF_HW_PORT_IDS; i++) 3329 p_Fm->p_FmStateStruct->portsTypes[i] = e_FM_PORT_TYPE_DUMMY; 3330 3331 /* Allocate the FM driver's parameters structure */ 3332 p_Fm->p_FmDriverParam = (struct fman_cfg *)XX_Malloc(sizeof(struct fman_cfg)); 3333 if (!p_Fm->p_FmDriverParam) 3334 { 3335 XX_Free(p_Fm->p_FmStateStruct); 3336 XX_Free(p_Fm); 3337 REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM driver parameters")); 3338 return NULL; 3339 } 3340 memset(p_Fm->p_FmDriverParam, 0, sizeof(struct fman_cfg)); 3341 3342 #if (DPAA_VERSION >= 11) 3343 p_Fm->p_FmSp = (t_FmSp *)XX_Malloc(sizeof(t_FmSp)); 3344 if (!p_Fm->p_FmSp) 3345 { 3346 XX_Free(p_Fm->p_FmDriverParam); 3347 XX_Free(p_Fm->p_FmStateStruct); 3348 XX_Free(p_Fm); 3349 REPORT_ERROR(MAJOR, E_NO_MEMORY, ("allocation for internal data structure failed")); 3350 return NULL; 3351 } 3352 memset(p_Fm->p_FmSp, 0, sizeof(t_FmSp)); 3353 3354 for (i=0; i<FM_VSP_MAX_NUM_OF_ENTRIES; i++) 3355 p_Fm->p_FmSp->profiles[i].profilesMng.ownerId = (uint8_t)ILLEGAL_BASE; 3356 #endif /* (DPAA_VERSION >= 11) */ 3357 3358 /* Initialize FM parameters which will be kept by the driver */ 3359 p_Fm->p_FmStateStruct->fmId = p_FmParam->fmId; 3360 p_Fm->h_FmMuram = p_FmParam->h_FmMuram; 3361 p_Fm->h_App = p_FmParam->h_App; 3362 p_Fm->p_FmStateStruct->fmClkFreq = p_FmParam->fmClkFreq; 3363 p_Fm->p_FmStateStruct->fmMacClkFreq = p_FmParam->fmClkFreq / ((!p_FmParam->fmMacClkRatio)? 2: p_FmParam->fmMacClkRatio); 3364 p_Fm->f_Exception = p_FmParam->f_Exception; 3365 p_Fm->f_BusError = p_FmParam->f_BusError; 3366 p_Fm->p_FmFpmRegs = (struct fman_fpm_regs *)UINT_TO_PTR(baseAddr + FM_MM_FPM); 3367 p_Fm->p_FmBmiRegs = (struct fman_bmi_regs *)UINT_TO_PTR(baseAddr + FM_MM_BMI); 3368 p_Fm->p_FmQmiRegs = (struct fman_qmi_regs *)UINT_TO_PTR(baseAddr + FM_MM_QMI); 3369 p_Fm->p_FmDmaRegs = (struct fman_dma_regs *)UINT_TO_PTR(baseAddr + FM_MM_DMA); 3370 p_Fm->p_FmRegs = (struct fman_regs *)UINT_TO_PTR(baseAddr + FM_MM_BMI); 3371 p_Fm->baseAddr = baseAddr; 3372 p_Fm->p_FmStateStruct->irq = p_FmParam->irq; 3373 p_Fm->p_FmStateStruct->errIrq = p_FmParam->errIrq; 3374 p_Fm->hcPortInitialized = FALSE; 3375 p_Fm->independentMode = FALSE; 3376 3377 p_Fm->h_Spinlock = XX_InitSpinlock(); 3378 if (!p_Fm->h_Spinlock) 3379 { 3380 XX_Free(p_Fm->p_FmDriverParam); 3381 XX_Free(p_Fm->p_FmStateStruct); 3382 XX_Free(p_Fm); 3383 REPORT_ERROR(MAJOR, E_INVALID_STATE, ("can't allocate spinlock!")); 3384 return NULL; 3385 } 3386 3387 #if (DPAA_VERSION >= 11) 3388 p_Fm->partVSPBase = p_FmParam->partVSPBase; 3389 p_Fm->partNumOfVSPs = p_FmParam->partNumOfVSPs; 3390 p_Fm->vspBaseAddr = p_FmParam->vspBaseAddr; 3391 #endif /* (DPAA_VERSION >= 11) */ 3392 3393 fman_defconfig(p_Fm->p_FmDriverParam, 3394 !!(p_Fm->guestId == NCSW_MASTER_ID)); 3395 /* overide macros dependent parameters */ 3396 #ifdef FM_PEDANTIC_DMA 3397 p_Fm->p_FmDriverParam->pedantic_dma = TRUE; 3398 p_Fm->p_FmDriverParam->dma_aid_override = TRUE; 3399 #endif /* FM_PEDANTIC_DMA */ 3400 #ifndef FM_QMI_NO_DEQ_OPTIONS_SUPPORT 3401 p_Fm->p_FmDriverParam->qmi_deq_option_support = TRUE; 3402 #endif /* !FM_QMI_NO_DEQ_OPTIONS_SUPPORT */ 3403 3404 p_Fm->p_FmStateStruct->ramsEccEnable = FALSE; 3405 p_Fm->p_FmStateStruct->extraFifoPoolSize = 0; 3406 p_Fm->p_FmStateStruct->exceptions = DEFAULT_exceptions; 3407 p_Fm->resetOnInit = DEFAULT_resetOnInit; 3408 p_Fm->f_ResetOnInitOverride = DEFAULT_resetOnInitOverrideCallback; 3409 p_Fm->fwVerify = DEFAULT_VerifyUcode; 3410 p_Fm->firmware.size = p_FmParam->firmware.size; 3411 if (p_Fm->firmware.size) 3412 { 3413 p_Fm->firmware.p_Code = (uint32_t *)XX_Malloc(p_Fm->firmware.size); 3414 if (!p_Fm->firmware.p_Code) 3415 { 3416 XX_FreeSpinlock(p_Fm->h_Spinlock); 3417 XX_Free(p_Fm->p_FmStateStruct); 3418 XX_Free(p_Fm->p_FmDriverParam); 3419 XX_Free(p_Fm); 3420 REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM firmware code")); 3421 return NULL; 3422 } 3423 memcpy(p_Fm->firmware.p_Code, p_FmParam->firmware.p_Code ,p_Fm->firmware.size); 3424 } 3425 3426 if (p_Fm->guestId != NCSW_MASTER_ID) 3427 return p_Fm; 3428 3429 /* read revision */ 3430 /* Chip dependent, will be configured in Init */ 3431 fman_get_revision(p_Fm->p_FmFpmRegs, 3432 &p_Fm->p_FmStateStruct->revInfo.majorRev, 3433 &p_Fm->p_FmStateStruct->revInfo.minorRev); 3434 3435 #ifdef FM_AID_MODE_NO_TNUM_SW005 3436 if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6) 3437 p_Fm->p_FmDriverParam->dma_aid_mode = e_FM_DMA_AID_OUT_PORT_ID; 3438 #endif /* FM_AID_MODE_NO_TNUM_SW005 */ 3439 #ifndef FM_QMI_NO_DEQ_OPTIONS_SUPPORT 3440 if (p_Fm->p_FmStateStruct->revInfo.majorRev != 4) 3441 p_Fm->p_FmDriverParam->qmi_def_tnums_thresh = QMI_DEF_TNUMS_THRESH; 3442 #endif /* FM_QMI_NO_DEQ_OPTIONS_SUPPORT */ 3443 3444 p_Fm->p_FmStateStruct->totalFifoSize = 0; 3445 p_Fm->p_FmStateStruct->totalNumOfTasks = 3446 DEFAULT_totalNumOfTasks(p_Fm->p_FmStateStruct->revInfo.majorRev, 3447 p_Fm->p_FmStateStruct->revInfo.minorRev); 3448 3449 #ifdef FM_HAS_TOTAL_DMAS 3450 p_Fm->p_FmStateStruct->maxNumOfOpenDmas = BMI_MAX_NUM_OF_DMAS; 3451 #endif /* FM_HAS_TOTAL_DMAS */ 3452 #if (DPAA_VERSION < 11) 3453 p_Fm->p_FmDriverParam->dma_comm_qtsh_clr_emer = DEFAULT_dmaCommQLow; 3454 p_Fm->p_FmDriverParam->dma_comm_qtsh_asrt_emer = DEFAULT_dmaCommQHigh; 3455 p_Fm->p_FmDriverParam->dma_cam_num_of_entries = DEFAULT_dmaCamNumOfEntries; 3456 p_Fm->p_FmDriverParam->dma_read_buf_tsh_clr_emer = DEFAULT_dmaReadIntBufLow; 3457 p_Fm->p_FmDriverParam->dma_read_buf_tsh_asrt_emer = DEFAULT_dmaReadIntBufHigh; 3458 p_Fm->p_FmDriverParam->dma_write_buf_tsh_clr_emer = DEFAULT_dmaWriteIntBufLow; 3459 p_Fm->p_FmDriverParam->dma_write_buf_tsh_asrt_emer = DEFAULT_dmaWriteIntBufHigh; 3460 p_Fm->p_FmDriverParam->dma_axi_dbg_num_of_beats = DEFAULT_axiDbgNumOfBeats; 3461 #endif /* (DPAA_VERSION < 11) */ 3462 #ifdef FM_NO_TNUM_AGING 3463 p_Fm->p_FmDriverParam->tnum_aging_period = 0; 3464 #endif 3465 p_Fm->tnumAgingPeriod = p_Fm->p_FmDriverParam->tnum_aging_period; 3466 3467 return p_Fm; 3468 } 3469 3470 /**************************************************************************//** 3471 @Function FM_Init 3472 3473 @Description Initializes the FM module 3474 3475 @Param[in] h_Fm - FM module descriptor 3476 3477 @Return E_OK on success; Error code otherwise. 3478 *//***************************************************************************/ 3479 t_Error FM_Init(t_Handle h_Fm) 3480 { 3481 t_Fm *p_Fm = (t_Fm*)h_Fm; 3482 struct fman_cfg *p_FmDriverParam = NULL; 3483 t_Error err = E_OK; 3484 int i; 3485 t_FmRevisionInfo revInfo; 3486 struct fman_rg fman_rg; 3487 3488 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 3489 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 3490 3491 fman_rg.bmi_rg = p_Fm->p_FmBmiRegs; 3492 fman_rg.qmi_rg = p_Fm->p_FmQmiRegs; 3493 fman_rg.fpm_rg = p_Fm->p_FmFpmRegs; 3494 fman_rg.dma_rg = p_Fm->p_FmDmaRegs; 3495 3496 p_Fm->p_FmStateStruct->count1MicroBit = FM_TIMESTAMP_1_USEC_BIT; 3497 p_Fm->p_FmDriverParam->num_of_fman_ctrl_evnt_regs = FM_NUM_OF_FMAN_CTRL_EVENT_REGS; 3498 3499 if (p_Fm->guestId != NCSW_MASTER_ID) 3500 return InitGuestMode(p_Fm); 3501 3502 /* if user didn't configured totalFifoSize - (totalFifoSize=0) we configure default 3503 * according to chip. otherwise, we use user's configuration. 3504 */ 3505 if (p_Fm->p_FmStateStruct->totalFifoSize == 0) 3506 p_Fm->p_FmStateStruct->totalFifoSize = DEFAULT_totalFifoSize(p_Fm->p_FmStateStruct->revInfo.majorRev, 3507 p_Fm->p_FmStateStruct->revInfo.minorRev); 3508 3509 CHECK_INIT_PARAMETERS(p_Fm, CheckFmParameters); 3510 3511 p_FmDriverParam = p_Fm->p_FmDriverParam; 3512 3513 FM_GetRevision(p_Fm, &revInfo); 3514 3515 /* clear revision-dependent non existing exception */ 3516 #ifdef FM_NO_DISPATCH_RAM_ECC 3517 if ((revInfo.majorRev != 4) && 3518 (revInfo.majorRev < 6)) 3519 p_Fm->p_FmStateStruct->exceptions &= ~FM_EX_BMI_DISPATCH_RAM_ECC; 3520 #endif /* FM_NO_DISPATCH_RAM_ECC */ 3521 3522 #ifdef FM_QMI_NO_ECC_EXCEPTIONS 3523 if (revInfo.majorRev == 4) 3524 p_Fm->p_FmStateStruct->exceptions &= ~(FM_EX_QMI_SINGLE_ECC | FM_EX_QMI_DOUBLE_ECC); 3525 #endif /* FM_QMI_NO_ECC_EXCEPTIONS */ 3526 3527 #ifdef FM_QMI_NO_SINGLE_ECC_EXCEPTION 3528 if (revInfo.majorRev >= 6) 3529 p_Fm->p_FmStateStruct->exceptions &= ~FM_EX_QMI_SINGLE_ECC; 3530 #endif /* FM_QMI_NO_SINGLE_ECC_EXCEPTION */ 3531 3532 FmMuramClear(p_Fm->h_FmMuram); 3533 3534 /* clear CPG */ 3535 IOMemSet32(UINT_TO_PTR(p_Fm->baseAddr + FM_MM_CGP), 0, FM_PORT_NUM_OF_CONGESTION_GRPS); 3536 3537 /* add to the default exceptions the user's definitions */ 3538 p_Fm->p_FmStateStruct->exceptions |= p_Fm->userSetExceptions; 3539 3540 /* Reset the FM if required */ 3541 if (p_Fm->resetOnInit) 3542 { 3543 #ifdef FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 3544 if ((err = FwNotResetErratumBugzilla6173WA(p_Fm)) != E_OK) 3545 RETURN_ERROR(MAJOR, err, NO_MSG); 3546 #else /* not FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 */ 3547 3548 if (p_Fm->f_ResetOnInitOverride) 3549 { 3550 /* Perform user specific FMan reset */ 3551 p_Fm->f_ResetOnInitOverride(h_Fm); 3552 } 3553 else 3554 { 3555 /* Perform FMan reset */ 3556 FmReset(h_Fm); 3557 } 3558 3559 if (fman_is_qmi_halt_not_busy_state(p_Fm->p_FmQmiRegs)) 3560 { 3561 fman_resume(p_Fm->p_FmFpmRegs); 3562 XX_UDelay(100); 3563 } 3564 #endif /* not FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 */ 3565 } 3566 3567 #ifdef FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 3568 if (!p_Fm->resetOnInit) /* Skip operations done in errata workaround */ 3569 { 3570 #endif /* FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 */ 3571 /* Load FMan-Controller code to IRAM */ 3572 3573 ClearIRam(p_Fm); 3574 3575 if (p_Fm->firmware.p_Code && (LoadFmanCtrlCode(p_Fm) != E_OK)) 3576 RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG); 3577 #ifdef FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 3578 } 3579 #endif /* FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 */ 3580 3581 #ifdef FM_CAPWAP_SUPPORT 3582 /* save first 256 byte in MURAM */ 3583 p_Fm->resAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_Fm->h_FmMuram, 256, 0)); 3584 if (!p_Fm->resAddr) 3585 RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for reserved Area failed")); 3586 3587 WRITE_BLOCK(UINT_TO_PTR(p_Fm->resAddr), 0, 256); 3588 #endif /* FM_CAPWAP_SUPPORT */ 3589 3590 #if (DPAA_VERSION >= 11) 3591 p_Fm->partVSPBase = AllocVSPsForPartition(h_Fm, p_Fm->partVSPBase, p_Fm->partNumOfVSPs, p_Fm->guestId); 3592 if (p_Fm->partVSPBase == (uint8_t)(ILLEGAL_BASE)) 3593 DBG(WARNING, ("partition VSPs allocation is FAILED")); 3594 #endif /* (DPAA_VERSION >= 11) */ 3595 3596 /* General FM driver initialization */ 3597 p_Fm->fmMuramPhysBaseAddr = 3598 (uint64_t)(XX_VirtToPhys(UINT_TO_PTR(p_Fm->baseAddr + FM_MM_MURAM))); 3599 3600 for (i=0;i<e_FM_EV_DUMMY_LAST;i++) 3601 p_Fm->intrMng[i].f_Isr = UnimplementedIsr; 3602 for (i=0;i<FM_NUM_OF_FMAN_CTRL_EVENT_REGS;i++) 3603 p_Fm->fmanCtrlIntr[i].f_Isr = UnimplementedFmanCtrlIsr; 3604 3605 p_FmDriverParam->exceptions = p_Fm->p_FmStateStruct->exceptions; 3606 3607 /**********************/ 3608 /* Init DMA Registers */ 3609 /**********************/ 3610 err = InitFmDma(p_Fm); 3611 if (err != E_OK) 3612 { 3613 FreeInitResources(p_Fm); 3614 RETURN_ERROR(MAJOR, err, NO_MSG); 3615 } 3616 3617 /**********************/ 3618 /* Init FPM Registers */ 3619 /**********************/ 3620 err = InitFmFpm(p_Fm); 3621 if (err != E_OK) 3622 { 3623 FreeInitResources(p_Fm); 3624 RETURN_ERROR(MAJOR, err, NO_MSG); 3625 } 3626 3627 /* define common resources */ 3628 /* allocate MURAM for FIFO according to total size */ 3629 p_Fm->fifoBaseAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_Fm->h_FmMuram, 3630 p_Fm->p_FmStateStruct->totalFifoSize, 3631 BMI_FIFO_ALIGN)); 3632 if (!p_Fm->fifoBaseAddr) 3633 { 3634 FreeInitResources(p_Fm); 3635 RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for BMI FIFO failed")); 3636 } 3637 3638 p_FmDriverParam->fifo_base_addr = (uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_Fm->fifoBaseAddr)) - p_Fm->fmMuramPhysBaseAddr); 3639 p_FmDriverParam->total_fifo_size = p_Fm->p_FmStateStruct->totalFifoSize; 3640 p_FmDriverParam->total_num_of_tasks = p_Fm->p_FmStateStruct->totalNumOfTasks; 3641 p_FmDriverParam->clk_freq = p_Fm->p_FmStateStruct->fmClkFreq; 3642 3643 /**********************/ 3644 /* Init BMI Registers */ 3645 /**********************/ 3646 err = InitFmBmi(p_Fm); 3647 if (err != E_OK) 3648 { 3649 FreeInitResources(p_Fm); 3650 RETURN_ERROR(MAJOR, err, NO_MSG); 3651 } 3652 3653 /**********************/ 3654 /* Init QMI Registers */ 3655 /**********************/ 3656 err = InitFmQmi(p_Fm); 3657 if (err != E_OK) 3658 { 3659 FreeInitResources(p_Fm); 3660 RETURN_ERROR(MAJOR, err, NO_MSG); 3661 } 3662 3663 /* build the FM master partition IPC address */ 3664 if (Sprint (p_Fm->fmModuleName, "FM_%d_%d",p_Fm->p_FmStateStruct->fmId, NCSW_MASTER_ID) != 6) 3665 { 3666 FreeInitResources(p_Fm); 3667 RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed")); 3668 } 3669 3670 err = XX_IpcRegisterMsgHandler(p_Fm->fmModuleName, FmHandleIpcMsgCB, p_Fm, FM_IPC_MAX_REPLY_SIZE); 3671 if (err) 3672 { 3673 FreeInitResources(p_Fm); 3674 RETURN_ERROR(MAJOR, err, NO_MSG); 3675 } 3676 3677 /* Register the FM interrupts handlers */ 3678 if (p_Fm->p_FmStateStruct->irq != NO_IRQ) 3679 { 3680 XX_SetIntr(p_Fm->p_FmStateStruct->irq, FM_EventIsr, p_Fm); 3681 XX_EnableIntr(p_Fm->p_FmStateStruct->irq); 3682 } 3683 3684 if (p_Fm->p_FmStateStruct->errIrq != NO_IRQ) 3685 { 3686 XX_SetIntr(p_Fm->p_FmStateStruct->errIrq, (void (*) (t_Handle))FM_ErrorIsr, p_Fm); 3687 XX_EnableIntr(p_Fm->p_FmStateStruct->errIrq); 3688 } 3689 3690 err = (t_Error)fman_enable(&fman_rg , p_FmDriverParam); 3691 if (err != E_OK) 3692 return err; /* FIXME */ 3693 3694 EnableTimeStamp(p_Fm); 3695 3696 if (p_Fm->firmware.p_Code) 3697 { 3698 XX_Free(p_Fm->firmware.p_Code); 3699 p_Fm->firmware.p_Code = NULL; 3700 } 3701 3702 XX_Free(p_Fm->p_FmDriverParam); 3703 p_Fm->p_FmDriverParam = NULL; 3704 3705 return E_OK; 3706 } 3707 3708 /**************************************************************************//** 3709 @Function FM_Free 3710 3711 @Description Frees all resources that were assigned to FM module. 3712 3713 Calling this routine invalidates the descriptor. 3714 3715 @Param[in] h_Fm - FM module descriptor 3716 3717 @Return E_OK on success; Error code otherwise. 3718 *//***************************************************************************/ 3719 t_Error FM_Free(t_Handle h_Fm) 3720 { 3721 t_Fm *p_Fm = (t_Fm*)h_Fm; 3722 struct fman_rg fman_rg; 3723 3724 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 3725 3726 fman_rg.bmi_rg = p_Fm->p_FmBmiRegs; 3727 fman_rg.qmi_rg = p_Fm->p_FmQmiRegs; 3728 fman_rg.fpm_rg = p_Fm->p_FmFpmRegs; 3729 fman_rg.dma_rg = p_Fm->p_FmDmaRegs; 3730 3731 if (p_Fm->guestId != NCSW_MASTER_ID) 3732 { 3733 #if (DPAA_VERSION >= 11) 3734 FreeVSPsForPartition(h_Fm, p_Fm->partVSPBase, p_Fm->partNumOfVSPs, p_Fm->guestId); 3735 3736 if (p_Fm->p_FmSp) 3737 { 3738 XX_Free(p_Fm->p_FmSp); 3739 p_Fm->p_FmSp = NULL; 3740 } 3741 #endif /* (DPAA_VERSION >= 11) */ 3742 3743 if (p_Fm->fmModuleName[0] != 0) 3744 XX_IpcUnregisterMsgHandler(p_Fm->fmModuleName); 3745 3746 if (!p_Fm->recoveryMode) 3747 XX_Free(p_Fm->p_FmStateStruct); 3748 3749 XX_Free(p_Fm); 3750 3751 return E_OK; 3752 } 3753 3754 fman_free_resources(&fman_rg); 3755 3756 if ((p_Fm->guestId == NCSW_MASTER_ID) && (p_Fm->fmModuleName[0] != 0)) 3757 XX_IpcUnregisterMsgHandler(p_Fm->fmModuleName); 3758 3759 if (p_Fm->p_FmStateStruct) 3760 { 3761 if (p_Fm->p_FmStateStruct->irq != NO_IRQ) 3762 { 3763 XX_DisableIntr(p_Fm->p_FmStateStruct->irq); 3764 XX_FreeIntr(p_Fm->p_FmStateStruct->irq); 3765 } 3766 if (p_Fm->p_FmStateStruct->errIrq != NO_IRQ) 3767 { 3768 XX_DisableIntr(p_Fm->p_FmStateStruct->errIrq); 3769 XX_FreeIntr(p_Fm->p_FmStateStruct->errIrq); 3770 } 3771 } 3772 3773 #if (DPAA_VERSION >= 11) 3774 FreeVSPsForPartition(h_Fm, p_Fm->partVSPBase, p_Fm->partNumOfVSPs, p_Fm->guestId); 3775 3776 if (p_Fm->p_FmSp) 3777 { 3778 XX_Free(p_Fm->p_FmSp); 3779 p_Fm->p_FmSp = NULL; 3780 } 3781 #endif /* (DPAA_VERSION >= 11) */ 3782 3783 if (p_Fm->h_Spinlock) 3784 XX_FreeSpinlock(p_Fm->h_Spinlock); 3785 3786 if (p_Fm->p_FmDriverParam) 3787 { 3788 if (p_Fm->firmware.p_Code) 3789 XX_Free(p_Fm->firmware.p_Code); 3790 XX_Free(p_Fm->p_FmDriverParam); 3791 p_Fm->p_FmDriverParam = NULL; 3792 } 3793 3794 FreeInitResources(p_Fm); 3795 3796 if (!p_Fm->recoveryMode && p_Fm->p_FmStateStruct) 3797 XX_Free(p_Fm->p_FmStateStruct); 3798 3799 XX_Free(p_Fm); 3800 3801 return E_OK; 3802 } 3803 3804 /*************************************************/ 3805 /* API Advanced Init unit functions */ 3806 /*************************************************/ 3807 3808 t_Error FM_ConfigResetOnInit(t_Handle h_Fm, bool enable) 3809 { 3810 t_Fm *p_Fm = (t_Fm*)h_Fm; 3811 3812 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 3813 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 3814 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 3815 3816 p_Fm->resetOnInit = enable; 3817 3818 return E_OK; 3819 } 3820 3821 t_Error FM_ConfigResetOnInitOverrideCallback(t_Handle h_Fm, t_FmResetOnInitOverrideCallback *f_ResetOnInitOverride) 3822 { 3823 t_Fm *p_Fm = (t_Fm*)h_Fm; 3824 3825 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 3826 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 3827 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 3828 3829 p_Fm->f_ResetOnInitOverride = f_ResetOnInitOverride; 3830 3831 return E_OK; 3832 } 3833 3834 t_Error FM_ConfigTotalFifoSize(t_Handle h_Fm, uint32_t totalFifoSize) 3835 { 3836 t_Fm *p_Fm = (t_Fm*)h_Fm; 3837 3838 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 3839 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 3840 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 3841 3842 p_Fm->p_FmStateStruct->totalFifoSize = totalFifoSize; 3843 3844 return E_OK; 3845 } 3846 3847 t_Error FM_ConfigDmaCacheOverride(t_Handle h_Fm, e_FmDmaCacheOverride cacheOverride) 3848 { 3849 t_Fm *p_Fm = (t_Fm*)h_Fm; 3850 enum fman_dma_cache_override fsl_cache_override; 3851 3852 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 3853 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 3854 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 3855 3856 FMAN_CACHE_OVERRIDE_TRANS(fsl_cache_override, cacheOverride) 3857 p_Fm->p_FmDriverParam->dma_cache_override = fsl_cache_override; 3858 3859 return E_OK; 3860 } 3861 3862 t_Error FM_ConfigDmaAidOverride(t_Handle h_Fm, bool aidOverride) 3863 { 3864 t_Fm *p_Fm = (t_Fm*)h_Fm; 3865 3866 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 3867 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 3868 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 3869 3870 p_Fm->p_FmDriverParam->dma_aid_override = aidOverride; 3871 3872 return E_OK; 3873 } 3874 3875 t_Error FM_ConfigDmaAidMode(t_Handle h_Fm, e_FmDmaAidMode aidMode) 3876 { 3877 t_Fm *p_Fm = (t_Fm*)h_Fm; 3878 enum fman_dma_aid_mode fsl_aid_mode; 3879 3880 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 3881 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 3882 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 3883 3884 FMAN_AID_MODE_TRANS(fsl_aid_mode, aidMode); 3885 p_Fm->p_FmDriverParam->dma_aid_mode = fsl_aid_mode; 3886 3887 return E_OK; 3888 } 3889 3890 t_Error FM_ConfigDmaAxiDbgNumOfBeats(t_Handle h_Fm, uint8_t axiDbgNumOfBeats) 3891 { 3892 t_Fm *p_Fm = (t_Fm*)h_Fm; 3893 3894 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 3895 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 3896 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 3897 3898 #if (DPAA_VERSION >= 11) 3899 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!")); 3900 #else 3901 p_Fm->p_FmDriverParam->dma_axi_dbg_num_of_beats = axiDbgNumOfBeats; 3902 3903 return E_OK; 3904 #endif /* (DPAA_VERSION >= 11) */ 3905 } 3906 3907 t_Error FM_ConfigDmaCamNumOfEntries(t_Handle h_Fm, uint8_t numOfEntries) 3908 { 3909 t_Fm *p_Fm = (t_Fm*)h_Fm; 3910 3911 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 3912 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 3913 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 3914 3915 p_Fm->p_FmDriverParam->dma_cam_num_of_entries = numOfEntries; 3916 3917 return E_OK; 3918 } 3919 3920 t_Error FM_ConfigDmaDbgCounter(t_Handle h_Fm, e_FmDmaDbgCntMode fmDmaDbgCntMode) 3921 { 3922 t_Fm *p_Fm = (t_Fm*)h_Fm; 3923 enum fman_dma_dbg_cnt_mode fsl_dma_dbg_cnt; 3924 3925 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 3926 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 3927 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 3928 3929 FMAN_DMA_DBG_CNT_TRANS(fsl_dma_dbg_cnt, fmDmaDbgCntMode); 3930 p_Fm->p_FmDriverParam->dma_dbg_cnt_mode = fsl_dma_dbg_cnt; 3931 3932 return E_OK; 3933 } 3934 3935 t_Error FM_ConfigDmaStopOnBusErr(t_Handle h_Fm, bool stop) 3936 { 3937 t_Fm *p_Fm = (t_Fm*)h_Fm; 3938 3939 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 3940 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 3941 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 3942 3943 p_Fm->p_FmDriverParam->dma_stop_on_bus_error = stop; 3944 3945 return E_OK; 3946 } 3947 3948 t_Error FM_ConfigDmaEmergency(t_Handle h_Fm, t_FmDmaEmergency *p_Emergency) 3949 { 3950 t_Fm *p_Fm = (t_Fm*)h_Fm; 3951 enum fman_dma_emergency_level fsl_dma_emer; 3952 3953 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 3954 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 3955 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 3956 3957 FMAN_DMA_EMER_TRANS(fsl_dma_emer, p_Emergency->emergencyLevel); 3958 p_Fm->p_FmDriverParam->dma_en_emergency = TRUE; 3959 p_Fm->p_FmDriverParam->dma_emergency_bus_select = (uint32_t)p_Emergency->emergencyBusSelect; 3960 p_Fm->p_FmDriverParam->dma_emergency_level = fsl_dma_emer; 3961 3962 return E_OK; 3963 } 3964 3965 t_Error FM_ConfigDmaEmergencySmoother(t_Handle h_Fm, uint32_t emergencyCnt) 3966 { 3967 t_Fm *p_Fm = (t_Fm*)h_Fm; 3968 3969 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 3970 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 3971 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 3972 3973 p_Fm->p_FmDriverParam->dma_en_emergency_smoother = TRUE; 3974 p_Fm->p_FmDriverParam->dma_emergency_switch_counter = emergencyCnt; 3975 3976 return E_OK; 3977 } 3978 3979 t_Error FM_ConfigDmaErr(t_Handle h_Fm, e_FmDmaErr dmaErr) 3980 { 3981 t_Fm *p_Fm = (t_Fm*)h_Fm; 3982 enum fman_dma_err fsl_dma_err; 3983 3984 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 3985 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 3986 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 3987 3988 FMAN_DMA_ERR_TRANS(fsl_dma_err, dmaErr); 3989 p_Fm->p_FmDriverParam->dma_err = fsl_dma_err; 3990 3991 return E_OK; 3992 } 3993 3994 t_Error FM_ConfigCatastrophicErr(t_Handle h_Fm, e_FmCatastrophicErr catastrophicErr) 3995 { 3996 t_Fm *p_Fm = (t_Fm*)h_Fm; 3997 enum fman_catastrophic_err fsl_catastrophic_err; 3998 3999 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4000 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 4001 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4002 4003 FMAN_CATASTROPHIC_ERR_TRANS(fsl_catastrophic_err, catastrophicErr); 4004 p_Fm->p_FmDriverParam->catastrophic_err = fsl_catastrophic_err; 4005 4006 return E_OK; 4007 } 4008 4009 t_Error FM_ConfigEnableMuramTestMode(t_Handle h_Fm) 4010 { 4011 t_Fm *p_Fm = (t_Fm*)h_Fm; 4012 4013 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4014 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 4015 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4016 4017 if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6) 4018 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!")); 4019 4020 p_Fm->p_FmDriverParam->en_muram_test_mode = TRUE; 4021 4022 return E_OK; 4023 } 4024 4025 t_Error FM_ConfigEnableIramTestMode(t_Handle h_Fm) 4026 { 4027 t_Fm *p_Fm = (t_Fm*)h_Fm; 4028 4029 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE ); 4030 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 4031 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4032 4033 if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6) 4034 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!")); 4035 4036 p_Fm->p_FmDriverParam->en_iram_test_mode = TRUE; 4037 4038 return E_OK; 4039 } 4040 4041 t_Error FM_ConfigHaltOnExternalActivation(t_Handle h_Fm, bool enable) 4042 { 4043 t_Fm *p_Fm = (t_Fm*)h_Fm; 4044 4045 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4046 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 4047 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4048 4049 p_Fm->p_FmDriverParam->halt_on_external_activ = enable; 4050 4051 return E_OK; 4052 } 4053 4054 t_Error FM_ConfigHaltOnUnrecoverableEccError(t_Handle h_Fm, bool enable) 4055 { 4056 t_Fm *p_Fm = (t_Fm*)h_Fm; 4057 4058 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4059 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 4060 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4061 4062 if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6) 4063 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!")); 4064 4065 p_Fm->p_FmDriverParam->halt_on_unrecov_ecc_err = enable; 4066 4067 return E_OK; 4068 } 4069 4070 t_Error FM_ConfigException(t_Handle h_Fm, e_FmExceptions exception, bool enable) 4071 { 4072 t_Fm *p_Fm = (t_Fm*)h_Fm; 4073 uint32_t bitMask = 0; 4074 4075 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4076 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 4077 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4078 4079 GET_EXCEPTION_FLAG(bitMask, exception); 4080 if (bitMask) 4081 { 4082 if (enable) 4083 p_Fm->userSetExceptions |= bitMask; 4084 else 4085 p_Fm->p_FmStateStruct->exceptions &= ~bitMask; 4086 } 4087 else 4088 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception")); 4089 4090 return E_OK; 4091 } 4092 4093 t_Error FM_ConfigExternalEccRamsEnable(t_Handle h_Fm, bool enable) 4094 { 4095 t_Fm *p_Fm = (t_Fm*)h_Fm; 4096 4097 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4098 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 4099 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4100 4101 p_Fm->p_FmDriverParam->external_ecc_rams_enable = enable; 4102 4103 return E_OK; 4104 } 4105 4106 t_Error FM_ConfigTnumAgingPeriod(t_Handle h_Fm, uint16_t tnumAgingPeriod) 4107 { 4108 t_Fm *p_Fm = (t_Fm*)h_Fm; 4109 4110 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4111 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 4112 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4113 4114 p_Fm->p_FmDriverParam->tnum_aging_period = tnumAgingPeriod; 4115 p_Fm->tnumAgingPeriod = p_Fm->p_FmDriverParam->tnum_aging_period; 4116 4117 return E_OK; 4118 } 4119 4120 /****************************************************/ 4121 /* Hidden-DEBUG Only API */ 4122 /****************************************************/ 4123 4124 t_Error FM_ConfigThresholds(t_Handle h_Fm, t_FmThresholds *p_FmThresholds) 4125 { 4126 t_Fm *p_Fm = (t_Fm*)h_Fm; 4127 4128 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4129 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 4130 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4131 4132 p_Fm->p_FmDriverParam->disp_limit_tsh = p_FmThresholds->dispLimit; 4133 p_Fm->p_FmDriverParam->prs_disp_tsh = p_FmThresholds->prsDispTh; 4134 p_Fm->p_FmDriverParam->plcr_disp_tsh = p_FmThresholds->plcrDispTh; 4135 p_Fm->p_FmDriverParam->kg_disp_tsh = p_FmThresholds->kgDispTh; 4136 p_Fm->p_FmDriverParam->bmi_disp_tsh = p_FmThresholds->bmiDispTh; 4137 p_Fm->p_FmDriverParam->qmi_enq_disp_tsh = p_FmThresholds->qmiEnqDispTh; 4138 p_Fm->p_FmDriverParam->qmi_deq_disp_tsh = p_FmThresholds->qmiDeqDispTh; 4139 p_Fm->p_FmDriverParam->fm_ctl1_disp_tsh = p_FmThresholds->fmCtl1DispTh; 4140 p_Fm->p_FmDriverParam->fm_ctl2_disp_tsh = p_FmThresholds->fmCtl2DispTh; 4141 4142 return E_OK; 4143 } 4144 4145 t_Error FM_ConfigDmaSosEmergencyThreshold(t_Handle h_Fm, uint32_t dmaSosEmergency) 4146 { 4147 t_Fm *p_Fm = (t_Fm*)h_Fm; 4148 4149 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4150 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 4151 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4152 4153 p_Fm->p_FmDriverParam->dma_sos_emergency = dmaSosEmergency; 4154 4155 return E_OK; 4156 } 4157 4158 t_Error FM_ConfigDmaWriteBufThresholds(t_Handle h_Fm, t_FmDmaThresholds *p_FmDmaThresholds) 4159 4160 { 4161 t_Fm *p_Fm = (t_Fm*)h_Fm; 4162 4163 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4164 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 4165 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4166 4167 #if (DPAA_VERSION >= 11) 4168 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!")); 4169 #else 4170 p_Fm->p_FmDriverParam->dma_write_buf_tsh_asrt_emer = p_FmDmaThresholds->assertEmergency; 4171 p_Fm->p_FmDriverParam->dma_write_buf_tsh_clr_emer = p_FmDmaThresholds->clearEmergency; 4172 4173 return E_OK; 4174 #endif 4175 } 4176 4177 t_Error FM_ConfigDmaCommQThresholds(t_Handle h_Fm, t_FmDmaThresholds *p_FmDmaThresholds) 4178 { 4179 t_Fm *p_Fm = (t_Fm*)h_Fm; 4180 4181 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4182 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 4183 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4184 4185 p_Fm->p_FmDriverParam->dma_comm_qtsh_asrt_emer = p_FmDmaThresholds->assertEmergency; 4186 p_Fm->p_FmDriverParam->dma_comm_qtsh_clr_emer = p_FmDmaThresholds->clearEmergency; 4187 4188 return E_OK; 4189 } 4190 4191 t_Error FM_ConfigDmaReadBufThresholds(t_Handle h_Fm, t_FmDmaThresholds *p_FmDmaThresholds) 4192 { 4193 t_Fm *p_Fm = (t_Fm*)h_Fm; 4194 4195 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4196 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 4197 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4198 4199 #if (DPAA_VERSION >= 11) 4200 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!")); 4201 #else 4202 p_Fm->p_FmDriverParam->dma_read_buf_tsh_clr_emer = p_FmDmaThresholds->clearEmergency; 4203 p_Fm->p_FmDriverParam->dma_read_buf_tsh_asrt_emer = p_FmDmaThresholds->assertEmergency; 4204 4205 return E_OK; 4206 #endif 4207 } 4208 4209 t_Error FM_ConfigDmaWatchdog(t_Handle h_Fm, uint32_t watchdogValue) 4210 { 4211 t_Fm *p_Fm = (t_Fm*)h_Fm; 4212 4213 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4214 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 4215 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4216 4217 p_Fm->p_FmDriverParam->dma_watchdog = watchdogValue; 4218 4219 return E_OK; 4220 } 4221 4222 t_Error FM_ConfigEnableCounters(t_Handle h_Fm) 4223 { 4224 t_Fm *p_Fm = (t_Fm*)h_Fm; 4225 4226 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4227 SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 4228 UNUSED(p_Fm); 4229 4230 return E_OK; 4231 } 4232 4233 t_Error FmGetSetParams(t_Handle h_Fm, t_FmGetSetParams *p_Params) 4234 { 4235 t_Fm* p_Fm = (t_Fm*)h_Fm; 4236 if (p_Params->setParams.type & UPDATE_FM_CLD) 4237 { 4238 WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_cld, GET_UINT32( 4239 p_Fm->p_FmFpmRegs->fm_cld) | 0x00000800); 4240 } 4241 if (p_Params->setParams.type & CLEAR_IRAM_READY) 4242 { 4243 t_FMIramRegs *p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM); 4244 WRITE_UINT32(p_Iram->iready,GET_UINT32(p_Iram->iready) & ~IRAM_READY); 4245 } 4246 if (p_Params->setParams.type & UPDATE_FPM_EXTC) 4247 WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_extc,0x80000000); 4248 if (p_Params->setParams.type & UPDATE_FPM_EXTC_CLEAR) 4249 WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_extc,0x00800000); 4250 if (p_Params->setParams.type & UPDATE_FPM_BRKC_SLP) 4251 { 4252 if (p_Params->setParams.sleep) 4253 WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc, GET_UINT32( 4254 p_Fm->p_FmFpmRegs->fmfp_brkc) | FPM_BRKC_SLP); 4255 else 4256 WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc, GET_UINT32( 4257 p_Fm->p_FmFpmRegs->fmfp_brkc) & ~FPM_BRKC_SLP); 4258 } 4259 if (p_Params->getParams.type & GET_FM_CLD) 4260 p_Params->getParams.fm_cld = GET_UINT32(p_Fm->p_FmFpmRegs->fm_cld); 4261 if (p_Params->getParams.type & GET_FMQM_GS) 4262 p_Params->getParams.fmqm_gs = GET_UINT32(p_Fm->p_FmQmiRegs->fmqm_gs); 4263 if (p_Params->getParams.type & GET_FM_NPI) 4264 p_Params->getParams.fm_npi = GET_UINT32(p_Fm->p_FmFpmRegs->fm_npi); 4265 if (p_Params->getParams.type & GET_FMFP_EXTC) 4266 p_Params->getParams.fmfp_extc = GET_UINT32(p_Fm->p_FmFpmRegs->fmfp_extc); 4267 return E_OK; 4268 } 4269 4270 4271 /****************************************************/ 4272 /* API Run-time Control uint functions */ 4273 /****************************************************/ 4274 void FM_EventIsr(t_Handle h_Fm) 4275 { 4276 #define FM_M_CALL_1G_MAC_ISR(_id) \ 4277 { \ 4278 if (p_Fm->guestId != p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_1G_MAC0+_id)].guestId) \ 4279 SendIpcIsr(p_Fm, (e_FmInterModuleEvent)(e_FM_EV_1G_MAC0+_id), pending); \ 4280 else \ 4281 p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_1G_MAC0+_id)].f_Isr(p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_1G_MAC0+_id)].h_SrcHandle);\ 4282 } 4283 #define FM_M_CALL_10G_MAC_ISR(_id) \ 4284 { \ 4285 if (p_Fm->guestId != p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_10G_MAC0+_id)].guestId) \ 4286 SendIpcIsr(p_Fm, (e_FmInterModuleEvent)(e_FM_EV_10G_MAC0+_id), pending); \ 4287 else \ 4288 p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_10G_MAC0+_id)].f_Isr(p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_10G_MAC0+_id)].h_SrcHandle);\ 4289 } 4290 t_Fm *p_Fm = (t_Fm*)h_Fm; 4291 uint32_t pending, event; 4292 struct fman_fpm_regs *fpm_rg; 4293 4294 SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE); 4295 SANITY_CHECK_RETURN(!p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 4296 SANITY_CHECK_RETURN((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4297 4298 fpm_rg = p_Fm->p_FmFpmRegs; 4299 4300 /* normal interrupts */ 4301 pending = fman_get_normal_pending(fpm_rg); 4302 if (!pending) 4303 return; 4304 if (pending & INTR_EN_WAKEUP) // this is a wake up from sleep interrupt 4305 { 4306 t_FmGetSetParams fmGetSetParams; 4307 memset(&fmGetSetParams, 0, sizeof (t_FmGetSetParams)); 4308 fmGetSetParams.setParams.type = UPDATE_FPM_BRKC_SLP; 4309 fmGetSetParams.setParams.sleep = 0; 4310 FmGetSetParams(h_Fm, &fmGetSetParams); 4311 } 4312 if (pending & INTR_EN_QMI) 4313 QmiEvent(p_Fm); 4314 if (pending & INTR_EN_PRS) 4315 p_Fm->intrMng[e_FM_EV_PRS].f_Isr(p_Fm->intrMng[e_FM_EV_PRS].h_SrcHandle); 4316 if (pending & INTR_EN_PLCR) 4317 p_Fm->intrMng[e_FM_EV_PLCR].f_Isr(p_Fm->intrMng[e_FM_EV_PLCR].h_SrcHandle); 4318 if (pending & INTR_EN_TMR) 4319 p_Fm->intrMng[e_FM_EV_TMR].f_Isr(p_Fm->intrMng[e_FM_EV_TMR].h_SrcHandle); 4320 4321 /* MAC events may belong to different partitions */ 4322 if (pending & INTR_EN_1G_MAC0) 4323 FM_M_CALL_1G_MAC_ISR(0); 4324 if (pending & INTR_EN_1G_MAC1) 4325 FM_M_CALL_1G_MAC_ISR(1); 4326 if (pending & INTR_EN_1G_MAC2) 4327 FM_M_CALL_1G_MAC_ISR(2); 4328 if (pending & INTR_EN_1G_MAC3) 4329 FM_M_CALL_1G_MAC_ISR(3); 4330 if (pending & INTR_EN_1G_MAC4) 4331 FM_M_CALL_1G_MAC_ISR(4); 4332 if (pending & INTR_EN_1G_MAC5) 4333 FM_M_CALL_1G_MAC_ISR(5); 4334 if (pending & INTR_EN_1G_MAC6) 4335 FM_M_CALL_1G_MAC_ISR(6); 4336 if (pending & INTR_EN_1G_MAC7) 4337 FM_M_CALL_1G_MAC_ISR(7); 4338 if (pending & INTR_EN_10G_MAC0) 4339 FM_M_CALL_10G_MAC_ISR(0); 4340 if (pending & INTR_EN_10G_MAC1) 4341 FM_M_CALL_10G_MAC_ISR(1); 4342 4343 /* IM port events may belong to different partitions */ 4344 if (pending & INTR_EN_REV0) 4345 { 4346 event = fman_get_controller_event(fpm_rg, 0); 4347 if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_FMAN_CTRL_0].guestId) 4348 /*TODO IPC ISR For Fman Ctrl */ 4349 ASSERT_COND(0); 4350 /* SendIpcIsr(p_Fm, e_FM_EV_FMAN_CTRL_0, pending); */ 4351 else 4352 p_Fm->fmanCtrlIntr[0].f_Isr(p_Fm->fmanCtrlIntr[0].h_SrcHandle, event); 4353 4354 } 4355 if (pending & INTR_EN_REV1) 4356 { 4357 event = fman_get_controller_event(fpm_rg, 1); 4358 if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_FMAN_CTRL_1].guestId) 4359 /*TODO IPC ISR For Fman Ctrl */ 4360 ASSERT_COND(0); 4361 /* SendIpcIsr(p_Fm, e_FM_EV_FMAN_CTRL_1, pending); */ 4362 else 4363 p_Fm->fmanCtrlIntr[1].f_Isr(p_Fm->fmanCtrlIntr[1].h_SrcHandle, event); 4364 } 4365 if (pending & INTR_EN_REV2) 4366 { 4367 event = fman_get_controller_event(fpm_rg, 2); 4368 if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_FMAN_CTRL_2].guestId) 4369 /*TODO IPC ISR For Fman Ctrl */ 4370 ASSERT_COND(0); 4371 /* SendIpcIsr(p_Fm, e_FM_EV_FMAN_CTRL_2, pending); */ 4372 else 4373 p_Fm->fmanCtrlIntr[2].f_Isr(p_Fm->fmanCtrlIntr[2].h_SrcHandle, event); 4374 } 4375 if (pending & INTR_EN_REV3) 4376 { 4377 event = fman_get_controller_event(fpm_rg, 3); 4378 if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_FMAN_CTRL_3].guestId) 4379 /*TODO IPC ISR For Fman Ctrl */ 4380 ASSERT_COND(0); 4381 /* SendIpcIsr(p_Fm, e_FM_EV_FMAN_CTRL_2, pendin3); */ 4382 else 4383 p_Fm->fmanCtrlIntr[3].f_Isr(p_Fm->fmanCtrlIntr[3].h_SrcHandle, event); 4384 } 4385 #ifdef FM_MACSEC_SUPPORT 4386 if (pending & INTR_EN_MACSEC_MAC0) 4387 { 4388 if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_MACSEC_MAC0].guestId) 4389 SendIpcIsr(p_Fm, e_FM_EV_MACSEC_MAC0, pending); 4390 else 4391 p_Fm->intrMng[e_FM_EV_MACSEC_MAC0].f_Isr(p_Fm->intrMng[e_FM_EV_MACSEC_MAC0].h_SrcHandle); 4392 } 4393 #endif /* FM_MACSEC_SUPPORT */ 4394 } 4395 4396 t_Error FM_ErrorIsr(t_Handle h_Fm) 4397 { 4398 #define FM_M_CALL_1G_MAC_ERR_ISR(_id) \ 4399 { \ 4400 if (p_Fm->guestId != p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_1G_MAC0+_id)].guestId) \ 4401 SendIpcIsr(p_Fm, (e_FmInterModuleEvent)(e_FM_EV_ERR_1G_MAC0+_id), pending); \ 4402 else \ 4403 p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_1G_MAC0+_id)].f_Isr(p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_1G_MAC0+_id)].h_SrcHandle);\ 4404 } 4405 #define FM_M_CALL_10G_MAC_ERR_ISR(_id) \ 4406 { \ 4407 if (p_Fm->guestId != p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_10G_MAC0+_id)].guestId) \ 4408 SendIpcIsr(p_Fm, (e_FmInterModuleEvent)(e_FM_EV_ERR_10G_MAC0+_id), pending); \ 4409 else \ 4410 p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_10G_MAC0+_id)].f_Isr(p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_10G_MAC0+_id)].h_SrcHandle);\ 4411 } 4412 t_Fm *p_Fm = (t_Fm*)h_Fm; 4413 uint32_t pending; 4414 struct fman_fpm_regs *fpm_rg; 4415 4416 SANITY_CHECK_RETURN_ERROR(h_Fm, E_INVALID_HANDLE); 4417 SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE); 4418 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4419 4420 fpm_rg = p_Fm->p_FmFpmRegs; 4421 4422 /* error interrupts */ 4423 pending = fman_get_fpm_error_interrupts(fpm_rg); 4424 if (!pending) 4425 return ERROR_CODE(E_EMPTY); 4426 4427 if (pending & ERR_INTR_EN_BMI) 4428 BmiErrEvent(p_Fm); 4429 if (pending & ERR_INTR_EN_QMI) 4430 QmiErrEvent(p_Fm); 4431 if (pending & ERR_INTR_EN_FPM) 4432 FpmErrEvent(p_Fm); 4433 if (pending & ERR_INTR_EN_DMA) 4434 DmaErrEvent(p_Fm); 4435 if (pending & ERR_INTR_EN_IRAM) 4436 IramErrIntr(p_Fm); 4437 if (pending & ERR_INTR_EN_MURAM) 4438 MuramErrIntr(p_Fm); 4439 if (pending & ERR_INTR_EN_PRS) 4440 p_Fm->intrMng[e_FM_EV_ERR_PRS].f_Isr(p_Fm->intrMng[e_FM_EV_ERR_PRS].h_SrcHandle); 4441 if (pending & ERR_INTR_EN_PLCR) 4442 p_Fm->intrMng[e_FM_EV_ERR_PLCR].f_Isr(p_Fm->intrMng[e_FM_EV_ERR_PLCR].h_SrcHandle); 4443 if (pending & ERR_INTR_EN_KG) 4444 p_Fm->intrMng[e_FM_EV_ERR_KG].f_Isr(p_Fm->intrMng[e_FM_EV_ERR_KG].h_SrcHandle); 4445 4446 /* MAC events may belong to different partitions */ 4447 if (pending & ERR_INTR_EN_1G_MAC0) 4448 FM_M_CALL_1G_MAC_ERR_ISR(0); 4449 if (pending & ERR_INTR_EN_1G_MAC1) 4450 FM_M_CALL_1G_MAC_ERR_ISR(1); 4451 if (pending & ERR_INTR_EN_1G_MAC2) 4452 FM_M_CALL_1G_MAC_ERR_ISR(2); 4453 if (pending & ERR_INTR_EN_1G_MAC3) 4454 FM_M_CALL_1G_MAC_ERR_ISR(3); 4455 if (pending & ERR_INTR_EN_1G_MAC4) 4456 FM_M_CALL_1G_MAC_ERR_ISR(4); 4457 if (pending & ERR_INTR_EN_1G_MAC5) 4458 FM_M_CALL_1G_MAC_ERR_ISR(5); 4459 if (pending & ERR_INTR_EN_1G_MAC6) 4460 FM_M_CALL_1G_MAC_ERR_ISR(6); 4461 if (pending & ERR_INTR_EN_1G_MAC7) 4462 FM_M_CALL_1G_MAC_ERR_ISR(7); 4463 if (pending & ERR_INTR_EN_10G_MAC0) 4464 FM_M_CALL_10G_MAC_ERR_ISR(0); 4465 if (pending & ERR_INTR_EN_10G_MAC1) 4466 FM_M_CALL_10G_MAC_ERR_ISR(1); 4467 4468 #ifdef FM_MACSEC_SUPPORT 4469 if (pending & ERR_INTR_EN_MACSEC_MAC0) 4470 { 4471 if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_ERR_MACSEC_MAC0].guestId) 4472 SendIpcIsr(p_Fm, e_FM_EV_ERR_MACSEC_MAC0, pending); 4473 else 4474 p_Fm->intrMng[e_FM_EV_ERR_MACSEC_MAC0].f_Isr(p_Fm->intrMng[e_FM_EV_ERR_MACSEC_MAC0].h_SrcHandle); 4475 } 4476 #endif /* FM_MACSEC_SUPPORT */ 4477 4478 return E_OK; 4479 } 4480 4481 t_Error FM_SetPortsBandwidth(t_Handle h_Fm, t_FmPortsBandwidthParams *p_PortsBandwidth) 4482 { 4483 t_Fm *p_Fm = (t_Fm*)h_Fm; 4484 int i; 4485 uint8_t sum; 4486 uint8_t hardwarePortId; 4487 uint8_t weights[64]; 4488 uint8_t weight, maxPercent = 0; 4489 struct fman_bmi_regs *bmi_rg; 4490 4491 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4492 SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE); 4493 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4494 4495 bmi_rg = p_Fm->p_FmBmiRegs; 4496 4497 memset(weights, 0, (sizeof(uint8_t) * 64)); 4498 4499 /* check that all ports add up to 100% */ 4500 sum = 0; 4501 for (i=0; i < p_PortsBandwidth->numOfPorts; i++) 4502 sum +=p_PortsBandwidth->portsBandwidths[i].bandwidth; 4503 if (sum != 100) 4504 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Sum of ports bandwidth differ from 100%")); 4505 4506 /* find highest percent */ 4507 for (i=0; i < p_PortsBandwidth->numOfPorts; i++) 4508 { 4509 if (p_PortsBandwidth->portsBandwidths[i].bandwidth > maxPercent) 4510 maxPercent = p_PortsBandwidth->portsBandwidths[i].bandwidth; 4511 } 4512 4513 ASSERT_COND(maxPercent > 0); /* guaranteed by sum = 100 */ 4514 4515 /* calculate weight for each port */ 4516 for (i=0; i < p_PortsBandwidth->numOfPorts; i++) 4517 { 4518 weight = (uint8_t)((p_PortsBandwidth->portsBandwidths[i].bandwidth * PORT_MAX_WEIGHT ) / maxPercent); 4519 /* we want even division between 1-to-PORT_MAX_WEIGHT. so if exact division 4520 is not reached, we round up so that: 4521 0 until maxPercent/PORT_MAX_WEIGHT get "1" 4522 maxPercent/PORT_MAX_WEIGHT+1 until (maxPercent/PORT_MAX_WEIGHT)*2 get "2" 4523 ... 4524 maxPercent - maxPercent/PORT_MAX_WEIGHT until maxPercent get "PORT_MAX_WEIGHT: */ 4525 if ((uint8_t)((p_PortsBandwidth->portsBandwidths[i].bandwidth * PORT_MAX_WEIGHT ) % maxPercent)) 4526 weight++; 4527 4528 /* find the location of this port within the register */ 4529 hardwarePortId = 4530 SwPortIdToHwPortId(p_PortsBandwidth->portsBandwidths[i].type, 4531 p_PortsBandwidth->portsBandwidths[i].relativePortId, 4532 p_Fm->p_FmStateStruct->revInfo.majorRev, 4533 p_Fm->p_FmStateStruct->revInfo.minorRev); 4534 4535 ASSERT_COND(IN_RANGE(1, hardwarePortId, 63)); 4536 weights[hardwarePortId] = weight; 4537 } 4538 4539 fman_set_ports_bandwidth(bmi_rg, weights); 4540 4541 return E_OK; 4542 } 4543 4544 t_Error FM_EnableRamsEcc(t_Handle h_Fm) 4545 { 4546 t_Fm *p_Fm = (t_Fm*)h_Fm; 4547 struct fman_fpm_regs *fpm_rg; 4548 4549 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4550 4551 fpm_rg = p_Fm->p_FmFpmRegs; 4552 4553 if (p_Fm->guestId != NCSW_MASTER_ID) 4554 { 4555 t_FmIpcMsg msg; 4556 t_Error err; 4557 4558 memset(&msg, 0, sizeof(msg)); 4559 msg.msgId = FM_ENABLE_RAM_ECC; 4560 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 4561 (uint8_t*)&msg, 4562 sizeof(msg.msgId), 4563 NULL, 4564 NULL, 4565 NULL, 4566 NULL); 4567 if (err != E_OK) 4568 RETURN_ERROR(MINOR, err, NO_MSG); 4569 return E_OK; 4570 } 4571 4572 if (!p_Fm->p_FmStateStruct->internalCall) 4573 p_Fm->p_FmStateStruct->explicitEnable = TRUE; 4574 p_Fm->p_FmStateStruct->internalCall = FALSE; 4575 4576 if (p_Fm->p_FmStateStruct->ramsEccEnable) 4577 return E_OK; 4578 else 4579 { 4580 fman_enable_rams_ecc(fpm_rg); 4581 p_Fm->p_FmStateStruct->ramsEccEnable = TRUE; 4582 } 4583 4584 return E_OK; 4585 } 4586 4587 t_Error FM_DisableRamsEcc(t_Handle h_Fm) 4588 { 4589 t_Fm *p_Fm = (t_Fm*)h_Fm; 4590 bool explicitDisable = FALSE; 4591 struct fman_fpm_regs *fpm_rg; 4592 4593 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4594 SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_HANDLE); 4595 4596 fpm_rg = p_Fm->p_FmFpmRegs; 4597 4598 if (p_Fm->guestId != NCSW_MASTER_ID) 4599 { 4600 t_Error err; 4601 t_FmIpcMsg msg; 4602 4603 memset(&msg, 0, sizeof(msg)); 4604 msg.msgId = FM_DISABLE_RAM_ECC; 4605 if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 4606 (uint8_t*)&msg, 4607 sizeof(msg.msgId), 4608 NULL, 4609 NULL, 4610 NULL, 4611 NULL)) != E_OK) 4612 RETURN_ERROR(MINOR, err, NO_MSG); 4613 return E_OK; 4614 } 4615 4616 if (!p_Fm->p_FmStateStruct->internalCall) 4617 explicitDisable = TRUE; 4618 p_Fm->p_FmStateStruct->internalCall = FALSE; 4619 4620 /* if rams are already disabled, or if rams were explicitly enabled and are 4621 currently called indirectly (not explicitly), ignore this call. */ 4622 if (!p_Fm->p_FmStateStruct->ramsEccEnable || 4623 (p_Fm->p_FmStateStruct->explicitEnable && !explicitDisable)) 4624 return E_OK; 4625 else 4626 { 4627 if (p_Fm->p_FmStateStruct->explicitEnable) 4628 /* This is the case were both explicit are TRUE. 4629 Turn off this flag for cases were following ramsEnable 4630 routines are called */ 4631 p_Fm->p_FmStateStruct->explicitEnable = FALSE; 4632 4633 fman_enable_rams_ecc(fpm_rg); 4634 p_Fm->p_FmStateStruct->ramsEccEnable = FALSE; 4635 } 4636 4637 return E_OK; 4638 } 4639 4640 t_Error FM_SetException(t_Handle h_Fm, e_FmExceptions exception, bool enable) 4641 { 4642 t_Fm *p_Fm = (t_Fm*)h_Fm; 4643 uint32_t bitMask = 0; 4644 enum fman_exceptions fslException; 4645 struct fman_rg fman_rg; 4646 4647 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4648 SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE); 4649 4650 fman_rg.bmi_rg = p_Fm->p_FmBmiRegs; 4651 fman_rg.qmi_rg = p_Fm->p_FmQmiRegs; 4652 fman_rg.fpm_rg = p_Fm->p_FmFpmRegs; 4653 fman_rg.dma_rg = p_Fm->p_FmDmaRegs; 4654 4655 GET_EXCEPTION_FLAG(bitMask, exception); 4656 if (bitMask) 4657 { 4658 if (enable) 4659 p_Fm->p_FmStateStruct->exceptions |= bitMask; 4660 else 4661 p_Fm->p_FmStateStruct->exceptions &= ~bitMask; 4662 4663 fslException = FmanExceptionTrans(exception); 4664 4665 return (t_Error)fman_set_exception(&fman_rg, 4666 fslException, 4667 enable); 4668 } 4669 else 4670 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception")); 4671 4672 return E_OK; 4673 } 4674 4675 t_Error FM_GetRevision(t_Handle h_Fm, t_FmRevisionInfo *p_FmRevisionInfo) 4676 { 4677 t_Fm *p_Fm = (t_Fm*)h_Fm; 4678 4679 p_FmRevisionInfo->majorRev = p_Fm->p_FmStateStruct->revInfo.majorRev; 4680 p_FmRevisionInfo->minorRev = p_Fm->p_FmStateStruct->revInfo.minorRev; 4681 4682 return E_OK; 4683 } 4684 4685 t_Error FM_GetFmanCtrlCodeRevision(t_Handle h_Fm, t_FmCtrlCodeRevisionInfo *p_RevisionInfo) 4686 { 4687 t_Fm *p_Fm = (t_Fm*)h_Fm; 4688 t_FMIramRegs *p_Iram; 4689 uint32_t revInfo; 4690 4691 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4692 SANITY_CHECK_RETURN_ERROR(p_RevisionInfo, E_NULL_POINTER); 4693 4694 if ((p_Fm->guestId != NCSW_MASTER_ID) && 4695 p_Fm->h_IpcSessions[0]) 4696 { 4697 t_Error err; 4698 t_FmIpcMsg msg; 4699 t_FmIpcReply reply; 4700 uint32_t replyLength; 4701 t_FmIpcFmanCtrlCodeRevisionInfo ipcRevInfo; 4702 4703 memset(&msg, 0, sizeof(msg)); 4704 memset(&reply, 0, sizeof(reply)); 4705 msg.msgId = FM_GET_FMAN_CTRL_CODE_REV; 4706 replyLength = sizeof(uint32_t) + sizeof(t_FmCtrlCodeRevisionInfo); 4707 if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 4708 (uint8_t*)&msg, 4709 sizeof(msg.msgId), 4710 (uint8_t*)&reply, 4711 &replyLength, 4712 NULL, 4713 NULL)) != E_OK) 4714 RETURN_ERROR(MINOR, err, NO_MSG); 4715 if (replyLength != (sizeof(uint32_t) + sizeof(t_FmCtrlCodeRevisionInfo))) 4716 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 4717 memcpy((uint8_t*)&ipcRevInfo, reply.replyBody, sizeof(t_FmCtrlCodeRevisionInfo)); 4718 p_RevisionInfo->packageRev = ipcRevInfo.packageRev; 4719 p_RevisionInfo->majorRev = ipcRevInfo.majorRev; 4720 p_RevisionInfo->minorRev = ipcRevInfo.minorRev; 4721 return (t_Error)(reply.error); 4722 } 4723 else if (p_Fm->guestId != NCSW_MASTER_ID) 4724 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, 4725 ("running in guest-mode without IPC!")); 4726 4727 p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM); 4728 WRITE_UINT32(p_Iram->iadd, 0x4); 4729 while (GET_UINT32(p_Iram->iadd) != 0x4) ; 4730 revInfo = GET_UINT32(p_Iram->idata); 4731 p_RevisionInfo->packageRev = (uint16_t)((revInfo & 0xFFFF0000) >> 16); 4732 p_RevisionInfo->majorRev = (uint8_t)((revInfo & 0x0000FF00) >> 8); 4733 p_RevisionInfo->minorRev = (uint8_t)(revInfo & 0x000000FF); 4734 4735 return E_OK; 4736 } 4737 4738 uint32_t FM_GetCounter(t_Handle h_Fm, e_FmCounters counter) 4739 { 4740 t_Fm *p_Fm = (t_Fm*)h_Fm; 4741 t_Error err; 4742 uint32_t counterValue; 4743 struct fman_rg fman_rg; 4744 enum fman_counters fsl_counter; 4745 4746 SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0); 4747 SANITY_CHECK_RETURN_VALUE(!p_Fm->p_FmDriverParam, E_INVALID_STATE, 0); 4748 4749 fman_rg.bmi_rg = p_Fm->p_FmBmiRegs; 4750 fman_rg.qmi_rg = p_Fm->p_FmQmiRegs; 4751 fman_rg.fpm_rg = p_Fm->p_FmFpmRegs; 4752 fman_rg.dma_rg = p_Fm->p_FmDmaRegs; 4753 4754 if ((p_Fm->guestId != NCSW_MASTER_ID) && 4755 !p_Fm->baseAddr && 4756 p_Fm->h_IpcSessions[0]) 4757 { 4758 t_FmIpcMsg msg; 4759 t_FmIpcReply reply; 4760 uint32_t replyLength, outCounter; 4761 4762 memset(&msg, 0, sizeof(msg)); 4763 memset(&reply, 0, sizeof(reply)); 4764 msg.msgId = FM_GET_COUNTER; 4765 memcpy(msg.msgBody, (uint8_t *)&counter, sizeof(uint32_t)); 4766 replyLength = sizeof(uint32_t) + sizeof(uint32_t); 4767 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 4768 (uint8_t*)&msg, 4769 sizeof(msg.msgId) +sizeof(counterValue), 4770 (uint8_t*)&reply, 4771 &replyLength, 4772 NULL, 4773 NULL); 4774 if (err != E_OK) 4775 { 4776 REPORT_ERROR(MAJOR, err, NO_MSG); 4777 return 0; 4778 } 4779 if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t))) 4780 { 4781 REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 4782 return 0; 4783 } 4784 4785 memcpy((uint8_t*)&outCounter, reply.replyBody, sizeof(uint32_t)); 4786 return outCounter; 4787 } 4788 else if (!p_Fm->baseAddr) 4789 { 4790 REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Either IPC or 'baseAddress' is required!")); 4791 return 0; 4792 } 4793 4794 /* When applicable (when there is an 'enable counters' bit, 4795 check that counters are enabled */ 4796 switch (counter) 4797 { 4798 case (e_FM_COUNTERS_DEQ_1): 4799 case (e_FM_COUNTERS_DEQ_2): 4800 case (e_FM_COUNTERS_DEQ_3): 4801 if ((p_Fm->p_FmStateStruct->revInfo.majorRev == 4) || 4802 (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)) 4803 { 4804 REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Requested counter not supported")); 4805 return 0; 4806 } 4807 case (e_FM_COUNTERS_ENQ_TOTAL_FRAME): 4808 case (e_FM_COUNTERS_DEQ_TOTAL_FRAME): 4809 case (e_FM_COUNTERS_DEQ_0): 4810 case (e_FM_COUNTERS_DEQ_FROM_DEFAULT): 4811 case (e_FM_COUNTERS_DEQ_FROM_CONTEXT): 4812 case (e_FM_COUNTERS_DEQ_FROM_FD): 4813 case (e_FM_COUNTERS_DEQ_CONFIRM): 4814 if (!(GET_UINT32(p_Fm->p_FmQmiRegs->fmqm_gc) & QMI_CFG_EN_COUNTERS)) 4815 { 4816 REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Requested counter was not enabled")); 4817 return 0; 4818 } 4819 break; 4820 default: 4821 break; 4822 } 4823 4824 FMAN_COUNTERS_TRANS(fsl_counter, counter); 4825 return fman_get_counter(&fman_rg, fsl_counter); 4826 } 4827 4828 t_Error FM_ModifyCounter(t_Handle h_Fm, e_FmCounters counter, uint32_t val) 4829 { 4830 t_Fm *p_Fm = (t_Fm*)h_Fm; 4831 struct fman_rg fman_rg; 4832 enum fman_counters fsl_counter; 4833 4834 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4835 SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE); 4836 4837 fman_rg.bmi_rg = p_Fm->p_FmBmiRegs; 4838 fman_rg.qmi_rg = p_Fm->p_FmQmiRegs; 4839 fman_rg.fpm_rg = p_Fm->p_FmFpmRegs; 4840 fman_rg.dma_rg = p_Fm->p_FmDmaRegs; 4841 4842 FMAN_COUNTERS_TRANS(fsl_counter, counter); 4843 return (t_Error)fman_modify_counter(&fman_rg, fsl_counter, val); 4844 } 4845 4846 void FM_SetDmaEmergency(t_Handle h_Fm, e_FmDmaMuramPort muramPort, bool enable) 4847 { 4848 t_Fm *p_Fm = (t_Fm*)h_Fm; 4849 struct fman_dma_regs *dma_rg; 4850 4851 SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE); 4852 SANITY_CHECK_RETURN(!p_Fm->p_FmDriverParam, E_INVALID_STATE); 4853 4854 dma_rg = p_Fm->p_FmDmaRegs; 4855 4856 fman_set_dma_emergency(dma_rg, !!(muramPort==e_FM_DMA_MURAM_PORT_WRITE), enable); 4857 } 4858 4859 void FM_SetDmaExtBusPri(t_Handle h_Fm, e_FmDmaExtBusPri pri) 4860 { 4861 t_Fm *p_Fm = (t_Fm*)h_Fm; 4862 struct fman_dma_regs *dma_rg; 4863 4864 SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE); 4865 SANITY_CHECK_RETURN(!p_Fm->p_FmDriverParam, E_INVALID_STATE); 4866 4867 dma_rg = p_Fm->p_FmDmaRegs; 4868 4869 fman_set_dma_ext_bus_pri(dma_rg, pri); 4870 } 4871 4872 void FM_GetDmaStatus(t_Handle h_Fm, t_FmDmaStatus *p_FmDmaStatus) 4873 { 4874 t_Fm *p_Fm = (t_Fm*)h_Fm; 4875 uint32_t dmaStatus; 4876 struct fman_dma_regs *dma_rg; 4877 4878 SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE); 4879 SANITY_CHECK_RETURN(!p_Fm->p_FmDriverParam, E_INVALID_STATE); 4880 4881 dma_rg = p_Fm->p_FmDmaRegs; 4882 4883 if ((p_Fm->guestId != NCSW_MASTER_ID) && 4884 !p_Fm->baseAddr && 4885 p_Fm->h_IpcSessions[0]) 4886 { 4887 t_FmIpcDmaStatus ipcDmaStatus; 4888 t_FmIpcMsg msg; 4889 t_FmIpcReply reply; 4890 t_Error err; 4891 uint32_t replyLength; 4892 4893 memset(&msg, 0, sizeof(msg)); 4894 memset(&reply, 0, sizeof(reply)); 4895 msg.msgId = FM_DMA_STAT; 4896 replyLength = sizeof(uint32_t) + sizeof(t_FmIpcDmaStatus); 4897 err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0], 4898 (uint8_t*)&msg, 4899 sizeof(msg.msgId), 4900 (uint8_t*)&reply, 4901 &replyLength, 4902 NULL, 4903 NULL); 4904 if (err != E_OK) 4905 { 4906 REPORT_ERROR(MINOR, err, NO_MSG); 4907 return; 4908 } 4909 if (replyLength != (sizeof(uint32_t) + sizeof(t_FmIpcDmaStatus))) 4910 { 4911 REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 4912 return; 4913 } 4914 memcpy((uint8_t*)&ipcDmaStatus, reply.replyBody, sizeof(t_FmIpcDmaStatus)); 4915 4916 p_FmDmaStatus->cmqNotEmpty = (bool)ipcDmaStatus.boolCmqNotEmpty; /**< Command queue is not empty */ 4917 p_FmDmaStatus->busError = (bool)ipcDmaStatus.boolBusError; /**< Bus error occurred */ 4918 p_FmDmaStatus->readBufEccError = (bool)ipcDmaStatus.boolReadBufEccError; /**< Double ECC error on buffer Read */ 4919 p_FmDmaStatus->writeBufEccSysError =(bool)ipcDmaStatus.boolWriteBufEccSysError; /**< Double ECC error on buffer write from system side */ 4920 p_FmDmaStatus->writeBufEccFmError = (bool)ipcDmaStatus.boolWriteBufEccFmError; /**< Double ECC error on buffer write from FM side */ 4921 p_FmDmaStatus->singlePortEccError = (bool)ipcDmaStatus.boolSinglePortEccError; /**< Double ECC error on buffer write from FM side */ 4922 return; 4923 } 4924 else if (!p_Fm->baseAddr) 4925 { 4926 REPORT_ERROR(MINOR, E_NOT_SUPPORTED, 4927 ("Either IPC or 'baseAddress' is required!")); 4928 return; 4929 } 4930 4931 dmaStatus = fman_get_dma_status(dma_rg); 4932 4933 p_FmDmaStatus->cmqNotEmpty = (bool)(dmaStatus & DMA_STATUS_CMD_QUEUE_NOT_EMPTY); 4934 p_FmDmaStatus->busError = (bool)(dmaStatus & DMA_STATUS_BUS_ERR); 4935 if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6) 4936 p_FmDmaStatus->singlePortEccError = (bool)(dmaStatus & DMA_STATUS_FM_SPDAT_ECC); 4937 else 4938 { 4939 p_FmDmaStatus->readBufEccError = (bool)(dmaStatus & DMA_STATUS_READ_ECC); 4940 p_FmDmaStatus->writeBufEccSysError = (bool)(dmaStatus & DMA_STATUS_SYSTEM_WRITE_ECC); 4941 p_FmDmaStatus->writeBufEccFmError = (bool)(dmaStatus & DMA_STATUS_FM_WRITE_ECC); 4942 } 4943 } 4944 4945 void FM_Resume(t_Handle h_Fm) 4946 { 4947 t_Fm *p_Fm = (t_Fm*)h_Fm; 4948 struct fman_fpm_regs *fpm_rg; 4949 4950 SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE); 4951 SANITY_CHECK_RETURN(!p_Fm->p_FmDriverParam, E_INVALID_STATE); 4952 SANITY_CHECK_RETURN((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 4953 4954 fpm_rg = p_Fm->p_FmFpmRegs; 4955 4956 fman_resume(fpm_rg); 4957 } 4958 4959 t_Error FM_GetSpecialOperationCoding(t_Handle h_Fm, 4960 fmSpecialOperations_t spOper, 4961 uint8_t *p_SpOperCoding) 4962 { 4963 t_Fm *p_Fm = (t_Fm*)h_Fm; 4964 t_FmCtrlCodeRevisionInfo revInfo; 4965 t_Error err; 4966 4967 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 4968 SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE); 4969 SANITY_CHECK_RETURN_ERROR(p_SpOperCoding, E_NULL_POINTER); 4970 4971 if (!spOper) 4972 { 4973 *p_SpOperCoding = 0; 4974 return E_OK; 4975 } 4976 4977 if ((err = FM_GetFmanCtrlCodeRevision(p_Fm, &revInfo)) != E_OK) 4978 { 4979 DBG(WARNING, ("FM in guest-mode without IPC, can't validate firmware revision.")); 4980 revInfo.packageRev = IP_OFFLOAD_PACKAGE_NUMBER; 4981 } 4982 else if (!IS_OFFLOAD_PACKAGE(revInfo.packageRev)) 4983 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Fman ctrl code package")); 4984 4985 switch (spOper) 4986 { 4987 case (FM_SP_OP_CAPWAP_DTLS_DEC): 4988 *p_SpOperCoding = 9; 4989 break; 4990 case (FM_SP_OP_CAPWAP_DTLS_ENC): 4991 *p_SpOperCoding = 10; 4992 break; 4993 case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_UPDATE_UDP_LEN|FM_SP_OP_IPSEC_MANIP): 4994 case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_UPDATE_UDP_LEN|FM_SP_OP_IPSEC_MANIP|FM_SP_OP_RPD): 4995 *p_SpOperCoding = 5; 4996 break; 4997 case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_MANIP): 4998 case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_MANIP|FM_SP_OP_RPD): 4999 *p_SpOperCoding = 6; 5000 break; 5001 case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_UPDATE_UDP_LEN|FM_SP_OP_RPD): 5002 *p_SpOperCoding = 3; 5003 break; 5004 case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_UPDATE_UDP_LEN): 5005 *p_SpOperCoding = 1; 5006 break; 5007 case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_UPDATE_UDP_LEN|FM_SP_OP_IPSEC_NO_ETH_HDR): 5008 *p_SpOperCoding = 12; 5009 break; 5010 case (FM_SP_OP_IPSEC|FM_SP_OP_RPD): 5011 *p_SpOperCoding = 4; 5012 break; 5013 case (FM_SP_OP_IPSEC): 5014 *p_SpOperCoding = 2; 5015 break; 5016 case (FM_SP_OP_DCL4C): 5017 *p_SpOperCoding = 7; 5018 break; 5019 case (FM_SP_OP_CLEAR_RPD): 5020 *p_SpOperCoding = 8; 5021 break; 5022 default: 5023 RETURN_ERROR(MINOR, E_INVALID_VALUE, NO_MSG); 5024 } 5025 5026 return E_OK; 5027 } 5028 5029 t_Error FM_CtrlMonStart(t_Handle h_Fm) 5030 { 5031 t_Fm *p_Fm = (t_Fm *)h_Fm; 5032 t_FmTrbRegs *p_MonRegs; 5033 uint8_t i; 5034 5035 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 5036 SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE); 5037 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 5038 5039 WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc, 5040 GET_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc) | FPM_BRKC_RDBG); 5041 5042 for (i = 0; i < FM_NUM_OF_CTRL; i++) 5043 { 5044 p_MonRegs = (t_FmTrbRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_TRB(i)); 5045 5046 /* Reset control registers */ 5047 WRITE_UINT32(p_MonRegs->tcrh, TRB_TCRH_RESET); 5048 WRITE_UINT32(p_MonRegs->tcrl, TRB_TCRL_RESET); 5049 5050 /* Configure: counter #1 counts all stalls in risc - ldsched stall 5051 counter #2 counts all stalls in risc - other stall*/ 5052 WRITE_UINT32(p_MonRegs->tcrl, TRB_TCRL_RESET | TRB_TCRL_UTIL); 5053 5054 /* Enable monitoring */ 5055 WRITE_UINT32(p_MonRegs->tcrh, TRB_TCRH_ENABLE_COUNTERS); 5056 } 5057 5058 return E_OK; 5059 } 5060 5061 t_Error FM_CtrlMonStop(t_Handle h_Fm) 5062 { 5063 t_Fm *p_Fm = (t_Fm *)h_Fm; 5064 t_FmTrbRegs *p_MonRegs; 5065 uint8_t i; 5066 5067 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 5068 SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE); 5069 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 5070 5071 for (i = 0; i < FM_NUM_OF_CTRL; i++) 5072 { 5073 p_MonRegs = (t_FmTrbRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_TRB(i)); 5074 WRITE_UINT32(p_MonRegs->tcrh, TRB_TCRH_DISABLE_COUNTERS); 5075 } 5076 5077 WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc, 5078 GET_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc) & ~FPM_BRKC_RDBG); 5079 5080 return E_OK; 5081 } 5082 5083 t_Error FM_CtrlMonGetCounters(t_Handle h_Fm, uint8_t fmCtrlIndex, t_FmCtrlMon *p_Mon) 5084 { 5085 t_Fm *p_Fm = (t_Fm *)h_Fm; 5086 t_FmTrbRegs *p_MonRegs; 5087 uint64_t clkCnt, utilValue, effValue; 5088 5089 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 5090 SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE); 5091 SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED); 5092 SANITY_CHECK_RETURN_ERROR(p_Mon, E_NULL_POINTER); 5093 5094 if (fmCtrlIndex >= FM_NUM_OF_CTRL) 5095 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("FM Controller index")); 5096 5097 p_MonRegs = (t_FmTrbRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_TRB(fmCtrlIndex)); 5098 5099 clkCnt = (uint64_t) 5100 ((uint64_t)GET_UINT32(p_MonRegs->tpcch) << 32 | GET_UINT32(p_MonRegs->tpccl)); 5101 5102 utilValue = (uint64_t) 5103 ((uint64_t)GET_UINT32(p_MonRegs->tpc1h) << 32 | GET_UINT32(p_MonRegs->tpc1l)); 5104 5105 effValue = (uint64_t) 5106 ((uint64_t)GET_UINT32(p_MonRegs->tpc2h) << 32 | GET_UINT32(p_MonRegs->tpc2l)); 5107 5108 p_Mon->percentCnt[0] = (uint8_t)(((clkCnt - utilValue) * 100) / clkCnt); 5109 if (clkCnt != utilValue) 5110 p_Mon->percentCnt[1] = (uint8_t)((((clkCnt - utilValue) - effValue) * 100) / (clkCnt - utilValue)); 5111 else 5112 p_Mon->percentCnt[1] = 0; 5113 5114 return E_OK; 5115 } 5116 5117 t_Handle FM_GetMuramHandle(t_Handle h_Fm) 5118 { 5119 t_Fm *p_Fm = (t_Fm*)h_Fm; 5120 5121 SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, NULL); 5122 5123 return (p_Fm->h_FmMuram); 5124 } 5125 5126 /****************************************************/ 5127 /* Hidden-DEBUG Only API */ 5128 /****************************************************/ 5129 t_Error FM_ForceIntr (t_Handle h_Fm, e_FmExceptions exception) 5130 { 5131 t_Fm *p_Fm = (t_Fm*)h_Fm; 5132 enum fman_exceptions fslException; 5133 struct fman_rg fman_rg; 5134 5135 SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE); 5136 SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE); 5137 5138 fman_rg.bmi_rg = p_Fm->p_FmBmiRegs; 5139 fman_rg.qmi_rg = p_Fm->p_FmQmiRegs; 5140 fman_rg.fpm_rg = p_Fm->p_FmFpmRegs; 5141 fman_rg.dma_rg = p_Fm->p_FmDmaRegs; 5142 5143 switch (exception) 5144 { 5145 case e_FM_EX_QMI_DEQ_FROM_UNKNOWN_PORTID: 5146 if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_QMI_DEQ_FROM_UNKNOWN_PORTID)) 5147 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked")); 5148 break; 5149 case e_FM_EX_QMI_SINGLE_ECC: 5150 if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6) 5151 RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("e_FM_EX_QMI_SINGLE_ECC not supported on this integration.")); 5152 5153 if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_QMI_SINGLE_ECC)) 5154 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked")); 5155 break; 5156 case e_FM_EX_QMI_DOUBLE_ECC: 5157 if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_QMI_DOUBLE_ECC)) 5158 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked")); 5159 break; 5160 case e_FM_EX_BMI_LIST_RAM_ECC: 5161 if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_BMI_LIST_RAM_ECC)) 5162 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked")); 5163 break; 5164 case e_FM_EX_BMI_STORAGE_PROFILE_ECC: 5165 if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_BMI_STORAGE_PROFILE_ECC)) 5166 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked")); 5167 break; 5168 case e_FM_EX_BMI_STATISTICS_RAM_ECC: 5169 if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_BMI_STATISTICS_RAM_ECC)) 5170 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked")); 5171 break; 5172 case e_FM_EX_BMI_DISPATCH_RAM_ECC: 5173 if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_BMI_DISPATCH_RAM_ECC)) 5174 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked")); 5175 break; 5176 default: 5177 RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception may not be forced")); 5178 } 5179 5180 fslException = FmanExceptionTrans(exception); 5181 fman_force_intr (&fman_rg, fslException); 5182 5183 return E_OK; 5184 } 5185 5186 t_Handle FmGetPcd(t_Handle h_Fm) 5187 { 5188 return ((t_Fm*)h_Fm)->h_Pcd; 5189 } 5190 #if (DPAA_VERSION >= 11) 5191 extern void *g_MemacRegs; 5192 void fm_clk_down(void); 5193 uint32_t fman_memac_get_event(void *regs, uint32_t ev_mask); 5194 void FM_ChangeClock(t_Handle h_Fm, int hardwarePortId) 5195 { 5196 int macId; 5197 uint32_t event, rcr; 5198 t_Fm *p_Fm = (t_Fm*)h_Fm; 5199 rcr = GET_UINT32(p_Fm->p_FmFpmRegs->fm_rcr); 5200 rcr |= 0x04000000; 5201 WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_rcr, rcr); 5202 5203 HW_PORT_ID_TO_SW_PORT_ID(macId, hardwarePortId); 5204 do 5205 { 5206 event = fman_memac_get_event(g_MemacRegs, 0xFFFFFFFF); 5207 } while ((event & 0x00000020) == 0); 5208 fm_clk_down(); 5209 rcr = GET_UINT32(p_Fm->p_FmFpmRegs->fm_rcr); 5210 rcr &= ~0x04000000; 5211 WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_rcr, rcr); 5212 } 5213 #endif 5214