xref: /freebsd/sys/contrib/ncsw/Peripherals/FM/SP/fm_sp.c (revision c2c014f24c10f90d85126ac5fbd4d8524de32b1c)
1*852ba100SJustin Hibbits /*
2*852ba100SJustin Hibbits  * Copyright 2008-2012 Freescale Semiconductor Inc.
3*852ba100SJustin Hibbits  *
4*852ba100SJustin Hibbits  * Redistribution and use in source and binary forms, with or without
5*852ba100SJustin Hibbits  * modification, are permitted provided that the following conditions are met:
6*852ba100SJustin Hibbits  *     * Redistributions of source code must retain the above copyright
7*852ba100SJustin Hibbits  *       notice, this list of conditions and the following disclaimer.
8*852ba100SJustin Hibbits  *     * Redistributions in binary form must reproduce the above copyright
9*852ba100SJustin Hibbits  *       notice, this list of conditions and the following disclaimer in the
10*852ba100SJustin Hibbits  *       documentation and/or other materials provided with the distribution.
11*852ba100SJustin Hibbits  *     * Neither the name of Freescale Semiconductor nor the
12*852ba100SJustin Hibbits  *       names of its contributors may be used to endorse or promote products
13*852ba100SJustin Hibbits  *       derived from this software without specific prior written permission.
14*852ba100SJustin Hibbits  *
15*852ba100SJustin Hibbits  *
16*852ba100SJustin Hibbits  * ALTERNATIVELY, this software may be distributed under the terms of the
17*852ba100SJustin Hibbits  * GNU General Public License ("GPL") as published by the Free Software
18*852ba100SJustin Hibbits  * Foundation, either version 2 of that License or (at your option) any
19*852ba100SJustin Hibbits  * later version.
20*852ba100SJustin Hibbits  *
21*852ba100SJustin Hibbits  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22*852ba100SJustin Hibbits  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23*852ba100SJustin Hibbits  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24*852ba100SJustin Hibbits  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25*852ba100SJustin Hibbits  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26*852ba100SJustin Hibbits  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27*852ba100SJustin Hibbits  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28*852ba100SJustin Hibbits  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29*852ba100SJustin Hibbits  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30*852ba100SJustin Hibbits  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*852ba100SJustin Hibbits  */
32*852ba100SJustin Hibbits 
33*852ba100SJustin Hibbits 
34*852ba100SJustin Hibbits /******************************************************************************
35*852ba100SJustin Hibbits  @File          fm_sp.c
36*852ba100SJustin Hibbits 
37*852ba100SJustin Hibbits  @Description   FM PCD Storage profile  ...
38*852ba100SJustin Hibbits *//***************************************************************************/
39*852ba100SJustin Hibbits 
40*852ba100SJustin Hibbits #include "std_ext.h"
41*852ba100SJustin Hibbits #include "error_ext.h"
42*852ba100SJustin Hibbits #include "string_ext.h"
43*852ba100SJustin Hibbits #include "debug_ext.h"
44*852ba100SJustin Hibbits #include "net_ext.h"
45*852ba100SJustin Hibbits 
46*852ba100SJustin Hibbits #include "fm_vsp_ext.h"
47*852ba100SJustin Hibbits #include "fm_sp.h"
48*852ba100SJustin Hibbits #include "fm_common.h"
49*852ba100SJustin Hibbits #include "fsl_fman_sp.h"
50*852ba100SJustin Hibbits 
51*852ba100SJustin Hibbits 
52*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
CheckParamsGeneratedInternally(t_FmVspEntry * p_FmVspEntry)53*852ba100SJustin Hibbits static t_Error CheckParamsGeneratedInternally(t_FmVspEntry *p_FmVspEntry)
54*852ba100SJustin Hibbits {
55*852ba100SJustin Hibbits     t_Error err = E_OK;
56*852ba100SJustin Hibbits 
57*852ba100SJustin Hibbits     if ((err = FmSpCheckIntContextParams(&p_FmVspEntry->intContext))!= E_OK)
58*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
59*852ba100SJustin Hibbits     if ((err =  FmSpCheckBufMargins(&p_FmVspEntry->bufMargins)) != E_OK)
60*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
61*852ba100SJustin Hibbits     return err;
62*852ba100SJustin Hibbits 
63*852ba100SJustin Hibbits }
64*852ba100SJustin Hibbits 
CheckParams(t_FmVspEntry * p_FmVspEntry)65*852ba100SJustin Hibbits static t_Error CheckParams(t_FmVspEntry *p_FmVspEntry)
66*852ba100SJustin Hibbits {
67*852ba100SJustin Hibbits     t_Error err = E_OK;
68*852ba100SJustin Hibbits 
69*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry, E_INVALID_HANDLE);
70*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry->p_FmVspEntryDriverParams, E_INVALID_HANDLE);
71*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry->h_Fm, E_INVALID_HANDLE);
72*852ba100SJustin Hibbits 
73*852ba100SJustin Hibbits     if ((err = FmSpCheckBufPoolsParams(&p_FmVspEntry->p_FmVspEntryDriverParams->extBufPools,
74*852ba100SJustin Hibbits                                         p_FmVspEntry->p_FmVspEntryDriverParams->p_BackupBmPools,
75*852ba100SJustin Hibbits                                         p_FmVspEntry->p_FmVspEntryDriverParams->p_BufPoolDepletion)) != E_OK)
76*852ba100SJustin Hibbits 
77*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
78*852ba100SJustin Hibbits 
79*852ba100SJustin Hibbits     if (p_FmVspEntry->p_FmVspEntryDriverParams->liodnOffset & ~FM_LIODN_OFFSET_MASK)
80*852ba100SJustin Hibbits          RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("liodnOffset is larger than %d", FM_LIODN_OFFSET_MASK+1));
81*852ba100SJustin Hibbits 
82*852ba100SJustin Hibbits     err = FmVSPCheckRelativeProfile(p_FmVspEntry->h_Fm,
83*852ba100SJustin Hibbits                                     p_FmVspEntry->portType,
84*852ba100SJustin Hibbits                                     p_FmVspEntry->portId,
85*852ba100SJustin Hibbits                                     p_FmVspEntry->relativeProfileId);
86*852ba100SJustin Hibbits 
87*852ba100SJustin Hibbits     return err;
88*852ba100SJustin Hibbits }
89*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
90*852ba100SJustin Hibbits 
91*852ba100SJustin Hibbits 
92*852ba100SJustin Hibbits /*****************************************************************************/
93*852ba100SJustin Hibbits /*              Inter-module API routines                                    */
94*852ba100SJustin Hibbits /*****************************************************************************/
FmSpSetBufPoolsInAscOrderOfBufSizes(t_FmExtPools * p_FmExtPools,uint8_t * orderedArray,uint16_t * sizesArray)95*852ba100SJustin Hibbits void FmSpSetBufPoolsInAscOrderOfBufSizes(t_FmExtPools   *p_FmExtPools,
96*852ba100SJustin Hibbits                                          uint8_t        *orderedArray,
97*852ba100SJustin Hibbits                                          uint16_t       *sizesArray)
98*852ba100SJustin Hibbits {
99*852ba100SJustin Hibbits     uint16_t                    bufSize = 0;
100*852ba100SJustin Hibbits     int                         i=0, j=0, k=0;
101*852ba100SJustin Hibbits 
102*852ba100SJustin Hibbits     /* First we copy the external buffers pools information to an ordered local array */
103*852ba100SJustin Hibbits     for (i=0;i<p_FmExtPools->numOfPoolsUsed;i++)
104*852ba100SJustin Hibbits     {
105*852ba100SJustin Hibbits         /* get pool size */
106*852ba100SJustin Hibbits         bufSize = p_FmExtPools->extBufPool[i].size;
107*852ba100SJustin Hibbits 
108*852ba100SJustin Hibbits         /* keep sizes in an array according to poolId for direct access */
109*852ba100SJustin Hibbits         sizesArray[p_FmExtPools->extBufPool[i].id] =  bufSize;
110*852ba100SJustin Hibbits 
111*852ba100SJustin Hibbits         /* save poolId in an ordered array according to size */
112*852ba100SJustin Hibbits         for (j=0;j<=i;j++)
113*852ba100SJustin Hibbits         {
114*852ba100SJustin Hibbits             /* this is the next free place in the array */
115*852ba100SJustin Hibbits             if (j==i)
116*852ba100SJustin Hibbits                 orderedArray[i] = p_FmExtPools->extBufPool[i].id;
117*852ba100SJustin Hibbits             else
118*852ba100SJustin Hibbits             {
119*852ba100SJustin Hibbits                 /* find the right place for this poolId */
120*852ba100SJustin Hibbits                 if (bufSize < sizesArray[orderedArray[j]])
121*852ba100SJustin Hibbits                 {
122*852ba100SJustin Hibbits                     /* move the poolIds one place ahead to make room for this poolId */
123*852ba100SJustin Hibbits                     for (k=i;k>j;k--)
124*852ba100SJustin Hibbits                        orderedArray[k] = orderedArray[k-1];
125*852ba100SJustin Hibbits 
126*852ba100SJustin Hibbits                     /* now k==j, this is the place for the new size */
127*852ba100SJustin Hibbits                     orderedArray[k] = p_FmExtPools->extBufPool[i].id;
128*852ba100SJustin Hibbits                     break;
129*852ba100SJustin Hibbits                 }
130*852ba100SJustin Hibbits             }
131*852ba100SJustin Hibbits         }
132*852ba100SJustin Hibbits     }
133*852ba100SJustin Hibbits }
134*852ba100SJustin Hibbits 
FmSpCheckBufPoolsParams(t_FmExtPools * p_FmExtPools,t_FmBackupBmPools * p_FmBackupBmPools,t_FmBufPoolDepletion * p_FmBufPoolDepletion)135*852ba100SJustin Hibbits t_Error FmSpCheckBufPoolsParams(t_FmExtPools            *p_FmExtPools,
136*852ba100SJustin Hibbits                                 t_FmBackupBmPools       *p_FmBackupBmPools,
137*852ba100SJustin Hibbits                                 t_FmBufPoolDepletion    *p_FmBufPoolDepletion)
138*852ba100SJustin Hibbits {
139*852ba100SJustin Hibbits 
140*852ba100SJustin Hibbits     int         i = 0, j = 0;
141*852ba100SJustin Hibbits     bool        found;
142*852ba100SJustin Hibbits     uint8_t     count = 0;
143*852ba100SJustin Hibbits 
144*852ba100SJustin Hibbits     if (p_FmExtPools)
145*852ba100SJustin Hibbits     {
146*852ba100SJustin Hibbits         if (p_FmExtPools->numOfPoolsUsed > FM_PORT_MAX_NUM_OF_EXT_POOLS)
147*852ba100SJustin Hibbits                 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("numOfPoolsUsed can't be larger than %d", FM_PORT_MAX_NUM_OF_EXT_POOLS));
148*852ba100SJustin Hibbits 
149*852ba100SJustin Hibbits         for (i=0;i<p_FmExtPools->numOfPoolsUsed;i++)
150*852ba100SJustin Hibbits         {
151*852ba100SJustin Hibbits             if (p_FmExtPools->extBufPool[i].id >= BM_MAX_NUM_OF_POOLS)
152*852ba100SJustin Hibbits                 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("extBufPools.extBufPool[%d].id can't be larger than %d", i, BM_MAX_NUM_OF_POOLS));
153*852ba100SJustin Hibbits             if (!p_FmExtPools->extBufPool[i].size)
154*852ba100SJustin Hibbits                 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("extBufPools.extBufPool[%d].size is 0", i));
155*852ba100SJustin Hibbits         }
156*852ba100SJustin Hibbits     }
157*852ba100SJustin Hibbits     if (!p_FmExtPools && (p_FmBackupBmPools || p_FmBufPoolDepletion))
158*852ba100SJustin Hibbits           RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("backupBmPools ot bufPoolDepletion can not be defined without external pools"));
159*852ba100SJustin Hibbits 
160*852ba100SJustin Hibbits     /* backup BM pools indication is valid only for some chip derivatives
161*852ba100SJustin Hibbits        (limited by the config routine) */
162*852ba100SJustin Hibbits     if (p_FmBackupBmPools)
163*852ba100SJustin Hibbits     {
164*852ba100SJustin Hibbits         if (p_FmBackupBmPools->numOfBackupPools >= p_FmExtPools->numOfPoolsUsed)
165*852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("p_BackupBmPools must be smaller than extBufPools.numOfPoolsUsed"));
166*852ba100SJustin Hibbits         found = FALSE;
167*852ba100SJustin Hibbits         for (i = 0;i<p_FmBackupBmPools->numOfBackupPools;i++)
168*852ba100SJustin Hibbits         {
169*852ba100SJustin Hibbits 
170*852ba100SJustin Hibbits             for (j=0;j<p_FmExtPools->numOfPoolsUsed;j++)
171*852ba100SJustin Hibbits             {
172*852ba100SJustin Hibbits                 if (p_FmBackupBmPools->poolIds[i] == p_FmExtPools->extBufPool[j].id)
173*852ba100SJustin Hibbits                 {
174*852ba100SJustin Hibbits                     found = TRUE;
175*852ba100SJustin Hibbits                     break;
176*852ba100SJustin Hibbits                 }
177*852ba100SJustin Hibbits             }
178*852ba100SJustin Hibbits             if (!found)
179*852ba100SJustin Hibbits                 RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("All p_BackupBmPools.poolIds must be included in extBufPools.extBufPool[n].id"));
180*852ba100SJustin Hibbits             else
181*852ba100SJustin Hibbits                 found = FALSE;
182*852ba100SJustin Hibbits         }
183*852ba100SJustin Hibbits     }
184*852ba100SJustin Hibbits 
185*852ba100SJustin Hibbits     /* up to extBufPools.numOfPoolsUsed pools may be defined */
186*852ba100SJustin Hibbits     if (p_FmBufPoolDepletion && p_FmBufPoolDepletion->poolsGrpModeEnable)
187*852ba100SJustin Hibbits     {
188*852ba100SJustin Hibbits         if ((p_FmBufPoolDepletion->numOfPools > p_FmExtPools->numOfPoolsUsed))
189*852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("bufPoolDepletion.numOfPools can't be larger than %d and can't be larger than numOfPoolsUsed", FM_PORT_MAX_NUM_OF_EXT_POOLS));
190*852ba100SJustin Hibbits 
191*852ba100SJustin Hibbits         if (!p_FmBufPoolDepletion->numOfPools)
192*852ba100SJustin Hibbits           RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("bufPoolDepletion.numOfPoolsToConsider can not be 0 when poolsGrpModeEnable=TRUE"));
193*852ba100SJustin Hibbits 
194*852ba100SJustin Hibbits         found = FALSE;
195*852ba100SJustin Hibbits         count = 0;
196*852ba100SJustin Hibbits         /* for each pool that is in poolsToConsider, check if it is defined
197*852ba100SJustin Hibbits            in extBufPool */
198*852ba100SJustin Hibbits         for (i=0;i<BM_MAX_NUM_OF_POOLS;i++)
199*852ba100SJustin Hibbits         {
200*852ba100SJustin Hibbits             if (p_FmBufPoolDepletion->poolsToConsider[i])
201*852ba100SJustin Hibbits             {
202*852ba100SJustin Hibbits                 for (j=0;j<p_FmExtPools->numOfPoolsUsed;j++)
203*852ba100SJustin Hibbits                  {
204*852ba100SJustin Hibbits                     if (i == p_FmExtPools->extBufPool[j].id)
205*852ba100SJustin Hibbits                     {
206*852ba100SJustin Hibbits                         found = TRUE;
207*852ba100SJustin Hibbits                         count++;
208*852ba100SJustin Hibbits                         break;
209*852ba100SJustin Hibbits                     }
210*852ba100SJustin Hibbits                  }
211*852ba100SJustin Hibbits                 if (!found)
212*852ba100SJustin Hibbits                     RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Pools selected for depletion are not used."));
213*852ba100SJustin Hibbits                 else
214*852ba100SJustin Hibbits                     found = FALSE;
215*852ba100SJustin Hibbits             }
216*852ba100SJustin Hibbits         }
217*852ba100SJustin Hibbits         /* check that the number of pools that we have checked is equal to the number announced by the user */
218*852ba100SJustin Hibbits         if (count != p_FmBufPoolDepletion->numOfPools)
219*852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("bufPoolDepletion.numOfPools is larger than the number of pools defined."));
220*852ba100SJustin Hibbits     }
221*852ba100SJustin Hibbits 
222*852ba100SJustin Hibbits     if (p_FmBufPoolDepletion && p_FmBufPoolDepletion->singlePoolModeEnable)
223*852ba100SJustin Hibbits     {
224*852ba100SJustin Hibbits         /* calculate vector for number of pools depletion */
225*852ba100SJustin Hibbits         found = FALSE;
226*852ba100SJustin Hibbits         count = 0;
227*852ba100SJustin Hibbits         for (i=0;i<BM_MAX_NUM_OF_POOLS;i++)
228*852ba100SJustin Hibbits         {
229*852ba100SJustin Hibbits             if (p_FmBufPoolDepletion->poolsToConsiderForSingleMode[i])
230*852ba100SJustin Hibbits             {
231*852ba100SJustin Hibbits                 for (j=0;j<p_FmExtPools->numOfPoolsUsed;j++)
232*852ba100SJustin Hibbits                 {
233*852ba100SJustin Hibbits                     if (i == p_FmExtPools->extBufPool[j].id)
234*852ba100SJustin Hibbits                     {
235*852ba100SJustin Hibbits                         found = TRUE;
236*852ba100SJustin Hibbits                         count++;
237*852ba100SJustin Hibbits                         break;
238*852ba100SJustin Hibbits                     }
239*852ba100SJustin Hibbits                 }
240*852ba100SJustin Hibbits                 if (!found)
241*852ba100SJustin Hibbits                     RETURN_ERROR(MAJOR, E_INVALID_STATE, ("Pools selected for depletion are not used."));
242*852ba100SJustin Hibbits                 else
243*852ba100SJustin Hibbits                     found = FALSE;
244*852ba100SJustin Hibbits             }
245*852ba100SJustin Hibbits         }
246*852ba100SJustin Hibbits         if (!count)
247*852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("No pools defined for single buffer mode pool depletion."));
248*852ba100SJustin Hibbits     }
249*852ba100SJustin Hibbits 
250*852ba100SJustin Hibbits     return E_OK;
251*852ba100SJustin Hibbits }
252*852ba100SJustin Hibbits 
FmSpCheckIntContextParams(t_FmSpIntContextDataCopy * p_FmSpIntContextDataCopy)253*852ba100SJustin Hibbits t_Error FmSpCheckIntContextParams(t_FmSpIntContextDataCopy *p_FmSpIntContextDataCopy)
254*852ba100SJustin Hibbits {
255*852ba100SJustin Hibbits     /* Check that divisible by 16 and not larger than 240 */
256*852ba100SJustin Hibbits     if (p_FmSpIntContextDataCopy->intContextOffset >MAX_INT_OFFSET)
257*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("intContext.intContextOffset can't be larger than %d", MAX_INT_OFFSET));
258*852ba100SJustin Hibbits     if (p_FmSpIntContextDataCopy->intContextOffset % OFFSET_UNITS)
259*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("intContext.intContextOffset has to be divisible by %d", OFFSET_UNITS));
260*852ba100SJustin Hibbits 
261*852ba100SJustin Hibbits     /* check that ic size+ic internal offset, does not exceed ic block size */
262*852ba100SJustin Hibbits     if (p_FmSpIntContextDataCopy->size + p_FmSpIntContextDataCopy->intContextOffset > MAX_IC_SIZE)
263*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("intContext.size + intContext.intContextOffset has to be smaller than %d", MAX_IC_SIZE));
264*852ba100SJustin Hibbits     /* Check that divisible by 16 and not larger than 256 */
265*852ba100SJustin Hibbits     if (p_FmSpIntContextDataCopy->size % OFFSET_UNITS)
266*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("intContext.size  has to be divisible by %d", OFFSET_UNITS));
267*852ba100SJustin Hibbits 
268*852ba100SJustin Hibbits     /* Check that divisible by 16 and not larger than 4K */
269*852ba100SJustin Hibbits     if (p_FmSpIntContextDataCopy->extBufOffset > MAX_EXT_OFFSET)
270*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("intContext.extBufOffset can't be larger than %d", MAX_EXT_OFFSET));
271*852ba100SJustin Hibbits     if (p_FmSpIntContextDataCopy->extBufOffset % OFFSET_UNITS)
272*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("intContext.extBufOffset  has to be divisible by %d", OFFSET_UNITS));
273*852ba100SJustin Hibbits 
274*852ba100SJustin Hibbits     return E_OK;
275*852ba100SJustin Hibbits }
276*852ba100SJustin Hibbits 
FmSpCheckBufMargins(t_FmSpBufMargins * p_FmSpBufMargins)277*852ba100SJustin Hibbits t_Error FmSpCheckBufMargins(t_FmSpBufMargins *p_FmSpBufMargins)
278*852ba100SJustin Hibbits {
279*852ba100SJustin Hibbits     /* Check the margin definition */
280*852ba100SJustin Hibbits     if (p_FmSpBufMargins->startMargins > MAX_EXT_BUFFER_OFFSET)
281*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("bufMargins.startMargins can't be larger than %d", MAX_EXT_BUFFER_OFFSET));
282*852ba100SJustin Hibbits     if (p_FmSpBufMargins->endMargins > MAX_EXT_BUFFER_OFFSET)
283*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("bufMargins.endMargins can't be larger than %d", MAX_EXT_BUFFER_OFFSET));
284*852ba100SJustin Hibbits 
285*852ba100SJustin Hibbits     return E_OK;
286*852ba100SJustin Hibbits }
287*852ba100SJustin Hibbits 
FmSpBuildBufferStructure(t_FmSpIntContextDataCopy * p_FmSpIntContextDataCopy,t_FmBufferPrefixContent * p_BufferPrefixContent,t_FmSpBufMargins * p_FmSpBufMargins,t_FmSpBufferOffsets * p_FmSpBufferOffsets,uint8_t * internalBufferOffset)288*852ba100SJustin Hibbits t_Error FmSpBuildBufferStructure(t_FmSpIntContextDataCopy   *p_FmSpIntContextDataCopy,
289*852ba100SJustin Hibbits                                  t_FmBufferPrefixContent     *p_BufferPrefixContent,
290*852ba100SJustin Hibbits                                  t_FmSpBufMargins            *p_FmSpBufMargins,
291*852ba100SJustin Hibbits                                  t_FmSpBufferOffsets         *p_FmSpBufferOffsets,
292*852ba100SJustin Hibbits                                  uint8_t                     *internalBufferOffset)
293*852ba100SJustin Hibbits {
294*852ba100SJustin Hibbits     uint32_t                        tmp;
295*852ba100SJustin Hibbits 
296*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmSpIntContextDataCopy,  E_INVALID_VALUE);
297*852ba100SJustin Hibbits     ASSERT_COND(p_FmSpIntContextDataCopy);
298*852ba100SJustin Hibbits     ASSERT_COND(p_BufferPrefixContent);
299*852ba100SJustin Hibbits     ASSERT_COND(p_FmSpBufMargins);
300*852ba100SJustin Hibbits     ASSERT_COND(p_FmSpBufferOffsets);
301*852ba100SJustin Hibbits 
302*852ba100SJustin Hibbits     /* Align start of internal context data to 16 byte */
303*852ba100SJustin Hibbits     p_FmSpIntContextDataCopy->extBufOffset =
304*852ba100SJustin Hibbits         (uint16_t)((p_BufferPrefixContent->privDataSize & (OFFSET_UNITS-1)) ?
305*852ba100SJustin Hibbits             ((p_BufferPrefixContent->privDataSize + OFFSET_UNITS) & ~(uint16_t)(OFFSET_UNITS-1)) :
306*852ba100SJustin Hibbits              p_BufferPrefixContent->privDataSize);
307*852ba100SJustin Hibbits 
308*852ba100SJustin Hibbits     /* Translate margin and intContext params to FM parameters */
309*852ba100SJustin Hibbits     /* Initialize with illegal value. Later we'll set legal values. */
310*852ba100SJustin Hibbits     p_FmSpBufferOffsets->prsResultOffset = (uint32_t)ILLEGAL_BASE;
311*852ba100SJustin Hibbits     p_FmSpBufferOffsets->timeStampOffset = (uint32_t)ILLEGAL_BASE;
312*852ba100SJustin Hibbits     p_FmSpBufferOffsets->hashResultOffset= (uint32_t)ILLEGAL_BASE;
313*852ba100SJustin Hibbits     p_FmSpBufferOffsets->pcdInfoOffset   = (uint32_t)ILLEGAL_BASE;
314*852ba100SJustin Hibbits 
315*852ba100SJustin Hibbits     /* Internally the driver supports 4 options
316*852ba100SJustin Hibbits        1. prsResult/timestamp/hashResult selection (in fact 8 options, but for simplicity we'll
317*852ba100SJustin Hibbits           relate to it as 1).
318*852ba100SJustin Hibbits        2. All IC context (from AD) not including debug.*/
319*852ba100SJustin Hibbits 
320*852ba100SJustin Hibbits     /* This 'if' covers option 2. We copy from beginning of context. */
321*852ba100SJustin Hibbits     if (p_BufferPrefixContent->passAllOtherPCDInfo)
322*852ba100SJustin Hibbits     {
323*852ba100SJustin Hibbits         p_FmSpIntContextDataCopy->size = 128; /* must be aligned to 16 */
324*852ba100SJustin Hibbits         /* Start copying data after 16 bytes (FD) from the beginning of the internal context */
325*852ba100SJustin Hibbits         p_FmSpIntContextDataCopy->intContextOffset = 16;
326*852ba100SJustin Hibbits 
327*852ba100SJustin Hibbits         if (p_BufferPrefixContent->passAllOtherPCDInfo)
328*852ba100SJustin Hibbits             p_FmSpBufferOffsets->pcdInfoOffset = p_FmSpIntContextDataCopy->extBufOffset;
329*852ba100SJustin Hibbits         if (p_BufferPrefixContent->passPrsResult)
330*852ba100SJustin Hibbits             p_FmSpBufferOffsets->prsResultOffset =
331*852ba100SJustin Hibbits                 (uint32_t)(p_FmSpIntContextDataCopy->extBufOffset + 16);
332*852ba100SJustin Hibbits         if (p_BufferPrefixContent->passTimeStamp)
333*852ba100SJustin Hibbits             p_FmSpBufferOffsets->timeStampOffset =
334*852ba100SJustin Hibbits                 (uint32_t)(p_FmSpIntContextDataCopy->extBufOffset + 48);
335*852ba100SJustin Hibbits         if (p_BufferPrefixContent->passHashResult)
336*852ba100SJustin Hibbits             p_FmSpBufferOffsets->hashResultOffset =
337*852ba100SJustin Hibbits                 (uint32_t)(p_FmSpIntContextDataCopy->extBufOffset + 56);
338*852ba100SJustin Hibbits     }
339*852ba100SJustin Hibbits     else
340*852ba100SJustin Hibbits     {
341*852ba100SJustin Hibbits         /* This case covers the options under 1 */
342*852ba100SJustin Hibbits         /* Copy size must be in 16-byte granularity. */
343*852ba100SJustin Hibbits         p_FmSpIntContextDataCopy->size =
344*852ba100SJustin Hibbits             (uint16_t)((p_BufferPrefixContent->passPrsResult ? 32 : 0) +
345*852ba100SJustin Hibbits                       ((p_BufferPrefixContent->passTimeStamp ||
346*852ba100SJustin Hibbits                       p_BufferPrefixContent->passHashResult) ? 16 : 0));
347*852ba100SJustin Hibbits 
348*852ba100SJustin Hibbits         /* Align start of internal context data to 16 byte */
349*852ba100SJustin Hibbits         p_FmSpIntContextDataCopy->intContextOffset =
350*852ba100SJustin Hibbits             (uint8_t)(p_BufferPrefixContent->passPrsResult ? 32 :
351*852ba100SJustin Hibbits                       ((p_BufferPrefixContent->passTimeStamp  ||
352*852ba100SJustin Hibbits                        p_BufferPrefixContent->passHashResult) ? 64 : 0));
353*852ba100SJustin Hibbits 
354*852ba100SJustin Hibbits         if (p_BufferPrefixContent->passPrsResult)
355*852ba100SJustin Hibbits             p_FmSpBufferOffsets->prsResultOffset = p_FmSpIntContextDataCopy->extBufOffset;
356*852ba100SJustin Hibbits         if (p_BufferPrefixContent->passTimeStamp)
357*852ba100SJustin Hibbits             p_FmSpBufferOffsets->timeStampOffset =  p_BufferPrefixContent->passPrsResult ?
358*852ba100SJustin Hibbits                                         (p_FmSpIntContextDataCopy->extBufOffset + sizeof(t_FmPrsResult)) :
359*852ba100SJustin Hibbits                                         p_FmSpIntContextDataCopy->extBufOffset;
360*852ba100SJustin Hibbits         if (p_BufferPrefixContent->passHashResult)
361*852ba100SJustin Hibbits             /* If PR is not requested, whether TS is requested or not, IC will be copied from TS */
362*852ba100SJustin Hibbits             p_FmSpBufferOffsets->hashResultOffset = p_BufferPrefixContent->passPrsResult ?
363*852ba100SJustin Hibbits                                           (p_FmSpIntContextDataCopy->extBufOffset + sizeof(t_FmPrsResult) + 8) :
364*852ba100SJustin Hibbits                                           p_FmSpIntContextDataCopy->extBufOffset + 8;
365*852ba100SJustin Hibbits     }
366*852ba100SJustin Hibbits 
367*852ba100SJustin Hibbits     if (p_FmSpIntContextDataCopy->size)
368*852ba100SJustin Hibbits         p_FmSpBufMargins->startMargins =
369*852ba100SJustin Hibbits             (uint16_t)(p_FmSpIntContextDataCopy->extBufOffset +
370*852ba100SJustin Hibbits                        p_FmSpIntContextDataCopy->size);
371*852ba100SJustin Hibbits     else
372*852ba100SJustin Hibbits         /* No Internal Context passing, STartMargin is immediately after privateInfo */
373*852ba100SJustin Hibbits         p_FmSpBufMargins->startMargins = p_BufferPrefixContent->privDataSize;
374*852ba100SJustin Hibbits 
375*852ba100SJustin Hibbits     /* save extra space for manip in both external and internal buffers */
376*852ba100SJustin Hibbits     if (p_BufferPrefixContent->manipExtraSpace)
377*852ba100SJustin Hibbits     {
378*852ba100SJustin Hibbits         uint8_t extraSpace;
379*852ba100SJustin Hibbits #ifdef FM_CAPWAP_SUPPORT
380*852ba100SJustin Hibbits         if ((p_BufferPrefixContent->manipExtraSpace + CAPWAP_FRAG_EXTRA_SPACE) >= 256)
381*852ba100SJustin Hibbits             RETURN_ERROR(MAJOR, E_INVALID_VALUE,
382*852ba100SJustin Hibbits                          ("p_BufferPrefixContent->manipExtraSpace should be less than %d",
383*852ba100SJustin Hibbits                           256-CAPWAP_FRAG_EXTRA_SPACE));
384*852ba100SJustin Hibbits         extraSpace = (uint8_t)(p_BufferPrefixContent->manipExtraSpace + CAPWAP_FRAG_EXTRA_SPACE);
385*852ba100SJustin Hibbits #else
386*852ba100SJustin Hibbits         extraSpace = p_BufferPrefixContent->manipExtraSpace;
387*852ba100SJustin Hibbits #endif /* FM_CAPWAP_SUPPORT */
388*852ba100SJustin Hibbits         p_FmSpBufferOffsets->manipOffset = p_FmSpBufMargins->startMargins;
389*852ba100SJustin Hibbits         p_FmSpBufMargins->startMargins += extraSpace;
390*852ba100SJustin Hibbits         *internalBufferOffset = extraSpace;
391*852ba100SJustin Hibbits     }
392*852ba100SJustin Hibbits 
393*852ba100SJustin Hibbits     /* align data start */
394*852ba100SJustin Hibbits     tmp = (uint32_t)(p_FmSpBufMargins->startMargins % p_BufferPrefixContent->dataAlign);
395*852ba100SJustin Hibbits     if (tmp)
396*852ba100SJustin Hibbits         p_FmSpBufMargins->startMargins += (p_BufferPrefixContent->dataAlign-tmp);
397*852ba100SJustin Hibbits     p_FmSpBufferOffsets->dataOffset = p_FmSpBufMargins->startMargins;
398*852ba100SJustin Hibbits 
399*852ba100SJustin Hibbits     return E_OK;
400*852ba100SJustin Hibbits }
401*852ba100SJustin Hibbits /*********************** End of inter-module routines ************************/
402*852ba100SJustin Hibbits 
403*852ba100SJustin Hibbits 
404*852ba100SJustin Hibbits #if (DPAA_VERSION >= 11)
405*852ba100SJustin Hibbits /*****************************************************************************/
406*852ba100SJustin Hibbits /*              API routines                                                 */
407*852ba100SJustin Hibbits /*****************************************************************************/
FM_VSP_Config(t_FmVspParams * p_FmVspParams)408*852ba100SJustin Hibbits t_Handle FM_VSP_Config(t_FmVspParams *p_FmVspParams)
409*852ba100SJustin Hibbits {
410*852ba100SJustin Hibbits     t_FmVspEntry          *p_FmVspEntry = NULL;
411*852ba100SJustin Hibbits     struct fm_storage_profile_params   fm_vsp_params;
412*852ba100SJustin Hibbits 
413*852ba100SJustin Hibbits     p_FmVspEntry = (t_FmVspEntry *)XX_Malloc(sizeof(t_FmVspEntry));
414*852ba100SJustin Hibbits     if (!p_FmVspEntry)
415*852ba100SJustin Hibbits     {
416*852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("p_StorageProfile allocation failed"));
417*852ba100SJustin Hibbits         return NULL;
418*852ba100SJustin Hibbits     }
419*852ba100SJustin Hibbits     memset(p_FmVspEntry, 0, sizeof(t_FmVspEntry));
420*852ba100SJustin Hibbits 
421*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams = (t_FmVspEntryDriverParams *)XX_Malloc(sizeof(t_FmVspEntryDriverParams));
422*852ba100SJustin Hibbits     if (!p_FmVspEntry->p_FmVspEntryDriverParams)
423*852ba100SJustin Hibbits     {
424*852ba100SJustin Hibbits         REPORT_ERROR(MAJOR, E_NO_MEMORY, ("p_StorageProfile allocation failed"));
425*852ba100SJustin Hibbits         XX_Free(p_FmVspEntry);
426*852ba100SJustin Hibbits         return NULL;
427*852ba100SJustin Hibbits     }
428*852ba100SJustin Hibbits     memset(p_FmVspEntry->p_FmVspEntryDriverParams, 0, sizeof(t_FmVspEntryDriverParams));
429*852ba100SJustin Hibbits     fman_vsp_defconfig(&fm_vsp_params);
430*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->dmaHeaderCacheAttr = fm_vsp_params.header_cache_attr;
431*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->dmaIntContextCacheAttr = fm_vsp_params.int_context_cache_attr;
432*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->dmaScatterGatherCacheAttr = fm_vsp_params.scatter_gather_cache_attr;
433*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->dmaSwapData = fm_vsp_params.dma_swap_data;
434*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->dmaWriteOptimize = fm_vsp_params.dma_write_optimize;
435*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->noScatherGather = fm_vsp_params.no_scather_gather;
436*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->bufferPrefixContent.privDataSize = DEFAULT_FM_SP_bufferPrefixContent_privDataSize;
437*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->bufferPrefixContent.passPrsResult= DEFAULT_FM_SP_bufferPrefixContent_passPrsResult;
438*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->bufferPrefixContent.passTimeStamp= DEFAULT_FM_SP_bufferPrefixContent_passTimeStamp;
439*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->bufferPrefixContent.passAllOtherPCDInfo
440*852ba100SJustin Hibbits                                                                     = DEFAULT_FM_SP_bufferPrefixContent_passTimeStamp;
441*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->bufferPrefixContent.dataAlign    = DEFAULT_FM_SP_bufferPrefixContent_dataAlign;
442*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->liodnOffset                      = p_FmVspParams->liodnOffset;
443*852ba100SJustin Hibbits 
444*852ba100SJustin Hibbits     memcpy(&p_FmVspEntry->p_FmVspEntryDriverParams->extBufPools, &p_FmVspParams->extBufPools, sizeof(t_FmExtPools));
445*852ba100SJustin Hibbits     p_FmVspEntry->h_Fm                                                       = p_FmVspParams->h_Fm;
446*852ba100SJustin Hibbits     p_FmVspEntry->portType                                                   = p_FmVspParams->portParams.portType;
447*852ba100SJustin Hibbits     p_FmVspEntry->portId                                                     = p_FmVspParams->portParams.portId;
448*852ba100SJustin Hibbits 
449*852ba100SJustin Hibbits     p_FmVspEntry->relativeProfileId                                          = p_FmVspParams->relativeProfileId;
450*852ba100SJustin Hibbits 
451*852ba100SJustin Hibbits    return p_FmVspEntry;
452*852ba100SJustin Hibbits }
453*852ba100SJustin Hibbits 
FM_VSP_Init(t_Handle h_FmVsp)454*852ba100SJustin Hibbits t_Error FM_VSP_Init(t_Handle h_FmVsp)
455*852ba100SJustin Hibbits {
456*852ba100SJustin Hibbits 
457*852ba100SJustin Hibbits     t_FmVspEntry                *p_FmVspEntry = (t_FmVspEntry *)h_FmVsp;
458*852ba100SJustin Hibbits     struct fm_storage_profile_params   fm_vsp_params;
459*852ba100SJustin Hibbits     uint8_t                     orderedArray[FM_PORT_MAX_NUM_OF_EXT_POOLS];
460*852ba100SJustin Hibbits     uint16_t                    sizesArray[BM_MAX_NUM_OF_POOLS];
461*852ba100SJustin Hibbits     t_Error                     err;
462*852ba100SJustin Hibbits     uint16_t                    absoluteProfileId = 0;
463*852ba100SJustin Hibbits     int                         i = 0;
464*852ba100SJustin Hibbits 
465*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry, E_INVALID_HANDLE);
466*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry->p_FmVspEntryDriverParams,E_INVALID_HANDLE);
467*852ba100SJustin Hibbits 
468*852ba100SJustin Hibbits     CHECK_INIT_PARAMETERS(p_FmVspEntry, CheckParams);
469*852ba100SJustin Hibbits 
470*852ba100SJustin Hibbits     memset(&orderedArray, 0, sizeof(uint8_t) * FM_PORT_MAX_NUM_OF_EXT_POOLS);
471*852ba100SJustin Hibbits     memset(&sizesArray, 0, sizeof(uint16_t) * BM_MAX_NUM_OF_POOLS);
472*852ba100SJustin Hibbits 
473*852ba100SJustin Hibbits     err = FmSpBuildBufferStructure(&p_FmVspEntry->intContext,
474*852ba100SJustin Hibbits                                    &p_FmVspEntry->p_FmVspEntryDriverParams->bufferPrefixContent,
475*852ba100SJustin Hibbits                                    &p_FmVspEntry->bufMargins,
476*852ba100SJustin Hibbits                                    &p_FmVspEntry->bufferOffsets,
477*852ba100SJustin Hibbits                                    &p_FmVspEntry->internalBufferOffset);
478*852ba100SJustin Hibbits     if (err != E_OK)
479*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
480*852ba100SJustin Hibbits 
481*852ba100SJustin Hibbits 
482*852ba100SJustin Hibbits     err = CheckParamsGeneratedInternally(p_FmVspEntry);
483*852ba100SJustin Hibbits     if (err != E_OK)
484*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, err, NO_MSG);
485*852ba100SJustin Hibbits 
486*852ba100SJustin Hibbits 
487*852ba100SJustin Hibbits      p_FmVspEntry->p_FmSpRegsBase =
488*852ba100SJustin Hibbits         (struct fm_pcd_storage_profile_regs *)FmGetVSPBaseAddr(p_FmVspEntry->h_Fm);
489*852ba100SJustin Hibbits     if (!p_FmVspEntry->p_FmSpRegsBase)
490*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_INVALID_VALUE, ("impossible to initialize SpRegsBase"));
491*852ba100SJustin Hibbits 
492*852ba100SJustin Hibbits     /* order external buffer pools in ascending order of buffer pools sizes */
493*852ba100SJustin Hibbits     FmSpSetBufPoolsInAscOrderOfBufSizes(&(p_FmVspEntry->p_FmVspEntryDriverParams)->extBufPools,
494*852ba100SJustin Hibbits                                         orderedArray,
495*852ba100SJustin Hibbits                                         sizesArray);
496*852ba100SJustin Hibbits 
497*852ba100SJustin Hibbits     p_FmVspEntry->extBufPools.numOfPoolsUsed =
498*852ba100SJustin Hibbits         p_FmVspEntry->p_FmVspEntryDriverParams->extBufPools.numOfPoolsUsed;
499*852ba100SJustin Hibbits     for (i = 0; i < p_FmVspEntry->extBufPools.numOfPoolsUsed; i++)
500*852ba100SJustin Hibbits     {
501*852ba100SJustin Hibbits        p_FmVspEntry->extBufPools.extBufPool[i].id = orderedArray[i];
502*852ba100SJustin Hibbits        p_FmVspEntry->extBufPools.extBufPool[i].size = sizesArray[orderedArray[i]];
503*852ba100SJustin Hibbits     }
504*852ba100SJustin Hibbits 
505*852ba100SJustin Hibbits     /* on user responsibility to fill it according requirement */
506*852ba100SJustin Hibbits     memset(&fm_vsp_params, 0, sizeof(struct fm_storage_profile_params));
507*852ba100SJustin Hibbits     fm_vsp_params.dma_swap_data              = p_FmVspEntry->p_FmVspEntryDriverParams->dmaSwapData;
508*852ba100SJustin Hibbits     fm_vsp_params.int_context_cache_attr     = p_FmVspEntry->p_FmVspEntryDriverParams->dmaIntContextCacheAttr;
509*852ba100SJustin Hibbits     fm_vsp_params.header_cache_attr          = p_FmVspEntry->p_FmVspEntryDriverParams->dmaHeaderCacheAttr;
510*852ba100SJustin Hibbits     fm_vsp_params.scatter_gather_cache_attr  = p_FmVspEntry->p_FmVspEntryDriverParams->dmaScatterGatherCacheAttr;
511*852ba100SJustin Hibbits     fm_vsp_params.dma_write_optimize         = p_FmVspEntry->p_FmVspEntryDriverParams->dmaWriteOptimize;
512*852ba100SJustin Hibbits     fm_vsp_params.liodn_offset               = p_FmVspEntry->p_FmVspEntryDriverParams->liodnOffset;
513*852ba100SJustin Hibbits     fm_vsp_params.no_scather_gather          = p_FmVspEntry->p_FmVspEntryDriverParams->noScatherGather;
514*852ba100SJustin Hibbits 
515*852ba100SJustin Hibbits     if (p_FmVspEntry->p_FmVspEntryDriverParams->p_BufPoolDepletion)
516*852ba100SJustin Hibbits     {
517*852ba100SJustin Hibbits         fm_vsp_params.buf_pool_depletion.buf_pool_depletion_enabled = TRUE;
518*852ba100SJustin Hibbits         fm_vsp_params.buf_pool_depletion.pools_grp_mode_enable = p_FmVspEntry->p_FmVspEntryDriverParams->p_BufPoolDepletion->poolsGrpModeEnable;
519*852ba100SJustin Hibbits         fm_vsp_params.buf_pool_depletion.num_pools = p_FmVspEntry->p_FmVspEntryDriverParams->p_BufPoolDepletion->numOfPools;
520*852ba100SJustin Hibbits         fm_vsp_params.buf_pool_depletion.pools_to_consider = p_FmVspEntry->p_FmVspEntryDriverParams->p_BufPoolDepletion->poolsToConsider;
521*852ba100SJustin Hibbits         fm_vsp_params.buf_pool_depletion.single_pool_mode_enable = p_FmVspEntry->p_FmVspEntryDriverParams->p_BufPoolDepletion->singlePoolModeEnable;
522*852ba100SJustin Hibbits         fm_vsp_params.buf_pool_depletion.pools_to_consider_for_single_mode = p_FmVspEntry->p_FmVspEntryDriverParams->p_BufPoolDepletion->poolsToConsiderForSingleMode;
523*852ba100SJustin Hibbits         fm_vsp_params.buf_pool_depletion.has_pfc_priorities = TRUE;
524*852ba100SJustin Hibbits         fm_vsp_params.buf_pool_depletion.pfc_priorities_en = p_FmVspEntry->p_FmVspEntryDriverParams->p_BufPoolDepletion->pfcPrioritiesEn;
525*852ba100SJustin Hibbits     }
526*852ba100SJustin Hibbits     else
527*852ba100SJustin Hibbits         fm_vsp_params.buf_pool_depletion.buf_pool_depletion_enabled = FALSE;
528*852ba100SJustin Hibbits 
529*852ba100SJustin Hibbits     if (p_FmVspEntry->p_FmVspEntryDriverParams->p_BackupBmPools)
530*852ba100SJustin Hibbits     {
531*852ba100SJustin Hibbits         fm_vsp_params.backup_pools.num_backup_pools = p_FmVspEntry->p_FmVspEntryDriverParams->p_BackupBmPools->numOfBackupPools;
532*852ba100SJustin Hibbits         fm_vsp_params.backup_pools.pool_ids = p_FmVspEntry->p_FmVspEntryDriverParams->p_BackupBmPools->poolIds;
533*852ba100SJustin Hibbits     }
534*852ba100SJustin Hibbits     else
535*852ba100SJustin Hibbits         fm_vsp_params.backup_pools.num_backup_pools = 0;
536*852ba100SJustin Hibbits 
537*852ba100SJustin Hibbits     fm_vsp_params.fm_ext_pools.num_pools_used = p_FmVspEntry->extBufPools.numOfPoolsUsed;
538*852ba100SJustin Hibbits     fm_vsp_params.fm_ext_pools.ext_buf_pool = (struct fman_ext_pool_params*)&p_FmVspEntry->extBufPools.extBufPool;
539*852ba100SJustin Hibbits     fm_vsp_params.buf_margins = (struct fman_sp_buf_margins*)&p_FmVspEntry->bufMargins;
540*852ba100SJustin Hibbits     fm_vsp_params.int_context = (struct fman_sp_int_context_data_copy*)&p_FmVspEntry->intContext;
541*852ba100SJustin Hibbits 
542*852ba100SJustin Hibbits     /* no check on err - it was checked earlier */
543*852ba100SJustin Hibbits     FmVSPGetAbsoluteProfileId(p_FmVspEntry->h_Fm,
544*852ba100SJustin Hibbits                               p_FmVspEntry->portType,
545*852ba100SJustin Hibbits                               p_FmVspEntry->portId,
546*852ba100SJustin Hibbits                               p_FmVspEntry->relativeProfileId,
547*852ba100SJustin Hibbits                               &absoluteProfileId);
548*852ba100SJustin Hibbits 
549*852ba100SJustin Hibbits     ASSERT_COND(p_FmVspEntry->p_FmSpRegsBase);
550*852ba100SJustin Hibbits     ASSERT_COND(fm_vsp_params.int_context);
551*852ba100SJustin Hibbits     ASSERT_COND(fm_vsp_params.buf_margins);
552*852ba100SJustin Hibbits     ASSERT_COND((absoluteProfileId <= FM_VSP_MAX_NUM_OF_ENTRIES));
553*852ba100SJustin Hibbits 
554*852ba100SJustin Hibbits     /* Set all registers related to VSP */
555*852ba100SJustin Hibbits     fman_vsp_init(p_FmVspEntry->p_FmSpRegsBase, absoluteProfileId, &fm_vsp_params,FM_PORT_MAX_NUM_OF_EXT_POOLS, BM_MAX_NUM_OF_POOLS, FM_MAX_NUM_OF_PFC_PRIORITIES);
556*852ba100SJustin Hibbits 
557*852ba100SJustin Hibbits     p_FmVspEntry->absoluteSpId = absoluteProfileId;
558*852ba100SJustin Hibbits 
559*852ba100SJustin Hibbits     if (p_FmVspEntry->p_FmVspEntryDriverParams)
560*852ba100SJustin Hibbits         XX_Free(p_FmVspEntry->p_FmVspEntryDriverParams);
561*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams = NULL;
562*852ba100SJustin Hibbits 
563*852ba100SJustin Hibbits     return E_OK;
564*852ba100SJustin Hibbits }
565*852ba100SJustin Hibbits 
FM_VSP_Free(t_Handle h_FmVsp)566*852ba100SJustin Hibbits t_Error FM_VSP_Free(t_Handle h_FmVsp)
567*852ba100SJustin Hibbits {
568*852ba100SJustin Hibbits     t_FmVspEntry   *p_FmVspEntry = (t_FmVspEntry *)h_FmVsp;
569*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(h_FmVsp, E_INVALID_HANDLE);
570*852ba100SJustin Hibbits     XX_Free(p_FmVspEntry);
571*852ba100SJustin Hibbits     return E_OK;
572*852ba100SJustin Hibbits }
573*852ba100SJustin Hibbits 
FM_VSP_ConfigBufferPrefixContent(t_Handle h_FmVsp,t_FmBufferPrefixContent * p_FmBufferPrefixContent)574*852ba100SJustin Hibbits t_Error FM_VSP_ConfigBufferPrefixContent(t_Handle h_FmVsp, t_FmBufferPrefixContent *p_FmBufferPrefixContent)
575*852ba100SJustin Hibbits {
576*852ba100SJustin Hibbits     t_FmVspEntry *p_FmVspEntry = (t_FmVspEntry*)h_FmVsp;
577*852ba100SJustin Hibbits 
578*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry, E_INVALID_HANDLE);
579*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry->p_FmVspEntryDriverParams, E_INVALID_HANDLE);
580*852ba100SJustin Hibbits 
581*852ba100SJustin Hibbits     memcpy(&p_FmVspEntry->p_FmVspEntryDriverParams->bufferPrefixContent, p_FmBufferPrefixContent, sizeof(t_FmBufferPrefixContent));
582*852ba100SJustin Hibbits     /* if dataAlign was not initialized by user, we return to driver's default */
583*852ba100SJustin Hibbits     if (!p_FmVspEntry->p_FmVspEntryDriverParams->bufferPrefixContent.dataAlign)
584*852ba100SJustin Hibbits         p_FmVspEntry->p_FmVspEntryDriverParams->bufferPrefixContent.dataAlign = DEFAULT_FM_SP_bufferPrefixContent_dataAlign;
585*852ba100SJustin Hibbits 
586*852ba100SJustin Hibbits     return E_OK;
587*852ba100SJustin Hibbits }
588*852ba100SJustin Hibbits 
FM_VSP_ConfigDmaSwapData(t_Handle h_FmVsp,e_FmDmaSwapOption swapData)589*852ba100SJustin Hibbits t_Error FM_VSP_ConfigDmaSwapData(t_Handle h_FmVsp, e_FmDmaSwapOption swapData)
590*852ba100SJustin Hibbits {
591*852ba100SJustin Hibbits     t_FmVspEntry *p_FmVspEntry = (t_FmVspEntry*)h_FmVsp;
592*852ba100SJustin Hibbits 
593*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry, E_INVALID_HANDLE);
594*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry->p_FmVspEntryDriverParams, E_INVALID_HANDLE);
595*852ba100SJustin Hibbits 
596*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->dmaSwapData = swapData;
597*852ba100SJustin Hibbits 
598*852ba100SJustin Hibbits     return E_OK;
599*852ba100SJustin Hibbits }
600*852ba100SJustin Hibbits 
FM_VSP_ConfigDmaIcCacheAttr(t_Handle h_FmVsp,e_FmDmaCacheOption intContextCacheAttr)601*852ba100SJustin Hibbits t_Error FM_VSP_ConfigDmaIcCacheAttr(t_Handle h_FmVsp, e_FmDmaCacheOption intContextCacheAttr)
602*852ba100SJustin Hibbits {
603*852ba100SJustin Hibbits     t_FmVspEntry *p_FmVspEntry = (t_FmVspEntry*)h_FmVsp;
604*852ba100SJustin Hibbits 
605*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry, E_INVALID_HANDLE);
606*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry->p_FmVspEntryDriverParams, E_INVALID_HANDLE);
607*852ba100SJustin Hibbits 
608*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->dmaIntContextCacheAttr = intContextCacheAttr;
609*852ba100SJustin Hibbits 
610*852ba100SJustin Hibbits     return E_OK;
611*852ba100SJustin Hibbits }
612*852ba100SJustin Hibbits 
FM_VSP_ConfigDmaHdrAttr(t_Handle h_FmVsp,e_FmDmaCacheOption headerCacheAttr)613*852ba100SJustin Hibbits t_Error FM_VSP_ConfigDmaHdrAttr(t_Handle h_FmVsp, e_FmDmaCacheOption headerCacheAttr)
614*852ba100SJustin Hibbits {
615*852ba100SJustin Hibbits     t_FmVspEntry *p_FmVspEntry = (t_FmVspEntry*)h_FmVsp;
616*852ba100SJustin Hibbits 
617*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry, E_INVALID_HANDLE);
618*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry->p_FmVspEntryDriverParams, E_INVALID_HANDLE);
619*852ba100SJustin Hibbits 
620*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->dmaHeaderCacheAttr = headerCacheAttr;
621*852ba100SJustin Hibbits 
622*852ba100SJustin Hibbits     return E_OK;
623*852ba100SJustin Hibbits }
624*852ba100SJustin Hibbits 
FM_VSP_ConfigDmaScatterGatherAttr(t_Handle h_FmVsp,e_FmDmaCacheOption scatterGatherCacheAttr)625*852ba100SJustin Hibbits t_Error FM_VSP_ConfigDmaScatterGatherAttr(t_Handle h_FmVsp, e_FmDmaCacheOption scatterGatherCacheAttr)
626*852ba100SJustin Hibbits {
627*852ba100SJustin Hibbits     t_FmVspEntry *p_FmVspEntry = (t_FmVspEntry*)h_FmVsp;
628*852ba100SJustin Hibbits 
629*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry, E_INVALID_HANDLE);
630*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry->p_FmVspEntryDriverParams, E_INVALID_HANDLE);
631*852ba100SJustin Hibbits 
632*852ba100SJustin Hibbits      p_FmVspEntry->p_FmVspEntryDriverParams->dmaScatterGatherCacheAttr = scatterGatherCacheAttr;
633*852ba100SJustin Hibbits 
634*852ba100SJustin Hibbits     return E_OK;
635*852ba100SJustin Hibbits }
636*852ba100SJustin Hibbits 
FM_VSP_ConfigDmaWriteOptimize(t_Handle h_FmVsp,bool optimize)637*852ba100SJustin Hibbits t_Error FM_VSP_ConfigDmaWriteOptimize(t_Handle h_FmVsp, bool optimize)
638*852ba100SJustin Hibbits {
639*852ba100SJustin Hibbits     t_FmVspEntry *p_FmVspEntry = (t_FmVspEntry*)h_FmVsp;
640*852ba100SJustin Hibbits 
641*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry, E_INVALID_HANDLE);
642*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry->p_FmVspEntryDriverParams, E_INVALID_HANDLE);
643*852ba100SJustin Hibbits 
644*852ba100SJustin Hibbits 
645*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->dmaWriteOptimize = optimize;
646*852ba100SJustin Hibbits 
647*852ba100SJustin Hibbits     return E_OK;
648*852ba100SJustin Hibbits }
649*852ba100SJustin Hibbits 
FM_VSP_ConfigNoScatherGather(t_Handle h_FmVsp,bool noScatherGather)650*852ba100SJustin Hibbits t_Error FM_VSP_ConfigNoScatherGather(t_Handle h_FmVsp, bool noScatherGather)
651*852ba100SJustin Hibbits {
652*852ba100SJustin Hibbits     t_FmVspEntry *p_FmVspEntry = (t_FmVspEntry*)h_FmVsp;
653*852ba100SJustin Hibbits 
654*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry, E_INVALID_HANDLE);
655*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry->p_FmVspEntryDriverParams, E_INVALID_HANDLE);
656*852ba100SJustin Hibbits 
657*852ba100SJustin Hibbits 
658*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->noScatherGather = noScatherGather;
659*852ba100SJustin Hibbits 
660*852ba100SJustin Hibbits     return E_OK;
661*852ba100SJustin Hibbits }
662*852ba100SJustin Hibbits 
FM_VSP_ConfigPoolDepletion(t_Handle h_FmVsp,t_FmBufPoolDepletion * p_BufPoolDepletion)663*852ba100SJustin Hibbits t_Error FM_VSP_ConfigPoolDepletion(t_Handle h_FmVsp, t_FmBufPoolDepletion *p_BufPoolDepletion)
664*852ba100SJustin Hibbits {
665*852ba100SJustin Hibbits     t_FmVspEntry *p_FmVspEntry = (t_FmVspEntry*)h_FmVsp;
666*852ba100SJustin Hibbits 
667*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(h_FmVsp, E_INVALID_HANDLE);
668*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry->p_FmVspEntryDriverParams, E_INVALID_HANDLE);
669*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_BufPoolDepletion, E_INVALID_HANDLE);
670*852ba100SJustin Hibbits 
671*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->p_BufPoolDepletion = (t_FmBufPoolDepletion *)XX_Malloc(sizeof(t_FmBufPoolDepletion));
672*852ba100SJustin Hibbits     if (!p_FmVspEntry->p_FmVspEntryDriverParams->p_BufPoolDepletion)
673*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_NO_MEMORY, ("p_BufPoolDepletion allocation failed"));
674*852ba100SJustin Hibbits     memcpy(p_FmVspEntry->p_FmVspEntryDriverParams->p_BufPoolDepletion, p_BufPoolDepletion, sizeof(t_FmBufPoolDepletion));
675*852ba100SJustin Hibbits 
676*852ba100SJustin Hibbits     return E_OK;
677*852ba100SJustin Hibbits }
678*852ba100SJustin Hibbits 
FM_VSP_ConfigBackupPools(t_Handle h_FmVsp,t_FmBackupBmPools * p_BackupBmPools)679*852ba100SJustin Hibbits t_Error FM_VSP_ConfigBackupPools(t_Handle h_FmVsp, t_FmBackupBmPools *p_BackupBmPools)
680*852ba100SJustin Hibbits {
681*852ba100SJustin Hibbits     t_FmVspEntry *p_FmVspEntry = (t_FmVspEntry*)h_FmVsp;
682*852ba100SJustin Hibbits 
683*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(h_FmVsp, E_INVALID_HANDLE);
684*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_FmVspEntry->p_FmVspEntryDriverParams, E_INVALID_HANDLE);
685*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_ERROR(p_BackupBmPools, E_INVALID_HANDLE);
686*852ba100SJustin Hibbits 
687*852ba100SJustin Hibbits     p_FmVspEntry->p_FmVspEntryDriverParams->p_BackupBmPools = (t_FmBackupBmPools *)XX_Malloc(sizeof(t_FmBackupBmPools));
688*852ba100SJustin Hibbits     if (!p_FmVspEntry->p_FmVspEntryDriverParams->p_BackupBmPools)
689*852ba100SJustin Hibbits         RETURN_ERROR(MAJOR, E_NO_MEMORY, ("p_BackupBmPools allocation failed"));
690*852ba100SJustin Hibbits     memcpy(p_FmVspEntry->p_FmVspEntryDriverParams->p_BackupBmPools, p_BackupBmPools, sizeof(t_FmBackupBmPools));
691*852ba100SJustin Hibbits 
692*852ba100SJustin Hibbits     return E_OK;
693*852ba100SJustin Hibbits }
694*852ba100SJustin Hibbits 
FM_VSP_GetBufferDataOffset(t_Handle h_FmVsp)695*852ba100SJustin Hibbits uint32_t FM_VSP_GetBufferDataOffset(t_Handle h_FmVsp)
696*852ba100SJustin Hibbits {
697*852ba100SJustin Hibbits     t_FmVspEntry *p_FmVspEntry = (t_FmVspEntry*)h_FmVsp;
698*852ba100SJustin Hibbits 
699*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(p_FmVspEntry, E_INVALID_HANDLE, 0);
700*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(!p_FmVspEntry->p_FmVspEntryDriverParams, E_INVALID_STATE, 0);
701*852ba100SJustin Hibbits 
702*852ba100SJustin Hibbits     return p_FmVspEntry->bufferOffsets.dataOffset;
703*852ba100SJustin Hibbits }
704*852ba100SJustin Hibbits 
FM_VSP_GetBufferICInfo(t_Handle h_FmVsp,char * p_Data)705*852ba100SJustin Hibbits uint8_t * FM_VSP_GetBufferICInfo(t_Handle h_FmVsp, char *p_Data)
706*852ba100SJustin Hibbits {
707*852ba100SJustin Hibbits     t_FmVspEntry *p_FmVspEntry = (t_FmVspEntry*)h_FmVsp;
708*852ba100SJustin Hibbits 
709*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(p_FmVspEntry, E_INVALID_HANDLE, NULL);
710*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(!p_FmVspEntry->p_FmVspEntryDriverParams, E_INVALID_STATE, NULL);
711*852ba100SJustin Hibbits 
712*852ba100SJustin Hibbits     if (p_FmVspEntry->bufferOffsets.pcdInfoOffset == ILLEGAL_BASE)
713*852ba100SJustin Hibbits         return NULL;
714*852ba100SJustin Hibbits 
715*852ba100SJustin Hibbits     return (uint8_t *)PTR_MOVE(p_Data, p_FmVspEntry->bufferOffsets.pcdInfoOffset);
716*852ba100SJustin Hibbits }
717*852ba100SJustin Hibbits 
FM_VSP_GetBufferPrsResult(t_Handle h_FmVsp,char * p_Data)718*852ba100SJustin Hibbits t_FmPrsResult * FM_VSP_GetBufferPrsResult(t_Handle h_FmVsp, char *p_Data)
719*852ba100SJustin Hibbits {
720*852ba100SJustin Hibbits     t_FmVspEntry *p_FmVspEntry = (t_FmVspEntry*)h_FmVsp;
721*852ba100SJustin Hibbits 
722*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(p_FmVspEntry, E_INVALID_HANDLE, NULL);
723*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(!p_FmVspEntry->p_FmVspEntryDriverParams, E_INVALID_STATE, NULL);
724*852ba100SJustin Hibbits 
725*852ba100SJustin Hibbits     if (p_FmVspEntry->bufferOffsets.prsResultOffset == ILLEGAL_BASE)
726*852ba100SJustin Hibbits         return NULL;
727*852ba100SJustin Hibbits 
728*852ba100SJustin Hibbits     return (t_FmPrsResult *)PTR_MOVE(p_Data, p_FmVspEntry->bufferOffsets.prsResultOffset);
729*852ba100SJustin Hibbits }
730*852ba100SJustin Hibbits 
FM_VSP_GetBufferTimeStamp(t_Handle h_FmVsp,char * p_Data)731*852ba100SJustin Hibbits uint64_t * FM_VSP_GetBufferTimeStamp(t_Handle h_FmVsp, char *p_Data)
732*852ba100SJustin Hibbits {
733*852ba100SJustin Hibbits     t_FmVspEntry *p_FmVspEntry = (t_FmVspEntry*)h_FmVsp;
734*852ba100SJustin Hibbits 
735*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(p_FmVspEntry, E_INVALID_HANDLE, NULL);
736*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(!p_FmVspEntry->p_FmVspEntryDriverParams, E_INVALID_STATE, NULL);
737*852ba100SJustin Hibbits 
738*852ba100SJustin Hibbits     if (p_FmVspEntry->bufferOffsets.timeStampOffset == ILLEGAL_BASE)
739*852ba100SJustin Hibbits         return NULL;
740*852ba100SJustin Hibbits 
741*852ba100SJustin Hibbits     return (uint64_t *)PTR_MOVE(p_Data, p_FmVspEntry->bufferOffsets.timeStampOffset);
742*852ba100SJustin Hibbits }
743*852ba100SJustin Hibbits 
FM_VSP_GetBufferHashResult(t_Handle h_FmVsp,char * p_Data)744*852ba100SJustin Hibbits uint8_t * FM_VSP_GetBufferHashResult(t_Handle h_FmVsp, char *p_Data)
745*852ba100SJustin Hibbits {
746*852ba100SJustin Hibbits     t_FmVspEntry *p_FmVspEntry = (t_FmVspEntry*)h_FmVsp;
747*852ba100SJustin Hibbits 
748*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(p_FmVspEntry, E_INVALID_HANDLE, NULL);
749*852ba100SJustin Hibbits     SANITY_CHECK_RETURN_VALUE(!p_FmVspEntry->p_FmVspEntryDriverParams, E_INVALID_STATE, NULL);
750*852ba100SJustin Hibbits 
751*852ba100SJustin Hibbits     if (p_FmVspEntry->bufferOffsets.hashResultOffset == ILLEGAL_BASE)
752*852ba100SJustin Hibbits         return NULL;
753*852ba100SJustin Hibbits 
754*852ba100SJustin Hibbits     return (uint8_t *)PTR_MOVE(p_Data, p_FmVspEntry->bufferOffsets.hashResultOffset);
755*852ba100SJustin Hibbits }
756*852ba100SJustin Hibbits 
757*852ba100SJustin Hibbits #endif /* (DPAA_VERSION >= 11) */
758