Path: blob/main/sys/contrib/ncsw/Peripherals/QM/qm.c
48378 views
/******************************************************************************12� 1995-2003, 2004, 2005-2011 Freescale Semiconductor, Inc.3All rights reserved.45This is proprietary source code of Freescale Semiconductor Inc.,6and its use is subject to the NetComm Device Drivers EULA.7The copyright notice above does not evidence any actual or intended8publication of such source code.910ALTERNATIVELY, redistribution and use in source and binary forms, with11or without modification, are permitted provided that the following12conditions are met:13* Redistributions of source code must retain the above copyright14notice, this list of conditions and the following disclaimer.15* Redistributions in binary form must reproduce the above copyright16notice, this list of conditions and the following disclaimer in the17documentation and/or other materials provided with the distribution.18* Neither the name of Freescale Semiconductor nor the19names of its contributors may be used to endorse or promote products20derived from this software without specific prior written permission.2122THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY23EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED24WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE25DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY26DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES27(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;28LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND29ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT30(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS31SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.32*3334**************************************************************************/35/******************************************************************************36@File qm.c3738@Description QM & Portal implementation39*//***************************************************************************/4041#include <sys/cdefs.h>42#include <sys/types.h>43#include <machine/atomic.h>44#include "error_ext.h"45#include "std_ext.h"46#include "string_ext.h"47#include "sprint_ext.h"48#include "mm_ext.h"49#include "core_ext.h"50#include "debug_ext.h"5152#include "qm.h"535455static volatile bool blockingFlag = FALSE;56static void QmIpcMsgCompletionCB(t_Handle h_Module,57uint8_t *p_Msg,58uint8_t *p_Reply,59uint32_t replyLength,60t_Error status)61{62SANITY_CHECK_RETURN(h_Module, E_INVALID_HANDLE);6364UNUSED(p_Msg);UNUSED(p_Reply);UNUSED(replyLength);UNUSED(status);UNUSED(h_Module);65blockingFlag = FALSE;66}6768static t_Error QmHandleIpcMsgCB(t_Handle h_Qm,69uint8_t *p_Msg,70uint32_t msgLength,71uint8_t *p_Reply,72uint32_t *p_ReplyLength)73{74t_Qm *p_Qm = (t_Qm*)h_Qm;75t_QmIpcMsg *p_IpcMsg = (t_QmIpcMsg*)p_Msg;76t_QmIpcReply *p_IpcReply = (t_QmIpcReply *)p_Reply;7778SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);79SANITY_CHECK_RETURN_ERROR((msgLength >= sizeof(uint32_t)), E_INVALID_VALUE);8081#ifdef DISABLE_SANITY_CHECKS82UNUSED(msgLength);83#endif /* DISABLE_SANITY_CHECKS */8485ASSERT_COND(p_IpcMsg);8687memset(p_IpcReply, 0, (sizeof(uint8_t) * QM_IPC_MAX_REPLY_SIZE));88*p_ReplyLength = 0;8990switch(p_IpcMsg->msgId)91{92case (QM_MASTER_IS_ALIVE):93*(uint8_t*)p_IpcReply->replyBody = 1;94*p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);95break;96case (QM_FORCE_FQID):97{98t_QmIpcFqidParams ipcFqid;99uint32_t fqid;100101memcpy((uint8_t*)&ipcFqid, p_IpcMsg->msgBody, sizeof(t_QmIpcFqidParams));102fqid = QmFqidGet(p_Qm, ipcFqid.size, 1, TRUE, ipcFqid.fqid);103memcpy(p_IpcReply->replyBody, (uint8_t*)&fqid, sizeof(uint32_t));104*p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);105break;106}107case (QM_PUT_FQID):108{109t_Error err;110t_QmIpcFqidParams ipcFqid;111112memcpy((uint8_t*)&ipcFqid, p_IpcMsg->msgBody, sizeof(t_QmIpcFqidParams));113if ((err = QmFqidPut(p_Qm, ipcFqid.fqid)) != E_OK)114REPORT_ERROR(MINOR, err, NO_MSG);115break;116}117case (QM_GET_COUNTER):118{119t_QmIpcGetCounter ipcCounter;120uint32_t count;121122memcpy((uint8_t*)&ipcCounter, p_IpcMsg->msgBody, sizeof(t_QmIpcGetCounter));123count = QmGetCounter(p_Qm, (e_QmInterModuleCounters)ipcCounter.enumId);124memcpy(p_IpcReply->replyBody, (uint8_t*)&count, sizeof(uint32_t));125*p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);126break;127}128case (QM_GET_SET_PORTAL_PARAMS):129{130t_Error err;131t_QmIpcPortalInitParams ipcPortalInitParams;132t_QmInterModulePortalInitParams portalInitParams;133134memcpy((uint8_t*)&ipcPortalInitParams, p_IpcMsg->msgBody, sizeof(t_QmIpcPortalInitParams));135portalInitParams.portalId = ipcPortalInitParams.portalId;136portalInitParams.stashDestQueue = ipcPortalInitParams.stashDestQueue;137portalInitParams.liodn = ipcPortalInitParams.liodn;138portalInitParams.dqrrLiodn = ipcPortalInitParams.dqrrLiodn;139portalInitParams.fdFqLiodn = ipcPortalInitParams.fdFqLiodn;140if ((err = QmGetSetPortalParams(p_Qm, &portalInitParams)) != E_OK)141REPORT_ERROR(MINOR, err, NO_MSG);142break;143}144case (QM_GET_REVISION):145{146t_QmRevisionInfo revInfo;147t_QmIpcRevisionInfo ipcRevInfo;148149p_IpcReply->error = (uint32_t)QmGetRevision(h_Qm, &revInfo);150ipcRevInfo.majorRev = revInfo.majorRev;151ipcRevInfo.minorRev = revInfo.minorRev;152memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcRevInfo, sizeof(t_QmIpcRevisionInfo));153*p_ReplyLength = sizeof(uint32_t) + sizeof(t_QmIpcRevisionInfo);154break;155}156default:157*p_ReplyLength = 0;158RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("command not found!!!"));159}160return E_OK;161}162163static t_Error CheckQmParameters(t_Qm *p_Qm)164{165if ((p_Qm->p_QmDriverParams->partFqidBase + p_Qm->p_QmDriverParams->partNumOfFqids) > QM_MAX_NUM_OF_FQIDS)166RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("partFqidBase+partNumOfFqids out of range!!!"));167if ((p_Qm->partCgsBase + p_Qm->partNumOfCgs) > QM_MAX_NUM_OF_CGS)168RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("partCgsBase+partNumOfCgs out of range!!!"));169170if (p_Qm->guestId == NCSW_MASTER_ID)171{172uint64_t phyAddr;173174phyAddr = XX_VirtToPhys(UINT_TO_PTR(p_Qm->p_QmDriverParams->swPortalsBaseAddress));175176if (phyAddr & 0x00000000001fffffLL)177RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("swPortalsBaseAddress isn't properly aligned"));178if (!p_Qm->p_QmDriverParams->rtFramesDepth)179RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("rtFramesDepth must be larger than '0'!!!"));180if (p_Qm->p_QmDriverParams->rtFramesDepth > ((16*MEGABYTE)*3))181RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("rtFramesDepth must be equal or smaller than 48MB!!!"));182if (!p_Qm->p_QmDriverParams->totalNumOfFqids)183RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("totalNumOfFqids must be larger than '0'!!!"));184if (p_Qm->p_QmDriverParams->totalNumOfFqids > (16*MEGABYTE))185RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("totalNumOfFqids must be equal or smaller than 16MB!!!"));186if(!p_Qm->f_Exception)187RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Exceptions callback not provided"));188}189190return E_OK;191}192193static t_Error QmInitPfdr(t_Qm *p_Qm, uint32_t pfdr_start, uint32_t num)194{195uint8_t rslt;196uint32_t timeout = 100000;197198ASSERT_COND(p_Qm);199200ASSERT_COND(pfdr_start && !(pfdr_start & 7) && !(num & 7) && num);201202/* Make sure te command interface is 'idle' */203rslt = MCR_get_rslt(GET_UINT32(p_Qm->p_QmRegs->mcr));204if (!MCR_rslt_idle(rslt))205RETURN_ERROR(CRITICAL,E_INVALID_STATE,("QMAN_MCR isn't idle"));206207/* Write the MCR command params then the verb */208WRITE_UINT32(p_Qm->p_QmRegs->mcp0, pfdr_start);209/* TODO: remove this - it's a workaround for a model bug that is210* corrected in more recent versions. We use the workaround until211* everyone has upgraded. */212WRITE_UINT32(p_Qm->p_QmRegs->mcp1, (pfdr_start + num - 16));213WRITE_UINT32(p_Qm->p_QmRegs->mcp1, (pfdr_start + num - 1));214215mb();216WRITE_UINT32(p_Qm->p_QmRegs->mcr, MCR_INIT_PFDR);217218/* Poll for the result */219do {220XX_UDelay(1);221rslt = MCR_get_rslt(GET_UINT32(p_Qm->p_QmRegs->mcr));222} while(!MCR_rslt_idle(rslt) && --timeout);223224if (MCR_rslt_ok(rslt))225return E_OK;226WRITE_UINT32(p_Qm->p_QmRegs->mcr, 0);227if (!timeout)228RETURN_ERROR(MAJOR, E_TIMEOUT, NO_MSG);229if (MCR_rslt_eaccess(rslt))230RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);231if (MCR_rslt_inval(rslt))232RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG);233RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Unexpected result from MCR_INIT_PFDR: %02x\n", rslt));234}235236static __inline__ void QmSetWqScheduling(t_Qm *p_Qm,237e_QmWqClass wqClass,238uint8_t csElev,239uint8_t csw2,240uint8_t csw3,241uint8_t csw4,242uint8_t csw5,243uint8_t csw6,244uint8_t csw7)245{246ASSERT_COND(p_Qm);247248WRITE_UINT32(p_Qm->p_QmRegs->wq_cs_cfg[wqClass],249(uint32_t)(((csElev & 0xff) << 24) |250((csw2 & 0x7) << 20) |251((csw3 & 0x7) << 16) |252((csw4 & 0x7) << 12) |253((csw5 & 0x7) << 8) |254((csw6 & 0x7) << 4) |255(csw7 & 0x7)));256}257258static uint32_t ReserveFqids(t_Qm *p_Qm, uint32_t size, uint32_t alignment, bool force, uint32_t base)259{260uint64_t ans;261uint32_t intFlags;262263intFlags = XX_LockIntrSpinlock(p_Qm->lock);264if (force)265ans = MM_GetForce(p_Qm->h_FqidMm,266(uint64_t)base,267(uint64_t)size,268"QM FQID MEM");269else270ans = MM_Get(p_Qm->h_FqidMm,271(uint64_t)size,272alignment,273"QM FQID MEM");274if (ans == ILLEGAL_BASE)275{276XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);277return (uint32_t)ans;278}279base = (uint32_t)ans;280ans = MM_GetForce(p_Qm->h_RsrvFqidMm,281(uint64_t)base,282(uint64_t)size,283"QM rsrv FQID MEM");284if (ans == ILLEGAL_BASE)285{286MM_Put(p_Qm->h_FqidMm, (uint64_t)base);287XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);288return (uint32_t)ans;289}290XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);291292return (uint32_t)base;293}294295static void FreeInitResources(t_Qm *p_Qm)296{297if (p_Qm->p_FqdBase)298XX_FreeSmart(p_Qm->p_FqdBase);299if (p_Qm->p_PfdrBase)300XX_FreeSmart(p_Qm->p_PfdrBase);301if (p_Qm->h_Session)302XX_IpcFreeSession(p_Qm->h_Session);303if (p_Qm->h_RsrvFqidMm)304MM_Free(p_Qm->h_RsrvFqidMm);305if (p_Qm->h_FqidMm)306MM_Free(p_Qm->h_FqidMm);307}308309310/****************************************/311/* Inter-Module functions */312/****************************************/313314uint32_t QmGetCounter(t_Handle h_Qm, e_QmInterModuleCounters counter)315{316t_Qm *p_Qm = (t_Qm*)h_Qm;317318SANITY_CHECK_RETURN_VALUE(p_Qm, E_INVALID_HANDLE, 0);319SANITY_CHECK_RETURN_VALUE((((p_Qm->guestId == NCSW_MASTER_ID) && p_Qm->p_QmRegs) ||320(p_Qm->guestId != NCSW_MASTER_ID)), E_INVALID_STATE, 0);321322if ((p_Qm->guestId == NCSW_MASTER_ID) ||323(!p_Qm->h_Session && p_Qm->p_QmRegs))324{325switch(counter)326{327case(e_QM_IM_COUNTERS_SFDR_IN_USE):328return GET_UINT32(p_Qm->p_QmRegs->sfdr_in_use);329case(e_QM_IM_COUNTERS_PFDR_IN_USE):330return (p_Qm->numOfPfdr - GET_UINT32(p_Qm->p_QmRegs->pfdr_fpc));331case(e_QM_IM_COUNTERS_PFDR_FREE_POOL):332return (GET_UINT32(p_Qm->p_QmRegs->pfdr_fpc) - GET_UINT32(p_Qm->p_QmRegs->pfdr_cfg));333default:334break;335}336/* should never get here */337ASSERT_COND(FALSE);338}339else if (p_Qm->h_Session)340{341t_QmIpcMsg msg;342t_QmIpcReply reply;343t_QmIpcGetCounter ipcCounter;344uint32_t replyLength, count;345t_Error errCode = E_OK;346347memset(&msg, 0, sizeof(t_QmIpcMsg));348memset(&reply, 0, sizeof(t_QmIpcReply));349ipcCounter.enumId = (uint32_t)counter;350msg.msgId = QM_GET_COUNTER;351memcpy(msg.msgBody, &ipcCounter, sizeof(t_QmIpcGetCounter));352replyLength = sizeof(uint32_t) + sizeof(uint32_t);353if ((errCode = XX_IpcSendMessage(p_Qm->h_Session,354(uint8_t*)&msg,355sizeof(msg.msgId) + sizeof(t_QmIpcGetCounter),356(uint8_t*)&reply,357&replyLength,358NULL,359NULL)) != E_OK)360REPORT_ERROR(MAJOR, errCode, NO_MSG);361if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t)))362REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));363if ((errCode == E_OK) && (replyLength == (sizeof(uint32_t) + sizeof(uint32_t))))364{365memcpy((uint8_t*)&count, reply.replyBody, sizeof(uint32_t));366return count;367}368}369else370REPORT_ERROR(WARNING, E_NOT_SUPPORTED,371("In 'guest', either IPC or 'baseAddress' is required!"));372373return 0;374}375376t_Error QmGetRevision(t_Handle h_Qm, t_QmRevisionInfo *p_QmRevisionInfo)377{378t_Qm *p_Qm = (t_Qm *)h_Qm;379uint32_t tmpReg;380381SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);382SANITY_CHECK_RETURN_ERROR(p_QmRevisionInfo, E_NULL_POINTER);383SANITY_CHECK_RETURN_ERROR((((p_Qm->guestId == NCSW_MASTER_ID) && p_Qm->p_QmRegs) ||384(p_Qm->guestId != NCSW_MASTER_ID)), E_INVALID_STATE);385386if ((p_Qm->guestId == NCSW_MASTER_ID) ||387(!p_Qm->h_Session && p_Qm->p_QmRegs))388{389/* read revision register 1 */390tmpReg = GET_UINT32(p_Qm->p_QmRegs->ip_rev_1);391p_QmRevisionInfo->majorRev = (uint8_t)((tmpReg & REV1_MAJOR_MASK) >> REV1_MAJOR_SHIFT);392p_QmRevisionInfo->minorRev = (uint8_t)((tmpReg & REV1_MINOR_MASK) >> REV1_MINOR_SHIFT);393}394else if (p_Qm->h_Session)395{396t_QmIpcMsg msg;397t_QmIpcReply reply;398t_QmIpcRevisionInfo ipcRevInfo;399uint32_t replyLength;400t_Error errCode = E_OK;401402memset(&msg, 0, sizeof(t_QmIpcMsg));403memset(&reply, 0, sizeof(reply));404msg.msgId = QM_GET_REVISION;405replyLength = sizeof(uint32_t) + sizeof(t_QmIpcRevisionInfo);406if ((errCode = XX_IpcSendMessage(p_Qm->h_Session,407(uint8_t*)&msg,408sizeof(msg.msgId),409(uint8_t*)&reply,410&replyLength,411NULL,412NULL)) != E_OK)413RETURN_ERROR(MAJOR, errCode, NO_MSG);414if (replyLength != (sizeof(uint32_t) + sizeof(t_QmIpcRevisionInfo)))415RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));416417memcpy((uint8_t*)&ipcRevInfo, reply.replyBody, sizeof(t_QmIpcRevisionInfo));418p_QmRevisionInfo->majorRev = ipcRevInfo.majorRev;419p_QmRevisionInfo->minorRev = ipcRevInfo.minorRev;420421return (t_Error)(reply.error);422}423else424RETURN_ERROR(WARNING, E_NOT_SUPPORTED,425("In 'guest', either IPC or 'baseAddress' is required!"));426427return E_OK;428}429430t_Error QmGetSetPortalParams(t_Handle h_Qm, t_QmInterModulePortalInitParams *p_PortalParams)431{432t_Qm *p_Qm = (t_Qm *)h_Qm;433t_QmRevisionInfo revInfo;434uint32_t lioReg,ioReg;435436SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);437SANITY_CHECK_RETURN_ERROR(p_PortalParams, E_NULL_POINTER);438439if (p_Qm->guestId == NCSW_MASTER_ID)440{441QmGetRevision(p_Qm, &revInfo);442443if ((revInfo.majorRev == 1) && (revInfo.minorRev == 0))444{445lioReg = (uint32_t)(p_PortalParams->stashDestQueue << 24) |446(p_PortalParams->liodn << 16) |447(p_PortalParams->dqrrLiodn);448ioReg = (p_PortalParams->fdFqLiodn);449}450else451{452lioReg = (uint32_t)(p_PortalParams->liodn << 16) |453(p_PortalParams->dqrrLiodn);454ioReg = (uint32_t)(p_PortalParams->stashDestQueue << 16) |455(p_PortalParams->fdFqLiodn);456}457458WRITE_UINT32(p_Qm->p_QmRegs->swpConfRegs[p_PortalParams->portalId].lio_cfg, lioReg);459WRITE_UINT32(p_Qm->p_QmRegs->swpConfRegs[p_PortalParams->portalId].io_cfg, ioReg);460}461else if (p_Qm->h_Session)462{463t_QmIpcMsg msg;464t_QmIpcPortalInitParams portalParams;465t_Error errCode;466467memset(&msg, 0, sizeof(t_QmIpcMsg));468portalParams.portalId = p_PortalParams->portalId;469portalParams.stashDestQueue = p_PortalParams->stashDestQueue;470portalParams.liodn = p_PortalParams->liodn;471portalParams.dqrrLiodn = p_PortalParams->dqrrLiodn;472portalParams.fdFqLiodn = p_PortalParams->fdFqLiodn;473msg.msgId = QM_GET_SET_PORTAL_PARAMS;474memcpy(msg.msgBody, &portalParams, sizeof(t_QmIpcPortalInitParams));475XX_LockSpinlock(p_Qm->lock);476if ((errCode = XX_IpcSendMessage(p_Qm->h_Session,477(uint8_t*)&msg,478sizeof(msg.msgId) + sizeof(t_QmIpcPortalInitParams),479NULL,480NULL,481NULL,482NULL)) != E_OK)483{484XX_UnlockSpinlock(p_Qm->lock);485RETURN_ERROR(MAJOR, errCode, NO_MSG);486}487XX_UnlockSpinlock(p_Qm->lock);488}489else490DBG(WARNING, ("Can't set portal parameters (e.g. liodns). " \491"probably QM is running in guest-mode with no IPC!"));492493return E_OK;494}495496uint32_t QmFqidGet(t_Qm *p_Qm, uint32_t size, uint32_t alignment, bool force, uint32_t base)497{498uint64_t ans;499uint32_t intFlags;500501intFlags = XX_LockIntrSpinlock(p_Qm->lock);502if (force)503{504ans = MM_GetForce(p_Qm->h_FqidMm,505(uint64_t)base,506(uint64_t)size,507"QM FQID MEM");508if (ans == ILLEGAL_BASE)509{510ans = MM_GetForce(p_Qm->h_RsrvFqidMm,511(uint64_t)base,512(uint64_t)size,513"QM rsrv FQID MEM");514if (ans == ILLEGAL_BASE)515ans = base;516else if (p_Qm->h_Session)517{518t_QmIpcMsg msg;519t_QmIpcReply reply;520uint32_t replyLength;521t_QmIpcFqidParams ipcFqid;522t_Error errCode = E_OK;523524memset(&msg, 0, sizeof(t_QmIpcMsg));525memset(&reply, 0, sizeof(t_QmIpcReply));526ipcFqid.fqid = base;527ipcFqid.size = size;528msg.msgId = QM_FORCE_FQID;529memcpy(msg.msgBody, &ipcFqid, sizeof(t_QmIpcFqidParams));530replyLength = sizeof(uint32_t) + sizeof(uint32_t);531if ((errCode = XX_IpcSendMessage(p_Qm->h_Session,532(uint8_t*)&msg,533sizeof(msg.msgId) + sizeof(t_QmIpcFqidParams),534(uint8_t*)&reply,535&replyLength,536NULL,537NULL)) != E_OK)538REPORT_ERROR(MAJOR, errCode, NO_MSG);539if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t)))540REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));541542if ((errCode != E_OK) ||543(replyLength != (sizeof(uint32_t) + sizeof(uint32_t))))544ans = ILLEGAL_BASE;545else546memcpy((uint8_t*)&ans, reply.replyBody, sizeof(uint32_t));547}548else549{550DBG(WARNING, ("No Ipc - can't validate fqid."));551ans = base;552}553}554}555else556ans = MM_Get(p_Qm->h_FqidMm,557size,558alignment,559"QM FQID MEM");560XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);561562KASSERT(ans < UINT32_MAX, ("Oops, %jx > UINT32_MAX!\n", (uintmax_t)ans));563return (uint32_t)ans;564}565566t_Error QmFqidPut(t_Qm *p_Qm, uint32_t base)567{568uint32_t intFlags;569570intFlags = XX_LockIntrSpinlock(p_Qm->lock);571/* Check maybe this fqid was reserved in the past */572if (MM_GetForce(p_Qm->h_RsrvFqidMm,573(uint64_t)base,574(uint64_t)1,575"QM rsrv FQID MEM") == ILLEGAL_BASE)576{577XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);578return E_OK;579}580else581MM_PutForce(p_Qm->h_RsrvFqidMm,582(uint64_t)base,583(uint64_t)1);584if (MM_InRange(p_Qm->h_FqidMm, (uint64_t)base))585{586if (MM_Put(p_Qm->h_FqidMm, (uint64_t)base) != 0)587{588XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);589return E_OK;590}591else592{593XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);594return ERROR_CODE(E_NOT_FOUND);595}596}597else if (p_Qm->h_Session)598{599t_QmIpcMsg msg;600t_QmIpcFqidParams ipcFqid;601t_Error errCode = E_OK;602603memset(&msg, 0, sizeof(t_QmIpcMsg));604ipcFqid.fqid = (uint8_t)base;605ipcFqid.size = 0;606msg.msgId = QM_PUT_FQID;607memcpy(msg.msgBody, &ipcFqid, sizeof(t_QmIpcFqidParams));608if ((errCode = XX_IpcSendMessage(p_Qm->h_Session,609(uint8_t*)&msg,610sizeof(msg.msgId) + sizeof(t_QmIpcFqidParams),611NULL,612NULL,613NULL,614NULL)) != E_OK)615{616XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);617RETURN_ERROR(MAJOR, errCode, NO_MSG);618}619}620else621DBG(WARNING, ("No Ipc - can't validate fqid."));622XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);623624return E_OK;625}626627t_Error QmGetCgId(t_Handle h_Qm, uint8_t *p_CgId)628{629t_Qm *p_Qm = (t_Qm *)h_Qm;630uint16_t i;631632for(i = p_Qm->partCgsBase;i<p_Qm->partCgsBase+p_Qm->partNumOfCgs;i++)633if (!p_Qm->cgsUsed[i])634{635p_Qm->cgsUsed[i] = (uint8_t)TRUE;636*p_CgId = (uint8_t)i;637break;638}639if(i == (p_Qm->partCgsBase+p_Qm->partNumOfCgs))640RETURN_ERROR(MINOR, E_BUSY, ("No available CG"));641else642return E_OK;643}644645t_Error QmFreeCgId(t_Handle h_Qm, uint8_t cgId)646{647t_Qm *p_Qm = (t_Qm *)h_Qm;648649if (!p_Qm->cgsUsed[cgId])650RETURN_ERROR(MINOR, E_INVALID_STATE, ("CG is not in use"));651else652p_Qm->cgsUsed[cgId] = (uint8_t)FALSE;653654return E_OK;655}656657658/****************************************/659/* API Init unit functions */660/****************************************/661662t_Handle QM_Config(t_QmParam *p_QmParam)663{664t_Qm *p_Qm;665uint8_t i;666667SANITY_CHECK_RETURN_VALUE(p_QmParam, E_INVALID_HANDLE, NULL);668669p_Qm = (t_Qm *)XX_Malloc(sizeof(t_Qm));670if (!p_Qm)671{672REPORT_ERROR(MAJOR, E_NO_MEMORY, ("QM obj!!!"));673return NULL;674}675memset(p_Qm, 0, sizeof(t_Qm));676p_Qm->p_QmDriverParams = (t_QmDriverParams *)XX_Malloc(sizeof(t_QmDriverParams));677if (!p_Qm->p_QmDriverParams)678{679XX_Free(p_Qm);680REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Qm driver parameters"));681return NULL;682}683memset(p_Qm->p_QmDriverParams, 0, sizeof(t_QmDriverParams));684685p_Qm->guestId = p_QmParam->guestId;686p_Qm->p_QmDriverParams->partFqidBase = p_QmParam->partFqidBase;687p_Qm->p_QmDriverParams->partNumOfFqids = p_QmParam->partNumOfFqids;688p_Qm->partCgsBase = p_QmParam->partCgsBase;689p_Qm->partNumOfCgs = p_QmParam->partNumOfCgs;690p_Qm->p_QmRegs = (t_QmRegs *)UINT_TO_PTR(p_QmParam->baseAddress);691692if (p_Qm->guestId == NCSW_MASTER_ID)693{694p_Qm->exceptions = DEFAULT_exceptions;695p_Qm->f_Exception = p_QmParam->f_Exception;696p_Qm->h_App = p_QmParam->h_App;697p_Qm->errIrq = p_QmParam->errIrq;698p_Qm->p_QmDriverParams->liodn = p_QmParam->liodn;699p_Qm->p_QmDriverParams->rtFramesDepth = DEFAULT_rtFramesDepth;700p_Qm->p_QmDriverParams->fqdMemPartitionId = p_QmParam->fqdMemPartitionId;701p_Qm->p_QmDriverParams->pfdrMemPartitionId = p_QmParam->pfdrMemPartitionId;702p_Qm->p_QmDriverParams->swPortalsBaseAddress = p_QmParam->swPortalsBaseAddress;703p_Qm->p_QmDriverParams->totalNumOfFqids = p_QmParam->totalNumOfFqids;704p_Qm->p_QmDriverParams->pfdrThreshold = DEFAULT_pfdrThreshold;705p_Qm->p_QmDriverParams->sfdrThreshold = DEFAULT_sfdrThreshold;706p_Qm->p_QmDriverParams->pfdrBaseConstant = DEFAULT_pfdrBaseConstant;707for(i= 0;i<DPAA_MAX_NUM_OF_DC_PORTALS;i++)708p_Qm->p_QmDriverParams->dcPortalsParams[i].sendToSw =709(bool)((i < e_DPAA_DCPORTAL2) ? FALSE : TRUE);710711#ifdef QMAN_SFDR_LEAK_ERRATA_QMAN5712{713#define WORKAROUND_TMP_VAL 0x00000003714t_QmRevisionInfo revInfo;715QmGetRevision(p_Qm, &revInfo);716if ((revInfo.majorRev == 1) && (revInfo.minorRev == 0))717{718uint32_t *tmp = (uint32_t *)UINT_TO_PTR(p_QmParam->baseAddress + 0xbf0);719uint32_t tmpReg = WORKAROUND_TMP_VAL;720WRITE_UINT32(*tmp, tmpReg);721while ((tmpReg = GET_UINT32(*tmp)) != WORKAROUND_TMP_VAL) ;722}723}724#endif /* QMAN_SFDR_LEAK_ERRATA_QMAN5 */725}726727/* build the QM partition IPC address */728memset(p_Qm->moduleName, 0, MODULE_NAME_SIZE);729if(Sprint (p_Qm->moduleName, "QM_0_%d",p_Qm->guestId) != (p_Qm->guestId<10 ? 6:7))730{731XX_Free(p_Qm->p_QmDriverParams);732XX_Free(p_Qm);733REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));734return NULL;735}736737return p_Qm;738}739740t_Error QM_Init(t_Handle h_Qm)741{742t_Qm *p_Qm = (t_Qm *)h_Qm;743t_QmDriverParams *p_QmDriverParams;744t_Error err;745746SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);747SANITY_CHECK_RETURN_ERROR(p_Qm->p_QmDriverParams, E_INVALID_HANDLE);748749CHECK_INIT_PARAMETERS(p_Qm, CheckQmParameters);750751p_QmDriverParams = p_Qm->p_QmDriverParams;752753if (p_QmDriverParams->partNumOfFqids)754{755if (MM_Init(&p_Qm->h_FqidMm, p_QmDriverParams->partFqidBase, p_QmDriverParams->partNumOfFqids) != E_OK)756RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("QM-FQIDS-MEM partition!!!"));757if (MM_Init(&p_Qm->h_RsrvFqidMm, p_QmDriverParams->partFqidBase, p_QmDriverParams->partNumOfFqids) != E_OK)758RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("QM-Reserve-FQIDS-MEM partition!!!"));759}760761if (p_Qm->guestId == NCSW_MASTER_ID)762{763uint64_t phyAddr;764t_QmRevisionInfo revInfo;765uint32_t dsSize, exp, i;766767QmGetRevision(p_Qm, &revInfo);768DBG(TRACE, ("Qman ver:%02x,%02x", revInfo.majorRev, revInfo.minorRev));769770phyAddr = XX_VirtToPhys(UINT_TO_PTR(p_QmDriverParams->swPortalsBaseAddress));771WRITE_UINT32(p_Qm->p_QmRegs->qcsp_bare, ((uint32_t)(phyAddr >> 32) & 0x000000ff));772WRITE_UINT32(p_Qm->p_QmRegs->qcsp_bar, (uint32_t)phyAddr);773WRITE_UINT32(p_Qm->p_QmRegs->liodnr, (uint16_t)p_QmDriverParams->liodn);774775/* FQD memory */776dsSize = (uint32_t)(p_QmDriverParams->totalNumOfFqids * FQD_ENTRY_SIZE);777LOG2(dsSize, exp);778if (!POWER_OF_2(dsSize)) (exp++);779dsSize = (uint32_t)(1 << exp);780if (dsSize < (4*KILOBYTE))781{782dsSize = (4*KILOBYTE);783LOG2(dsSize, exp);784}785p_Qm->p_FqdBase = XX_MallocSmart(dsSize, (int)p_QmDriverParams->fqdMemPartitionId, dsSize);786if (!p_Qm->p_FqdBase)787{788RETURN_ERROR(MAJOR, E_NO_MEMORY, ("FQD obj!!!"));789}790memset(p_Qm->p_FqdBase, 0, dsSize);791mb();792for (i=0; i<dsSize; i+=64)793dcbf(PTR_MOVE(p_Qm->p_FqdBase, i));794mb();795796phyAddr = XX_VirtToPhys(p_Qm->p_FqdBase);797WRITE_UINT32(p_Qm->p_QmRegs->fqd_bare, ((uint32_t)(phyAddr >> 32) & 0x000000ff));798WRITE_UINT32(p_Qm->p_QmRegs->fqd_bar, (uint32_t)phyAddr);799WRITE_UINT32(p_Qm->p_QmRegs->fqd_ar, AR_ENABLE | (exp - 1));800801/* PFDR memory */802dsSize = (uint32_t)(p_QmDriverParams->rtFramesDepth * (PFDR_ENTRY_SIZE/3));803LOG2(dsSize, exp);804if (!POWER_OF_2(dsSize)) (exp++);805dsSize = (uint32_t)(1 << exp);806if (dsSize < (4*KILOBYTE))807{808dsSize = (4*KILOBYTE);809LOG2(dsSize, exp);810}811812p_Qm->p_PfdrBase = XX_MallocSmart(dsSize, (int)p_QmDriverParams->pfdrMemPartitionId, dsSize);813if (!p_Qm->p_PfdrBase)814RETURN_ERROR(MAJOR, E_NO_MEMORY, ("PFDR obj!!!"));815816phyAddr = XX_VirtToPhys(p_Qm->p_PfdrBase);817WRITE_UINT32(p_Qm->p_QmRegs->pfdr_bare, ((uint32_t)(phyAddr >> 32) & 0x000000ff));818WRITE_UINT32(p_Qm->p_QmRegs->pfdr_bar, (uint32_t)phyAddr);819WRITE_UINT32(p_Qm->p_QmRegs->pfdr_ar, AR_ENABLE | (exp - 1));820821if (QmInitPfdr(p_Qm, 8, dsSize / 64 - 8) != E_OK)822RETURN_ERROR(MAJOR, E_INVALID_STATE, ("PFDR init failed!!!"));823824/* thresholds */825WRITE_UINT32(p_Qm->p_QmRegs->pfdr_fp_lwit, (p_Qm->p_QmDriverParams->pfdrThreshold & 0xffffff));826WRITE_UINT32(p_Qm->p_QmRegs->pfdr_cfg, p_Qm->p_QmDriverParams->pfdrBaseConstant);827WRITE_UINT32(p_Qm->p_QmRegs->sfdr_cfg, (p_Qm->p_QmDriverParams->sfdrThreshold & 0x3ff));828829p_Qm->numOfPfdr = GET_UINT32(p_Qm->p_QmRegs->pfdr_fpc);830831/* corenet initiator settings */832WRITE_UINT32(p_Qm->p_QmRegs->ci_sched_cfg,833(CI_SCHED_CFG_EN |834(DEFAULT_initiatorSrcciv << CI_SCHED_CFG_SRCCIV_SHIFT) |835(DEFAULT_initiatorSrqW << CI_SCHED_CFG_SRQ_W_SHIFT) |836(DEFAULT_initiatorRwW << CI_SCHED_CFG_RW_W_SHIFT) |837(DEFAULT_initiatorBmanW << CI_SCHED_CFG_BMAN_W_SHIFT)));838839/* HID settings */840if ((revInfo.majorRev == 1) && (revInfo.minorRev == 0))841/* offset 0x0bf0 */842WRITE_UINT32(p_Qm->p_QmRegs->res23[144], 0x3);843else844WRITE_UINT32(p_Qm->p_QmRegs->res23[144], 0x0);845846for(i=0;i<DPAA_MAX_NUM_OF_DC_PORTALS;i++)847{848if(p_Qm->p_QmDriverParams->dcPortalsParams[i].sendToSw)849WRITE_UINT32(p_Qm->p_QmRegs->dcpConfRegs[i].cfg,850p_Qm->p_QmDriverParams->dcPortalsParams[i].swPortalId);851else852WRITE_UINT32(p_Qm->p_QmRegs->dcpConfRegs[i].cfg, QM_DCP_CFG_ED);853}854855#ifdef QMAN_WQ_CS_CFG_ERRATA_QMAN4856{857t_QmRevisionInfo revInfo;858QmGetRevision(p_Qm, &revInfo);859if ((revInfo.majorRev == 1) && (revInfo.minorRev == 0))860{861QmSetWqScheduling(p_Qm, e_QM_WQ_SW_PORTALS,0,1,1,1,1,1,1);862QmSetWqScheduling(p_Qm, e_QM_WQ_POOLS,0,1,1,1,1,1,1);863QmSetWqScheduling(p_Qm, e_QM_WQ_DCP0,0,1,1,1,1,1,1);864QmSetWqScheduling(p_Qm, e_QM_WQ_DCP1,0,1,1,1,1,1,1);865QmSetWqScheduling(p_Qm, e_QM_WQ_DCP2,0,1,1,1,1,1,1);866QmSetWqScheduling(p_Qm, e_QM_WQ_DCP3,0,1,1,1,1,1,1);867}868}869#endif /* QMAN_WQ_CS_CFG_ERRATA_QMAN4 */870871WRITE_UINT32(p_Qm->p_QmRegs->err_isr, p_Qm->exceptions);872WRITE_UINT32(p_Qm->p_QmRegs->err_ier, p_Qm->exceptions);873WRITE_UINT32(p_Qm->p_QmRegs->err_isdr, 0x0);874if (p_Qm->errIrq != NO_IRQ)875{876XX_SetIntr(p_Qm->errIrq, QM_ErrorIsr, p_Qm);877XX_EnableIntr(p_Qm->errIrq);878}879if ((err = XX_IpcRegisterMsgHandler(p_Qm->moduleName, QmHandleIpcMsgCB, p_Qm, QM_IPC_MAX_REPLY_SIZE)) != E_OK)880RETURN_ERROR(MAJOR, err, NO_MSG);881}882else /* guest mode */883{884char masterModuleName[MODULE_NAME_SIZE];885886memset(masterModuleName, 0, MODULE_NAME_SIZE);887if(Sprint (masterModuleName, "QM_0_%d", NCSW_MASTER_ID) != (NCSW_MASTER_ID<10 ? 6:7))888{889RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));890}891892p_Qm->h_Session = XX_IpcInitSession(masterModuleName, p_Qm->moduleName);893if (p_Qm->h_Session)894{895t_QmIpcMsg msg;896uint8_t isMasterAlive = 0;897t_QmIpcReply reply;898uint32_t replyLength;899900memset(&msg, 0, sizeof(t_QmIpcMsg));901memset(&reply, 0, sizeof(t_QmIpcReply));902msg.msgId = QM_MASTER_IS_ALIVE;903do904{905blockingFlag = TRUE;906replyLength = sizeof(uint32_t) + sizeof(uint8_t);907if ((err = XX_IpcSendMessage(p_Qm->h_Session,908(uint8_t*)&msg,909sizeof(msg.msgId),910(uint8_t*)&reply,911&replyLength,912QmIpcMsgCompletionCB,913p_Qm)) != E_OK)914REPORT_ERROR(MAJOR, err, NO_MSG);915while(blockingFlag) ;916if(replyLength != (sizeof(uint32_t) + sizeof(uint8_t)))917REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));918isMasterAlive = *(uint8_t*)(reply.replyBody);919} while (!isMasterAlive);920}921}922923p_Qm->lock = XX_InitSpinlock();924XX_Free(p_Qm->p_QmDriverParams);925p_Qm->p_QmDriverParams = NULL;926927return E_OK;928}929930t_Error QM_Free(t_Handle h_Qm)931{932t_Qm *p_Qm = (t_Qm *)h_Qm;933934SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);935936if (p_Qm->lock)937XX_FreeSpinlock(p_Qm->lock);938939if (p_Qm->guestId == NCSW_MASTER_ID)940{941XX_IpcUnregisterMsgHandler(p_Qm->moduleName);942if (p_Qm->errIrq != NO_IRQ)943{944XX_DisableIntr(p_Qm->errIrq);945XX_FreeIntr(p_Qm->errIrq);946}947}948FreeInitResources(p_Qm);949950if (p_Qm->p_QmDriverParams)951XX_Free(p_Qm->p_QmDriverParams);952953XX_Free(p_Qm);954955return E_OK;956}957958t_Error QM_ConfigRTFramesDepth(t_Handle h_Qm, uint32_t rtFramesDepth)959{960t_Qm *p_Qm = (t_Qm *)h_Qm;961962SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);963SANITY_CHECK_RETURN_ERROR(p_Qm->p_QmDriverParams, E_INVALID_HANDLE);964965p_Qm->p_QmDriverParams->rtFramesDepth = rtFramesDepth;966967return E_OK;968}969970t_Error QM_ConfigPfdrThreshold(t_Handle h_Qm, uint32_t threshold)971{972t_Qm *p_Qm = (t_Qm *)h_Qm;973974SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);975SANITY_CHECK_RETURN_ERROR(p_Qm->p_QmDriverParams, E_INVALID_HANDLE);976977p_Qm->p_QmDriverParams->pfdrThreshold = threshold;978979return E_OK;980}981982t_Error QM_ConfigSfdrReservationThreshold(t_Handle h_Qm, uint32_t threshold)983{984t_Qm *p_Qm = (t_Qm *)h_Qm;985986SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);987SANITY_CHECK_RETURN_ERROR(p_Qm->p_QmDriverParams, E_INVALID_HANDLE);988989p_Qm->p_QmDriverParams->sfdrThreshold = threshold;990991return E_OK;992}993994995t_Error QM_ConfigErrorRejectionNotificationDest(t_Handle h_Qm, e_DpaaDcPortal id, t_QmDcPortalParams *p_Params)996{997UNUSED(h_Qm); UNUSED(id); UNUSED(p_Params);998999RETURN_ERROR(INFO, E_NOT_SUPPORTED, ("Only default ERN destination available."));1000}100110021003t_Error QM_Poll(t_Handle h_Qm, e_QmPortalPollSource source)1004{1005t_Qm *p_Qm = (t_Qm *)h_Qm;1006t_QmPortal *p_QmPortal;10071008SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);1009p_QmPortal = QmGetPortalHandle(p_Qm);1010SANITY_CHECK_RETURN_ERROR(p_QmPortal, E_INVALID_HANDLE);10111012return QM_PORTAL_Poll(p_QmPortal, source);1013}10141015uint32_t QM_GetCounter(t_Handle h_Qm, e_QmCounters counter)1016{1017t_Qm *p_Qm = (t_Qm *)h_Qm;10181019SANITY_CHECK_RETURN_VALUE(p_Qm, E_INVALID_HANDLE, 0);1020SANITY_CHECK_RETURN_VALUE(!p_Qm->p_QmDriverParams, E_INVALID_STATE, 0);10211022switch(counter)1023{1024case(e_QM_COUNTERS_SFDR_IN_USE):1025return QmGetCounter(p_Qm, e_QM_IM_COUNTERS_SFDR_IN_USE);1026case(e_QM_COUNTERS_PFDR_IN_USE):1027return QmGetCounter(p_Qm, e_QM_IM_COUNTERS_PFDR_IN_USE);1028case(e_QM_COUNTERS_PFDR_FREE_POOL):1029return QmGetCounter(p_Qm, e_QM_IM_COUNTERS_PFDR_FREE_POOL);1030default:1031break;1032}1033/* should never get here */1034ASSERT_COND(FALSE);10351036return 0;1037}10381039void QM_ErrorIsr(t_Handle h_Qm)1040{1041t_Qm *p_Qm = (t_Qm *)h_Qm;1042uint32_t tmpReg;10431044SANITY_CHECK_RETURN(p_Qm, E_INVALID_HANDLE);10451046if (p_Qm->guestId != NCSW_MASTER_ID)1047{1048REPORT_ERROR(WARNING, E_INVALID_OPERATION, ("Master Only"));1049return;1050}10511052tmpReg = GET_UINT32(p_Qm->p_QmRegs->err_isr);1053tmpReg &= GET_UINT32(p_Qm->p_QmRegs->err_ier);1054WRITE_UINT32(p_Qm->p_QmRegs->err_isr, tmpReg);10551056if (tmpReg & QM_EX_CORENET_INITIATOR_DATA)1057p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_CORENET_INITIATOR_DATA);1058if (tmpReg & QM_EX_CORENET_TARGET_DATA)1059p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_CORENET_TARGET_DATA);1060if (tmpReg & QM_EX_CORENET_INVALID_TARGET_TRANSACTION)1061p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_CORENET_INVALID_TARGET_TRANSACTION);1062if (tmpReg & QM_EX_PFDR_THRESHOLD)1063p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_PFDR_THRESHOLD);1064if (tmpReg & QM_EX_MULTI_ECC)1065p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_MULTI_ECC);1066if (tmpReg & QM_EX_SINGLE_ECC)1067p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_SINGLE_ECC);1068if (tmpReg & QM_EX_PFDR_ENQUEUE_BLOCKED)1069p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_PFDR_ENQUEUE_BLOCKED);1070if (tmpReg & QM_EX_INVALID_COMMAND)1071p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_INVALID_COMMAND);1072if (tmpReg & QM_EX_DEQUEUE_DCP)1073p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_DEQUEUE_DCP);1074if (tmpReg & QM_EX_DEQUEUE_FQ)1075p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_DEQUEUE_FQ);1076if (tmpReg & QM_EX_DEQUEUE_SOURCE)1077p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_DEQUEUE_SOURCE);1078if (tmpReg & QM_EX_DEQUEUE_QUEUE)1079p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_DEQUEUE_QUEUE);1080if (tmpReg & QM_EX_ENQUEUE_OVERFLOW)1081p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_ENQUEUE_OVERFLOW);1082if (tmpReg & QM_EX_ENQUEUE_STATE)1083p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_ENQUEUE_STATE);1084if (tmpReg & QM_EX_ENQUEUE_CHANNEL)1085p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_ENQUEUE_CHANNEL);1086if (tmpReg & QM_EX_ENQUEUE_QUEUE)1087p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_ENQUEUE_QUEUE);1088}10891090t_Error QM_SetException(t_Handle h_Qm, e_QmExceptions exception, bool enable)1091{1092t_Qm *p_Qm = (t_Qm*)h_Qm;1093t_Error err = E_OK;10941095SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);1096SANITY_CHECK_RETURN_ERROR(!p_Qm->p_QmDriverParams, E_INVALID_HANDLE);10971098if ((err = SetException(p_Qm, exception, enable)) != E_OK)1099RETURN_ERROR(MINOR, err, NO_MSG);11001101WRITE_UINT32(p_Qm->p_QmRegs->err_ier, p_Qm->exceptions);11021103return E_OK;1104}11051106t_Error QM_GetRevision(t_Handle h_Qm, t_QmRevisionInfo *p_QmRevisionInfo)1107{1108t_Qm *p_Qm = (t_Qm*)h_Qm;11091110SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);1111SANITY_CHECK_RETURN_ERROR(p_QmRevisionInfo, E_NULL_POINTER);11121113return QmGetRevision(p_Qm, p_QmRevisionInfo);1114}11151116t_Error QM_ReserveQueues(t_Handle h_Qm, t_QmRsrvFqrParams *p_QmFqrParams, uint32_t *p_BaseFqid)1117{1118t_Qm *p_Qm = (t_Qm*)h_Qm;11191120SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);1121SANITY_CHECK_RETURN_ERROR(!p_Qm->p_QmDriverParams, E_INVALID_HANDLE);11221123*p_BaseFqid = ReserveFqids(p_Qm,1124(uint32_t)((p_QmFqrParams->useForce && !p_QmFqrParams->numOfFqids) ?11251 : p_QmFqrParams->numOfFqids),1126p_QmFqrParams->qs.nonFrcQs.align,1127p_QmFqrParams->useForce,1128p_QmFqrParams->qs.frcQ.fqid);1129if (*p_BaseFqid == ILLEGAL_BASE)1130RETURN_ERROR(CRITICAL,E_INVALID_STATE,("can't allocate a fqid"));11311132return E_OK;1133}11341135t_Error QM_GetErrorInformation(t_Handle h_Qm, t_QmErrorInfo *p_errInfo)1136{1137uint32_t ecsr, ecir;1138t_Qm *p_Qm = (t_Qm*)h_Qm;1139t_Error err = E_OK;11401141SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);1142SANITY_CHECK_RETURN_ERROR(!p_Qm->p_QmDriverParams, E_INVALID_HANDLE);1143SANITY_CHECK_RETURN_ERROR(p_errInfo, E_NULL_POINTER);11441145ecsr = GET_UINT32(p_Qm->p_QmRegs->ecsr);1146ecir = GET_UINT32(p_Qm->p_QmRegs->ecir);1147if ((ecsr & QM_EX_MULTI_ECC) ||1148(ecsr & QM_EX_SINGLE_ECC))1149{1150err = E_NOT_SUPPORTED;1151REPORT_ERROR(INFO, E_NOT_SUPPORTED, ("single and multi ecc, use QM_DumpRegs"));1152}1153if ((ecsr & QM_EX_ENQUEUE_QUEUE) ||1154(ecsr & QM_EX_ENQUEUE_STATE) ||1155(ecsr & QM_EX_ENQUEUE_OVERFLOW) ||1156(ecsr & QM_EX_DEQUEUE_DCP) ||1157(ecsr & QM_EX_DEQUEUE_FQ) ||1158(ecsr & QM_EX_DEQUEUE_QUEUE) ||1159(ecsr & QM_EX_DEQUEUE_SOURCE) ||1160(ecsr & QM_EX_INVALID_COMMAND))1161{1162p_errInfo->portalValid = TRUE;1163p_errInfo->hwPortal = (bool)(ecir & ECIR_PORTAL_TYPE);1164if (p_errInfo->hwPortal)1165p_errInfo->dcpId = (e_DpaaDcPortal)((ecir & ECIR_PORTAL_MASK) >> ECIR_PORTAL_SHIFT);1166else1167p_errInfo->swPortalId = (e_DpaaSwPortal)((ecir & ECIR_PORTAL_MASK) >> ECIR_PORTAL_SHIFT);1168}11691170if ((ecsr & QM_EX_ENQUEUE_QUEUE) ||1171(ecsr & QM_EX_ENQUEUE_STATE) ||1172(ecsr & QM_EX_ENQUEUE_OVERFLOW) ||1173(ecsr & QM_EX_ENQUEUE_CHANNEL) ||1174(ecsr & QM_EX_DEQUEUE_QUEUE) ||1175(ecsr & QM_EX_DEQUEUE_FQ))1176{1177p_errInfo->fqidValid = TRUE;1178p_errInfo->fqid = ((ecir & ECIR_FQID_MASK) >> ECIR_FQID_SHIFT);1179}11801181WRITE_UINT32(p_Qm->p_QmRegs->ecsr, ecsr);11821183return ERROR_CODE(err);1184}11851186#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))1187t_Error QM_DumpRegs(t_Handle h_Qm)1188{1189t_Qm *p_Qm = (t_Qm *)h_Qm;1190uint8_t i = 0;11911192DECLARE_DUMP;11931194SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);1195SANITY_CHECK_RETURN_ERROR(!p_Qm->p_QmDriverParams, E_INVALID_STATE);11961197DUMP_SUBTITLE(("\n"));1198DUMP_TITLE(p_Qm->p_QmRegs, ("QmRegs Regs"));11991200DUMP_SUBSTRUCT_ARRAY(i, QM_NUM_OF_SWP)1201{1202DUMP_VAR(&p_Qm->p_QmRegs->swpConfRegs[i], lio_cfg);1203DUMP_VAR(&p_Qm->p_QmRegs->swpConfRegs[i], io_cfg);1204DUMP_VAR(&p_Qm->p_QmRegs->swpConfRegs[i], dd_cfg);1205}1206DUMP_VAR(p_Qm->p_QmRegs, qman_dd_cfg);1207DUMP_VAR(p_Qm->p_QmRegs, qcsp_dd_ihrsr);1208DUMP_VAR(p_Qm->p_QmRegs, qcsp_dd_ihrfr);1209DUMP_VAR(p_Qm->p_QmRegs, qcsp_dd_hasr);1210DUMP_VAR(p_Qm->p_QmRegs, dcp_dd_ihrsr);1211DUMP_VAR(p_Qm->p_QmRegs, dcp_dd_ihrfr);1212DUMP_VAR(p_Qm->p_QmRegs, dcp_dd_hasr);1213DUMP_SUBSTRUCT_ARRAY(i, QM_NUM_OF_DCP)1214{1215DUMP_VAR(&p_Qm->p_QmRegs->dcpConfRegs[i], cfg);1216DUMP_VAR(&p_Qm->p_QmRegs->dcpConfRegs[i], dd_cfg);1217DUMP_VAR(&p_Qm->p_QmRegs->dcpConfRegs[i], dlm_cfg);1218DUMP_VAR(&p_Qm->p_QmRegs->dcpConfRegs[i], dlm_avg);1219}1220DUMP_VAR(p_Qm->p_QmRegs, pfdr_fpc);1221DUMP_VAR(p_Qm->p_QmRegs, pfdr_fp_head);1222DUMP_VAR(p_Qm->p_QmRegs, pfdr_fp_tail);1223DUMP_VAR(p_Qm->p_QmRegs, pfdr_fp_lwit);1224DUMP_VAR(p_Qm->p_QmRegs, pfdr_cfg);1225DUMP_VAR(p_Qm->p_QmRegs, sfdr_cfg);1226DUMP_VAR(p_Qm->p_QmRegs, sfdr_in_use);1227DUMP_ARR(p_Qm->p_QmRegs, wq_cs_cfg);1228DUMP_VAR(p_Qm->p_QmRegs, wq_def_enq_wqid);1229DUMP_ARR(p_Qm->p_QmRegs, wq_sc_dd_cfg);1230DUMP_ARR(p_Qm->p_QmRegs, wq_pc_dd_cs_cfg);1231DUMP_ARR(p_Qm->p_QmRegs, wq_dc0_dd_cs_cfg);1232DUMP_ARR(p_Qm->p_QmRegs, wq_dc1_dd_cs_cfg);1233DUMP_VAR(p_Qm->p_QmRegs, wq_dc2_dd_cs_cfg);1234DUMP_VAR(p_Qm->p_QmRegs, wq_dc3_dd_cs_cfg);1235DUMP_VAR(p_Qm->p_QmRegs, cm_cfg);1236DUMP_VAR(p_Qm->p_QmRegs, ecsr);1237DUMP_VAR(p_Qm->p_QmRegs, ecir);1238DUMP_VAR(p_Qm->p_QmRegs, eadr);1239DUMP_ARR(p_Qm->p_QmRegs, edata);1240DUMP_VAR(p_Qm->p_QmRegs, sbet);1241DUMP_ARR(p_Qm->p_QmRegs, sbec);1242DUMP_VAR(p_Qm->p_QmRegs, mcr);1243DUMP_VAR(p_Qm->p_QmRegs, mcp0);1244DUMP_VAR(p_Qm->p_QmRegs, mcp1);1245DUMP_ARR(p_Qm->p_QmRegs, mr);1246DUMP_VAR(p_Qm->p_QmRegs, idle_stat);1247DUMP_VAR(p_Qm->p_QmRegs, ip_rev_1);1248DUMP_VAR(p_Qm->p_QmRegs, ip_rev_2);1249DUMP_VAR(p_Qm->p_QmRegs, fqd_bare);1250DUMP_VAR(p_Qm->p_QmRegs, fqd_bar);1251DUMP_VAR(p_Qm->p_QmRegs, fqd_ar);1252DUMP_VAR(p_Qm->p_QmRegs, pfdr_bare);1253DUMP_VAR(p_Qm->p_QmRegs, pfdr_bar);1254DUMP_VAR(p_Qm->p_QmRegs, pfdr_ar);1255DUMP_VAR(p_Qm->p_QmRegs, qcsp_bare);1256DUMP_VAR(p_Qm->p_QmRegs, qcsp_bar);1257DUMP_VAR(p_Qm->p_QmRegs, ci_sched_cfg);1258DUMP_VAR(p_Qm->p_QmRegs, srcidr);1259DUMP_VAR(p_Qm->p_QmRegs, liodnr);1260DUMP_VAR(p_Qm->p_QmRegs, ci_rlm_cfg);1261DUMP_VAR(p_Qm->p_QmRegs, ci_rlm_avg);1262DUMP_VAR(p_Qm->p_QmRegs, err_isr);1263DUMP_VAR(p_Qm->p_QmRegs, err_ier);1264DUMP_VAR(p_Qm->p_QmRegs, err_isdr);1265DUMP_VAR(p_Qm->p_QmRegs, err_iir);1266DUMP_VAR(p_Qm->p_QmRegs, err_her);12671268return E_OK;1269}1270#endif /* (defined(DEBUG_ERRORS) && ... */127112721273