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