10aeed3e9SJustin Hibbits /******************************************************************************
20aeed3e9SJustin Hibbits
30aeed3e9SJustin Hibbits � 1995-2003, 2004, 2005-2011 Freescale Semiconductor, Inc.
40aeed3e9SJustin Hibbits All rights reserved.
50aeed3e9SJustin Hibbits
60aeed3e9SJustin Hibbits This is proprietary source code of Freescale Semiconductor Inc.,
70aeed3e9SJustin Hibbits and its use is subject to the NetComm Device Drivers EULA.
80aeed3e9SJustin Hibbits The copyright notice above does not evidence any actual or intended
90aeed3e9SJustin Hibbits publication of such source code.
100aeed3e9SJustin Hibbits
110aeed3e9SJustin Hibbits ALTERNATIVELY, redistribution and use in source and binary forms, with
120aeed3e9SJustin Hibbits or without modification, are permitted provided that the following
130aeed3e9SJustin Hibbits conditions are met:
140aeed3e9SJustin Hibbits * Redistributions of source code must retain the above copyright
150aeed3e9SJustin Hibbits notice, this list of conditions and the following disclaimer.
160aeed3e9SJustin Hibbits * Redistributions in binary form must reproduce the above copyright
170aeed3e9SJustin Hibbits notice, this list of conditions and the following disclaimer in the
180aeed3e9SJustin Hibbits documentation and/or other materials provided with the distribution.
190aeed3e9SJustin Hibbits * Neither the name of Freescale Semiconductor nor the
200aeed3e9SJustin Hibbits names of its contributors may be used to endorse or promote products
210aeed3e9SJustin Hibbits derived from this software without specific prior written permission.
220aeed3e9SJustin Hibbits
230aeed3e9SJustin Hibbits THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
240aeed3e9SJustin Hibbits EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
250aeed3e9SJustin Hibbits WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
260aeed3e9SJustin Hibbits DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
270aeed3e9SJustin Hibbits DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
280aeed3e9SJustin Hibbits (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
290aeed3e9SJustin Hibbits LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
300aeed3e9SJustin Hibbits ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
310aeed3e9SJustin Hibbits (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
320aeed3e9SJustin Hibbits SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
330aeed3e9SJustin Hibbits *
340aeed3e9SJustin Hibbits
350aeed3e9SJustin Hibbits **************************************************************************/
360aeed3e9SJustin Hibbits /******************************************************************************
370aeed3e9SJustin Hibbits @File qm.c
380aeed3e9SJustin Hibbits
390aeed3e9SJustin Hibbits @Description QM & Portal implementation
400aeed3e9SJustin Hibbits *//***************************************************************************/
41852ba100SJustin Hibbits
42852ba100SJustin Hibbits #include <sys/cdefs.h>
43852ba100SJustin Hibbits #include <sys/types.h>
44852ba100SJustin Hibbits #include <machine/atomic.h>
450aeed3e9SJustin Hibbits #include "error_ext.h"
460aeed3e9SJustin Hibbits #include "std_ext.h"
470aeed3e9SJustin Hibbits #include "string_ext.h"
480aeed3e9SJustin Hibbits #include "sprint_ext.h"
490aeed3e9SJustin Hibbits #include "mm_ext.h"
500aeed3e9SJustin Hibbits #include "core_ext.h"
510aeed3e9SJustin Hibbits #include "debug_ext.h"
520aeed3e9SJustin Hibbits
530aeed3e9SJustin Hibbits #include "qm.h"
540aeed3e9SJustin Hibbits
550aeed3e9SJustin Hibbits
560aeed3e9SJustin Hibbits static volatile bool blockingFlag = FALSE;
QmIpcMsgCompletionCB(t_Handle h_Module,uint8_t * p_Msg,uint8_t * p_Reply,uint32_t replyLength,t_Error status)570aeed3e9SJustin Hibbits static void QmIpcMsgCompletionCB(t_Handle h_Module,
580aeed3e9SJustin Hibbits uint8_t *p_Msg,
590aeed3e9SJustin Hibbits uint8_t *p_Reply,
600aeed3e9SJustin Hibbits uint32_t replyLength,
610aeed3e9SJustin Hibbits t_Error status)
620aeed3e9SJustin Hibbits {
630aeed3e9SJustin Hibbits SANITY_CHECK_RETURN(h_Module, E_INVALID_HANDLE);
640aeed3e9SJustin Hibbits
650aeed3e9SJustin Hibbits UNUSED(p_Msg);UNUSED(p_Reply);UNUSED(replyLength);UNUSED(status);UNUSED(h_Module);
660aeed3e9SJustin Hibbits blockingFlag = FALSE;
670aeed3e9SJustin Hibbits }
680aeed3e9SJustin Hibbits
QmHandleIpcMsgCB(t_Handle h_Qm,uint8_t * p_Msg,uint32_t msgLength,uint8_t * p_Reply,uint32_t * p_ReplyLength)690aeed3e9SJustin Hibbits static t_Error QmHandleIpcMsgCB(t_Handle h_Qm,
700aeed3e9SJustin Hibbits uint8_t *p_Msg,
710aeed3e9SJustin Hibbits uint32_t msgLength,
720aeed3e9SJustin Hibbits uint8_t *p_Reply,
730aeed3e9SJustin Hibbits uint32_t *p_ReplyLength)
740aeed3e9SJustin Hibbits {
750aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm*)h_Qm;
760aeed3e9SJustin Hibbits t_QmIpcMsg *p_IpcMsg = (t_QmIpcMsg*)p_Msg;
770aeed3e9SJustin Hibbits t_QmIpcReply *p_IpcReply = (t_QmIpcReply *)p_Reply;
780aeed3e9SJustin Hibbits
790aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);
800aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR((msgLength >= sizeof(uint32_t)), E_INVALID_VALUE);
810aeed3e9SJustin Hibbits
820aeed3e9SJustin Hibbits #ifdef DISABLE_SANITY_CHECKS
830aeed3e9SJustin Hibbits UNUSED(msgLength);
840aeed3e9SJustin Hibbits #endif /* DISABLE_SANITY_CHECKS */
850aeed3e9SJustin Hibbits
860aeed3e9SJustin Hibbits ASSERT_COND(p_IpcMsg);
870aeed3e9SJustin Hibbits
880aeed3e9SJustin Hibbits memset(p_IpcReply, 0, (sizeof(uint8_t) * QM_IPC_MAX_REPLY_SIZE));
890aeed3e9SJustin Hibbits *p_ReplyLength = 0;
900aeed3e9SJustin Hibbits
910aeed3e9SJustin Hibbits switch(p_IpcMsg->msgId)
920aeed3e9SJustin Hibbits {
930aeed3e9SJustin Hibbits case (QM_MASTER_IS_ALIVE):
940aeed3e9SJustin Hibbits *(uint8_t*)p_IpcReply->replyBody = 1;
950aeed3e9SJustin Hibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);
960aeed3e9SJustin Hibbits break;
970aeed3e9SJustin Hibbits case (QM_FORCE_FQID):
980aeed3e9SJustin Hibbits {
990aeed3e9SJustin Hibbits t_QmIpcFqidParams ipcFqid;
1000aeed3e9SJustin Hibbits uint32_t fqid;
1010aeed3e9SJustin Hibbits
1020aeed3e9SJustin Hibbits memcpy((uint8_t*)&ipcFqid, p_IpcMsg->msgBody, sizeof(t_QmIpcFqidParams));
1030aeed3e9SJustin Hibbits fqid = QmFqidGet(p_Qm, ipcFqid.size, 1, TRUE, ipcFqid.fqid);
1040aeed3e9SJustin Hibbits memcpy(p_IpcReply->replyBody, (uint8_t*)&fqid, sizeof(uint32_t));
1050aeed3e9SJustin Hibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);
1060aeed3e9SJustin Hibbits break;
1070aeed3e9SJustin Hibbits }
1080aeed3e9SJustin Hibbits case (QM_PUT_FQID):
1090aeed3e9SJustin Hibbits {
1100aeed3e9SJustin Hibbits t_Error err;
1110aeed3e9SJustin Hibbits t_QmIpcFqidParams ipcFqid;
1120aeed3e9SJustin Hibbits
1130aeed3e9SJustin Hibbits memcpy((uint8_t*)&ipcFqid, p_IpcMsg->msgBody, sizeof(t_QmIpcFqidParams));
1140aeed3e9SJustin Hibbits if ((err = QmFqidPut(p_Qm, ipcFqid.fqid)) != E_OK)
1150aeed3e9SJustin Hibbits REPORT_ERROR(MINOR, err, NO_MSG);
1160aeed3e9SJustin Hibbits break;
1170aeed3e9SJustin Hibbits }
1180aeed3e9SJustin Hibbits case (QM_GET_COUNTER):
1190aeed3e9SJustin Hibbits {
1200aeed3e9SJustin Hibbits t_QmIpcGetCounter ipcCounter;
1210aeed3e9SJustin Hibbits uint32_t count;
1220aeed3e9SJustin Hibbits
1230aeed3e9SJustin Hibbits memcpy((uint8_t*)&ipcCounter, p_IpcMsg->msgBody, sizeof(t_QmIpcGetCounter));
1240aeed3e9SJustin Hibbits count = QmGetCounter(p_Qm, (e_QmInterModuleCounters)ipcCounter.enumId);
1250aeed3e9SJustin Hibbits memcpy(p_IpcReply->replyBody, (uint8_t*)&count, sizeof(uint32_t));
1260aeed3e9SJustin Hibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);
1270aeed3e9SJustin Hibbits break;
1280aeed3e9SJustin Hibbits }
1290aeed3e9SJustin Hibbits case (QM_GET_SET_PORTAL_PARAMS):
1300aeed3e9SJustin Hibbits {
1310aeed3e9SJustin Hibbits t_Error err;
1320aeed3e9SJustin Hibbits t_QmIpcPortalInitParams ipcPortalInitParams;
1330aeed3e9SJustin Hibbits t_QmInterModulePortalInitParams portalInitParams;
1340aeed3e9SJustin Hibbits
1350aeed3e9SJustin Hibbits memcpy((uint8_t*)&ipcPortalInitParams, p_IpcMsg->msgBody, sizeof(t_QmIpcPortalInitParams));
1360aeed3e9SJustin Hibbits portalInitParams.portalId = ipcPortalInitParams.portalId;
1370aeed3e9SJustin Hibbits portalInitParams.stashDestQueue = ipcPortalInitParams.stashDestQueue;
1380aeed3e9SJustin Hibbits portalInitParams.liodn = ipcPortalInitParams.liodn;
1390aeed3e9SJustin Hibbits portalInitParams.dqrrLiodn = ipcPortalInitParams.dqrrLiodn;
1400aeed3e9SJustin Hibbits portalInitParams.fdFqLiodn = ipcPortalInitParams.fdFqLiodn;
1410aeed3e9SJustin Hibbits if ((err = QmGetSetPortalParams(p_Qm, &portalInitParams)) != E_OK)
1420aeed3e9SJustin Hibbits REPORT_ERROR(MINOR, err, NO_MSG);
1430aeed3e9SJustin Hibbits break;
1440aeed3e9SJustin Hibbits }
1450aeed3e9SJustin Hibbits case (QM_GET_REVISION):
1460aeed3e9SJustin Hibbits {
1470aeed3e9SJustin Hibbits t_QmRevisionInfo revInfo;
1480aeed3e9SJustin Hibbits t_QmIpcRevisionInfo ipcRevInfo;
1490aeed3e9SJustin Hibbits
1500aeed3e9SJustin Hibbits p_IpcReply->error = (uint32_t)QmGetRevision(h_Qm, &revInfo);
1510aeed3e9SJustin Hibbits ipcRevInfo.majorRev = revInfo.majorRev;
1520aeed3e9SJustin Hibbits ipcRevInfo.minorRev = revInfo.minorRev;
1530aeed3e9SJustin Hibbits memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcRevInfo, sizeof(t_QmIpcRevisionInfo));
1540aeed3e9SJustin Hibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(t_QmIpcRevisionInfo);
1550aeed3e9SJustin Hibbits break;
1560aeed3e9SJustin Hibbits }
1570aeed3e9SJustin Hibbits default:
1580aeed3e9SJustin Hibbits *p_ReplyLength = 0;
1590aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("command not found!!!"));
1600aeed3e9SJustin Hibbits }
1610aeed3e9SJustin Hibbits return E_OK;
1620aeed3e9SJustin Hibbits }
1630aeed3e9SJustin Hibbits
CheckQmParameters(t_Qm * p_Qm)1640aeed3e9SJustin Hibbits static t_Error CheckQmParameters(t_Qm *p_Qm)
1650aeed3e9SJustin Hibbits {
1660aeed3e9SJustin Hibbits if ((p_Qm->p_QmDriverParams->partFqidBase + p_Qm->p_QmDriverParams->partNumOfFqids) > QM_MAX_NUM_OF_FQIDS)
1670aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("partFqidBase+partNumOfFqids out of range!!!"));
1680aeed3e9SJustin Hibbits if ((p_Qm->partCgsBase + p_Qm->partNumOfCgs) > QM_MAX_NUM_OF_CGS)
1690aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("partCgsBase+partNumOfCgs out of range!!!"));
1700aeed3e9SJustin Hibbits
1710aeed3e9SJustin Hibbits if (p_Qm->guestId == NCSW_MASTER_ID)
1720aeed3e9SJustin Hibbits {
1730aeed3e9SJustin Hibbits uint64_t phyAddr;
1740aeed3e9SJustin Hibbits
1750aeed3e9SJustin Hibbits phyAddr = XX_VirtToPhys(UINT_TO_PTR(p_Qm->p_QmDriverParams->swPortalsBaseAddress));
1760aeed3e9SJustin Hibbits
1770aeed3e9SJustin Hibbits if (phyAddr & 0x00000000001fffffLL)
1780aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("swPortalsBaseAddress isn't properly aligned"));
1790aeed3e9SJustin Hibbits if (!p_Qm->p_QmDriverParams->rtFramesDepth)
1800aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("rtFramesDepth must be larger than '0'!!!"));
1810aeed3e9SJustin Hibbits if (p_Qm->p_QmDriverParams->rtFramesDepth > ((16*MEGABYTE)*3))
1820aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("rtFramesDepth must be equal or smaller than 48MB!!!"));
1830aeed3e9SJustin Hibbits if (!p_Qm->p_QmDriverParams->totalNumOfFqids)
1840aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("totalNumOfFqids must be larger than '0'!!!"));
1850aeed3e9SJustin Hibbits if (p_Qm->p_QmDriverParams->totalNumOfFqids > (16*MEGABYTE))
1860aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("totalNumOfFqids must be equal or smaller than 16MB!!!"));
1870aeed3e9SJustin Hibbits if(!p_Qm->f_Exception)
1880aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Exceptions callback not provided"));
1890aeed3e9SJustin Hibbits }
1900aeed3e9SJustin Hibbits
1910aeed3e9SJustin Hibbits return E_OK;
1920aeed3e9SJustin Hibbits }
1930aeed3e9SJustin Hibbits
QmInitPfdr(t_Qm * p_Qm,uint32_t pfdr_start,uint32_t num)1940aeed3e9SJustin Hibbits static t_Error QmInitPfdr(t_Qm *p_Qm, uint32_t pfdr_start, uint32_t num)
1950aeed3e9SJustin Hibbits {
1960aeed3e9SJustin Hibbits uint8_t rslt;
1970aeed3e9SJustin Hibbits uint32_t timeout = 100000;
1980aeed3e9SJustin Hibbits
1990aeed3e9SJustin Hibbits ASSERT_COND(p_Qm);
2000aeed3e9SJustin Hibbits
2010aeed3e9SJustin Hibbits ASSERT_COND(pfdr_start && !(pfdr_start & 7) && !(num & 7) && num);
2020aeed3e9SJustin Hibbits
2030aeed3e9SJustin Hibbits /* Make sure te command interface is 'idle' */
2040aeed3e9SJustin Hibbits rslt = MCR_get_rslt(GET_UINT32(p_Qm->p_QmRegs->mcr));
2050aeed3e9SJustin Hibbits if (!MCR_rslt_idle(rslt))
2060aeed3e9SJustin Hibbits RETURN_ERROR(CRITICAL,E_INVALID_STATE,("QMAN_MCR isn't idle"));
2070aeed3e9SJustin Hibbits
2080aeed3e9SJustin Hibbits /* Write the MCR command params then the verb */
2090aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->mcp0, pfdr_start);
2100aeed3e9SJustin Hibbits /* TODO: remove this - it's a workaround for a model bug that is
2110aeed3e9SJustin Hibbits * corrected in more recent versions. We use the workaround until
2120aeed3e9SJustin Hibbits * everyone has upgraded. */
2130aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->mcp1, (pfdr_start + num - 16));
2140aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->mcp1, (pfdr_start + num - 1));
2150aeed3e9SJustin Hibbits
216852ba100SJustin Hibbits mb();
2170aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->mcr, MCR_INIT_PFDR);
2180aeed3e9SJustin Hibbits
2190aeed3e9SJustin Hibbits /* Poll for the result */
2200aeed3e9SJustin Hibbits do {
2210aeed3e9SJustin Hibbits XX_UDelay(1);
2220aeed3e9SJustin Hibbits rslt = MCR_get_rslt(GET_UINT32(p_Qm->p_QmRegs->mcr));
2230aeed3e9SJustin Hibbits } while(!MCR_rslt_idle(rslt) && --timeout);
2240aeed3e9SJustin Hibbits
2250aeed3e9SJustin Hibbits if (MCR_rslt_ok(rslt))
2260aeed3e9SJustin Hibbits return E_OK;
2270aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->mcr, 0);
2280aeed3e9SJustin Hibbits if (!timeout)
2290aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_TIMEOUT, NO_MSG);
2300aeed3e9SJustin Hibbits if (MCR_rslt_eaccess(rslt))
2310aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG);
2320aeed3e9SJustin Hibbits if (MCR_rslt_inval(rslt))
2330aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG);
2340aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Unexpected result from MCR_INIT_PFDR: %02x\n", rslt));
2350aeed3e9SJustin Hibbits }
2360aeed3e9SJustin Hibbits
QmSetWqScheduling(t_Qm * p_Qm,e_QmWqClass wqClass,uint8_t csElev,uint8_t csw2,uint8_t csw3,uint8_t csw4,uint8_t csw5,uint8_t csw6,uint8_t csw7)2370aeed3e9SJustin Hibbits static __inline__ void QmSetWqScheduling(t_Qm *p_Qm,
2380aeed3e9SJustin Hibbits e_QmWqClass wqClass,
2390aeed3e9SJustin Hibbits uint8_t csElev,
2400aeed3e9SJustin Hibbits uint8_t csw2,
2410aeed3e9SJustin Hibbits uint8_t csw3,
2420aeed3e9SJustin Hibbits uint8_t csw4,
2430aeed3e9SJustin Hibbits uint8_t csw5,
2440aeed3e9SJustin Hibbits uint8_t csw6,
2450aeed3e9SJustin Hibbits uint8_t csw7)
2460aeed3e9SJustin Hibbits {
2470aeed3e9SJustin Hibbits ASSERT_COND(p_Qm);
2480aeed3e9SJustin Hibbits
2490aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->wq_cs_cfg[wqClass],
2500aeed3e9SJustin Hibbits (uint32_t)(((csElev & 0xff) << 24) |
2510aeed3e9SJustin Hibbits ((csw2 & 0x7) << 20) |
2520aeed3e9SJustin Hibbits ((csw3 & 0x7) << 16) |
2530aeed3e9SJustin Hibbits ((csw4 & 0x7) << 12) |
2540aeed3e9SJustin Hibbits ((csw5 & 0x7) << 8) |
2550aeed3e9SJustin Hibbits ((csw6 & 0x7) << 4) |
2560aeed3e9SJustin Hibbits (csw7 & 0x7)));
2570aeed3e9SJustin Hibbits }
2580aeed3e9SJustin Hibbits
ReserveFqids(t_Qm * p_Qm,uint32_t size,uint32_t alignment,bool force,uint32_t base)2590aeed3e9SJustin Hibbits static uint32_t ReserveFqids(t_Qm *p_Qm, uint32_t size, uint32_t alignment, bool force, uint32_t base)
2600aeed3e9SJustin Hibbits {
2610aeed3e9SJustin Hibbits uint64_t ans;
2620aeed3e9SJustin Hibbits uint32_t intFlags;
2630aeed3e9SJustin Hibbits
2640aeed3e9SJustin Hibbits intFlags = XX_LockIntrSpinlock(p_Qm->lock);
2650aeed3e9SJustin Hibbits if (force)
2660aeed3e9SJustin Hibbits ans = MM_GetForce(p_Qm->h_FqidMm,
2670aeed3e9SJustin Hibbits (uint64_t)base,
2680aeed3e9SJustin Hibbits (uint64_t)size,
2690aeed3e9SJustin Hibbits "QM FQID MEM");
2700aeed3e9SJustin Hibbits else
2710aeed3e9SJustin Hibbits ans = MM_Get(p_Qm->h_FqidMm,
2720aeed3e9SJustin Hibbits (uint64_t)size,
2730aeed3e9SJustin Hibbits alignment,
2740aeed3e9SJustin Hibbits "QM FQID MEM");
2750aeed3e9SJustin Hibbits if (ans == ILLEGAL_BASE)
2760aeed3e9SJustin Hibbits {
2770aeed3e9SJustin Hibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);
2780aeed3e9SJustin Hibbits return (uint32_t)ans;
2790aeed3e9SJustin Hibbits }
2800aeed3e9SJustin Hibbits base = (uint32_t)ans;
2810aeed3e9SJustin Hibbits ans = MM_GetForce(p_Qm->h_RsrvFqidMm,
2820aeed3e9SJustin Hibbits (uint64_t)base,
2830aeed3e9SJustin Hibbits (uint64_t)size,
2840aeed3e9SJustin Hibbits "QM rsrv FQID MEM");
2850aeed3e9SJustin Hibbits if (ans == ILLEGAL_BASE)
2860aeed3e9SJustin Hibbits {
2870aeed3e9SJustin Hibbits MM_Put(p_Qm->h_FqidMm, (uint64_t)base);
2880aeed3e9SJustin Hibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);
2890aeed3e9SJustin Hibbits return (uint32_t)ans;
2900aeed3e9SJustin Hibbits }
2910aeed3e9SJustin Hibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);
2920aeed3e9SJustin Hibbits
2930aeed3e9SJustin Hibbits return (uint32_t)base;
2940aeed3e9SJustin Hibbits }
2950aeed3e9SJustin Hibbits
FreeInitResources(t_Qm * p_Qm)2960aeed3e9SJustin Hibbits static void FreeInitResources(t_Qm *p_Qm)
2970aeed3e9SJustin Hibbits {
2980aeed3e9SJustin Hibbits if (p_Qm->p_FqdBase)
2990aeed3e9SJustin Hibbits XX_FreeSmart(p_Qm->p_FqdBase);
3000aeed3e9SJustin Hibbits if (p_Qm->p_PfdrBase)
3010aeed3e9SJustin Hibbits XX_FreeSmart(p_Qm->p_PfdrBase);
3020aeed3e9SJustin Hibbits if (p_Qm->h_Session)
3030aeed3e9SJustin Hibbits XX_IpcFreeSession(p_Qm->h_Session);
3040aeed3e9SJustin Hibbits if (p_Qm->h_RsrvFqidMm)
3050aeed3e9SJustin Hibbits MM_Free(p_Qm->h_RsrvFqidMm);
3060aeed3e9SJustin Hibbits if (p_Qm->h_FqidMm)
3070aeed3e9SJustin Hibbits MM_Free(p_Qm->h_FqidMm);
3080aeed3e9SJustin Hibbits }
3090aeed3e9SJustin Hibbits
3100aeed3e9SJustin Hibbits
3110aeed3e9SJustin Hibbits /****************************************/
3120aeed3e9SJustin Hibbits /* Inter-Module functions */
3130aeed3e9SJustin Hibbits /****************************************/
3140aeed3e9SJustin Hibbits
QmGetCounter(t_Handle h_Qm,e_QmInterModuleCounters counter)3150aeed3e9SJustin Hibbits uint32_t QmGetCounter(t_Handle h_Qm, e_QmInterModuleCounters counter)
3160aeed3e9SJustin Hibbits {
3170aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm*)h_Qm;
3180aeed3e9SJustin Hibbits
3190aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_Qm, E_INVALID_HANDLE, 0);
3200aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE((((p_Qm->guestId == NCSW_MASTER_ID) && p_Qm->p_QmRegs) ||
3210aeed3e9SJustin Hibbits (p_Qm->guestId != NCSW_MASTER_ID)), E_INVALID_STATE, 0);
3220aeed3e9SJustin Hibbits
3230aeed3e9SJustin Hibbits if ((p_Qm->guestId == NCSW_MASTER_ID) ||
3240aeed3e9SJustin Hibbits (!p_Qm->h_Session && p_Qm->p_QmRegs))
3250aeed3e9SJustin Hibbits {
3260aeed3e9SJustin Hibbits switch(counter)
3270aeed3e9SJustin Hibbits {
3280aeed3e9SJustin Hibbits case(e_QM_IM_COUNTERS_SFDR_IN_USE):
3290aeed3e9SJustin Hibbits return GET_UINT32(p_Qm->p_QmRegs->sfdr_in_use);
3300aeed3e9SJustin Hibbits case(e_QM_IM_COUNTERS_PFDR_IN_USE):
3310aeed3e9SJustin Hibbits return (p_Qm->numOfPfdr - GET_UINT32(p_Qm->p_QmRegs->pfdr_fpc));
3320aeed3e9SJustin Hibbits case(e_QM_IM_COUNTERS_PFDR_FREE_POOL):
3330aeed3e9SJustin Hibbits return (GET_UINT32(p_Qm->p_QmRegs->pfdr_fpc) - GET_UINT32(p_Qm->p_QmRegs->pfdr_cfg));
3340aeed3e9SJustin Hibbits default:
3350aeed3e9SJustin Hibbits break;
3360aeed3e9SJustin Hibbits }
3370aeed3e9SJustin Hibbits /* should never get here */
3380aeed3e9SJustin Hibbits ASSERT_COND(FALSE);
3390aeed3e9SJustin Hibbits }
3400aeed3e9SJustin Hibbits else if (p_Qm->h_Session)
3410aeed3e9SJustin Hibbits {
3420aeed3e9SJustin Hibbits t_QmIpcMsg msg;
3430aeed3e9SJustin Hibbits t_QmIpcReply reply;
3440aeed3e9SJustin Hibbits t_QmIpcGetCounter ipcCounter;
3450aeed3e9SJustin Hibbits uint32_t replyLength, count;
3460aeed3e9SJustin Hibbits t_Error errCode = E_OK;
3470aeed3e9SJustin Hibbits
3480aeed3e9SJustin Hibbits memset(&msg, 0, sizeof(t_QmIpcMsg));
3490aeed3e9SJustin Hibbits memset(&reply, 0, sizeof(t_QmIpcReply));
3500aeed3e9SJustin Hibbits ipcCounter.enumId = (uint32_t)counter;
3510aeed3e9SJustin Hibbits msg.msgId = QM_GET_COUNTER;
3520aeed3e9SJustin Hibbits memcpy(msg.msgBody, &ipcCounter, sizeof(t_QmIpcGetCounter));
3530aeed3e9SJustin Hibbits replyLength = sizeof(uint32_t) + sizeof(uint32_t);
3540aeed3e9SJustin Hibbits if ((errCode = XX_IpcSendMessage(p_Qm->h_Session,
3550aeed3e9SJustin Hibbits (uint8_t*)&msg,
3560aeed3e9SJustin Hibbits sizeof(msg.msgId) + sizeof(t_QmIpcGetCounter),
3570aeed3e9SJustin Hibbits (uint8_t*)&reply,
3580aeed3e9SJustin Hibbits &replyLength,
3590aeed3e9SJustin Hibbits NULL,
3600aeed3e9SJustin Hibbits NULL)) != E_OK)
3610aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, errCode, NO_MSG);
3620aeed3e9SJustin Hibbits if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t)))
3630aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
3640aeed3e9SJustin Hibbits if ((errCode == E_OK) && (replyLength == (sizeof(uint32_t) + sizeof(uint32_t))))
3650aeed3e9SJustin Hibbits {
3660aeed3e9SJustin Hibbits memcpy((uint8_t*)&count, reply.replyBody, sizeof(uint32_t));
3670aeed3e9SJustin Hibbits return count;
3680aeed3e9SJustin Hibbits }
3690aeed3e9SJustin Hibbits }
3700aeed3e9SJustin Hibbits else
3710aeed3e9SJustin Hibbits REPORT_ERROR(WARNING, E_NOT_SUPPORTED,
3720aeed3e9SJustin Hibbits ("In 'guest', either IPC or 'baseAddress' is required!"));
3730aeed3e9SJustin Hibbits
3740aeed3e9SJustin Hibbits return 0;
3750aeed3e9SJustin Hibbits }
3760aeed3e9SJustin Hibbits
QmGetRevision(t_Handle h_Qm,t_QmRevisionInfo * p_QmRevisionInfo)3770aeed3e9SJustin Hibbits t_Error QmGetRevision(t_Handle h_Qm, t_QmRevisionInfo *p_QmRevisionInfo)
3780aeed3e9SJustin Hibbits {
3790aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm *)h_Qm;
3800aeed3e9SJustin Hibbits uint32_t tmpReg;
3810aeed3e9SJustin Hibbits
3820aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);
3830aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_QmRevisionInfo, E_NULL_POINTER);
3840aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR((((p_Qm->guestId == NCSW_MASTER_ID) && p_Qm->p_QmRegs) ||
3850aeed3e9SJustin Hibbits (p_Qm->guestId != NCSW_MASTER_ID)), E_INVALID_STATE);
3860aeed3e9SJustin Hibbits
3870aeed3e9SJustin Hibbits if ((p_Qm->guestId == NCSW_MASTER_ID) ||
3880aeed3e9SJustin Hibbits (!p_Qm->h_Session && p_Qm->p_QmRegs))
3890aeed3e9SJustin Hibbits {
3900aeed3e9SJustin Hibbits /* read revision register 1 */
3910aeed3e9SJustin Hibbits tmpReg = GET_UINT32(p_Qm->p_QmRegs->ip_rev_1);
3920aeed3e9SJustin Hibbits p_QmRevisionInfo->majorRev = (uint8_t)((tmpReg & REV1_MAJOR_MASK) >> REV1_MAJOR_SHIFT);
3930aeed3e9SJustin Hibbits p_QmRevisionInfo->minorRev = (uint8_t)((tmpReg & REV1_MINOR_MASK) >> REV1_MINOR_SHIFT);
3940aeed3e9SJustin Hibbits }
3950aeed3e9SJustin Hibbits else if (p_Qm->h_Session)
3960aeed3e9SJustin Hibbits {
3970aeed3e9SJustin Hibbits t_QmIpcMsg msg;
3980aeed3e9SJustin Hibbits t_QmIpcReply reply;
3990aeed3e9SJustin Hibbits t_QmIpcRevisionInfo ipcRevInfo;
4000aeed3e9SJustin Hibbits uint32_t replyLength;
4010aeed3e9SJustin Hibbits t_Error errCode = E_OK;
4020aeed3e9SJustin Hibbits
4030aeed3e9SJustin Hibbits memset(&msg, 0, sizeof(t_QmIpcMsg));
4040aeed3e9SJustin Hibbits memset(&reply, 0, sizeof(reply));
4050aeed3e9SJustin Hibbits msg.msgId = QM_GET_REVISION;
4060aeed3e9SJustin Hibbits replyLength = sizeof(uint32_t) + sizeof(t_QmIpcRevisionInfo);
4070aeed3e9SJustin Hibbits if ((errCode = XX_IpcSendMessage(p_Qm->h_Session,
4080aeed3e9SJustin Hibbits (uint8_t*)&msg,
4090aeed3e9SJustin Hibbits sizeof(msg.msgId),
4100aeed3e9SJustin Hibbits (uint8_t*)&reply,
4110aeed3e9SJustin Hibbits &replyLength,
4120aeed3e9SJustin Hibbits NULL,
4130aeed3e9SJustin Hibbits NULL)) != E_OK)
4140aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, errCode, NO_MSG);
4150aeed3e9SJustin Hibbits if (replyLength != (sizeof(uint32_t) + sizeof(t_QmIpcRevisionInfo)))
4160aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
4170aeed3e9SJustin Hibbits
4180aeed3e9SJustin Hibbits memcpy((uint8_t*)&ipcRevInfo, reply.replyBody, sizeof(t_QmIpcRevisionInfo));
4190aeed3e9SJustin Hibbits p_QmRevisionInfo->majorRev = ipcRevInfo.majorRev;
4200aeed3e9SJustin Hibbits p_QmRevisionInfo->minorRev = ipcRevInfo.minorRev;
4210aeed3e9SJustin Hibbits
4220aeed3e9SJustin Hibbits return (t_Error)(reply.error);
4230aeed3e9SJustin Hibbits }
4240aeed3e9SJustin Hibbits else
4250aeed3e9SJustin Hibbits RETURN_ERROR(WARNING, E_NOT_SUPPORTED,
4260aeed3e9SJustin Hibbits ("In 'guest', either IPC or 'baseAddress' is required!"));
4270aeed3e9SJustin Hibbits
4280aeed3e9SJustin Hibbits return E_OK;
4290aeed3e9SJustin Hibbits }
4300aeed3e9SJustin Hibbits
QmGetSetPortalParams(t_Handle h_Qm,t_QmInterModulePortalInitParams * p_PortalParams)4310aeed3e9SJustin Hibbits t_Error QmGetSetPortalParams(t_Handle h_Qm, t_QmInterModulePortalInitParams *p_PortalParams)
4320aeed3e9SJustin Hibbits {
4330aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm *)h_Qm;
4340aeed3e9SJustin Hibbits t_QmRevisionInfo revInfo;
4350aeed3e9SJustin Hibbits uint32_t lioReg,ioReg;
4360aeed3e9SJustin Hibbits
4370aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);
4380aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_PortalParams, E_NULL_POINTER);
4390aeed3e9SJustin Hibbits
4400aeed3e9SJustin Hibbits if (p_Qm->guestId == NCSW_MASTER_ID)
4410aeed3e9SJustin Hibbits {
4420aeed3e9SJustin Hibbits QmGetRevision(p_Qm, &revInfo);
4430aeed3e9SJustin Hibbits
4440aeed3e9SJustin Hibbits if ((revInfo.majorRev == 1) && (revInfo.minorRev == 0))
4450aeed3e9SJustin Hibbits {
4460aeed3e9SJustin Hibbits lioReg = (uint32_t)(p_PortalParams->stashDestQueue << 24) |
4470aeed3e9SJustin Hibbits (p_PortalParams->liodn << 16) |
4480aeed3e9SJustin Hibbits (p_PortalParams->dqrrLiodn);
4490aeed3e9SJustin Hibbits ioReg = (p_PortalParams->fdFqLiodn);
4500aeed3e9SJustin Hibbits }
4510aeed3e9SJustin Hibbits else
4520aeed3e9SJustin Hibbits {
4530aeed3e9SJustin Hibbits lioReg = (uint32_t)(p_PortalParams->liodn << 16) |
4540aeed3e9SJustin Hibbits (p_PortalParams->dqrrLiodn);
4550aeed3e9SJustin Hibbits ioReg = (uint32_t)(p_PortalParams->stashDestQueue << 16) |
4560aeed3e9SJustin Hibbits (p_PortalParams->fdFqLiodn);
4570aeed3e9SJustin Hibbits }
4580aeed3e9SJustin Hibbits
4590aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->swpConfRegs[p_PortalParams->portalId].lio_cfg, lioReg);
4600aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->swpConfRegs[p_PortalParams->portalId].io_cfg, ioReg);
4610aeed3e9SJustin Hibbits }
4620aeed3e9SJustin Hibbits else if (p_Qm->h_Session)
4630aeed3e9SJustin Hibbits {
4640aeed3e9SJustin Hibbits t_QmIpcMsg msg;
4650aeed3e9SJustin Hibbits t_QmIpcPortalInitParams portalParams;
4660aeed3e9SJustin Hibbits t_Error errCode;
4670aeed3e9SJustin Hibbits
4680aeed3e9SJustin Hibbits memset(&msg, 0, sizeof(t_QmIpcMsg));
4690aeed3e9SJustin Hibbits portalParams.portalId = p_PortalParams->portalId;
4700aeed3e9SJustin Hibbits portalParams.stashDestQueue = p_PortalParams->stashDestQueue;
4710aeed3e9SJustin Hibbits portalParams.liodn = p_PortalParams->liodn;
4720aeed3e9SJustin Hibbits portalParams.dqrrLiodn = p_PortalParams->dqrrLiodn;
4730aeed3e9SJustin Hibbits portalParams.fdFqLiodn = p_PortalParams->fdFqLiodn;
4740aeed3e9SJustin Hibbits msg.msgId = QM_GET_SET_PORTAL_PARAMS;
4750aeed3e9SJustin Hibbits memcpy(msg.msgBody, &portalParams, sizeof(t_QmIpcPortalInitParams));
4760aeed3e9SJustin Hibbits XX_LockSpinlock(p_Qm->lock);
4770aeed3e9SJustin Hibbits if ((errCode = XX_IpcSendMessage(p_Qm->h_Session,
4780aeed3e9SJustin Hibbits (uint8_t*)&msg,
4790aeed3e9SJustin Hibbits sizeof(msg.msgId) + sizeof(t_QmIpcPortalInitParams),
4800aeed3e9SJustin Hibbits NULL,
4810aeed3e9SJustin Hibbits NULL,
4820aeed3e9SJustin Hibbits NULL,
4830aeed3e9SJustin Hibbits NULL)) != E_OK)
4840aeed3e9SJustin Hibbits {
4850aeed3e9SJustin Hibbits XX_UnlockSpinlock(p_Qm->lock);
4860aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, errCode, NO_MSG);
4870aeed3e9SJustin Hibbits }
4880aeed3e9SJustin Hibbits XX_UnlockSpinlock(p_Qm->lock);
4890aeed3e9SJustin Hibbits }
4900aeed3e9SJustin Hibbits else
4910aeed3e9SJustin Hibbits DBG(WARNING, ("Can't set portal parameters (e.g. liodns). " \
4920aeed3e9SJustin Hibbits "probably QM is running in guest-mode with no IPC!"));
4930aeed3e9SJustin Hibbits
4940aeed3e9SJustin Hibbits return E_OK;
4950aeed3e9SJustin Hibbits }
4960aeed3e9SJustin Hibbits
QmFqidGet(t_Qm * p_Qm,uint32_t size,uint32_t alignment,bool force,uint32_t base)4970aeed3e9SJustin Hibbits uint32_t QmFqidGet(t_Qm *p_Qm, uint32_t size, uint32_t alignment, bool force, uint32_t base)
4980aeed3e9SJustin Hibbits {
4990aeed3e9SJustin Hibbits uint64_t ans;
5000aeed3e9SJustin Hibbits uint32_t intFlags;
5010aeed3e9SJustin Hibbits
5020aeed3e9SJustin Hibbits intFlags = XX_LockIntrSpinlock(p_Qm->lock);
5030aeed3e9SJustin Hibbits if (force)
5040aeed3e9SJustin Hibbits {
5050aeed3e9SJustin Hibbits ans = MM_GetForce(p_Qm->h_FqidMm,
5060aeed3e9SJustin Hibbits (uint64_t)base,
5070aeed3e9SJustin Hibbits (uint64_t)size,
5080aeed3e9SJustin Hibbits "QM FQID MEM");
5090aeed3e9SJustin Hibbits if (ans == ILLEGAL_BASE)
5100aeed3e9SJustin Hibbits {
5110aeed3e9SJustin Hibbits ans = MM_GetForce(p_Qm->h_RsrvFqidMm,
5120aeed3e9SJustin Hibbits (uint64_t)base,
5130aeed3e9SJustin Hibbits (uint64_t)size,
5140aeed3e9SJustin Hibbits "QM rsrv FQID MEM");
5150aeed3e9SJustin Hibbits if (ans == ILLEGAL_BASE)
5160aeed3e9SJustin Hibbits ans = base;
5170aeed3e9SJustin Hibbits else if (p_Qm->h_Session)
5180aeed3e9SJustin Hibbits {
5190aeed3e9SJustin Hibbits t_QmIpcMsg msg;
5200aeed3e9SJustin Hibbits t_QmIpcReply reply;
5210aeed3e9SJustin Hibbits uint32_t replyLength;
5220aeed3e9SJustin Hibbits t_QmIpcFqidParams ipcFqid;
5230aeed3e9SJustin Hibbits t_Error errCode = E_OK;
5240aeed3e9SJustin Hibbits
5250aeed3e9SJustin Hibbits memset(&msg, 0, sizeof(t_QmIpcMsg));
5260aeed3e9SJustin Hibbits memset(&reply, 0, sizeof(t_QmIpcReply));
5270aeed3e9SJustin Hibbits ipcFqid.fqid = base;
5280aeed3e9SJustin Hibbits ipcFqid.size = size;
5290aeed3e9SJustin Hibbits msg.msgId = QM_FORCE_FQID;
5300aeed3e9SJustin Hibbits memcpy(msg.msgBody, &ipcFqid, sizeof(t_QmIpcFqidParams));
5310aeed3e9SJustin Hibbits replyLength = sizeof(uint32_t) + sizeof(uint32_t);
5320aeed3e9SJustin Hibbits if ((errCode = XX_IpcSendMessage(p_Qm->h_Session,
5330aeed3e9SJustin Hibbits (uint8_t*)&msg,
5340aeed3e9SJustin Hibbits sizeof(msg.msgId) + sizeof(t_QmIpcFqidParams),
5350aeed3e9SJustin Hibbits (uint8_t*)&reply,
5360aeed3e9SJustin Hibbits &replyLength,
5370aeed3e9SJustin Hibbits NULL,
5380aeed3e9SJustin Hibbits NULL)) != E_OK)
5390aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, errCode, NO_MSG);
5400aeed3e9SJustin Hibbits if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t)))
5410aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
5420aeed3e9SJustin Hibbits
5430aeed3e9SJustin Hibbits if ((errCode != E_OK) ||
5440aeed3e9SJustin Hibbits (replyLength != (sizeof(uint32_t) + sizeof(uint32_t))))
5450aeed3e9SJustin Hibbits ans = ILLEGAL_BASE;
5460aeed3e9SJustin Hibbits else
5470aeed3e9SJustin Hibbits memcpy((uint8_t*)&ans, reply.replyBody, sizeof(uint32_t));
5480aeed3e9SJustin Hibbits }
5490aeed3e9SJustin Hibbits else
5500aeed3e9SJustin Hibbits {
5510aeed3e9SJustin Hibbits DBG(WARNING, ("No Ipc - can't validate fqid."));
5520aeed3e9SJustin Hibbits ans = base;
5530aeed3e9SJustin Hibbits }
5540aeed3e9SJustin Hibbits }
5550aeed3e9SJustin Hibbits }
5560aeed3e9SJustin Hibbits else
5570aeed3e9SJustin Hibbits ans = MM_Get(p_Qm->h_FqidMm,
5580aeed3e9SJustin Hibbits size,
5590aeed3e9SJustin Hibbits alignment,
5600aeed3e9SJustin Hibbits "QM FQID MEM");
5610aeed3e9SJustin Hibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);
5620aeed3e9SJustin Hibbits
563*e99c4e4dSBrandon Bergren KASSERT(ans < UINT32_MAX, ("Oops, %jx > UINT32_MAX!\n", (uintmax_t)ans));
5640aeed3e9SJustin Hibbits return (uint32_t)ans;
5650aeed3e9SJustin Hibbits }
5660aeed3e9SJustin Hibbits
QmFqidPut(t_Qm * p_Qm,uint32_t base)5670aeed3e9SJustin Hibbits t_Error QmFqidPut(t_Qm *p_Qm, uint32_t base)
5680aeed3e9SJustin Hibbits {
5690aeed3e9SJustin Hibbits uint32_t intFlags;
5700aeed3e9SJustin Hibbits
5710aeed3e9SJustin Hibbits intFlags = XX_LockIntrSpinlock(p_Qm->lock);
5720aeed3e9SJustin Hibbits /* Check maybe this fqid was reserved in the past */
5730aeed3e9SJustin Hibbits if (MM_GetForce(p_Qm->h_RsrvFqidMm,
5740aeed3e9SJustin Hibbits (uint64_t)base,
5750aeed3e9SJustin Hibbits (uint64_t)1,
5760aeed3e9SJustin Hibbits "QM rsrv FQID MEM") == ILLEGAL_BASE)
5770aeed3e9SJustin Hibbits {
5780aeed3e9SJustin Hibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);
5790aeed3e9SJustin Hibbits return E_OK;
5800aeed3e9SJustin Hibbits }
5810aeed3e9SJustin Hibbits else
5820aeed3e9SJustin Hibbits MM_PutForce(p_Qm->h_RsrvFqidMm,
5830aeed3e9SJustin Hibbits (uint64_t)base,
5840aeed3e9SJustin Hibbits (uint64_t)1);
5850aeed3e9SJustin Hibbits if (MM_InRange(p_Qm->h_FqidMm, (uint64_t)base))
5860aeed3e9SJustin Hibbits {
5870aeed3e9SJustin Hibbits if (MM_Put(p_Qm->h_FqidMm, (uint64_t)base) != 0)
5880aeed3e9SJustin Hibbits {
5890aeed3e9SJustin Hibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);
5900aeed3e9SJustin Hibbits return E_OK;
5910aeed3e9SJustin Hibbits }
5920aeed3e9SJustin Hibbits else
5930aeed3e9SJustin Hibbits {
5940aeed3e9SJustin Hibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);
5950aeed3e9SJustin Hibbits return ERROR_CODE(E_NOT_FOUND);
5960aeed3e9SJustin Hibbits }
5970aeed3e9SJustin Hibbits }
5980aeed3e9SJustin Hibbits else if (p_Qm->h_Session)
5990aeed3e9SJustin Hibbits {
6000aeed3e9SJustin Hibbits t_QmIpcMsg msg;
6010aeed3e9SJustin Hibbits t_QmIpcFqidParams ipcFqid;
6020aeed3e9SJustin Hibbits t_Error errCode = E_OK;
6030aeed3e9SJustin Hibbits
6040aeed3e9SJustin Hibbits memset(&msg, 0, sizeof(t_QmIpcMsg));
6050aeed3e9SJustin Hibbits ipcFqid.fqid = (uint8_t)base;
6060aeed3e9SJustin Hibbits ipcFqid.size = 0;
6070aeed3e9SJustin Hibbits msg.msgId = QM_PUT_FQID;
6080aeed3e9SJustin Hibbits memcpy(msg.msgBody, &ipcFqid, sizeof(t_QmIpcFqidParams));
6090aeed3e9SJustin Hibbits if ((errCode = XX_IpcSendMessage(p_Qm->h_Session,
6100aeed3e9SJustin Hibbits (uint8_t*)&msg,
6110aeed3e9SJustin Hibbits sizeof(msg.msgId) + sizeof(t_QmIpcFqidParams),
6120aeed3e9SJustin Hibbits NULL,
6130aeed3e9SJustin Hibbits NULL,
6140aeed3e9SJustin Hibbits NULL,
6150aeed3e9SJustin Hibbits NULL)) != E_OK)
6160aeed3e9SJustin Hibbits {
6170aeed3e9SJustin Hibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);
6180aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, errCode, NO_MSG);
6190aeed3e9SJustin Hibbits }
6200aeed3e9SJustin Hibbits }
6210aeed3e9SJustin Hibbits else
6220aeed3e9SJustin Hibbits DBG(WARNING, ("No Ipc - can't validate fqid."));
6230aeed3e9SJustin Hibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags);
6240aeed3e9SJustin Hibbits
6250aeed3e9SJustin Hibbits return E_OK;
6260aeed3e9SJustin Hibbits }
6270aeed3e9SJustin Hibbits
QmGetCgId(t_Handle h_Qm,uint8_t * p_CgId)6280aeed3e9SJustin Hibbits t_Error QmGetCgId(t_Handle h_Qm, uint8_t *p_CgId)
6290aeed3e9SJustin Hibbits {
6300aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm *)h_Qm;
6310aeed3e9SJustin Hibbits uint16_t i;
6320aeed3e9SJustin Hibbits
6330aeed3e9SJustin Hibbits for(i = p_Qm->partCgsBase;i<p_Qm->partCgsBase+p_Qm->partNumOfCgs;i++)
6340aeed3e9SJustin Hibbits if (!p_Qm->cgsUsed[i])
6350aeed3e9SJustin Hibbits {
6360aeed3e9SJustin Hibbits p_Qm->cgsUsed[i] = (uint8_t)TRUE;
6370aeed3e9SJustin Hibbits *p_CgId = (uint8_t)i;
6380aeed3e9SJustin Hibbits break;
6390aeed3e9SJustin Hibbits }
6400aeed3e9SJustin Hibbits if(i == (p_Qm->partCgsBase+p_Qm->partNumOfCgs))
6410aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_BUSY, ("No available CG"));
6420aeed3e9SJustin Hibbits else
6430aeed3e9SJustin Hibbits return E_OK;
6440aeed3e9SJustin Hibbits }
6450aeed3e9SJustin Hibbits
QmFreeCgId(t_Handle h_Qm,uint8_t cgId)6460aeed3e9SJustin Hibbits t_Error QmFreeCgId(t_Handle h_Qm, uint8_t cgId)
6470aeed3e9SJustin Hibbits {
6480aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm *)h_Qm;
6490aeed3e9SJustin Hibbits
6500aeed3e9SJustin Hibbits if (!p_Qm->cgsUsed[cgId])
6510aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("CG is not in use"));
6520aeed3e9SJustin Hibbits else
6530aeed3e9SJustin Hibbits p_Qm->cgsUsed[cgId] = (uint8_t)FALSE;
6540aeed3e9SJustin Hibbits
6550aeed3e9SJustin Hibbits return E_OK;
6560aeed3e9SJustin Hibbits }
6570aeed3e9SJustin Hibbits
6580aeed3e9SJustin Hibbits
6590aeed3e9SJustin Hibbits /****************************************/
6600aeed3e9SJustin Hibbits /* API Init unit functions */
6610aeed3e9SJustin Hibbits /****************************************/
6620aeed3e9SJustin Hibbits
QM_Config(t_QmParam * p_QmParam)6630aeed3e9SJustin Hibbits t_Handle QM_Config(t_QmParam *p_QmParam)
6640aeed3e9SJustin Hibbits {
6650aeed3e9SJustin Hibbits t_Qm *p_Qm;
6660aeed3e9SJustin Hibbits uint8_t i;
6670aeed3e9SJustin Hibbits
6680aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_QmParam, E_INVALID_HANDLE, NULL);
6690aeed3e9SJustin Hibbits
6700aeed3e9SJustin Hibbits p_Qm = (t_Qm *)XX_Malloc(sizeof(t_Qm));
6710aeed3e9SJustin Hibbits if (!p_Qm)
6720aeed3e9SJustin Hibbits {
6730aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("QM obj!!!"));
6740aeed3e9SJustin Hibbits return NULL;
6750aeed3e9SJustin Hibbits }
6760aeed3e9SJustin Hibbits memset(p_Qm, 0, sizeof(t_Qm));
6770aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams = (t_QmDriverParams *)XX_Malloc(sizeof(t_QmDriverParams));
6780aeed3e9SJustin Hibbits if (!p_Qm->p_QmDriverParams)
6790aeed3e9SJustin Hibbits {
6800aeed3e9SJustin Hibbits XX_Free(p_Qm);
6810aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Qm driver parameters"));
6820aeed3e9SJustin Hibbits return NULL;
6830aeed3e9SJustin Hibbits }
6840aeed3e9SJustin Hibbits memset(p_Qm->p_QmDriverParams, 0, sizeof(t_QmDriverParams));
6850aeed3e9SJustin Hibbits
6860aeed3e9SJustin Hibbits p_Qm->guestId = p_QmParam->guestId;
6870aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams->partFqidBase = p_QmParam->partFqidBase;
6880aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams->partNumOfFqids = p_QmParam->partNumOfFqids;
6890aeed3e9SJustin Hibbits p_Qm->partCgsBase = p_QmParam->partCgsBase;
6900aeed3e9SJustin Hibbits p_Qm->partNumOfCgs = p_QmParam->partNumOfCgs;
6910aeed3e9SJustin Hibbits p_Qm->p_QmRegs = (t_QmRegs *)UINT_TO_PTR(p_QmParam->baseAddress);
6920aeed3e9SJustin Hibbits
6930aeed3e9SJustin Hibbits if (p_Qm->guestId == NCSW_MASTER_ID)
6940aeed3e9SJustin Hibbits {
6950aeed3e9SJustin Hibbits p_Qm->exceptions = DEFAULT_exceptions;
6960aeed3e9SJustin Hibbits p_Qm->f_Exception = p_QmParam->f_Exception;
6970aeed3e9SJustin Hibbits p_Qm->h_App = p_QmParam->h_App;
6980aeed3e9SJustin Hibbits p_Qm->errIrq = p_QmParam->errIrq;
6990aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams->liodn = p_QmParam->liodn;
7000aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams->rtFramesDepth = DEFAULT_rtFramesDepth;
7010aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams->fqdMemPartitionId = p_QmParam->fqdMemPartitionId;
7020aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams->pfdrMemPartitionId = p_QmParam->pfdrMemPartitionId;
7030aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams->swPortalsBaseAddress = p_QmParam->swPortalsBaseAddress;
7040aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams->totalNumOfFqids = p_QmParam->totalNumOfFqids;
7050aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams->pfdrThreshold = DEFAULT_pfdrThreshold;
7060aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams->sfdrThreshold = DEFAULT_sfdrThreshold;
7070aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams->pfdrBaseConstant = DEFAULT_pfdrBaseConstant;
7080aeed3e9SJustin Hibbits for(i= 0;i<DPAA_MAX_NUM_OF_DC_PORTALS;i++)
7090aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams->dcPortalsParams[i].sendToSw =
7100aeed3e9SJustin Hibbits (bool)((i < e_DPAA_DCPORTAL2) ? FALSE : TRUE);
7110aeed3e9SJustin Hibbits
7120aeed3e9SJustin Hibbits #ifdef QMAN_SFDR_LEAK_ERRATA_QMAN5
7130aeed3e9SJustin Hibbits {
7140aeed3e9SJustin Hibbits #define WORKAROUND_TMP_VAL 0x00000003
7150aeed3e9SJustin Hibbits t_QmRevisionInfo revInfo;
7160aeed3e9SJustin Hibbits QmGetRevision(p_Qm, &revInfo);
7170aeed3e9SJustin Hibbits if ((revInfo.majorRev == 1) && (revInfo.minorRev == 0))
7180aeed3e9SJustin Hibbits {
7190aeed3e9SJustin Hibbits uint32_t *tmp = (uint32_t *)UINT_TO_PTR(p_QmParam->baseAddress + 0xbf0);
7200aeed3e9SJustin Hibbits uint32_t tmpReg = WORKAROUND_TMP_VAL;
7210aeed3e9SJustin Hibbits WRITE_UINT32(*tmp, tmpReg);
7220aeed3e9SJustin Hibbits while ((tmpReg = GET_UINT32(*tmp)) != WORKAROUND_TMP_VAL) ;
7230aeed3e9SJustin Hibbits }
7240aeed3e9SJustin Hibbits }
7250aeed3e9SJustin Hibbits #endif /* QMAN_SFDR_LEAK_ERRATA_QMAN5 */
7260aeed3e9SJustin Hibbits }
7270aeed3e9SJustin Hibbits
7280aeed3e9SJustin Hibbits /* build the QM partition IPC address */
7290aeed3e9SJustin Hibbits memset(p_Qm->moduleName, 0, MODULE_NAME_SIZE);
7300aeed3e9SJustin Hibbits if(Sprint (p_Qm->moduleName, "QM_0_%d",p_Qm->guestId) != (p_Qm->guestId<10 ? 6:7))
7310aeed3e9SJustin Hibbits {
7320aeed3e9SJustin Hibbits XX_Free(p_Qm->p_QmDriverParams);
7330aeed3e9SJustin Hibbits XX_Free(p_Qm);
7340aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
7350aeed3e9SJustin Hibbits return NULL;
7360aeed3e9SJustin Hibbits }
7370aeed3e9SJustin Hibbits
7380aeed3e9SJustin Hibbits return p_Qm;
7390aeed3e9SJustin Hibbits }
7400aeed3e9SJustin Hibbits
QM_Init(t_Handle h_Qm)7410aeed3e9SJustin Hibbits t_Error QM_Init(t_Handle h_Qm)
7420aeed3e9SJustin Hibbits {
7430aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm *)h_Qm;
7440aeed3e9SJustin Hibbits t_QmDriverParams *p_QmDriverParams;
7450aeed3e9SJustin Hibbits t_Error err;
7460aeed3e9SJustin Hibbits
7470aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);
7480aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm->p_QmDriverParams, E_INVALID_HANDLE);
7490aeed3e9SJustin Hibbits
7500aeed3e9SJustin Hibbits CHECK_INIT_PARAMETERS(p_Qm, CheckQmParameters);
7510aeed3e9SJustin Hibbits
7520aeed3e9SJustin Hibbits p_QmDriverParams = p_Qm->p_QmDriverParams;
7530aeed3e9SJustin Hibbits
7540aeed3e9SJustin Hibbits if (p_QmDriverParams->partNumOfFqids)
7550aeed3e9SJustin Hibbits {
7560aeed3e9SJustin Hibbits if (MM_Init(&p_Qm->h_FqidMm, p_QmDriverParams->partFqidBase, p_QmDriverParams->partNumOfFqids) != E_OK)
7570aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("QM-FQIDS-MEM partition!!!"));
7580aeed3e9SJustin Hibbits if (MM_Init(&p_Qm->h_RsrvFqidMm, p_QmDriverParams->partFqidBase, p_QmDriverParams->partNumOfFqids) != E_OK)
7590aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("QM-Reserve-FQIDS-MEM partition!!!"));
7600aeed3e9SJustin Hibbits }
7610aeed3e9SJustin Hibbits
7620aeed3e9SJustin Hibbits if (p_Qm->guestId == NCSW_MASTER_ID)
7630aeed3e9SJustin Hibbits {
7640aeed3e9SJustin Hibbits uint64_t phyAddr;
7650aeed3e9SJustin Hibbits t_QmRevisionInfo revInfo;
7660aeed3e9SJustin Hibbits uint32_t dsSize, exp, i;
7670aeed3e9SJustin Hibbits
7680aeed3e9SJustin Hibbits QmGetRevision(p_Qm, &revInfo);
7690aeed3e9SJustin Hibbits DBG(TRACE, ("Qman ver:%02x,%02x", revInfo.majorRev, revInfo.minorRev));
7700aeed3e9SJustin Hibbits
7710aeed3e9SJustin Hibbits phyAddr = XX_VirtToPhys(UINT_TO_PTR(p_QmDriverParams->swPortalsBaseAddress));
7720aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->qcsp_bare, ((uint32_t)(phyAddr >> 32) & 0x000000ff));
7730aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->qcsp_bar, (uint32_t)phyAddr);
7740aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->liodnr, (uint16_t)p_QmDriverParams->liodn);
7750aeed3e9SJustin Hibbits
7760aeed3e9SJustin Hibbits /* FQD memory */
7770aeed3e9SJustin Hibbits dsSize = (uint32_t)(p_QmDriverParams->totalNumOfFqids * FQD_ENTRY_SIZE);
7780aeed3e9SJustin Hibbits LOG2(dsSize, exp);
7790aeed3e9SJustin Hibbits if (!POWER_OF_2(dsSize)) (exp++);
7800aeed3e9SJustin Hibbits dsSize = (uint32_t)(1 << exp);
7810aeed3e9SJustin Hibbits if (dsSize < (4*KILOBYTE))
7820aeed3e9SJustin Hibbits {
7830aeed3e9SJustin Hibbits dsSize = (4*KILOBYTE);
7840aeed3e9SJustin Hibbits LOG2(dsSize, exp);
7850aeed3e9SJustin Hibbits }
7860aeed3e9SJustin Hibbits p_Qm->p_FqdBase = XX_MallocSmart(dsSize, (int)p_QmDriverParams->fqdMemPartitionId, dsSize);
7870aeed3e9SJustin Hibbits if (!p_Qm->p_FqdBase)
7880aeed3e9SJustin Hibbits {
7890aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("FQD obj!!!"));
7900aeed3e9SJustin Hibbits }
7910aeed3e9SJustin Hibbits memset(p_Qm->p_FqdBase, 0, dsSize);
792852ba100SJustin Hibbits mb();
7930aeed3e9SJustin Hibbits for (i=0; i<dsSize; i+=64)
7940aeed3e9SJustin Hibbits dcbf(PTR_MOVE(p_Qm->p_FqdBase, i));
795852ba100SJustin Hibbits mb();
7960aeed3e9SJustin Hibbits
7970aeed3e9SJustin Hibbits phyAddr = XX_VirtToPhys(p_Qm->p_FqdBase);
7980aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->fqd_bare, ((uint32_t)(phyAddr >> 32) & 0x000000ff));
7990aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->fqd_bar, (uint32_t)phyAddr);
8000aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->fqd_ar, AR_ENABLE | (exp - 1));
8010aeed3e9SJustin Hibbits
8020aeed3e9SJustin Hibbits /* PFDR memory */
8030aeed3e9SJustin Hibbits dsSize = (uint32_t)(p_QmDriverParams->rtFramesDepth * (PFDR_ENTRY_SIZE/3));
8040aeed3e9SJustin Hibbits LOG2(dsSize, exp);
8050aeed3e9SJustin Hibbits if (!POWER_OF_2(dsSize)) (exp++);
8060aeed3e9SJustin Hibbits dsSize = (uint32_t)(1 << exp);
8070aeed3e9SJustin Hibbits if (dsSize < (4*KILOBYTE))
8080aeed3e9SJustin Hibbits {
8090aeed3e9SJustin Hibbits dsSize = (4*KILOBYTE);
8100aeed3e9SJustin Hibbits LOG2(dsSize, exp);
8110aeed3e9SJustin Hibbits }
8120aeed3e9SJustin Hibbits
8130aeed3e9SJustin Hibbits p_Qm->p_PfdrBase = XX_MallocSmart(dsSize, (int)p_QmDriverParams->pfdrMemPartitionId, dsSize);
8140aeed3e9SJustin Hibbits if (!p_Qm->p_PfdrBase)
8150aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("PFDR obj!!!"));
8160aeed3e9SJustin Hibbits
8170aeed3e9SJustin Hibbits phyAddr = XX_VirtToPhys(p_Qm->p_PfdrBase);
8180aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->pfdr_bare, ((uint32_t)(phyAddr >> 32) & 0x000000ff));
8190aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->pfdr_bar, (uint32_t)phyAddr);
8200aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->pfdr_ar, AR_ENABLE | (exp - 1));
8210aeed3e9SJustin Hibbits
8220aeed3e9SJustin Hibbits if (QmInitPfdr(p_Qm, 8, dsSize / 64 - 8) != E_OK)
8230aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("PFDR init failed!!!"));
8240aeed3e9SJustin Hibbits
8250aeed3e9SJustin Hibbits /* thresholds */
8260aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->pfdr_fp_lwit, (p_Qm->p_QmDriverParams->pfdrThreshold & 0xffffff));
8270aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->pfdr_cfg, p_Qm->p_QmDriverParams->pfdrBaseConstant);
8280aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->sfdr_cfg, (p_Qm->p_QmDriverParams->sfdrThreshold & 0x3ff));
8290aeed3e9SJustin Hibbits
8300aeed3e9SJustin Hibbits p_Qm->numOfPfdr = GET_UINT32(p_Qm->p_QmRegs->pfdr_fpc);
8310aeed3e9SJustin Hibbits
8320aeed3e9SJustin Hibbits /* corenet initiator settings */
8330aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->ci_sched_cfg,
8340aeed3e9SJustin Hibbits (CI_SCHED_CFG_EN |
8350aeed3e9SJustin Hibbits (DEFAULT_initiatorSrcciv << CI_SCHED_CFG_SRCCIV_SHIFT) |
8360aeed3e9SJustin Hibbits (DEFAULT_initiatorSrqW << CI_SCHED_CFG_SRQ_W_SHIFT) |
8370aeed3e9SJustin Hibbits (DEFAULT_initiatorRwW << CI_SCHED_CFG_RW_W_SHIFT) |
8380aeed3e9SJustin Hibbits (DEFAULT_initiatorBmanW << CI_SCHED_CFG_BMAN_W_SHIFT)));
8390aeed3e9SJustin Hibbits
8400aeed3e9SJustin Hibbits /* HID settings */
8410aeed3e9SJustin Hibbits if ((revInfo.majorRev == 1) && (revInfo.minorRev == 0))
8420aeed3e9SJustin Hibbits /* offset 0x0bf0 */
8430aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->res23[144], 0x3);
8440aeed3e9SJustin Hibbits else
8450aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->res23[144], 0x0);
8460aeed3e9SJustin Hibbits
8470aeed3e9SJustin Hibbits for(i=0;i<DPAA_MAX_NUM_OF_DC_PORTALS;i++)
8480aeed3e9SJustin Hibbits {
8490aeed3e9SJustin Hibbits if(p_Qm->p_QmDriverParams->dcPortalsParams[i].sendToSw)
8500aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->dcpConfRegs[i].cfg,
8510aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams->dcPortalsParams[i].swPortalId);
8520aeed3e9SJustin Hibbits else
8530aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->dcpConfRegs[i].cfg, QM_DCP_CFG_ED);
8540aeed3e9SJustin Hibbits }
8550aeed3e9SJustin Hibbits
8560aeed3e9SJustin Hibbits #ifdef QMAN_WQ_CS_CFG_ERRATA_QMAN4
8570aeed3e9SJustin Hibbits {
8580aeed3e9SJustin Hibbits t_QmRevisionInfo revInfo;
8590aeed3e9SJustin Hibbits QmGetRevision(p_Qm, &revInfo);
8600aeed3e9SJustin Hibbits if ((revInfo.majorRev == 1) && (revInfo.minorRev == 0))
8610aeed3e9SJustin Hibbits {
8620aeed3e9SJustin Hibbits QmSetWqScheduling(p_Qm, e_QM_WQ_SW_PORTALS,0,1,1,1,1,1,1);
8630aeed3e9SJustin Hibbits QmSetWqScheduling(p_Qm, e_QM_WQ_POOLS,0,1,1,1,1,1,1);
8640aeed3e9SJustin Hibbits QmSetWqScheduling(p_Qm, e_QM_WQ_DCP0,0,1,1,1,1,1,1);
8650aeed3e9SJustin Hibbits QmSetWqScheduling(p_Qm, e_QM_WQ_DCP1,0,1,1,1,1,1,1);
8660aeed3e9SJustin Hibbits QmSetWqScheduling(p_Qm, e_QM_WQ_DCP2,0,1,1,1,1,1,1);
8670aeed3e9SJustin Hibbits QmSetWqScheduling(p_Qm, e_QM_WQ_DCP3,0,1,1,1,1,1,1);
8680aeed3e9SJustin Hibbits }
8690aeed3e9SJustin Hibbits }
8700aeed3e9SJustin Hibbits #endif /* QMAN_WQ_CS_CFG_ERRATA_QMAN4 */
8710aeed3e9SJustin Hibbits
8720aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->err_isr, p_Qm->exceptions);
8730aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->err_ier, p_Qm->exceptions);
8740aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->err_isdr, 0x0);
8750aeed3e9SJustin Hibbits if (p_Qm->errIrq != NO_IRQ)
8760aeed3e9SJustin Hibbits {
8770aeed3e9SJustin Hibbits XX_SetIntr(p_Qm->errIrq, QM_ErrorIsr, p_Qm);
8780aeed3e9SJustin Hibbits XX_EnableIntr(p_Qm->errIrq);
8790aeed3e9SJustin Hibbits }
8800aeed3e9SJustin Hibbits if ((err = XX_IpcRegisterMsgHandler(p_Qm->moduleName, QmHandleIpcMsgCB, p_Qm, QM_IPC_MAX_REPLY_SIZE)) != E_OK)
8810aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, err, NO_MSG);
8820aeed3e9SJustin Hibbits }
8830aeed3e9SJustin Hibbits else /* guest mode */
8840aeed3e9SJustin Hibbits {
8850aeed3e9SJustin Hibbits char masterModuleName[MODULE_NAME_SIZE];
8860aeed3e9SJustin Hibbits
8870aeed3e9SJustin Hibbits memset(masterModuleName, 0, MODULE_NAME_SIZE);
8880aeed3e9SJustin Hibbits if(Sprint (masterModuleName, "QM_0_%d", NCSW_MASTER_ID) != (NCSW_MASTER_ID<10 ? 6:7))
8890aeed3e9SJustin Hibbits {
8900aeed3e9SJustin Hibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
8910aeed3e9SJustin Hibbits }
8920aeed3e9SJustin Hibbits
8930aeed3e9SJustin Hibbits p_Qm->h_Session = XX_IpcInitSession(masterModuleName, p_Qm->moduleName);
8940aeed3e9SJustin Hibbits if (p_Qm->h_Session)
8950aeed3e9SJustin Hibbits {
8960aeed3e9SJustin Hibbits t_QmIpcMsg msg;
8970aeed3e9SJustin Hibbits uint8_t isMasterAlive = 0;
8980aeed3e9SJustin Hibbits t_QmIpcReply reply;
8990aeed3e9SJustin Hibbits uint32_t replyLength;
9000aeed3e9SJustin Hibbits
9010aeed3e9SJustin Hibbits memset(&msg, 0, sizeof(t_QmIpcMsg));
9020aeed3e9SJustin Hibbits memset(&reply, 0, sizeof(t_QmIpcReply));
9030aeed3e9SJustin Hibbits msg.msgId = QM_MASTER_IS_ALIVE;
9040aeed3e9SJustin Hibbits do
9050aeed3e9SJustin Hibbits {
9060aeed3e9SJustin Hibbits blockingFlag = TRUE;
9070aeed3e9SJustin Hibbits replyLength = sizeof(uint32_t) + sizeof(uint8_t);
9080aeed3e9SJustin Hibbits if ((err = XX_IpcSendMessage(p_Qm->h_Session,
9090aeed3e9SJustin Hibbits (uint8_t*)&msg,
9100aeed3e9SJustin Hibbits sizeof(msg.msgId),
9110aeed3e9SJustin Hibbits (uint8_t*)&reply,
9120aeed3e9SJustin Hibbits &replyLength,
9130aeed3e9SJustin Hibbits QmIpcMsgCompletionCB,
9140aeed3e9SJustin Hibbits p_Qm)) != E_OK)
9150aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, err, NO_MSG);
9160aeed3e9SJustin Hibbits while(blockingFlag) ;
9170aeed3e9SJustin Hibbits if(replyLength != (sizeof(uint32_t) + sizeof(uint8_t)))
9180aeed3e9SJustin Hibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
9190aeed3e9SJustin Hibbits isMasterAlive = *(uint8_t*)(reply.replyBody);
9200aeed3e9SJustin Hibbits } while (!isMasterAlive);
9210aeed3e9SJustin Hibbits }
9220aeed3e9SJustin Hibbits }
9230aeed3e9SJustin Hibbits
9240aeed3e9SJustin Hibbits p_Qm->lock = XX_InitSpinlock();
9250aeed3e9SJustin Hibbits XX_Free(p_Qm->p_QmDriverParams);
9260aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams = NULL;
9270aeed3e9SJustin Hibbits
9280aeed3e9SJustin Hibbits return E_OK;
9290aeed3e9SJustin Hibbits }
9300aeed3e9SJustin Hibbits
QM_Free(t_Handle h_Qm)9310aeed3e9SJustin Hibbits t_Error QM_Free(t_Handle h_Qm)
9320aeed3e9SJustin Hibbits {
9330aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm *)h_Qm;
9340aeed3e9SJustin Hibbits
9350aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);
9360aeed3e9SJustin Hibbits
9370aeed3e9SJustin Hibbits if (p_Qm->lock)
9380aeed3e9SJustin Hibbits XX_FreeSpinlock(p_Qm->lock);
9390aeed3e9SJustin Hibbits
9400aeed3e9SJustin Hibbits if (p_Qm->guestId == NCSW_MASTER_ID)
9410aeed3e9SJustin Hibbits {
9420aeed3e9SJustin Hibbits XX_IpcUnregisterMsgHandler(p_Qm->moduleName);
9430aeed3e9SJustin Hibbits if (p_Qm->errIrq != NO_IRQ)
9440aeed3e9SJustin Hibbits {
9450aeed3e9SJustin Hibbits XX_DisableIntr(p_Qm->errIrq);
9460aeed3e9SJustin Hibbits XX_FreeIntr(p_Qm->errIrq);
9470aeed3e9SJustin Hibbits }
9480aeed3e9SJustin Hibbits }
9490aeed3e9SJustin Hibbits FreeInitResources(p_Qm);
9500aeed3e9SJustin Hibbits
9510aeed3e9SJustin Hibbits if (p_Qm->p_QmDriverParams)
9520aeed3e9SJustin Hibbits XX_Free(p_Qm->p_QmDriverParams);
9530aeed3e9SJustin Hibbits
9540aeed3e9SJustin Hibbits XX_Free(p_Qm);
9550aeed3e9SJustin Hibbits
9560aeed3e9SJustin Hibbits return E_OK;
9570aeed3e9SJustin Hibbits }
9580aeed3e9SJustin Hibbits
QM_ConfigRTFramesDepth(t_Handle h_Qm,uint32_t rtFramesDepth)9590aeed3e9SJustin Hibbits t_Error QM_ConfigRTFramesDepth(t_Handle h_Qm, uint32_t rtFramesDepth)
9600aeed3e9SJustin Hibbits {
9610aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm *)h_Qm;
9620aeed3e9SJustin Hibbits
9630aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);
9640aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm->p_QmDriverParams, E_INVALID_HANDLE);
9650aeed3e9SJustin Hibbits
9660aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams->rtFramesDepth = rtFramesDepth;
9670aeed3e9SJustin Hibbits
9680aeed3e9SJustin Hibbits return E_OK;
9690aeed3e9SJustin Hibbits }
9700aeed3e9SJustin Hibbits
QM_ConfigPfdrThreshold(t_Handle h_Qm,uint32_t threshold)9710aeed3e9SJustin Hibbits t_Error QM_ConfigPfdrThreshold(t_Handle h_Qm, uint32_t threshold)
9720aeed3e9SJustin Hibbits {
9730aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm *)h_Qm;
9740aeed3e9SJustin Hibbits
9750aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);
9760aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm->p_QmDriverParams, E_INVALID_HANDLE);
9770aeed3e9SJustin Hibbits
9780aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams->pfdrThreshold = threshold;
9790aeed3e9SJustin Hibbits
9800aeed3e9SJustin Hibbits return E_OK;
9810aeed3e9SJustin Hibbits }
9820aeed3e9SJustin Hibbits
QM_ConfigSfdrReservationThreshold(t_Handle h_Qm,uint32_t threshold)9830aeed3e9SJustin Hibbits t_Error QM_ConfigSfdrReservationThreshold(t_Handle h_Qm, uint32_t threshold)
9840aeed3e9SJustin Hibbits {
9850aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm *)h_Qm;
9860aeed3e9SJustin Hibbits
9870aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);
9880aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm->p_QmDriverParams, E_INVALID_HANDLE);
9890aeed3e9SJustin Hibbits
9900aeed3e9SJustin Hibbits p_Qm->p_QmDriverParams->sfdrThreshold = threshold;
9910aeed3e9SJustin Hibbits
9920aeed3e9SJustin Hibbits return E_OK;
9930aeed3e9SJustin Hibbits }
9940aeed3e9SJustin Hibbits
9950aeed3e9SJustin Hibbits
QM_ConfigErrorRejectionNotificationDest(t_Handle h_Qm,e_DpaaDcPortal id,t_QmDcPortalParams * p_Params)9960aeed3e9SJustin Hibbits t_Error QM_ConfigErrorRejectionNotificationDest(t_Handle h_Qm, e_DpaaDcPortal id, t_QmDcPortalParams *p_Params)
9970aeed3e9SJustin Hibbits {
9980aeed3e9SJustin Hibbits UNUSED(h_Qm); UNUSED(id); UNUSED(p_Params);
9990aeed3e9SJustin Hibbits
10000aeed3e9SJustin Hibbits RETURN_ERROR(INFO, E_NOT_SUPPORTED, ("Only default ERN destination available."));
10010aeed3e9SJustin Hibbits }
10020aeed3e9SJustin Hibbits
10030aeed3e9SJustin Hibbits
QM_Poll(t_Handle h_Qm,e_QmPortalPollSource source)10040aeed3e9SJustin Hibbits t_Error QM_Poll(t_Handle h_Qm, e_QmPortalPollSource source)
10050aeed3e9SJustin Hibbits {
10060aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm *)h_Qm;
10070aeed3e9SJustin Hibbits t_QmPortal *p_QmPortal;
10080aeed3e9SJustin Hibbits
10090aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);
10100aeed3e9SJustin Hibbits p_QmPortal = QmGetPortalHandle(p_Qm);
10110aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_QmPortal, E_INVALID_HANDLE);
10120aeed3e9SJustin Hibbits
10130aeed3e9SJustin Hibbits return QM_PORTAL_Poll(p_QmPortal, source);
10140aeed3e9SJustin Hibbits }
10150aeed3e9SJustin Hibbits
QM_GetCounter(t_Handle h_Qm,e_QmCounters counter)10160aeed3e9SJustin Hibbits uint32_t QM_GetCounter(t_Handle h_Qm, e_QmCounters counter)
10170aeed3e9SJustin Hibbits {
10180aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm *)h_Qm;
10190aeed3e9SJustin Hibbits
10200aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(p_Qm, E_INVALID_HANDLE, 0);
10210aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_VALUE(!p_Qm->p_QmDriverParams, E_INVALID_STATE, 0);
10220aeed3e9SJustin Hibbits
10230aeed3e9SJustin Hibbits switch(counter)
10240aeed3e9SJustin Hibbits {
10250aeed3e9SJustin Hibbits case(e_QM_COUNTERS_SFDR_IN_USE):
10260aeed3e9SJustin Hibbits return QmGetCounter(p_Qm, e_QM_IM_COUNTERS_SFDR_IN_USE);
10270aeed3e9SJustin Hibbits case(e_QM_COUNTERS_PFDR_IN_USE):
10280aeed3e9SJustin Hibbits return QmGetCounter(p_Qm, e_QM_IM_COUNTERS_PFDR_IN_USE);
10290aeed3e9SJustin Hibbits case(e_QM_COUNTERS_PFDR_FREE_POOL):
10300aeed3e9SJustin Hibbits return QmGetCounter(p_Qm, e_QM_IM_COUNTERS_PFDR_FREE_POOL);
10310aeed3e9SJustin Hibbits default:
10320aeed3e9SJustin Hibbits break;
10330aeed3e9SJustin Hibbits }
10340aeed3e9SJustin Hibbits /* should never get here */
10350aeed3e9SJustin Hibbits ASSERT_COND(FALSE);
10360aeed3e9SJustin Hibbits
10370aeed3e9SJustin Hibbits return 0;
10380aeed3e9SJustin Hibbits }
10390aeed3e9SJustin Hibbits
QM_ErrorIsr(t_Handle h_Qm)10400aeed3e9SJustin Hibbits void QM_ErrorIsr(t_Handle h_Qm)
10410aeed3e9SJustin Hibbits {
10420aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm *)h_Qm;
10430aeed3e9SJustin Hibbits uint32_t tmpReg;
10440aeed3e9SJustin Hibbits
10450aeed3e9SJustin Hibbits SANITY_CHECK_RETURN(p_Qm, E_INVALID_HANDLE);
10460aeed3e9SJustin Hibbits
10470aeed3e9SJustin Hibbits if (p_Qm->guestId != NCSW_MASTER_ID)
10480aeed3e9SJustin Hibbits {
10490aeed3e9SJustin Hibbits REPORT_ERROR(WARNING, E_INVALID_OPERATION, ("Master Only"));
10500aeed3e9SJustin Hibbits return;
10510aeed3e9SJustin Hibbits }
10520aeed3e9SJustin Hibbits
10530aeed3e9SJustin Hibbits tmpReg = GET_UINT32(p_Qm->p_QmRegs->err_isr);
10540aeed3e9SJustin Hibbits tmpReg &= GET_UINT32(p_Qm->p_QmRegs->err_ier);
10550aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->err_isr, tmpReg);
10560aeed3e9SJustin Hibbits
10570aeed3e9SJustin Hibbits if (tmpReg & QM_EX_CORENET_INITIATOR_DATA)
10580aeed3e9SJustin Hibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_CORENET_INITIATOR_DATA);
10590aeed3e9SJustin Hibbits if (tmpReg & QM_EX_CORENET_TARGET_DATA)
10600aeed3e9SJustin Hibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_CORENET_TARGET_DATA);
10610aeed3e9SJustin Hibbits if (tmpReg & QM_EX_CORENET_INVALID_TARGET_TRANSACTION)
10620aeed3e9SJustin Hibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_CORENET_INVALID_TARGET_TRANSACTION);
10630aeed3e9SJustin Hibbits if (tmpReg & QM_EX_PFDR_THRESHOLD)
10640aeed3e9SJustin Hibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_PFDR_THRESHOLD);
10650aeed3e9SJustin Hibbits if (tmpReg & QM_EX_MULTI_ECC)
10660aeed3e9SJustin Hibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_MULTI_ECC);
10670aeed3e9SJustin Hibbits if (tmpReg & QM_EX_SINGLE_ECC)
10680aeed3e9SJustin Hibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_SINGLE_ECC);
10690aeed3e9SJustin Hibbits if (tmpReg & QM_EX_PFDR_ENQUEUE_BLOCKED)
10700aeed3e9SJustin Hibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_PFDR_ENQUEUE_BLOCKED);
10710aeed3e9SJustin Hibbits if (tmpReg & QM_EX_INVALID_COMMAND)
10720aeed3e9SJustin Hibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_INVALID_COMMAND);
10730aeed3e9SJustin Hibbits if (tmpReg & QM_EX_DEQUEUE_DCP)
10740aeed3e9SJustin Hibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_DEQUEUE_DCP);
10750aeed3e9SJustin Hibbits if (tmpReg & QM_EX_DEQUEUE_FQ)
10760aeed3e9SJustin Hibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_DEQUEUE_FQ);
10770aeed3e9SJustin Hibbits if (tmpReg & QM_EX_DEQUEUE_SOURCE)
10780aeed3e9SJustin Hibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_DEQUEUE_SOURCE);
10790aeed3e9SJustin Hibbits if (tmpReg & QM_EX_DEQUEUE_QUEUE)
10800aeed3e9SJustin Hibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_DEQUEUE_QUEUE);
10810aeed3e9SJustin Hibbits if (tmpReg & QM_EX_ENQUEUE_OVERFLOW)
10820aeed3e9SJustin Hibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_ENQUEUE_OVERFLOW);
10830aeed3e9SJustin Hibbits if (tmpReg & QM_EX_ENQUEUE_STATE)
10840aeed3e9SJustin Hibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_ENQUEUE_STATE);
10850aeed3e9SJustin Hibbits if (tmpReg & QM_EX_ENQUEUE_CHANNEL)
10860aeed3e9SJustin Hibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_ENQUEUE_CHANNEL);
10870aeed3e9SJustin Hibbits if (tmpReg & QM_EX_ENQUEUE_QUEUE)
10880aeed3e9SJustin Hibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_ENQUEUE_QUEUE);
10890aeed3e9SJustin Hibbits }
10900aeed3e9SJustin Hibbits
QM_SetException(t_Handle h_Qm,e_QmExceptions exception,bool enable)10910aeed3e9SJustin Hibbits t_Error QM_SetException(t_Handle h_Qm, e_QmExceptions exception, bool enable)
10920aeed3e9SJustin Hibbits {
10930aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm*)h_Qm;
10940aeed3e9SJustin Hibbits t_Error err = E_OK;
10950aeed3e9SJustin Hibbits
10960aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);
10970aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Qm->p_QmDriverParams, E_INVALID_HANDLE);
10980aeed3e9SJustin Hibbits
10990aeed3e9SJustin Hibbits if ((err = SetException(p_Qm, exception, enable)) != E_OK)
11000aeed3e9SJustin Hibbits RETURN_ERROR(MINOR, err, NO_MSG);
11010aeed3e9SJustin Hibbits
11020aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->err_ier, p_Qm->exceptions);
11030aeed3e9SJustin Hibbits
11040aeed3e9SJustin Hibbits return E_OK;
11050aeed3e9SJustin Hibbits }
11060aeed3e9SJustin Hibbits
QM_GetRevision(t_Handle h_Qm,t_QmRevisionInfo * p_QmRevisionInfo)11070aeed3e9SJustin Hibbits t_Error QM_GetRevision(t_Handle h_Qm, t_QmRevisionInfo *p_QmRevisionInfo)
11080aeed3e9SJustin Hibbits {
11090aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm*)h_Qm;
11100aeed3e9SJustin Hibbits
11110aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);
11120aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_QmRevisionInfo, E_NULL_POINTER);
11130aeed3e9SJustin Hibbits
11140aeed3e9SJustin Hibbits return QmGetRevision(p_Qm, p_QmRevisionInfo);
11150aeed3e9SJustin Hibbits }
11160aeed3e9SJustin Hibbits
QM_ReserveQueues(t_Handle h_Qm,t_QmRsrvFqrParams * p_QmFqrParams,uint32_t * p_BaseFqid)11170aeed3e9SJustin Hibbits t_Error QM_ReserveQueues(t_Handle h_Qm, t_QmRsrvFqrParams *p_QmFqrParams, uint32_t *p_BaseFqid)
11180aeed3e9SJustin Hibbits {
11190aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm*)h_Qm;
11200aeed3e9SJustin Hibbits
11210aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);
11220aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Qm->p_QmDriverParams, E_INVALID_HANDLE);
11230aeed3e9SJustin Hibbits
11240aeed3e9SJustin Hibbits *p_BaseFqid = ReserveFqids(p_Qm,
11250aeed3e9SJustin Hibbits (uint32_t)((p_QmFqrParams->useForce && !p_QmFqrParams->numOfFqids) ?
11260aeed3e9SJustin Hibbits 1 : p_QmFqrParams->numOfFqids),
11270aeed3e9SJustin Hibbits p_QmFqrParams->qs.nonFrcQs.align,
11280aeed3e9SJustin Hibbits p_QmFqrParams->useForce,
11290aeed3e9SJustin Hibbits p_QmFqrParams->qs.frcQ.fqid);
11300aeed3e9SJustin Hibbits if (*p_BaseFqid == ILLEGAL_BASE)
11310aeed3e9SJustin Hibbits RETURN_ERROR(CRITICAL,E_INVALID_STATE,("can't allocate a fqid"));
11320aeed3e9SJustin Hibbits
11330aeed3e9SJustin Hibbits return E_OK;
11340aeed3e9SJustin Hibbits }
11350aeed3e9SJustin Hibbits
QM_GetErrorInformation(t_Handle h_Qm,t_QmErrorInfo * p_errInfo)11360aeed3e9SJustin Hibbits t_Error QM_GetErrorInformation(t_Handle h_Qm, t_QmErrorInfo *p_errInfo)
11370aeed3e9SJustin Hibbits {
11380aeed3e9SJustin Hibbits uint32_t ecsr, ecir;
11390aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm*)h_Qm;
11400aeed3e9SJustin Hibbits t_Error err = E_OK;
11410aeed3e9SJustin Hibbits
11420aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);
11430aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Qm->p_QmDriverParams, E_INVALID_HANDLE);
11440aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_errInfo, E_NULL_POINTER);
11450aeed3e9SJustin Hibbits
11460aeed3e9SJustin Hibbits ecsr = GET_UINT32(p_Qm->p_QmRegs->ecsr);
11470aeed3e9SJustin Hibbits ecir = GET_UINT32(p_Qm->p_QmRegs->ecir);
11480aeed3e9SJustin Hibbits if ((ecsr & QM_EX_MULTI_ECC) ||
11490aeed3e9SJustin Hibbits (ecsr & QM_EX_SINGLE_ECC))
11500aeed3e9SJustin Hibbits {
11510aeed3e9SJustin Hibbits err = E_NOT_SUPPORTED;
11520aeed3e9SJustin Hibbits REPORT_ERROR(INFO, E_NOT_SUPPORTED, ("single and multi ecc, use QM_DumpRegs"));
11530aeed3e9SJustin Hibbits }
11540aeed3e9SJustin Hibbits if ((ecsr & QM_EX_ENQUEUE_QUEUE) ||
11550aeed3e9SJustin Hibbits (ecsr & QM_EX_ENQUEUE_STATE) ||
11560aeed3e9SJustin Hibbits (ecsr & QM_EX_ENQUEUE_OVERFLOW) ||
11570aeed3e9SJustin Hibbits (ecsr & QM_EX_DEQUEUE_DCP) ||
11580aeed3e9SJustin Hibbits (ecsr & QM_EX_DEQUEUE_FQ) ||
11590aeed3e9SJustin Hibbits (ecsr & QM_EX_DEQUEUE_QUEUE) ||
11600aeed3e9SJustin Hibbits (ecsr & QM_EX_DEQUEUE_SOURCE) ||
11610aeed3e9SJustin Hibbits (ecsr & QM_EX_INVALID_COMMAND))
11620aeed3e9SJustin Hibbits {
11630aeed3e9SJustin Hibbits p_errInfo->portalValid = TRUE;
11640aeed3e9SJustin Hibbits p_errInfo->hwPortal = (bool)(ecir & ECIR_PORTAL_TYPE);
11650aeed3e9SJustin Hibbits if (p_errInfo->hwPortal)
11660aeed3e9SJustin Hibbits p_errInfo->dcpId = (e_DpaaDcPortal)((ecir & ECIR_PORTAL_MASK) >> ECIR_PORTAL_SHIFT);
11670aeed3e9SJustin Hibbits else
11680aeed3e9SJustin Hibbits p_errInfo->swPortalId = (e_DpaaSwPortal)((ecir & ECIR_PORTAL_MASK) >> ECIR_PORTAL_SHIFT);
11690aeed3e9SJustin Hibbits }
11700aeed3e9SJustin Hibbits
11710aeed3e9SJustin Hibbits if ((ecsr & QM_EX_ENQUEUE_QUEUE) ||
11720aeed3e9SJustin Hibbits (ecsr & QM_EX_ENQUEUE_STATE) ||
11730aeed3e9SJustin Hibbits (ecsr & QM_EX_ENQUEUE_OVERFLOW) ||
11740aeed3e9SJustin Hibbits (ecsr & QM_EX_ENQUEUE_CHANNEL) ||
11750aeed3e9SJustin Hibbits (ecsr & QM_EX_DEQUEUE_QUEUE) ||
11760aeed3e9SJustin Hibbits (ecsr & QM_EX_DEQUEUE_FQ))
11770aeed3e9SJustin Hibbits {
11780aeed3e9SJustin Hibbits p_errInfo->fqidValid = TRUE;
11790aeed3e9SJustin Hibbits p_errInfo->fqid = ((ecir & ECIR_FQID_MASK) >> ECIR_FQID_SHIFT);
11800aeed3e9SJustin Hibbits }
11810aeed3e9SJustin Hibbits
11820aeed3e9SJustin Hibbits WRITE_UINT32(p_Qm->p_QmRegs->ecsr, ecsr);
11830aeed3e9SJustin Hibbits
11840aeed3e9SJustin Hibbits return ERROR_CODE(err);
11850aeed3e9SJustin Hibbits }
11860aeed3e9SJustin Hibbits
11870aeed3e9SJustin Hibbits #if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
QM_DumpRegs(t_Handle h_Qm)11880aeed3e9SJustin Hibbits t_Error QM_DumpRegs(t_Handle h_Qm)
11890aeed3e9SJustin Hibbits {
11900aeed3e9SJustin Hibbits t_Qm *p_Qm = (t_Qm *)h_Qm;
11910aeed3e9SJustin Hibbits uint8_t i = 0;
11920aeed3e9SJustin Hibbits
11930aeed3e9SJustin Hibbits DECLARE_DUMP;
11940aeed3e9SJustin Hibbits
11950aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE);
11960aeed3e9SJustin Hibbits SANITY_CHECK_RETURN_ERROR(!p_Qm->p_QmDriverParams, E_INVALID_STATE);
11970aeed3e9SJustin Hibbits
11980aeed3e9SJustin Hibbits DUMP_SUBTITLE(("\n"));
11990aeed3e9SJustin Hibbits DUMP_TITLE(p_Qm->p_QmRegs, ("QmRegs Regs"));
12000aeed3e9SJustin Hibbits
12010aeed3e9SJustin Hibbits DUMP_SUBSTRUCT_ARRAY(i, QM_NUM_OF_SWP)
12020aeed3e9SJustin Hibbits {
12030aeed3e9SJustin Hibbits DUMP_VAR(&p_Qm->p_QmRegs->swpConfRegs[i], lio_cfg);
12040aeed3e9SJustin Hibbits DUMP_VAR(&p_Qm->p_QmRegs->swpConfRegs[i], io_cfg);
12050aeed3e9SJustin Hibbits DUMP_VAR(&p_Qm->p_QmRegs->swpConfRegs[i], dd_cfg);
12060aeed3e9SJustin Hibbits }
12070aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, qman_dd_cfg);
12080aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, qcsp_dd_ihrsr);
12090aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, qcsp_dd_ihrfr);
12100aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, qcsp_dd_hasr);
12110aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, dcp_dd_ihrsr);
12120aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, dcp_dd_ihrfr);
12130aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, dcp_dd_hasr);
12140aeed3e9SJustin Hibbits DUMP_SUBSTRUCT_ARRAY(i, QM_NUM_OF_DCP)
12150aeed3e9SJustin Hibbits {
12160aeed3e9SJustin Hibbits DUMP_VAR(&p_Qm->p_QmRegs->dcpConfRegs[i], cfg);
12170aeed3e9SJustin Hibbits DUMP_VAR(&p_Qm->p_QmRegs->dcpConfRegs[i], dd_cfg);
12180aeed3e9SJustin Hibbits DUMP_VAR(&p_Qm->p_QmRegs->dcpConfRegs[i], dlm_cfg);
12190aeed3e9SJustin Hibbits DUMP_VAR(&p_Qm->p_QmRegs->dcpConfRegs[i], dlm_avg);
12200aeed3e9SJustin Hibbits }
12210aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, pfdr_fpc);
12220aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, pfdr_fp_head);
12230aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, pfdr_fp_tail);
12240aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, pfdr_fp_lwit);
12250aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, pfdr_cfg);
12260aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, sfdr_cfg);
12270aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, sfdr_in_use);
12280aeed3e9SJustin Hibbits DUMP_ARR(p_Qm->p_QmRegs, wq_cs_cfg);
12290aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, wq_def_enq_wqid);
12300aeed3e9SJustin Hibbits DUMP_ARR(p_Qm->p_QmRegs, wq_sc_dd_cfg);
12310aeed3e9SJustin Hibbits DUMP_ARR(p_Qm->p_QmRegs, wq_pc_dd_cs_cfg);
12320aeed3e9SJustin Hibbits DUMP_ARR(p_Qm->p_QmRegs, wq_dc0_dd_cs_cfg);
12330aeed3e9SJustin Hibbits DUMP_ARR(p_Qm->p_QmRegs, wq_dc1_dd_cs_cfg);
12340aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, wq_dc2_dd_cs_cfg);
12350aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, wq_dc3_dd_cs_cfg);
12360aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, cm_cfg);
12370aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, ecsr);
12380aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, ecir);
12390aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, eadr);
12400aeed3e9SJustin Hibbits DUMP_ARR(p_Qm->p_QmRegs, edata);
12410aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, sbet);
12420aeed3e9SJustin Hibbits DUMP_ARR(p_Qm->p_QmRegs, sbec);
12430aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, mcr);
12440aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, mcp0);
12450aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, mcp1);
12460aeed3e9SJustin Hibbits DUMP_ARR(p_Qm->p_QmRegs, mr);
12470aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, idle_stat);
12480aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, ip_rev_1);
12490aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, ip_rev_2);
12500aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, fqd_bare);
12510aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, fqd_bar);
12520aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, fqd_ar);
12530aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, pfdr_bare);
12540aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, pfdr_bar);
12550aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, pfdr_ar);
12560aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, qcsp_bare);
12570aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, qcsp_bar);
12580aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, ci_sched_cfg);
12590aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, srcidr);
12600aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, liodnr);
12610aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, ci_rlm_cfg);
12620aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, ci_rlm_avg);
12630aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, err_isr);
12640aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, err_ier);
12650aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, err_isdr);
12660aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, err_iir);
12670aeed3e9SJustin Hibbits DUMP_VAR(p_Qm->p_QmRegs, err_her);
12680aeed3e9SJustin Hibbits
12690aeed3e9SJustin Hibbits return E_OK;
12700aeed3e9SJustin Hibbits }
12710aeed3e9SJustin Hibbits #endif /* (defined(DEBUG_ERRORS) && ... */
1272