xref: /freebsd/sys/contrib/ncsw/Peripherals/QM/qm.c (revision e99c4e4d6449626eda1934a2bdb80ab80621c8a6)
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