Path: blob/main/sys/contrib/ncsw/Peripherals/FM/fm_ncsw.c
48378 views
/*1* Copyright 2008-2012 Freescale Semiconductor Inc.2*3* Redistribution and use in source and binary forms, with or without4* modification, are permitted provided that the following conditions are met:5* * Redistributions of source code must retain the above copyright6* notice, this list of conditions and the following disclaimer.7* * Redistributions in binary form must reproduce the above copyright8* notice, this list of conditions and the following disclaimer in the9* documentation and/or other materials provided with the distribution.10* * Neither the name of Freescale Semiconductor nor the11* names of its contributors may be used to endorse or promote products12* derived from this software without specific prior written permission.13*14*15* ALTERNATIVELY, this software may be distributed under the terms of the16* GNU General Public License ("GPL") as published by the Free Software17* Foundation, either version 2 of that License or (at your option) any18* later version.19*20* THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY21* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED22* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE23* DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY24* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES25* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;26* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND27* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT28* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS29* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.30*/313233/******************************************************************************34@File fm.c3536@Description FM driver routines implementation.37*//***************************************************************************/38#include "std_ext.h"39#include "error_ext.h"40#include "xx_ext.h"41#include "string_ext.h"42#include "sprint_ext.h"43#include "debug_ext.h"44#include "fm_muram_ext.h"45#include <linux/math64.h>4647#include "fm_common.h"48#include "fm_ipc.h"49#include "fm.h"50#include "fsl_fman.h"515253/****************************************/54/* static functions */55/****************************************/5657static volatile bool blockingFlag = FALSE;58static void IpcMsgCompletionCB(t_Handle h_Fm,59uint8_t *p_Msg,60uint8_t *p_Reply,61uint32_t replyLength,62t_Error status)63{64UNUSED(h_Fm);UNUSED(p_Msg);UNUSED(p_Reply);UNUSED(replyLength);UNUSED(status);65blockingFlag = FALSE;66}6768static void FreeInitResources(t_Fm *p_Fm)69{70if (p_Fm->camBaseAddr)71FM_MURAM_FreeMem(p_Fm->h_FmMuram, UINT_TO_PTR(p_Fm->camBaseAddr));72if (p_Fm->fifoBaseAddr)73FM_MURAM_FreeMem(p_Fm->h_FmMuram, UINT_TO_PTR(p_Fm->fifoBaseAddr));74if (p_Fm->resAddr)75FM_MURAM_FreeMem(p_Fm->h_FmMuram, UINT_TO_PTR(p_Fm->resAddr));76}7778static bool IsFmanCtrlCodeLoaded(t_Fm *p_Fm)79{80t_FMIramRegs *p_Iram;8182ASSERT_COND(p_Fm);83p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM);8485return (bool)!!(GET_UINT32(p_Iram->iready) & IRAM_READY);86}8788static t_Error CheckFmParameters(t_Fm *p_Fm)89{90if (IsFmanCtrlCodeLoaded(p_Fm) && !p_Fm->resetOnInit)91RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Old FMan CTRL code is loaded; FM must be reset!"));92#if (DPAA_VERSION < 11)93if (!p_Fm->p_FmDriverParam->dma_axi_dbg_num_of_beats ||94(p_Fm->p_FmDriverParam->dma_axi_dbg_num_of_beats > DMA_MODE_MAX_AXI_DBG_NUM_OF_BEATS))95RETURN_ERROR(MAJOR, E_INVALID_VALUE,96("axiDbgNumOfBeats has to be in the range 1 - %d", DMA_MODE_MAX_AXI_DBG_NUM_OF_BEATS));97#endif /* (DPAA_VERSION < 11) */98if (p_Fm->p_FmDriverParam->dma_cam_num_of_entries % DMA_CAM_UNITS)99RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_cam_num_of_entries has to be divisble by %d", DMA_CAM_UNITS));100// 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))101// 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));102if (p_Fm->p_FmDriverParam->dma_comm_qtsh_asrt_emer > DMA_THRESH_MAX_COMMQ)103RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_comm_qtsh_asrt_emer can not be larger than %d", DMA_THRESH_MAX_COMMQ));104if (p_Fm->p_FmDriverParam->dma_comm_qtsh_clr_emer > DMA_THRESH_MAX_COMMQ)105RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_comm_qtsh_clr_emer can not be larger than %d", DMA_THRESH_MAX_COMMQ));106if (p_Fm->p_FmDriverParam->dma_comm_qtsh_clr_emer >= p_Fm->p_FmDriverParam->dma_comm_qtsh_asrt_emer)107RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_comm_qtsh_clr_emer must be smaller than dma_comm_qtsh_asrt_emer"));108#if (DPAA_VERSION < 11)109if (p_Fm->p_FmDriverParam->dma_read_buf_tsh_asrt_emer > DMA_THRESH_MAX_BUF)110RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_read_buf_tsh_asrt_emer can not be larger than %d", DMA_THRESH_MAX_BUF));111if (p_Fm->p_FmDriverParam->dma_read_buf_tsh_clr_emer > DMA_THRESH_MAX_BUF)112RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_read_buf_tsh_clr_emer can not be larger than %d", DMA_THRESH_MAX_BUF));113if (p_Fm->p_FmDriverParam->dma_read_buf_tsh_clr_emer >= p_Fm->p_FmDriverParam->dma_read_buf_tsh_asrt_emer)114RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_read_buf_tsh_clr_emer must be smaller than dma_read_buf_tsh_asrt_emer"));115if (p_Fm->p_FmDriverParam->dma_write_buf_tsh_asrt_emer > DMA_THRESH_MAX_BUF)116RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_write_buf_tsh_asrt_emer can not be larger than %d", DMA_THRESH_MAX_BUF));117if (p_Fm->p_FmDriverParam->dma_write_buf_tsh_clr_emer > DMA_THRESH_MAX_BUF)118RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_write_buf_tsh_clr_emer can not be larger than %d", DMA_THRESH_MAX_BUF));119if (p_Fm->p_FmDriverParam->dma_write_buf_tsh_clr_emer >= p_Fm->p_FmDriverParam->dma_write_buf_tsh_asrt_emer)120RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_write_buf_tsh_clr_emer must be smaller than dma_write_buf_tsh_asrt_emer"));121#else /* (DPAA_VERSION >= 11) */122if ((p_Fm->p_FmDriverParam->dma_dbg_cnt_mode == E_FMAN_DMA_DBG_CNT_INT_READ_EM)||123(p_Fm->p_FmDriverParam->dma_dbg_cnt_mode == E_FMAN_DMA_DBG_CNT_INT_WRITE_EM) ||124(p_Fm->p_FmDriverParam->dma_dbg_cnt_mode == E_FMAN_DMA_DBG_CNT_RAW_WAR_PROT))125RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_dbg_cnt_mode value not supported by this integration."));126if ((p_Fm->p_FmDriverParam->dma_emergency_bus_select == FM_DMA_MURAM_READ_EMERGENCY)||127(p_Fm->p_FmDriverParam->dma_emergency_bus_select == FM_DMA_MURAM_WRITE_EMERGENCY))128RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("emergencyBusSelect value not supported by this integration."));129if (p_Fm->p_FmDriverParam->dma_stop_on_bus_error)130RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_stop_on_bus_error not supported by this integration."));131#ifdef FM_AID_MODE_NO_TNUM_SW005132if (p_Fm->p_FmDriverParam->dma_aid_mode != E_FMAN_DMA_AID_OUT_PORT_ID)133RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_aid_mode not supported by this integration."));134#endif /* FM_AID_MODE_NO_TNUM_SW005 */135if (p_Fm->p_FmDriverParam->dma_axi_dbg_num_of_beats)136RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("dma_axi_dbg_num_of_beats not supported by this integration."));137#endif /* (DPAA_VERSION < 11) */138139if (!p_Fm->p_FmStateStruct->fmClkFreq)140RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("fmClkFreq must be set."));141if (USEC_TO_CLK(p_Fm->p_FmDriverParam->dma_watchdog, p_Fm->p_FmStateStruct->fmClkFreq) > DMA_MAX_WATCHDOG)142RETURN_ERROR(MAJOR, E_INVALID_VALUE,143("dma_watchdog depends on FM clock. dma_watchdog(in microseconds) * clk (in Mhz), may not exceed 0x08x", DMA_MAX_WATCHDOG));144145#if (DPAA_VERSION >= 11)146if ((p_Fm->partVSPBase + p_Fm->partNumOfVSPs) > FM_VSP_MAX_NUM_OF_ENTRIES)147RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("partVSPBase+partNumOfVSPs out of range!!!"));148#endif /* (DPAA_VERSION >= 11) */149150if (p_Fm->p_FmStateStruct->totalFifoSize % BMI_FIFO_UNITS)151RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("totalFifoSize number has to be divisible by %d", BMI_FIFO_UNITS));152if (!p_Fm->p_FmStateStruct->totalFifoSize ||153(p_Fm->p_FmStateStruct->totalFifoSize > BMI_MAX_FIFO_SIZE))154RETURN_ERROR(MAJOR, E_INVALID_VALUE,155("totalFifoSize (currently defined as %d) has to be in the range of 256 to %d",156p_Fm->p_FmStateStruct->totalFifoSize,157BMI_MAX_FIFO_SIZE));158if (!p_Fm->p_FmStateStruct->totalNumOfTasks ||159(p_Fm->p_FmStateStruct->totalNumOfTasks > BMI_MAX_NUM_OF_TASKS))160RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("totalNumOfTasks number has to be in the range 1 - %d", BMI_MAX_NUM_OF_TASKS));161162#ifdef FM_HAS_TOTAL_DMAS163if (!p_Fm->p_FmStateStruct->maxNumOfOpenDmas ||164(p_Fm->p_FmStateStruct->maxNumOfOpenDmas > BMI_MAX_NUM_OF_DMAS))165RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("maxNumOfOpenDmas number has to be in the range 1 - %d", BMI_MAX_NUM_OF_DMAS));166#endif /* FM_HAS_TOTAL_DMAS */167168if (p_Fm->p_FmDriverParam->disp_limit_tsh > FPM_MAX_DISP_LIMIT)169RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("disp_limit_tsh can't be greater than %d", FPM_MAX_DISP_LIMIT));170171if (!p_Fm->f_Exception)172RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Exceptions callback not provided"));173if (!p_Fm->f_BusError)174RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Exceptions callback not provided"));175176#ifdef FM_NO_WATCHDOG177if ((p_Fm->p_FmStateStruct->revInfo.majorRev == 2) &&178(p_Fm->p_FmDriverParam->dma_watchdog))179RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("watchdog!"));180#endif /* FM_NO_WATCHDOG */181182#ifdef FM_ECC_HALT_NO_SYNC_ERRATA_10GMAC_A008183if ((p_Fm->p_FmStateStruct->revInfo.majorRev < 6) &&184(p_Fm->p_FmDriverParam->halt_on_unrecov_ecc_err))185RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("HaltOnEccError!"));186#endif /* FM_ECC_HALT_NO_SYNC_ERRATA_10GMAC_A008 */187188#ifdef FM_NO_TNUM_AGING189if ((p_Fm->p_FmStateStruct->revInfo.majorRev != 4) &&190(p_Fm->p_FmStateStruct->revInfo.majorRev < 6))191if (p_Fm->p_FmDriverParam->tnum_aging_period)192RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("Tnum aging!"));193#endif /* FM_NO_TNUM_AGING */194195/* check that user did not set revision-dependent exceptions */196#ifdef FM_NO_DISPATCH_RAM_ECC197if ((p_Fm->p_FmStateStruct->revInfo.majorRev != 4) &&198(p_Fm->p_FmStateStruct->revInfo.majorRev < 6))199if (p_Fm->userSetExceptions & FM_EX_BMI_DISPATCH_RAM_ECC)200RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("exception e_FM_EX_BMI_DISPATCH_RAM_ECC!"));201#endif /* FM_NO_DISPATCH_RAM_ECC */202203#ifdef FM_QMI_NO_ECC_EXCEPTIONS204if (p_Fm->p_FmStateStruct->revInfo.majorRev == 4)205if (p_Fm->userSetExceptions & (FM_EX_QMI_SINGLE_ECC | FM_EX_QMI_DOUBLE_ECC))206RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("exception e_FM_EX_QMI_SINGLE_ECC/e_FM_EX_QMI_DOUBLE_ECC!"));207#endif /* FM_QMI_NO_ECC_EXCEPTIONS */208209#ifdef FM_QMI_NO_SINGLE_ECC_EXCEPTION210if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)211if (p_Fm->userSetExceptions & FM_EX_QMI_SINGLE_ECC)212RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("exception e_FM_EX_QMI_SINGLE_ECC!"));213#endif /* FM_QMI_NO_SINGLE_ECC_EXCEPTION */214215return E_OK;216}217218219static void SendIpcIsr(t_Fm *p_Fm, uint32_t macEvent, uint32_t pendingReg)220{221ASSERT_COND(p_Fm->guestId == NCSW_MASTER_ID);222223if (p_Fm->intrMng[macEvent].guestId == NCSW_MASTER_ID)224p_Fm->intrMng[macEvent].f_Isr(p_Fm->intrMng[macEvent].h_SrcHandle);225226/* If the MAC is running on guest-partition and we have IPC session with it,227we inform him about the event through IPC; otherwise, we ignore the event. */228else if (p_Fm->h_IpcSessions[p_Fm->intrMng[macEvent].guestId])229{230t_Error err;231t_FmIpcIsr fmIpcIsr;232t_FmIpcMsg msg;233234memset(&msg, 0, sizeof(msg));235msg.msgId = FM_GUEST_ISR;236fmIpcIsr.pendingReg = pendingReg;237fmIpcIsr.boolErr = FALSE;238memcpy(msg.msgBody, &fmIpcIsr, sizeof(fmIpcIsr));239err = XX_IpcSendMessage(p_Fm->h_IpcSessions[p_Fm->intrMng[macEvent].guestId],240(uint8_t*)&msg,241sizeof(msg.msgId) + sizeof(fmIpcIsr),242NULL,243NULL,244NULL,245NULL);246if (err != E_OK)247REPORT_ERROR(MINOR, err, NO_MSG);248}249else250DBG(TRACE, ("FM Guest mode, without IPC - can't call ISR!"));251}252253static void BmiErrEvent(t_Fm *p_Fm)254{255uint32_t event;256struct fman_bmi_regs *bmi_rg = p_Fm->p_FmBmiRegs;257258259event = fman_get_bmi_err_event(bmi_rg);260261if (event & BMI_ERR_INTR_EN_STORAGE_PROFILE_ECC)262p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_BMI_STORAGE_PROFILE_ECC);263if (event & BMI_ERR_INTR_EN_LIST_RAM_ECC)264p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_BMI_LIST_RAM_ECC);265if (event & BMI_ERR_INTR_EN_STATISTICS_RAM_ECC)266p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_BMI_STATISTICS_RAM_ECC);267if (event & BMI_ERR_INTR_EN_DISPATCH_RAM_ECC)268p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_BMI_DISPATCH_RAM_ECC);269}270271static void QmiErrEvent(t_Fm *p_Fm)272{273uint32_t event;274struct fman_qmi_regs *qmi_rg = p_Fm->p_FmQmiRegs;275276event = fman_get_qmi_err_event(qmi_rg);277278if (event & QMI_ERR_INTR_EN_DOUBLE_ECC)279p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_QMI_DOUBLE_ECC);280if (event & QMI_ERR_INTR_EN_DEQ_FROM_DEF)281p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_QMI_DEQ_FROM_UNKNOWN_PORTID);282}283284static void DmaErrEvent(t_Fm *p_Fm)285{286uint32_t status, com_id;287uint8_t tnum;288uint8_t hardwarePortId;289uint8_t relativePortId;290uint16_t liodn;291struct fman_dma_regs *dma_rg = p_Fm->p_FmDmaRegs;292293status = fman_get_dma_err_event(dma_rg);294295if (status & DMA_STATUS_BUS_ERR)296{297com_id = fman_get_dma_com_id(dma_rg);298hardwarePortId = (uint8_t)(((com_id & DMA_TRANSFER_PORTID_MASK) >> DMA_TRANSFER_PORTID_SHIFT));299ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));300HW_PORT_ID_TO_SW_PORT_ID(relativePortId, hardwarePortId);301tnum = (uint8_t)((com_id & DMA_TRANSFER_TNUM_MASK) >> DMA_TRANSFER_TNUM_SHIFT);302liodn = (uint16_t)(com_id & DMA_TRANSFER_LIODN_MASK);303ASSERT_COND(p_Fm->p_FmStateStruct->portsTypes[hardwarePortId] != e_FM_PORT_TYPE_DUMMY);304p_Fm->f_BusError(p_Fm->h_App,305p_Fm->p_FmStateStruct->portsTypes[hardwarePortId],306relativePortId,307fman_get_dma_addr(dma_rg),308tnum,309liodn);310}311if (status & DMA_STATUS_FM_SPDAT_ECC)312p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_DMA_SINGLE_PORT_ECC);313if (status & DMA_STATUS_READ_ECC)314p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_DMA_READ_ECC);315if (status & DMA_STATUS_SYSTEM_WRITE_ECC)316p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_DMA_SYSTEM_WRITE_ECC);317if (status & DMA_STATUS_FM_WRITE_ECC)318p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_DMA_FM_WRITE_ECC);319}320321static void FpmErrEvent(t_Fm *p_Fm)322{323uint32_t event;324struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;325326event = fman_get_fpm_err_event(fpm_rg);327328if ((event & FPM_EV_MASK_DOUBLE_ECC) && (event & FPM_EV_MASK_DOUBLE_ECC_EN))329p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_FPM_DOUBLE_ECC);330if ((event & FPM_EV_MASK_STALL) && (event & FPM_EV_MASK_STALL_EN))331p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_FPM_STALL_ON_TASKS);332if ((event & FPM_EV_MASK_SINGLE_ECC) && (event & FPM_EV_MASK_SINGLE_ECC_EN))333p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_FPM_SINGLE_ECC);334}335336static void MuramErrIntr(t_Fm *p_Fm)337{338uint32_t event;339struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;340341event = fman_get_muram_err_event(fpm_rg);342343if (event & FPM_RAM_MURAM_ECC)344p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_MURAM_ECC);345}346347static void IramErrIntr(t_Fm *p_Fm)348{349uint32_t event;350struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;351352event = fman_get_iram_err_event(fpm_rg);353354if (event & FPM_RAM_IRAM_ECC)355p_Fm->f_Exception(p_Fm->h_App, e_FM_EX_IRAM_ECC);356}357358static void QmiEvent(t_Fm *p_Fm)359{360uint32_t event;361struct fman_qmi_regs *qmi_rg = p_Fm->p_FmQmiRegs;362363event = fman_get_qmi_event(qmi_rg);364365if (event & QMI_INTR_EN_SINGLE_ECC)366p_Fm->f_Exception(p_Fm->h_App,e_FM_EX_QMI_SINGLE_ECC);367}368369static void UnimplementedIsr(t_Handle h_Arg)370{371UNUSED(h_Arg);372373REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Unimplemented ISR!"));374}375376static void UnimplementedFmanCtrlIsr(t_Handle h_Arg, uint32_t event)377{378UNUSED(h_Arg); UNUSED(event);379380REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Unimplemented FmCtl ISR!"));381}382383static void EnableTimeStamp(t_Fm *p_Fm)384{385struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;386387ASSERT_COND(p_Fm->p_FmStateStruct);388ASSERT_COND(p_Fm->p_FmStateStruct->count1MicroBit);389390fman_enable_time_stamp(fpm_rg, p_Fm->p_FmStateStruct->count1MicroBit, p_Fm->p_FmStateStruct->fmClkFreq);391392p_Fm->p_FmStateStruct->enabledTimeStamp = TRUE;393}394395static t_Error ClearIRam(t_Fm *p_Fm)396{397t_FMIramRegs *p_Iram;398int i;399int iram_size;400401ASSERT_COND(p_Fm);402p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM);403iram_size = FM_IRAM_SIZE(p_Fm->p_FmStateStruct->revInfo.majorRev,p_Fm->p_FmStateStruct->revInfo.minorRev);404405/* Enable the auto-increment */406WRITE_UINT32(p_Iram->iadd, IRAM_IADD_AIE);407while (GET_UINT32(p_Iram->iadd) != IRAM_IADD_AIE) ;408409for (i=0; i < (iram_size/4); i++)410WRITE_UINT32(p_Iram->idata, 0xffffffff);411412WRITE_UINT32(p_Iram->iadd, iram_size - 4);413CORE_MemoryBarrier();414while (GET_UINT32(p_Iram->idata) != 0xffffffff) ;415416return E_OK;417}418419static t_Error LoadFmanCtrlCode(t_Fm *p_Fm)420{421t_FMIramRegs *p_Iram;422int i;423uint32_t tmp;424uint8_t compTo16;425426ASSERT_COND(p_Fm);427p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM);428429/* Enable the auto-increment */430WRITE_UINT32(p_Iram->iadd, IRAM_IADD_AIE);431while (GET_UINT32(p_Iram->iadd) != IRAM_IADD_AIE) ;432433for (i=0; i < (p_Fm->firmware.size / 4); i++)434WRITE_UINT32(p_Iram->idata, p_Fm->firmware.p_Code[i]);435436compTo16 = (uint8_t)(p_Fm->firmware.size % 16);437if (compTo16)438for (i=0; i < ((16-compTo16) / 4); i++)439WRITE_UINT32(p_Iram->idata, 0xffffffff);440441WRITE_UINT32(p_Iram->iadd,p_Fm->firmware.size-4);442while (GET_UINT32(p_Iram->iadd) != (p_Fm->firmware.size-4)) ;443444/* verify that writing has completed */445while (GET_UINT32(p_Iram->idata) != p_Fm->firmware.p_Code[(p_Fm->firmware.size / 4)-1]) ;446447if (p_Fm->fwVerify)448{449WRITE_UINT32(p_Iram->iadd, IRAM_IADD_AIE);450while (GET_UINT32(p_Iram->iadd) != IRAM_IADD_AIE) ;451for (i=0; i < (p_Fm->firmware.size / 4); i++)452{453tmp = GET_UINT32(p_Iram->idata);454if (tmp != p_Fm->firmware.p_Code[i])455RETURN_ERROR(MAJOR, E_WRITE_FAILED,456("UCode write error : write 0x%x, read 0x%x",457p_Fm->firmware.p_Code[i],tmp));458}459WRITE_UINT32(p_Iram->iadd, 0x0);460}461462/* Enable patch from IRAM */463WRITE_UINT32(p_Iram->iready, IRAM_READY);464XX_UDelay(1000);465466DBG(INFO, ("FMan-Controller code (ver %d.%d.%d) loaded to IRAM.",467((uint16_t *)p_Fm->firmware.p_Code)[2],468((uint8_t *)p_Fm->firmware.p_Code)[6],469((uint8_t *)p_Fm->firmware.p_Code)[7]));470471return E_OK;472}473474#ifdef FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173475static t_Error FwNotResetErratumBugzilla6173WA(t_Fm *p_Fm)476{477t_FMIramRegs *p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM);478uint32_t tmpReg;479uint32_t savedSpliodn[63];480481/* write to IRAM first location the debug instruction */482WRITE_UINT32(p_Iram->iadd, 0);483while (GET_UINT32(p_Iram->iadd) != 0) ;484WRITE_UINT32(p_Iram->idata, FM_FW_DEBUG_INSTRUCTION);485486WRITE_UINT32(p_Iram->iadd, 0);487while (GET_UINT32(p_Iram->iadd) != 0) ;488while (GET_UINT32(p_Iram->idata) != FM_FW_DEBUG_INSTRUCTION) ;489490/* Enable patch from IRAM */491WRITE_UINT32(p_Iram->iready, IRAM_READY);492CORE_MemoryBarrier();493XX_UDelay(100);494IO2MemCpy32((uint8_t *)savedSpliodn,495(uint8_t *)p_Fm->p_FmBmiRegs->fmbm_spliodn,49663*sizeof(uint32_t));497498/* reset FMAN */499WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_rstc, FPM_RSTC_FM_RESET);500CORE_MemoryBarrier();501XX_UDelay(100);502503/* verify breakpoint debug status register */504tmpReg = GET_UINT32(*(uint32_t *)UINT_TO_PTR(p_Fm->baseAddr + FM_DEBUG_STATUS_REGISTER_OFFSET));505if (!tmpReg)506REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Invalid debug status register value is '0'"));507508/*************************************/509/* Load FMan-Controller code to IRAM */510/*************************************/511ClearIRam(p_Fm);512if (p_Fm->firmware.p_Code &&513(LoadFmanCtrlCode(p_Fm) != E_OK))514RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);515XX_UDelay(100);516517/* reset FMAN again to start the microcode */518WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_rstc, FPM_RSTC_FM_RESET);519CORE_MemoryBarrier();520XX_UDelay(100);521Mem2IOCpy32((uint8_t *)p_Fm->p_FmBmiRegs->fmbm_spliodn,522(uint8_t *)savedSpliodn,52363*sizeof(uint32_t));524525if (fman_is_qmi_halt_not_busy_state(p_Fm->p_FmQmiRegs))526{527fman_resume(p_Fm->p_FmFpmRegs);528CORE_MemoryBarrier();529XX_UDelay(100);530}531532return E_OK;533}534#endif /* FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 */535536static void GuestErrorIsr(t_Fm *p_Fm, uint32_t pending)537{538#define FM_G_CALL_1G_MAC_ERR_ISR(_id) \539do { \540p_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);\541} while (0)542#define FM_G_CALL_10G_MAC_ERR_ISR(_id) \543do { \544p_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);\545} while (0)546547/* error interrupts */548if (pending & ERR_INTR_EN_1G_MAC0)549FM_G_CALL_1G_MAC_ERR_ISR(0);550if (pending & ERR_INTR_EN_1G_MAC1)551FM_G_CALL_1G_MAC_ERR_ISR(1);552if (pending & ERR_INTR_EN_1G_MAC2)553FM_G_CALL_1G_MAC_ERR_ISR(2);554if (pending & ERR_INTR_EN_1G_MAC3)555FM_G_CALL_1G_MAC_ERR_ISR(3);556if (pending & ERR_INTR_EN_1G_MAC4)557FM_G_CALL_1G_MAC_ERR_ISR(4);558if (pending & ERR_INTR_EN_1G_MAC5)559FM_G_CALL_1G_MAC_ERR_ISR(5);560if (pending & ERR_INTR_EN_1G_MAC6)561FM_G_CALL_1G_MAC_ERR_ISR(6);562if (pending & ERR_INTR_EN_1G_MAC7)563FM_G_CALL_1G_MAC_ERR_ISR(7);564if (pending & ERR_INTR_EN_10G_MAC0)565FM_G_CALL_10G_MAC_ERR_ISR(0);566if (pending & ERR_INTR_EN_10G_MAC1)567FM_G_CALL_10G_MAC_ERR_ISR(1);568}569570static void GuestEventIsr(t_Fm *p_Fm, uint32_t pending)571{572#define FM_G_CALL_1G_MAC_ISR(_id) \573do { \574p_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);\575} while (0)576#define FM_G_CALL_10G_MAC_ISR(_id) \577do { \578p_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);\579} while (0)580581if (pending & INTR_EN_1G_MAC0)582FM_G_CALL_1G_MAC_ISR(0);583if (pending & INTR_EN_1G_MAC1)584FM_G_CALL_1G_MAC_ISR(1);585if (pending & INTR_EN_1G_MAC2)586FM_G_CALL_1G_MAC_ISR(2);587if (pending & INTR_EN_1G_MAC3)588FM_G_CALL_1G_MAC_ISR(3);589if (pending & INTR_EN_1G_MAC4)590FM_G_CALL_1G_MAC_ISR(4);591if (pending & INTR_EN_1G_MAC5)592FM_G_CALL_1G_MAC_ISR(5);593if (pending & INTR_EN_1G_MAC6)594FM_G_CALL_1G_MAC_ISR(6);595if (pending & INTR_EN_1G_MAC7)596FM_G_CALL_1G_MAC_ISR(7);597if (pending & INTR_EN_10G_MAC0)598FM_G_CALL_10G_MAC_ISR(0);599if (pending & INTR_EN_10G_MAC1)600FM_G_CALL_10G_MAC_ISR(1);601if (pending & INTR_EN_TMR)602p_Fm->intrMng[e_FM_EV_TMR].f_Isr(p_Fm->intrMng[e_FM_EV_TMR].h_SrcHandle);603}604605#if (DPAA_VERSION >= 11)606static t_Error SetVSPWindow(t_Handle h_Fm,607uint8_t hardwarePortId,608uint8_t baseStorageProfile,609uint8_t log2NumOfProfiles)610{611t_Fm *p_Fm = (t_Fm *)h_Fm;612613ASSERT_COND(h_Fm);614ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));615616if ((p_Fm->guestId != NCSW_MASTER_ID) &&617!p_Fm->p_FmBmiRegs &&618p_Fm->h_IpcSessions[0])619{620t_FmIpcVspSetPortWindow fmIpcVspSetPortWindow;621t_FmIpcMsg msg;622t_Error err = E_OK;623624memset(&msg, 0, sizeof(msg));625memset(&fmIpcVspSetPortWindow, 0, sizeof(t_FmIpcVspSetPortWindow));626fmIpcVspSetPortWindow.hardwarePortId = hardwarePortId;627fmIpcVspSetPortWindow.baseStorageProfile = baseStorageProfile;628fmIpcVspSetPortWindow.log2NumOfProfiles = log2NumOfProfiles;629msg.msgId = FM_VSP_SET_PORT_WINDOW;630memcpy(msg.msgBody, &fmIpcVspSetPortWindow, sizeof(t_FmIpcVspSetPortWindow));631632err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],633(uint8_t*)&msg,634sizeof(msg.msgId),635NULL,636NULL,637NULL,638NULL);639if (err != E_OK)640RETURN_ERROR(MINOR, err, NO_MSG);641return E_OK;642}643else if (!p_Fm->p_FmBmiRegs)644RETURN_ERROR(MINOR, E_NOT_SUPPORTED,645("Either IPC or 'baseAddress' is required!"));646647fman_set_vsp_window(p_Fm->p_FmBmiRegs,648hardwarePortId,649baseStorageProfile,650log2NumOfProfiles);651652return E_OK;653}654655static uint8_t AllocVSPsForPartition(t_Handle h_Fm, uint8_t base, uint8_t numOfProfiles, uint8_t guestId)656{657t_Fm *p_Fm = (t_Fm *)h_Fm;658uint8_t profilesFound = 0;659int i = 0;660uint32_t intFlags;661662if (!numOfProfiles)663return E_OK;664665if ((numOfProfiles > FM_VSP_MAX_NUM_OF_ENTRIES) ||666(base + numOfProfiles > FM_VSP_MAX_NUM_OF_ENTRIES))667return (uint8_t)ILLEGAL_BASE;668669if (p_Fm->h_IpcSessions[0])670{671t_FmIpcResourceAllocParams ipcAllocParams;672t_FmIpcMsg msg;673t_FmIpcReply reply;674t_Error err;675uint32_t replyLength;676677memset(&msg, 0, sizeof(msg));678memset(&reply, 0, sizeof(reply));679memset(&ipcAllocParams, 0, sizeof(t_FmIpcResourceAllocParams));680ipcAllocParams.guestId = p_Fm->guestId;681ipcAllocParams.num = p_Fm->partNumOfVSPs;682ipcAllocParams.base = p_Fm->partVSPBase;683msg.msgId = FM_VSP_ALLOC;684memcpy(msg.msgBody, &ipcAllocParams, sizeof(t_FmIpcResourceAllocParams));685replyLength = sizeof(uint32_t) + sizeof(uint8_t);686err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],687(uint8_t*)&msg,688sizeof(msg.msgId) + sizeof(t_FmIpcResourceAllocParams),689(uint8_t*)&reply,690&replyLength,691NULL,692NULL);693if ((err != E_OK) ||694(replyLength != (sizeof(uint32_t) + sizeof(uint8_t))))695RETURN_ERROR(MAJOR, err, NO_MSG);696else697memcpy((uint8_t*)&p_Fm->partVSPBase, reply.replyBody, sizeof(uint8_t));698if (p_Fm->partVSPBase == (uint8_t)(ILLEGAL_BASE))699RETURN_ERROR(MAJOR, err, NO_MSG);700}701if (p_Fm->guestId != NCSW_MASTER_ID)702{703DBG(WARNING, ("FM Guest mode, without IPC - can't validate VSP range!"));704return (uint8_t)ILLEGAL_BASE;705}706707intFlags = XX_LockIntrSpinlock(p_Fm->h_Spinlock);708for (i = base; i < base + numOfProfiles; i++)709if (p_Fm->p_FmSp->profiles[i].profilesMng.ownerId == (uint8_t)ILLEGAL_BASE)710profilesFound++;711else712break;713714if (profilesFound == numOfProfiles)715for (i = base; i<base + numOfProfiles; i++)716p_Fm->p_FmSp->profiles[i].profilesMng.ownerId = guestId;717else718{719XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);720return (uint8_t)ILLEGAL_BASE;721}722XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);723724return base;725}726727static void FreeVSPsForPartition(t_Handle h_Fm, uint8_t base, uint8_t numOfProfiles, uint8_t guestId)728{729t_Fm *p_Fm = (t_Fm *)h_Fm;730int i = 0;731732ASSERT_COND(p_Fm);733734if (p_Fm->h_IpcSessions[0])735{736t_FmIpcResourceAllocParams ipcAllocParams;737t_FmIpcMsg msg;738t_FmIpcReply reply;739uint32_t replyLength;740t_Error err;741742memset(&msg, 0, sizeof(msg));743memset(&reply, 0, sizeof(reply));744memset(&ipcAllocParams, 0, sizeof(t_FmIpcResourceAllocParams));745ipcAllocParams.guestId = p_Fm->guestId;746ipcAllocParams.num = p_Fm->partNumOfVSPs;747ipcAllocParams.base = p_Fm->partVSPBase;748msg.msgId = FM_VSP_FREE;749memcpy(msg.msgBody, &ipcAllocParams, sizeof(t_FmIpcResourceAllocParams));750replyLength = sizeof(uint32_t) + sizeof(uint8_t);751err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],752(uint8_t*)&msg,753sizeof(msg.msgId) + sizeof(t_FmIpcResourceAllocParams),754(uint8_t*)&reply,755&replyLength,756NULL,757NULL);758if (err != E_OK)759REPORT_ERROR(MAJOR, err, NO_MSG);760return;761}762if (p_Fm->guestId != NCSW_MASTER_ID)763{764DBG(WARNING, ("FM Guest mode, without IPC - can't validate VSP range!"));765return;766}767768ASSERT_COND(p_Fm->p_FmSp);769770for (i=base; i<numOfProfiles; i++)771{772if (p_Fm->p_FmSp->profiles[i].profilesMng.ownerId == guestId)773p_Fm->p_FmSp->profiles[i].profilesMng.ownerId = (uint8_t)ILLEGAL_BASE;774else775DBG(WARNING, ("Request for freeing storage profile window which wasn't allocated to this partition"));776}777}778#endif /* (DPAA_VERSION >= 11) */779780static t_Error FmGuestHandleIpcMsgCB(t_Handle h_Fm,781uint8_t *p_Msg,782uint32_t msgLength,783uint8_t *p_Reply,784uint32_t *p_ReplyLength)785{786t_Fm *p_Fm = (t_Fm*)h_Fm;787t_FmIpcMsg *p_IpcMsg = (t_FmIpcMsg*)p_Msg;788789UNUSED(p_Reply);790SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);791SANITY_CHECK_RETURN_ERROR((msgLength > sizeof(uint32_t)), E_INVALID_VALUE);792793#ifdef DISABLE_SANITY_CHECKS794UNUSED(msgLength);795#endif /* DISABLE_SANITY_CHECKS */796797ASSERT_COND(p_Msg);798799*p_ReplyLength = 0;800801switch (p_IpcMsg->msgId)802{803case (FM_GUEST_ISR):804{805t_FmIpcIsr ipcIsr;806807memcpy((uint8_t*)&ipcIsr, p_IpcMsg->msgBody, sizeof(t_FmIpcIsr));808if (ipcIsr.boolErr)809GuestErrorIsr(p_Fm, ipcIsr.pendingReg);810else811GuestEventIsr(p_Fm, ipcIsr.pendingReg);812break;813}814default:815*p_ReplyLength = 0;816RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("command not found!!!"));817}818return E_OK;819}820821static t_Error FmHandleIpcMsgCB(t_Handle h_Fm,822uint8_t *p_Msg,823uint32_t msgLength,824uint8_t *p_Reply,825uint32_t *p_ReplyLength)826{827t_Error err;828t_Fm *p_Fm = (t_Fm*)h_Fm;829t_FmIpcMsg *p_IpcMsg = (t_FmIpcMsg*)p_Msg;830t_FmIpcReply *p_IpcReply = (t_FmIpcReply*)p_Reply;831832SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);833SANITY_CHECK_RETURN_ERROR((msgLength >= sizeof(uint32_t)), E_INVALID_VALUE);834835#ifdef DISABLE_SANITY_CHECKS836UNUSED(msgLength);837#endif /* DISABLE_SANITY_CHECKS */838839ASSERT_COND(p_IpcMsg);840841memset(p_IpcReply, 0, (sizeof(uint8_t) * FM_IPC_MAX_REPLY_SIZE));842*p_ReplyLength = 0;843844switch (p_IpcMsg->msgId)845{846case (FM_GET_SET_PORT_PARAMS):847{848t_FmIpcPortInInitParams ipcInitParams;849t_FmInterModulePortInitParams initParams;850t_FmIpcPortOutInitParams ipcOutInitParams;851852memcpy((uint8_t*)&ipcInitParams, p_IpcMsg->msgBody, sizeof(t_FmIpcPortInInitParams));853initParams.hardwarePortId = ipcInitParams.hardwarePortId;854initParams.portType = (e_FmPortType)ipcInitParams.enumPortType;855initParams.independentMode = (bool)(ipcInitParams.boolIndependentMode);856initParams.liodnOffset = ipcInitParams.liodnOffset;857initParams.numOfTasks = ipcInitParams.numOfTasks;858initParams.numOfExtraTasks = ipcInitParams.numOfExtraTasks;859initParams.numOfOpenDmas = ipcInitParams.numOfOpenDmas;860initParams.numOfExtraOpenDmas = ipcInitParams.numOfExtraOpenDmas;861initParams.sizeOfFifo = ipcInitParams.sizeOfFifo;862initParams.extraSizeOfFifo = ipcInitParams.extraSizeOfFifo;863initParams.deqPipelineDepth = ipcInitParams.deqPipelineDepth;864initParams.maxFrameLength = ipcInitParams.maxFrameLength;865initParams.liodnBase = ipcInitParams.liodnBase;866867p_IpcReply->error = (uint32_t)FmGetSetPortParams(h_Fm, &initParams);868869ipcOutInitParams.ipcPhysAddr.high = initParams.fmMuramPhysBaseAddr.high;870ipcOutInitParams.ipcPhysAddr.low = initParams.fmMuramPhysBaseAddr.low;871ipcOutInitParams.sizeOfFifo = initParams.sizeOfFifo;872ipcOutInitParams.extraSizeOfFifo = initParams.extraSizeOfFifo;873ipcOutInitParams.numOfTasks = initParams.numOfTasks;874ipcOutInitParams.numOfExtraTasks = initParams.numOfExtraTasks;875ipcOutInitParams.numOfOpenDmas = initParams.numOfOpenDmas;876ipcOutInitParams.numOfExtraOpenDmas = initParams.numOfExtraOpenDmas;877memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcOutInitParams, sizeof(ipcOutInitParams));878*p_ReplyLength = sizeof(uint32_t) + sizeof(t_FmIpcPortOutInitParams);879break;880}881case (FM_SET_SIZE_OF_FIFO):882{883t_FmIpcPortRsrcParams ipcPortRsrcParams;884885memcpy((uint8_t*)&ipcPortRsrcParams, p_IpcMsg->msgBody, sizeof(t_FmIpcPortRsrcParams));886p_IpcReply->error = (uint32_t)FmSetSizeOfFifo(h_Fm,887ipcPortRsrcParams.hardwarePortId,888&ipcPortRsrcParams.val,889&ipcPortRsrcParams.extra,890(bool)ipcPortRsrcParams.boolInitialConfig);891*p_ReplyLength = sizeof(uint32_t);892break;893}894case (FM_SET_NUM_OF_TASKS):895{896t_FmIpcPortRsrcParams ipcPortRsrcParams;897898memcpy((uint8_t*)&ipcPortRsrcParams, p_IpcMsg->msgBody, sizeof(t_FmIpcPortRsrcParams));899p_IpcReply->error = (uint32_t)FmSetNumOfTasks(h_Fm, ipcPortRsrcParams.hardwarePortId,900(uint8_t*)&ipcPortRsrcParams.val,901(uint8_t*)&ipcPortRsrcParams.extra,902(bool)ipcPortRsrcParams.boolInitialConfig);903*p_ReplyLength = sizeof(uint32_t);904break;905}906case (FM_SET_NUM_OF_OPEN_DMAS):907{908t_FmIpcPortRsrcParams ipcPortRsrcParams;909910memcpy((uint8_t*)&ipcPortRsrcParams, p_IpcMsg->msgBody, sizeof(t_FmIpcPortRsrcParams));911p_IpcReply->error = (uint32_t)FmSetNumOfOpenDmas(h_Fm, ipcPortRsrcParams.hardwarePortId,912(uint8_t*)&ipcPortRsrcParams.val,913(uint8_t*)&ipcPortRsrcParams.extra,914(bool)ipcPortRsrcParams.boolInitialConfig);915*p_ReplyLength = sizeof(uint32_t);916break;917}918case (FM_RESUME_STALLED_PORT):919*p_ReplyLength = sizeof(uint32_t);920p_IpcReply->error = (uint32_t)FmResumeStalledPort(h_Fm, p_IpcMsg->msgBody[0]);921break;922case (FM_MASTER_IS_ALIVE):923{924uint8_t guestId = p_IpcMsg->msgBody[0];925/* build the FM master partition IPC address */926memset(p_Fm->fmIpcHandlerModuleName[guestId], 0, (sizeof(char)) * MODULE_NAME_SIZE);927if (Sprint (p_Fm->fmIpcHandlerModuleName[guestId], "FM_%d_%d",p_Fm->p_FmStateStruct->fmId, guestId) != (guestId<10 ? 6:7))928RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));929p_Fm->h_IpcSessions[guestId] = XX_IpcInitSession(p_Fm->fmIpcHandlerModuleName[guestId], p_Fm->fmModuleName);930if (p_Fm->h_IpcSessions[guestId] == NULL)931RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("FM Master IPC session for guest %d", guestId));932*(uint8_t*)(p_IpcReply->replyBody) = 1;933*p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);934break;935}936case (FM_IS_PORT_STALLED):937{938bool tmp;939940p_IpcReply->error = (uint32_t)FmIsPortStalled(h_Fm, p_IpcMsg->msgBody[0], &tmp);941*(uint8_t*)(p_IpcReply->replyBody) = (uint8_t)tmp;942*p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);943break;944}945case (FM_RESET_MAC):946{947t_FmIpcMacParams ipcMacParams;948949memcpy((uint8_t*)&ipcMacParams, p_IpcMsg->msgBody, sizeof(t_FmIpcMacParams));950p_IpcReply->error = (uint32_t)FmResetMac(p_Fm,951(e_FmMacType)(ipcMacParams.enumType),952ipcMacParams.id);953*p_ReplyLength = sizeof(uint32_t);954break;955}956case (FM_SET_MAC_MAX_FRAME):957{958t_FmIpcMacMaxFrameParams ipcMacMaxFrameParams;959960memcpy((uint8_t*)&ipcMacMaxFrameParams, p_IpcMsg->msgBody, sizeof(t_FmIpcMacMaxFrameParams));961err = FmSetMacMaxFrame(p_Fm,962(e_FmMacType)(ipcMacMaxFrameParams.macParams.enumType),963ipcMacMaxFrameParams.macParams.id,964ipcMacMaxFrameParams.maxFrameLength);965if (err != E_OK)966REPORT_ERROR(MINOR, err, NO_MSG);967break;968}969#if (DPAA_VERSION >= 11)970case (FM_VSP_ALLOC) :971{972t_FmIpcResourceAllocParams ipcAllocParams;973uint8_t vspBase;974memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));975vspBase = AllocVSPsForPartition(h_Fm, (uint8_t)ipcAllocParams.base, (uint8_t)ipcAllocParams.num, ipcAllocParams.guestId);976memcpy(p_IpcReply->replyBody, (uint8_t*)&vspBase, sizeof(uint8_t));977*p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);978break;979}980case (FM_VSP_FREE) :981{982t_FmIpcResourceAllocParams ipcAllocParams;983memcpy(&ipcAllocParams, p_IpcMsg->msgBody, sizeof(t_FmIpcResourceAllocParams));984FreeVSPsForPartition(h_Fm, (uint8_t)ipcAllocParams.base, (uint8_t)ipcAllocParams.num, ipcAllocParams.guestId);985break;986}987case (FM_VSP_SET_PORT_WINDOW) :988{989t_FmIpcVspSetPortWindow ipcVspSetPortWindow;990memcpy(&ipcVspSetPortWindow, p_IpcMsg->msgBody, sizeof(t_FmIpcVspSetPortWindow));991err = SetVSPWindow(h_Fm,992ipcVspSetPortWindow.hardwarePortId,993ipcVspSetPortWindow.baseStorageProfile,994ipcVspSetPortWindow.log2NumOfProfiles);995return err;996}997case (FM_SET_CONG_GRP_PFC_PRIO) :998{999t_FmIpcSetCongestionGroupPfcPriority fmIpcSetCongestionGroupPfcPriority;1000memcpy(&fmIpcSetCongestionGroupPfcPriority, p_IpcMsg->msgBody, sizeof(t_FmIpcSetCongestionGroupPfcPriority));1001err = FmSetCongestionGroupPFCpriority(h_Fm,1002fmIpcSetCongestionGroupPfcPriority.congestionGroupId,1003fmIpcSetCongestionGroupPfcPriority.priorityBitMap);1004return err;1005}1006#endif /* (DPAA_VERSION >= 11) */10071008case (FM_FREE_PORT):1009{1010t_FmInterModulePortFreeParams portParams;1011t_FmIpcPortFreeParams ipcPortParams;10121013memcpy((uint8_t*)&ipcPortParams, p_IpcMsg->msgBody, sizeof(t_FmIpcPortFreeParams));1014portParams.hardwarePortId = ipcPortParams.hardwarePortId;1015portParams.portType = (e_FmPortType)(ipcPortParams.enumPortType);1016portParams.deqPipelineDepth = ipcPortParams.deqPipelineDepth;1017FmFreePortParams(h_Fm, &portParams);1018break;1019}1020case (FM_REGISTER_INTR):1021{1022t_FmIpcRegisterIntr ipcRegIntr;10231024memcpy((uint8_t*)&ipcRegIntr, p_IpcMsg->msgBody, sizeof(ipcRegIntr));1025p_Fm->intrMng[ipcRegIntr.event].guestId = ipcRegIntr.guestId;1026break;1027}1028case (FM_GET_PARAMS):1029{1030t_FmIpcParams ipcParams;10311032/* Get clock frequency */1033ipcParams.fmClkFreq = p_Fm->p_FmStateStruct->fmClkFreq;1034ipcParams.fmMacClkFreq = p_Fm->p_FmStateStruct->fmMacClkFreq;10351036fman_get_revision(p_Fm->p_FmFpmRegs,&ipcParams.majorRev,&ipcParams.minorRev);10371038memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcParams, sizeof(t_FmIpcParams));1039*p_ReplyLength = sizeof(uint32_t) + sizeof(t_FmIpcParams);1040break;1041}1042case (FM_GET_FMAN_CTRL_CODE_REV):1043{1044t_FmCtrlCodeRevisionInfo fmanCtrlRevInfo;1045t_FmIpcFmanCtrlCodeRevisionInfo ipcRevInfo;10461047p_IpcReply->error = (uint32_t)FM_GetFmanCtrlCodeRevision(h_Fm, &fmanCtrlRevInfo);1048ipcRevInfo.packageRev = fmanCtrlRevInfo.packageRev;1049ipcRevInfo.majorRev = fmanCtrlRevInfo.majorRev;1050ipcRevInfo.minorRev = fmanCtrlRevInfo.minorRev;1051memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcRevInfo, sizeof(t_FmIpcFmanCtrlCodeRevisionInfo));1052*p_ReplyLength = sizeof(uint32_t) + sizeof(t_FmIpcFmanCtrlCodeRevisionInfo);1053break;1054}10551056case (FM_DMA_STAT):1057{1058t_FmDmaStatus dmaStatus;1059t_FmIpcDmaStatus ipcDmaStatus;10601061FM_GetDmaStatus(h_Fm, &dmaStatus);1062ipcDmaStatus.boolCmqNotEmpty = (uint8_t)dmaStatus.cmqNotEmpty;1063ipcDmaStatus.boolBusError = (uint8_t)dmaStatus.busError;1064ipcDmaStatus.boolReadBufEccError = (uint8_t)dmaStatus.readBufEccError;1065ipcDmaStatus.boolWriteBufEccSysError = (uint8_t)dmaStatus.writeBufEccSysError;1066ipcDmaStatus.boolWriteBufEccFmError = (uint8_t)dmaStatus.writeBufEccFmError;1067ipcDmaStatus.boolSinglePortEccError = (uint8_t)dmaStatus.singlePortEccError;1068memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcDmaStatus, sizeof(t_FmIpcDmaStatus));1069*p_ReplyLength = sizeof(uint32_t) + sizeof(t_FmIpcDmaStatus);1070break;1071}1072case (FM_ALLOC_FMAN_CTRL_EVENT_REG):1073p_IpcReply->error = (uint32_t)FmAllocFmanCtrlEventReg(h_Fm, (uint8_t*)p_IpcReply->replyBody);1074*p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);1075break;1076case (FM_FREE_FMAN_CTRL_EVENT_REG):1077FmFreeFmanCtrlEventReg(h_Fm, p_IpcMsg->msgBody[0]);1078break;1079case (FM_GET_TIMESTAMP_SCALE):1080{1081uint32_t timeStamp = FmGetTimeStampScale(h_Fm);10821083memcpy(p_IpcReply->replyBody, (uint8_t*)&timeStamp, sizeof(uint32_t));1084*p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);1085break;1086}1087case (FM_GET_COUNTER):1088{1089e_FmCounters inCounter;1090uint32_t outCounter;10911092memcpy((uint8_t*)&inCounter, p_IpcMsg->msgBody, sizeof(uint32_t));1093outCounter = FM_GetCounter(h_Fm, inCounter);1094memcpy(p_IpcReply->replyBody, (uint8_t*)&outCounter, sizeof(uint32_t));1095*p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);1096break;1097}1098case (FM_SET_FMAN_CTRL_EVENTS_ENABLE):1099{1100t_FmIpcFmanEvents ipcFmanEvents;11011102memcpy((uint8_t*)&ipcFmanEvents, p_IpcMsg->msgBody, sizeof(t_FmIpcFmanEvents));1103FmSetFmanCtrlIntr(h_Fm,1104ipcFmanEvents.eventRegId,1105ipcFmanEvents.enableEvents);1106break;1107}1108case (FM_GET_FMAN_CTRL_EVENTS_ENABLE):1109{1110uint32_t tmp = FmGetFmanCtrlIntr(h_Fm, p_IpcMsg->msgBody[0]);11111112memcpy(p_IpcReply->replyBody, (uint8_t*)&tmp, sizeof(uint32_t));1113*p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);1114break;1115}1116case (FM_GET_PHYS_MURAM_BASE):1117{1118t_FmPhysAddr physAddr;1119t_FmIpcPhysAddr ipcPhysAddr;11201121FmGetPhysicalMuramBase(h_Fm, &physAddr);1122ipcPhysAddr.high = physAddr.high;1123ipcPhysAddr.low = physAddr.low;1124memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcPhysAddr, sizeof(t_FmIpcPhysAddr));1125*p_ReplyLength = sizeof(uint32_t) + sizeof(t_FmIpcPhysAddr);1126break;1127}1128case (FM_ENABLE_RAM_ECC):1129{1130if (((err = FM_EnableRamsEcc(h_Fm)) != E_OK) ||1131((err = FM_SetException(h_Fm, e_FM_EX_IRAM_ECC, TRUE)) != E_OK) ||1132((err = FM_SetException(h_Fm, e_FM_EX_MURAM_ECC, TRUE)) != E_OK))1133#if (!(defined(DEBUG_ERRORS)) || (DEBUG_ERRORS == 0))1134UNUSED(err);1135#else1136REPORT_ERROR(MINOR, err, NO_MSG);1137#endif /* (!(defined(DEBUG_ERRORS)) || (DEBUG_ERRORS == 0)) */1138break;1139}1140case (FM_DISABLE_RAM_ECC):1141{11421143if (((err = FM_SetException(h_Fm, e_FM_EX_IRAM_ECC, FALSE)) != E_OK) ||1144((err = FM_SetException(h_Fm, e_FM_EX_MURAM_ECC, FALSE)) != E_OK) ||1145((err = FM_DisableRamsEcc(h_Fm)) != E_OK))1146#if (!(defined(DEBUG_ERRORS)) || (DEBUG_ERRORS == 0))1147UNUSED(err);1148#else1149REPORT_ERROR(MINOR, err, NO_MSG);1150#endif /* (!(defined(DEBUG_ERRORS)) || (DEBUG_ERRORS == 0)) */1151break;1152}1153case (FM_SET_NUM_OF_FMAN_CTRL):1154{1155t_FmIpcPortNumOfFmanCtrls ipcPortNumOfFmanCtrls;11561157memcpy((uint8_t*)&ipcPortNumOfFmanCtrls, p_IpcMsg->msgBody, sizeof(t_FmIpcPortNumOfFmanCtrls));1158err = FmSetNumOfRiscsPerPort(h_Fm,1159ipcPortNumOfFmanCtrls.hardwarePortId,1160ipcPortNumOfFmanCtrls.numOfFmanCtrls,1161ipcPortNumOfFmanCtrls.orFmanCtrl);1162if (err != E_OK)1163REPORT_ERROR(MINOR, err, NO_MSG);1164break;1165}1166#ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A0041167case (FM_10G_TX_ECC_WA):1168p_IpcReply->error = (uint32_t)Fm10GTxEccWorkaround(h_Fm, p_IpcMsg->msgBody[0]);1169*p_ReplyLength = sizeof(uint32_t);1170break;1171#endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */1172default:1173*p_ReplyLength = 0;1174RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("command not found!!!"));1175}1176return E_OK;1177}117811791180/****************************************/1181/* Inter-Module functions */1182/****************************************/1183#ifdef FM_TX_ECC_FRMS_ERRATA_10GMAC_A0041184t_Error Fm10GTxEccWorkaround(t_Handle h_Fm, uint8_t macId)1185{1186t_Fm *p_Fm = (t_Fm*)h_Fm;1187t_Error err = E_OK;1188t_FmIpcMsg msg;1189t_FmIpcReply reply;1190uint32_t replyLength;1191uint8_t rxHardwarePortId, txHardwarePortId;1192struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;11931194if (p_Fm->guestId != NCSW_MASTER_ID)1195{1196memset(&msg, 0, sizeof(msg));1197memset(&reply, 0, sizeof(reply));1198msg.msgId = FM_10G_TX_ECC_WA;1199msg.msgBody[0] = macId;1200replyLength = sizeof(uint32_t);1201if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],1202(uint8_t*)&msg,1203sizeof(msg.msgId)+sizeof(macId),1204(uint8_t*)&reply,1205&replyLength,1206NULL,1207NULL)) != E_OK)1208RETURN_ERROR(MINOR, err, NO_MSG);1209if (replyLength != sizeof(uint32_t))1210RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));1211return (t_Error)(reply.error);1212}12131214SANITY_CHECK_RETURN_ERROR((macId == 0), E_NOT_SUPPORTED);1215SANITY_CHECK_RETURN_ERROR(IsFmanCtrlCodeLoaded(p_Fm), E_INVALID_STATE);12161217rxHardwarePortId = SwPortIdToHwPortId(e_FM_PORT_TYPE_RX_10G,1218macId,1219p_Fm->p_FmStateStruct->revInfo.majorRev,1220p_Fm->p_FmStateStruct->revInfo.minorRev);1221txHardwarePortId = SwPortIdToHwPortId(e_FM_PORT_TYPE_TX_10G,1222macId,1223p_Fm->p_FmStateStruct->revInfo.majorRev,1224p_Fm->p_FmStateStruct->revInfo.minorRev);1225if ((p_Fm->p_FmStateStruct->portsTypes[rxHardwarePortId] != e_FM_PORT_TYPE_DUMMY) ||1226(p_Fm->p_FmStateStruct->portsTypes[txHardwarePortId] != e_FM_PORT_TYPE_DUMMY))1227RETURN_ERROR(MAJOR, E_INVALID_STATE,1228("MAC should be initialized prior to Rx and Tx ports!"));12291230return fman_set_erratum_10gmac_a004_wa(fpm_rg);1231}1232#endif /* FM_TX_ECC_FRMS_ERRATA_10GMAC_A004 */12331234uint16_t FmGetTnumAgingPeriod(t_Handle h_Fm)1235{1236t_Fm *p_Fm = (t_Fm *)h_Fm;12371238SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0);1239SANITY_CHECK_RETURN_VALUE(!p_Fm->p_FmDriverParam, E_INVALID_STATE, 0);12401241return p_Fm->tnumAgingPeriod;1242}12431244t_Error FmSetPortPreFetchConfiguration(t_Handle h_Fm,1245uint8_t portNum,1246bool preFetchConfigured)1247{1248t_Fm *p_Fm = (t_Fm*)h_Fm;12491250SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);1251SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);12521253p_Fm->portsPreFetchConfigured[portNum] = TRUE;1254p_Fm->portsPreFetchValue[portNum] = preFetchConfigured;12551256return E_OK;1257}12581259t_Error FmGetPortPreFetchConfiguration(t_Handle h_Fm,1260uint8_t portNum,1261bool *p_PortConfigured,1262bool *p_PreFetchConfigured)1263{1264t_Fm *p_Fm = (t_Fm*)h_Fm;12651266SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);1267SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);12681269/* If the prefetch wasn't configured yet (not enable or disabled)1270we return the value TRUE as it was already configured */1271if (!p_Fm->portsPreFetchConfigured[portNum])1272{1273*p_PortConfigured = FALSE;1274*p_PreFetchConfigured = FALSE;1275}1276else1277{1278*p_PortConfigured = TRUE;1279*p_PreFetchConfigured = (p_Fm->portsPreFetchConfigured[portNum]);1280}12811282return E_OK;1283}12841285t_Error FmSetCongestionGroupPFCpriority(t_Handle h_Fm,1286uint32_t congestionGroupId,1287uint8_t priorityBitMap)1288{1289t_Fm *p_Fm = (t_Fm *)h_Fm;1290uint32_t regNum;12911292ASSERT_COND(h_Fm);12931294if (congestionGroupId > FM_PORT_NUM_OF_CONGESTION_GRPS)1295RETURN_ERROR(MAJOR, E_INVALID_VALUE,1296("Congestion group ID bigger than %d",1297FM_PORT_NUM_OF_CONGESTION_GRPS));12981299if (p_Fm->guestId == NCSW_MASTER_ID)1300{1301ASSERT_COND(p_Fm->baseAddr);1302regNum = (FM_PORT_NUM_OF_CONGESTION_GRPS - 1 - congestionGroupId) / 4;1303fman_set_congestion_group_pfc_priority((uint32_t *)((p_Fm->baseAddr+FM_MM_CGP)),1304congestionGroupId,1305priorityBitMap,1306regNum);1307}1308else if (p_Fm->h_IpcSessions[0])1309{1310t_Error err;1311t_FmIpcMsg msg;1312t_FmIpcSetCongestionGroupPfcPriority fmIpcSetCongestionGroupPfcPriority;13131314memset(&msg, 0, sizeof(msg));1315memset(&fmIpcSetCongestionGroupPfcPriority, 0, sizeof(t_FmIpcSetCongestionGroupPfcPriority));1316fmIpcSetCongestionGroupPfcPriority.congestionGroupId = congestionGroupId;1317fmIpcSetCongestionGroupPfcPriority.priorityBitMap = priorityBitMap;13181319msg.msgId = FM_SET_CONG_GRP_PFC_PRIO;1320memcpy(msg.msgBody, &fmIpcSetCongestionGroupPfcPriority, sizeof(t_FmIpcSetCongestionGroupPfcPriority));13211322err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],1323(uint8_t*)&msg,1324sizeof(msg.msgId),1325NULL,1326NULL,1327NULL,1328NULL);1329if (err != E_OK)1330RETURN_ERROR(MINOR, err, NO_MSG);1331}1332else1333RETURN_ERROR(MAJOR, E_INVALID_STATE, ("guest without IPC!"));13341335return E_OK;1336}13371338uintptr_t FmGetPcdPrsBaseAddr(t_Handle h_Fm)1339{1340t_Fm *p_Fm = (t_Fm*)h_Fm;13411342SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0);13431344if (!p_Fm->baseAddr)1345{1346REPORT_ERROR(MAJOR, E_INVALID_STATE,1347("No base-addr; probably Guest with IPC!"));1348return 0;1349}13501351return (p_Fm->baseAddr + FM_MM_PRS);1352}13531354uintptr_t FmGetPcdKgBaseAddr(t_Handle h_Fm)1355{1356t_Fm *p_Fm = (t_Fm*)h_Fm;13571358SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0);13591360if (!p_Fm->baseAddr)1361{1362REPORT_ERROR(MAJOR, E_INVALID_STATE,1363("No base-addr; probably Guest with IPC!"));1364return 0;1365}13661367return (p_Fm->baseAddr + FM_MM_KG);1368}13691370uintptr_t FmGetPcdPlcrBaseAddr(t_Handle h_Fm)1371{1372t_Fm *p_Fm = (t_Fm*)h_Fm;13731374SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0);13751376if (!p_Fm->baseAddr)1377{1378REPORT_ERROR(MAJOR, E_INVALID_STATE,1379("No base-addr; probably Guest with IPC!"));1380return 0;1381}13821383return (p_Fm->baseAddr + FM_MM_PLCR);1384}13851386#if (DPAA_VERSION >= 11)1387uintptr_t FmGetVSPBaseAddr(t_Handle h_Fm)1388{1389t_Fm *p_Fm = (t_Fm*)h_Fm;13901391SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0);13921393return p_Fm->vspBaseAddr;1394}1395#endif /* (DPAA_VERSION >= 11) */13961397t_Handle FmGetMuramHandle(t_Handle h_Fm)1398{1399t_Fm *p_Fm = (t_Fm*)h_Fm;14001401SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, NULL);14021403return (p_Fm->h_FmMuram);1404}14051406void FmGetPhysicalMuramBase(t_Handle h_Fm, t_FmPhysAddr *p_FmPhysAddr)1407{1408t_Fm *p_Fm = (t_Fm*)h_Fm;14091410if (p_Fm->fmMuramPhysBaseAddr)1411{1412/* General FM driver initialization */1413p_FmPhysAddr->low = (uint32_t)p_Fm->fmMuramPhysBaseAddr;1414p_FmPhysAddr->high = (uint8_t)((p_Fm->fmMuramPhysBaseAddr & 0x000000ff00000000LL) >> 32);1415return;1416}14171418ASSERT_COND(p_Fm->guestId != NCSW_MASTER_ID);14191420if (p_Fm->h_IpcSessions[0])1421{1422t_Error err;1423t_FmIpcMsg msg;1424t_FmIpcReply reply;1425uint32_t replyLength;1426t_FmIpcPhysAddr ipcPhysAddr;14271428memset(&msg, 0, sizeof(msg));1429memset(&reply, 0, sizeof(reply));1430msg.msgId = FM_GET_PHYS_MURAM_BASE;1431replyLength = sizeof(uint32_t) + sizeof(t_FmPhysAddr);1432err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],1433(uint8_t*)&msg,1434sizeof(msg.msgId),1435(uint8_t*)&reply,1436&replyLength,1437NULL,1438NULL);1439if (err != E_OK)1440{1441REPORT_ERROR(MINOR, err, NO_MSG);1442return;1443}1444if (replyLength != (sizeof(uint32_t) + sizeof(t_FmPhysAddr)))1445{1446REPORT_ERROR(MINOR, E_INVALID_VALUE,("IPC reply length mismatch"));1447return;1448}1449memcpy((uint8_t*)&ipcPhysAddr, reply.replyBody, sizeof(t_FmIpcPhysAddr));1450p_FmPhysAddr->high = ipcPhysAddr.high;1451p_FmPhysAddr->low = ipcPhysAddr.low;1452}1453else1454REPORT_ERROR(MINOR, E_NOT_SUPPORTED,1455("running in guest-mode without neither IPC nor mapped register!"));1456}14571458#if (DPAA_VERSION >= 11)1459t_Error FmVSPAllocForPort (t_Handle h_Fm,1460e_FmPortType portType,1461uint8_t portId,1462uint8_t numOfVSPs)1463{1464t_Fm *p_Fm = (t_Fm *)h_Fm;1465t_Error err = E_OK;1466uint32_t profilesFound, intFlags;1467uint8_t first, i;1468uint8_t log2Num;1469uint8_t swPortIndex=0, hardwarePortId;14701471SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);14721473if (!numOfVSPs)1474return E_OK;14751476if (numOfVSPs > FM_VSP_MAX_NUM_OF_ENTRIES)1477RETURN_ERROR(MINOR, E_INVALID_VALUE, ("numProfiles can not be bigger than %d.",FM_VSP_MAX_NUM_OF_ENTRIES));14781479if (!POWER_OF_2(numOfVSPs))1480RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numProfiles must be a power of 2."));14811482LOG2((uint64_t)numOfVSPs, log2Num);14831484if ((log2Num == 0) || (p_Fm->partVSPBase == 0))1485first = 0;1486else1487first = 1<<log2Num;14881489if (first > (p_Fm->partVSPBase + p_Fm->partNumOfVSPs))1490RETURN_ERROR(MINOR, E_INVALID_VALUE, ("can not allocate storage profile port window"));14911492if (first < p_Fm->partVSPBase)1493while (first < p_Fm->partVSPBase)1494first = first + numOfVSPs;14951496if ((first + numOfVSPs) > (p_Fm->partVSPBase + p_Fm->partNumOfVSPs))1497RETURN_ERROR(MINOR, E_INVALID_VALUE, ("can not allocate storage profile port window"));14981499intFlags = XX_LockIntrSpinlock(p_Fm->h_Spinlock);1500profilesFound = 0;1501for (i=first; i < p_Fm->partVSPBase + p_Fm->partNumOfVSPs; )1502{1503if (!p_Fm->p_FmSp->profiles[i].profilesMng.allocated)1504{1505profilesFound++;1506i++;1507if (profilesFound == numOfVSPs)1508break;1509}1510else1511{1512profilesFound = 0;1513/* advance i to the next aligned address */1514first = i = (uint8_t)(first + numOfVSPs);1515}1516}1517if (profilesFound == numOfVSPs)1518for (i = first; i<first + numOfVSPs; i++)1519p_Fm->p_FmSp->profiles[i].profilesMng.allocated = TRUE;1520else1521{1522XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);1523RETURN_ERROR(MINOR, E_FULL, ("No profiles."));1524}15251526hardwarePortId = SwPortIdToHwPortId(portType,1527portId,1528p_Fm->p_FmStateStruct->revInfo.majorRev,1529p_Fm->p_FmStateStruct->revInfo.minorRev);1530HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId);15311532p_Fm->p_FmSp->portsMapping[swPortIndex].numOfProfiles = numOfVSPs;1533p_Fm->p_FmSp->portsMapping[swPortIndex].profilesBase = first;15341535if ((err = SetVSPWindow(h_Fm,hardwarePortId, first,log2Num)) != E_OK)1536for (i = first; i < first + numOfVSPs; i++)1537p_Fm->p_FmSp->profiles[i].profilesMng.allocated = FALSE;15381539XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);15401541return err;1542}15431544t_Error FmVSPFreeForPort(t_Handle h_Fm,1545e_FmPortType portType,1546uint8_t portId)1547{1548t_Fm *p_Fm = (t_Fm *)h_Fm;1549uint8_t swPortIndex=0, hardwarePortId, first, numOfVSPs, i;1550uint32_t intFlags;15511552SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);15531554hardwarePortId = SwPortIdToHwPortId(portType,1555portId,1556p_Fm->p_FmStateStruct->revInfo.majorRev,1557p_Fm->p_FmStateStruct->revInfo.minorRev);1558HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId);15591560numOfVSPs = (uint8_t)p_Fm->p_FmSp->portsMapping[swPortIndex].numOfProfiles;1561first = (uint8_t)p_Fm->p_FmSp->portsMapping[swPortIndex].profilesBase;15621563intFlags = XX_LockIntrSpinlock(p_Fm->h_Spinlock);1564for (i = first; i < first + numOfVSPs; i++)1565p_Fm->p_FmSp->profiles[i].profilesMng.allocated = FALSE;1566XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);15671568p_Fm->p_FmSp->portsMapping[swPortIndex].numOfProfiles = 0;1569p_Fm->p_FmSp->portsMapping[swPortIndex].profilesBase = 0;15701571return E_OK;1572}1573#endif /* (DPAA_VERSION >= 11) */15741575t_Error FmAllocFmanCtrlEventReg(t_Handle h_Fm, uint8_t *p_EventId)1576{1577t_Fm *p_Fm = (t_Fm*)h_Fm;1578uint8_t i;15791580SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);15811582if ((p_Fm->guestId != NCSW_MASTER_ID) &&1583p_Fm->h_IpcSessions[0])1584{1585t_Error err;1586t_FmIpcMsg msg;1587t_FmIpcReply reply;1588uint32_t replyLength;15891590memset(&msg, 0, sizeof(msg));1591memset(&reply, 0, sizeof(reply));1592msg.msgId = FM_ALLOC_FMAN_CTRL_EVENT_REG;1593replyLength = sizeof(uint32_t) + sizeof(uint8_t);1594if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],1595(uint8_t*)&msg,1596sizeof(msg.msgId),1597(uint8_t*)&reply,1598&replyLength,1599NULL,1600NULL)) != E_OK)1601RETURN_ERROR(MAJOR, err, NO_MSG);16021603if (replyLength != (sizeof(uint32_t) + sizeof(uint8_t)))1604RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));16051606*p_EventId = *(uint8_t*)(reply.replyBody);16071608return (t_Error)(reply.error);1609}1610else if (p_Fm->guestId != NCSW_MASTER_ID)1611RETURN_ERROR(MINOR, E_NOT_SUPPORTED,1612("running in guest-mode without IPC!"));16131614for (i=0;i<FM_NUM_OF_FMAN_CTRL_EVENT_REGS;i++)1615if (!p_Fm->usedEventRegs[i])1616{1617p_Fm->usedEventRegs[i] = TRUE;1618*p_EventId = i;1619break;1620}16211622if (i==FM_NUM_OF_FMAN_CTRL_EVENT_REGS)1623RETURN_ERROR(MAJOR, E_BUSY, ("No resource - FMan controller event register."));16241625return E_OK;1626}16271628void FmFreeFmanCtrlEventReg(t_Handle h_Fm, uint8_t eventId)1629{1630t_Fm *p_Fm = (t_Fm*)h_Fm;16311632SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE);16331634if ((p_Fm->guestId != NCSW_MASTER_ID) &&1635p_Fm->h_IpcSessions[0])1636{1637t_Error err;1638t_FmIpcMsg msg;16391640memset(&msg, 0, sizeof(msg));1641msg.msgId = FM_FREE_FMAN_CTRL_EVENT_REG;1642msg.msgBody[0] = eventId;1643err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],1644(uint8_t*)&msg,1645sizeof(msg.msgId)+sizeof(eventId),1646NULL,1647NULL,1648NULL,1649NULL);1650if (err != E_OK)1651REPORT_ERROR(MINOR, err, NO_MSG);1652return;1653}1654else if (p_Fm->guestId != NCSW_MASTER_ID)1655{1656REPORT_ERROR(MINOR, E_NOT_SUPPORTED,1657("running in guest-mode without IPC!"));1658return;1659}16601661((t_Fm*)h_Fm)->usedEventRegs[eventId] = FALSE;1662}16631664void FmSetFmanCtrlIntr(t_Handle h_Fm, uint8_t eventRegId, uint32_t enableEvents)1665{1666t_Fm *p_Fm = (t_Fm*)h_Fm;1667struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;16681669if ((p_Fm->guestId != NCSW_MASTER_ID) &&1670!p_Fm->p_FmFpmRegs &&1671p_Fm->h_IpcSessions[0])1672{1673t_FmIpcFmanEvents fmanCtrl;1674t_Error err;1675t_FmIpcMsg msg;16761677fmanCtrl.eventRegId = eventRegId;1678fmanCtrl.enableEvents = enableEvents;1679memset(&msg, 0, sizeof(msg));1680msg.msgId = FM_SET_FMAN_CTRL_EVENTS_ENABLE;1681memcpy(msg.msgBody, &fmanCtrl, sizeof(fmanCtrl));1682err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],1683(uint8_t*)&msg,1684sizeof(msg.msgId)+sizeof(fmanCtrl),1685NULL,1686NULL,1687NULL,1688NULL);1689if (err != E_OK)1690REPORT_ERROR(MINOR, err, NO_MSG);1691return;1692}1693else if (!p_Fm->p_FmFpmRegs)1694{1695REPORT_ERROR(MINOR, E_NOT_SUPPORTED,1696("Either IPC or 'baseAddress' is required!"));1697return;1698}16991700ASSERT_COND(eventRegId < FM_NUM_OF_FMAN_CTRL_EVENT_REGS);1701fman_set_ctrl_intr(fpm_rg, eventRegId, enableEvents);1702}17031704uint32_t FmGetFmanCtrlIntr(t_Handle h_Fm, uint8_t eventRegId)1705{1706t_Fm *p_Fm = (t_Fm*)h_Fm;1707struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;17081709if ((p_Fm->guestId != NCSW_MASTER_ID) &&1710!p_Fm->p_FmFpmRegs &&1711p_Fm->h_IpcSessions[0])1712{1713t_Error err;1714t_FmIpcMsg msg;1715t_FmIpcReply reply;1716uint32_t replyLength, ctrlIntr;17171718memset(&msg, 0, sizeof(msg));1719memset(&reply, 0, sizeof(reply));1720msg.msgId = FM_GET_FMAN_CTRL_EVENTS_ENABLE;1721msg.msgBody[0] = eventRegId;1722replyLength = sizeof(uint32_t) + sizeof(uint32_t);1723err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],1724(uint8_t*)&msg,1725sizeof(msg.msgId)+sizeof(eventRegId),1726(uint8_t*)&reply,1727&replyLength,1728NULL,1729NULL);1730if (err != E_OK)1731{1732REPORT_ERROR(MINOR, err, NO_MSG);1733return 0;1734}1735if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t)))1736{1737REPORT_ERROR(MINOR, E_INVALID_VALUE, ("IPC reply length mismatch"));1738return 0;1739}1740memcpy((uint8_t*)&ctrlIntr, reply.replyBody, sizeof(uint32_t));1741return ctrlIntr;1742}1743else if (!p_Fm->p_FmFpmRegs)1744{1745REPORT_ERROR(MINOR, E_NOT_SUPPORTED,1746("Either IPC or 'baseAddress' is required!"));1747return 0;1748}17491750return fman_get_ctrl_intr(fpm_rg, eventRegId);1751}17521753void FmRegisterIntr(t_Handle h_Fm,1754e_FmEventModules module,1755uint8_t modId,1756e_FmIntrType intrType,1757void (*f_Isr) (t_Handle h_Arg),1758t_Handle h_Arg)1759{1760t_Fm *p_Fm = (t_Fm*)h_Fm;1761int event = 0;17621763ASSERT_COND(h_Fm);17641765GET_FM_MODULE_EVENT(module, modId, intrType, event);1766ASSERT_COND(event < e_FM_EV_DUMMY_LAST);17671768/* register in local FM structure */1769p_Fm->intrMng[event].f_Isr = f_Isr;1770p_Fm->intrMng[event].h_SrcHandle = h_Arg;17711772if ((p_Fm->guestId != NCSW_MASTER_ID) &&1773p_Fm->h_IpcSessions[0])1774{1775t_FmIpcRegisterIntr fmIpcRegisterIntr;1776t_Error err;1777t_FmIpcMsg msg;17781779/* register in Master FM structure */1780fmIpcRegisterIntr.event = (uint32_t)event;1781fmIpcRegisterIntr.guestId = p_Fm->guestId;1782memset(&msg, 0, sizeof(msg));1783msg.msgId = FM_REGISTER_INTR;1784memcpy(msg.msgBody, &fmIpcRegisterIntr, sizeof(fmIpcRegisterIntr));1785err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],1786(uint8_t*)&msg,1787sizeof(msg.msgId) + sizeof(fmIpcRegisterIntr),1788NULL,1789NULL,1790NULL,1791NULL);1792if (err != E_OK)1793REPORT_ERROR(MINOR, err, NO_MSG);1794}1795else if (p_Fm->guestId != NCSW_MASTER_ID)1796REPORT_ERROR(MINOR, E_NOT_SUPPORTED,1797("running in guest-mode without IPC!"));1798}17991800void FmUnregisterIntr(t_Handle h_Fm,1801e_FmEventModules module,1802uint8_t modId,1803e_FmIntrType intrType)1804{1805t_Fm *p_Fm = (t_Fm*)h_Fm;1806int event = 0;18071808ASSERT_COND(h_Fm);18091810GET_FM_MODULE_EVENT(module, modId,intrType, event);1811ASSERT_COND(event < e_FM_EV_DUMMY_LAST);18121813p_Fm->intrMng[event].f_Isr = UnimplementedIsr;1814p_Fm->intrMng[event].h_SrcHandle = NULL;1815}18161817void FmRegisterFmanCtrlIntr(t_Handle h_Fm, uint8_t eventRegId, void (*f_Isr) (t_Handle h_Arg, uint32_t event), t_Handle h_Arg)1818{1819t_Fm *p_Fm = (t_Fm*)h_Fm;18201821ASSERT_COND(eventRegId<FM_NUM_OF_FMAN_CTRL_EVENT_REGS);18221823if (p_Fm->guestId != NCSW_MASTER_ID)1824{1825REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM in guest-mode"));1826return;1827}18281829p_Fm->fmanCtrlIntr[eventRegId].f_Isr = f_Isr;1830p_Fm->fmanCtrlIntr[eventRegId].h_SrcHandle = h_Arg;1831}18321833void FmUnregisterFmanCtrlIntr(t_Handle h_Fm, uint8_t eventRegId)1834{1835t_Fm *p_Fm = (t_Fm*)h_Fm;18361837ASSERT_COND(eventRegId<FM_NUM_OF_FMAN_CTRL_EVENT_REGS);18381839if (p_Fm->guestId != NCSW_MASTER_ID)1840{1841REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM in guest-mode"));1842return;1843}18441845p_Fm->fmanCtrlIntr[eventRegId].f_Isr = UnimplementedFmanCtrlIsr;1846p_Fm->fmanCtrlIntr[eventRegId].h_SrcHandle = NULL;1847}18481849void FmRegisterPcd(t_Handle h_Fm, t_Handle h_FmPcd)1850{1851t_Fm *p_Fm = (t_Fm*)h_Fm;18521853if (p_Fm->h_Pcd)1854REPORT_ERROR(MAJOR, E_ALREADY_EXISTS, ("PCD already set"));18551856p_Fm->h_Pcd = h_FmPcd;1857}18581859void FmUnregisterPcd(t_Handle h_Fm)1860{1861t_Fm *p_Fm = (t_Fm*)h_Fm;18621863if (!p_Fm->h_Pcd)1864REPORT_ERROR(MAJOR, E_NOT_FOUND, ("PCD handle!"));18651866p_Fm->h_Pcd = NULL;1867}18681869t_Handle FmGetPcdHandle(t_Handle h_Fm)1870{1871t_Fm *p_Fm = (t_Fm*)h_Fm;18721873return p_Fm->h_Pcd;1874}18751876uint8_t FmGetId(t_Handle h_Fm)1877{1878t_Fm *p_Fm = (t_Fm*)h_Fm;18791880SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0xff);18811882return p_Fm->p_FmStateStruct->fmId;1883}18841885t_Error FmReset(t_Handle h_Fm)1886{1887t_Fm *p_Fm = (t_Fm*)h_Fm;18881889SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);18901891WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_rstc, FPM_RSTC_FM_RESET);1892CORE_MemoryBarrier();1893XX_UDelay(100);18941895return E_OK;1896}18971898t_Error FmSetNumOfRiscsPerPort(t_Handle h_Fm,1899uint8_t hardwarePortId,1900uint8_t numOfFmanCtrls,1901t_FmFmanCtrl orFmanCtrl)1902{19031904t_Fm *p_Fm = (t_Fm*)h_Fm;1905struct fman_fpm_regs *fpm_rg;19061907SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);1908SANITY_CHECK_RETURN_ERROR(((numOfFmanCtrls > 0) && (numOfFmanCtrls < 3)) , E_INVALID_HANDLE);19091910fpm_rg = p_Fm->p_FmFpmRegs;1911if ((p_Fm->guestId != NCSW_MASTER_ID) &&1912!p_Fm->p_FmFpmRegs &&1913p_Fm->h_IpcSessions[0])1914{1915t_Error err;1916t_FmIpcPortNumOfFmanCtrls params;1917t_FmIpcMsg msg;19181919memset(&msg, 0, sizeof(msg));1920params.hardwarePortId = hardwarePortId;1921params.numOfFmanCtrls = numOfFmanCtrls;1922params.orFmanCtrl = orFmanCtrl;1923msg.msgId = FM_SET_NUM_OF_FMAN_CTRL;1924memcpy(msg.msgBody, ¶ms, sizeof(params));1925err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],1926(uint8_t*)&msg,1927sizeof(msg.msgId) +sizeof(params),1928NULL,1929NULL,1930NULL,1931NULL);1932if (err != E_OK)1933RETURN_ERROR(MINOR, err, NO_MSG);1934return E_OK;1935}1936else if (!p_Fm->p_FmFpmRegs)1937RETURN_ERROR(MINOR, E_NOT_SUPPORTED,1938("Either IPC or 'baseAddress' is required!"));19391940fman_set_num_of_riscs_per_port(fpm_rg, hardwarePortId, numOfFmanCtrls, orFmanCtrl);19411942return E_OK;1943}19441945t_Error FmGetSetPortParams(t_Handle h_Fm, t_FmInterModulePortInitParams *p_PortParams)1946{1947t_Fm *p_Fm = (t_Fm*)h_Fm;1948t_Error err;1949uint32_t intFlags;1950uint8_t hardwarePortId = p_PortParams->hardwarePortId, macId;1951struct fman_rg fman_rg;19521953fman_rg.bmi_rg = p_Fm->p_FmBmiRegs;1954fman_rg.qmi_rg = p_Fm->p_FmQmiRegs;1955fman_rg.fpm_rg = p_Fm->p_FmFpmRegs;1956fman_rg.dma_rg = p_Fm->p_FmDmaRegs;19571958if (p_Fm->guestId != NCSW_MASTER_ID)1959{1960t_FmIpcPortInInitParams portInParams;1961t_FmIpcPortOutInitParams portOutParams;1962t_FmIpcMsg msg;1963t_FmIpcReply reply;1964uint32_t replyLength;19651966portInParams.hardwarePortId = p_PortParams->hardwarePortId;1967portInParams.enumPortType = (uint32_t)p_PortParams->portType;1968portInParams.boolIndependentMode= (uint8_t)p_PortParams->independentMode;1969portInParams.liodnOffset = p_PortParams->liodnOffset;1970portInParams.numOfTasks = p_PortParams->numOfTasks;1971portInParams.numOfExtraTasks = p_PortParams->numOfExtraTasks;1972portInParams.numOfOpenDmas = p_PortParams->numOfOpenDmas;1973portInParams.numOfExtraOpenDmas = p_PortParams->numOfExtraOpenDmas;1974portInParams.sizeOfFifo = p_PortParams->sizeOfFifo;1975portInParams.extraSizeOfFifo = p_PortParams->extraSizeOfFifo;1976portInParams.deqPipelineDepth = p_PortParams->deqPipelineDepth;1977portInParams.maxFrameLength = p_PortParams->maxFrameLength;1978portInParams.liodnBase = p_PortParams->liodnBase;19791980memset(&msg, 0, sizeof(msg));1981memset(&reply, 0, sizeof(reply));1982msg.msgId = FM_GET_SET_PORT_PARAMS;1983memcpy(msg.msgBody, &portInParams, sizeof(portInParams));1984replyLength = (sizeof(uint32_t) + sizeof(t_FmIpcPortOutInitParams));1985if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],1986(uint8_t*)&msg,1987sizeof(msg.msgId) +sizeof(portInParams),1988(uint8_t*)&reply,1989&replyLength,1990NULL,1991NULL)) != E_OK)1992RETURN_ERROR(MINOR, err, NO_MSG);1993if (replyLength != (sizeof(uint32_t) + sizeof(t_FmIpcPortOutInitParams)))1994RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));1995memcpy((uint8_t*)&portOutParams, reply.replyBody, sizeof(t_FmIpcPortOutInitParams));19961997p_PortParams->fmMuramPhysBaseAddr.high = portOutParams.ipcPhysAddr.high;1998p_PortParams->fmMuramPhysBaseAddr.low = portOutParams.ipcPhysAddr.low;1999p_PortParams->numOfTasks = portOutParams.numOfTasks;2000p_PortParams->numOfExtraTasks = portOutParams.numOfExtraTasks;2001p_PortParams->numOfOpenDmas = portOutParams.numOfOpenDmas;2002p_PortParams->numOfExtraOpenDmas = portOutParams.numOfExtraOpenDmas;2003p_PortParams->sizeOfFifo = portOutParams.sizeOfFifo;2004p_PortParams->extraSizeOfFifo = portOutParams.extraSizeOfFifo;20052006return (t_Error)(reply.error);2007}20082009ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));20102011intFlags = XX_LockIntrSpinlock(p_Fm->h_Spinlock);2012if (p_PortParams->independentMode)2013{2014/* set port parameters */2015p_Fm->independentMode = p_PortParams->independentMode;2016/* disable dispatch limit */2017fman_qmi_disable_dispatch_limit(fman_rg.fpm_rg);2018}20192020if (p_PortParams->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND)2021{2022if (p_Fm->hcPortInitialized)2023{2024XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);2025RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Only one host command port is allowed."));2026}2027else2028p_Fm->hcPortInitialized = TRUE;2029}2030p_Fm->p_FmStateStruct->portsTypes[hardwarePortId] = p_PortParams->portType;20312032err = FmSetNumOfTasks(p_Fm, hardwarePortId, &p_PortParams->numOfTasks, &p_PortParams->numOfExtraTasks, TRUE);2033if (err)2034{2035XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);2036RETURN_ERROR(MAJOR, err, NO_MSG);2037}20382039#ifdef FM_QMI_NO_DEQ_OPTIONS_SUPPORT2040if (p_Fm->p_FmStateStruct->revInfo.majorRev != 4)2041#endif /* FM_QMI_NO_DEQ_OPTIONS_SUPPORT */2042if ((p_PortParams->portType != e_FM_PORT_TYPE_RX) &&2043(p_PortParams->portType != e_FM_PORT_TYPE_RX_10G))2044/* for transmit & O/H ports */2045{2046uint8_t enqTh;2047uint8_t deqTh;20482049/* update qmi ENQ/DEQ threshold */2050p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums += p_PortParams->deqPipelineDepth;2051enqTh = fman_get_qmi_enq_th(fman_rg.qmi_rg);2052/* if enqTh is too big, we reduce it to the max value that is still OK */2053if (enqTh >= (QMI_MAX_NUM_OF_TNUMS - p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums))2054{2055enqTh = (uint8_t)(QMI_MAX_NUM_OF_TNUMS - p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums - 1);2056fman_set_qmi_enq_th(fman_rg.qmi_rg, enqTh);2057}20582059deqTh = fman_get_qmi_deq_th(fman_rg.qmi_rg);2060/* if deqTh is too small, we enlarge it to the min value that is still OK.2061deqTh may not be larger than 63 (QMI_MAX_NUM_OF_TNUMS-1). */2062if ((deqTh <= p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums) && (deqTh < QMI_MAX_NUM_OF_TNUMS-1))2063{2064deqTh = (uint8_t)(p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums + 1);2065fman_set_qmi_deq_th(fman_rg.qmi_rg, deqTh);2066}2067}20682069#ifdef FM_LOW_END_RESTRICTION2070if ((hardwarePortId==0x1) || (hardwarePortId==0x29))2071{2072if (p_Fm->p_FmStateStruct->lowEndRestriction)2073{2074XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);2075RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("OP #0 cannot work with Tx Port #1."));2076}2077else2078p_Fm->p_FmStateStruct->lowEndRestriction = TRUE;2079}2080#endif /* FM_LOW_END_RESTRICTION */20812082err = FmSetSizeOfFifo(p_Fm,2083hardwarePortId,2084&p_PortParams->sizeOfFifo,2085&p_PortParams->extraSizeOfFifo,2086TRUE);2087if (err)2088{2089XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);2090RETURN_ERROR(MAJOR, err, NO_MSG);2091}20922093err = FmSetNumOfOpenDmas(p_Fm,2094hardwarePortId,2095&p_PortParams->numOfOpenDmas,2096&p_PortParams->numOfExtraOpenDmas,2097TRUE);2098if (err)2099{2100XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);2101RETURN_ERROR(MAJOR, err, NO_MSG);2102}21032104fman_set_liodn_per_port(&fman_rg,2105hardwarePortId,2106p_PortParams->liodnBase,2107p_PortParams->liodnOffset);21082109if (p_Fm->p_FmStateStruct->revInfo.majorRev < 6)2110fman_set_order_restoration_per_port(fman_rg.fpm_rg,2111hardwarePortId,2112p_PortParams->independentMode,2113!!((p_PortParams->portType==e_FM_PORT_TYPE_RX) || (p_PortParams->portType==e_FM_PORT_TYPE_RX_10G)));21142115HW_PORT_ID_TO_SW_PORT_ID(macId, hardwarePortId);21162117#if defined(FM_MAX_NUM_OF_10G_MACS) && (FM_MAX_NUM_OF_10G_MACS)2118if ((p_PortParams->portType == e_FM_PORT_TYPE_TX_10G) ||2119(p_PortParams->portType == e_FM_PORT_TYPE_RX_10G))2120{2121ASSERT_COND(macId < FM_MAX_NUM_OF_10G_MACS);2122if (p_PortParams->maxFrameLength >= p_Fm->p_FmStateStruct->macMaxFrameLengths10G[macId])2123p_Fm->p_FmStateStruct->portMaxFrameLengths10G[macId] = p_PortParams->maxFrameLength;2124else2125RETURN_ERROR(MINOR, E_INVALID_VALUE, ("Port maxFrameLength is smaller than MAC current MTU"));2126}2127else2128#endif /* defined(FM_MAX_NUM_OF_10G_MACS) && ... */2129if ((p_PortParams->portType == e_FM_PORT_TYPE_TX) ||2130(p_PortParams->portType == e_FM_PORT_TYPE_RX))2131{2132ASSERT_COND(macId < FM_MAX_NUM_OF_1G_MACS);2133if (p_PortParams->maxFrameLength >= p_Fm->p_FmStateStruct->macMaxFrameLengths1G[macId])2134p_Fm->p_FmStateStruct->portMaxFrameLengths1G[macId] = p_PortParams->maxFrameLength;2135else2136RETURN_ERROR(MINOR, E_INVALID_VALUE, ("Port maxFrameLength is smaller than MAC current MTU"));2137}21382139FmGetPhysicalMuramBase(p_Fm, &p_PortParams->fmMuramPhysBaseAddr);2140XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);21412142return E_OK;2143}21442145void FmFreePortParams(t_Handle h_Fm,t_FmInterModulePortFreeParams *p_PortParams)2146{2147t_Fm *p_Fm = (t_Fm*)h_Fm;2148uint32_t intFlags;2149uint8_t hardwarePortId = p_PortParams->hardwarePortId;2150uint8_t numOfTasks, numOfDmas, macId;2151uint16_t sizeOfFifo;2152t_Error err;2153t_FmIpcPortFreeParams portParams;2154t_FmIpcMsg msg;2155struct fman_qmi_regs *qmi_rg = p_Fm->p_FmQmiRegs;2156struct fman_bmi_regs *bmi_rg = p_Fm->p_FmBmiRegs;21572158if (p_Fm->guestId != NCSW_MASTER_ID)2159{2160portParams.hardwarePortId = p_PortParams->hardwarePortId;2161portParams.enumPortType = (uint32_t)p_PortParams->portType;2162portParams.deqPipelineDepth = p_PortParams->deqPipelineDepth;2163memset(&msg, 0, sizeof(msg));2164msg.msgId = FM_FREE_PORT;2165memcpy(msg.msgBody, &portParams, sizeof(portParams));2166err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],2167(uint8_t*)&msg,2168sizeof(msg.msgId)+sizeof(portParams),2169NULL,2170NULL,2171NULL,2172NULL);2173if (err != E_OK)2174REPORT_ERROR(MINOR, err, NO_MSG);2175return;2176}21772178ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));21792180intFlags = XX_LockIntrSpinlock(p_Fm->h_Spinlock);21812182if (p_PortParams->portType == e_FM_PORT_TYPE_OH_HOST_COMMAND)2183{2184ASSERT_COND(p_Fm->hcPortInitialized);2185p_Fm->hcPortInitialized = FALSE;2186}21872188p_Fm->p_FmStateStruct->portsTypes[hardwarePortId] = e_FM_PORT_TYPE_DUMMY;21892190/* free numOfTasks */2191numOfTasks = fman_get_num_of_tasks(bmi_rg, hardwarePortId);2192ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedNumOfTasks >= numOfTasks);2193p_Fm->p_FmStateStruct->accumulatedNumOfTasks -= numOfTasks;21942195/* free numOfOpenDmas */2196numOfDmas = fman_get_num_of_dmas(bmi_rg, hardwarePortId);2197ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas >= numOfDmas);2198p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas -= numOfDmas;21992200#ifdef FM_HAS_TOTAL_DMAS2201if (p_Fm->p_FmStateStruct->revInfo.majorRev < 6)2202{2203/* update total num of DMA's with committed number of open DMAS, and max uncommitted pool. */2204fman_set_num_of_open_dmas(bmi_rg,2205hardwarePortId,22061,22070,2208(uint8_t)(p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas + p_Fm->p_FmStateStruct->extraOpenDmasPoolSize));2209}2210#endif /* FM_HAS_TOTAL_DMAS */22112212/* free sizeOfFifo */2213sizeOfFifo = fman_get_size_of_fifo(bmi_rg, hardwarePortId);2214ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedFifoSize >= (sizeOfFifo * BMI_FIFO_UNITS));2215p_Fm->p_FmStateStruct->accumulatedFifoSize -= (sizeOfFifo * BMI_FIFO_UNITS);22162217#ifdef FM_QMI_NO_DEQ_OPTIONS_SUPPORT2218if (p_Fm->p_FmStateStruct->revInfo.majorRev != 4)2219#endif /* FM_QMI_NO_DEQ_OPTIONS_SUPPORT */2220if ((p_PortParams->portType != e_FM_PORT_TYPE_RX) &&2221(p_PortParams->portType != e_FM_PORT_TYPE_RX_10G))2222/* for transmit & O/H ports */2223{2224uint8_t enqTh;2225uint8_t deqTh;22262227/* update qmi ENQ/DEQ threshold */2228p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums -= p_PortParams->deqPipelineDepth;22292230/* p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums is now smaller,2231so we can enlarge enqTh */2232enqTh = (uint8_t)(QMI_MAX_NUM_OF_TNUMS - p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums - 1);22332234/* p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums is now smaller,2235so we can reduce deqTh */2236deqTh = (uint8_t)(p_Fm->p_FmStateStruct->accumulatedNumOfDeqTnums + 1);22372238fman_set_qmi_enq_th(qmi_rg, enqTh);2239fman_set_qmi_deq_th(qmi_rg, deqTh);2240}22412242HW_PORT_ID_TO_SW_PORT_ID(macId, hardwarePortId);22432244#if defined(FM_MAX_NUM_OF_10G_MACS) && (FM_MAX_NUM_OF_10G_MACS)2245if ((p_PortParams->portType == e_FM_PORT_TYPE_TX_10G) ||2246(p_PortParams->portType == e_FM_PORT_TYPE_RX_10G))2247{2248ASSERT_COND(macId < FM_MAX_NUM_OF_10G_MACS);2249p_Fm->p_FmStateStruct->portMaxFrameLengths10G[macId] = 0;2250}2251else2252#endif /* defined(FM_MAX_NUM_OF_10G_MACS) && ... */2253if ((p_PortParams->portType == e_FM_PORT_TYPE_TX) ||2254(p_PortParams->portType == e_FM_PORT_TYPE_RX))2255{2256ASSERT_COND(macId < FM_MAX_NUM_OF_1G_MACS);2257p_Fm->p_FmStateStruct->portMaxFrameLengths1G[macId] = 0;2258}22592260#ifdef FM_LOW_END_RESTRICTION2261if ((hardwarePortId==0x1) || (hardwarePortId==0x29))2262p_Fm->p_FmStateStruct->lowEndRestriction = FALSE;2263#endif /* FM_LOW_END_RESTRICTION */2264XX_UnlockIntrSpinlock(p_Fm->h_Spinlock, intFlags);2265}22662267t_Error FmIsPortStalled(t_Handle h_Fm, uint8_t hardwarePortId, bool *p_IsStalled)2268{2269t_Fm *p_Fm = (t_Fm*)h_Fm;2270t_Error err;2271t_FmIpcMsg msg;2272t_FmIpcReply reply;2273uint32_t replyLength;2274struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;22752276if ((p_Fm->guestId != NCSW_MASTER_ID) &&2277!p_Fm->baseAddr &&2278p_Fm->h_IpcSessions[0])2279{2280memset(&msg, 0, sizeof(msg));2281memset(&reply, 0, sizeof(reply));2282msg.msgId = FM_IS_PORT_STALLED;2283msg.msgBody[0] = hardwarePortId;2284replyLength = sizeof(uint32_t) + sizeof(uint8_t);2285err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],2286(uint8_t*)&msg,2287sizeof(msg.msgId)+sizeof(hardwarePortId),2288(uint8_t*)&reply,2289&replyLength,2290NULL,2291NULL);2292if (err != E_OK)2293RETURN_ERROR(MINOR, err, NO_MSG);2294if (replyLength != (sizeof(uint32_t) + sizeof(uint8_t)))2295RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));22962297*p_IsStalled = (bool)!!(*(uint8_t*)(reply.replyBody));22982299return (t_Error)(reply.error);2300}2301else if (!p_Fm->baseAddr)2302RETURN_ERROR(MINOR, E_NOT_SUPPORTED,2303("Either IPC or 'baseAddress' is required!"));23042305*p_IsStalled = fman_is_port_stalled(fpm_rg, hardwarePortId);23062307return E_OK;2308}23092310t_Error FmResumeStalledPort(t_Handle h_Fm, uint8_t hardwarePortId)2311{2312t_Fm *p_Fm = (t_Fm*)h_Fm;2313t_Error err;2314bool isStalled;2315struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;23162317if ((p_Fm->guestId != NCSW_MASTER_ID) &&2318!p_Fm->baseAddr &&2319p_Fm->h_IpcSessions[0])2320{2321t_FmIpcMsg msg;2322t_FmIpcReply reply;2323uint32_t replyLength;23242325memset(&msg, 0, sizeof(msg));2326memset(&reply, 0, sizeof(reply));2327msg.msgId = FM_RESUME_STALLED_PORT;2328msg.msgBody[0] = hardwarePortId;2329replyLength = sizeof(uint32_t);2330err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],2331(uint8_t*)&msg,2332sizeof(msg.msgId) + sizeof(hardwarePortId),2333(uint8_t*)&reply,2334&replyLength,2335NULL,2336NULL);2337if (err != E_OK)2338RETURN_ERROR(MINOR, err, NO_MSG);2339if (replyLength != sizeof(uint32_t))2340RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));2341return (t_Error)(reply.error);2342}2343else if (!p_Fm->baseAddr)2344RETURN_ERROR(MINOR, E_NOT_SUPPORTED,2345("Either IPC or 'baseAddress' is required!"));23462347if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)2348RETURN_ERROR(MINOR, E_NOT_AVAILABLE, ("Not available for this FM revision!"));23492350/* Get port status */2351err = FmIsPortStalled(h_Fm, hardwarePortId, &isStalled);2352if (err)2353RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Can't get port status"));2354if (!isStalled)2355return E_OK;23562357fman_resume_stalled_port(fpm_rg, hardwarePortId);23582359return E_OK;2360}23612362t_Error FmResetMac(t_Handle h_Fm, e_FmMacType type, uint8_t macId)2363{2364t_Fm *p_Fm = (t_Fm*)h_Fm;2365t_Error err;2366struct fman_fpm_regs *fpm_rg = p_Fm->p_FmFpmRegs;23672368#if (DPAA_VERSION >= 11)2369if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)2370RETURN_ERROR(MINOR, E_NOT_SUPPORTED,2371("FMan MAC reset!"));2372#endif /*(DPAA_VERSION >= 11)*/23732374if ((p_Fm->guestId != NCSW_MASTER_ID) &&2375!p_Fm->baseAddr &&2376p_Fm->h_IpcSessions[0])2377{2378t_FmIpcMacParams macParams;2379t_FmIpcMsg msg;2380t_FmIpcReply reply;2381uint32_t replyLength;23822383memset(&msg, 0, sizeof(msg));2384memset(&reply, 0, sizeof(reply));2385macParams.id = macId;2386macParams.enumType = (uint32_t)type;2387msg.msgId = FM_RESET_MAC;2388memcpy(msg.msgBody, &macParams, sizeof(macParams));2389replyLength = sizeof(uint32_t);2390err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],2391(uint8_t*)&msg,2392sizeof(msg.msgId)+sizeof(macParams),2393(uint8_t*)&reply,2394&replyLength,2395NULL,2396NULL);2397if (err != E_OK)2398RETURN_ERROR(MINOR, err, NO_MSG);2399if (replyLength != sizeof(uint32_t))2400RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));2401return (t_Error)(reply.error);2402}2403else if (!p_Fm->baseAddr)2404RETURN_ERROR(MINOR, E_NOT_SUPPORTED,2405("Either IPC or 'baseAddress' is required!"));24062407err = (t_Error)fman_reset_mac(fpm_rg, macId, !!(type == e_FM_MAC_10G));24082409if (err == -EBUSY)2410return ERROR_CODE(E_TIMEOUT);2411else if (err)2412RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Illegal MAC ID"));24132414return E_OK;2415}24162417t_Error FmSetMacMaxFrame(t_Handle h_Fm, e_FmMacType type, uint8_t macId, uint16_t mtu)2418{2419t_Fm *p_Fm = (t_Fm*)h_Fm;24202421if ((p_Fm->guestId != NCSW_MASTER_ID) &&2422p_Fm->h_IpcSessions[0])2423{2424t_FmIpcMacMaxFrameParams macMaxFrameLengthParams;2425t_Error err;2426t_FmIpcMsg msg;24272428memset(&msg, 0, sizeof(msg));2429macMaxFrameLengthParams.macParams.id = macId;2430macMaxFrameLengthParams.macParams.enumType = (uint32_t)type;2431macMaxFrameLengthParams.maxFrameLength = (uint16_t)mtu;2432msg.msgId = FM_SET_MAC_MAX_FRAME;2433memcpy(msg.msgBody, &macMaxFrameLengthParams, sizeof(macMaxFrameLengthParams));2434err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],2435(uint8_t*)&msg,2436sizeof(msg.msgId)+sizeof(macMaxFrameLengthParams),2437NULL,2438NULL,2439NULL,2440NULL);2441if (err != E_OK)2442RETURN_ERROR(MINOR, err, NO_MSG);2443return E_OK;2444}2445else if (p_Fm->guestId != NCSW_MASTER_ID)2446RETURN_ERROR(MINOR, E_NOT_SUPPORTED,2447("running in guest-mode without IPC!"));24482449/* if port is already initialized, check that MaxFrameLength is smaller2450* or equal to the port's max */2451#if (defined(FM_MAX_NUM_OF_10G_MACS) && (FM_MAX_NUM_OF_10G_MACS))2452if (type == e_FM_MAC_10G)2453{2454if ((!p_Fm->p_FmStateStruct->portMaxFrameLengths10G[macId])2455|| (p_Fm->p_FmStateStruct->portMaxFrameLengths10G[macId] &&2456(mtu <= p_Fm->p_FmStateStruct->portMaxFrameLengths10G[macId])))2457p_Fm->p_FmStateStruct->macMaxFrameLengths10G[macId] = mtu;2458else2459RETURN_ERROR(MINOR, E_INVALID_VALUE, ("MAC maxFrameLength is larger than Port maxFrameLength"));24602461}2462else2463#else2464UNUSED(type);2465#endif /* (defined(FM_MAX_NUM_OF_10G_MACS) && ... */2466if ((!p_Fm->p_FmStateStruct->portMaxFrameLengths1G[macId])2467|| (p_Fm->p_FmStateStruct->portMaxFrameLengths1G[macId] &&2468(mtu <= p_Fm->p_FmStateStruct->portMaxFrameLengths1G[macId])))2469p_Fm->p_FmStateStruct->macMaxFrameLengths1G[macId] = mtu;2470else2471RETURN_ERROR(MINOR, E_INVALID_VALUE, ("MAC maxFrameLength is larger than Port maxFrameLength"));24722473return E_OK;2474}24752476uint16_t FmGetClockFreq(t_Handle h_Fm)2477{2478t_Fm *p_Fm = (t_Fm*)h_Fm;24792480/* for multicore environment: this depends on the2481* fact that fmClkFreq was properly initialized at "init". */2482return p_Fm->p_FmStateStruct->fmClkFreq;2483}24842485uint16_t FmGetMacClockFreq(t_Handle h_Fm)2486{2487t_Fm *p_Fm = (t_Fm*)h_Fm;24882489return p_Fm->p_FmStateStruct->fmMacClkFreq;2490}24912492uint32_t FmGetTimeStampScale(t_Handle h_Fm)2493{2494t_Fm *p_Fm = (t_Fm*)h_Fm;24952496if ((p_Fm->guestId != NCSW_MASTER_ID) &&2497!p_Fm->baseAddr &&2498p_Fm->h_IpcSessions[0])2499{2500t_Error err;2501t_FmIpcMsg msg;2502t_FmIpcReply reply;2503uint32_t replyLength, timeStamp;25042505memset(&msg, 0, sizeof(msg));2506memset(&reply, 0, sizeof(reply));2507msg.msgId = FM_GET_TIMESTAMP_SCALE;2508replyLength = sizeof(uint32_t) + sizeof(uint32_t);2509if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],2510(uint8_t*)&msg,2511sizeof(msg.msgId),2512(uint8_t*)&reply,2513&replyLength,2514NULL,2515NULL)) != E_OK)2516{2517REPORT_ERROR(MAJOR, err, NO_MSG);2518return 0;2519}2520if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t)))2521{2522REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));2523return 0;2524}25252526memcpy((uint8_t*)&timeStamp, reply.replyBody, sizeof(uint32_t));2527return timeStamp;2528}2529else if ((p_Fm->guestId != NCSW_MASTER_ID) &&2530p_Fm->baseAddr)2531{2532if (!(GET_UINT32(p_Fm->p_FmFpmRegs->fmfp_tsc1) & FPM_TS_CTL_EN))2533{2534REPORT_ERROR(MAJOR, E_INVALID_STATE, ("timestamp is not enabled!"));2535return 0;2536}2537}2538else if (p_Fm->guestId != NCSW_MASTER_ID)2539DBG(WARNING, ("No IPC - can't validate FM if timestamp enabled."));25402541return p_Fm->p_FmStateStruct->count1MicroBit;2542}25432544t_Error FmEnableRamsEcc(t_Handle h_Fm)2545{2546t_Fm *p_Fm = (t_Fm*)h_Fm;25472548SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);25492550p_Fm->p_FmStateStruct->ramsEccOwners++;2551p_Fm->p_FmStateStruct->internalCall = TRUE;25522553return FM_EnableRamsEcc(p_Fm);2554}25552556t_Error FmDisableRamsEcc(t_Handle h_Fm)2557{2558t_Fm *p_Fm = (t_Fm*)h_Fm;25592560SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);25612562ASSERT_COND(p_Fm->p_FmStateStruct->ramsEccOwners);2563p_Fm->p_FmStateStruct->ramsEccOwners--;25642565if (p_Fm->p_FmStateStruct->ramsEccOwners==0)2566{2567p_Fm->p_FmStateStruct->internalCall = TRUE;2568return FM_DisableRamsEcc(p_Fm);2569}25702571return E_OK;2572}25732574uint8_t FmGetGuestId(t_Handle h_Fm)2575{2576t_Fm *p_Fm = (t_Fm*)h_Fm;25772578return p_Fm->guestId;2579}25802581bool FmIsMaster(t_Handle h_Fm)2582{2583t_Fm *p_Fm = (t_Fm*)h_Fm;25842585return (p_Fm->guestId == NCSW_MASTER_ID);2586}25872588t_Error FmSetSizeOfFifo(t_Handle h_Fm,2589uint8_t hardwarePortId,2590uint32_t *p_SizeOfFifo,2591uint32_t *p_ExtraSizeOfFifo,2592bool initialConfig)2593{2594t_Fm *p_Fm = (t_Fm*)h_Fm;2595t_FmIpcPortRsrcParams rsrcParams;2596t_Error err;2597struct fman_bmi_regs *bmi_rg = p_Fm->p_FmBmiRegs;2598uint32_t sizeOfFifo = *p_SizeOfFifo, extraSizeOfFifo = *p_ExtraSizeOfFifo;2599uint16_t currentVal = 0, currentExtraVal = 0;26002601if ((p_Fm->guestId != NCSW_MASTER_ID) &&2602!p_Fm->baseAddr &&2603p_Fm->h_IpcSessions[0])2604{2605t_FmIpcMsg msg;2606t_FmIpcReply reply;2607uint32_t replyLength;26082609rsrcParams.hardwarePortId = hardwarePortId;2610rsrcParams.val = sizeOfFifo;2611rsrcParams.extra = extraSizeOfFifo;2612rsrcParams.boolInitialConfig = (uint8_t)initialConfig;26132614memset(&msg, 0, sizeof(msg));2615memset(&reply, 0, sizeof(reply));2616msg.msgId = FM_SET_SIZE_OF_FIFO;2617memcpy(msg.msgBody, &rsrcParams, sizeof(rsrcParams));2618replyLength = sizeof(uint32_t);2619if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],2620(uint8_t*)&msg,2621sizeof(msg.msgId) + sizeof(rsrcParams),2622(uint8_t*)&reply,2623&replyLength,2624NULL,2625NULL)) != E_OK)2626RETURN_ERROR(MINOR, err, NO_MSG);2627if (replyLength != sizeof(uint32_t))2628RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));2629return (t_Error)(reply.error);2630}2631else if ((p_Fm->guestId != NCSW_MASTER_ID) &&2632p_Fm->baseAddr)2633{2634DBG(WARNING, ("No IPC - can't validate FM total-fifo size."));2635fman_set_size_of_fifo(bmi_rg, hardwarePortId, sizeOfFifo, extraSizeOfFifo);2636}2637else if (p_Fm->guestId != NCSW_MASTER_ID)2638RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,2639("running in guest-mode without neither IPC nor mapped register!"));26402641if (!initialConfig)2642{2643/* !initialConfig - runtime change of existing value.2644* - read the current FIFO and extra FIFO size */2645currentExtraVal = fman_get_size_of_extra_fifo(bmi_rg, hardwarePortId);2646currentVal = fman_get_size_of_fifo(bmi_rg, hardwarePortId);2647}26482649if (extraSizeOfFifo > currentExtraVal)2650{2651if (extraSizeOfFifo && !p_Fm->p_FmStateStruct->extraFifoPoolSize)2652/* if this is the first time a port requires extraFifoPoolSize, the total extraFifoPoolSize2653* must be initialized to 1 buffer per port2654*/2655p_Fm->p_FmStateStruct->extraFifoPoolSize = FM_MAX_NUM_OF_RX_PORTS*BMI_FIFO_UNITS;26562657p_Fm->p_FmStateStruct->extraFifoPoolSize = MAX(p_Fm->p_FmStateStruct->extraFifoPoolSize, extraSizeOfFifo);2658}26592660/* check that there are enough uncommitted fifo size */2661if ((p_Fm->p_FmStateStruct->accumulatedFifoSize - currentVal + sizeOfFifo) >2662(p_Fm->p_FmStateStruct->totalFifoSize - p_Fm->p_FmStateStruct->extraFifoPoolSize)){2663REPORT_ERROR(MAJOR, E_INVALID_VALUE,2664("Port request fifo size + accumulated size > total FIFO size:"));2665RETURN_ERROR(MAJOR, E_INVALID_VALUE,2666("port 0x%x requested %d bytes, extra size = %d, accumulated size = %d total size = %d",2667hardwarePortId, sizeOfFifo, p_Fm->p_FmStateStruct->extraFifoPoolSize,2668p_Fm->p_FmStateStruct->accumulatedFifoSize,2669p_Fm->p_FmStateStruct->totalFifoSize));2670}2671else2672{2673/* update accumulated */2674ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedFifoSize >= currentVal);2675p_Fm->p_FmStateStruct->accumulatedFifoSize -= currentVal;2676p_Fm->p_FmStateStruct->accumulatedFifoSize += sizeOfFifo;2677fman_set_size_of_fifo(bmi_rg, hardwarePortId, sizeOfFifo, extraSizeOfFifo);2678}26792680return E_OK;2681}26822683t_Error FmSetNumOfTasks(t_Handle h_Fm,2684uint8_t hardwarePortId,2685uint8_t *p_NumOfTasks,2686uint8_t *p_NumOfExtraTasks,2687bool initialConfig)2688{2689t_Fm *p_Fm = (t_Fm *)h_Fm;2690t_Error err;2691struct fman_bmi_regs *bmi_rg = p_Fm->p_FmBmiRegs;2692uint8_t currentVal = 0, currentExtraVal = 0, numOfTasks = *p_NumOfTasks, numOfExtraTasks = *p_NumOfExtraTasks;26932694ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));26952696if ((p_Fm->guestId != NCSW_MASTER_ID) &&2697!p_Fm->baseAddr &&2698p_Fm->h_IpcSessions[0])2699{2700t_FmIpcPortRsrcParams rsrcParams;2701t_FmIpcMsg msg;2702t_FmIpcReply reply;2703uint32_t replyLength;27042705rsrcParams.hardwarePortId = hardwarePortId;2706rsrcParams.val = numOfTasks;2707rsrcParams.extra = numOfExtraTasks;2708rsrcParams.boolInitialConfig = (uint8_t)initialConfig;27092710memset(&msg, 0, sizeof(msg));2711memset(&reply, 0, sizeof(reply));2712msg.msgId = FM_SET_NUM_OF_TASKS;2713memcpy(msg.msgBody, &rsrcParams, sizeof(rsrcParams));2714replyLength = sizeof(uint32_t);2715if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],2716(uint8_t*)&msg,2717sizeof(msg.msgId) + sizeof(rsrcParams),2718(uint8_t*)&reply,2719&replyLength,2720NULL,2721NULL)) != E_OK)2722RETURN_ERROR(MINOR, err, NO_MSG);2723if (replyLength != sizeof(uint32_t))2724RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));2725return (t_Error)(reply.error);2726}2727else if ((p_Fm->guestId != NCSW_MASTER_ID) &&2728p_Fm->baseAddr)2729{2730DBG(WARNING, ("No IPC - can't validate FM total-num-of-tasks."));2731fman_set_num_of_tasks(bmi_rg, hardwarePortId, numOfTasks, numOfExtraTasks);2732}2733else if (p_Fm->guestId != NCSW_MASTER_ID)2734RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,2735("running in guest-mode without neither IPC nor mapped register!"));27362737if (!initialConfig)2738{2739/* !initialConfig - runtime change of existing value.2740* - read the current number of tasks */2741currentVal = fman_get_num_of_tasks(bmi_rg, hardwarePortId);2742currentExtraVal = fman_get_num_extra_tasks(bmi_rg, hardwarePortId);2743}27442745if (numOfExtraTasks > currentExtraVal)2746p_Fm->p_FmStateStruct->extraTasksPoolSize =2747(uint8_t)MAX(p_Fm->p_FmStateStruct->extraTasksPoolSize, numOfExtraTasks);27482749/* check that there are enough uncommitted tasks */2750if ((p_Fm->p_FmStateStruct->accumulatedNumOfTasks - currentVal + numOfTasks) >2751(p_Fm->p_FmStateStruct->totalNumOfTasks - p_Fm->p_FmStateStruct->extraTasksPoolSize))2752RETURN_ERROR(MAJOR, E_NOT_AVAILABLE,2753("Requested numOfTasks and extra tasks pool for fm%d exceed total numOfTasks.",2754p_Fm->p_FmStateStruct->fmId));2755else2756{2757ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedNumOfTasks >= currentVal);2758/* update accumulated */2759p_Fm->p_FmStateStruct->accumulatedNumOfTasks -= currentVal;2760p_Fm->p_FmStateStruct->accumulatedNumOfTasks += numOfTasks;2761fman_set_num_of_tasks(bmi_rg, hardwarePortId, numOfTasks, numOfExtraTasks);2762}27632764return E_OK;2765}27662767t_Error FmSetNumOfOpenDmas(t_Handle h_Fm,2768uint8_t hardwarePortId,2769uint8_t *p_NumOfOpenDmas,2770uint8_t *p_NumOfExtraOpenDmas,2771bool initialConfig)27722773{2774t_Fm *p_Fm = (t_Fm *)h_Fm;2775t_Error err;2776struct fman_bmi_regs *bmi_rg = p_Fm->p_FmBmiRegs;2777uint8_t numOfOpenDmas = *p_NumOfOpenDmas, numOfExtraOpenDmas = *p_NumOfExtraOpenDmas;2778uint8_t totalNumDmas = 0, currentVal = 0, currentExtraVal = 0;27792780ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));27812782if ((p_Fm->guestId != NCSW_MASTER_ID) &&2783!p_Fm->baseAddr &&2784p_Fm->h_IpcSessions[0])2785{2786t_FmIpcPortRsrcParams rsrcParams;2787t_FmIpcMsg msg;2788t_FmIpcReply reply;2789uint32_t replyLength;27902791rsrcParams.hardwarePortId = hardwarePortId;2792rsrcParams.val = numOfOpenDmas;2793rsrcParams.extra = numOfExtraOpenDmas;2794rsrcParams.boolInitialConfig = (uint8_t)initialConfig;27952796memset(&msg, 0, sizeof(msg));2797memset(&reply, 0, sizeof(reply));2798msg.msgId = FM_SET_NUM_OF_OPEN_DMAS;2799memcpy(msg.msgBody, &rsrcParams, sizeof(rsrcParams));2800replyLength = sizeof(uint32_t);2801if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],2802(uint8_t*)&msg,2803sizeof(msg.msgId) + sizeof(rsrcParams),2804(uint8_t*)&reply,2805&replyLength,2806NULL,2807NULL)) != E_OK)2808RETURN_ERROR(MINOR, err, NO_MSG);2809if (replyLength != sizeof(uint32_t))2810RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));2811return (t_Error)(reply.error);2812}2813#ifdef FM_HAS_TOTAL_DMAS2814else if (p_Fm->guestId != NCSW_MASTER_ID)2815RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("running in guest-mode without IPC!"));2816#else2817else if ((p_Fm->guestId != NCSW_MASTER_ID) &&2818p_Fm->baseAddr &&2819(p_Fm->p_FmStateStruct->revInfo.majorRev >= 6))2820{2821/*DBG(WARNING, ("No IPC - can't validate FM total-num-of-dmas."));*/28222823if (!numOfOpenDmas)2824{2825/* first config without explic it value: Do Nothing - reset value shouldn't be2826changed, read register for port save */2827*p_NumOfOpenDmas = fman_get_num_of_dmas(bmi_rg, hardwarePortId);2828*p_NumOfExtraOpenDmas = fman_get_num_extra_dmas(bmi_rg, hardwarePortId);2829}2830else2831/* whether it is the first time with explicit value, or runtime "set" - write register */2832fman_set_num_of_open_dmas(bmi_rg,2833hardwarePortId,2834numOfOpenDmas,2835numOfExtraOpenDmas,2836p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas + p_Fm->p_FmStateStruct->extraOpenDmasPoolSize);2837}2838else if (p_Fm->guestId != NCSW_MASTER_ID)2839RETURN_ERROR(MAJOR, E_NOT_SUPPORTED,2840("running in guest-mode without neither IPC nor mapped register!"));2841#endif /* FM_HAS_TOTAL_DMAS */28422843if (!initialConfig)2844{2845/* !initialConfig - runtime change of existing value.2846* - read the current number of open Dma's */2847currentExtraVal = fman_get_num_extra_dmas(bmi_rg, hardwarePortId);2848currentVal = fman_get_num_of_dmas(bmi_rg, hardwarePortId);2849}28502851#ifdef FM_NO_GUARANTEED_RESET_VALUES2852/* it's illegal to be in a state where this is not the first set and no value is specified */2853ASSERT_COND(initialConfig || numOfOpenDmas);2854if (!numOfOpenDmas)2855{2856/* !numOfOpenDmas - first configuration according to values in regs.2857* - read the current number of open Dma's */2858currentExtraVal = fman_get_num_extra_dmas(bmi_rg, hardwarePortId);2859currentVal = fman_get_num_of_dmas(bmi_rg, hardwarePortId);2860/* This is the first configuration and user did not specify value (!numOfOpenDmas),2861* reset values will be used and we just save these values for resource management */2862p_Fm->p_FmStateStruct->extraOpenDmasPoolSize =2863(uint8_t)MAX(p_Fm->p_FmStateStruct->extraOpenDmasPoolSize, currentExtraVal);2864p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas += currentVal;2865*p_NumOfOpenDmas = currentVal;2866*p_NumOfExtraOpenDmas = currentExtraVal;2867return E_OK;2868}2869#endif /* FM_NO_GUARANTEED_RESET_VALUES */28702871if (numOfExtraOpenDmas > currentExtraVal)2872p_Fm->p_FmStateStruct->extraOpenDmasPoolSize =2873(uint8_t)MAX(p_Fm->p_FmStateStruct->extraOpenDmasPoolSize, numOfExtraOpenDmas);28742875#ifdef FM_HAS_TOTAL_DMAS2876if ((p_Fm->p_FmStateStruct->revInfo.majorRev < 6) &&2877(p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas - currentVal + numOfOpenDmas >2878p_Fm->p_FmStateStruct->maxNumOfOpenDmas))2879RETURN_ERROR(MAJOR, E_NOT_AVAILABLE,2880("Requested numOfOpenDmas for fm%d exceeds total numOfOpenDmas.",2881p_Fm->p_FmStateStruct->fmId));2882#else2883if ((p_Fm->p_FmStateStruct->revInfo.majorRev >= 6) &&2884#ifdef FM_HEAVY_TRAFFIC_SEQUENCER_HANG_ERRATA_FMAN_A0069812885!((p_Fm->p_FmStateStruct->revInfo.majorRev == 6) &&2886(p_Fm->p_FmStateStruct->revInfo.minorRev == 0)) &&2887#endif /* FM_HEAVY_TRAFFIC_SEQUENCER_HANG_ERRATA_FMAN_A006981 */2888(p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas - currentVal + numOfOpenDmas > DMA_THRESH_MAX_COMMQ + 1))2889RETURN_ERROR(MAJOR, E_NOT_AVAILABLE,2890("Requested numOfOpenDmas for fm%d exceeds DMA Command queue (%d)",2891p_Fm->p_FmStateStruct->fmId, DMA_THRESH_MAX_COMMQ+1));2892#endif /* FM_HAS_TOTAL_DMAS */2893else2894{2895ASSERT_COND(p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas >= currentVal);2896/* update acummulated */2897p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas -= currentVal;2898p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas += numOfOpenDmas;28992900#ifdef FM_HAS_TOTAL_DMAS2901if (p_Fm->p_FmStateStruct->revInfo.majorRev < 6)2902totalNumDmas = (uint8_t)(p_Fm->p_FmStateStruct->accumulatedNumOfOpenDmas + p_Fm->p_FmStateStruct->extraOpenDmasPoolSize);2903#endif /* FM_HAS_TOTAL_DMAS */2904fman_set_num_of_open_dmas(bmi_rg,2905hardwarePortId,2906numOfOpenDmas,2907numOfExtraOpenDmas,2908totalNumDmas);2909}29102911return E_OK;2912}29132914#if (DPAA_VERSION >= 11)2915t_Error FmVSPCheckRelativeProfile(t_Handle h_Fm,2916e_FmPortType portType,2917uint8_t portId,2918uint16_t relativeProfile)2919{2920t_Fm *p_Fm;2921t_FmSp *p_FmPcdSp;2922uint8_t swPortIndex=0, hardwarePortId;29232924ASSERT_COND(h_Fm);2925p_Fm = (t_Fm*)h_Fm;29262927hardwarePortId = SwPortIdToHwPortId(portType,2928portId,2929p_Fm->p_FmStateStruct->revInfo.majorRev,2930p_Fm->p_FmStateStruct->revInfo.minorRev);2931ASSERT_COND(hardwarePortId);2932HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId);29332934p_FmPcdSp = p_Fm->p_FmSp;2935ASSERT_COND(p_FmPcdSp);29362937if (!p_FmPcdSp->portsMapping[swPortIndex].numOfProfiles)2938RETURN_ERROR(MAJOR, E_INVALID_STATE , ("Port has no allocated profiles"));2939if (relativeProfile >= p_FmPcdSp->portsMapping[swPortIndex].numOfProfiles)2940RETURN_ERROR(MAJOR, E_NOT_IN_RANGE , ("Profile id is out of range"));29412942return E_OK;2943}29442945t_Error FmVSPGetAbsoluteProfileId(t_Handle h_Fm,2946e_FmPortType portType,2947uint8_t portId,2948uint16_t relativeProfile,2949uint16_t *p_AbsoluteId)2950{2951t_Fm *p_Fm;2952t_FmSp *p_FmPcdSp;2953uint8_t swPortIndex=0, hardwarePortId;2954t_Error err;29552956ASSERT_COND(h_Fm);2957p_Fm = (t_Fm*)h_Fm;29582959err = FmVSPCheckRelativeProfile(h_Fm, portType, portId, relativeProfile);2960if (err != E_OK)2961return err;29622963hardwarePortId = SwPortIdToHwPortId(portType,2964portId,2965p_Fm->p_FmStateStruct->revInfo.majorRev,2966p_Fm->p_FmStateStruct->revInfo.minorRev);2967ASSERT_COND(hardwarePortId);2968HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId);29692970p_FmPcdSp = p_Fm->p_FmSp;2971ASSERT_COND(p_FmPcdSp);29722973*p_AbsoluteId = (uint16_t)(p_FmPcdSp->portsMapping[swPortIndex].profilesBase + relativeProfile);29742975return E_OK;2976}2977#endif /* (DPAA_VERSION >= 11) */29782979static t_Error InitFmDma(t_Fm *p_Fm)2980{2981t_Error err;29822983err = (t_Error)fman_dma_init(p_Fm->p_FmDmaRegs, p_Fm->p_FmDriverParam);2984if (err != E_OK)2985return err;29862987/* Allocate MURAM for CAM */2988p_Fm->camBaseAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_Fm->h_FmMuram,2989(uint32_t)(p_Fm->p_FmDriverParam->dma_cam_num_of_entries*DMA_CAM_SIZEOF_ENTRY),2990DMA_CAM_ALIGN));2991if (!p_Fm->camBaseAddr)2992RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for DMA CAM failed"));29932994WRITE_BLOCK(UINT_TO_PTR(p_Fm->camBaseAddr),29950,2996(uint32_t)(p_Fm->p_FmDriverParam->dma_cam_num_of_entries*DMA_CAM_SIZEOF_ENTRY));29972998if (p_Fm->p_FmStateStruct->revInfo.majorRev == 2)2999{3000FM_MURAM_FreeMem(p_Fm->h_FmMuram, UINT_TO_PTR(p_Fm->camBaseAddr));30013002p_Fm->camBaseAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_Fm->h_FmMuram,3003(uint32_t)(p_Fm->p_FmDriverParam->dma_cam_num_of_entries*72 + 128),300464));3005if (!p_Fm->camBaseAddr)3006RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for DMA CAM failed"));30073008WRITE_BLOCK(UINT_TO_PTR(p_Fm->camBaseAddr),30090,3010(uint32_t)(p_Fm->p_FmDriverParam->dma_cam_num_of_entries*72 + 128));30113012switch(p_Fm->p_FmDriverParam->dma_cam_num_of_entries)3013{3014case (8):3015WRITE_UINT32(*(uint32_t*)p_Fm->camBaseAddr, 0xff000000);3016break;3017case (16):3018WRITE_UINT32(*(uint32_t*)p_Fm->camBaseAddr, 0xffff0000);3019break;3020case (24):3021WRITE_UINT32(*(uint32_t*)p_Fm->camBaseAddr, 0xffffff00);3022break;3023case (32):3024WRITE_UINT32(*(uint32_t*)p_Fm->camBaseAddr, 0xffffffff);3025break;3026default:3027RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("wrong dma_cam_num_of_entries"));3028}3029}30303031p_Fm->p_FmDriverParam->cam_base_addr =3032(uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_Fm->camBaseAddr)) - p_Fm->fmMuramPhysBaseAddr);30333034return E_OK;3035}30363037static t_Error InitFmFpm(t_Fm *p_Fm)3038{3039return (t_Error)fman_fpm_init(p_Fm->p_FmFpmRegs, p_Fm->p_FmDriverParam);3040}30413042static t_Error InitFmBmi(t_Fm *p_Fm)3043{3044return (t_Error)fman_bmi_init(p_Fm->p_FmBmiRegs, p_Fm->p_FmDriverParam);3045}30463047static t_Error InitFmQmi(t_Fm *p_Fm)3048{3049return (t_Error)fman_qmi_init(p_Fm->p_FmQmiRegs, p_Fm->p_FmDriverParam);3050}30513052static t_Error InitGuestMode(t_Fm *p_Fm)3053{3054t_Error err = E_OK;3055int i;3056t_FmIpcMsg msg;3057t_FmIpcReply reply;3058uint32_t replyLength;30593060ASSERT_COND(p_Fm);3061ASSERT_COND(p_Fm->guestId != NCSW_MASTER_ID);30623063/* build the FM guest partition IPC address */3064if (Sprint (p_Fm->fmModuleName, "FM_%d_%d",p_Fm->p_FmStateStruct->fmId, p_Fm->guestId) != (p_Fm->guestId<10 ? 6:7))3065RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));30663067/* build the FM master partition IPC address */3068memset(p_Fm->fmIpcHandlerModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE);3069if (Sprint (p_Fm->fmIpcHandlerModuleName[0], "FM_%d_%d",p_Fm->p_FmStateStruct->fmId, NCSW_MASTER_ID) != 6)3070RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));30713072for (i=0;i<e_FM_EV_DUMMY_LAST;i++)3073p_Fm->intrMng[i].f_Isr = UnimplementedIsr;30743075p_Fm->h_IpcSessions[0] = XX_IpcInitSession(p_Fm->fmIpcHandlerModuleName[0], p_Fm->fmModuleName);3076if (p_Fm->h_IpcSessions[0])3077{3078uint8_t isMasterAlive;3079t_FmIpcParams ipcParams;30803081err = XX_IpcRegisterMsgHandler(p_Fm->fmModuleName, FmGuestHandleIpcMsgCB, p_Fm, FM_IPC_MAX_REPLY_SIZE);3082if (err)3083RETURN_ERROR(MAJOR, err, NO_MSG);30843085memset(&msg, 0, sizeof(msg));3086memset(&reply, 0, sizeof(reply));3087msg.msgId = FM_MASTER_IS_ALIVE;3088msg.msgBody[0] = p_Fm->guestId;3089replyLength = sizeof(uint32_t) + sizeof(uint8_t);3090do3091{3092blockingFlag = TRUE;3093if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],3094(uint8_t*)&msg,3095sizeof(msg.msgId)+sizeof(p_Fm->guestId),3096(uint8_t*)&reply,3097&replyLength,3098IpcMsgCompletionCB,3099p_Fm)) != E_OK)3100REPORT_ERROR(MINOR, err, NO_MSG);3101while (blockingFlag) ;3102if (replyLength != (sizeof(uint32_t) + sizeof(uint8_t)))3103REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));3104isMasterAlive = *(uint8_t*)(reply.replyBody);3105} while (!isMasterAlive);31063107/* read FM parameters and save */3108memset(&msg, 0, sizeof(msg));3109memset(&reply, 0, sizeof(reply));3110msg.msgId = FM_GET_PARAMS;3111replyLength = sizeof(uint32_t) + sizeof(t_FmIpcParams);3112if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],3113(uint8_t*)&msg,3114sizeof(msg.msgId),3115(uint8_t*)&reply,3116&replyLength,3117NULL,3118NULL)) != E_OK)3119RETURN_ERROR(MAJOR, err, NO_MSG);3120if (replyLength != (sizeof(uint32_t) + sizeof(t_FmIpcParams)))3121RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));3122memcpy((uint8_t*)&ipcParams, reply.replyBody, sizeof(t_FmIpcParams));31233124p_Fm->p_FmStateStruct->fmClkFreq = ipcParams.fmClkFreq;3125p_Fm->p_FmStateStruct->fmMacClkFreq = ipcParams.fmMacClkFreq;3126p_Fm->p_FmStateStruct->revInfo.majorRev = ipcParams.majorRev;3127p_Fm->p_FmStateStruct->revInfo.minorRev = ipcParams.minorRev;3128}3129else3130{3131DBG(WARNING, ("FM Guest mode - without IPC"));3132if (!p_Fm->p_FmStateStruct->fmClkFreq)3133RETURN_ERROR(MAJOR, E_INVALID_STATE, ("No fmClkFreq configured for guest without IPC"));3134if (p_Fm->baseAddr)3135{3136fman_get_revision(p_Fm->p_FmFpmRegs,3137&p_Fm->p_FmStateStruct->revInfo.majorRev,3138&p_Fm->p_FmStateStruct->revInfo.minorRev);31393140}3141}31423143#if (DPAA_VERSION >= 11)3144p_Fm->partVSPBase = AllocVSPsForPartition(p_Fm, p_Fm->partVSPBase, p_Fm->partNumOfVSPs, p_Fm->guestId);3145if (p_Fm->partVSPBase == (uint8_t)(ILLEGAL_BASE))3146DBG(WARNING, ("partition VSPs allocation is FAILED"));3147#endif /* (DPAA_VERSION >= 11) */31483149/* General FM driver initialization */3150if (p_Fm->baseAddr)3151p_Fm->fmMuramPhysBaseAddr =3152(uint64_t)(XX_VirtToPhys(UINT_TO_PTR(p_Fm->baseAddr + FM_MM_MURAM)));31533154XX_Free(p_Fm->p_FmDriverParam);3155p_Fm->p_FmDriverParam = NULL;31563157if ((p_Fm->guestId == NCSW_MASTER_ID) ||3158(p_Fm->h_IpcSessions[0]))3159{3160FM_DisableRamsEcc(p_Fm);3161FmMuramClear(p_Fm->h_FmMuram);3162FM_EnableRamsEcc(p_Fm);3163}31643165return E_OK;3166}31673168static __inline__ enum fman_exceptions FmanExceptionTrans(e_FmExceptions exception)3169{3170switch (exception) {3171case e_FM_EX_DMA_BUS_ERROR:3172return E_FMAN_EX_DMA_BUS_ERROR;3173case e_FM_EX_DMA_READ_ECC:3174return E_FMAN_EX_DMA_READ_ECC;3175case e_FM_EX_DMA_SYSTEM_WRITE_ECC:3176return E_FMAN_EX_DMA_SYSTEM_WRITE_ECC;3177case e_FM_EX_DMA_FM_WRITE_ECC:3178return E_FMAN_EX_DMA_FM_WRITE_ECC;3179case e_FM_EX_FPM_STALL_ON_TASKS:3180return E_FMAN_EX_FPM_STALL_ON_TASKS;3181case e_FM_EX_FPM_SINGLE_ECC:3182return E_FMAN_EX_FPM_SINGLE_ECC;3183case e_FM_EX_FPM_DOUBLE_ECC:3184return E_FMAN_EX_FPM_DOUBLE_ECC;3185case e_FM_EX_QMI_SINGLE_ECC:3186return E_FMAN_EX_QMI_SINGLE_ECC;3187case e_FM_EX_QMI_DOUBLE_ECC:3188return E_FMAN_EX_QMI_DOUBLE_ECC;3189case e_FM_EX_QMI_DEQ_FROM_UNKNOWN_PORTID:3190return E_FMAN_EX_QMI_DEQ_FROM_UNKNOWN_PORTID;3191case e_FM_EX_BMI_LIST_RAM_ECC:3192return E_FMAN_EX_BMI_LIST_RAM_ECC;3193case e_FM_EX_BMI_STORAGE_PROFILE_ECC:3194return E_FMAN_EX_BMI_STORAGE_PROFILE_ECC;3195case e_FM_EX_BMI_STATISTICS_RAM_ECC:3196return E_FMAN_EX_BMI_STATISTICS_RAM_ECC;3197case e_FM_EX_BMI_DISPATCH_RAM_ECC:3198return E_FMAN_EX_BMI_DISPATCH_RAM_ECC;3199case e_FM_EX_IRAM_ECC:3200return E_FMAN_EX_IRAM_ECC;3201case e_FM_EX_MURAM_ECC:3202return E_FMAN_EX_MURAM_ECC;3203default:3204return E_FMAN_EX_DMA_BUS_ERROR;3205}3206}32073208uint8_t SwPortIdToHwPortId(e_FmPortType type, uint8_t relativePortId, uint8_t majorRev, uint8_t minorRev)3209{3210switch (type)3211{3212case (e_FM_PORT_TYPE_OH_OFFLINE_PARSING):3213case (e_FM_PORT_TYPE_OH_HOST_COMMAND):3214CHECK_PORT_ID_OH_PORTS(relativePortId);3215return (uint8_t)(BASE_OH_PORTID + (relativePortId));3216case (e_FM_PORT_TYPE_RX):3217CHECK_PORT_ID_1G_RX_PORTS(relativePortId);3218return (uint8_t)(BASE_1G_RX_PORTID + (relativePortId));3219case (e_FM_PORT_TYPE_RX_10G):3220/* The 10G port in T1024 (FMan Version 6.4) is the first port.3221* This is the reason why the 1G port offset is used.3222*/3223if (majorRev == 6 && minorRev == 4)3224{3225CHECK_PORT_ID_1G_RX_PORTS(relativePortId);3226return (uint8_t)(BASE_1G_RX_PORTID + (relativePortId));3227}3228else3229{3230CHECK_PORT_ID_10G_RX_PORTS(relativePortId);3231return (uint8_t)(BASE_10G_RX_PORTID + (relativePortId));3232}3233case (e_FM_PORT_TYPE_TX):3234CHECK_PORT_ID_1G_TX_PORTS(relativePortId);3235return (uint8_t)(BASE_1G_TX_PORTID + (relativePortId));3236case (e_FM_PORT_TYPE_TX_10G):3237/* The 10G port in T1024 (FMan Version 6.4) is the first port.3238* This is the reason why the 1G port offset is used.3239*/3240if (majorRev == 6 && minorRev == 4)3241{3242CHECK_PORT_ID_1G_TX_PORTS(relativePortId);3243return (uint8_t)(BASE_1G_TX_PORTID + (relativePortId));3244}3245else3246{3247CHECK_PORT_ID_10G_TX_PORTS(relativePortId);3248return (uint8_t)(BASE_10G_TX_PORTID + (relativePortId));3249}3250default:3251REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("Illegal port type"));3252return 0;3253}3254}32553256#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))3257t_Error FmDumpPortRegs (t_Handle h_Fm, uint8_t hardwarePortId)3258{3259t_Fm *p_Fm = (t_Fm *)h_Fm;32603261DECLARE_DUMP;32623263ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));32643265SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);3266SANITY_CHECK_RETURN_ERROR(((p_Fm->guestId == NCSW_MASTER_ID) ||3267p_Fm->baseAddr), E_INVALID_OPERATION);32683269DUMP_TITLE(&p_Fm->p_FmBmiRegs->fmbm_pp[hardwarePortId-1], ("fmbm_pp for port %u", (hardwarePortId)));3270DUMP_MEMORY(&p_Fm->p_FmBmiRegs->fmbm_pp[hardwarePortId-1], sizeof(uint32_t));32713272DUMP_TITLE(&p_Fm->p_FmBmiRegs->fmbm_pfs[hardwarePortId-1], ("fmbm_pfs for port %u", (hardwarePortId )));3273DUMP_MEMORY(&p_Fm->p_FmBmiRegs->fmbm_pfs[hardwarePortId-1], sizeof(uint32_t));32743275DUMP_TITLE(&p_Fm->p_FmBmiRegs->fmbm_spliodn[hardwarePortId-1], ("fmbm_spliodn for port %u", (hardwarePortId)));3276DUMP_MEMORY(&p_Fm->p_FmBmiRegs->fmbm_spliodn[hardwarePortId-1], sizeof(uint32_t));32773278DUMP_TITLE(&p_Fm->p_FmFpmRegs->fmfp_ps[hardwarePortId], ("fmfp_ps for port %u", (hardwarePortId)));3279DUMP_MEMORY(&p_Fm->p_FmFpmRegs->fmfp_ps[hardwarePortId], sizeof(uint32_t));32803281DUMP_TITLE(&p_Fm->p_FmDmaRegs->fmdmplr[hardwarePortId/2], ("fmdmplr for port %u", (hardwarePortId)));3282DUMP_MEMORY(&p_Fm->p_FmDmaRegs->fmdmplr[hardwarePortId/2], sizeof(uint32_t));32833284return E_OK;3285}3286#endif /* (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0)) */328732883289/*****************************************************************************/3290/* API Init unit functions */3291/*****************************************************************************/3292t_Handle FM_Config(t_FmParams *p_FmParam)3293{3294t_Fm *p_Fm;3295uint8_t i;3296uintptr_t baseAddr;32973298SANITY_CHECK_RETURN_VALUE(p_FmParam, E_NULL_POINTER, NULL);3299SANITY_CHECK_RETURN_VALUE(((p_FmParam->firmware.p_Code && p_FmParam->firmware.size) ||3300(!p_FmParam->firmware.p_Code && !p_FmParam->firmware.size)),3301E_INVALID_VALUE, NULL);33023303baseAddr = p_FmParam->baseAddr;33043305/* Allocate FM structure */3306p_Fm = (t_Fm *) XX_Malloc(sizeof(t_Fm));3307if (!p_Fm)3308{3309REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM driver structure"));3310return NULL;3311}3312memset(p_Fm, 0, sizeof(t_Fm));33133314p_Fm->p_FmStateStruct = (t_FmStateStruct *) XX_Malloc(sizeof(t_FmStateStruct));3315if (!p_Fm->p_FmStateStruct)3316{3317XX_Free(p_Fm);3318REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Status structure"));3319return NULL;3320}3321memset(p_Fm->p_FmStateStruct, 0, sizeof(t_FmStateStruct));33223323/* Initialize FM parameters which will be kept by the driver */3324p_Fm->p_FmStateStruct->fmId = p_FmParam->fmId;3325p_Fm->guestId = p_FmParam->guestId;33263327for (i=0; i<FM_MAX_NUM_OF_HW_PORT_IDS; i++)3328p_Fm->p_FmStateStruct->portsTypes[i] = e_FM_PORT_TYPE_DUMMY;33293330/* Allocate the FM driver's parameters structure */3331p_Fm->p_FmDriverParam = (struct fman_cfg *)XX_Malloc(sizeof(struct fman_cfg));3332if (!p_Fm->p_FmDriverParam)3333{3334XX_Free(p_Fm->p_FmStateStruct);3335XX_Free(p_Fm);3336REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM driver parameters"));3337return NULL;3338}3339memset(p_Fm->p_FmDriverParam, 0, sizeof(struct fman_cfg));33403341#if (DPAA_VERSION >= 11)3342p_Fm->p_FmSp = (t_FmSp *)XX_Malloc(sizeof(t_FmSp));3343if (!p_Fm->p_FmSp)3344{3345XX_Free(p_Fm->p_FmDriverParam);3346XX_Free(p_Fm->p_FmStateStruct);3347XX_Free(p_Fm);3348REPORT_ERROR(MAJOR, E_NO_MEMORY, ("allocation for internal data structure failed"));3349return NULL;3350}3351memset(p_Fm->p_FmSp, 0, sizeof(t_FmSp));33523353for (i=0; i<FM_VSP_MAX_NUM_OF_ENTRIES; i++)3354p_Fm->p_FmSp->profiles[i].profilesMng.ownerId = (uint8_t)ILLEGAL_BASE;3355#endif /* (DPAA_VERSION >= 11) */33563357/* Initialize FM parameters which will be kept by the driver */3358p_Fm->p_FmStateStruct->fmId = p_FmParam->fmId;3359p_Fm->h_FmMuram = p_FmParam->h_FmMuram;3360p_Fm->h_App = p_FmParam->h_App;3361p_Fm->p_FmStateStruct->fmClkFreq = p_FmParam->fmClkFreq;3362p_Fm->p_FmStateStruct->fmMacClkFreq = p_FmParam->fmClkFreq / ((!p_FmParam->fmMacClkRatio)? 2: p_FmParam->fmMacClkRatio);3363p_Fm->f_Exception = p_FmParam->f_Exception;3364p_Fm->f_BusError = p_FmParam->f_BusError;3365p_Fm->p_FmFpmRegs = (struct fman_fpm_regs *)UINT_TO_PTR(baseAddr + FM_MM_FPM);3366p_Fm->p_FmBmiRegs = (struct fman_bmi_regs *)UINT_TO_PTR(baseAddr + FM_MM_BMI);3367p_Fm->p_FmQmiRegs = (struct fman_qmi_regs *)UINT_TO_PTR(baseAddr + FM_MM_QMI);3368p_Fm->p_FmDmaRegs = (struct fman_dma_regs *)UINT_TO_PTR(baseAddr + FM_MM_DMA);3369p_Fm->p_FmRegs = (struct fman_regs *)UINT_TO_PTR(baseAddr + FM_MM_BMI);3370p_Fm->baseAddr = baseAddr;3371p_Fm->p_FmStateStruct->irq = p_FmParam->irq;3372p_Fm->p_FmStateStruct->errIrq = p_FmParam->errIrq;3373p_Fm->hcPortInitialized = FALSE;3374p_Fm->independentMode = FALSE;33753376p_Fm->h_Spinlock = XX_InitSpinlock();3377if (!p_Fm->h_Spinlock)3378{3379XX_Free(p_Fm->p_FmDriverParam);3380XX_Free(p_Fm->p_FmStateStruct);3381XX_Free(p_Fm);3382REPORT_ERROR(MAJOR, E_INVALID_STATE, ("can't allocate spinlock!"));3383return NULL;3384}33853386#if (DPAA_VERSION >= 11)3387p_Fm->partVSPBase = p_FmParam->partVSPBase;3388p_Fm->partNumOfVSPs = p_FmParam->partNumOfVSPs;3389p_Fm->vspBaseAddr = p_FmParam->vspBaseAddr;3390#endif /* (DPAA_VERSION >= 11) */33913392fman_defconfig(p_Fm->p_FmDriverParam,3393!!(p_Fm->guestId == NCSW_MASTER_ID));3394/* overide macros dependent parameters */3395#ifdef FM_PEDANTIC_DMA3396p_Fm->p_FmDriverParam->pedantic_dma = TRUE;3397p_Fm->p_FmDriverParam->dma_aid_override = TRUE;3398#endif /* FM_PEDANTIC_DMA */3399#ifndef FM_QMI_NO_DEQ_OPTIONS_SUPPORT3400p_Fm->p_FmDriverParam->qmi_deq_option_support = TRUE;3401#endif /* !FM_QMI_NO_DEQ_OPTIONS_SUPPORT */34023403p_Fm->p_FmStateStruct->ramsEccEnable = FALSE;3404p_Fm->p_FmStateStruct->extraFifoPoolSize = 0;3405p_Fm->p_FmStateStruct->exceptions = DEFAULT_exceptions;3406p_Fm->resetOnInit = DEFAULT_resetOnInit;3407p_Fm->f_ResetOnInitOverride = DEFAULT_resetOnInitOverrideCallback;3408p_Fm->fwVerify = DEFAULT_VerifyUcode;3409p_Fm->firmware.size = p_FmParam->firmware.size;3410if (p_Fm->firmware.size)3411{3412p_Fm->firmware.p_Code = (uint32_t *)XX_Malloc(p_Fm->firmware.size);3413if (!p_Fm->firmware.p_Code)3414{3415XX_FreeSpinlock(p_Fm->h_Spinlock);3416XX_Free(p_Fm->p_FmStateStruct);3417XX_Free(p_Fm->p_FmDriverParam);3418XX_Free(p_Fm);3419REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM firmware code"));3420return NULL;3421}3422memcpy(p_Fm->firmware.p_Code, p_FmParam->firmware.p_Code ,p_Fm->firmware.size);3423}34243425if (p_Fm->guestId != NCSW_MASTER_ID)3426return p_Fm;34273428/* read revision */3429/* Chip dependent, will be configured in Init */3430fman_get_revision(p_Fm->p_FmFpmRegs,3431&p_Fm->p_FmStateStruct->revInfo.majorRev,3432&p_Fm->p_FmStateStruct->revInfo.minorRev);34333434#ifdef FM_AID_MODE_NO_TNUM_SW0053435if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)3436p_Fm->p_FmDriverParam->dma_aid_mode = e_FM_DMA_AID_OUT_PORT_ID;3437#endif /* FM_AID_MODE_NO_TNUM_SW005 */3438#ifndef FM_QMI_NO_DEQ_OPTIONS_SUPPORT3439if (p_Fm->p_FmStateStruct->revInfo.majorRev != 4)3440p_Fm->p_FmDriverParam->qmi_def_tnums_thresh = QMI_DEF_TNUMS_THRESH;3441#endif /* FM_QMI_NO_DEQ_OPTIONS_SUPPORT */34423443p_Fm->p_FmStateStruct->totalFifoSize = 0;3444p_Fm->p_FmStateStruct->totalNumOfTasks =3445DEFAULT_totalNumOfTasks(p_Fm->p_FmStateStruct->revInfo.majorRev,3446p_Fm->p_FmStateStruct->revInfo.minorRev);34473448#ifdef FM_HAS_TOTAL_DMAS3449p_Fm->p_FmStateStruct->maxNumOfOpenDmas = BMI_MAX_NUM_OF_DMAS;3450#endif /* FM_HAS_TOTAL_DMAS */3451#if (DPAA_VERSION < 11)3452p_Fm->p_FmDriverParam->dma_comm_qtsh_clr_emer = DEFAULT_dmaCommQLow;3453p_Fm->p_FmDriverParam->dma_comm_qtsh_asrt_emer = DEFAULT_dmaCommQHigh;3454p_Fm->p_FmDriverParam->dma_cam_num_of_entries = DEFAULT_dmaCamNumOfEntries;3455p_Fm->p_FmDriverParam->dma_read_buf_tsh_clr_emer = DEFAULT_dmaReadIntBufLow;3456p_Fm->p_FmDriverParam->dma_read_buf_tsh_asrt_emer = DEFAULT_dmaReadIntBufHigh;3457p_Fm->p_FmDriverParam->dma_write_buf_tsh_clr_emer = DEFAULT_dmaWriteIntBufLow;3458p_Fm->p_FmDriverParam->dma_write_buf_tsh_asrt_emer = DEFAULT_dmaWriteIntBufHigh;3459p_Fm->p_FmDriverParam->dma_axi_dbg_num_of_beats = DEFAULT_axiDbgNumOfBeats;3460#endif /* (DPAA_VERSION < 11) */3461#ifdef FM_NO_TNUM_AGING3462p_Fm->p_FmDriverParam->tnum_aging_period = 0;3463#endif3464p_Fm->tnumAgingPeriod = p_Fm->p_FmDriverParam->tnum_aging_period;34653466return p_Fm;3467}34683469/**************************************************************************//**3470@Function FM_Init34713472@Description Initializes the FM module34733474@Param[in] h_Fm - FM module descriptor34753476@Return E_OK on success; Error code otherwise.3477*//***************************************************************************/3478t_Error FM_Init(t_Handle h_Fm)3479{3480t_Fm *p_Fm = (t_Fm*)h_Fm;3481struct fman_cfg *p_FmDriverParam = NULL;3482t_Error err = E_OK;3483int i;3484t_FmRevisionInfo revInfo;3485struct fman_rg fman_rg;34863487SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);3488SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);34893490fman_rg.bmi_rg = p_Fm->p_FmBmiRegs;3491fman_rg.qmi_rg = p_Fm->p_FmQmiRegs;3492fman_rg.fpm_rg = p_Fm->p_FmFpmRegs;3493fman_rg.dma_rg = p_Fm->p_FmDmaRegs;34943495p_Fm->p_FmStateStruct->count1MicroBit = FM_TIMESTAMP_1_USEC_BIT;3496p_Fm->p_FmDriverParam->num_of_fman_ctrl_evnt_regs = FM_NUM_OF_FMAN_CTRL_EVENT_REGS;34973498if (p_Fm->guestId != NCSW_MASTER_ID)3499return InitGuestMode(p_Fm);35003501/* if user didn't configured totalFifoSize - (totalFifoSize=0) we configure default3502* according to chip. otherwise, we use user's configuration.3503*/3504if (p_Fm->p_FmStateStruct->totalFifoSize == 0)3505p_Fm->p_FmStateStruct->totalFifoSize = DEFAULT_totalFifoSize(p_Fm->p_FmStateStruct->revInfo.majorRev,3506p_Fm->p_FmStateStruct->revInfo.minorRev);35073508CHECK_INIT_PARAMETERS(p_Fm, CheckFmParameters);35093510p_FmDriverParam = p_Fm->p_FmDriverParam;35113512FM_GetRevision(p_Fm, &revInfo);35133514/* clear revision-dependent non existing exception */3515#ifdef FM_NO_DISPATCH_RAM_ECC3516if ((revInfo.majorRev != 4) &&3517(revInfo.majorRev < 6))3518p_Fm->p_FmStateStruct->exceptions &= ~FM_EX_BMI_DISPATCH_RAM_ECC;3519#endif /* FM_NO_DISPATCH_RAM_ECC */35203521#ifdef FM_QMI_NO_ECC_EXCEPTIONS3522if (revInfo.majorRev == 4)3523p_Fm->p_FmStateStruct->exceptions &= ~(FM_EX_QMI_SINGLE_ECC | FM_EX_QMI_DOUBLE_ECC);3524#endif /* FM_QMI_NO_ECC_EXCEPTIONS */35253526#ifdef FM_QMI_NO_SINGLE_ECC_EXCEPTION3527if (revInfo.majorRev >= 6)3528p_Fm->p_FmStateStruct->exceptions &= ~FM_EX_QMI_SINGLE_ECC;3529#endif /* FM_QMI_NO_SINGLE_ECC_EXCEPTION */35303531FmMuramClear(p_Fm->h_FmMuram);35323533/* clear CPG */3534IOMemSet32(UINT_TO_PTR(p_Fm->baseAddr + FM_MM_CGP), 0, FM_PORT_NUM_OF_CONGESTION_GRPS);35353536/* add to the default exceptions the user's definitions */3537p_Fm->p_FmStateStruct->exceptions |= p_Fm->userSetExceptions;35383539/* Reset the FM if required */3540if (p_Fm->resetOnInit)3541{3542#ifdef FM_UCODE_NOT_RESET_ERRATA_BUGZILLA61733543if ((err = FwNotResetErratumBugzilla6173WA(p_Fm)) != E_OK)3544RETURN_ERROR(MAJOR, err, NO_MSG);3545#else /* not FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 */35463547if (p_Fm->f_ResetOnInitOverride)3548{3549/* Perform user specific FMan reset */3550p_Fm->f_ResetOnInitOverride(h_Fm);3551}3552else3553{3554/* Perform FMan reset */3555FmReset(h_Fm);3556}35573558if (fman_is_qmi_halt_not_busy_state(p_Fm->p_FmQmiRegs))3559{3560fman_resume(p_Fm->p_FmFpmRegs);3561XX_UDelay(100);3562}3563#endif /* not FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 */3564}35653566#ifdef FM_UCODE_NOT_RESET_ERRATA_BUGZILLA61733567if (!p_Fm->resetOnInit) /* Skip operations done in errata workaround */3568{3569#endif /* FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 */3570/* Load FMan-Controller code to IRAM */35713572ClearIRam(p_Fm);35733574if (p_Fm->firmware.p_Code && (LoadFmanCtrlCode(p_Fm) != E_OK))3575RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);3576#ifdef FM_UCODE_NOT_RESET_ERRATA_BUGZILLA61733577}3578#endif /* FM_UCODE_NOT_RESET_ERRATA_BUGZILLA6173 */35793580#ifdef FM_CAPWAP_SUPPORT3581/* save first 256 byte in MURAM */3582p_Fm->resAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_Fm->h_FmMuram, 256, 0));3583if (!p_Fm->resAddr)3584RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for reserved Area failed"));35853586WRITE_BLOCK(UINT_TO_PTR(p_Fm->resAddr), 0, 256);3587#endif /* FM_CAPWAP_SUPPORT */35883589#if (DPAA_VERSION >= 11)3590p_Fm->partVSPBase = AllocVSPsForPartition(h_Fm, p_Fm->partVSPBase, p_Fm->partNumOfVSPs, p_Fm->guestId);3591if (p_Fm->partVSPBase == (uint8_t)(ILLEGAL_BASE))3592DBG(WARNING, ("partition VSPs allocation is FAILED"));3593#endif /* (DPAA_VERSION >= 11) */35943595/* General FM driver initialization */3596p_Fm->fmMuramPhysBaseAddr =3597(uint64_t)(XX_VirtToPhys(UINT_TO_PTR(p_Fm->baseAddr + FM_MM_MURAM)));35983599for (i=0;i<e_FM_EV_DUMMY_LAST;i++)3600p_Fm->intrMng[i].f_Isr = UnimplementedIsr;3601for (i=0;i<FM_NUM_OF_FMAN_CTRL_EVENT_REGS;i++)3602p_Fm->fmanCtrlIntr[i].f_Isr = UnimplementedFmanCtrlIsr;36033604p_FmDriverParam->exceptions = p_Fm->p_FmStateStruct->exceptions;36053606/**********************/3607/* Init DMA Registers */3608/**********************/3609err = InitFmDma(p_Fm);3610if (err != E_OK)3611{3612FreeInitResources(p_Fm);3613RETURN_ERROR(MAJOR, err, NO_MSG);3614}36153616/**********************/3617/* Init FPM Registers */3618/**********************/3619err = InitFmFpm(p_Fm);3620if (err != E_OK)3621{3622FreeInitResources(p_Fm);3623RETURN_ERROR(MAJOR, err, NO_MSG);3624}36253626/* define common resources */3627/* allocate MURAM for FIFO according to total size */3628p_Fm->fifoBaseAddr = PTR_TO_UINT(FM_MURAM_AllocMem(p_Fm->h_FmMuram,3629p_Fm->p_FmStateStruct->totalFifoSize,3630BMI_FIFO_ALIGN));3631if (!p_Fm->fifoBaseAddr)3632{3633FreeInitResources(p_Fm);3634RETURN_ERROR(MAJOR, E_NO_MEMORY, ("MURAM alloc for BMI FIFO failed"));3635}36363637p_FmDriverParam->fifo_base_addr = (uint32_t)(XX_VirtToPhys(UINT_TO_PTR(p_Fm->fifoBaseAddr)) - p_Fm->fmMuramPhysBaseAddr);3638p_FmDriverParam->total_fifo_size = p_Fm->p_FmStateStruct->totalFifoSize;3639p_FmDriverParam->total_num_of_tasks = p_Fm->p_FmStateStruct->totalNumOfTasks;3640p_FmDriverParam->clk_freq = p_Fm->p_FmStateStruct->fmClkFreq;36413642/**********************/3643/* Init BMI Registers */3644/**********************/3645err = InitFmBmi(p_Fm);3646if (err != E_OK)3647{3648FreeInitResources(p_Fm);3649RETURN_ERROR(MAJOR, err, NO_MSG);3650}36513652/**********************/3653/* Init QMI Registers */3654/**********************/3655err = InitFmQmi(p_Fm);3656if (err != E_OK)3657{3658FreeInitResources(p_Fm);3659RETURN_ERROR(MAJOR, err, NO_MSG);3660}36613662/* build the FM master partition IPC address */3663if (Sprint (p_Fm->fmModuleName, "FM_%d_%d",p_Fm->p_FmStateStruct->fmId, NCSW_MASTER_ID) != 6)3664{3665FreeInitResources(p_Fm);3666RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));3667}36683669err = XX_IpcRegisterMsgHandler(p_Fm->fmModuleName, FmHandleIpcMsgCB, p_Fm, FM_IPC_MAX_REPLY_SIZE);3670if (err)3671{3672FreeInitResources(p_Fm);3673RETURN_ERROR(MAJOR, err, NO_MSG);3674}36753676/* Register the FM interrupts handlers */3677if (p_Fm->p_FmStateStruct->irq != NO_IRQ)3678{3679XX_SetIntr(p_Fm->p_FmStateStruct->irq, FM_EventIsr, p_Fm);3680XX_EnableIntr(p_Fm->p_FmStateStruct->irq);3681}36823683if (p_Fm->p_FmStateStruct->errIrq != NO_IRQ)3684{3685XX_SetIntr(p_Fm->p_FmStateStruct->errIrq, (void (*) (t_Handle))FM_ErrorIsr, p_Fm);3686XX_EnableIntr(p_Fm->p_FmStateStruct->errIrq);3687}36883689err = (t_Error)fman_enable(&fman_rg , p_FmDriverParam);3690if (err != E_OK)3691return err; /* FIXME */36923693EnableTimeStamp(p_Fm);36943695if (p_Fm->firmware.p_Code)3696{3697XX_Free(p_Fm->firmware.p_Code);3698p_Fm->firmware.p_Code = NULL;3699}37003701XX_Free(p_Fm->p_FmDriverParam);3702p_Fm->p_FmDriverParam = NULL;37033704return E_OK;3705}37063707/**************************************************************************//**3708@Function FM_Free37093710@Description Frees all resources that were assigned to FM module.37113712Calling this routine invalidates the descriptor.37133714@Param[in] h_Fm - FM module descriptor37153716@Return E_OK on success; Error code otherwise.3717*//***************************************************************************/3718t_Error FM_Free(t_Handle h_Fm)3719{3720t_Fm *p_Fm = (t_Fm*)h_Fm;3721struct fman_rg fman_rg;37223723SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);37243725fman_rg.bmi_rg = p_Fm->p_FmBmiRegs;3726fman_rg.qmi_rg = p_Fm->p_FmQmiRegs;3727fman_rg.fpm_rg = p_Fm->p_FmFpmRegs;3728fman_rg.dma_rg = p_Fm->p_FmDmaRegs;37293730if (p_Fm->guestId != NCSW_MASTER_ID)3731{3732#if (DPAA_VERSION >= 11)3733FreeVSPsForPartition(h_Fm, p_Fm->partVSPBase, p_Fm->partNumOfVSPs, p_Fm->guestId);37343735if (p_Fm->p_FmSp)3736{3737XX_Free(p_Fm->p_FmSp);3738p_Fm->p_FmSp = NULL;3739}3740#endif /* (DPAA_VERSION >= 11) */37413742if (p_Fm->fmModuleName[0] != 0)3743XX_IpcUnregisterMsgHandler(p_Fm->fmModuleName);37443745if (!p_Fm->recoveryMode)3746XX_Free(p_Fm->p_FmStateStruct);37473748XX_Free(p_Fm);37493750return E_OK;3751}37523753fman_free_resources(&fman_rg);37543755if ((p_Fm->guestId == NCSW_MASTER_ID) && (p_Fm->fmModuleName[0] != 0))3756XX_IpcUnregisterMsgHandler(p_Fm->fmModuleName);37573758if (p_Fm->p_FmStateStruct)3759{3760if (p_Fm->p_FmStateStruct->irq != NO_IRQ)3761{3762XX_DisableIntr(p_Fm->p_FmStateStruct->irq);3763XX_FreeIntr(p_Fm->p_FmStateStruct->irq);3764}3765if (p_Fm->p_FmStateStruct->errIrq != NO_IRQ)3766{3767XX_DisableIntr(p_Fm->p_FmStateStruct->errIrq);3768XX_FreeIntr(p_Fm->p_FmStateStruct->errIrq);3769}3770}37713772#if (DPAA_VERSION >= 11)3773FreeVSPsForPartition(h_Fm, p_Fm->partVSPBase, p_Fm->partNumOfVSPs, p_Fm->guestId);37743775if (p_Fm->p_FmSp)3776{3777XX_Free(p_Fm->p_FmSp);3778p_Fm->p_FmSp = NULL;3779}3780#endif /* (DPAA_VERSION >= 11) */37813782if (p_Fm->h_Spinlock)3783XX_FreeSpinlock(p_Fm->h_Spinlock);37843785if (p_Fm->p_FmDriverParam)3786{3787if (p_Fm->firmware.p_Code)3788XX_Free(p_Fm->firmware.p_Code);3789XX_Free(p_Fm->p_FmDriverParam);3790p_Fm->p_FmDriverParam = NULL;3791}37923793FreeInitResources(p_Fm);37943795if (!p_Fm->recoveryMode && p_Fm->p_FmStateStruct)3796XX_Free(p_Fm->p_FmStateStruct);37973798XX_Free(p_Fm);37993800return E_OK;3801}38023803/*************************************************/3804/* API Advanced Init unit functions */3805/*************************************************/38063807t_Error FM_ConfigResetOnInit(t_Handle h_Fm, bool enable)3808{3809t_Fm *p_Fm = (t_Fm*)h_Fm;38103811SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);3812SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);3813SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);38143815p_Fm->resetOnInit = enable;38163817return E_OK;3818}38193820t_Error FM_ConfigResetOnInitOverrideCallback(t_Handle h_Fm, t_FmResetOnInitOverrideCallback *f_ResetOnInitOverride)3821{3822t_Fm *p_Fm = (t_Fm*)h_Fm;38233824SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);3825SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);3826SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);38273828p_Fm->f_ResetOnInitOverride = f_ResetOnInitOverride;38293830return E_OK;3831}38323833t_Error FM_ConfigTotalFifoSize(t_Handle h_Fm, uint32_t totalFifoSize)3834{3835t_Fm *p_Fm = (t_Fm*)h_Fm;38363837SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);3838SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);3839SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);38403841p_Fm->p_FmStateStruct->totalFifoSize = totalFifoSize;38423843return E_OK;3844}38453846t_Error FM_ConfigDmaCacheOverride(t_Handle h_Fm, e_FmDmaCacheOverride cacheOverride)3847{3848t_Fm *p_Fm = (t_Fm*)h_Fm;3849enum fman_dma_cache_override fsl_cache_override;38503851SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);3852SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);3853SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);38543855FMAN_CACHE_OVERRIDE_TRANS(fsl_cache_override, cacheOverride)3856p_Fm->p_FmDriverParam->dma_cache_override = fsl_cache_override;38573858return E_OK;3859}38603861t_Error FM_ConfigDmaAidOverride(t_Handle h_Fm, bool aidOverride)3862{3863t_Fm *p_Fm = (t_Fm*)h_Fm;38643865SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);3866SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);3867SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);38683869p_Fm->p_FmDriverParam->dma_aid_override = aidOverride;38703871return E_OK;3872}38733874t_Error FM_ConfigDmaAidMode(t_Handle h_Fm, e_FmDmaAidMode aidMode)3875{3876t_Fm *p_Fm = (t_Fm*)h_Fm;3877enum fman_dma_aid_mode fsl_aid_mode;38783879SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);3880SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);3881SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);38823883FMAN_AID_MODE_TRANS(fsl_aid_mode, aidMode);3884p_Fm->p_FmDriverParam->dma_aid_mode = fsl_aid_mode;38853886return E_OK;3887}38883889t_Error FM_ConfigDmaAxiDbgNumOfBeats(t_Handle h_Fm, uint8_t axiDbgNumOfBeats)3890{3891t_Fm *p_Fm = (t_Fm*)h_Fm;38923893SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);3894SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);3895SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);38963897#if (DPAA_VERSION >= 11)3898RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!"));3899#else3900p_Fm->p_FmDriverParam->dma_axi_dbg_num_of_beats = axiDbgNumOfBeats;39013902return E_OK;3903#endif /* (DPAA_VERSION >= 11) */3904}39053906t_Error FM_ConfigDmaCamNumOfEntries(t_Handle h_Fm, uint8_t numOfEntries)3907{3908t_Fm *p_Fm = (t_Fm*)h_Fm;39093910SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);3911SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);3912SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);39133914p_Fm->p_FmDriverParam->dma_cam_num_of_entries = numOfEntries;39153916return E_OK;3917}39183919t_Error FM_ConfigDmaDbgCounter(t_Handle h_Fm, e_FmDmaDbgCntMode fmDmaDbgCntMode)3920{3921t_Fm *p_Fm = (t_Fm*)h_Fm;3922enum fman_dma_dbg_cnt_mode fsl_dma_dbg_cnt;39233924SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);3925SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);3926SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);39273928FMAN_DMA_DBG_CNT_TRANS(fsl_dma_dbg_cnt, fmDmaDbgCntMode);3929p_Fm->p_FmDriverParam->dma_dbg_cnt_mode = fsl_dma_dbg_cnt;39303931return E_OK;3932}39333934t_Error FM_ConfigDmaStopOnBusErr(t_Handle h_Fm, bool stop)3935{3936t_Fm *p_Fm = (t_Fm*)h_Fm;39373938SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);3939SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);3940SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);39413942p_Fm->p_FmDriverParam->dma_stop_on_bus_error = stop;39433944return E_OK;3945}39463947t_Error FM_ConfigDmaEmergency(t_Handle h_Fm, t_FmDmaEmergency *p_Emergency)3948{3949t_Fm *p_Fm = (t_Fm*)h_Fm;3950enum fman_dma_emergency_level fsl_dma_emer;39513952SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);3953SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);3954SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);39553956FMAN_DMA_EMER_TRANS(fsl_dma_emer, p_Emergency->emergencyLevel);3957p_Fm->p_FmDriverParam->dma_en_emergency = TRUE;3958p_Fm->p_FmDriverParam->dma_emergency_bus_select = (uint32_t)p_Emergency->emergencyBusSelect;3959p_Fm->p_FmDriverParam->dma_emergency_level = fsl_dma_emer;39603961return E_OK;3962}39633964t_Error FM_ConfigDmaEmergencySmoother(t_Handle h_Fm, uint32_t emergencyCnt)3965{3966t_Fm *p_Fm = (t_Fm*)h_Fm;39673968SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);3969SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);3970SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);39713972p_Fm->p_FmDriverParam->dma_en_emergency_smoother = TRUE;3973p_Fm->p_FmDriverParam->dma_emergency_switch_counter = emergencyCnt;39743975return E_OK;3976}39773978t_Error FM_ConfigDmaErr(t_Handle h_Fm, e_FmDmaErr dmaErr)3979{3980t_Fm *p_Fm = (t_Fm*)h_Fm;3981enum fman_dma_err fsl_dma_err;39823983SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);3984SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);3985SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);39863987FMAN_DMA_ERR_TRANS(fsl_dma_err, dmaErr);3988p_Fm->p_FmDriverParam->dma_err = fsl_dma_err;39893990return E_OK;3991}39923993t_Error FM_ConfigCatastrophicErr(t_Handle h_Fm, e_FmCatastrophicErr catastrophicErr)3994{3995t_Fm *p_Fm = (t_Fm*)h_Fm;3996enum fman_catastrophic_err fsl_catastrophic_err;39973998SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);3999SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);4000SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);40014002FMAN_CATASTROPHIC_ERR_TRANS(fsl_catastrophic_err, catastrophicErr);4003p_Fm->p_FmDriverParam->catastrophic_err = fsl_catastrophic_err;40044005return E_OK;4006}40074008t_Error FM_ConfigEnableMuramTestMode(t_Handle h_Fm)4009{4010t_Fm *p_Fm = (t_Fm*)h_Fm;40114012SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4013SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);4014SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);40154016if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)4017RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!"));40184019p_Fm->p_FmDriverParam->en_muram_test_mode = TRUE;40204021return E_OK;4022}40234024t_Error FM_ConfigEnableIramTestMode(t_Handle h_Fm)4025{4026t_Fm *p_Fm = (t_Fm*)h_Fm;40274028SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE );4029SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);4030SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);40314032if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)4033RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!"));40344035p_Fm->p_FmDriverParam->en_iram_test_mode = TRUE;40364037return E_OK;4038}40394040t_Error FM_ConfigHaltOnExternalActivation(t_Handle h_Fm, bool enable)4041{4042t_Fm *p_Fm = (t_Fm*)h_Fm;40434044SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4045SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);4046SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);40474048p_Fm->p_FmDriverParam->halt_on_external_activ = enable;40494050return E_OK;4051}40524053t_Error FM_ConfigHaltOnUnrecoverableEccError(t_Handle h_Fm, bool enable)4054{4055t_Fm *p_Fm = (t_Fm*)h_Fm;40564057SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4058SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);4059SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);40604061if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)4062RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!"));40634064p_Fm->p_FmDriverParam->halt_on_unrecov_ecc_err = enable;40654066return E_OK;4067}40684069t_Error FM_ConfigException(t_Handle h_Fm, e_FmExceptions exception, bool enable)4070{4071t_Fm *p_Fm = (t_Fm*)h_Fm;4072uint32_t bitMask = 0;40734074SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4075SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);4076SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);40774078GET_EXCEPTION_FLAG(bitMask, exception);4079if (bitMask)4080{4081if (enable)4082p_Fm->userSetExceptions |= bitMask;4083else4084p_Fm->p_FmStateStruct->exceptions &= ~bitMask;4085}4086else4087RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));40884089return E_OK;4090}40914092t_Error FM_ConfigExternalEccRamsEnable(t_Handle h_Fm, bool enable)4093{4094t_Fm *p_Fm = (t_Fm*)h_Fm;40954096SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4097SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);4098SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);40994100p_Fm->p_FmDriverParam->external_ecc_rams_enable = enable;41014102return E_OK;4103}41044105t_Error FM_ConfigTnumAgingPeriod(t_Handle h_Fm, uint16_t tnumAgingPeriod)4106{4107t_Fm *p_Fm = (t_Fm*)h_Fm;41084109SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4110SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);4111SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);41124113p_Fm->p_FmDriverParam->tnum_aging_period = tnumAgingPeriod;4114p_Fm->tnumAgingPeriod = p_Fm->p_FmDriverParam->tnum_aging_period;41154116return E_OK;4117}41184119/****************************************************/4120/* Hidden-DEBUG Only API */4121/****************************************************/41224123t_Error FM_ConfigThresholds(t_Handle h_Fm, t_FmThresholds *p_FmThresholds)4124{4125t_Fm *p_Fm = (t_Fm*)h_Fm;41264127SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4128SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);4129SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);41304131p_Fm->p_FmDriverParam->disp_limit_tsh = p_FmThresholds->dispLimit;4132p_Fm->p_FmDriverParam->prs_disp_tsh = p_FmThresholds->prsDispTh;4133p_Fm->p_FmDriverParam->plcr_disp_tsh = p_FmThresholds->plcrDispTh;4134p_Fm->p_FmDriverParam->kg_disp_tsh = p_FmThresholds->kgDispTh;4135p_Fm->p_FmDriverParam->bmi_disp_tsh = p_FmThresholds->bmiDispTh;4136p_Fm->p_FmDriverParam->qmi_enq_disp_tsh = p_FmThresholds->qmiEnqDispTh;4137p_Fm->p_FmDriverParam->qmi_deq_disp_tsh = p_FmThresholds->qmiDeqDispTh;4138p_Fm->p_FmDriverParam->fm_ctl1_disp_tsh = p_FmThresholds->fmCtl1DispTh;4139p_Fm->p_FmDriverParam->fm_ctl2_disp_tsh = p_FmThresholds->fmCtl2DispTh;41404141return E_OK;4142}41434144t_Error FM_ConfigDmaSosEmergencyThreshold(t_Handle h_Fm, uint32_t dmaSosEmergency)4145{4146t_Fm *p_Fm = (t_Fm*)h_Fm;41474148SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4149SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);4150SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);41514152p_Fm->p_FmDriverParam->dma_sos_emergency = dmaSosEmergency;41534154return E_OK;4155}41564157t_Error FM_ConfigDmaWriteBufThresholds(t_Handle h_Fm, t_FmDmaThresholds *p_FmDmaThresholds)41584159{4160t_Fm *p_Fm = (t_Fm*)h_Fm;41614162SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4163SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);4164SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);41654166#if (DPAA_VERSION >= 11)4167RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!"));4168#else4169p_Fm->p_FmDriverParam->dma_write_buf_tsh_asrt_emer = p_FmDmaThresholds->assertEmergency;4170p_Fm->p_FmDriverParam->dma_write_buf_tsh_clr_emer = p_FmDmaThresholds->clearEmergency;41714172return E_OK;4173#endif4174}41754176t_Error FM_ConfigDmaCommQThresholds(t_Handle h_Fm, t_FmDmaThresholds *p_FmDmaThresholds)4177{4178t_Fm *p_Fm = (t_Fm*)h_Fm;41794180SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4181SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);4182SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);41834184p_Fm->p_FmDriverParam->dma_comm_qtsh_asrt_emer = p_FmDmaThresholds->assertEmergency;4185p_Fm->p_FmDriverParam->dma_comm_qtsh_clr_emer = p_FmDmaThresholds->clearEmergency;41864187return E_OK;4188}41894190t_Error FM_ConfigDmaReadBufThresholds(t_Handle h_Fm, t_FmDmaThresholds *p_FmDmaThresholds)4191{4192t_Fm *p_Fm = (t_Fm*)h_Fm;41934194SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4195SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);4196SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);41974198#if (DPAA_VERSION >= 11)4199RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Not available for this FM revision!"));4200#else4201p_Fm->p_FmDriverParam->dma_read_buf_tsh_clr_emer = p_FmDmaThresholds->clearEmergency;4202p_Fm->p_FmDriverParam->dma_read_buf_tsh_asrt_emer = p_FmDmaThresholds->assertEmergency;42034204return E_OK;4205#endif4206}42074208t_Error FM_ConfigDmaWatchdog(t_Handle h_Fm, uint32_t watchdogValue)4209{4210t_Fm *p_Fm = (t_Fm*)h_Fm;42114212SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4213SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);4214SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);42154216p_Fm->p_FmDriverParam->dma_watchdog = watchdogValue;42174218return E_OK;4219}42204221t_Error FM_ConfigEnableCounters(t_Handle h_Fm)4222{4223t_Fm *p_Fm = (t_Fm*)h_Fm;42244225SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4226SANITY_CHECK_RETURN_ERROR(p_Fm->p_FmDriverParam, E_INVALID_HANDLE);4227UNUSED(p_Fm);42284229return E_OK;4230}42314232t_Error FmGetSetParams(t_Handle h_Fm, t_FmGetSetParams *p_Params)4233{4234t_Fm* p_Fm = (t_Fm*)h_Fm;4235if (p_Params->setParams.type & UPDATE_FM_CLD)4236{4237WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_cld, GET_UINT32(4238p_Fm->p_FmFpmRegs->fm_cld) | 0x00000800);4239}4240if (p_Params->setParams.type & CLEAR_IRAM_READY)4241{4242t_FMIramRegs *p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM);4243WRITE_UINT32(p_Iram->iready,GET_UINT32(p_Iram->iready) & ~IRAM_READY);4244}4245if (p_Params->setParams.type & UPDATE_FPM_EXTC)4246WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_extc,0x80000000);4247if (p_Params->setParams.type & UPDATE_FPM_EXTC_CLEAR)4248WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_extc,0x00800000);4249if (p_Params->setParams.type & UPDATE_FPM_BRKC_SLP)4250{4251if (p_Params->setParams.sleep)4252WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc, GET_UINT32(4253p_Fm->p_FmFpmRegs->fmfp_brkc) | FPM_BRKC_SLP);4254else4255WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc, GET_UINT32(4256p_Fm->p_FmFpmRegs->fmfp_brkc) & ~FPM_BRKC_SLP);4257}4258if (p_Params->getParams.type & GET_FM_CLD)4259p_Params->getParams.fm_cld = GET_UINT32(p_Fm->p_FmFpmRegs->fm_cld);4260if (p_Params->getParams.type & GET_FMQM_GS)4261p_Params->getParams.fmqm_gs = GET_UINT32(p_Fm->p_FmQmiRegs->fmqm_gs);4262if (p_Params->getParams.type & GET_FM_NPI)4263p_Params->getParams.fm_npi = GET_UINT32(p_Fm->p_FmFpmRegs->fm_npi);4264if (p_Params->getParams.type & GET_FMFP_EXTC)4265p_Params->getParams.fmfp_extc = GET_UINT32(p_Fm->p_FmFpmRegs->fmfp_extc);4266return E_OK;4267}426842694270/****************************************************/4271/* API Run-time Control uint functions */4272/****************************************************/4273void FM_EventIsr(t_Handle h_Fm)4274{4275#define FM_M_CALL_1G_MAC_ISR(_id) \4276{ \4277if (p_Fm->guestId != p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_1G_MAC0+_id)].guestId) \4278SendIpcIsr(p_Fm, (e_FmInterModuleEvent)(e_FM_EV_1G_MAC0+_id), pending); \4279else \4280p_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);\4281}4282#define FM_M_CALL_10G_MAC_ISR(_id) \4283{ \4284if (p_Fm->guestId != p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_10G_MAC0+_id)].guestId) \4285SendIpcIsr(p_Fm, (e_FmInterModuleEvent)(e_FM_EV_10G_MAC0+_id), pending); \4286else \4287p_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);\4288}4289t_Fm *p_Fm = (t_Fm*)h_Fm;4290uint32_t pending, event;4291struct fman_fpm_regs *fpm_rg;42924293SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE);4294SANITY_CHECK_RETURN(!p_Fm->p_FmDriverParam, E_INVALID_HANDLE);4295SANITY_CHECK_RETURN((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);42964297fpm_rg = p_Fm->p_FmFpmRegs;42984299/* normal interrupts */4300pending = fman_get_normal_pending(fpm_rg);4301if (!pending)4302return;4303if (pending & INTR_EN_WAKEUP) // this is a wake up from sleep interrupt4304{4305t_FmGetSetParams fmGetSetParams;4306memset(&fmGetSetParams, 0, sizeof (t_FmGetSetParams));4307fmGetSetParams.setParams.type = UPDATE_FPM_BRKC_SLP;4308fmGetSetParams.setParams.sleep = 0;4309FmGetSetParams(h_Fm, &fmGetSetParams);4310}4311if (pending & INTR_EN_QMI)4312QmiEvent(p_Fm);4313if (pending & INTR_EN_PRS)4314p_Fm->intrMng[e_FM_EV_PRS].f_Isr(p_Fm->intrMng[e_FM_EV_PRS].h_SrcHandle);4315if (pending & INTR_EN_PLCR)4316p_Fm->intrMng[e_FM_EV_PLCR].f_Isr(p_Fm->intrMng[e_FM_EV_PLCR].h_SrcHandle);4317if (pending & INTR_EN_TMR)4318p_Fm->intrMng[e_FM_EV_TMR].f_Isr(p_Fm->intrMng[e_FM_EV_TMR].h_SrcHandle);43194320/* MAC events may belong to different partitions */4321if (pending & INTR_EN_1G_MAC0)4322FM_M_CALL_1G_MAC_ISR(0);4323if (pending & INTR_EN_1G_MAC1)4324FM_M_CALL_1G_MAC_ISR(1);4325if (pending & INTR_EN_1G_MAC2)4326FM_M_CALL_1G_MAC_ISR(2);4327if (pending & INTR_EN_1G_MAC3)4328FM_M_CALL_1G_MAC_ISR(3);4329if (pending & INTR_EN_1G_MAC4)4330FM_M_CALL_1G_MAC_ISR(4);4331if (pending & INTR_EN_1G_MAC5)4332FM_M_CALL_1G_MAC_ISR(5);4333if (pending & INTR_EN_1G_MAC6)4334FM_M_CALL_1G_MAC_ISR(6);4335if (pending & INTR_EN_1G_MAC7)4336FM_M_CALL_1G_MAC_ISR(7);4337if (pending & INTR_EN_10G_MAC0)4338FM_M_CALL_10G_MAC_ISR(0);4339if (pending & INTR_EN_10G_MAC1)4340FM_M_CALL_10G_MAC_ISR(1);43414342/* IM port events may belong to different partitions */4343if (pending & INTR_EN_REV0)4344{4345event = fman_get_controller_event(fpm_rg, 0);4346if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_FMAN_CTRL_0].guestId)4347/*TODO IPC ISR For Fman Ctrl */4348ASSERT_COND(0);4349/* SendIpcIsr(p_Fm, e_FM_EV_FMAN_CTRL_0, pending); */4350else4351p_Fm->fmanCtrlIntr[0].f_Isr(p_Fm->fmanCtrlIntr[0].h_SrcHandle, event);43524353}4354if (pending & INTR_EN_REV1)4355{4356event = fman_get_controller_event(fpm_rg, 1);4357if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_FMAN_CTRL_1].guestId)4358/*TODO IPC ISR For Fman Ctrl */4359ASSERT_COND(0);4360/* SendIpcIsr(p_Fm, e_FM_EV_FMAN_CTRL_1, pending); */4361else4362p_Fm->fmanCtrlIntr[1].f_Isr(p_Fm->fmanCtrlIntr[1].h_SrcHandle, event);4363}4364if (pending & INTR_EN_REV2)4365{4366event = fman_get_controller_event(fpm_rg, 2);4367if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_FMAN_CTRL_2].guestId)4368/*TODO IPC ISR For Fman Ctrl */4369ASSERT_COND(0);4370/* SendIpcIsr(p_Fm, e_FM_EV_FMAN_CTRL_2, pending); */4371else4372p_Fm->fmanCtrlIntr[2].f_Isr(p_Fm->fmanCtrlIntr[2].h_SrcHandle, event);4373}4374if (pending & INTR_EN_REV3)4375{4376event = fman_get_controller_event(fpm_rg, 3);4377if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_FMAN_CTRL_3].guestId)4378/*TODO IPC ISR For Fman Ctrl */4379ASSERT_COND(0);4380/* SendIpcIsr(p_Fm, e_FM_EV_FMAN_CTRL_2, pendin3); */4381else4382p_Fm->fmanCtrlIntr[3].f_Isr(p_Fm->fmanCtrlIntr[3].h_SrcHandle, event);4383}4384#ifdef FM_MACSEC_SUPPORT4385if (pending & INTR_EN_MACSEC_MAC0)4386{4387if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_MACSEC_MAC0].guestId)4388SendIpcIsr(p_Fm, e_FM_EV_MACSEC_MAC0, pending);4389else4390p_Fm->intrMng[e_FM_EV_MACSEC_MAC0].f_Isr(p_Fm->intrMng[e_FM_EV_MACSEC_MAC0].h_SrcHandle);4391}4392#endif /* FM_MACSEC_SUPPORT */4393}43944395t_Error FM_ErrorIsr(t_Handle h_Fm)4396{4397#define FM_M_CALL_1G_MAC_ERR_ISR(_id) \4398{ \4399if (p_Fm->guestId != p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_1G_MAC0+_id)].guestId) \4400SendIpcIsr(p_Fm, (e_FmInterModuleEvent)(e_FM_EV_ERR_1G_MAC0+_id), pending); \4401else \4402p_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);\4403}4404#define FM_M_CALL_10G_MAC_ERR_ISR(_id) \4405{ \4406if (p_Fm->guestId != p_Fm->intrMng[(e_FmInterModuleEvent)(e_FM_EV_ERR_10G_MAC0+_id)].guestId) \4407SendIpcIsr(p_Fm, (e_FmInterModuleEvent)(e_FM_EV_ERR_10G_MAC0+_id), pending); \4408else \4409p_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);\4410}4411t_Fm *p_Fm = (t_Fm*)h_Fm;4412uint32_t pending;4413struct fman_fpm_regs *fpm_rg;44144415SANITY_CHECK_RETURN_ERROR(h_Fm, E_INVALID_HANDLE);4416SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);4417SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);44184419fpm_rg = p_Fm->p_FmFpmRegs;44204421/* error interrupts */4422pending = fman_get_fpm_error_interrupts(fpm_rg);4423if (!pending)4424return ERROR_CODE(E_EMPTY);44254426if (pending & ERR_INTR_EN_BMI)4427BmiErrEvent(p_Fm);4428if (pending & ERR_INTR_EN_QMI)4429QmiErrEvent(p_Fm);4430if (pending & ERR_INTR_EN_FPM)4431FpmErrEvent(p_Fm);4432if (pending & ERR_INTR_EN_DMA)4433DmaErrEvent(p_Fm);4434if (pending & ERR_INTR_EN_IRAM)4435IramErrIntr(p_Fm);4436if (pending & ERR_INTR_EN_MURAM)4437MuramErrIntr(p_Fm);4438if (pending & ERR_INTR_EN_PRS)4439p_Fm->intrMng[e_FM_EV_ERR_PRS].f_Isr(p_Fm->intrMng[e_FM_EV_ERR_PRS].h_SrcHandle);4440if (pending & ERR_INTR_EN_PLCR)4441p_Fm->intrMng[e_FM_EV_ERR_PLCR].f_Isr(p_Fm->intrMng[e_FM_EV_ERR_PLCR].h_SrcHandle);4442if (pending & ERR_INTR_EN_KG)4443p_Fm->intrMng[e_FM_EV_ERR_KG].f_Isr(p_Fm->intrMng[e_FM_EV_ERR_KG].h_SrcHandle);44444445/* MAC events may belong to different partitions */4446if (pending & ERR_INTR_EN_1G_MAC0)4447FM_M_CALL_1G_MAC_ERR_ISR(0);4448if (pending & ERR_INTR_EN_1G_MAC1)4449FM_M_CALL_1G_MAC_ERR_ISR(1);4450if (pending & ERR_INTR_EN_1G_MAC2)4451FM_M_CALL_1G_MAC_ERR_ISR(2);4452if (pending & ERR_INTR_EN_1G_MAC3)4453FM_M_CALL_1G_MAC_ERR_ISR(3);4454if (pending & ERR_INTR_EN_1G_MAC4)4455FM_M_CALL_1G_MAC_ERR_ISR(4);4456if (pending & ERR_INTR_EN_1G_MAC5)4457FM_M_CALL_1G_MAC_ERR_ISR(5);4458if (pending & ERR_INTR_EN_1G_MAC6)4459FM_M_CALL_1G_MAC_ERR_ISR(6);4460if (pending & ERR_INTR_EN_1G_MAC7)4461FM_M_CALL_1G_MAC_ERR_ISR(7);4462if (pending & ERR_INTR_EN_10G_MAC0)4463FM_M_CALL_10G_MAC_ERR_ISR(0);4464if (pending & ERR_INTR_EN_10G_MAC1)4465FM_M_CALL_10G_MAC_ERR_ISR(1);44664467#ifdef FM_MACSEC_SUPPORT4468if (pending & ERR_INTR_EN_MACSEC_MAC0)4469{4470if (p_Fm->guestId != p_Fm->intrMng[e_FM_EV_ERR_MACSEC_MAC0].guestId)4471SendIpcIsr(p_Fm, e_FM_EV_ERR_MACSEC_MAC0, pending);4472else4473p_Fm->intrMng[e_FM_EV_ERR_MACSEC_MAC0].f_Isr(p_Fm->intrMng[e_FM_EV_ERR_MACSEC_MAC0].h_SrcHandle);4474}4475#endif /* FM_MACSEC_SUPPORT */44764477return E_OK;4478}44794480t_Error FM_SetPortsBandwidth(t_Handle h_Fm, t_FmPortsBandwidthParams *p_PortsBandwidth)4481{4482t_Fm *p_Fm = (t_Fm*)h_Fm;4483int i;4484uint8_t sum;4485uint8_t hardwarePortId;4486uint8_t weights[64];4487uint8_t weight, maxPercent = 0;4488struct fman_bmi_regs *bmi_rg;44894490SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4491SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);4492SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);44934494bmi_rg = p_Fm->p_FmBmiRegs;44954496memset(weights, 0, (sizeof(uint8_t) * 64));44974498/* check that all ports add up to 100% */4499sum = 0;4500for (i=0; i < p_PortsBandwidth->numOfPorts; i++)4501sum +=p_PortsBandwidth->portsBandwidths[i].bandwidth;4502if (sum != 100)4503RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Sum of ports bandwidth differ from 100%"));45044505/* find highest percent */4506for (i=0; i < p_PortsBandwidth->numOfPorts; i++)4507{4508if (p_PortsBandwidth->portsBandwidths[i].bandwidth > maxPercent)4509maxPercent = p_PortsBandwidth->portsBandwidths[i].bandwidth;4510}45114512ASSERT_COND(maxPercent > 0); /* guaranteed by sum = 100 */45134514/* calculate weight for each port */4515for (i=0; i < p_PortsBandwidth->numOfPorts; i++)4516{4517weight = (uint8_t)((p_PortsBandwidth->portsBandwidths[i].bandwidth * PORT_MAX_WEIGHT ) / maxPercent);4518/* we want even division between 1-to-PORT_MAX_WEIGHT. so if exact division4519is not reached, we round up so that:45200 until maxPercent/PORT_MAX_WEIGHT get "1"4521maxPercent/PORT_MAX_WEIGHT+1 until (maxPercent/PORT_MAX_WEIGHT)*2 get "2"4522...4523maxPercent - maxPercent/PORT_MAX_WEIGHT until maxPercent get "PORT_MAX_WEIGHT: */4524if ((uint8_t)((p_PortsBandwidth->portsBandwidths[i].bandwidth * PORT_MAX_WEIGHT ) % maxPercent))4525weight++;45264527/* find the location of this port within the register */4528hardwarePortId =4529SwPortIdToHwPortId(p_PortsBandwidth->portsBandwidths[i].type,4530p_PortsBandwidth->portsBandwidths[i].relativePortId,4531p_Fm->p_FmStateStruct->revInfo.majorRev,4532p_Fm->p_FmStateStruct->revInfo.minorRev);45334534ASSERT_COND(IN_RANGE(1, hardwarePortId, 63));4535weights[hardwarePortId] = weight;4536}45374538fman_set_ports_bandwidth(bmi_rg, weights);45394540return E_OK;4541}45424543t_Error FM_EnableRamsEcc(t_Handle h_Fm)4544{4545t_Fm *p_Fm = (t_Fm*)h_Fm;4546struct fman_fpm_regs *fpm_rg;45474548SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);45494550fpm_rg = p_Fm->p_FmFpmRegs;45514552if (p_Fm->guestId != NCSW_MASTER_ID)4553{4554t_FmIpcMsg msg;4555t_Error err;45564557memset(&msg, 0, sizeof(msg));4558msg.msgId = FM_ENABLE_RAM_ECC;4559err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],4560(uint8_t*)&msg,4561sizeof(msg.msgId),4562NULL,4563NULL,4564NULL,4565NULL);4566if (err != E_OK)4567RETURN_ERROR(MINOR, err, NO_MSG);4568return E_OK;4569}45704571if (!p_Fm->p_FmStateStruct->internalCall)4572p_Fm->p_FmStateStruct->explicitEnable = TRUE;4573p_Fm->p_FmStateStruct->internalCall = FALSE;45744575if (p_Fm->p_FmStateStruct->ramsEccEnable)4576return E_OK;4577else4578{4579fman_enable_rams_ecc(fpm_rg);4580p_Fm->p_FmStateStruct->ramsEccEnable = TRUE;4581}45824583return E_OK;4584}45854586t_Error FM_DisableRamsEcc(t_Handle h_Fm)4587{4588t_Fm *p_Fm = (t_Fm*)h_Fm;4589bool explicitDisable = FALSE;4590struct fman_fpm_regs *fpm_rg;45914592SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4593SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_HANDLE);45944595fpm_rg = p_Fm->p_FmFpmRegs;45964597if (p_Fm->guestId != NCSW_MASTER_ID)4598{4599t_Error err;4600t_FmIpcMsg msg;46014602memset(&msg, 0, sizeof(msg));4603msg.msgId = FM_DISABLE_RAM_ECC;4604if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],4605(uint8_t*)&msg,4606sizeof(msg.msgId),4607NULL,4608NULL,4609NULL,4610NULL)) != E_OK)4611RETURN_ERROR(MINOR, err, NO_MSG);4612return E_OK;4613}46144615if (!p_Fm->p_FmStateStruct->internalCall)4616explicitDisable = TRUE;4617p_Fm->p_FmStateStruct->internalCall = FALSE;46184619/* if rams are already disabled, or if rams were explicitly enabled and are4620currently called indirectly (not explicitly), ignore this call. */4621if (!p_Fm->p_FmStateStruct->ramsEccEnable ||4622(p_Fm->p_FmStateStruct->explicitEnable && !explicitDisable))4623return E_OK;4624else4625{4626if (p_Fm->p_FmStateStruct->explicitEnable)4627/* This is the case were both explicit are TRUE.4628Turn off this flag for cases were following ramsEnable4629routines are called */4630p_Fm->p_FmStateStruct->explicitEnable = FALSE;46314632fman_enable_rams_ecc(fpm_rg);4633p_Fm->p_FmStateStruct->ramsEccEnable = FALSE;4634}46354636return E_OK;4637}46384639t_Error FM_SetException(t_Handle h_Fm, e_FmExceptions exception, bool enable)4640{4641t_Fm *p_Fm = (t_Fm*)h_Fm;4642uint32_t bitMask = 0;4643enum fman_exceptions fslException;4644struct fman_rg fman_rg;46454646SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4647SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);46484649fman_rg.bmi_rg = p_Fm->p_FmBmiRegs;4650fman_rg.qmi_rg = p_Fm->p_FmQmiRegs;4651fman_rg.fpm_rg = p_Fm->p_FmFpmRegs;4652fman_rg.dma_rg = p_Fm->p_FmDmaRegs;46534654GET_EXCEPTION_FLAG(bitMask, exception);4655if (bitMask)4656{4657if (enable)4658p_Fm->p_FmStateStruct->exceptions |= bitMask;4659else4660p_Fm->p_FmStateStruct->exceptions &= ~bitMask;46614662fslException = FmanExceptionTrans(exception);46634664return (t_Error)fman_set_exception(&fman_rg,4665fslException,4666enable);4667}4668else4669RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));46704671return E_OK;4672}46734674t_Error FM_GetRevision(t_Handle h_Fm, t_FmRevisionInfo *p_FmRevisionInfo)4675{4676t_Fm *p_Fm = (t_Fm*)h_Fm;46774678p_FmRevisionInfo->majorRev = p_Fm->p_FmStateStruct->revInfo.majorRev;4679p_FmRevisionInfo->minorRev = p_Fm->p_FmStateStruct->revInfo.minorRev;46804681return E_OK;4682}46834684t_Error FM_GetFmanCtrlCodeRevision(t_Handle h_Fm, t_FmCtrlCodeRevisionInfo *p_RevisionInfo)4685{4686t_Fm *p_Fm = (t_Fm*)h_Fm;4687t_FMIramRegs *p_Iram;4688uint32_t revInfo;46894690SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4691SANITY_CHECK_RETURN_ERROR(p_RevisionInfo, E_NULL_POINTER);46924693if ((p_Fm->guestId != NCSW_MASTER_ID) &&4694p_Fm->h_IpcSessions[0])4695{4696t_Error err;4697t_FmIpcMsg msg;4698t_FmIpcReply reply;4699uint32_t replyLength;4700t_FmIpcFmanCtrlCodeRevisionInfo ipcRevInfo;47014702memset(&msg, 0, sizeof(msg));4703memset(&reply, 0, sizeof(reply));4704msg.msgId = FM_GET_FMAN_CTRL_CODE_REV;4705replyLength = sizeof(uint32_t) + sizeof(t_FmCtrlCodeRevisionInfo);4706if ((err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],4707(uint8_t*)&msg,4708sizeof(msg.msgId),4709(uint8_t*)&reply,4710&replyLength,4711NULL,4712NULL)) != E_OK)4713RETURN_ERROR(MINOR, err, NO_MSG);4714if (replyLength != (sizeof(uint32_t) + sizeof(t_FmCtrlCodeRevisionInfo)))4715RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));4716memcpy((uint8_t*)&ipcRevInfo, reply.replyBody, sizeof(t_FmCtrlCodeRevisionInfo));4717p_RevisionInfo->packageRev = ipcRevInfo.packageRev;4718p_RevisionInfo->majorRev = ipcRevInfo.majorRev;4719p_RevisionInfo->minorRev = ipcRevInfo.minorRev;4720return (t_Error)(reply.error);4721}4722else if (p_Fm->guestId != NCSW_MASTER_ID)4723RETURN_ERROR(MINOR, E_NOT_SUPPORTED,4724("running in guest-mode without IPC!"));47254726p_Iram = (t_FMIramRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_IMEM);4727WRITE_UINT32(p_Iram->iadd, 0x4);4728while (GET_UINT32(p_Iram->iadd) != 0x4) ;4729revInfo = GET_UINT32(p_Iram->idata);4730p_RevisionInfo->packageRev = (uint16_t)((revInfo & 0xFFFF0000) >> 16);4731p_RevisionInfo->majorRev = (uint8_t)((revInfo & 0x0000FF00) >> 8);4732p_RevisionInfo->minorRev = (uint8_t)(revInfo & 0x000000FF);47334734return E_OK;4735}47364737uint32_t FM_GetCounter(t_Handle h_Fm, e_FmCounters counter)4738{4739t_Fm *p_Fm = (t_Fm*)h_Fm;4740t_Error err;4741uint32_t counterValue;4742struct fman_rg fman_rg;4743enum fman_counters fsl_counter;47444745SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, 0);4746SANITY_CHECK_RETURN_VALUE(!p_Fm->p_FmDriverParam, E_INVALID_STATE, 0);47474748fman_rg.bmi_rg = p_Fm->p_FmBmiRegs;4749fman_rg.qmi_rg = p_Fm->p_FmQmiRegs;4750fman_rg.fpm_rg = p_Fm->p_FmFpmRegs;4751fman_rg.dma_rg = p_Fm->p_FmDmaRegs;47524753if ((p_Fm->guestId != NCSW_MASTER_ID) &&4754!p_Fm->baseAddr &&4755p_Fm->h_IpcSessions[0])4756{4757t_FmIpcMsg msg;4758t_FmIpcReply reply;4759uint32_t replyLength, outCounter;47604761memset(&msg, 0, sizeof(msg));4762memset(&reply, 0, sizeof(reply));4763msg.msgId = FM_GET_COUNTER;4764memcpy(msg.msgBody, (uint8_t *)&counter, sizeof(uint32_t));4765replyLength = sizeof(uint32_t) + sizeof(uint32_t);4766err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],4767(uint8_t*)&msg,4768sizeof(msg.msgId) +sizeof(counterValue),4769(uint8_t*)&reply,4770&replyLength,4771NULL,4772NULL);4773if (err != E_OK)4774{4775REPORT_ERROR(MAJOR, err, NO_MSG);4776return 0;4777}4778if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t)))4779{4780REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));4781return 0;4782}47834784memcpy((uint8_t*)&outCounter, reply.replyBody, sizeof(uint32_t));4785return outCounter;4786}4787else if (!p_Fm->baseAddr)4788{4789REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Either IPC or 'baseAddress' is required!"));4790return 0;4791}47924793/* When applicable (when there is an 'enable counters' bit,4794check that counters are enabled */4795switch (counter)4796{4797case (e_FM_COUNTERS_DEQ_1):4798case (e_FM_COUNTERS_DEQ_2):4799case (e_FM_COUNTERS_DEQ_3):4800if ((p_Fm->p_FmStateStruct->revInfo.majorRev == 4) ||4801(p_Fm->p_FmStateStruct->revInfo.majorRev >= 6))4802{4803REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Requested counter not supported"));4804return 0;4805}4806case (e_FM_COUNTERS_ENQ_TOTAL_FRAME):4807case (e_FM_COUNTERS_DEQ_TOTAL_FRAME):4808case (e_FM_COUNTERS_DEQ_0):4809case (e_FM_COUNTERS_DEQ_FROM_DEFAULT):4810case (e_FM_COUNTERS_DEQ_FROM_CONTEXT):4811case (e_FM_COUNTERS_DEQ_FROM_FD):4812case (e_FM_COUNTERS_DEQ_CONFIRM):4813if (!(GET_UINT32(p_Fm->p_FmQmiRegs->fmqm_gc) & QMI_CFG_EN_COUNTERS))4814{4815REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Requested counter was not enabled"));4816return 0;4817}4818break;4819default:4820break;4821}48224823FMAN_COUNTERS_TRANS(fsl_counter, counter);4824return fman_get_counter(&fman_rg, fsl_counter);4825}48264827t_Error FM_ModifyCounter(t_Handle h_Fm, e_FmCounters counter, uint32_t val)4828{4829t_Fm *p_Fm = (t_Fm*)h_Fm;4830struct fman_rg fman_rg;4831enum fman_counters fsl_counter;48324833SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4834SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);48354836fman_rg.bmi_rg = p_Fm->p_FmBmiRegs;4837fman_rg.qmi_rg = p_Fm->p_FmQmiRegs;4838fman_rg.fpm_rg = p_Fm->p_FmFpmRegs;4839fman_rg.dma_rg = p_Fm->p_FmDmaRegs;48404841FMAN_COUNTERS_TRANS(fsl_counter, counter);4842return (t_Error)fman_modify_counter(&fman_rg, fsl_counter, val);4843}48444845void FM_SetDmaEmergency(t_Handle h_Fm, e_FmDmaMuramPort muramPort, bool enable)4846{4847t_Fm *p_Fm = (t_Fm*)h_Fm;4848struct fman_dma_regs *dma_rg;48494850SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE);4851SANITY_CHECK_RETURN(!p_Fm->p_FmDriverParam, E_INVALID_STATE);48524853dma_rg = p_Fm->p_FmDmaRegs;48544855fman_set_dma_emergency(dma_rg, !!(muramPort==e_FM_DMA_MURAM_PORT_WRITE), enable);4856}48574858void FM_SetDmaExtBusPri(t_Handle h_Fm, e_FmDmaExtBusPri pri)4859{4860t_Fm *p_Fm = (t_Fm*)h_Fm;4861struct fman_dma_regs *dma_rg;48624863SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE);4864SANITY_CHECK_RETURN(!p_Fm->p_FmDriverParam, E_INVALID_STATE);48654866dma_rg = p_Fm->p_FmDmaRegs;48674868fman_set_dma_ext_bus_pri(dma_rg, pri);4869}48704871void FM_GetDmaStatus(t_Handle h_Fm, t_FmDmaStatus *p_FmDmaStatus)4872{4873t_Fm *p_Fm = (t_Fm*)h_Fm;4874uint32_t dmaStatus;4875struct fman_dma_regs *dma_rg;48764877SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE);4878SANITY_CHECK_RETURN(!p_Fm->p_FmDriverParam, E_INVALID_STATE);48794880dma_rg = p_Fm->p_FmDmaRegs;48814882if ((p_Fm->guestId != NCSW_MASTER_ID) &&4883!p_Fm->baseAddr &&4884p_Fm->h_IpcSessions[0])4885{4886t_FmIpcDmaStatus ipcDmaStatus;4887t_FmIpcMsg msg;4888t_FmIpcReply reply;4889t_Error err;4890uint32_t replyLength;48914892memset(&msg, 0, sizeof(msg));4893memset(&reply, 0, sizeof(reply));4894msg.msgId = FM_DMA_STAT;4895replyLength = sizeof(uint32_t) + sizeof(t_FmIpcDmaStatus);4896err = XX_IpcSendMessage(p_Fm->h_IpcSessions[0],4897(uint8_t*)&msg,4898sizeof(msg.msgId),4899(uint8_t*)&reply,4900&replyLength,4901NULL,4902NULL);4903if (err != E_OK)4904{4905REPORT_ERROR(MINOR, err, NO_MSG);4906return;4907}4908if (replyLength != (sizeof(uint32_t) + sizeof(t_FmIpcDmaStatus)))4909{4910REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));4911return;4912}4913memcpy((uint8_t*)&ipcDmaStatus, reply.replyBody, sizeof(t_FmIpcDmaStatus));49144915p_FmDmaStatus->cmqNotEmpty = (bool)ipcDmaStatus.boolCmqNotEmpty; /**< Command queue is not empty */4916p_FmDmaStatus->busError = (bool)ipcDmaStatus.boolBusError; /**< Bus error occurred */4917p_FmDmaStatus->readBufEccError = (bool)ipcDmaStatus.boolReadBufEccError; /**< Double ECC error on buffer Read */4918p_FmDmaStatus->writeBufEccSysError =(bool)ipcDmaStatus.boolWriteBufEccSysError; /**< Double ECC error on buffer write from system side */4919p_FmDmaStatus->writeBufEccFmError = (bool)ipcDmaStatus.boolWriteBufEccFmError; /**< Double ECC error on buffer write from FM side */4920p_FmDmaStatus->singlePortEccError = (bool)ipcDmaStatus.boolSinglePortEccError; /**< Double ECC error on buffer write from FM side */4921return;4922}4923else if (!p_Fm->baseAddr)4924{4925REPORT_ERROR(MINOR, E_NOT_SUPPORTED,4926("Either IPC or 'baseAddress' is required!"));4927return;4928}49294930dmaStatus = fman_get_dma_status(dma_rg);49314932p_FmDmaStatus->cmqNotEmpty = (bool)(dmaStatus & DMA_STATUS_CMD_QUEUE_NOT_EMPTY);4933p_FmDmaStatus->busError = (bool)(dmaStatus & DMA_STATUS_BUS_ERR);4934if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)4935p_FmDmaStatus->singlePortEccError = (bool)(dmaStatus & DMA_STATUS_FM_SPDAT_ECC);4936else4937{4938p_FmDmaStatus->readBufEccError = (bool)(dmaStatus & DMA_STATUS_READ_ECC);4939p_FmDmaStatus->writeBufEccSysError = (bool)(dmaStatus & DMA_STATUS_SYSTEM_WRITE_ECC);4940p_FmDmaStatus->writeBufEccFmError = (bool)(dmaStatus & DMA_STATUS_FM_WRITE_ECC);4941}4942}49434944void FM_Resume(t_Handle h_Fm)4945{4946t_Fm *p_Fm = (t_Fm*)h_Fm;4947struct fman_fpm_regs *fpm_rg;49484949SANITY_CHECK_RETURN(p_Fm, E_INVALID_HANDLE);4950SANITY_CHECK_RETURN(!p_Fm->p_FmDriverParam, E_INVALID_STATE);4951SANITY_CHECK_RETURN((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);49524953fpm_rg = p_Fm->p_FmFpmRegs;49544955fman_resume(fpm_rg);4956}49574958t_Error FM_GetSpecialOperationCoding(t_Handle h_Fm,4959fmSpecialOperations_t spOper,4960uint8_t *p_SpOperCoding)4961{4962t_Fm *p_Fm = (t_Fm*)h_Fm;4963t_FmCtrlCodeRevisionInfo revInfo;4964t_Error err;49654966SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);4967SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);4968SANITY_CHECK_RETURN_ERROR(p_SpOperCoding, E_NULL_POINTER);49694970if (!spOper)4971{4972*p_SpOperCoding = 0;4973return E_OK;4974}49754976if ((err = FM_GetFmanCtrlCodeRevision(p_Fm, &revInfo)) != E_OK)4977{4978DBG(WARNING, ("FM in guest-mode without IPC, can't validate firmware revision."));4979revInfo.packageRev = IP_OFFLOAD_PACKAGE_NUMBER;4980}4981else if (!IS_OFFLOAD_PACKAGE(revInfo.packageRev))4982RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("Fman ctrl code package"));49834984switch (spOper)4985{4986case (FM_SP_OP_CAPWAP_DTLS_DEC):4987*p_SpOperCoding = 9;4988break;4989case (FM_SP_OP_CAPWAP_DTLS_ENC):4990*p_SpOperCoding = 10;4991break;4992case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_UPDATE_UDP_LEN|FM_SP_OP_IPSEC_MANIP):4993case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_UPDATE_UDP_LEN|FM_SP_OP_IPSEC_MANIP|FM_SP_OP_RPD):4994*p_SpOperCoding = 5;4995break;4996case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_MANIP):4997case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_MANIP|FM_SP_OP_RPD):4998*p_SpOperCoding = 6;4999break;5000case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_UPDATE_UDP_LEN|FM_SP_OP_RPD):5001*p_SpOperCoding = 3;5002break;5003case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_UPDATE_UDP_LEN):5004*p_SpOperCoding = 1;5005break;5006case (FM_SP_OP_IPSEC|FM_SP_OP_IPSEC_UPDATE_UDP_LEN|FM_SP_OP_IPSEC_NO_ETH_HDR):5007*p_SpOperCoding = 12;5008break;5009case (FM_SP_OP_IPSEC|FM_SP_OP_RPD):5010*p_SpOperCoding = 4;5011break;5012case (FM_SP_OP_IPSEC):5013*p_SpOperCoding = 2;5014break;5015case (FM_SP_OP_DCL4C):5016*p_SpOperCoding = 7;5017break;5018case (FM_SP_OP_CLEAR_RPD):5019*p_SpOperCoding = 8;5020break;5021default:5022RETURN_ERROR(MINOR, E_INVALID_VALUE, NO_MSG);5023}50245025return E_OK;5026}50275028t_Error FM_CtrlMonStart(t_Handle h_Fm)5029{5030t_Fm *p_Fm = (t_Fm *)h_Fm;5031t_FmTrbRegs *p_MonRegs;5032uint8_t i;50335034SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);5035SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);5036SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);50375038WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc,5039GET_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc) | FPM_BRKC_RDBG);50405041for (i = 0; i < FM_NUM_OF_CTRL; i++)5042{5043p_MonRegs = (t_FmTrbRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_TRB(i));50445045/* Reset control registers */5046WRITE_UINT32(p_MonRegs->tcrh, TRB_TCRH_RESET);5047WRITE_UINT32(p_MonRegs->tcrl, TRB_TCRL_RESET);50485049/* Configure: counter #1 counts all stalls in risc - ldsched stall5050counter #2 counts all stalls in risc - other stall*/5051WRITE_UINT32(p_MonRegs->tcrl, TRB_TCRL_RESET | TRB_TCRL_UTIL);50525053/* Enable monitoring */5054WRITE_UINT32(p_MonRegs->tcrh, TRB_TCRH_ENABLE_COUNTERS);5055}50565057return E_OK;5058}50595060t_Error FM_CtrlMonStop(t_Handle h_Fm)5061{5062t_Fm *p_Fm = (t_Fm *)h_Fm;5063t_FmTrbRegs *p_MonRegs;5064uint8_t i;50655066SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);5067SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);5068SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);50695070for (i = 0; i < FM_NUM_OF_CTRL; i++)5071{5072p_MonRegs = (t_FmTrbRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_TRB(i));5073WRITE_UINT32(p_MonRegs->tcrh, TRB_TCRH_DISABLE_COUNTERS);5074}50755076WRITE_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc,5077GET_UINT32(p_Fm->p_FmFpmRegs->fmfp_brkc) & ~FPM_BRKC_RDBG);50785079return E_OK;5080}50815082t_Error FM_CtrlMonGetCounters(t_Handle h_Fm, uint8_t fmCtrlIndex, t_FmCtrlMon *p_Mon)5083{5084t_Fm *p_Fm = (t_Fm *)h_Fm;5085t_FmTrbRegs *p_MonRegs;5086uint64_t clkCnt, utilValue, effValue;50875088SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);5089SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);5090SANITY_CHECK_RETURN_ERROR((p_Fm->guestId == NCSW_MASTER_ID), E_NOT_SUPPORTED);5091SANITY_CHECK_RETURN_ERROR(p_Mon, E_NULL_POINTER);50925093if (fmCtrlIndex >= FM_NUM_OF_CTRL)5094RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("FM Controller index"));50955096p_MonRegs = (t_FmTrbRegs *)UINT_TO_PTR(p_Fm->baseAddr + FM_MM_TRB(fmCtrlIndex));50975098clkCnt = (uint64_t)5099((uint64_t)GET_UINT32(p_MonRegs->tpcch) << 32 | GET_UINT32(p_MonRegs->tpccl));51005101utilValue = (uint64_t)5102((uint64_t)GET_UINT32(p_MonRegs->tpc1h) << 32 | GET_UINT32(p_MonRegs->tpc1l));51035104effValue = (uint64_t)5105((uint64_t)GET_UINT32(p_MonRegs->tpc2h) << 32 | GET_UINT32(p_MonRegs->tpc2l));51065107p_Mon->percentCnt[0] = (uint8_t)(((clkCnt - utilValue) * 100) / clkCnt);5108if (clkCnt != utilValue)5109p_Mon->percentCnt[1] = (uint8_t)((((clkCnt - utilValue) - effValue) * 100) / (clkCnt - utilValue));5110else5111p_Mon->percentCnt[1] = 0;51125113return E_OK;5114}51155116t_Handle FM_GetMuramHandle(t_Handle h_Fm)5117{5118t_Fm *p_Fm = (t_Fm*)h_Fm;51195120SANITY_CHECK_RETURN_VALUE(p_Fm, E_INVALID_HANDLE, NULL);51215122return (p_Fm->h_FmMuram);5123}51245125/****************************************************/5126/* Hidden-DEBUG Only API */5127/****************************************************/5128t_Error FM_ForceIntr (t_Handle h_Fm, e_FmExceptions exception)5129{5130t_Fm *p_Fm = (t_Fm*)h_Fm;5131enum fman_exceptions fslException;5132struct fman_rg fman_rg;51335134SANITY_CHECK_RETURN_ERROR(p_Fm, E_INVALID_HANDLE);5135SANITY_CHECK_RETURN_ERROR(!p_Fm->p_FmDriverParam, E_INVALID_STATE);51365137fman_rg.bmi_rg = p_Fm->p_FmBmiRegs;5138fman_rg.qmi_rg = p_Fm->p_FmQmiRegs;5139fman_rg.fpm_rg = p_Fm->p_FmFpmRegs;5140fman_rg.dma_rg = p_Fm->p_FmDmaRegs;51415142switch (exception)5143{5144case e_FM_EX_QMI_DEQ_FROM_UNKNOWN_PORTID:5145if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_QMI_DEQ_FROM_UNKNOWN_PORTID))5146RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));5147break;5148case e_FM_EX_QMI_SINGLE_ECC:5149if (p_Fm->p_FmStateStruct->revInfo.majorRev >= 6)5150RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("e_FM_EX_QMI_SINGLE_ECC not supported on this integration."));51515152if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_QMI_SINGLE_ECC))5153RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));5154break;5155case e_FM_EX_QMI_DOUBLE_ECC:5156if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_QMI_DOUBLE_ECC))5157RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));5158break;5159case e_FM_EX_BMI_LIST_RAM_ECC:5160if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_BMI_LIST_RAM_ECC))5161RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));5162break;5163case e_FM_EX_BMI_STORAGE_PROFILE_ECC:5164if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_BMI_STORAGE_PROFILE_ECC))5165RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));5166break;5167case e_FM_EX_BMI_STATISTICS_RAM_ECC:5168if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_BMI_STATISTICS_RAM_ECC))5169RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));5170break;5171case e_FM_EX_BMI_DISPATCH_RAM_ECC:5172if (!(p_Fm->p_FmStateStruct->exceptions & FM_EX_BMI_DISPATCH_RAM_ECC))5173RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));5174break;5175default:5176RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception may not be forced"));5177}51785179fslException = FmanExceptionTrans(exception);5180fman_force_intr (&fman_rg, fslException);51815182return E_OK;5183}51845185t_Handle FmGetPcd(t_Handle h_Fm)5186{5187return ((t_Fm*)h_Fm)->h_Pcd;5188}5189#if (DPAA_VERSION >= 11)5190extern void *g_MemacRegs;5191void fm_clk_down(void);5192uint32_t fman_memac_get_event(void *regs, uint32_t ev_mask);5193void FM_ChangeClock(t_Handle h_Fm, int hardwarePortId)5194{5195int macId;5196uint32_t event, rcr;5197t_Fm *p_Fm = (t_Fm*)h_Fm;5198rcr = GET_UINT32(p_Fm->p_FmFpmRegs->fm_rcr);5199rcr |= 0x04000000;5200WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_rcr, rcr);52015202HW_PORT_ID_TO_SW_PORT_ID(macId, hardwarePortId);5203do5204{5205event = fman_memac_get_event(g_MemacRegs, 0xFFFFFFFF);5206} while ((event & 0x00000020) == 0);5207fm_clk_down();5208rcr = GET_UINT32(p_Fm->p_FmFpmRegs->fm_rcr);5209rcr &= ~0x04000000;5210WRITE_UINT32(p_Fm->p_FmFpmRegs->fm_rcr, rcr);5211}5212#endif521352145215