1296177Sjhibbits/****************************************************************************** 2296177Sjhibbits 3296177Sjhibbits � 1995-2003, 2004, 2005-2011 Freescale Semiconductor, Inc. 4296177Sjhibbits All rights reserved. 5296177Sjhibbits 6296177Sjhibbits This is proprietary source code of Freescale Semiconductor Inc., 7296177Sjhibbits and its use is subject to the NetComm Device Drivers EULA. 8296177Sjhibbits The copyright notice above does not evidence any actual or intended 9296177Sjhibbits publication of such source code. 10296177Sjhibbits 11296177Sjhibbits ALTERNATIVELY, redistribution and use in source and binary forms, with 12296177Sjhibbits or without modification, are permitted provided that the following 13296177Sjhibbits conditions are met: 14296177Sjhibbits * Redistributions of source code must retain the above copyright 15296177Sjhibbits notice, this list of conditions and the following disclaimer. 16296177Sjhibbits * Redistributions in binary form must reproduce the above copyright 17296177Sjhibbits notice, this list of conditions and the following disclaimer in the 18296177Sjhibbits documentation and/or other materials provided with the distribution. 19296177Sjhibbits * Neither the name of Freescale Semiconductor nor the 20296177Sjhibbits names of its contributors may be used to endorse or promote products 21296177Sjhibbits derived from this software without specific prior written permission. 22296177Sjhibbits 23296177Sjhibbits THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY 24296177Sjhibbits EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 25296177Sjhibbits WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 26296177Sjhibbits DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY 27296177Sjhibbits DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 28296177Sjhibbits (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 29296177Sjhibbits LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 30296177Sjhibbits ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31296177Sjhibbits (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 32296177Sjhibbits SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33296177Sjhibbits * 34296177Sjhibbits 35296177Sjhibbits **************************************************************************/ 36296177Sjhibbits/****************************************************************************** 37296177Sjhibbits @File qm.c 38296177Sjhibbits 39296177Sjhibbits @Description QM & Portal implementation 40296177Sjhibbits*//***************************************************************************/ 41296177Sjhibbits#include "error_ext.h" 42296177Sjhibbits#include "std_ext.h" 43296177Sjhibbits#include "string_ext.h" 44296177Sjhibbits#include "sprint_ext.h" 45296177Sjhibbits#include "mm_ext.h" 46296177Sjhibbits#include "core_ext.h" 47296177Sjhibbits#include "debug_ext.h" 48296177Sjhibbits 49296177Sjhibbits#include "qm.h" 50296177Sjhibbits 51296177Sjhibbits 52296177Sjhibbitsstatic volatile bool blockingFlag = FALSE; 53296177Sjhibbitsstatic void QmIpcMsgCompletionCB(t_Handle h_Module, 54296177Sjhibbits uint8_t *p_Msg, 55296177Sjhibbits uint8_t *p_Reply, 56296177Sjhibbits uint32_t replyLength, 57296177Sjhibbits t_Error status) 58296177Sjhibbits{ 59296177Sjhibbits SANITY_CHECK_RETURN(h_Module, E_INVALID_HANDLE); 60296177Sjhibbits 61296177Sjhibbits UNUSED(p_Msg);UNUSED(p_Reply);UNUSED(replyLength);UNUSED(status);UNUSED(h_Module); 62296177Sjhibbits blockingFlag = FALSE; 63296177Sjhibbits} 64296177Sjhibbits 65296177Sjhibbitsstatic t_Error QmHandleIpcMsgCB(t_Handle h_Qm, 66296177Sjhibbits uint8_t *p_Msg, 67296177Sjhibbits uint32_t msgLength, 68296177Sjhibbits uint8_t *p_Reply, 69296177Sjhibbits uint32_t *p_ReplyLength) 70296177Sjhibbits{ 71296177Sjhibbits t_Qm *p_Qm = (t_Qm*)h_Qm; 72296177Sjhibbits t_QmIpcMsg *p_IpcMsg = (t_QmIpcMsg*)p_Msg; 73296177Sjhibbits t_QmIpcReply *p_IpcReply = (t_QmIpcReply *)p_Reply; 74296177Sjhibbits 75296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE); 76296177Sjhibbits SANITY_CHECK_RETURN_ERROR((msgLength >= sizeof(uint32_t)), E_INVALID_VALUE); 77296177Sjhibbits 78296177Sjhibbits#ifdef DISABLE_SANITY_CHECKS 79296177Sjhibbits UNUSED(msgLength); 80296177Sjhibbits#endif /* DISABLE_SANITY_CHECKS */ 81296177Sjhibbits 82296177Sjhibbits ASSERT_COND(p_IpcMsg); 83296177Sjhibbits 84296177Sjhibbits memset(p_IpcReply, 0, (sizeof(uint8_t) * QM_IPC_MAX_REPLY_SIZE)); 85296177Sjhibbits *p_ReplyLength = 0; 86296177Sjhibbits 87296177Sjhibbits switch(p_IpcMsg->msgId) 88296177Sjhibbits { 89296177Sjhibbits case (QM_MASTER_IS_ALIVE): 90296177Sjhibbits *(uint8_t*)p_IpcReply->replyBody = 1; 91296177Sjhibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t); 92296177Sjhibbits break; 93296177Sjhibbits case (QM_FORCE_FQID): 94296177Sjhibbits { 95296177Sjhibbits t_QmIpcFqidParams ipcFqid; 96296177Sjhibbits uint32_t fqid; 97296177Sjhibbits 98296177Sjhibbits memcpy((uint8_t*)&ipcFqid, p_IpcMsg->msgBody, sizeof(t_QmIpcFqidParams)); 99296177Sjhibbits fqid = QmFqidGet(p_Qm, ipcFqid.size, 1, TRUE, ipcFqid.fqid); 100296177Sjhibbits memcpy(p_IpcReply->replyBody, (uint8_t*)&fqid, sizeof(uint32_t)); 101296177Sjhibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t); 102296177Sjhibbits break; 103296177Sjhibbits } 104296177Sjhibbits case (QM_PUT_FQID): 105296177Sjhibbits { 106296177Sjhibbits t_Error err; 107296177Sjhibbits t_QmIpcFqidParams ipcFqid; 108296177Sjhibbits 109296177Sjhibbits memcpy((uint8_t*)&ipcFqid, p_IpcMsg->msgBody, sizeof(t_QmIpcFqidParams)); 110296177Sjhibbits if ((err = QmFqidPut(p_Qm, ipcFqid.fqid)) != E_OK) 111296177Sjhibbits REPORT_ERROR(MINOR, err, NO_MSG); 112296177Sjhibbits break; 113296177Sjhibbits } 114296177Sjhibbits case (QM_GET_COUNTER): 115296177Sjhibbits { 116296177Sjhibbits t_QmIpcGetCounter ipcCounter; 117296177Sjhibbits uint32_t count; 118296177Sjhibbits 119296177Sjhibbits memcpy((uint8_t*)&ipcCounter, p_IpcMsg->msgBody, sizeof(t_QmIpcGetCounter)); 120296177Sjhibbits count = QmGetCounter(p_Qm, (e_QmInterModuleCounters)ipcCounter.enumId); 121296177Sjhibbits memcpy(p_IpcReply->replyBody, (uint8_t*)&count, sizeof(uint32_t)); 122296177Sjhibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t); 123296177Sjhibbits break; 124296177Sjhibbits } 125296177Sjhibbits case (QM_GET_SET_PORTAL_PARAMS): 126296177Sjhibbits { 127296177Sjhibbits t_Error err; 128296177Sjhibbits t_QmIpcPortalInitParams ipcPortalInitParams; 129296177Sjhibbits t_QmInterModulePortalInitParams portalInitParams; 130296177Sjhibbits 131296177Sjhibbits memcpy((uint8_t*)&ipcPortalInitParams, p_IpcMsg->msgBody, sizeof(t_QmIpcPortalInitParams)); 132296177Sjhibbits portalInitParams.portalId = ipcPortalInitParams.portalId; 133296177Sjhibbits portalInitParams.stashDestQueue = ipcPortalInitParams.stashDestQueue; 134296177Sjhibbits portalInitParams.liodn = ipcPortalInitParams.liodn; 135296177Sjhibbits portalInitParams.dqrrLiodn = ipcPortalInitParams.dqrrLiodn; 136296177Sjhibbits portalInitParams.fdFqLiodn = ipcPortalInitParams.fdFqLiodn; 137296177Sjhibbits if ((err = QmGetSetPortalParams(p_Qm, &portalInitParams)) != E_OK) 138296177Sjhibbits REPORT_ERROR(MINOR, err, NO_MSG); 139296177Sjhibbits break; 140296177Sjhibbits } 141296177Sjhibbits case (QM_GET_REVISION): 142296177Sjhibbits { 143296177Sjhibbits t_QmRevisionInfo revInfo; 144296177Sjhibbits t_QmIpcRevisionInfo ipcRevInfo; 145296177Sjhibbits 146296177Sjhibbits p_IpcReply->error = (uint32_t)QmGetRevision(h_Qm, &revInfo); 147296177Sjhibbits ipcRevInfo.majorRev = revInfo.majorRev; 148296177Sjhibbits ipcRevInfo.minorRev = revInfo.minorRev; 149296177Sjhibbits memcpy(p_IpcReply->replyBody, (uint8_t*)&ipcRevInfo, sizeof(t_QmIpcRevisionInfo)); 150296177Sjhibbits *p_ReplyLength = sizeof(uint32_t) + sizeof(t_QmIpcRevisionInfo); 151296177Sjhibbits break; 152296177Sjhibbits } 153296177Sjhibbits default: 154296177Sjhibbits *p_ReplyLength = 0; 155296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("command not found!!!")); 156296177Sjhibbits } 157296177Sjhibbits return E_OK; 158296177Sjhibbits} 159296177Sjhibbits 160296177Sjhibbitsstatic t_Error CheckQmParameters(t_Qm *p_Qm) 161296177Sjhibbits{ 162296177Sjhibbits if ((p_Qm->p_QmDriverParams->partFqidBase + p_Qm->p_QmDriverParams->partNumOfFqids) > QM_MAX_NUM_OF_FQIDS) 163296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("partFqidBase+partNumOfFqids out of range!!!")); 164296177Sjhibbits if ((p_Qm->partCgsBase + p_Qm->partNumOfCgs) > QM_MAX_NUM_OF_CGS) 165296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("partCgsBase+partNumOfCgs out of range!!!")); 166296177Sjhibbits 167296177Sjhibbits if (p_Qm->guestId == NCSW_MASTER_ID) 168296177Sjhibbits { 169296177Sjhibbits uint64_t phyAddr; 170296177Sjhibbits 171296177Sjhibbits phyAddr = XX_VirtToPhys(UINT_TO_PTR(p_Qm->p_QmDriverParams->swPortalsBaseAddress)); 172296177Sjhibbits 173296177Sjhibbits if (phyAddr & 0x00000000001fffffLL) 174296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("swPortalsBaseAddress isn't properly aligned")); 175296177Sjhibbits if (!p_Qm->p_QmDriverParams->rtFramesDepth) 176296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("rtFramesDepth must be larger than '0'!!!")); 177296177Sjhibbits if (p_Qm->p_QmDriverParams->rtFramesDepth > ((16*MEGABYTE)*3)) 178296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("rtFramesDepth must be equal or smaller than 48MB!!!")); 179296177Sjhibbits if (!p_Qm->p_QmDriverParams->totalNumOfFqids) 180296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("totalNumOfFqids must be larger than '0'!!!")); 181296177Sjhibbits if (p_Qm->p_QmDriverParams->totalNumOfFqids > (16*MEGABYTE)) 182296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("totalNumOfFqids must be equal or smaller than 16MB!!!")); 183296177Sjhibbits if(!p_Qm->f_Exception) 184296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Exceptions callback not provided")); 185296177Sjhibbits } 186296177Sjhibbits 187296177Sjhibbits return E_OK; 188296177Sjhibbits} 189296177Sjhibbits 190296177Sjhibbitsstatic t_Error QmInitPfdr(t_Qm *p_Qm, uint32_t pfdr_start, uint32_t num) 191296177Sjhibbits{ 192296177Sjhibbits uint8_t rslt; 193296177Sjhibbits uint32_t timeout = 100000; 194296177Sjhibbits 195296177Sjhibbits ASSERT_COND(p_Qm); 196296177Sjhibbits 197296177Sjhibbits ASSERT_COND(pfdr_start && !(pfdr_start & 7) && !(num & 7) && num); 198296177Sjhibbits 199296177Sjhibbits /* Make sure te command interface is 'idle' */ 200296177Sjhibbits rslt = MCR_get_rslt(GET_UINT32(p_Qm->p_QmRegs->mcr)); 201296177Sjhibbits if (!MCR_rslt_idle(rslt)) 202296177Sjhibbits RETURN_ERROR(CRITICAL,E_INVALID_STATE,("QMAN_MCR isn't idle")); 203296177Sjhibbits 204296177Sjhibbits /* Write the MCR command params then the verb */ 205296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->mcp0, pfdr_start); 206296177Sjhibbits /* TODO: remove this - it's a workaround for a model bug that is 207296177Sjhibbits * corrected in more recent versions. We use the workaround until 208296177Sjhibbits * everyone has upgraded. */ 209296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->mcp1, (pfdr_start + num - 16)); 210296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->mcp1, (pfdr_start + num - 1)); 211296177Sjhibbits 212296177Sjhibbits CORE_MemoryBarrier(); 213296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->mcr, MCR_INIT_PFDR); 214296177Sjhibbits 215296177Sjhibbits /* Poll for the result */ 216296177Sjhibbits do { 217296177Sjhibbits XX_UDelay(1); 218296177Sjhibbits rslt = MCR_get_rslt(GET_UINT32(p_Qm->p_QmRegs->mcr)); 219296177Sjhibbits } while(!MCR_rslt_idle(rslt) && --timeout); 220296177Sjhibbits 221296177Sjhibbits if (MCR_rslt_ok(rslt)) 222296177Sjhibbits return E_OK; 223296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->mcr, 0); 224296177Sjhibbits if (!timeout) 225296177Sjhibbits RETURN_ERROR(MAJOR, E_TIMEOUT, NO_MSG); 226296177Sjhibbits if (MCR_rslt_eaccess(rslt)) 227296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, NO_MSG); 228296177Sjhibbits if (MCR_rslt_inval(rslt)) 229296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, NO_MSG); 230296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Unexpected result from MCR_INIT_PFDR: %02x\n", rslt)); 231296177Sjhibbits} 232296177Sjhibbits 233296177Sjhibbitsstatic __inline__ void QmSetWqScheduling(t_Qm *p_Qm, 234296177Sjhibbits e_QmWqClass wqClass, 235296177Sjhibbits uint8_t csElev, 236296177Sjhibbits uint8_t csw2, 237296177Sjhibbits uint8_t csw3, 238296177Sjhibbits uint8_t csw4, 239296177Sjhibbits uint8_t csw5, 240296177Sjhibbits uint8_t csw6, 241296177Sjhibbits uint8_t csw7) 242296177Sjhibbits{ 243296177Sjhibbits ASSERT_COND(p_Qm); 244296177Sjhibbits 245296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->wq_cs_cfg[wqClass], 246296177Sjhibbits (uint32_t)(((csElev & 0xff) << 24) | 247296177Sjhibbits ((csw2 & 0x7) << 20) | 248296177Sjhibbits ((csw3 & 0x7) << 16) | 249296177Sjhibbits ((csw4 & 0x7) << 12) | 250296177Sjhibbits ((csw5 & 0x7) << 8) | 251296177Sjhibbits ((csw6 & 0x7) << 4) | 252296177Sjhibbits (csw7 & 0x7))); 253296177Sjhibbits} 254296177Sjhibbits 255296177Sjhibbitsstatic uint32_t ReserveFqids(t_Qm *p_Qm, uint32_t size, uint32_t alignment, bool force, uint32_t base) 256296177Sjhibbits{ 257296177Sjhibbits uint64_t ans; 258296177Sjhibbits uint32_t intFlags; 259296177Sjhibbits 260296177Sjhibbits intFlags = XX_LockIntrSpinlock(p_Qm->lock); 261296177Sjhibbits if (force) 262296177Sjhibbits ans = MM_GetForce(p_Qm->h_FqidMm, 263296177Sjhibbits (uint64_t)base, 264296177Sjhibbits (uint64_t)size, 265296177Sjhibbits "QM FQID MEM"); 266296177Sjhibbits else 267296177Sjhibbits ans = MM_Get(p_Qm->h_FqidMm, 268296177Sjhibbits (uint64_t)size, 269296177Sjhibbits alignment, 270296177Sjhibbits "QM FQID MEM"); 271296177Sjhibbits if (ans == ILLEGAL_BASE) 272296177Sjhibbits { 273296177Sjhibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags); 274296177Sjhibbits return (uint32_t)ans; 275296177Sjhibbits } 276296177Sjhibbits base = (uint32_t)ans; 277296177Sjhibbits ans = MM_GetForce(p_Qm->h_RsrvFqidMm, 278296177Sjhibbits (uint64_t)base, 279296177Sjhibbits (uint64_t)size, 280296177Sjhibbits "QM rsrv FQID MEM"); 281296177Sjhibbits if (ans == ILLEGAL_BASE) 282296177Sjhibbits { 283296177Sjhibbits MM_Put(p_Qm->h_FqidMm, (uint64_t)base); 284296177Sjhibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags); 285296177Sjhibbits return (uint32_t)ans; 286296177Sjhibbits } 287296177Sjhibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags); 288296177Sjhibbits 289296177Sjhibbits return (uint32_t)base; 290296177Sjhibbits} 291296177Sjhibbits 292296177Sjhibbitsstatic void FreeInitResources(t_Qm *p_Qm) 293296177Sjhibbits{ 294296177Sjhibbits if (p_Qm->p_FqdBase) 295296177Sjhibbits XX_FreeSmart(p_Qm->p_FqdBase); 296296177Sjhibbits if (p_Qm->p_PfdrBase) 297296177Sjhibbits XX_FreeSmart(p_Qm->p_PfdrBase); 298296177Sjhibbits if (p_Qm->h_Session) 299296177Sjhibbits XX_IpcFreeSession(p_Qm->h_Session); 300296177Sjhibbits if (p_Qm->h_RsrvFqidMm) 301296177Sjhibbits MM_Free(p_Qm->h_RsrvFqidMm); 302296177Sjhibbits if (p_Qm->h_FqidMm) 303296177Sjhibbits MM_Free(p_Qm->h_FqidMm); 304296177Sjhibbits} 305296177Sjhibbits 306296177Sjhibbits 307296177Sjhibbits/****************************************/ 308296177Sjhibbits/* Inter-Module functions */ 309296177Sjhibbits/****************************************/ 310296177Sjhibbits 311296177Sjhibbitsuint32_t QmGetCounter(t_Handle h_Qm, e_QmInterModuleCounters counter) 312296177Sjhibbits{ 313296177Sjhibbits t_Qm *p_Qm = (t_Qm*)h_Qm; 314296177Sjhibbits 315296177Sjhibbits SANITY_CHECK_RETURN_VALUE(p_Qm, E_INVALID_HANDLE, 0); 316296177Sjhibbits SANITY_CHECK_RETURN_VALUE((((p_Qm->guestId == NCSW_MASTER_ID) && p_Qm->p_QmRegs) || 317296177Sjhibbits (p_Qm->guestId != NCSW_MASTER_ID)), E_INVALID_STATE, 0); 318296177Sjhibbits 319296177Sjhibbits if ((p_Qm->guestId == NCSW_MASTER_ID) || 320296177Sjhibbits (!p_Qm->h_Session && p_Qm->p_QmRegs)) 321296177Sjhibbits { 322296177Sjhibbits switch(counter) 323296177Sjhibbits { 324296177Sjhibbits case(e_QM_IM_COUNTERS_SFDR_IN_USE): 325296177Sjhibbits return GET_UINT32(p_Qm->p_QmRegs->sfdr_in_use); 326296177Sjhibbits case(e_QM_IM_COUNTERS_PFDR_IN_USE): 327296177Sjhibbits return (p_Qm->numOfPfdr - GET_UINT32(p_Qm->p_QmRegs->pfdr_fpc)); 328296177Sjhibbits case(e_QM_IM_COUNTERS_PFDR_FREE_POOL): 329296177Sjhibbits return (GET_UINT32(p_Qm->p_QmRegs->pfdr_fpc) - GET_UINT32(p_Qm->p_QmRegs->pfdr_cfg)); 330296177Sjhibbits default: 331296177Sjhibbits break; 332296177Sjhibbits } 333296177Sjhibbits /* should never get here */ 334296177Sjhibbits ASSERT_COND(FALSE); 335296177Sjhibbits } 336296177Sjhibbits else if (p_Qm->h_Session) 337296177Sjhibbits { 338296177Sjhibbits t_QmIpcMsg msg; 339296177Sjhibbits t_QmIpcReply reply; 340296177Sjhibbits t_QmIpcGetCounter ipcCounter; 341296177Sjhibbits uint32_t replyLength, count; 342296177Sjhibbits t_Error errCode = E_OK; 343296177Sjhibbits 344296177Sjhibbits memset(&msg, 0, sizeof(t_QmIpcMsg)); 345296177Sjhibbits memset(&reply, 0, sizeof(t_QmIpcReply)); 346296177Sjhibbits ipcCounter.enumId = (uint32_t)counter; 347296177Sjhibbits msg.msgId = QM_GET_COUNTER; 348296177Sjhibbits memcpy(msg.msgBody, &ipcCounter, sizeof(t_QmIpcGetCounter)); 349296177Sjhibbits replyLength = sizeof(uint32_t) + sizeof(uint32_t); 350296177Sjhibbits if ((errCode = XX_IpcSendMessage(p_Qm->h_Session, 351296177Sjhibbits (uint8_t*)&msg, 352296177Sjhibbits sizeof(msg.msgId) + sizeof(t_QmIpcGetCounter), 353296177Sjhibbits (uint8_t*)&reply, 354296177Sjhibbits &replyLength, 355296177Sjhibbits NULL, 356296177Sjhibbits NULL)) != E_OK) 357296177Sjhibbits REPORT_ERROR(MAJOR, errCode, NO_MSG); 358296177Sjhibbits if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t))) 359296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 360296177Sjhibbits if ((errCode == E_OK) && (replyLength == (sizeof(uint32_t) + sizeof(uint32_t)))) 361296177Sjhibbits { 362296177Sjhibbits memcpy((uint8_t*)&count, reply.replyBody, sizeof(uint32_t)); 363296177Sjhibbits return count; 364296177Sjhibbits } 365296177Sjhibbits } 366296177Sjhibbits else 367296177Sjhibbits REPORT_ERROR(WARNING, E_NOT_SUPPORTED, 368296177Sjhibbits ("In 'guest', either IPC or 'baseAddress' is required!")); 369296177Sjhibbits 370296177Sjhibbits return 0; 371296177Sjhibbits} 372296177Sjhibbits 373296177Sjhibbitst_Error QmGetRevision(t_Handle h_Qm, t_QmRevisionInfo *p_QmRevisionInfo) 374296177Sjhibbits{ 375296177Sjhibbits t_Qm *p_Qm = (t_Qm *)h_Qm; 376296177Sjhibbits uint32_t tmpReg; 377296177Sjhibbits 378296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE); 379296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_QmRevisionInfo, E_NULL_POINTER); 380296177Sjhibbits SANITY_CHECK_RETURN_ERROR((((p_Qm->guestId == NCSW_MASTER_ID) && p_Qm->p_QmRegs) || 381296177Sjhibbits (p_Qm->guestId != NCSW_MASTER_ID)), E_INVALID_STATE); 382296177Sjhibbits 383296177Sjhibbits if ((p_Qm->guestId == NCSW_MASTER_ID) || 384296177Sjhibbits (!p_Qm->h_Session && p_Qm->p_QmRegs)) 385296177Sjhibbits { 386296177Sjhibbits /* read revision register 1 */ 387296177Sjhibbits tmpReg = GET_UINT32(p_Qm->p_QmRegs->ip_rev_1); 388296177Sjhibbits p_QmRevisionInfo->majorRev = (uint8_t)((tmpReg & REV1_MAJOR_MASK) >> REV1_MAJOR_SHIFT); 389296177Sjhibbits p_QmRevisionInfo->minorRev = (uint8_t)((tmpReg & REV1_MINOR_MASK) >> REV1_MINOR_SHIFT); 390296177Sjhibbits } 391296177Sjhibbits else if (p_Qm->h_Session) 392296177Sjhibbits { 393296177Sjhibbits t_QmIpcMsg msg; 394296177Sjhibbits t_QmIpcReply reply; 395296177Sjhibbits t_QmIpcRevisionInfo ipcRevInfo; 396296177Sjhibbits uint32_t replyLength; 397296177Sjhibbits t_Error errCode = E_OK; 398296177Sjhibbits 399296177Sjhibbits memset(&msg, 0, sizeof(t_QmIpcMsg)); 400296177Sjhibbits memset(&reply, 0, sizeof(reply)); 401296177Sjhibbits msg.msgId = QM_GET_REVISION; 402296177Sjhibbits replyLength = sizeof(uint32_t) + sizeof(t_QmIpcRevisionInfo); 403296177Sjhibbits if ((errCode = XX_IpcSendMessage(p_Qm->h_Session, 404296177Sjhibbits (uint8_t*)&msg, 405296177Sjhibbits sizeof(msg.msgId), 406296177Sjhibbits (uint8_t*)&reply, 407296177Sjhibbits &replyLength, 408296177Sjhibbits NULL, 409296177Sjhibbits NULL)) != E_OK) 410296177Sjhibbits RETURN_ERROR(MAJOR, errCode, NO_MSG); 411296177Sjhibbits if (replyLength != (sizeof(uint32_t) + sizeof(t_QmIpcRevisionInfo))) 412296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 413296177Sjhibbits 414296177Sjhibbits memcpy((uint8_t*)&ipcRevInfo, reply.replyBody, sizeof(t_QmIpcRevisionInfo)); 415296177Sjhibbits p_QmRevisionInfo->majorRev = ipcRevInfo.majorRev; 416296177Sjhibbits p_QmRevisionInfo->minorRev = ipcRevInfo.minorRev; 417296177Sjhibbits 418296177Sjhibbits return (t_Error)(reply.error); 419296177Sjhibbits } 420296177Sjhibbits else 421296177Sjhibbits RETURN_ERROR(WARNING, E_NOT_SUPPORTED, 422296177Sjhibbits ("In 'guest', either IPC or 'baseAddress' is required!")); 423296177Sjhibbits 424296177Sjhibbits return E_OK; 425296177Sjhibbits} 426296177Sjhibbits 427296177Sjhibbitst_Error QmGetSetPortalParams(t_Handle h_Qm, t_QmInterModulePortalInitParams *p_PortalParams) 428296177Sjhibbits{ 429296177Sjhibbits t_Qm *p_Qm = (t_Qm *)h_Qm; 430296177Sjhibbits t_QmRevisionInfo revInfo; 431296177Sjhibbits uint32_t lioReg,ioReg; 432296177Sjhibbits 433296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE); 434296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_PortalParams, E_NULL_POINTER); 435296177Sjhibbits 436296177Sjhibbits if (p_Qm->guestId == NCSW_MASTER_ID) 437296177Sjhibbits { 438296177Sjhibbits QmGetRevision(p_Qm, &revInfo); 439296177Sjhibbits 440296177Sjhibbits if ((revInfo.majorRev == 1) && (revInfo.minorRev == 0)) 441296177Sjhibbits { 442296177Sjhibbits lioReg = (uint32_t)(p_PortalParams->stashDestQueue << 24) | 443296177Sjhibbits (p_PortalParams->liodn << 16) | 444296177Sjhibbits (p_PortalParams->dqrrLiodn); 445296177Sjhibbits ioReg = (p_PortalParams->fdFqLiodn); 446296177Sjhibbits } 447296177Sjhibbits else 448296177Sjhibbits { 449296177Sjhibbits lioReg = (uint32_t)(p_PortalParams->liodn << 16) | 450296177Sjhibbits (p_PortalParams->dqrrLiodn); 451296177Sjhibbits ioReg = (uint32_t)(p_PortalParams->stashDestQueue << 16) | 452296177Sjhibbits (p_PortalParams->fdFqLiodn); 453296177Sjhibbits } 454296177Sjhibbits 455296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->swpConfRegs[p_PortalParams->portalId].lio_cfg, lioReg); 456296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->swpConfRegs[p_PortalParams->portalId].io_cfg, ioReg); 457296177Sjhibbits } 458296177Sjhibbits else if (p_Qm->h_Session) 459296177Sjhibbits { 460296177Sjhibbits t_QmIpcMsg msg; 461296177Sjhibbits t_QmIpcPortalInitParams portalParams; 462296177Sjhibbits t_Error errCode; 463296177Sjhibbits 464296177Sjhibbits memset(&msg, 0, sizeof(t_QmIpcMsg)); 465296177Sjhibbits portalParams.portalId = p_PortalParams->portalId; 466296177Sjhibbits portalParams.stashDestQueue = p_PortalParams->stashDestQueue; 467296177Sjhibbits portalParams.liodn = p_PortalParams->liodn; 468296177Sjhibbits portalParams.dqrrLiodn = p_PortalParams->dqrrLiodn; 469296177Sjhibbits portalParams.fdFqLiodn = p_PortalParams->fdFqLiodn; 470296177Sjhibbits msg.msgId = QM_GET_SET_PORTAL_PARAMS; 471296177Sjhibbits memcpy(msg.msgBody, &portalParams, sizeof(t_QmIpcPortalInitParams)); 472296177Sjhibbits XX_LockSpinlock(p_Qm->lock); 473296177Sjhibbits if ((errCode = XX_IpcSendMessage(p_Qm->h_Session, 474296177Sjhibbits (uint8_t*)&msg, 475296177Sjhibbits sizeof(msg.msgId) + sizeof(t_QmIpcPortalInitParams), 476296177Sjhibbits NULL, 477296177Sjhibbits NULL, 478296177Sjhibbits NULL, 479296177Sjhibbits NULL)) != E_OK) 480296177Sjhibbits { 481296177Sjhibbits XX_UnlockSpinlock(p_Qm->lock); 482296177Sjhibbits RETURN_ERROR(MAJOR, errCode, NO_MSG); 483296177Sjhibbits } 484296177Sjhibbits XX_UnlockSpinlock(p_Qm->lock); 485296177Sjhibbits } 486296177Sjhibbits else 487296177Sjhibbits DBG(WARNING, ("Can't set portal parameters (e.g. liodns). " \ 488296177Sjhibbits "probably QM is running in guest-mode with no IPC!")); 489296177Sjhibbits 490296177Sjhibbits return E_OK; 491296177Sjhibbits} 492296177Sjhibbits 493296177Sjhibbitsuint32_t QmFqidGet(t_Qm *p_Qm, uint32_t size, uint32_t alignment, bool force, uint32_t base) 494296177Sjhibbits{ 495296177Sjhibbits uint64_t ans; 496296177Sjhibbits uint32_t intFlags; 497296177Sjhibbits 498296177Sjhibbits intFlags = XX_LockIntrSpinlock(p_Qm->lock); 499296177Sjhibbits if (force) 500296177Sjhibbits { 501296177Sjhibbits ans = MM_GetForce(p_Qm->h_FqidMm, 502296177Sjhibbits (uint64_t)base, 503296177Sjhibbits (uint64_t)size, 504296177Sjhibbits "QM FQID MEM"); 505296177Sjhibbits if (ans == ILLEGAL_BASE) 506296177Sjhibbits { 507296177Sjhibbits ans = MM_GetForce(p_Qm->h_RsrvFqidMm, 508296177Sjhibbits (uint64_t)base, 509296177Sjhibbits (uint64_t)size, 510296177Sjhibbits "QM rsrv FQID MEM"); 511296177Sjhibbits if (ans == ILLEGAL_BASE) 512296177Sjhibbits ans = base; 513296177Sjhibbits else if (p_Qm->h_Session) 514296177Sjhibbits { 515296177Sjhibbits t_QmIpcMsg msg; 516296177Sjhibbits t_QmIpcReply reply; 517296177Sjhibbits uint32_t replyLength; 518296177Sjhibbits t_QmIpcFqidParams ipcFqid; 519296177Sjhibbits t_Error errCode = E_OK; 520296177Sjhibbits 521296177Sjhibbits memset(&msg, 0, sizeof(t_QmIpcMsg)); 522296177Sjhibbits memset(&reply, 0, sizeof(t_QmIpcReply)); 523296177Sjhibbits ipcFqid.fqid = base; 524296177Sjhibbits ipcFqid.size = size; 525296177Sjhibbits msg.msgId = QM_FORCE_FQID; 526296177Sjhibbits memcpy(msg.msgBody, &ipcFqid, sizeof(t_QmIpcFqidParams)); 527296177Sjhibbits replyLength = sizeof(uint32_t) + sizeof(uint32_t); 528296177Sjhibbits if ((errCode = XX_IpcSendMessage(p_Qm->h_Session, 529296177Sjhibbits (uint8_t*)&msg, 530296177Sjhibbits sizeof(msg.msgId) + sizeof(t_QmIpcFqidParams), 531296177Sjhibbits (uint8_t*)&reply, 532296177Sjhibbits &replyLength, 533296177Sjhibbits NULL, 534296177Sjhibbits NULL)) != E_OK) 535296177Sjhibbits REPORT_ERROR(MAJOR, errCode, NO_MSG); 536296177Sjhibbits if (replyLength != (sizeof(uint32_t) + sizeof(uint32_t))) 537296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 538296177Sjhibbits 539296177Sjhibbits if ((errCode != E_OK) || 540296177Sjhibbits (replyLength != (sizeof(uint32_t) + sizeof(uint32_t)))) 541296177Sjhibbits ans = ILLEGAL_BASE; 542296177Sjhibbits else 543296177Sjhibbits memcpy((uint8_t*)&ans, reply.replyBody, sizeof(uint32_t)); 544296177Sjhibbits } 545296177Sjhibbits else 546296177Sjhibbits { 547296177Sjhibbits DBG(WARNING, ("No Ipc - can't validate fqid.")); 548296177Sjhibbits ans = base; 549296177Sjhibbits } 550296177Sjhibbits } 551296177Sjhibbits } 552296177Sjhibbits else 553296177Sjhibbits ans = MM_Get(p_Qm->h_FqidMm, 554296177Sjhibbits size, 555296177Sjhibbits alignment, 556296177Sjhibbits "QM FQID MEM"); 557296177Sjhibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags); 558296177Sjhibbits 559296177Sjhibbits return (uint32_t)ans; 560296177Sjhibbits} 561296177Sjhibbits 562296177Sjhibbitst_Error QmFqidPut(t_Qm *p_Qm, uint32_t base) 563296177Sjhibbits{ 564296177Sjhibbits uint32_t intFlags; 565296177Sjhibbits 566296177Sjhibbits intFlags = XX_LockIntrSpinlock(p_Qm->lock); 567296177Sjhibbits /* Check maybe this fqid was reserved in the past */ 568296177Sjhibbits if (MM_GetForce(p_Qm->h_RsrvFqidMm, 569296177Sjhibbits (uint64_t)base, 570296177Sjhibbits (uint64_t)1, 571296177Sjhibbits "QM rsrv FQID MEM") == ILLEGAL_BASE) 572296177Sjhibbits { 573296177Sjhibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags); 574296177Sjhibbits return E_OK; 575296177Sjhibbits } 576296177Sjhibbits else 577296177Sjhibbits MM_PutForce(p_Qm->h_RsrvFqidMm, 578296177Sjhibbits (uint64_t)base, 579296177Sjhibbits (uint64_t)1); 580296177Sjhibbits if (MM_InRange(p_Qm->h_FqidMm, (uint64_t)base)) 581296177Sjhibbits { 582296177Sjhibbits if (MM_Put(p_Qm->h_FqidMm, (uint64_t)base) != 0) 583296177Sjhibbits { 584296177Sjhibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags); 585296177Sjhibbits return E_OK; 586296177Sjhibbits } 587296177Sjhibbits else 588296177Sjhibbits { 589296177Sjhibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags); 590296177Sjhibbits return ERROR_CODE(E_NOT_FOUND); 591296177Sjhibbits } 592296177Sjhibbits } 593296177Sjhibbits else if (p_Qm->h_Session) 594296177Sjhibbits { 595296177Sjhibbits t_QmIpcMsg msg; 596296177Sjhibbits t_QmIpcFqidParams ipcFqid; 597296177Sjhibbits t_Error errCode = E_OK; 598296177Sjhibbits 599296177Sjhibbits memset(&msg, 0, sizeof(t_QmIpcMsg)); 600296177Sjhibbits ipcFqid.fqid = (uint8_t)base; 601296177Sjhibbits ipcFqid.size = 0; 602296177Sjhibbits msg.msgId = QM_PUT_FQID; 603296177Sjhibbits memcpy(msg.msgBody, &ipcFqid, sizeof(t_QmIpcFqidParams)); 604296177Sjhibbits if ((errCode = XX_IpcSendMessage(p_Qm->h_Session, 605296177Sjhibbits (uint8_t*)&msg, 606296177Sjhibbits sizeof(msg.msgId) + sizeof(t_QmIpcFqidParams), 607296177Sjhibbits NULL, 608296177Sjhibbits NULL, 609296177Sjhibbits NULL, 610296177Sjhibbits NULL)) != E_OK) 611296177Sjhibbits { 612296177Sjhibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags); 613296177Sjhibbits RETURN_ERROR(MAJOR, errCode, NO_MSG); 614296177Sjhibbits } 615296177Sjhibbits } 616296177Sjhibbits else 617296177Sjhibbits DBG(WARNING, ("No Ipc - can't validate fqid.")); 618296177Sjhibbits XX_UnlockIntrSpinlock(p_Qm->lock, intFlags); 619296177Sjhibbits 620296177Sjhibbits return E_OK; 621296177Sjhibbits} 622296177Sjhibbits 623296177Sjhibbitst_Error QmGetCgId(t_Handle h_Qm, uint8_t *p_CgId) 624296177Sjhibbits{ 625296177Sjhibbits t_Qm *p_Qm = (t_Qm *)h_Qm; 626296177Sjhibbits uint16_t i; 627296177Sjhibbits 628296177Sjhibbits for(i = p_Qm->partCgsBase;i<p_Qm->partCgsBase+p_Qm->partNumOfCgs;i++) 629296177Sjhibbits if (!p_Qm->cgsUsed[i]) 630296177Sjhibbits { 631296177Sjhibbits p_Qm->cgsUsed[i] = (uint8_t)TRUE; 632296177Sjhibbits *p_CgId = (uint8_t)i; 633296177Sjhibbits break; 634296177Sjhibbits } 635296177Sjhibbits if(i == (p_Qm->partCgsBase+p_Qm->partNumOfCgs)) 636296177Sjhibbits RETURN_ERROR(MINOR, E_BUSY, ("No available CG")); 637296177Sjhibbits else 638296177Sjhibbits return E_OK; 639296177Sjhibbits} 640296177Sjhibbits 641296177Sjhibbitst_Error QmFreeCgId(t_Handle h_Qm, uint8_t cgId) 642296177Sjhibbits{ 643296177Sjhibbits t_Qm *p_Qm = (t_Qm *)h_Qm; 644296177Sjhibbits 645296177Sjhibbits if (!p_Qm->cgsUsed[cgId]) 646296177Sjhibbits RETURN_ERROR(MINOR, E_INVALID_STATE, ("CG is not in use")); 647296177Sjhibbits else 648296177Sjhibbits p_Qm->cgsUsed[cgId] = (uint8_t)FALSE; 649296177Sjhibbits 650296177Sjhibbits return E_OK; 651296177Sjhibbits} 652296177Sjhibbits 653296177Sjhibbits 654296177Sjhibbits/****************************************/ 655296177Sjhibbits/* API Init unit functions */ 656296177Sjhibbits/****************************************/ 657296177Sjhibbits 658296177Sjhibbitst_Handle QM_Config(t_QmParam *p_QmParam) 659296177Sjhibbits{ 660296177Sjhibbits t_Qm *p_Qm; 661296177Sjhibbits uint8_t i; 662296177Sjhibbits 663296177Sjhibbits SANITY_CHECK_RETURN_VALUE(p_QmParam, E_INVALID_HANDLE, NULL); 664296177Sjhibbits 665296177Sjhibbits p_Qm = (t_Qm *)XX_Malloc(sizeof(t_Qm)); 666296177Sjhibbits if (!p_Qm) 667296177Sjhibbits { 668296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("QM obj!!!")); 669296177Sjhibbits return NULL; 670296177Sjhibbits } 671296177Sjhibbits memset(p_Qm, 0, sizeof(t_Qm)); 672296177Sjhibbits p_Qm->p_QmDriverParams = (t_QmDriverParams *)XX_Malloc(sizeof(t_QmDriverParams)); 673296177Sjhibbits if (!p_Qm->p_QmDriverParams) 674296177Sjhibbits { 675296177Sjhibbits XX_Free(p_Qm); 676296177Sjhibbits REPORT_ERROR(MAJOR, E_NO_MEMORY, ("Qm driver parameters")); 677296177Sjhibbits return NULL; 678296177Sjhibbits } 679296177Sjhibbits memset(p_Qm->p_QmDriverParams, 0, sizeof(t_QmDriverParams)); 680296177Sjhibbits 681296177Sjhibbits p_Qm->guestId = p_QmParam->guestId; 682296177Sjhibbits p_Qm->p_QmDriverParams->partFqidBase = p_QmParam->partFqidBase; 683296177Sjhibbits p_Qm->p_QmDriverParams->partNumOfFqids = p_QmParam->partNumOfFqids; 684296177Sjhibbits p_Qm->partCgsBase = p_QmParam->partCgsBase; 685296177Sjhibbits p_Qm->partNumOfCgs = p_QmParam->partNumOfCgs; 686296177Sjhibbits p_Qm->p_QmRegs = (t_QmRegs *)UINT_TO_PTR(p_QmParam->baseAddress); 687296177Sjhibbits 688296177Sjhibbits if (p_Qm->guestId == NCSW_MASTER_ID) 689296177Sjhibbits { 690296177Sjhibbits p_Qm->exceptions = DEFAULT_exceptions; 691296177Sjhibbits p_Qm->f_Exception = p_QmParam->f_Exception; 692296177Sjhibbits p_Qm->h_App = p_QmParam->h_App; 693296177Sjhibbits p_Qm->errIrq = p_QmParam->errIrq; 694296177Sjhibbits p_Qm->p_QmDriverParams->liodn = p_QmParam->liodn; 695296177Sjhibbits p_Qm->p_QmDriverParams->rtFramesDepth = DEFAULT_rtFramesDepth; 696296177Sjhibbits p_Qm->p_QmDriverParams->fqdMemPartitionId = p_QmParam->fqdMemPartitionId; 697296177Sjhibbits p_Qm->p_QmDriverParams->pfdrMemPartitionId = p_QmParam->pfdrMemPartitionId; 698296177Sjhibbits p_Qm->p_QmDriverParams->swPortalsBaseAddress = p_QmParam->swPortalsBaseAddress; 699296177Sjhibbits p_Qm->p_QmDriverParams->totalNumOfFqids = p_QmParam->totalNumOfFqids; 700296177Sjhibbits p_Qm->p_QmDriverParams->pfdrThreshold = DEFAULT_pfdrThreshold; 701296177Sjhibbits p_Qm->p_QmDriverParams->sfdrThreshold = DEFAULT_sfdrThreshold; 702296177Sjhibbits p_Qm->p_QmDriverParams->pfdrBaseConstant = DEFAULT_pfdrBaseConstant; 703296177Sjhibbits for(i= 0;i<DPAA_MAX_NUM_OF_DC_PORTALS;i++) 704296177Sjhibbits p_Qm->p_QmDriverParams->dcPortalsParams[i].sendToSw = 705296177Sjhibbits (bool)((i < e_DPAA_DCPORTAL2) ? FALSE : TRUE); 706296177Sjhibbits 707296177Sjhibbits#ifdef QMAN_SFDR_LEAK_ERRATA_QMAN5 708296177Sjhibbits { 709296177Sjhibbits#define WORKAROUND_TMP_VAL 0x00000003 710296177Sjhibbits t_QmRevisionInfo revInfo; 711296177Sjhibbits QmGetRevision(p_Qm, &revInfo); 712296177Sjhibbits if ((revInfo.majorRev == 1) && (revInfo.minorRev == 0)) 713296177Sjhibbits { 714296177Sjhibbits uint32_t *tmp = (uint32_t *)UINT_TO_PTR(p_QmParam->baseAddress + 0xbf0); 715296177Sjhibbits uint32_t tmpReg = WORKAROUND_TMP_VAL; 716296177Sjhibbits WRITE_UINT32(*tmp, tmpReg); 717296177Sjhibbits while ((tmpReg = GET_UINT32(*tmp)) != WORKAROUND_TMP_VAL) ; 718296177Sjhibbits } 719296177Sjhibbits } 720296177Sjhibbits#endif /* QMAN_SFDR_LEAK_ERRATA_QMAN5 */ 721296177Sjhibbits } 722296177Sjhibbits 723296177Sjhibbits /* build the QM partition IPC address */ 724296177Sjhibbits memset(p_Qm->moduleName, 0, MODULE_NAME_SIZE); 725296177Sjhibbits if(Sprint (p_Qm->moduleName, "QM_0_%d",p_Qm->guestId) != (p_Qm->guestId<10 ? 6:7)) 726296177Sjhibbits { 727296177Sjhibbits XX_Free(p_Qm->p_QmDriverParams); 728296177Sjhibbits XX_Free(p_Qm); 729296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed")); 730296177Sjhibbits return NULL; 731296177Sjhibbits } 732296177Sjhibbits 733296177Sjhibbits return p_Qm; 734296177Sjhibbits} 735296177Sjhibbits 736296177Sjhibbitst_Error QM_Init(t_Handle h_Qm) 737296177Sjhibbits{ 738296177Sjhibbits t_Qm *p_Qm = (t_Qm *)h_Qm; 739296177Sjhibbits t_QmDriverParams *p_QmDriverParams; 740296177Sjhibbits t_Error err; 741296177Sjhibbits 742296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE); 743296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm->p_QmDriverParams, E_INVALID_HANDLE); 744296177Sjhibbits 745296177Sjhibbits CHECK_INIT_PARAMETERS(p_Qm, CheckQmParameters); 746296177Sjhibbits 747296177Sjhibbits p_QmDriverParams = p_Qm->p_QmDriverParams; 748296177Sjhibbits 749296177Sjhibbits if (p_QmDriverParams->partNumOfFqids) 750296177Sjhibbits { 751296177Sjhibbits if (MM_Init(&p_Qm->h_FqidMm, p_QmDriverParams->partFqidBase, p_QmDriverParams->partNumOfFqids) != E_OK) 752296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("QM-FQIDS-MEM partition!!!")); 753296177Sjhibbits if (MM_Init(&p_Qm->h_RsrvFqidMm, p_QmDriverParams->partFqidBase, p_QmDriverParams->partNumOfFqids) != E_OK) 754296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_HANDLE, ("QM-Reserve-FQIDS-MEM partition!!!")); 755296177Sjhibbits } 756296177Sjhibbits 757296177Sjhibbits if (p_Qm->guestId == NCSW_MASTER_ID) 758296177Sjhibbits { 759296177Sjhibbits uint64_t phyAddr; 760296177Sjhibbits t_QmRevisionInfo revInfo; 761296177Sjhibbits uint32_t dsSize, exp, i; 762296177Sjhibbits 763296177Sjhibbits QmGetRevision(p_Qm, &revInfo); 764296177Sjhibbits DBG(TRACE, ("Qman ver:%02x,%02x", revInfo.majorRev, revInfo.minorRev)); 765296177Sjhibbits 766296177Sjhibbits phyAddr = XX_VirtToPhys(UINT_TO_PTR(p_QmDriverParams->swPortalsBaseAddress)); 767296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->qcsp_bare, ((uint32_t)(phyAddr >> 32) & 0x000000ff)); 768296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->qcsp_bar, (uint32_t)phyAddr); 769296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->liodnr, (uint16_t)p_QmDriverParams->liodn); 770296177Sjhibbits 771296177Sjhibbits /* FQD memory */ 772296177Sjhibbits dsSize = (uint32_t)(p_QmDriverParams->totalNumOfFqids * FQD_ENTRY_SIZE); 773296177Sjhibbits LOG2(dsSize, exp); 774296177Sjhibbits if (!POWER_OF_2(dsSize)) (exp++); 775296177Sjhibbits dsSize = (uint32_t)(1 << exp); 776296177Sjhibbits if (dsSize < (4*KILOBYTE)) 777296177Sjhibbits { 778296177Sjhibbits dsSize = (4*KILOBYTE); 779296177Sjhibbits LOG2(dsSize, exp); 780296177Sjhibbits } 781296177Sjhibbits p_Qm->p_FqdBase = XX_MallocSmart(dsSize, (int)p_QmDriverParams->fqdMemPartitionId, dsSize); 782296177Sjhibbits if (!p_Qm->p_FqdBase) 783296177Sjhibbits { 784296177Sjhibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("FQD obj!!!")); 785296177Sjhibbits } 786296177Sjhibbits memset(p_Qm->p_FqdBase, 0, dsSize); 787296177Sjhibbits CORE_MemoryBarrier(); 788296177Sjhibbits for (i=0; i<dsSize; i+=64) 789296177Sjhibbits dcbf(PTR_MOVE(p_Qm->p_FqdBase, i)); 790296177Sjhibbits CORE_MemoryBarrier(); 791296177Sjhibbits 792296177Sjhibbits phyAddr = XX_VirtToPhys(p_Qm->p_FqdBase); 793296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->fqd_bare, ((uint32_t)(phyAddr >> 32) & 0x000000ff)); 794296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->fqd_bar, (uint32_t)phyAddr); 795296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->fqd_ar, AR_ENABLE | (exp - 1)); 796296177Sjhibbits 797296177Sjhibbits /* PFDR memory */ 798296177Sjhibbits dsSize = (uint32_t)(p_QmDriverParams->rtFramesDepth * (PFDR_ENTRY_SIZE/3)); 799296177Sjhibbits LOG2(dsSize, exp); 800296177Sjhibbits if (!POWER_OF_2(dsSize)) (exp++); 801296177Sjhibbits dsSize = (uint32_t)(1 << exp); 802296177Sjhibbits if (dsSize < (4*KILOBYTE)) 803296177Sjhibbits { 804296177Sjhibbits dsSize = (4*KILOBYTE); 805296177Sjhibbits LOG2(dsSize, exp); 806296177Sjhibbits } 807296177Sjhibbits 808296177Sjhibbits p_Qm->p_PfdrBase = XX_MallocSmart(dsSize, (int)p_QmDriverParams->pfdrMemPartitionId, dsSize); 809296177Sjhibbits if (!p_Qm->p_PfdrBase) 810296177Sjhibbits RETURN_ERROR(MAJOR, E_NO_MEMORY, ("PFDR obj!!!")); 811296177Sjhibbits 812296177Sjhibbits phyAddr = XX_VirtToPhys(p_Qm->p_PfdrBase); 813296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->pfdr_bare, ((uint32_t)(phyAddr >> 32) & 0x000000ff)); 814296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->pfdr_bar, (uint32_t)phyAddr); 815296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->pfdr_ar, AR_ENABLE | (exp - 1)); 816296177Sjhibbits 817296177Sjhibbits if (QmInitPfdr(p_Qm, 8, dsSize / 64 - 8) != E_OK) 818296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("PFDR init failed!!!")); 819296177Sjhibbits 820296177Sjhibbits /* thresholds */ 821296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->pfdr_fp_lwit, (p_Qm->p_QmDriverParams->pfdrThreshold & 0xffffff)); 822296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->pfdr_cfg, p_Qm->p_QmDriverParams->pfdrBaseConstant); 823296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->sfdr_cfg, (p_Qm->p_QmDriverParams->sfdrThreshold & 0x3ff)); 824296177Sjhibbits 825296177Sjhibbits p_Qm->numOfPfdr = GET_UINT32(p_Qm->p_QmRegs->pfdr_fpc); 826296177Sjhibbits 827296177Sjhibbits /* corenet initiator settings */ 828296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->ci_sched_cfg, 829296177Sjhibbits (CI_SCHED_CFG_EN | 830296177Sjhibbits (DEFAULT_initiatorSrcciv << CI_SCHED_CFG_SRCCIV_SHIFT) | 831296177Sjhibbits (DEFAULT_initiatorSrqW << CI_SCHED_CFG_SRQ_W_SHIFT) | 832296177Sjhibbits (DEFAULT_initiatorRwW << CI_SCHED_CFG_RW_W_SHIFT) | 833296177Sjhibbits (DEFAULT_initiatorBmanW << CI_SCHED_CFG_BMAN_W_SHIFT))); 834296177Sjhibbits 835296177Sjhibbits /* HID settings */ 836296177Sjhibbits if ((revInfo.majorRev == 1) && (revInfo.minorRev == 0)) 837296177Sjhibbits /* offset 0x0bf0 */ 838296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->res23[144], 0x3); 839296177Sjhibbits else 840296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->res23[144], 0x0); 841296177Sjhibbits 842296177Sjhibbits for(i=0;i<DPAA_MAX_NUM_OF_DC_PORTALS;i++) 843296177Sjhibbits { 844296177Sjhibbits if(p_Qm->p_QmDriverParams->dcPortalsParams[i].sendToSw) 845296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->dcpConfRegs[i].cfg, 846296177Sjhibbits p_Qm->p_QmDriverParams->dcPortalsParams[i].swPortalId); 847296177Sjhibbits else 848296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->dcpConfRegs[i].cfg, QM_DCP_CFG_ED); 849296177Sjhibbits } 850296177Sjhibbits 851296177Sjhibbits#ifdef QMAN_WQ_CS_CFG_ERRATA_QMAN4 852296177Sjhibbits { 853296177Sjhibbits t_QmRevisionInfo revInfo; 854296177Sjhibbits QmGetRevision(p_Qm, &revInfo); 855296177Sjhibbits if ((revInfo.majorRev == 1) && (revInfo.minorRev == 0)) 856296177Sjhibbits { 857296177Sjhibbits QmSetWqScheduling(p_Qm, e_QM_WQ_SW_PORTALS,0,1,1,1,1,1,1); 858296177Sjhibbits QmSetWqScheduling(p_Qm, e_QM_WQ_POOLS,0,1,1,1,1,1,1); 859296177Sjhibbits QmSetWqScheduling(p_Qm, e_QM_WQ_DCP0,0,1,1,1,1,1,1); 860296177Sjhibbits QmSetWqScheduling(p_Qm, e_QM_WQ_DCP1,0,1,1,1,1,1,1); 861296177Sjhibbits QmSetWqScheduling(p_Qm, e_QM_WQ_DCP2,0,1,1,1,1,1,1); 862296177Sjhibbits QmSetWqScheduling(p_Qm, e_QM_WQ_DCP3,0,1,1,1,1,1,1); 863296177Sjhibbits } 864296177Sjhibbits } 865296177Sjhibbits#endif /* QMAN_WQ_CS_CFG_ERRATA_QMAN4 */ 866296177Sjhibbits 867296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->err_isr, p_Qm->exceptions); 868296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->err_ier, p_Qm->exceptions); 869296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->err_isdr, 0x0); 870296177Sjhibbits if (p_Qm->errIrq != NO_IRQ) 871296177Sjhibbits { 872296177Sjhibbits XX_SetIntr(p_Qm->errIrq, QM_ErrorIsr, p_Qm); 873296177Sjhibbits XX_EnableIntr(p_Qm->errIrq); 874296177Sjhibbits } 875296177Sjhibbits if ((err = XX_IpcRegisterMsgHandler(p_Qm->moduleName, QmHandleIpcMsgCB, p_Qm, QM_IPC_MAX_REPLY_SIZE)) != E_OK) 876296177Sjhibbits RETURN_ERROR(MAJOR, err, NO_MSG); 877296177Sjhibbits } 878296177Sjhibbits else /* guest mode */ 879296177Sjhibbits { 880296177Sjhibbits char masterModuleName[MODULE_NAME_SIZE]; 881296177Sjhibbits 882296177Sjhibbits memset(masterModuleName, 0, MODULE_NAME_SIZE); 883296177Sjhibbits if(Sprint (masterModuleName, "QM_0_%d", NCSW_MASTER_ID) != (NCSW_MASTER_ID<10 ? 6:7)) 884296177Sjhibbits { 885296177Sjhibbits RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed")); 886296177Sjhibbits } 887296177Sjhibbits 888296177Sjhibbits p_Qm->h_Session = XX_IpcInitSession(masterModuleName, p_Qm->moduleName); 889296177Sjhibbits if (p_Qm->h_Session) 890296177Sjhibbits { 891296177Sjhibbits t_QmIpcMsg msg; 892296177Sjhibbits uint8_t isMasterAlive = 0; 893296177Sjhibbits t_QmIpcReply reply; 894296177Sjhibbits uint32_t replyLength; 895296177Sjhibbits 896296177Sjhibbits memset(&msg, 0, sizeof(t_QmIpcMsg)); 897296177Sjhibbits memset(&reply, 0, sizeof(t_QmIpcReply)); 898296177Sjhibbits msg.msgId = QM_MASTER_IS_ALIVE; 899296177Sjhibbits do 900296177Sjhibbits { 901296177Sjhibbits blockingFlag = TRUE; 902296177Sjhibbits replyLength = sizeof(uint32_t) + sizeof(uint8_t); 903296177Sjhibbits if ((err = XX_IpcSendMessage(p_Qm->h_Session, 904296177Sjhibbits (uint8_t*)&msg, 905296177Sjhibbits sizeof(msg.msgId), 906296177Sjhibbits (uint8_t*)&reply, 907296177Sjhibbits &replyLength, 908296177Sjhibbits QmIpcMsgCompletionCB, 909296177Sjhibbits p_Qm)) != E_OK) 910296177Sjhibbits REPORT_ERROR(MAJOR, err, NO_MSG); 911296177Sjhibbits while(blockingFlag) ; 912296177Sjhibbits if(replyLength != (sizeof(uint32_t) + sizeof(uint8_t))) 913296177Sjhibbits REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch")); 914296177Sjhibbits isMasterAlive = *(uint8_t*)(reply.replyBody); 915296177Sjhibbits } while (!isMasterAlive); 916296177Sjhibbits } 917296177Sjhibbits } 918296177Sjhibbits 919296177Sjhibbits p_Qm->lock = XX_InitSpinlock(); 920296177Sjhibbits XX_Free(p_Qm->p_QmDriverParams); 921296177Sjhibbits p_Qm->p_QmDriverParams = NULL; 922296177Sjhibbits 923296177Sjhibbits return E_OK; 924296177Sjhibbits} 925296177Sjhibbits 926296177Sjhibbitst_Error QM_Free(t_Handle h_Qm) 927296177Sjhibbits{ 928296177Sjhibbits t_Qm *p_Qm = (t_Qm *)h_Qm; 929296177Sjhibbits 930296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE); 931296177Sjhibbits 932296177Sjhibbits if (p_Qm->lock) 933296177Sjhibbits XX_FreeSpinlock(p_Qm->lock); 934296177Sjhibbits 935296177Sjhibbits if (p_Qm->guestId == NCSW_MASTER_ID) 936296177Sjhibbits { 937296177Sjhibbits XX_IpcUnregisterMsgHandler(p_Qm->moduleName); 938296177Sjhibbits if (p_Qm->errIrq != NO_IRQ) 939296177Sjhibbits { 940296177Sjhibbits XX_DisableIntr(p_Qm->errIrq); 941296177Sjhibbits XX_FreeIntr(p_Qm->errIrq); 942296177Sjhibbits } 943296177Sjhibbits } 944296177Sjhibbits FreeInitResources(p_Qm); 945296177Sjhibbits 946296177Sjhibbits if (p_Qm->p_QmDriverParams) 947296177Sjhibbits XX_Free(p_Qm->p_QmDriverParams); 948296177Sjhibbits 949296177Sjhibbits XX_Free(p_Qm); 950296177Sjhibbits 951296177Sjhibbits return E_OK; 952296177Sjhibbits} 953296177Sjhibbits 954296177Sjhibbitst_Error QM_ConfigRTFramesDepth(t_Handle h_Qm, uint32_t rtFramesDepth) 955296177Sjhibbits{ 956296177Sjhibbits t_Qm *p_Qm = (t_Qm *)h_Qm; 957296177Sjhibbits 958296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE); 959296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm->p_QmDriverParams, E_INVALID_HANDLE); 960296177Sjhibbits 961296177Sjhibbits p_Qm->p_QmDriverParams->rtFramesDepth = rtFramesDepth; 962296177Sjhibbits 963296177Sjhibbits return E_OK; 964296177Sjhibbits} 965296177Sjhibbits 966296177Sjhibbitst_Error QM_ConfigPfdrThreshold(t_Handle h_Qm, uint32_t threshold) 967296177Sjhibbits{ 968296177Sjhibbits t_Qm *p_Qm = (t_Qm *)h_Qm; 969296177Sjhibbits 970296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE); 971296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm->p_QmDriverParams, E_INVALID_HANDLE); 972296177Sjhibbits 973296177Sjhibbits p_Qm->p_QmDriverParams->pfdrThreshold = threshold; 974296177Sjhibbits 975296177Sjhibbits return E_OK; 976296177Sjhibbits} 977296177Sjhibbits 978296177Sjhibbitst_Error QM_ConfigSfdrReservationThreshold(t_Handle h_Qm, uint32_t threshold) 979296177Sjhibbits{ 980296177Sjhibbits t_Qm *p_Qm = (t_Qm *)h_Qm; 981296177Sjhibbits 982296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE); 983296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm->p_QmDriverParams, E_INVALID_HANDLE); 984296177Sjhibbits 985296177Sjhibbits p_Qm->p_QmDriverParams->sfdrThreshold = threshold; 986296177Sjhibbits 987296177Sjhibbits return E_OK; 988296177Sjhibbits} 989296177Sjhibbits 990296177Sjhibbits 991296177Sjhibbitst_Error QM_ConfigErrorRejectionNotificationDest(t_Handle h_Qm, e_DpaaDcPortal id, t_QmDcPortalParams *p_Params) 992296177Sjhibbits{ 993296177Sjhibbits UNUSED(h_Qm); UNUSED(id); UNUSED(p_Params); 994296177Sjhibbits 995296177Sjhibbits RETURN_ERROR(INFO, E_NOT_SUPPORTED, ("Only default ERN destination available.")); 996296177Sjhibbits} 997296177Sjhibbits 998296177Sjhibbits 999296177Sjhibbitst_Error QM_Poll(t_Handle h_Qm, e_QmPortalPollSource source) 1000296177Sjhibbits{ 1001296177Sjhibbits t_Qm *p_Qm = (t_Qm *)h_Qm; 1002296177Sjhibbits t_QmPortal *p_QmPortal; 1003296177Sjhibbits 1004296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE); 1005296177Sjhibbits p_QmPortal = QmGetPortalHandle(p_Qm); 1006296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_QmPortal, E_INVALID_HANDLE); 1007296177Sjhibbits 1008296177Sjhibbits return QM_PORTAL_Poll(p_QmPortal, source); 1009296177Sjhibbits} 1010296177Sjhibbits 1011296177Sjhibbitsuint32_t QM_GetCounter(t_Handle h_Qm, e_QmCounters counter) 1012296177Sjhibbits{ 1013296177Sjhibbits t_Qm *p_Qm = (t_Qm *)h_Qm; 1014296177Sjhibbits 1015296177Sjhibbits SANITY_CHECK_RETURN_VALUE(p_Qm, E_INVALID_HANDLE, 0); 1016296177Sjhibbits SANITY_CHECK_RETURN_VALUE(!p_Qm->p_QmDriverParams, E_INVALID_STATE, 0); 1017296177Sjhibbits 1018296177Sjhibbits switch(counter) 1019296177Sjhibbits { 1020296177Sjhibbits case(e_QM_COUNTERS_SFDR_IN_USE): 1021296177Sjhibbits return QmGetCounter(p_Qm, e_QM_IM_COUNTERS_SFDR_IN_USE); 1022296177Sjhibbits case(e_QM_COUNTERS_PFDR_IN_USE): 1023296177Sjhibbits return QmGetCounter(p_Qm, e_QM_IM_COUNTERS_PFDR_IN_USE); 1024296177Sjhibbits case(e_QM_COUNTERS_PFDR_FREE_POOL): 1025296177Sjhibbits return QmGetCounter(p_Qm, e_QM_IM_COUNTERS_PFDR_FREE_POOL); 1026296177Sjhibbits default: 1027296177Sjhibbits break; 1028296177Sjhibbits } 1029296177Sjhibbits /* should never get here */ 1030296177Sjhibbits ASSERT_COND(FALSE); 1031296177Sjhibbits 1032296177Sjhibbits return 0; 1033296177Sjhibbits} 1034296177Sjhibbits 1035296177Sjhibbitsvoid QM_ErrorIsr(t_Handle h_Qm) 1036296177Sjhibbits{ 1037296177Sjhibbits t_Qm *p_Qm = (t_Qm *)h_Qm; 1038296177Sjhibbits uint32_t tmpReg; 1039296177Sjhibbits 1040296177Sjhibbits SANITY_CHECK_RETURN(p_Qm, E_INVALID_HANDLE); 1041296177Sjhibbits 1042296177Sjhibbits if (p_Qm->guestId != NCSW_MASTER_ID) 1043296177Sjhibbits { 1044296177Sjhibbits REPORT_ERROR(WARNING, E_INVALID_OPERATION, ("Master Only")); 1045296177Sjhibbits return; 1046296177Sjhibbits } 1047296177Sjhibbits 1048296177Sjhibbits tmpReg = GET_UINT32(p_Qm->p_QmRegs->err_isr); 1049296177Sjhibbits tmpReg &= GET_UINT32(p_Qm->p_QmRegs->err_ier); 1050296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->err_isr, tmpReg); 1051296177Sjhibbits 1052296177Sjhibbits if (tmpReg & QM_EX_CORENET_INITIATOR_DATA) 1053296177Sjhibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_CORENET_INITIATOR_DATA); 1054296177Sjhibbits if (tmpReg & QM_EX_CORENET_TARGET_DATA) 1055296177Sjhibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_CORENET_TARGET_DATA); 1056296177Sjhibbits if (tmpReg & QM_EX_CORENET_INVALID_TARGET_TRANSACTION) 1057296177Sjhibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_CORENET_INVALID_TARGET_TRANSACTION); 1058296177Sjhibbits if (tmpReg & QM_EX_PFDR_THRESHOLD) 1059296177Sjhibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_PFDR_THRESHOLD); 1060296177Sjhibbits if (tmpReg & QM_EX_MULTI_ECC) 1061296177Sjhibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_MULTI_ECC); 1062296177Sjhibbits if (tmpReg & QM_EX_SINGLE_ECC) 1063296177Sjhibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_SINGLE_ECC); 1064296177Sjhibbits if (tmpReg & QM_EX_PFDR_ENQUEUE_BLOCKED) 1065296177Sjhibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_PFDR_ENQUEUE_BLOCKED); 1066296177Sjhibbits if (tmpReg & QM_EX_INVALID_COMMAND) 1067296177Sjhibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_INVALID_COMMAND); 1068296177Sjhibbits if (tmpReg & QM_EX_DEQUEUE_DCP) 1069296177Sjhibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_DEQUEUE_DCP); 1070296177Sjhibbits if (tmpReg & QM_EX_DEQUEUE_FQ) 1071296177Sjhibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_DEQUEUE_FQ); 1072296177Sjhibbits if (tmpReg & QM_EX_DEQUEUE_SOURCE) 1073296177Sjhibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_DEQUEUE_SOURCE); 1074296177Sjhibbits if (tmpReg & QM_EX_DEQUEUE_QUEUE) 1075296177Sjhibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_DEQUEUE_QUEUE); 1076296177Sjhibbits if (tmpReg & QM_EX_ENQUEUE_OVERFLOW) 1077296177Sjhibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_ENQUEUE_OVERFLOW); 1078296177Sjhibbits if (tmpReg & QM_EX_ENQUEUE_STATE) 1079296177Sjhibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_ENQUEUE_STATE); 1080296177Sjhibbits if (tmpReg & QM_EX_ENQUEUE_CHANNEL) 1081296177Sjhibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_ENQUEUE_CHANNEL); 1082296177Sjhibbits if (tmpReg & QM_EX_ENQUEUE_QUEUE) 1083296177Sjhibbits p_Qm->f_Exception(p_Qm->h_App, e_QM_EX_ENQUEUE_QUEUE); 1084296177Sjhibbits} 1085296177Sjhibbits 1086296177Sjhibbitst_Error QM_SetException(t_Handle h_Qm, e_QmExceptions exception, bool enable) 1087296177Sjhibbits{ 1088296177Sjhibbits t_Qm *p_Qm = (t_Qm*)h_Qm; 1089296177Sjhibbits t_Error err = E_OK; 1090296177Sjhibbits 1091296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE); 1092296177Sjhibbits SANITY_CHECK_RETURN_ERROR(!p_Qm->p_QmDriverParams, E_INVALID_HANDLE); 1093296177Sjhibbits 1094296177Sjhibbits if ((err = SetException(p_Qm, exception, enable)) != E_OK) 1095296177Sjhibbits RETURN_ERROR(MINOR, err, NO_MSG); 1096296177Sjhibbits 1097296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->err_ier, p_Qm->exceptions); 1098296177Sjhibbits 1099296177Sjhibbits return E_OK; 1100296177Sjhibbits} 1101296177Sjhibbits 1102296177Sjhibbitst_Error QM_GetRevision(t_Handle h_Qm, t_QmRevisionInfo *p_QmRevisionInfo) 1103296177Sjhibbits{ 1104296177Sjhibbits t_Qm *p_Qm = (t_Qm*)h_Qm; 1105296177Sjhibbits 1106296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE); 1107296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_QmRevisionInfo, E_NULL_POINTER); 1108296177Sjhibbits 1109296177Sjhibbits return QmGetRevision(p_Qm, p_QmRevisionInfo); 1110296177Sjhibbits} 1111296177Sjhibbits 1112296177Sjhibbitst_Error QM_ReserveQueues(t_Handle h_Qm, t_QmRsrvFqrParams *p_QmFqrParams, uint32_t *p_BaseFqid) 1113296177Sjhibbits{ 1114296177Sjhibbits t_Qm *p_Qm = (t_Qm*)h_Qm; 1115296177Sjhibbits 1116296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE); 1117296177Sjhibbits SANITY_CHECK_RETURN_ERROR(!p_Qm->p_QmDriverParams, E_INVALID_HANDLE); 1118296177Sjhibbits 1119296177Sjhibbits *p_BaseFqid = ReserveFqids(p_Qm, 1120296177Sjhibbits (uint32_t)((p_QmFqrParams->useForce && !p_QmFqrParams->numOfFqids) ? 1121296177Sjhibbits 1 : p_QmFqrParams->numOfFqids), 1122296177Sjhibbits p_QmFqrParams->qs.nonFrcQs.align, 1123296177Sjhibbits p_QmFqrParams->useForce, 1124296177Sjhibbits p_QmFqrParams->qs.frcQ.fqid); 1125296177Sjhibbits if (*p_BaseFqid == ILLEGAL_BASE) 1126296177Sjhibbits RETURN_ERROR(CRITICAL,E_INVALID_STATE,("can't allocate a fqid")); 1127296177Sjhibbits 1128296177Sjhibbits return E_OK; 1129296177Sjhibbits} 1130296177Sjhibbits 1131296177Sjhibbitst_Error QM_GetErrorInformation(t_Handle h_Qm, t_QmErrorInfo *p_errInfo) 1132296177Sjhibbits{ 1133296177Sjhibbits uint32_t ecsr, ecir; 1134296177Sjhibbits t_Qm *p_Qm = (t_Qm*)h_Qm; 1135296177Sjhibbits t_Error err = E_OK; 1136296177Sjhibbits 1137296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE); 1138296177Sjhibbits SANITY_CHECK_RETURN_ERROR(!p_Qm->p_QmDriverParams, E_INVALID_HANDLE); 1139296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_errInfo, E_NULL_POINTER); 1140296177Sjhibbits 1141296177Sjhibbits ecsr = GET_UINT32(p_Qm->p_QmRegs->ecsr); 1142296177Sjhibbits ecir = GET_UINT32(p_Qm->p_QmRegs->ecir); 1143296177Sjhibbits if ((ecsr & QM_EX_MULTI_ECC) || 1144296177Sjhibbits (ecsr & QM_EX_SINGLE_ECC)) 1145296177Sjhibbits { 1146296177Sjhibbits err = E_NOT_SUPPORTED; 1147296177Sjhibbits REPORT_ERROR(INFO, E_NOT_SUPPORTED, ("single and multi ecc, use QM_DumpRegs")); 1148296177Sjhibbits } 1149296177Sjhibbits if ((ecsr & QM_EX_ENQUEUE_QUEUE) || 1150296177Sjhibbits (ecsr & QM_EX_ENQUEUE_STATE) || 1151296177Sjhibbits (ecsr & QM_EX_ENQUEUE_OVERFLOW) || 1152296177Sjhibbits (ecsr & QM_EX_DEQUEUE_DCP) || 1153296177Sjhibbits (ecsr & QM_EX_DEQUEUE_FQ) || 1154296177Sjhibbits (ecsr & QM_EX_DEQUEUE_QUEUE) || 1155296177Sjhibbits (ecsr & QM_EX_DEQUEUE_SOURCE) || 1156296177Sjhibbits (ecsr & QM_EX_INVALID_COMMAND)) 1157296177Sjhibbits { 1158296177Sjhibbits p_errInfo->portalValid = TRUE; 1159296177Sjhibbits p_errInfo->hwPortal = (bool)(ecir & ECIR_PORTAL_TYPE); 1160296177Sjhibbits if (p_errInfo->hwPortal) 1161296177Sjhibbits p_errInfo->dcpId = (e_DpaaDcPortal)((ecir & ECIR_PORTAL_MASK) >> ECIR_PORTAL_SHIFT); 1162296177Sjhibbits else 1163296177Sjhibbits p_errInfo->swPortalId = (e_DpaaSwPortal)((ecir & ECIR_PORTAL_MASK) >> ECIR_PORTAL_SHIFT); 1164296177Sjhibbits } 1165296177Sjhibbits 1166296177Sjhibbits if ((ecsr & QM_EX_ENQUEUE_QUEUE) || 1167296177Sjhibbits (ecsr & QM_EX_ENQUEUE_STATE) || 1168296177Sjhibbits (ecsr & QM_EX_ENQUEUE_OVERFLOW) || 1169296177Sjhibbits (ecsr & QM_EX_ENQUEUE_CHANNEL) || 1170296177Sjhibbits (ecsr & QM_EX_DEQUEUE_QUEUE) || 1171296177Sjhibbits (ecsr & QM_EX_DEQUEUE_FQ)) 1172296177Sjhibbits { 1173296177Sjhibbits p_errInfo->fqidValid = TRUE; 1174296177Sjhibbits p_errInfo->fqid = ((ecir & ECIR_FQID_MASK) >> ECIR_FQID_SHIFT); 1175296177Sjhibbits } 1176296177Sjhibbits 1177296177Sjhibbits WRITE_UINT32(p_Qm->p_QmRegs->ecsr, ecsr); 1178296177Sjhibbits 1179296177Sjhibbits return ERROR_CODE(err); 1180296177Sjhibbits} 1181296177Sjhibbits 1182296177Sjhibbits#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0)) 1183296177Sjhibbitst_Error QM_DumpRegs(t_Handle h_Qm) 1184296177Sjhibbits{ 1185296177Sjhibbits t_Qm *p_Qm = (t_Qm *)h_Qm; 1186296177Sjhibbits uint8_t i = 0; 1187296177Sjhibbits 1188296177Sjhibbits DECLARE_DUMP; 1189296177Sjhibbits 1190296177Sjhibbits SANITY_CHECK_RETURN_ERROR(p_Qm, E_INVALID_HANDLE); 1191296177Sjhibbits SANITY_CHECK_RETURN_ERROR(!p_Qm->p_QmDriverParams, E_INVALID_STATE); 1192296177Sjhibbits 1193296177Sjhibbits DUMP_SUBTITLE(("\n")); 1194296177Sjhibbits DUMP_TITLE(p_Qm->p_QmRegs, ("QmRegs Regs")); 1195296177Sjhibbits 1196296177Sjhibbits DUMP_SUBSTRUCT_ARRAY(i, QM_NUM_OF_SWP) 1197296177Sjhibbits { 1198296177Sjhibbits DUMP_VAR(&p_Qm->p_QmRegs->swpConfRegs[i], lio_cfg); 1199296177Sjhibbits DUMP_VAR(&p_Qm->p_QmRegs->swpConfRegs[i], io_cfg); 1200296177Sjhibbits DUMP_VAR(&p_Qm->p_QmRegs->swpConfRegs[i], dd_cfg); 1201296177Sjhibbits } 1202296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, qman_dd_cfg); 1203296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, qcsp_dd_ihrsr); 1204296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, qcsp_dd_ihrfr); 1205296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, qcsp_dd_hasr); 1206296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, dcp_dd_ihrsr); 1207296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, dcp_dd_ihrfr); 1208296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, dcp_dd_hasr); 1209296177Sjhibbits DUMP_SUBSTRUCT_ARRAY(i, QM_NUM_OF_DCP) 1210296177Sjhibbits { 1211296177Sjhibbits DUMP_VAR(&p_Qm->p_QmRegs->dcpConfRegs[i], cfg); 1212296177Sjhibbits DUMP_VAR(&p_Qm->p_QmRegs->dcpConfRegs[i], dd_cfg); 1213296177Sjhibbits DUMP_VAR(&p_Qm->p_QmRegs->dcpConfRegs[i], dlm_cfg); 1214296177Sjhibbits DUMP_VAR(&p_Qm->p_QmRegs->dcpConfRegs[i], dlm_avg); 1215296177Sjhibbits } 1216296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, pfdr_fpc); 1217296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, pfdr_fp_head); 1218296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, pfdr_fp_tail); 1219296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, pfdr_fp_lwit); 1220296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, pfdr_cfg); 1221296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, sfdr_cfg); 1222296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, sfdr_in_use); 1223296177Sjhibbits DUMP_ARR(p_Qm->p_QmRegs, wq_cs_cfg); 1224296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, wq_def_enq_wqid); 1225296177Sjhibbits DUMP_ARR(p_Qm->p_QmRegs, wq_sc_dd_cfg); 1226296177Sjhibbits DUMP_ARR(p_Qm->p_QmRegs, wq_pc_dd_cs_cfg); 1227296177Sjhibbits DUMP_ARR(p_Qm->p_QmRegs, wq_dc0_dd_cs_cfg); 1228296177Sjhibbits DUMP_ARR(p_Qm->p_QmRegs, wq_dc1_dd_cs_cfg); 1229296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, wq_dc2_dd_cs_cfg); 1230296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, wq_dc3_dd_cs_cfg); 1231296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, cm_cfg); 1232296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, ecsr); 1233296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, ecir); 1234296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, eadr); 1235296177Sjhibbits DUMP_ARR(p_Qm->p_QmRegs, edata); 1236296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, sbet); 1237296177Sjhibbits DUMP_ARR(p_Qm->p_QmRegs, sbec); 1238296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, mcr); 1239296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, mcp0); 1240296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, mcp1); 1241296177Sjhibbits DUMP_ARR(p_Qm->p_QmRegs, mr); 1242296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, idle_stat); 1243296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, ip_rev_1); 1244296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, ip_rev_2); 1245296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, fqd_bare); 1246296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, fqd_bar); 1247296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, fqd_ar); 1248296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, pfdr_bare); 1249296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, pfdr_bar); 1250296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, pfdr_ar); 1251296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, qcsp_bare); 1252296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, qcsp_bar); 1253296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, ci_sched_cfg); 1254296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, srcidr); 1255296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, liodnr); 1256296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, ci_rlm_cfg); 1257296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, ci_rlm_avg); 1258296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, err_isr); 1259296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, err_ier); 1260296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, err_isdr); 1261296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, err_iir); 1262296177Sjhibbits DUMP_VAR(p_Qm->p_QmRegs, err_her); 1263296177Sjhibbits 1264296177Sjhibbits return E_OK; 1265296177Sjhibbits} 1266296177Sjhibbits#endif /* (defined(DEBUG_ERRORS) && ... */ 1267