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