1296177Sjhibbits/* Copyright (c) 2008-2011 Freescale Semiconductor, Inc.
2296177Sjhibbits * All rights reserved.
3296177Sjhibbits *
4296177Sjhibbits * Redistribution and use in source and binary forms, with or without
5296177Sjhibbits * modification, are permitted provided that the following conditions are met:
6296177Sjhibbits *     * Redistributions of source code must retain the above copyright
7296177Sjhibbits *       notice, this list of conditions and the following disclaimer.
8296177Sjhibbits *     * Redistributions in binary form must reproduce the above copyright
9296177Sjhibbits *       notice, this list of conditions and the following disclaimer in the
10296177Sjhibbits *       documentation and/or other materials provided with the distribution.
11296177Sjhibbits *     * Neither the name of Freescale Semiconductor nor the
12296177Sjhibbits *       names of its contributors may be used to endorse or promote products
13296177Sjhibbits *       derived from this software without specific prior written permission.
14296177Sjhibbits *
15296177Sjhibbits *
16296177Sjhibbits * ALTERNATIVELY, this software may be distributed under the terms of the
17296177Sjhibbits * GNU General Public License ("GPL") as published by the Free Software
18296177Sjhibbits * Foundation, either version 2 of that License or (at your option) any
19296177Sjhibbits * later version.
20296177Sjhibbits *
21296177Sjhibbits * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22296177Sjhibbits * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23296177Sjhibbits * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24296177Sjhibbits * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25296177Sjhibbits * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26296177Sjhibbits * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27296177Sjhibbits * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28296177Sjhibbits * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29296177Sjhibbits * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30296177Sjhibbits * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31296177Sjhibbits */
32296177Sjhibbits
33296177Sjhibbits/******************************************************************************
34296177Sjhibbits @File          fm_pcd.c
35296177Sjhibbits
36296177Sjhibbits @Description   FM PCD ...
37296177Sjhibbits*//***************************************************************************/
38296177Sjhibbits#include "std_ext.h"
39296177Sjhibbits#include "error_ext.h"
40296177Sjhibbits#include "string_ext.h"
41296177Sjhibbits#include "xx_ext.h"
42296177Sjhibbits#include "sprint_ext.h"
43296177Sjhibbits#include "debug_ext.h"
44296177Sjhibbits#include "net_ext.h"
45296177Sjhibbits#include "fm_ext.h"
46296177Sjhibbits#include "fm_pcd_ext.h"
47296177Sjhibbits
48296177Sjhibbits#include "fm_common.h"
49296177Sjhibbits#include "fm_pcd.h"
50296177Sjhibbits#include "fm_pcd_ipc.h"
51296177Sjhibbits#include "fm_hc.h"
52296177Sjhibbits
53296177Sjhibbits
54296177Sjhibbitsstatic t_Error CheckFmPcdParameters(t_FmPcd *p_FmPcd)
55296177Sjhibbits{
56296177Sjhibbits    if(!p_FmPcd->h_Fm)
57296177Sjhibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("h_Fm has to be initialized"));
58296177Sjhibbits
59296177Sjhibbits    if(p_FmPcd->guestId == NCSW_MASTER_ID)
60296177Sjhibbits    {
61296177Sjhibbits        if(p_FmPcd->p_FmPcdKg && !p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs)
62296177Sjhibbits            RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Something WRONG"));
63296177Sjhibbits
64296177Sjhibbits        if(p_FmPcd->p_FmPcdPlcr && !p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs)
65296177Sjhibbits            RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Something WRONG"));
66296177Sjhibbits
67296177Sjhibbits        if(!p_FmPcd->f_Exception)
68296177Sjhibbits            RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("f_FmPcdExceptions has to be initialized"));
69296177Sjhibbits
70296177Sjhibbits        if((!p_FmPcd->f_FmPcdIndexedException) && (p_FmPcd->p_FmPcdPlcr || p_FmPcd->p_FmPcdKg))
71296177Sjhibbits            RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("f_FmPcdIndexedException has to be initialized"));
72296177Sjhibbits
73296177Sjhibbits        if(p_FmPcd->p_FmPcdDriverParam->prsMaxParseCycleLimit > PRS_MAX_CYCLE_LIMIT)
74296177Sjhibbits            RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("prsMaxParseCycleLimit has to be less than 8191"));
75296177Sjhibbits    }
76296177Sjhibbits
77296177Sjhibbits    return E_OK;
78296177Sjhibbits}
79296177Sjhibbits
80296177Sjhibbitsstatic volatile bool blockingFlag = FALSE;
81296177Sjhibbitsstatic void FmPcdIpcMsgCompletionCB(t_Handle   h_FmPcd,
82296177Sjhibbits                                    uint8_t    *p_Msg,
83296177Sjhibbits                                    uint8_t    *p_Reply,
84296177Sjhibbits                                    uint32_t   replyLength,
85296177Sjhibbits                                    t_Error    status)
86296177Sjhibbits{
87296177Sjhibbits    UNUSED(h_FmPcd);UNUSED(p_Msg);UNUSED(p_Reply);UNUSED(replyLength);UNUSED(status);
88296177Sjhibbits    blockingFlag = FALSE;
89296177Sjhibbits}
90296177Sjhibbits
91296177Sjhibbitsstatic t_Error FmPcdHandleIpcMsgCB(t_Handle  h_FmPcd,
92296177Sjhibbits                                   uint8_t   *p_Msg,
93296177Sjhibbits                                   uint32_t  msgLength,
94296177Sjhibbits                                   uint8_t   *p_Reply,
95296177Sjhibbits                                   uint32_t  *p_ReplyLength)
96296177Sjhibbits{
97296177Sjhibbits    t_FmPcd             *p_FmPcd = (t_FmPcd*)h_FmPcd;
98296177Sjhibbits    t_Error             err = E_OK;
99296177Sjhibbits    t_FmPcdIpcMsg       *p_IpcMsg   = (t_FmPcdIpcMsg*)p_Msg;
100296177Sjhibbits    t_FmPcdIpcReply     *p_IpcReply = (t_FmPcdIpcReply*)p_Reply;
101296177Sjhibbits
102296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
103296177Sjhibbits    SANITY_CHECK_RETURN_ERROR((msgLength >= sizeof(uint32_t)), E_INVALID_VALUE);
104296177Sjhibbits
105296177Sjhibbits#ifdef DISABLE_SANITY_CHECKS
106296177Sjhibbits    UNUSED(msgLength);
107296177Sjhibbits#endif /* DISABLE_SANITY_CHECKS */
108296177Sjhibbits
109296177Sjhibbits    ASSERT_COND(p_Msg);
110296177Sjhibbits
111296177Sjhibbits    memset(p_IpcReply, 0, (sizeof(uint8_t) * FM_PCD_MAX_REPLY_SIZE));
112296177Sjhibbits    *p_ReplyLength = 0;
113296177Sjhibbits
114296177Sjhibbits    switch(p_IpcMsg->msgId)
115296177Sjhibbits    {
116296177Sjhibbits        case (FM_PCD_MASTER_IS_ALIVE):
117296177Sjhibbits            *(uint8_t*)(p_IpcReply->replyBody) = 1;
118296177Sjhibbits            p_IpcReply->error = E_OK;
119296177Sjhibbits            *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);
120296177Sjhibbits            break;
121296177Sjhibbits        case (FM_PCD_MASTER_IS_ENABLED):
122296177Sjhibbits            /* count partitions registrations */
123296177Sjhibbits            if(p_FmPcd->enabled)
124296177Sjhibbits                p_FmPcd->numOfEnabledGuestPartitionsPcds++;
125296177Sjhibbits            *(uint8_t*)(p_IpcReply->replyBody)  = (uint8_t)p_FmPcd->enabled;
126296177Sjhibbits            p_IpcReply->error = E_OK;
127296177Sjhibbits            *p_ReplyLength = sizeof(uint32_t) + sizeof(uint8_t);
128296177Sjhibbits            break;
129296177Sjhibbits        case (FM_PCD_GUEST_DISABLE):
130296177Sjhibbits            if(p_FmPcd->numOfEnabledGuestPartitionsPcds)
131296177Sjhibbits            {
132296177Sjhibbits                p_FmPcd->numOfEnabledGuestPartitionsPcds--;
133296177Sjhibbits                p_IpcReply->error = E_OK;
134296177Sjhibbits            }
135296177Sjhibbits            else
136296177Sjhibbits            {
137296177Sjhibbits                REPORT_ERROR(MINOR, E_INVALID_STATE,("Trying to disable an unregistered partition"));
138296177Sjhibbits                p_IpcReply->error = E_INVALID_STATE;
139296177Sjhibbits            }
140296177Sjhibbits            *p_ReplyLength = sizeof(uint32_t);
141296177Sjhibbits            break;
142296177Sjhibbits        case(FM_PCD_GET_COUNTER):
143296177Sjhibbits        {
144296177Sjhibbits            e_FmPcdCounters inCounter;
145296177Sjhibbits            uint32_t        outCounter;
146296177Sjhibbits
147296177Sjhibbits            memcpy((uint8_t*)&inCounter, p_IpcMsg->msgBody, sizeof(uint32_t));
148296177Sjhibbits            outCounter = FM_PCD_GetCounter(h_FmPcd, inCounter);
149296177Sjhibbits            memcpy(p_IpcReply->replyBody, (uint8_t*)&outCounter, sizeof(uint32_t));
150296177Sjhibbits            p_IpcReply->error = E_OK;
151296177Sjhibbits            *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);
152296177Sjhibbits            break;
153296177Sjhibbits        }
154296177Sjhibbits        case (FM_PCD_ALLOC_KG_SCHEMES):
155296177Sjhibbits        {
156296177Sjhibbits            t_FmPcdIpcKgSchemesParams   ipcSchemesParams;
157296177Sjhibbits
158296177Sjhibbits            memcpy((uint8_t*)&ipcSchemesParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgSchemesParams));
159296177Sjhibbits            err = FmPcdKgAllocSchemes(h_FmPcd,
160296177Sjhibbits                                      ipcSchemesParams.numOfSchemes,
161296177Sjhibbits                                      ipcSchemesParams.guestId,
162296177Sjhibbits                                      p_IpcReply->replyBody);
163296177Sjhibbits            p_IpcReply->error = err;
164296177Sjhibbits            *p_ReplyLength = sizeof(uint32_t) + ipcSchemesParams.numOfSchemes*sizeof(uint8_t);
165296177Sjhibbits            break;
166296177Sjhibbits        }
167296177Sjhibbits        case (FM_PCD_FREE_KG_SCHEMES):
168296177Sjhibbits        {
169296177Sjhibbits            t_FmPcdIpcKgSchemesParams   ipcSchemesParams;
170296177Sjhibbits
171296177Sjhibbits            memcpy((uint8_t*)&ipcSchemesParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgSchemesParams));
172296177Sjhibbits            err = FmPcdKgFreeSchemes(h_FmPcd,
173296177Sjhibbits                                     ipcSchemesParams.numOfSchemes,
174296177Sjhibbits                                     ipcSchemesParams.guestId,
175296177Sjhibbits                                     ipcSchemesParams.schemesIds);
176296177Sjhibbits            p_IpcReply->error = err;
177296177Sjhibbits            *p_ReplyLength = sizeof(uint32_t);
178296177Sjhibbits            break;
179296177Sjhibbits        }
180296177Sjhibbits        case (FM_PCD_ALLOC_KG_CLSPLAN):
181296177Sjhibbits        {
182296177Sjhibbits            t_FmPcdIpcKgClsPlanParams   ipcKgClsPlanParams;
183296177Sjhibbits
184296177Sjhibbits            memcpy((uint8_t*)&ipcKgClsPlanParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgClsPlanParams));
185296177Sjhibbits            err = KgAllocClsPlanEntries(h_FmPcd,
186296177Sjhibbits                                        ipcKgClsPlanParams.numOfClsPlanEntries,
187296177Sjhibbits                                        ipcKgClsPlanParams.guestId,
188296177Sjhibbits                                        p_IpcReply->replyBody);
189296177Sjhibbits            p_IpcReply->error = err;
190296177Sjhibbits            *p_ReplyLength =  sizeof(uint32_t) + sizeof(uint8_t);
191296177Sjhibbits            break;
192296177Sjhibbits        }
193296177Sjhibbits        case (FM_PCD_FREE_KG_CLSPLAN):
194296177Sjhibbits        {
195296177Sjhibbits            t_FmPcdIpcKgClsPlanParams   ipcKgClsPlanParams;
196296177Sjhibbits
197296177Sjhibbits            memcpy((uint8_t*)&ipcKgClsPlanParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcKgClsPlanParams));
198296177Sjhibbits            KgFreeClsPlanEntries(h_FmPcd,
199296177Sjhibbits                                       ipcKgClsPlanParams.numOfClsPlanEntries,
200296177Sjhibbits                                       ipcKgClsPlanParams.guestId,
201296177Sjhibbits                                       ipcKgClsPlanParams.clsPlanBase);
202296177Sjhibbits            *p_ReplyLength = sizeof(uint32_t);
203296177Sjhibbits            break;
204296177Sjhibbits        }
205296177Sjhibbits        case (FM_PCD_ALLOC_PROFILES):
206296177Sjhibbits        {
207296177Sjhibbits            t_FmPcdIpcPlcrAllocParams   ipcPlcrAllocParams;
208296177Sjhibbits            uint16_t                    profilesBase;
209296177Sjhibbits
210296177Sjhibbits            memcpy((uint8_t*)&ipcPlcrAllocParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcPlcrAllocParams));
211296177Sjhibbits            err = PlcrAllocProfiles(h_FmPcd,
212296177Sjhibbits                                    ipcPlcrAllocParams.hardwarePortId,
213296177Sjhibbits                                    ipcPlcrAllocParams.num,
214296177Sjhibbits                                    &profilesBase);
215296177Sjhibbits            memcpy(p_IpcReply->replyBody, (uint8_t*)&profilesBase, sizeof(uint16_t));
216296177Sjhibbits            p_IpcReply->error = err;
217296177Sjhibbits            *p_ReplyLength = sizeof(uint32_t) + sizeof(uint16_t);
218296177Sjhibbits            break;
219296177Sjhibbits        }
220296177Sjhibbits        case (FM_PCD_FREE_PROFILES):
221296177Sjhibbits        {
222296177Sjhibbits            t_FmPcdIpcPlcrAllocParams   ipcPlcrAllocParams;
223296177Sjhibbits
224296177Sjhibbits            memcpy((uint8_t*)&ipcPlcrAllocParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcPlcrAllocParams));
225296177Sjhibbits            err = PlcrFreeProfiles(h_FmPcd,
226296177Sjhibbits                                   ipcPlcrAllocParams.hardwarePortId,
227296177Sjhibbits                                   ipcPlcrAllocParams.num,
228296177Sjhibbits                                   ipcPlcrAllocParams.plcrProfilesBase);
229296177Sjhibbits            p_IpcReply->error = err;
230296177Sjhibbits            *p_ReplyLength = sizeof(uint32_t);
231296177Sjhibbits            break;
232296177Sjhibbits        }
233296177Sjhibbits        case (FM_PCD_ALLOC_SHARED_PROFILES):
234296177Sjhibbits        {
235296177Sjhibbits            uint16_t            numOfProfiles;
236296177Sjhibbits            uint16_t            profilesIds[FM_PCD_PLCR_NUM_ENTRIES];
237296177Sjhibbits            uint32_t            profilesMask[FM_PCD_PLCR_NUM_ENTRIES/32];
238296177Sjhibbits            int                 i;
239296177Sjhibbits
240296177Sjhibbits            memset(profilesMask, 0, FM_PCD_PLCR_NUM_ENTRIES/32 * sizeof(uint32_t));
241296177Sjhibbits            memcpy((uint8_t*)&numOfProfiles, p_IpcMsg->msgBody, sizeof(uint16_t));
242296177Sjhibbits            err =  PlcrAllocSharedProfiles(h_FmPcd,
243296177Sjhibbits                                           numOfProfiles,
244296177Sjhibbits                                           profilesIds);
245296177Sjhibbits            p_IpcReply->error = err;
246296177Sjhibbits
247296177Sjhibbits            /* translate the allocated profile id's to a 32bit * 8regs mask */
248296177Sjhibbits            for(i = 0;i<numOfProfiles;i++)
249296177Sjhibbits                profilesMask[profilesIds[i]/32] |= (0x80000000 >> (profilesIds[i] % 32));
250296177Sjhibbits
251296177Sjhibbits            memcpy(p_IpcReply->replyBody, (uint8_t*)&profilesMask, sizeof(profilesMask));
252296177Sjhibbits            *p_ReplyLength = sizeof(uint32_t) + sizeof(profilesMask); /* num-of-shared-profiles */
253296177Sjhibbits            break;
254296177Sjhibbits        }
255296177Sjhibbits        case (FM_PCD_FREE_SHARED_PROFILES):
256296177Sjhibbits        {
257296177Sjhibbits            t_FmPcdIpcSharedPlcrAllocParams     ipcSharedPlcrAllocParams;
258296177Sjhibbits            uint16_t                            profilesIds[FM_PCD_PLCR_NUM_ENTRIES];
259296177Sjhibbits            int                                 i,j, index = 0;
260296177Sjhibbits            uint32_t                            walking1Mask = 0x80000000;
261296177Sjhibbits
262296177Sjhibbits            memset(profilesIds, 0, FM_PCD_PLCR_NUM_ENTRIES*sizeof(uint16_t));
263296177Sjhibbits            memcpy((uint8_t*)&ipcSharedPlcrAllocParams, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcSharedPlcrAllocParams));
264296177Sjhibbits            for(i = 0; i<FM_PCD_PLCR_NUM_ENTRIES/32 ; i++)
265296177Sjhibbits            {
266296177Sjhibbits                if(ipcSharedPlcrAllocParams.sharedProfilesMask[i])
267296177Sjhibbits                {
268296177Sjhibbits                    for(j = 0 ; j<32 ; j++)
269296177Sjhibbits                    {
270296177Sjhibbits                        if(ipcSharedPlcrAllocParams.sharedProfilesMask[i] & walking1Mask)
271296177Sjhibbits                            profilesIds[index++] = (uint16_t)(i*32+j);
272296177Sjhibbits                        walking1Mask >>= 1;
273296177Sjhibbits                    }
274296177Sjhibbits                    walking1Mask = 0x80000000;
275296177Sjhibbits                }
276296177Sjhibbits            }
277296177Sjhibbits
278296177Sjhibbits            PlcrFreeSharedProfiles(h_FmPcd,
279296177Sjhibbits                                   ipcSharedPlcrAllocParams.num,
280296177Sjhibbits                                   profilesIds);
281296177Sjhibbits            break;
282296177Sjhibbits        }
283296177Sjhibbits        case(FM_PCD_GET_SW_PRS_OFFSET):
284296177Sjhibbits        {
285296177Sjhibbits            t_FmPcdIpcSwPrsLable   ipcSwPrsLable;
286296177Sjhibbits            uint32_t               swPrsOffset;
287296177Sjhibbits
288296177Sjhibbits            memcpy((uint8_t*)&ipcSwPrsLable, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcSwPrsLable));
289296177Sjhibbits            swPrsOffset =
290296177Sjhibbits                FmPcdGetSwPrsOffset(h_FmPcd,
291296177Sjhibbits                                    (e_NetHeaderType)ipcSwPrsLable.enumHdr,
292296177Sjhibbits                                    ipcSwPrsLable.indexPerHdr);
293296177Sjhibbits            memcpy(p_IpcReply->replyBody, (uint8_t*)&swPrsOffset, sizeof(uint32_t));
294296177Sjhibbits            *p_ReplyLength = sizeof(uint32_t) + sizeof(uint32_t);
295296177Sjhibbits            break;
296296177Sjhibbits        }
297296177Sjhibbits        case(FM_PCD_PRS_INC_PORT_STATS):
298296177Sjhibbits        {
299296177Sjhibbits            t_FmPcdIpcPrsIncludePort   ipcPrsIncludePort;
300296177Sjhibbits
301296177Sjhibbits            memcpy((uint8_t*)&ipcPrsIncludePort, p_IpcMsg->msgBody, sizeof(t_FmPcdIpcPrsIncludePort));
302296177Sjhibbits            PrsIncludePortInStatistics(h_FmPcd,
303296177Sjhibbits                                       ipcPrsIncludePort.hardwarePortId,
304296177Sjhibbits                                       ipcPrsIncludePort.include);
305296177Sjhibbits           break;
306296177Sjhibbits        }
307296177Sjhibbits#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
308296177Sjhibbits       case(FM_PCD_DUMP_REGS):
309296177Sjhibbits            if((err = FM_PCD_DumpRegs(h_FmPcd)) != E_OK)
310296177Sjhibbits                REPORT_ERROR(MINOR, err, NO_MSG);
311296177Sjhibbits            break;
312296177Sjhibbits       case(FM_PCD_KG_DUMP_REGS):
313296177Sjhibbits            if((err = FM_PCD_KgDumpRegs(h_FmPcd)) != E_OK)
314296177Sjhibbits                REPORT_ERROR(MINOR, err, NO_MSG);
315296177Sjhibbits            break;
316296177Sjhibbits       case(FM_PCD_PLCR_DUMP_REGS):
317296177Sjhibbits            if((err = FM_PCD_PlcrDumpRegs(h_FmPcd)) != E_OK)
318296177Sjhibbits                REPORT_ERROR(MINOR, err, NO_MSG);
319296177Sjhibbits            break;
320296177Sjhibbits       case(FM_PCD_PLCR_PROFILE_DUMP_REGS):
321296177Sjhibbits       {
322296177Sjhibbits            t_Handle h_Profile;
323296177Sjhibbits            memcpy((uint8_t*)&h_Profile, p_IpcMsg->msgBody, sizeof(t_Handle));
324296177Sjhibbits            if((err = FM_PCD_PlcrProfileDumpRegs(h_FmPcd, h_Profile)) != E_OK)
325296177Sjhibbits                REPORT_ERROR(MINOR, err, NO_MSG);
326296177Sjhibbits            break;
327296177Sjhibbits
328296177Sjhibbits       }
329296177Sjhibbits       case(FM_PCD_PRS_DUMP_REGS):
330296177Sjhibbits            if((err = FM_PCD_PrsDumpRegs(h_FmPcd)) != E_OK)
331296177Sjhibbits                REPORT_ERROR(MINOR, err, NO_MSG);
332296177Sjhibbits            break;
333296177Sjhibbits#endif /* (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0)) */
334296177Sjhibbits        default:
335296177Sjhibbits            *p_ReplyLength = 0;
336296177Sjhibbits            RETURN_ERROR(MINOR, E_INVALID_SELECTION, ("command not found!!!"));
337296177Sjhibbits    }
338296177Sjhibbits    return E_OK;
339296177Sjhibbits}
340296177Sjhibbits
341296177Sjhibbitsvoid FmPcdSetClsPlanGrpId(t_FmPcd *p_FmPcd, uint8_t netEnvId, uint8_t clsPlanGrpId)
342296177Sjhibbits{
343296177Sjhibbits    p_FmPcd->netEnvs[netEnvId].clsPlanGrpId = clsPlanGrpId;
344296177Sjhibbits}
345296177Sjhibbits
346296177Sjhibbitst_Error PcdGetClsPlanGrpParams(t_FmPcd *p_FmPcd, t_FmPcdKgInterModuleClsPlanGrpParams *p_GrpParams)
347296177Sjhibbits{
348296177Sjhibbits    uint8_t netEnvId = p_GrpParams->netEnvId;
349296177Sjhibbits    int     i, k, j;
350296177Sjhibbits
351296177Sjhibbits    if(p_FmPcd->netEnvs[netEnvId].clsPlanGrpId != ILLEGAL_CLS_PLAN)
352296177Sjhibbits    {
353296177Sjhibbits        p_GrpParams->grpExists = TRUE;
354296177Sjhibbits        p_GrpParams->clsPlanGrpId = p_FmPcd->netEnvs[netEnvId].clsPlanGrpId;
355296177Sjhibbits        return E_OK;
356296177Sjhibbits    }
357296177Sjhibbits
358296177Sjhibbits    for (i=0; ((i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
359296177Sjhibbits              (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE)); i++)
360296177Sjhibbits    {
361296177Sjhibbits        for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
362296177Sjhibbits                   (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE)); k++)
363296177Sjhibbits        {
364296177Sjhibbits            /* if an option exists, add it to the opts list */
365296177Sjhibbits            if(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt)
366296177Sjhibbits            {
367296177Sjhibbits                /* check if this option already exists, add if it doesn't */
368296177Sjhibbits                for(j = 0;j<p_GrpParams->numOfOptions;j++)
369296177Sjhibbits                {
370296177Sjhibbits                    if(p_GrpParams->options[j] == p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt)
371296177Sjhibbits                        break;
372296177Sjhibbits                }
373296177Sjhibbits                p_GrpParams->optVectors[j] |= p_FmPcd->netEnvs[netEnvId].unitsVectors[i];
374296177Sjhibbits                if(j == p_GrpParams->numOfOptions)
375296177Sjhibbits                {
376296177Sjhibbits                    p_GrpParams->options[p_GrpParams->numOfOptions] = p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt;
377296177Sjhibbits                    p_GrpParams->numOfOptions++;
378296177Sjhibbits                }
379296177Sjhibbits            }
380296177Sjhibbits        }
381296177Sjhibbits    }
382296177Sjhibbits
383296177Sjhibbits    if(p_GrpParams->numOfOptions == 0)
384296177Sjhibbits    {
385296177Sjhibbits        if(p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId != ILLEGAL_CLS_PLAN)
386296177Sjhibbits        {
387296177Sjhibbits            p_GrpParams->grpExists = TRUE;
388296177Sjhibbits            p_GrpParams->clsPlanGrpId = p_FmPcd->p_FmPcdKg->emptyClsPlanGrpId;
389296177Sjhibbits        }
390296177Sjhibbits    }
391296177Sjhibbits
392296177Sjhibbits    return E_OK;
393296177Sjhibbits
394296177Sjhibbits}
395296177Sjhibbits
396296177Sjhibbitst_Error PcdGetVectorForOpt(t_FmPcd *p_FmPcd, uint8_t netEnvId, protocolOpt_t opt, uint32_t *p_Vector)
397296177Sjhibbits{
398296177Sjhibbits    uint8_t     j,k;
399296177Sjhibbits
400296177Sjhibbits    *p_Vector = 0;
401296177Sjhibbits
402296177Sjhibbits    for (j=0; ((j < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
403296177Sjhibbits              (p_FmPcd->netEnvs[netEnvId].units[j].hdrs[0].hdr != HEADER_TYPE_NONE)); j++)
404296177Sjhibbits    {
405296177Sjhibbits        for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
406296177Sjhibbits                  (p_FmPcd->netEnvs[netEnvId].units[j].hdrs[k].hdr != HEADER_TYPE_NONE)); k++)
407296177Sjhibbits        {
408296177Sjhibbits            if (p_FmPcd->netEnvs[netEnvId].units[j].hdrs[k].opt == opt)
409296177Sjhibbits                *p_Vector |= p_FmPcd->netEnvs[netEnvId].unitsVectors[j];
410296177Sjhibbits        }
411296177Sjhibbits    }
412296177Sjhibbits
413296177Sjhibbits    if (!*p_Vector)
414296177Sjhibbits        RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Requested option was not defined for this Network Environment Characteristics module"));
415296177Sjhibbits    else
416296177Sjhibbits        return E_OK;
417296177Sjhibbits}
418296177Sjhibbits
419296177Sjhibbitst_Error PcdGetUnitsVector(t_FmPcd *p_FmPcd, t_NetEnvParams *p_Params)
420296177Sjhibbits{
421296177Sjhibbits    int                     i;
422296177Sjhibbits
423296177Sjhibbits    p_Params->vector = 0;
424296177Sjhibbits    for(i=0; i<p_Params->numOfDistinctionUnits ;i++)
425296177Sjhibbits    {
426296177Sjhibbits        if(p_FmPcd->netEnvs[p_Params->netEnvId].units[p_Params->unitIds[i]].hdrs[0].hdr == HEADER_TYPE_NONE)
427296177Sjhibbits            RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Requested unit was not defined for this Network Environment Characteristics module"));
428296177Sjhibbits        ASSERT_COND(p_FmPcd->netEnvs[p_Params->netEnvId].unitsVectors[p_Params->unitIds[i]]);
429296177Sjhibbits        p_Params->vector |= p_FmPcd->netEnvs[p_Params->netEnvId].unitsVectors[p_Params->unitIds[i]];
430296177Sjhibbits    }
431296177Sjhibbits
432296177Sjhibbits    return E_OK;
433296177Sjhibbits}
434296177Sjhibbits
435296177Sjhibbitsbool PcdNetEnvIsUnitWithoutOpts(t_FmPcd *p_FmPcd, uint8_t netEnvId, uint32_t unitVector)
436296177Sjhibbits{
437296177Sjhibbits    int     i=0, k;
438296177Sjhibbits    /* check whether a given unit may be used by non-clsPlan users. */
439296177Sjhibbits    /* first, recognize the unit by its vector */
440296177Sjhibbits    while (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE)
441296177Sjhibbits    {
442296177Sjhibbits        if (p_FmPcd->netEnvs[netEnvId].unitsVectors[i] == unitVector)
443296177Sjhibbits        {
444296177Sjhibbits            for (k=0;
445296177Sjhibbits                 ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
446296177Sjhibbits                  (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE));
447296177Sjhibbits                 k++)
448296177Sjhibbits                /* check that no option exists */
449296177Sjhibbits                if((protocolOpt_t)p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].opt)
450296177Sjhibbits                    return FALSE;
451296177Sjhibbits            break;
452296177Sjhibbits        }
453296177Sjhibbits        i++;
454296177Sjhibbits    }
455296177Sjhibbits    /* assert that a unit was found to mach the vector */
456296177Sjhibbits    ASSERT_COND(p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE);
457296177Sjhibbits
458296177Sjhibbits    return TRUE;
459296177Sjhibbits}
460296177Sjhibbitsbool  FmPcdNetEnvIsHdrExist(t_Handle h_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr)
461296177Sjhibbits{
462296177Sjhibbits    t_FmPcd     *p_FmPcd = (t_FmPcd*)h_FmPcd;
463296177Sjhibbits    int         i, k;
464296177Sjhibbits
465296177Sjhibbits    ASSERT_COND(p_FmPcd);
466296177Sjhibbits
467296177Sjhibbits    for (i=0; ((i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS) &&
468296177Sjhibbits              (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE)); i++)
469296177Sjhibbits    {
470296177Sjhibbits        for (k=0; ((k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS) &&
471296177Sjhibbits                  (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE)); k++)
472296177Sjhibbits            if (p_FmPcd->netEnvs[netEnvId].units[i].hdrs[k].hdr == hdr)
473296177Sjhibbits                return TRUE;
474296177Sjhibbits    }
475296177Sjhibbits    for (i=0; ((i < FM_PCD_MAX_NUM_OF_PRIVATE_HDRS) &&
476296177Sjhibbits              (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr != HEADER_TYPE_NONE)); i++)
477296177Sjhibbits    {
478296177Sjhibbits        if (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr == hdr)
479296177Sjhibbits            return TRUE;
480296177Sjhibbits    }
481296177Sjhibbits
482296177Sjhibbits    return FALSE;
483296177Sjhibbits}
484296177Sjhibbits
485296177Sjhibbitse_NetHeaderType FmPcdGetAliasHdr(t_FmPcd *p_FmPcd, uint8_t netEnvId, e_NetHeaderType hdr)
486296177Sjhibbits{
487296177Sjhibbits    int         i;
488296177Sjhibbits
489296177Sjhibbits    ASSERT_COND(p_FmPcd);
490296177Sjhibbits
491296177Sjhibbits    for (i=0; (i < FM_PCD_MAX_NUM_OF_PRIVATE_HDRS)
492296177Sjhibbits        && (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr != HEADER_TYPE_NONE); i++)
493296177Sjhibbits    {
494296177Sjhibbits        if (p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].hdr == hdr)
495296177Sjhibbits            return p_FmPcd->netEnvs[netEnvId].aliasHdrs[i].aliasHdr;
496296177Sjhibbits    }
497296177Sjhibbits
498296177Sjhibbits    return HEADER_TYPE_NONE;
499296177Sjhibbits}
500296177Sjhibbits
501296177Sjhibbitsvoid   FmPcdPortRegister(t_Handle h_FmPcd, t_Handle h_FmPort, uint8_t hardwarePortId)
502296177Sjhibbits{
503296177Sjhibbits    t_FmPcd         *p_FmPcd = (t_FmPcd*)h_FmPcd;
504296177Sjhibbits    uint16_t        swPortIndex = 0;
505296177Sjhibbits
506296177Sjhibbits    HW_PORT_ID_TO_SW_PORT_INDX(swPortIndex, hardwarePortId);
507296177Sjhibbits
508296177Sjhibbits    p_FmPcd->p_FmPcdPlcr->portsMapping[swPortIndex].h_FmPort = h_FmPort;
509296177Sjhibbits}
510296177Sjhibbits
511296177Sjhibbitsuint32_t FmPcdGetLcv(t_Handle h_FmPcd, uint32_t netEnvId, uint8_t hdrNum)
512296177Sjhibbits{
513296177Sjhibbits    t_FmPcd     *p_FmPcd = (t_FmPcd*)h_FmPcd;
514296177Sjhibbits
515296177Sjhibbits    return p_FmPcd->netEnvs[netEnvId].lcvs[hdrNum];
516296177Sjhibbits}
517296177Sjhibbits
518296177Sjhibbitsuint32_t FmPcdGetMacsecLcv(t_Handle h_FmPcd, uint32_t netEnvId)
519296177Sjhibbits{
520296177Sjhibbits    t_FmPcd     *p_FmPcd = (t_FmPcd*)h_FmPcd;
521296177Sjhibbits
522296177Sjhibbits    return p_FmPcd->netEnvs[netEnvId].macsecVector;
523296177Sjhibbits}
524296177Sjhibbits
525296177Sjhibbitsvoid FmPcdIncNetEnvOwners(t_Handle h_FmPcd, uint8_t netEnvId)
526296177Sjhibbits{
527296177Sjhibbits    ((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners++;
528296177Sjhibbits}
529296177Sjhibbits
530296177Sjhibbitsvoid FmPcdDecNetEnvOwners(t_Handle h_FmPcd, uint8_t netEnvId)
531296177Sjhibbits{
532296177Sjhibbits    ASSERT_COND(((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners);
533296177Sjhibbits    ((t_FmPcd*)h_FmPcd)->netEnvs[netEnvId].owners--;
534296177Sjhibbits}
535296177Sjhibbits
536296177Sjhibbitsuint32_t FmPcdLock(t_Handle h_FmPcd)
537296177Sjhibbits{
538296177Sjhibbits    return XX_LockIntrSpinlock(((t_FmPcd*)h_FmPcd)->h_Spinlock);
539296177Sjhibbits}
540296177Sjhibbits
541296177Sjhibbitsvoid FmPcdUnlock(t_Handle h_FmPcd, uint32_t intFlags)
542296177Sjhibbits{
543296177Sjhibbits    XX_UnlockIntrSpinlock(((t_FmPcd*)h_FmPcd)->h_Spinlock, intFlags);
544296177Sjhibbits}
545296177Sjhibbits
546296177Sjhibbitst_Handle FmPcdGetHcHandle(t_Handle h_FmPcd)
547296177Sjhibbits{
548296177Sjhibbits    ASSERT_COND(h_FmPcd);
549296177Sjhibbits    SANITY_CHECK_RETURN_VALUE(((t_FmPcd*)h_FmPcd)->h_Hc, E_INVALID_HANDLE, NULL);
550296177Sjhibbits    return ((t_FmPcd*)h_FmPcd)->h_Hc;
551296177Sjhibbits}
552296177Sjhibbits
553296177Sjhibbits/**********************************************************************************************************/
554296177Sjhibbits/*              API                                                                                       */
555296177Sjhibbits/**********************************************************************************************************/
556296177Sjhibbits
557296177Sjhibbitst_Handle FM_PCD_Config(t_FmPcdParams *p_FmPcdParams)
558296177Sjhibbits{
559296177Sjhibbits    t_FmPcd             *p_FmPcd = NULL;
560296177Sjhibbits    t_FmPhysAddr        physicalMuramBase;
561296177Sjhibbits    uint8_t             i;
562296177Sjhibbits
563296177Sjhibbits    SANITY_CHECK_RETURN_VALUE(p_FmPcdParams, E_INVALID_HANDLE,NULL);
564296177Sjhibbits
565296177Sjhibbits    p_FmPcd = (t_FmPcd *) XX_Malloc(sizeof(t_FmPcd));
566296177Sjhibbits    if (!p_FmPcd)
567296177Sjhibbits    {
568296177Sjhibbits        REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd"));
569296177Sjhibbits        return NULL;
570296177Sjhibbits    }
571296177Sjhibbits    memset(p_FmPcd, 0, sizeof(t_FmPcd));
572296177Sjhibbits
573296177Sjhibbits    p_FmPcd->p_FmPcdDriverParam = (t_FmPcdDriverParam *) XX_Malloc(sizeof(t_FmPcdDriverParam));
574296177Sjhibbits    if (!p_FmPcd->p_FmPcdDriverParam)
575296177Sjhibbits    {
576296177Sjhibbits        XX_Free(p_FmPcd);
577296177Sjhibbits        REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd Driver Param"));
578296177Sjhibbits        return NULL;
579296177Sjhibbits    }
580296177Sjhibbits    memset(p_FmPcd->p_FmPcdDriverParam, 0, sizeof(t_FmPcdDriverParam));
581296177Sjhibbits
582296177Sjhibbits    p_FmPcd->h_Fm = p_FmPcdParams->h_Fm;
583296177Sjhibbits    p_FmPcd->guestId = FmGetGuestId(p_FmPcd->h_Fm);
584296177Sjhibbits    p_FmPcd->h_FmMuram = FmGetMuramHandle(p_FmPcd->h_Fm);
585296177Sjhibbits    FmGetPhysicalMuramBase(p_FmPcdParams->h_Fm, &physicalMuramBase);
586296177Sjhibbits    p_FmPcd->physicalMuramBase = (uint64_t)((uint64_t)(&physicalMuramBase)->low | ((uint64_t)(&physicalMuramBase)->high << 32));
587296177Sjhibbits
588296177Sjhibbits    for(i = 0; i<FM_MAX_NUM_OF_PORTS; i++)
589296177Sjhibbits        p_FmPcd->netEnvs[i].clsPlanGrpId = ILLEGAL_CLS_PLAN;
590296177Sjhibbits
591296177Sjhibbits    if (p_FmPcdParams->useHostCommand)
592296177Sjhibbits    {
593296177Sjhibbits        t_FmHcParams    hcParams;
594296177Sjhibbits
595296177Sjhibbits        memset(&hcParams, 0, sizeof(hcParams));
596296177Sjhibbits        hcParams.h_Fm = p_FmPcd->h_Fm;
597296177Sjhibbits        hcParams.h_FmPcd = (t_Handle)p_FmPcd;
598296177Sjhibbits        memcpy((uint8_t*)&hcParams.params, (uint8_t*)&p_FmPcdParams->hc, sizeof(t_FmPcdHcParams));
599296177Sjhibbits        p_FmPcd->h_Hc = FmHcConfigAndInit(&hcParams);
600296177Sjhibbits        if (!p_FmPcd->h_Hc)
601296177Sjhibbits        {
602296177Sjhibbits            REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd HC"));
603296177Sjhibbits            FM_PCD_Free(p_FmPcd);
604296177Sjhibbits            return NULL;
605296177Sjhibbits        }
606296177Sjhibbits    }
607296177Sjhibbits    else if(p_FmPcd->guestId != NCSW_MASTER_ID)
608296177Sjhibbits        REPORT_ERROR(MAJOR, E_INVALID_STATE, ("No Host Command defined for a guest partition."));
609296177Sjhibbits
610296177Sjhibbits    if(p_FmPcdParams->kgSupport)
611296177Sjhibbits    {
612296177Sjhibbits        p_FmPcd->p_FmPcdKg = (t_FmPcdKg *)KgConfig(p_FmPcd, p_FmPcdParams);
613296177Sjhibbits        if(!p_FmPcd->p_FmPcdKg)
614296177Sjhibbits        {
615296177Sjhibbits            REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd Keygen"));
616296177Sjhibbits            FM_PCD_Free(p_FmPcd);
617296177Sjhibbits            return NULL;
618296177Sjhibbits        }
619296177Sjhibbits    }
620296177Sjhibbits
621296177Sjhibbits    if(p_FmPcdParams->plcrSupport)
622296177Sjhibbits    {
623296177Sjhibbits        p_FmPcd->p_FmPcdPlcr = (t_FmPcdPlcr *)PlcrConfig(p_FmPcd, p_FmPcdParams);
624296177Sjhibbits        if(!p_FmPcd->p_FmPcdPlcr)
625296177Sjhibbits        {
626296177Sjhibbits            REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd Policer"));
627296177Sjhibbits            FM_PCD_Free(p_FmPcd);
628296177Sjhibbits            return NULL;
629296177Sjhibbits        }
630296177Sjhibbits    }
631296177Sjhibbits
632296177Sjhibbits    if(p_FmPcdParams->prsSupport)
633296177Sjhibbits    {
634296177Sjhibbits        p_FmPcd->p_FmPcdPrs = (t_FmPcdPrs *)PrsConfig(p_FmPcd, p_FmPcdParams);
635296177Sjhibbits        if(!p_FmPcd->p_FmPcdPrs)
636296177Sjhibbits        {
637296177Sjhibbits            REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd Parser"));
638296177Sjhibbits            FM_PCD_Free(p_FmPcd);
639296177Sjhibbits            return NULL;
640296177Sjhibbits        }
641296177Sjhibbits    }
642296177Sjhibbits
643296177Sjhibbits    p_FmPcd->h_Spinlock = XX_InitSpinlock();
644296177Sjhibbits    if (!p_FmPcd->h_Spinlock)
645296177Sjhibbits    {
646296177Sjhibbits        REPORT_ERROR(MAJOR, E_NO_MEMORY, ("FM Pcd spinlock"));
647296177Sjhibbits        FM_PCD_Free(p_FmPcd);
648296177Sjhibbits        return NULL;
649296177Sjhibbits    }
650296177Sjhibbits
651296177Sjhibbits    p_FmPcd->numOfEnabledGuestPartitionsPcds = 0;
652296177Sjhibbits
653296177Sjhibbits    p_FmPcd->f_Exception                = p_FmPcdParams->f_Exception;
654296177Sjhibbits    p_FmPcd->f_FmPcdIndexedException    = p_FmPcdParams->f_ExceptionId;
655296177Sjhibbits    p_FmPcd->h_App                      = p_FmPcdParams->h_App;
656296177Sjhibbits
657296177Sjhibbits    return p_FmPcd;
658296177Sjhibbits}
659296177Sjhibbits
660296177Sjhibbitst_Error FM_PCD_Init(t_Handle h_FmPcd)
661296177Sjhibbits{
662296177Sjhibbits    t_FmPcd         *p_FmPcd = (t_FmPcd*)h_FmPcd;
663296177Sjhibbits    t_Error         err = E_OK;
664296177Sjhibbits    t_FmPcdIpcMsg   msg;
665296177Sjhibbits
666296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
667296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(p_FmPcd->p_FmPcdDriverParam, E_INVALID_HANDLE);
668296177Sjhibbits
669296177Sjhibbits    if(p_FmPcd->guestId != NCSW_MASTER_ID)
670296177Sjhibbits    {
671296177Sjhibbits        uint8_t                 isMasterAlive = 0;
672296177Sjhibbits        t_FmPcdIpcReply         reply;
673296177Sjhibbits        uint32_t                replyLength;
674296177Sjhibbits
675296177Sjhibbits        memset(p_FmPcd->fmPcdIpcHandlerModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE);
676296177Sjhibbits        if(Sprint (p_FmPcd->fmPcdIpcHandlerModuleName, "FM_PCD_%d_%d", FmGetId(p_FmPcd->h_Fm), NCSW_MASTER_ID) != 10)
677296177Sjhibbits            RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
678296177Sjhibbits        memset(p_FmPcd->fmPcdModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE);
679296177Sjhibbits        if(Sprint (p_FmPcd->fmPcdModuleName, "FM_PCD_%d_%d",FmGetId(p_FmPcd->h_Fm), p_FmPcd->guestId) != (p_FmPcd->guestId<10 ? 10:11))
680296177Sjhibbits            RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
681296177Sjhibbits
682296177Sjhibbits        p_FmPcd->h_IpcSession = XX_IpcInitSession(p_FmPcd->fmPcdIpcHandlerModuleName, p_FmPcd->fmPcdModuleName);
683296177Sjhibbits        if (p_FmPcd->h_IpcSession == NULL)
684296177Sjhibbits            RETURN_ERROR(MAJOR, E_NOT_AVAILABLE, ("FM PCD Guest %d IPC session", p_FmPcd->guestId));
685296177Sjhibbits
686296177Sjhibbits        memset(&msg, 0, sizeof(msg));
687296177Sjhibbits        memset(&reply, 0, sizeof(reply));
688296177Sjhibbits        msg.msgId = FM_PCD_MASTER_IS_ALIVE;
689296177Sjhibbits        msg.msgBody[0] = p_FmPcd->guestId;
690296177Sjhibbits        blockingFlag = TRUE;
691296177Sjhibbits
692296177Sjhibbits        do
693296177Sjhibbits        {
694296177Sjhibbits            replyLength = sizeof(uint32_t) + sizeof(isMasterAlive);
695296177Sjhibbits            if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
696296177Sjhibbits                                         (uint8_t*)&msg,
697296177Sjhibbits                                         sizeof(msg.msgId)+sizeof(p_FmPcd->guestId),
698296177Sjhibbits                                         (uint8_t*)&reply,
699296177Sjhibbits                                         &replyLength,
700296177Sjhibbits                                         FmPcdIpcMsgCompletionCB,
701296177Sjhibbits                                         h_FmPcd)) != E_OK)
702296177Sjhibbits                REPORT_ERROR(MAJOR, err, NO_MSG);
703296177Sjhibbits            while(blockingFlag) ;
704296177Sjhibbits            if(replyLength != (sizeof(uint32_t) + sizeof(isMasterAlive)))
705296177Sjhibbits                REPORT_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
706296177Sjhibbits            isMasterAlive = *(uint8_t*)(reply.replyBody);
707296177Sjhibbits        } while (!isMasterAlive);
708296177Sjhibbits    }
709296177Sjhibbits
710296177Sjhibbits    CHECK_INIT_PARAMETERS(p_FmPcd, CheckFmPcdParameters);
711296177Sjhibbits
712296177Sjhibbits    if(p_FmPcd->p_FmPcdKg)
713296177Sjhibbits    {
714296177Sjhibbits        err = KgInit(p_FmPcd);
715296177Sjhibbits        if(err)
716296177Sjhibbits            RETURN_ERROR(MAJOR, err, NO_MSG);
717296177Sjhibbits    }
718296177Sjhibbits
719296177Sjhibbits    if(p_FmPcd->p_FmPcdPlcr)
720296177Sjhibbits    {
721296177Sjhibbits        err = PlcrInit(p_FmPcd);
722296177Sjhibbits        if(err)
723296177Sjhibbits            RETURN_ERROR(MAJOR, err, NO_MSG);
724296177Sjhibbits    }
725296177Sjhibbits
726296177Sjhibbits    if(p_FmPcd->p_FmPcdPrs)
727296177Sjhibbits    {
728296177Sjhibbits        err = PrsInit(p_FmPcd);
729296177Sjhibbits        if(err)
730296177Sjhibbits            RETURN_ERROR(MAJOR, err, NO_MSG);
731296177Sjhibbits    }
732296177Sjhibbits
733296177Sjhibbits    if(p_FmPcd->guestId == NCSW_MASTER_ID)
734296177Sjhibbits    {
735296177Sjhibbits         /* register to inter-core messaging mechanism */
736296177Sjhibbits        memset(p_FmPcd->fmPcdModuleName, 0, (sizeof(char)) * MODULE_NAME_SIZE);
737296177Sjhibbits        if(Sprint (p_FmPcd->fmPcdModuleName, "FM_PCD_%d_%d",FmGetId(p_FmPcd->h_Fm),NCSW_MASTER_ID) != 10)
738296177Sjhibbits            RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Sprint failed"));
739296177Sjhibbits        err = XX_IpcRegisterMsgHandler(p_FmPcd->fmPcdModuleName, FmPcdHandleIpcMsgCB, p_FmPcd, FM_PCD_MAX_REPLY_SIZE);
740296177Sjhibbits        if(err)
741296177Sjhibbits            RETURN_ERROR(MAJOR, err, NO_MSG);
742296177Sjhibbits    }
743296177Sjhibbits
744296177Sjhibbits    XX_Free(p_FmPcd->p_FmPcdDriverParam);
745296177Sjhibbits    p_FmPcd->p_FmPcdDriverParam = NULL;
746296177Sjhibbits
747296177Sjhibbits    FmRegisterPcd(p_FmPcd->h_Fm, p_FmPcd);
748296177Sjhibbits
749296177Sjhibbits    return E_OK;
750296177Sjhibbits}
751296177Sjhibbits
752296177Sjhibbitst_Error FM_PCD_Free(t_Handle h_FmPcd)
753296177Sjhibbits{
754296177Sjhibbits    t_FmPcd                             *p_FmPcd =(t_FmPcd *)h_FmPcd;
755296177Sjhibbits    t_Error                             err = E_OK;
756296177Sjhibbits
757296177Sjhibbits    if(p_FmPcd->enabled)
758296177Sjhibbits        FM_PCD_Disable(p_FmPcd);
759296177Sjhibbits
760296177Sjhibbits    if (p_FmPcd->h_Spinlock)
761296177Sjhibbits        XX_FreeSpinlock(p_FmPcd->h_Spinlock);
762296177Sjhibbits
763296177Sjhibbits    if(p_FmPcd->p_FmPcdDriverParam)
764296177Sjhibbits    {
765296177Sjhibbits        XX_Free(p_FmPcd->p_FmPcdDriverParam);
766296177Sjhibbits        p_FmPcd->p_FmPcdDriverParam = NULL;
767296177Sjhibbits    }
768296177Sjhibbits    if(p_FmPcd->p_FmPcdKg)
769296177Sjhibbits    {
770296177Sjhibbits        if((err = KgFree(p_FmPcd)) != E_OK)
771296177Sjhibbits            RETURN_ERROR(MINOR, err, NO_MSG);
772296177Sjhibbits        XX_Free(p_FmPcd->p_FmPcdKg);
773296177Sjhibbits        p_FmPcd->p_FmPcdKg = NULL;
774296177Sjhibbits    }
775296177Sjhibbits
776296177Sjhibbits    if(p_FmPcd->p_FmPcdPlcr)
777296177Sjhibbits    {
778296177Sjhibbits        if((err = PlcrFree(p_FmPcd)) != E_OK)
779296177Sjhibbits            RETURN_ERROR(MINOR, err, NO_MSG);
780296177Sjhibbits        XX_Free(p_FmPcd->p_FmPcdPlcr);
781296177Sjhibbits        p_FmPcd->p_FmPcdPlcr = NULL;
782296177Sjhibbits    }
783296177Sjhibbits
784296177Sjhibbits    if(p_FmPcd->p_FmPcdPrs)
785296177Sjhibbits    {
786296177Sjhibbits        if(p_FmPcd->guestId == NCSW_MASTER_ID)
787296177Sjhibbits            PrsFree(p_FmPcd);
788296177Sjhibbits        XX_Free(p_FmPcd->p_FmPcdPrs);
789296177Sjhibbits        p_FmPcd->p_FmPcdPrs = NULL;
790296177Sjhibbits    }
791296177Sjhibbits
792296177Sjhibbits    if (p_FmPcd->h_Hc)
793296177Sjhibbits    {
794296177Sjhibbits        FmHcFree(p_FmPcd->h_Hc);
795296177Sjhibbits        p_FmPcd->h_Hc = NULL;
796296177Sjhibbits    }
797296177Sjhibbits
798296177Sjhibbits    XX_IpcUnregisterMsgHandler(p_FmPcd->fmPcdModuleName);
799296177Sjhibbits
800296177Sjhibbits    FmUnregisterPcd(p_FmPcd->h_Fm);
801296177Sjhibbits
802296177Sjhibbits    XX_Free(p_FmPcd);
803296177Sjhibbits    return E_OK;
804296177Sjhibbits}
805296177Sjhibbits
806296177Sjhibbitst_Error FM_PCD_Enable(t_Handle h_FmPcd)
807296177Sjhibbits{
808296177Sjhibbits    t_FmPcd             *p_FmPcd = (t_FmPcd*)h_FmPcd;
809296177Sjhibbits    t_Error             err = E_OK;
810296177Sjhibbits
811296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
812296177Sjhibbits
813296177Sjhibbits    if(p_FmPcd->guestId == NCSW_MASTER_ID)
814296177Sjhibbits    {
815296177Sjhibbits        if(p_FmPcd->p_FmPcdKg)
816296177Sjhibbits            KgEnable(p_FmPcd);
817296177Sjhibbits
818296177Sjhibbits        if(p_FmPcd->p_FmPcdPlcr)
819296177Sjhibbits            PlcrEnable(p_FmPcd);
820296177Sjhibbits
821296177Sjhibbits        if(p_FmPcd->p_FmPcdPrs)
822296177Sjhibbits            PrsEnable(p_FmPcd);
823296177Sjhibbits
824296177Sjhibbits        p_FmPcd->enabled = TRUE;
825296177Sjhibbits    }
826296177Sjhibbits    else
827296177Sjhibbits    {
828296177Sjhibbits        uint8_t         enabled;
829296177Sjhibbits        t_FmPcdIpcMsg   msg;
830296177Sjhibbits        t_FmPcdIpcReply reply;
831296177Sjhibbits        uint32_t        replyLength;
832296177Sjhibbits
833296177Sjhibbits        memset(&msg, 0, sizeof(msg));
834296177Sjhibbits        memset(&reply, 0, sizeof(reply));
835296177Sjhibbits        msg.msgId = FM_PCD_MASTER_IS_ENABLED;
836296177Sjhibbits        replyLength = sizeof(uint32_t) + sizeof(enabled);
837296177Sjhibbits        if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
838296177Sjhibbits                                     (uint8_t*)&msg,
839296177Sjhibbits                                     sizeof(msg.msgId),
840296177Sjhibbits                                     (uint8_t*)&reply,
841296177Sjhibbits                                     &replyLength,
842296177Sjhibbits                                     NULL,
843296177Sjhibbits                                     NULL)) != E_OK)
844296177Sjhibbits            RETURN_ERROR(MAJOR, err, NO_MSG);
845296177Sjhibbits        if (replyLength != sizeof(uint32_t) + sizeof(enabled))
846296177Sjhibbits            RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
847296177Sjhibbits        p_FmPcd->enabled = (bool)!!(*(uint8_t*)(reply.replyBody));
848296177Sjhibbits        if (!p_FmPcd->enabled)
849296177Sjhibbits            RETURN_ERROR(MAJOR, E_INVALID_STATE, ("FM-PCD master should be enabled first!"));
850296177Sjhibbits    }
851296177Sjhibbits
852296177Sjhibbits    return E_OK;
853296177Sjhibbits}
854296177Sjhibbits
855296177Sjhibbitst_Error FM_PCD_Disable(t_Handle h_FmPcd)
856296177Sjhibbits{
857296177Sjhibbits    t_FmPcd             *p_FmPcd = (t_FmPcd*)h_FmPcd;
858296177Sjhibbits    t_Error             err = E_OK;
859296177Sjhibbits    t_FmPcdIpcMsg       msg;
860296177Sjhibbits    t_FmPcdIpcReply     reply;
861296177Sjhibbits    uint32_t            replyLength;
862296177Sjhibbits
863296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
864296177Sjhibbits
865296177Sjhibbits    if(p_FmPcd->guestId == NCSW_MASTER_ID)
866296177Sjhibbits    {
867296177Sjhibbits        if(p_FmPcd->numOfEnabledGuestPartitionsPcds != 0)
868296177Sjhibbits            RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Trying to disable a master partition PCD while guest partitions are still enabled."));
869296177Sjhibbits
870296177Sjhibbits        if(p_FmPcd->p_FmPcdKg)
871296177Sjhibbits             KgDisable(p_FmPcd);
872296177Sjhibbits
873296177Sjhibbits        if(p_FmPcd->p_FmPcdPlcr)
874296177Sjhibbits            PlcrDisable(p_FmPcd);
875296177Sjhibbits
876296177Sjhibbits        if(p_FmPcd->p_FmPcdPrs)
877296177Sjhibbits            PrsDisable(p_FmPcd);
878296177Sjhibbits
879296177Sjhibbits        p_FmPcd->enabled = FALSE;
880296177Sjhibbits
881296177Sjhibbits        return E_OK;
882296177Sjhibbits    }
883296177Sjhibbits
884296177Sjhibbits    memset(&msg, 0, sizeof(msg));
885296177Sjhibbits    msg.msgId = FM_PCD_GUEST_DISABLE;
886296177Sjhibbits    memset(&reply, 0, sizeof(reply));
887296177Sjhibbits    replyLength = sizeof(uint32_t);
888296177Sjhibbits    if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
889296177Sjhibbits                                 (uint8_t*)&msg,
890296177Sjhibbits                                 sizeof(msg.msgId),
891296177Sjhibbits                                 (uint8_t*)&reply,
892296177Sjhibbits                                 &replyLength,
893296177Sjhibbits                                 NULL,
894296177Sjhibbits                                 NULL)) != E_OK)
895296177Sjhibbits        RETURN_ERROR(MAJOR, err, NO_MSG);
896296177Sjhibbits    if (replyLength != sizeof(uint32_t))
897296177Sjhibbits        RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
898296177Sjhibbits
899296177Sjhibbits    return (t_Error)(reply.error);
900296177Sjhibbits}
901296177Sjhibbits
902296177Sjhibbitst_Handle FM_PCD_SetNetEnvCharacteristics(t_Handle h_FmPcd, t_FmPcdNetEnvParams  *p_NetEnvParams)
903296177Sjhibbits{
904296177Sjhibbits    t_FmPcd                 *p_FmPcd = (t_FmPcd*)h_FmPcd;
905296177Sjhibbits    uint32_t                intFlags, specialUnits = 0;
906296177Sjhibbits    uint8_t                 bitId = 0;
907296177Sjhibbits    uint8_t                 i, j, k;
908296177Sjhibbits    uint8_t                 netEnvCurrId;
909296177Sjhibbits    uint8_t                 ipsecAhUnit = 0,ipsecEspUnit = 0;
910296177Sjhibbits    bool                    ipsecAhExists = FALSE, ipsecEspExists = FALSE, shim1Selected = FALSE;
911296177Sjhibbits    uint8_t                 hdrNum;
912296177Sjhibbits
913296177Sjhibbits    SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_STATE, NULL);
914296177Sjhibbits    SANITY_CHECK_RETURN_VALUE(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE, NULL);
915296177Sjhibbits
916296177Sjhibbits    intFlags = FmPcdLock(p_FmPcd);
917296177Sjhibbits
918296177Sjhibbits    /* find a new netEnv */
919296177Sjhibbits    for(i = 0;i<FM_MAX_NUM_OF_PORTS;i++)
920296177Sjhibbits        if(!p_FmPcd->netEnvs[i].used)
921296177Sjhibbits            break;
922296177Sjhibbits
923296177Sjhibbits    if(i== FM_MAX_NUM_OF_PORTS)
924296177Sjhibbits    {
925296177Sjhibbits        REPORT_ERROR(MAJOR, E_FULL,("No more than %d netEnv's allowed.", FM_MAX_NUM_OF_PORTS));
926296177Sjhibbits        FmPcdUnlock(p_FmPcd, intFlags);
927296177Sjhibbits        return NULL;
928296177Sjhibbits    }
929296177Sjhibbits
930296177Sjhibbits    p_FmPcd->netEnvs[i].used = TRUE;
931296177Sjhibbits
932296177Sjhibbits    if (!TRY_LOCK(NULL, &p_FmPcd->netEnvs[i].lock))
933296177Sjhibbits    {
934296177Sjhibbits        FmPcdUnlock(p_FmPcd, intFlags);
935296177Sjhibbits        return NULL;
936296177Sjhibbits    }
937296177Sjhibbits    FmPcdUnlock(p_FmPcd, intFlags);
938296177Sjhibbits
939296177Sjhibbits    netEnvCurrId = (uint8_t)i;
940296177Sjhibbits
941296177Sjhibbits    /* clear from previous use */
942296177Sjhibbits    memset(&p_FmPcd->netEnvs[netEnvCurrId].units, 0, FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS * sizeof(t_FmPcdIntDistinctionUnit));
943296177Sjhibbits    memset(&p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs, 0, FM_PCD_MAX_NUM_OF_PRIVATE_HDRS * sizeof(t_FmPcdNetEnvAliases));
944296177Sjhibbits    memcpy(&p_FmPcd->netEnvs[netEnvCurrId].units, p_NetEnvParams->units, p_NetEnvParams->numOfDistinctionUnits*sizeof(t_FmPcdIntDistinctionUnit));
945296177Sjhibbits    p_FmPcd->netEnvs[netEnvCurrId].clsPlanGrpId = ILLEGAL_CLS_PLAN;
946296177Sjhibbits
947296177Sjhibbits    /* check that header with opt is not interchanged with the same header */
948296177Sjhibbits    for (i=0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
949296177Sjhibbits            && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
950296177Sjhibbits    {
951296177Sjhibbits        for (k=0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)
952296177Sjhibbits            && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)
953296177Sjhibbits        {
954296177Sjhibbits            /* if an option exists, check that other headers are not the same header
955296177Sjhibbits            without option */
956296177Sjhibbits            if(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt)
957296177Sjhibbits            {
958296177Sjhibbits                for (j=0; (j < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)
959296177Sjhibbits                        && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].hdr != HEADER_TYPE_NONE); j++)
960296177Sjhibbits                    if((p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].hdr == p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr) &&
961296177Sjhibbits                        !p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[j].opt)
962296177Sjhibbits                    {
963296177Sjhibbits                        REPORT_ERROR(MINOR, E_FULL, ("Illegal unit - header with opt may not be interchangeable with the same header without opt"));
964296177Sjhibbits                        RELEASE_LOCK(p_FmPcd->netEnvs[netEnvCurrId].lock);
965296177Sjhibbits                        return NULL;
966296177Sjhibbits                    }
967296177Sjhibbits            }
968296177Sjhibbits        }
969296177Sjhibbits    }
970296177Sjhibbits
971296177Sjhibbits    /* IPSEC_AH and IPSEC_SPI can't be 2 units,  */
972296177Sjhibbits    /* check that header with opt is not interchanged with the same header */
973296177Sjhibbits    for(i=0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
974296177Sjhibbits        && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
975296177Sjhibbits    {
976296177Sjhibbits        for(k=0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)
977296177Sjhibbits            && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)
978296177Sjhibbits        {
979296177Sjhibbits            /* Some headers pairs may not be defined on different units as the parser
980296177Sjhibbits            doesn't distinguish */
981296177Sjhibbits            if(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPSEC_AH)
982296177Sjhibbits            {
983296177Sjhibbits                if (ipsecEspExists && (ipsecEspUnit != i))
984296177Sjhibbits                {
985296177Sjhibbits                    REPORT_ERROR(MINOR, E_INVALID_STATE, ("HEADER_TYPE_IPSEC_AH and HEADER_TYPE_IPSEC_ESP may not be defined in separate units"));
986296177Sjhibbits                    RELEASE_LOCK(p_FmPcd->netEnvs[netEnvCurrId].lock);
987296177Sjhibbits                   return NULL;
988296177Sjhibbits                }
989296177Sjhibbits                else
990296177Sjhibbits                {
991296177Sjhibbits                    ipsecAhUnit = i;
992296177Sjhibbits                    ipsecAhExists = TRUE;
993296177Sjhibbits                }
994296177Sjhibbits            }
995296177Sjhibbits            if(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_IPSEC_ESP)
996296177Sjhibbits            {
997296177Sjhibbits                if (ipsecAhExists && (ipsecAhUnit != i))
998296177Sjhibbits                {
999296177Sjhibbits                    REPORT_ERROR(MINOR, E_INVALID_STATE, ("HEADER_TYPE_IPSEC_AH and HEADER_TYPE_IPSEC_ESP may not be defined in separate units"));
1000296177Sjhibbits                    RELEASE_LOCK(p_FmPcd->netEnvs[netEnvCurrId].lock);
1001296177Sjhibbits                    return NULL;
1002296177Sjhibbits                }
1003296177Sjhibbits                else
1004296177Sjhibbits                {
1005296177Sjhibbits                    ipsecEspUnit = i;
1006296177Sjhibbits                    ipsecEspExists = TRUE;
1007296177Sjhibbits                }
1008296177Sjhibbits            }
1009296177Sjhibbits            if(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr == HEADER_TYPE_UDP_ENCAP_ESP)
1010296177Sjhibbits            {
1011296177Sjhibbits                /* TODO - general coding. choose the free shim header */
1012296177Sjhibbits                p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits].hdr = HEADER_TYPE_UDP_ENCAP_ESP;
1013296177Sjhibbits                p_FmPcd->netEnvs[netEnvCurrId].aliasHdrs[specialUnits++].aliasHdr = HEADER_TYPE_USER_DEFINED_SHIM1;
1014296177Sjhibbits                p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr = HEADER_TYPE_USER_DEFINED_SHIM1;
1015296177Sjhibbits                p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].opt = 0;
1016296177Sjhibbits            }
1017296177Sjhibbits        }
1018296177Sjhibbits    }
1019296177Sjhibbits
1020296177Sjhibbits    /* if private header (shim), check that no other headers specified */
1021296177Sjhibbits    for (i=0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
1022296177Sjhibbits        && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
1023296177Sjhibbits    {
1024296177Sjhibbits        if(IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))
1025296177Sjhibbits            if(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[1].hdr != HEADER_TYPE_NONE)
1026296177Sjhibbits            {
1027296177Sjhibbits                REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("SHIM header may not be interchanged with other headers"));
1028296177Sjhibbits                RELEASE_LOCK(p_FmPcd->netEnvs[netEnvCurrId].lock);
1029296177Sjhibbits                return NULL;
1030296177Sjhibbits            }
1031296177Sjhibbits    }
1032296177Sjhibbits
1033296177Sjhibbits    for(i=0; i<p_NetEnvParams->numOfDistinctionUnits;i++)
1034296177Sjhibbits    {
1035296177Sjhibbits        if (IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))
1036296177Sjhibbits            switch(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr)
1037296177Sjhibbits            {
1038296177Sjhibbits                case(HEADER_TYPE_USER_DEFINED_SHIM1):
1039296177Sjhibbits                    if (shim1Selected)
1040296177Sjhibbits                    {
1041296177Sjhibbits                        REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("SHIM header cannot be selected with UDP_IPSEC_ESP"));
1042296177Sjhibbits                        RELEASE_LOCK(p_FmPcd->netEnvs[netEnvCurrId].lock);
1043296177Sjhibbits                        return NULL;
1044296177Sjhibbits                    }
1045296177Sjhibbits                    shim1Selected = TRUE;
1046296177Sjhibbits                    p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = 0x00000001;
1047296177Sjhibbits                break;
1048296177Sjhibbits                case(HEADER_TYPE_USER_DEFINED_SHIM2):
1049296177Sjhibbits                    p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = 0x00000002;
1050296177Sjhibbits                    break;
1051296177Sjhibbits                default:
1052296177Sjhibbits                    REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, ("Requested SHIM not supported"));
1053296177Sjhibbits            }
1054296177Sjhibbits        else
1055296177Sjhibbits        {
1056296177Sjhibbits            p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i] = (uint32_t)(0x80000000 >> bitId++);
1057296177Sjhibbits
1058296177Sjhibbits            if(IS_SPECIAL_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))
1059296177Sjhibbits                p_FmPcd->netEnvs[netEnvCurrId].macsecVector = p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i];
1060296177Sjhibbits        }
1061296177Sjhibbits    }
1062296177Sjhibbits
1063296177Sjhibbits    /* define a set of hardware parser LCV's according to the defined netenv */
1064296177Sjhibbits
1065296177Sjhibbits    /* set an array of LCV's for each header in the netEnv */
1066296177Sjhibbits    for (i=0; (i < FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS)
1067296177Sjhibbits        && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr != HEADER_TYPE_NONE); i++)
1068296177Sjhibbits    {
1069296177Sjhibbits        /* private headers have no LCV in the hard parser */
1070296177Sjhibbits        if (!IS_PRIVATE_HEADER(p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[0].hdr))
1071296177Sjhibbits        {
1072296177Sjhibbits            for (k=0; (k < FM_PCD_MAX_NUM_OF_INTERCHANGEABLE_HDRS)
1073296177Sjhibbits                    && (p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr != HEADER_TYPE_NONE); k++)
1074296177Sjhibbits            {
1075296177Sjhibbits                GET_PRS_HDR_NUM(hdrNum, p_FmPcd->netEnvs[netEnvCurrId].units[i].hdrs[k].hdr);
1076296177Sjhibbits                if ((hdrNum == ILLEGAL_HDR_NUM) || (hdrNum == NO_HDR_NUM))
1077296177Sjhibbits                {
1078296177Sjhibbits                    REPORT_ERROR(MAJOR, E_NOT_SUPPORTED, NO_MSG);
1079296177Sjhibbits                    RELEASE_LOCK(p_FmPcd->netEnvs[netEnvCurrId].lock);
1080296177Sjhibbits                    return NULL;
1081296177Sjhibbits                }
1082296177Sjhibbits                p_FmPcd->netEnvs[netEnvCurrId].lcvs[hdrNum] |= p_FmPcd->netEnvs[netEnvCurrId].unitsVectors[i];
1083296177Sjhibbits            }
1084296177Sjhibbits        }
1085296177Sjhibbits    }
1086296177Sjhibbits
1087296177Sjhibbits    RELEASE_LOCK(p_FmPcd->netEnvs[netEnvCurrId].lock);
1088296177Sjhibbits
1089296177Sjhibbits    return UINT_TO_PTR((uint64_t)netEnvCurrId+1);
1090296177Sjhibbits}
1091296177Sjhibbits
1092296177Sjhibbitst_Error FM_PCD_DeleteNetEnvCharacteristics(t_Handle h_FmPcd, t_Handle h_NetEnv)
1093296177Sjhibbits{
1094296177Sjhibbits    t_FmPcd     *p_FmPcd = (t_FmPcd*)h_FmPcd;
1095296177Sjhibbits    uint8_t     netEnvId = (uint8_t)(PTR_TO_UINT(h_NetEnv)-1);
1096296177Sjhibbits
1097296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_STATE);
1098296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
1099296177Sjhibbits
1100296177Sjhibbits    if (!TRY_LOCK(p_FmPcd->h_Spinlock, &p_FmPcd->netEnvs[netEnvId].lock))
1101296177Sjhibbits        return ERROR_CODE(E_BUSY);
1102296177Sjhibbits    /* check that no port is bound to this netEnv */
1103296177Sjhibbits    if(p_FmPcd->netEnvs[netEnvId].owners)
1104296177Sjhibbits    {
1105296177Sjhibbits       RELEASE_LOCK(p_FmPcd->netEnvs[netEnvId].lock);
1106296177Sjhibbits       RETURN_ERROR(MINOR, E_INVALID_STATE, ("Trying to delete a netEnv that has ports/schemes/trees/clsPlanGrps bound to"));
1107296177Sjhibbits    }
1108296177Sjhibbits    p_FmPcd->netEnvs[netEnvId].used= FALSE;
1109296177Sjhibbits    p_FmPcd->netEnvs[netEnvId].clsPlanGrpId = ILLEGAL_CLS_PLAN;
1110296177Sjhibbits
1111296177Sjhibbits    memset(p_FmPcd->netEnvs[netEnvId].units, 0, sizeof(t_FmPcdIntDistinctionUnit)*FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);
1112296177Sjhibbits    memset(p_FmPcd->netEnvs[netEnvId].unitsVectors, 0, sizeof(uint32_t)*FM_PCD_MAX_NUM_OF_DISTINCTION_UNITS);
1113296177Sjhibbits    memset(p_FmPcd->netEnvs[netEnvId].lcvs, 0, sizeof(uint32_t)*FM_PCD_PRS_NUM_OF_HDRS);
1114296177Sjhibbits
1115296177Sjhibbits    RELEASE_LOCK(p_FmPcd->netEnvs[netEnvId].lock);
1116296177Sjhibbits
1117296177Sjhibbits    return E_OK;
1118296177Sjhibbits}
1119296177Sjhibbits
1120296177Sjhibbitsvoid FM_PCD_HcTxConf(t_Handle h_FmPcd, t_DpaaFD *p_Fd)
1121296177Sjhibbits{
1122296177Sjhibbits    t_FmPcd                 *p_FmPcd = (t_FmPcd*)h_FmPcd;
1123296177Sjhibbits
1124296177Sjhibbits    SANITY_CHECK_RETURN(h_FmPcd, E_INVALID_STATE);
1125296177Sjhibbits
1126296177Sjhibbits    FmHcTxConf(p_FmPcd->h_Hc, p_Fd);
1127296177Sjhibbits}
1128296177Sjhibbits
1129296177Sjhibbitsuint32_t FM_PCD_GetCounter(t_Handle h_FmPcd, e_FmPcdCounters counter)
1130296177Sjhibbits{
1131296177Sjhibbits    t_FmPcd                 *p_FmPcd = (t_FmPcd*)h_FmPcd;
1132296177Sjhibbits    uint32_t                replyLength, outCounter = 0;
1133296177Sjhibbits    t_FmPcdIpcMsg           msg;
1134296177Sjhibbits    t_Error                 err;
1135296177Sjhibbits    t_FmPcdIpcReply         reply;
1136296177Sjhibbits
1137296177Sjhibbits    SANITY_CHECK_RETURN_VALUE(h_FmPcd, E_INVALID_HANDLE, 0);
1138296177Sjhibbits    SANITY_CHECK_RETURN_VALUE(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE, 0);
1139296177Sjhibbits
1140296177Sjhibbits    if(p_FmPcd->guestId != NCSW_MASTER_ID)
1141296177Sjhibbits    {
1142296177Sjhibbits        memset(&msg, 0, sizeof(msg));
1143296177Sjhibbits        memset(&reply, 0, sizeof(reply));
1144296177Sjhibbits        msg.msgId = FM_PCD_GET_COUNTER;
1145296177Sjhibbits        memcpy(msg.msgBody, (uint8_t *)&counter, sizeof(uint32_t));
1146296177Sjhibbits        replyLength = sizeof(uint32_t) + sizeof(uint32_t);
1147296177Sjhibbits        if ((err = XX_IpcSendMessage(p_FmPcd->h_IpcSession,
1148296177Sjhibbits                                     (uint8_t*)&msg,
1149296177Sjhibbits                                     sizeof(msg.msgId) +sizeof(uint32_t),
1150296177Sjhibbits                                     (uint8_t*)&reply,
1151296177Sjhibbits                                     &replyLength,
1152296177Sjhibbits                                     NULL,
1153296177Sjhibbits                                     NULL)) != E_OK)
1154296177Sjhibbits            RETURN_ERROR(MAJOR, err, NO_MSG);
1155296177Sjhibbits        if (replyLength != sizeof(uint32_t) + sizeof(uint32_t))
1156296177Sjhibbits            RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("IPC reply length mismatch"));
1157296177Sjhibbits
1158296177Sjhibbits        memcpy((uint8_t*)&outCounter, reply.replyBody, sizeof(uint32_t));
1159296177Sjhibbits        return outCounter;
1160296177Sjhibbits    }
1161296177Sjhibbits
1162296177Sjhibbits    switch(counter)
1163296177Sjhibbits    {
1164296177Sjhibbits        case(e_FM_PCD_KG_COUNTERS_TOTAL):
1165296177Sjhibbits            if(!p_FmPcd->p_FmPcdKg)
1166296177Sjhibbits            {
1167296177Sjhibbits                REPORT_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this counters"));
1168296177Sjhibbits                return 0;
1169296177Sjhibbits            }
1170296177Sjhibbits            break;
1171296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_YELLOW):
1172296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_RED):
1173296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):
1174296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):
1175296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_TOTAL):
1176296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):
1177296177Sjhibbits            if(!p_FmPcd->p_FmPcdPlcr)
1178296177Sjhibbits            {
1179296177Sjhibbits                REPORT_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this counters"));
1180296177Sjhibbits                return 0;
1181296177Sjhibbits            }
1182296177Sjhibbits            /* check that counters are enabled */
1183296177Sjhibbits            if(!(GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_gcr) & FM_PCD_PLCR_GCR_STEN))
1184296177Sjhibbits            {
1185296177Sjhibbits                REPORT_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled"));
1186296177Sjhibbits                return 0;
1187296177Sjhibbits            }
1188296177Sjhibbits            break;
1189296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):
1190296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):
1191296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):
1192296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):
1193296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):
1194296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):
1195296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):
1196296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):
1197296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):
1198296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):
1199296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):
1200296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):
1201296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):
1202296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):
1203296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):
1204296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):
1205296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):
1206296177Sjhibbits            if(!p_FmPcd->p_FmPcdPrs)
1207296177Sjhibbits            {
1208296177Sjhibbits                REPORT_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this counters"));
1209296177Sjhibbits                return 0;
1210296177Sjhibbits            }
1211296177Sjhibbits            break;
1212296177Sjhibbits        default:
1213296177Sjhibbits            REPORT_ERROR(MINOR, E_INVALID_STATE, ("Unsupported type of counter"));
1214296177Sjhibbits            return 0;
1215296177Sjhibbits    }
1216296177Sjhibbits    switch(counter)
1217296177Sjhibbits    {
1218296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):
1219296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->pds);
1220296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):
1221296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l2rrs);
1222296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):
1223296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l3rrs);
1224296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):
1225296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l4rrs);
1226296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):
1227296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->srrs);
1228296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):
1229296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l2rres);
1230296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):
1231296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l3rres);
1232296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):
1233296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l4rres);
1234296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):
1235296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->srres);
1236296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):
1237296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->spcs);
1238296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):
1239296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->spscs);
1240296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):
1241296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->hxscs);
1242296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):
1243296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->mrcs);
1244296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):
1245296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->mrscs);
1246296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):
1247296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->mwcs);
1248296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):
1249296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->mwscs);
1250296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):
1251296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fcscs);
1252296177Sjhibbits        case(e_FM_PCD_KG_COUNTERS_TOTAL):
1253296177Sjhibbits               return GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->kgtpc);
1254296177Sjhibbits
1255296177Sjhibbits        /*Policer statictics*/
1256296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_YELLOW):
1257296177Sjhibbits                return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ypcnt);
1258296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_RED):
1259296177Sjhibbits                return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rpcnt);
1260296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):
1261296177Sjhibbits                return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rrpcnt);
1262296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):
1263296177Sjhibbits                return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rypcnt);
1264296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_TOTAL):
1265296177Sjhibbits                return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_tpcnt);
1266296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):
1267296177Sjhibbits                return GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_flmcnt);
1268296177Sjhibbits
1269296177Sjhibbits        default:
1270296177Sjhibbits            REPORT_ERROR(MINOR, E_INVALID_STATE, ("Unsupported type of counter"));
1271296177Sjhibbits            return 0;
1272296177Sjhibbits    }
1273296177Sjhibbits}
1274296177Sjhibbits
1275296177Sjhibbits#if (defined(DEBUG_ERRORS) && (DEBUG_ERRORS > 0))
1276296177Sjhibbitst_Error FM_PCD_DumpRegs(t_Handle h_FmPcd)
1277296177Sjhibbits{
1278296177Sjhibbits    t_FmPcd             *p_FmPcd = (t_FmPcd*)h_FmPcd;
1279296177Sjhibbits    t_FmPcdIpcMsg       msg;
1280296177Sjhibbits
1281296177Sjhibbits    DECLARE_DUMP;
1282296177Sjhibbits
1283296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
1284296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
1285296177Sjhibbits
1286296177Sjhibbits    if(p_FmPcd->guestId != NCSW_MASTER_ID)
1287296177Sjhibbits    {
1288296177Sjhibbits        memset(&msg, 0, sizeof(msg));
1289296177Sjhibbits        msg.msgId = FM_PCD_DUMP_REGS;
1290296177Sjhibbits        return XX_IpcSendMessage(p_FmPcd->h_IpcSession,
1291296177Sjhibbits                                 (uint8_t*)&msg,
1292296177Sjhibbits                                 sizeof(msg.msgId),
1293296177Sjhibbits                                 NULL,
1294296177Sjhibbits                                 NULL,
1295296177Sjhibbits                                 NULL,
1296296177Sjhibbits                                 NULL);
1297296177Sjhibbits    }
1298296177Sjhibbits    if (p_FmPcd->p_FmPcdKg)
1299296177Sjhibbits        return FM_PCD_KgDumpRegs(h_FmPcd);
1300296177Sjhibbits    if (p_FmPcd->p_FmPcdPlcr)
1301296177Sjhibbits        return FM_PCD_PlcrDumpRegs(h_FmPcd);
1302296177Sjhibbits    if (p_FmPcd->p_FmPcdPrs)
1303296177Sjhibbits        return FM_PCD_PrsDumpRegs(h_FmPcd);
1304296177Sjhibbits    return E_OK;
1305296177Sjhibbits}
1306296177Sjhibbits
1307296177Sjhibbitst_Error     FM_PCD_HcDumpRegs(t_Handle h_FmPcd)
1308296177Sjhibbits{
1309296177Sjhibbits    t_FmPcd             *p_FmPcd = (t_FmPcd*)h_FmPcd;
1310296177Sjhibbits
1311296177Sjhibbits    DECLARE_DUMP;
1312296177Sjhibbits
1313296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
1314296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
1315296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(p_FmPcd->h_Hc, E_INVALID_STATE);
1316296177Sjhibbits
1317296177Sjhibbits    return FmHcDumpRegs(p_FmPcd->h_Hc);
1318296177Sjhibbits}
1319296177Sjhibbits
1320296177Sjhibbits#endif /* (defined(DEBUG_ERRORS) && ... */
1321296177Sjhibbits
1322296177Sjhibbitst_Error FM_PCD_ConfigException(t_Handle h_FmPcd, e_FmPcdExceptions exception, bool enable)
1323296177Sjhibbits{
1324296177Sjhibbits    t_FmPcd         *p_FmPcd = (t_FmPcd*)h_FmPcd;
1325296177Sjhibbits    uint32_t        bitMask = 0;
1326296177Sjhibbits
1327296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
1328296177Sjhibbits
1329296177Sjhibbits    if(p_FmPcd->guestId != NCSW_MASTER_ID)
1330296177Sjhibbits        RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ConfigException - guest mode!"));
1331296177Sjhibbits
1332296177Sjhibbits    GET_FM_PCD_EXCEPTION_FLAG(bitMask, exception);
1333296177Sjhibbits    if(bitMask)
1334296177Sjhibbits    {
1335296177Sjhibbits        if (enable)
1336296177Sjhibbits            p_FmPcd->exceptions |= bitMask;
1337296177Sjhibbits        else
1338296177Sjhibbits            p_FmPcd->exceptions &= ~bitMask;
1339296177Sjhibbits   }
1340296177Sjhibbits    else
1341296177Sjhibbits        RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
1342296177Sjhibbits
1343296177Sjhibbits    return E_OK;
1344296177Sjhibbits}
1345296177Sjhibbits
1346296177Sjhibbitst_Error FM_PCD_SetException(t_Handle h_FmPcd, e_FmPcdExceptions exception, bool enable)
1347296177Sjhibbits{
1348296177Sjhibbits    t_FmPcd         *p_FmPcd = (t_FmPcd*)h_FmPcd;
1349296177Sjhibbits    uint32_t        bitMask = 0, tmpReg;
1350296177Sjhibbits
1351296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(p_FmPcd, E_INVALID_HANDLE);
1352296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
1353296177Sjhibbits
1354296177Sjhibbits    if(p_FmPcd->guestId != NCSW_MASTER_ID)
1355296177Sjhibbits        RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_SetException - guest mode!"));
1356296177Sjhibbits
1357296177Sjhibbits    GET_FM_PCD_EXCEPTION_FLAG(bitMask, exception);
1358296177Sjhibbits
1359296177Sjhibbits    if(bitMask)
1360296177Sjhibbits    {
1361296177Sjhibbits        if (enable)
1362296177Sjhibbits            p_FmPcd->exceptions |= bitMask;
1363296177Sjhibbits        else
1364296177Sjhibbits            p_FmPcd->exceptions &= ~bitMask;
1365296177Sjhibbits
1366296177Sjhibbits        switch(exception)
1367296177Sjhibbits        {
1368296177Sjhibbits            case(e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC):
1369296177Sjhibbits            case(e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW):
1370296177Sjhibbits                if(!p_FmPcd->p_FmPcdKg)
1371296177Sjhibbits                    RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - keygen is not working"));
1372296177Sjhibbits                break;
1373296177Sjhibbits            case(e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC):
1374296177Sjhibbits            case(e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR):
1375296177Sjhibbits            case(e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE):
1376296177Sjhibbits            case(e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE):
1377296177Sjhibbits                if(!p_FmPcd->p_FmPcdPlcr)
1378296177Sjhibbits                    RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - policer is not working"));
1379296177Sjhibbits            break;
1380296177Sjhibbits            case(e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC):
1381296177Sjhibbits            case(e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC):
1382296177Sjhibbits                if(!p_FmPcd->p_FmPcdPrs)
1383296177Sjhibbits                    RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - parser is not working"));
1384296177Sjhibbits            break;
1385296177Sjhibbits            default:
1386296177Sjhibbits                RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported exception"));
1387296177Sjhibbits
1388296177Sjhibbits        }
1389296177Sjhibbits
1390296177Sjhibbits        switch(exception)
1391296177Sjhibbits        {
1392296177Sjhibbits            case(e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC):
1393296177Sjhibbits                tmpReg = GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->kgeeer);
1394296177Sjhibbits                if(enable)
1395296177Sjhibbits                    tmpReg |= FM_PCD_KG_DOUBLE_ECC;
1396296177Sjhibbits                else
1397296177Sjhibbits                    tmpReg &= ~FM_PCD_KG_DOUBLE_ECC;
1398296177Sjhibbits                WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->kgeeer, tmpReg);
1399296177Sjhibbits                break;
1400296177Sjhibbits            case(e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW):
1401296177Sjhibbits                tmpReg = GET_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->kgeeer);
1402296177Sjhibbits                if(enable)
1403296177Sjhibbits                    tmpReg |= FM_PCD_KG_KEYSIZE_OVERFLOW;
1404296177Sjhibbits                else
1405296177Sjhibbits                    tmpReg &= ~FM_PCD_KG_KEYSIZE_OVERFLOW;
1406296177Sjhibbits                WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->kgeeer, tmpReg);
1407296177Sjhibbits                break;
1408296177Sjhibbits            case(e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC):
1409296177Sjhibbits                tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->perer);
1410296177Sjhibbits                if(enable)
1411296177Sjhibbits                    tmpReg |= FM_PCD_PRS_DOUBLE_ECC;
1412296177Sjhibbits                else
1413296177Sjhibbits                    tmpReg &= ~FM_PCD_PRS_DOUBLE_ECC;
1414296177Sjhibbits                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->perer, tmpReg);
1415296177Sjhibbits                break;
1416296177Sjhibbits            case(e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC):
1417296177Sjhibbits                tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->pever);
1418296177Sjhibbits                if(enable)
1419296177Sjhibbits                    tmpReg |= FM_PCD_PRS_SINGLE_ECC;
1420296177Sjhibbits                else
1421296177Sjhibbits                    tmpReg &= ~FM_PCD_PRS_SINGLE_ECC;
1422296177Sjhibbits                WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->pever, tmpReg);
1423296177Sjhibbits                break;
1424296177Sjhibbits            case(e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC):
1425296177Sjhibbits                tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier);
1426296177Sjhibbits                if(enable)
1427296177Sjhibbits                    tmpReg |= FM_PCD_PLCR_DOUBLE_ECC;
1428296177Sjhibbits                else
1429296177Sjhibbits                    tmpReg &= ~FM_PCD_PLCR_DOUBLE_ECC;
1430296177Sjhibbits                WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier, tmpReg);
1431296177Sjhibbits                break;
1432296177Sjhibbits            case(e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR):
1433296177Sjhibbits                tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier);
1434296177Sjhibbits                if(enable)
1435296177Sjhibbits                    tmpReg |= FM_PCD_PLCR_INIT_ENTRY_ERROR;
1436296177Sjhibbits                else
1437296177Sjhibbits                    tmpReg &= ~FM_PCD_PLCR_INIT_ENTRY_ERROR;
1438296177Sjhibbits                WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eier, tmpReg);
1439296177Sjhibbits                break;
1440296177Sjhibbits            case(e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE):
1441296177Sjhibbits                tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier);
1442296177Sjhibbits                if(enable)
1443296177Sjhibbits                    tmpReg |= FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE;
1444296177Sjhibbits                else
1445296177Sjhibbits                    tmpReg &= ~FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE;
1446296177Sjhibbits                WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier, tmpReg);
1447296177Sjhibbits                break;
1448296177Sjhibbits            case(e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE):
1449296177Sjhibbits                tmpReg = GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier);
1450296177Sjhibbits                if(enable)
1451296177Sjhibbits                    tmpReg |= FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE;
1452296177Sjhibbits                else
1453296177Sjhibbits                    tmpReg &= ~FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE;
1454296177Sjhibbits                WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ier, tmpReg);
1455296177Sjhibbits                break;
1456296177Sjhibbits             default:
1457296177Sjhibbits                RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported exception"));
1458296177Sjhibbits        }
1459296177Sjhibbits        /* for ECC exceptions driver automatically enables ECC mechanism, if disabled.
1460296177Sjhibbits           Driver may disable them automatically, depending on driver's status */
1461296177Sjhibbits        if(enable && ( (exception == e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC) |
1462296177Sjhibbits                       (exception == e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC) |
1463296177Sjhibbits                       (exception == e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC) |
1464296177Sjhibbits                       (exception == e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC)))
1465296177Sjhibbits            FmEnableRamsEcc(p_FmPcd->h_Fm);
1466296177Sjhibbits        if(!enable && ( (exception == e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC) |
1467296177Sjhibbits                       (exception == e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC) |
1468296177Sjhibbits                       (exception == e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC) |
1469296177Sjhibbits                       (exception == e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC)))
1470296177Sjhibbits            FmDisableRamsEcc(p_FmPcd->h_Fm);
1471296177Sjhibbits    }
1472296177Sjhibbits    else
1473296177Sjhibbits        RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("Undefined exception"));
1474296177Sjhibbits
1475296177Sjhibbits    return E_OK;
1476296177Sjhibbits}
1477296177Sjhibbits
1478296177Sjhibbitst_Error FM_PCD_ForceIntr (t_Handle h_FmPcd, e_FmPcdExceptions exception)
1479296177Sjhibbits{
1480296177Sjhibbits    t_FmPcd            *p_FmPcd = (t_FmPcd*)h_FmPcd;
1481296177Sjhibbits
1482296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
1483296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
1484296177Sjhibbits
1485296177Sjhibbits    if(p_FmPcd->guestId != NCSW_MASTER_ID)
1486296177Sjhibbits        RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ForceIntr - guest mode!"));
1487296177Sjhibbits
1488296177Sjhibbits    switch(exception)
1489296177Sjhibbits    {
1490296177Sjhibbits        case(e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC):
1491296177Sjhibbits        case(e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW):
1492296177Sjhibbits            if(!p_FmPcd->p_FmPcdKg)
1493296177Sjhibbits                RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - keygen is not working"));
1494296177Sjhibbits            break;
1495296177Sjhibbits        case(e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC):
1496296177Sjhibbits        case(e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR):
1497296177Sjhibbits        case(e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE):
1498296177Sjhibbits        case(e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE):
1499296177Sjhibbits            if(!p_FmPcd->p_FmPcdPlcr)
1500296177Sjhibbits                RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt - policer is not working"));
1501296177Sjhibbits            break;
1502296177Sjhibbits        case(e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC):
1503296177Sjhibbits        case(e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC):
1504296177Sjhibbits           if(!p_FmPcd->p_FmPcdPrs)
1505296177Sjhibbits                RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this interrupt -parsrer is not working"));
1506296177Sjhibbits            break;
1507296177Sjhibbits        default:
1508296177Sjhibbits            RETURN_ERROR(MINOR, E_INVALID_STATE, ("Invalid interrupt requested"));
1509296177Sjhibbits
1510296177Sjhibbits    }
1511296177Sjhibbits    switch(exception)
1512296177Sjhibbits    {
1513296177Sjhibbits        case e_FM_PCD_PRS_EXCEPTION_DOUBLE_ECC:
1514296177Sjhibbits            if (!(p_FmPcd->exceptions & FM_PCD_EX_PRS_DOUBLE_ECC))
1515296177Sjhibbits                RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
1516296177Sjhibbits            WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->perfr, FM_PCD_PRS_DOUBLE_ECC);
1517296177Sjhibbits            break;
1518296177Sjhibbits        case e_FM_PCD_PRS_EXCEPTION_SINGLE_ECC:
1519296177Sjhibbits            if (!(p_FmPcd->exceptions & FM_PCD_EX_PRS_SINGLE_ECC))
1520296177Sjhibbits                RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
1521296177Sjhibbits            WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->pevfr, FM_PCD_PRS_SINGLE_ECC);
1522296177Sjhibbits            break;
1523296177Sjhibbits        case e_FM_PCD_KG_EXCEPTION_DOUBLE_ECC:
1524296177Sjhibbits            if (!(p_FmPcd->exceptions & FM_PCD_EX_KG_DOUBLE_ECC))
1525296177Sjhibbits                RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
1526296177Sjhibbits            WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->kgfeer, FM_PCD_KG_DOUBLE_ECC);
1527296177Sjhibbits            break;
1528296177Sjhibbits        case e_FM_PCD_KG_EXCEPTION_KEYSIZE_OVERFLOW:
1529296177Sjhibbits            if (!(p_FmPcd->exceptions & FM_PCD_EX_KG_KEYSIZE_OVERFLOW))
1530296177Sjhibbits                RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
1531296177Sjhibbits            WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->kgfeer, FM_PCD_KG_KEYSIZE_OVERFLOW);
1532296177Sjhibbits            break;
1533296177Sjhibbits        case e_FM_PCD_PLCR_EXCEPTION_DOUBLE_ECC:
1534296177Sjhibbits            if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_DOUBLE_ECC))
1535296177Sjhibbits                RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
1536296177Sjhibbits            WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eifr, FM_PCD_PLCR_DOUBLE_ECC);
1537296177Sjhibbits            break;
1538296177Sjhibbits        case e_FM_PCD_PLCR_EXCEPTION_INIT_ENTRY_ERROR:
1539296177Sjhibbits            if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_INIT_ENTRY_ERROR))
1540296177Sjhibbits                RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
1541296177Sjhibbits            WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_eifr, FM_PCD_PLCR_INIT_ENTRY_ERROR);
1542296177Sjhibbits            break;
1543296177Sjhibbits        case e_FM_PCD_PLCR_EXCEPTION_PRAM_SELF_INIT_COMPLETE:
1544296177Sjhibbits            if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_PRAM_SELF_INIT_COMPLETE))
1545296177Sjhibbits                RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
1546296177Sjhibbits            WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ifr, FM_PCD_PLCR_PRAM_SELF_INIT_COMPLETE);
1547296177Sjhibbits            break;
1548296177Sjhibbits        case e_FM_PCD_PLCR_EXCEPTION_ATOMIC_ACTION_COMPLETE:
1549296177Sjhibbits            if (!(p_FmPcd->exceptions & FM_PCD_EX_PLCR_ATOMIC_ACTION_COMPLETE))
1550296177Sjhibbits                RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception is masked"));
1551296177Sjhibbits            WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ifr, FM_PCD_PLCR_ATOMIC_ACTION_COMPLETE);
1552296177Sjhibbits            break;
1553296177Sjhibbits        default:
1554296177Sjhibbits            RETURN_ERROR(MINOR, E_NOT_SUPPORTED, ("The selected exception may not be forced"));
1555296177Sjhibbits    }
1556296177Sjhibbits
1557296177Sjhibbits    return E_OK;
1558296177Sjhibbits}
1559296177Sjhibbits
1560296177Sjhibbits
1561296177Sjhibbitst_Error FM_PCD_ModifyCounter(t_Handle h_FmPcd, e_FmPcdCounters counter, uint32_t value)
1562296177Sjhibbits{
1563296177Sjhibbits    t_FmPcd            *p_FmPcd = (t_FmPcd*)h_FmPcd;
1564296177Sjhibbits
1565296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(h_FmPcd, E_INVALID_HANDLE);
1566296177Sjhibbits    SANITY_CHECK_RETURN_ERROR(!p_FmPcd->p_FmPcdDriverParam, E_INVALID_STATE);
1567296177Sjhibbits
1568296177Sjhibbits    if(p_FmPcd->guestId != NCSW_MASTER_ID)
1569296177Sjhibbits        RETURN_ERROR(MAJOR, E_NOT_SUPPORTED, ("FM_PCD_ModifyCounter - guest mode!"));
1570296177Sjhibbits
1571296177Sjhibbits    switch(counter)
1572296177Sjhibbits    {
1573296177Sjhibbits        case(e_FM_PCD_KG_COUNTERS_TOTAL):
1574296177Sjhibbits            if(!p_FmPcd->p_FmPcdKg)
1575296177Sjhibbits                RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this counters - keygen is not working"));
1576296177Sjhibbits            break;
1577296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_YELLOW):
1578296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_RED):
1579296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):
1580296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):
1581296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_TOTAL):
1582296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):
1583296177Sjhibbits            if(!p_FmPcd->p_FmPcdPlcr)
1584296177Sjhibbits                RETURN_ERROR(MINOR, E_INVALID_STATE, ("Can't ask for this counters - Policer is not working"));
1585296177Sjhibbits            if(!(GET_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_gcr) & FM_PCD_PLCR_GCR_STEN))
1586296177Sjhibbits                RETURN_ERROR(MINOR, E_INVALID_STATE, ("Requested counter was not enabled"));
1587296177Sjhibbits            break;
1588296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):
1589296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):
1590296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):
1591296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):
1592296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):
1593296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):
1594296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):
1595296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):
1596296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):
1597296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):
1598296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):
1599296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):
1600296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):
1601296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):
1602296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):
1603296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):
1604296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):
1605296177Sjhibbits            if(!p_FmPcd->p_FmPcdPrs)
1606296177Sjhibbits                RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported type of counter"));
1607296177Sjhibbits            break;
1608296177Sjhibbits        default:
1609296177Sjhibbits            RETURN_ERROR(MINOR, E_INVALID_STATE, ("Unsupported type of counter"));
1610296177Sjhibbits    }
1611296177Sjhibbits    switch(counter)
1612296177Sjhibbits    {
1613296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_PARSE_DISPATCH):
1614296177Sjhibbits               WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->pds, value);
1615296177Sjhibbits            break;
1616296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED):
1617296177Sjhibbits               WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l2rrs, value);
1618296177Sjhibbits            break;
1619296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED):
1620296177Sjhibbits               WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l3rrs, value);
1621296177Sjhibbits             break;
1622296177Sjhibbits       case(e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED):
1623296177Sjhibbits               WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l4rrs, value);
1624296177Sjhibbits            break;
1625296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED):
1626296177Sjhibbits               WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->srrs, value);
1627296177Sjhibbits            break;
1628296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L2_PARSE_RESULT_RETURNED_WITH_ERR):
1629296177Sjhibbits               WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l2rres, value);
1630296177Sjhibbits            break;
1631296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L3_PARSE_RESULT_RETURNED_WITH_ERR):
1632296177Sjhibbits               WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l3rres, value);
1633296177Sjhibbits            break;
1634296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_L4_PARSE_RESULT_RETURNED_WITH_ERR):
1635296177Sjhibbits               WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->l4rres, value);
1636296177Sjhibbits            break;
1637296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_SHIM_PARSE_RESULT_RETURNED_WITH_ERR):
1638296177Sjhibbits               WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->srres, value);
1639296177Sjhibbits            break;
1640296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_SOFT_PRS_CYCLES):
1641296177Sjhibbits               WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->spcs, value);
1642296177Sjhibbits            break;
1643296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_SOFT_PRS_STALL_CYCLES):
1644296177Sjhibbits               WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->spscs, value);
1645296177Sjhibbits            break;
1646296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_HARD_PRS_CYCLE_INCL_STALL_CYCLES):
1647296177Sjhibbits               WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->hxscs, value);
1648296177Sjhibbits            break;
1649296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_MURAM_READ_CYCLES):
1650296177Sjhibbits               WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->mrcs, value);
1651296177Sjhibbits            break;
1652296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_MURAM_READ_STALL_CYCLES):
1653296177Sjhibbits               WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->mrscs, value);
1654296177Sjhibbits            break;
1655296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_CYCLES):
1656296177Sjhibbits               WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->mwcs, value);
1657296177Sjhibbits            break;
1658296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_MURAM_WRITE_STALL_CYCLES):
1659296177Sjhibbits               WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->mwscs, value);
1660296177Sjhibbits            break;
1661296177Sjhibbits        case(e_FM_PCD_PRS_COUNTERS_FPM_COMMAND_STALL_CYCLES):
1662296177Sjhibbits               WRITE_UINT32(p_FmPcd->p_FmPcdPrs->p_FmPcdPrsRegs->fcscs, value);
1663296177Sjhibbits             break;
1664296177Sjhibbits        case(e_FM_PCD_KG_COUNTERS_TOTAL):
1665296177Sjhibbits            WRITE_UINT32(p_FmPcd->p_FmPcdKg->p_FmPcdKgRegs->kgtpc,value);
1666296177Sjhibbits            break;
1667296177Sjhibbits
1668296177Sjhibbits        /*Policer counters*/
1669296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_YELLOW):
1670296177Sjhibbits            WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_ypcnt, value);
1671296177Sjhibbits            break;
1672296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_RED):
1673296177Sjhibbits            WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rpcnt, value);
1674296177Sjhibbits            break;
1675296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_RED):
1676296177Sjhibbits             WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rrpcnt, value);
1677296177Sjhibbits            break;
1678296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_RECOLORED_TO_YELLOW):
1679296177Sjhibbits              WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_rypcnt, value);
1680296177Sjhibbits            break;
1681296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_TOTAL):
1682296177Sjhibbits              WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_tpcnt, value);
1683296177Sjhibbits            break;
1684296177Sjhibbits        case(e_FM_PCD_PLCR_COUNTERS_LENGTH_MISMATCH):
1685296177Sjhibbits              WRITE_UINT32(p_FmPcd->p_FmPcdPlcr->p_FmPcdPlcrRegs->fmpl_flmcnt, value);
1686296177Sjhibbits            break;
1687296177Sjhibbits        default:
1688296177Sjhibbits            RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Unsupported type of counter"));
1689296177Sjhibbits    }
1690296177Sjhibbits
1691296177Sjhibbitsreturn E_OK;
1692296177Sjhibbits}
1693296177Sjhibbits
1694