xref: /f-stack/dpdk/drivers/net/bnxt/tf_ulp/ulp_utils.h (revision 2d9fd380)
1*2d9fd380Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*2d9fd380Sjfb8856606  * Copyright(c) 2014-2019 Broadcom
3*2d9fd380Sjfb8856606  * All rights reserved.
4*2d9fd380Sjfb8856606  */
5*2d9fd380Sjfb8856606 
6*2d9fd380Sjfb8856606 #ifndef _ULP_UTILS_H_
7*2d9fd380Sjfb8856606 #define _ULP_UTILS_H_
8*2d9fd380Sjfb8856606 
9*2d9fd380Sjfb8856606 #include "bnxt.h"
10*2d9fd380Sjfb8856606 #include "ulp_template_db_enum.h"
11*2d9fd380Sjfb8856606 
12*2d9fd380Sjfb8856606 #define ULP_BUFFER_ALIGN_8_BYTE		8
13*2d9fd380Sjfb8856606 #define ULP_BUFFER_ALIGN_16_BYTE	16
14*2d9fd380Sjfb8856606 #define ULP_BUFFER_ALIGN_64_BYTE	64
15*2d9fd380Sjfb8856606 #define ULP_64B_IN_BYTES		8
16*2d9fd380Sjfb8856606 /*
17*2d9fd380Sjfb8856606  * Macros for bitmap sets and gets
18*2d9fd380Sjfb8856606  * These macros can be used if the val are power of 2.
19*2d9fd380Sjfb8856606  */
20*2d9fd380Sjfb8856606 #define ULP_BITMAP_SET(bitmap, val)	((bitmap) |= (val))
21*2d9fd380Sjfb8856606 #define ULP_BITMAP_RESET(bitmap, val)	((bitmap) &= ~(val))
22*2d9fd380Sjfb8856606 #define ULP_BITMAP_ISSET(bitmap, val)	((bitmap) & (val))
23*2d9fd380Sjfb8856606 #define ULP_BITMAP_CMP(b1, b2)  memcmp(&(b1)->bits, \
24*2d9fd380Sjfb8856606 				&(b2)->bits, sizeof((b1)->bits))
25*2d9fd380Sjfb8856606 /*
26*2d9fd380Sjfb8856606  * Macros for bitmap sets and gets
27*2d9fd380Sjfb8856606  * These macros can be used if the val are not power of 2 and
28*2d9fd380Sjfb8856606  * are simple index values.
29*2d9fd380Sjfb8856606  */
30*2d9fd380Sjfb8856606 #define ULP_INDEX_BITMAP_SIZE	(sizeof(uint64_t) * 8)
31*2d9fd380Sjfb8856606 #define ULP_INDEX_BITMAP_CSET(i)	(1UL << \
32*2d9fd380Sjfb8856606 			((ULP_INDEX_BITMAP_SIZE - 1) - \
33*2d9fd380Sjfb8856606 			((i) % ULP_INDEX_BITMAP_SIZE)))
34*2d9fd380Sjfb8856606 
35*2d9fd380Sjfb8856606 #define ULP_INDEX_BITMAP_SET(b, i)	((b) |= \
36*2d9fd380Sjfb8856606 			(1UL << ((ULP_INDEX_BITMAP_SIZE - 1) - \
37*2d9fd380Sjfb8856606 			((i) % ULP_INDEX_BITMAP_SIZE))))
38*2d9fd380Sjfb8856606 
39*2d9fd380Sjfb8856606 #define ULP_INDEX_BITMAP_RESET(b, i)	((b) &= \
40*2d9fd380Sjfb8856606 			(~(1UL << ((ULP_INDEX_BITMAP_SIZE - 1) - \
41*2d9fd380Sjfb8856606 			((i) % ULP_INDEX_BITMAP_SIZE)))))
42*2d9fd380Sjfb8856606 
43*2d9fd380Sjfb8856606 #define ULP_INDEX_BITMAP_GET(b, i)		(((b) >> \
44*2d9fd380Sjfb8856606 			((ULP_INDEX_BITMAP_SIZE - 1) - \
45*2d9fd380Sjfb8856606 			((i) % ULP_INDEX_BITMAP_SIZE))) & 1)
46*2d9fd380Sjfb8856606 
47*2d9fd380Sjfb8856606 #define ULP_DEVICE_PARAMS_INDEX(tid, dev_id)	\
48*2d9fd380Sjfb8856606 	(((tid) << BNXT_ULP_LOG2_MAX_NUM_DEV) | (dev_id))
49*2d9fd380Sjfb8856606 
50*2d9fd380Sjfb8856606 /* Macro to convert bytes to bits */
51*2d9fd380Sjfb8856606 #define ULP_BYTE_2_BITS(byte_x)		((byte_x) * 8)
52*2d9fd380Sjfb8856606 /* Macro to convert bits to bytes */
53*2d9fd380Sjfb8856606 #define ULP_BITS_2_BYTE(bits_x)		(((bits_x) + 7) / 8)
54*2d9fd380Sjfb8856606 /* Macro to convert bits to bytes with no round off*/
55*2d9fd380Sjfb8856606 #define ULP_BITS_2_BYTE_NR(bits_x)	((bits_x) / 8)
56*2d9fd380Sjfb8856606 
57*2d9fd380Sjfb8856606 /* Macro to round off to next multiple of 8*/
58*2d9fd380Sjfb8856606 #define ULP_BYTE_ROUND_OFF_8(x)	(((x) + 7) & ~7)
59*2d9fd380Sjfb8856606 
60*2d9fd380Sjfb8856606 /* Macro to check bits are byte aligned */
61*2d9fd380Sjfb8856606 #define ULP_BITS_IS_BYTE_NOT_ALIGNED(x)	((x) % 8)
62*2d9fd380Sjfb8856606 
63*2d9fd380Sjfb8856606 /* Macros to read the computed fields */
64*2d9fd380Sjfb8856606 #define ULP_COMP_FLD_IDX_RD(params, idx) \
65*2d9fd380Sjfb8856606 	rte_be_to_cpu_32((params)->comp_fld[(idx)])
66*2d9fd380Sjfb8856606 
67*2d9fd380Sjfb8856606 #define ULP_COMP_FLD_IDX_WR(params, idx, val)	\
68*2d9fd380Sjfb8856606 	((params)->comp_fld[(idx)] = rte_cpu_to_be_32((val)))
69*2d9fd380Sjfb8856606 /*
70*2d9fd380Sjfb8856606  * Making the blob statically sized to 128 bytes for now.
71*2d9fd380Sjfb8856606  * The blob must be initialized with ulp_blob_init prior to using.
72*2d9fd380Sjfb8856606  */
73*2d9fd380Sjfb8856606 #define BNXT_ULP_FLMP_BLOB_SIZE	(128)
74*2d9fd380Sjfb8856606 #define BNXT_ULP_FLMP_BLOB_SIZE_IN_BITS	ULP_BYTE_2_BITS(BNXT_ULP_FLMP_BLOB_SIZE)
75*2d9fd380Sjfb8856606 struct ulp_blob {
76*2d9fd380Sjfb8856606 	enum bnxt_ulp_byte_order	byte_order;
77*2d9fd380Sjfb8856606 	uint16_t			write_idx;
78*2d9fd380Sjfb8856606 	uint16_t			bitlen;
79*2d9fd380Sjfb8856606 	uint8_t				data[BNXT_ULP_FLMP_BLOB_SIZE];
80*2d9fd380Sjfb8856606 	uint16_t			encap_swap_idx;
81*2d9fd380Sjfb8856606 };
82*2d9fd380Sjfb8856606 
83*2d9fd380Sjfb8856606 /*
84*2d9fd380Sjfb8856606  * The data can likely be only 32 bits for now.  Just size check
85*2d9fd380Sjfb8856606  * the data when being written.
86*2d9fd380Sjfb8856606  */
87*2d9fd380Sjfb8856606 #define ULP_REGFILE_ENTRY_SIZE	(sizeof(uint32_t))
88*2d9fd380Sjfb8856606 struct ulp_regfile_entry {
89*2d9fd380Sjfb8856606 	uint64_t	data;
90*2d9fd380Sjfb8856606 	uint32_t	size;
91*2d9fd380Sjfb8856606 };
92*2d9fd380Sjfb8856606 
93*2d9fd380Sjfb8856606 struct ulp_regfile {
94*2d9fd380Sjfb8856606 	struct ulp_regfile_entry entry[BNXT_ULP_REGFILE_INDEX_LAST];
95*2d9fd380Sjfb8856606 };
96*2d9fd380Sjfb8856606 
97*2d9fd380Sjfb8856606 /*
98*2d9fd380Sjfb8856606  * Initialize the regfile structure for writing
99*2d9fd380Sjfb8856606  *
100*2d9fd380Sjfb8856606  * regfile [in] Ptr to a regfile instance
101*2d9fd380Sjfb8856606  *
102*2d9fd380Sjfb8856606  * returns 0 on error or 1 on success
103*2d9fd380Sjfb8856606  */
104*2d9fd380Sjfb8856606 uint32_t
105*2d9fd380Sjfb8856606 ulp_regfile_init(struct ulp_regfile *regfile);
106*2d9fd380Sjfb8856606 
107*2d9fd380Sjfb8856606 /*
108*2d9fd380Sjfb8856606  * Read a value from the regfile
109*2d9fd380Sjfb8856606  *
110*2d9fd380Sjfb8856606  * regfile [in] The regfile instance.  Must be initialized prior to being used
111*2d9fd380Sjfb8856606  *
112*2d9fd380Sjfb8856606  * field [in] The field to be read within the regfile.
113*2d9fd380Sjfb8856606  *
114*2d9fd380Sjfb8856606  * returns the byte array
115*2d9fd380Sjfb8856606  */
116*2d9fd380Sjfb8856606 uint32_t
117*2d9fd380Sjfb8856606 ulp_regfile_read(struct ulp_regfile *regfile,
118*2d9fd380Sjfb8856606 		 enum bnxt_ulp_regfile_index field,
119*2d9fd380Sjfb8856606 		 uint64_t *data);
120*2d9fd380Sjfb8856606 
121*2d9fd380Sjfb8856606 /*
122*2d9fd380Sjfb8856606  * Write a value to the regfile
123*2d9fd380Sjfb8856606  *
124*2d9fd380Sjfb8856606  * regfile [in] The regfile instance.  Must be initialized prior to being used
125*2d9fd380Sjfb8856606  *
126*2d9fd380Sjfb8856606  * field [in] The field to be written within the regfile.
127*2d9fd380Sjfb8856606  *
128*2d9fd380Sjfb8856606  * data [in] The value is written into this variable.  It is going to be in the
129*2d9fd380Sjfb8856606  * same byte order as it was written.
130*2d9fd380Sjfb8856606  *
131*2d9fd380Sjfb8856606  * returns zero on error
132*2d9fd380Sjfb8856606  */
133*2d9fd380Sjfb8856606 uint32_t
134*2d9fd380Sjfb8856606 ulp_regfile_write(struct ulp_regfile *regfile,
135*2d9fd380Sjfb8856606 		  enum bnxt_ulp_regfile_index field,
136*2d9fd380Sjfb8856606 		  uint64_t data);
137*2d9fd380Sjfb8856606 
138*2d9fd380Sjfb8856606 /*
139*2d9fd380Sjfb8856606  * Initializes the blob structure for creating binary blob
140*2d9fd380Sjfb8856606  *
141*2d9fd380Sjfb8856606  * blob [in] The blob to be initialized
142*2d9fd380Sjfb8856606  *
143*2d9fd380Sjfb8856606  * bitlen [in] The bit length of the blob
144*2d9fd380Sjfb8856606  *
145*2d9fd380Sjfb8856606  * order [in] The byte order for the blob.  Currently only supporting
146*2d9fd380Sjfb8856606  * big endian.  All fields are packed with this order.
147*2d9fd380Sjfb8856606  *
148*2d9fd380Sjfb8856606  * returns 0 on error or 1 on success
149*2d9fd380Sjfb8856606  */
150*2d9fd380Sjfb8856606 uint32_t
151*2d9fd380Sjfb8856606 ulp_blob_init(struct ulp_blob *blob,
152*2d9fd380Sjfb8856606 	      uint16_t bitlen,
153*2d9fd380Sjfb8856606 	      enum bnxt_ulp_byte_order order);
154*2d9fd380Sjfb8856606 
155*2d9fd380Sjfb8856606 /*
156*2d9fd380Sjfb8856606  * Add data to the binary blob at the current offset.
157*2d9fd380Sjfb8856606  *
158*2d9fd380Sjfb8856606  * blob [in] The blob that data is added to.  The blob must
159*2d9fd380Sjfb8856606  * be initialized prior to pushing data.
160*2d9fd380Sjfb8856606  *
161*2d9fd380Sjfb8856606  * data [in] A pointer to bytes to be added to the blob.
162*2d9fd380Sjfb8856606  *
163*2d9fd380Sjfb8856606  * datalen [in] The number of bits to be added to the blob.
164*2d9fd380Sjfb8856606  *
165*2d9fd380Sjfb8856606  * The offset of the data is updated after each push of data.
166*2d9fd380Sjfb8856606  * NULL returned on error.
167*2d9fd380Sjfb8856606  */
168*2d9fd380Sjfb8856606 uint32_t
169*2d9fd380Sjfb8856606 ulp_blob_push(struct ulp_blob *blob,
170*2d9fd380Sjfb8856606 	      uint8_t *data,
171*2d9fd380Sjfb8856606 	      uint32_t datalen);
172*2d9fd380Sjfb8856606 
173*2d9fd380Sjfb8856606 /*
174*2d9fd380Sjfb8856606  * Insert data into the binary blob at the given offset.
175*2d9fd380Sjfb8856606  *
176*2d9fd380Sjfb8856606  * blob [in] The blob that data is added to.  The blob must
177*2d9fd380Sjfb8856606  * be initialized prior to pushing data.
178*2d9fd380Sjfb8856606  *
179*2d9fd380Sjfb8856606  * offset [in] The offset where the data needs to be inserted.
180*2d9fd380Sjfb8856606  *
181*2d9fd380Sjfb8856606  * data [in/out] A pointer to bytes to be added to the blob.
182*2d9fd380Sjfb8856606  *
183*2d9fd380Sjfb8856606  * datalen [in] The number of bits to be added to the blob.
184*2d9fd380Sjfb8856606  *
185*2d9fd380Sjfb8856606  * The offset of the data is updated after each push of data.
186*2d9fd380Sjfb8856606  * NULL returned on error.
187*2d9fd380Sjfb8856606  */
188*2d9fd380Sjfb8856606 uint32_t
189*2d9fd380Sjfb8856606 ulp_blob_insert(struct ulp_blob *blob, uint32_t offset,
190*2d9fd380Sjfb8856606 		uint8_t *data, uint32_t datalen);
191*2d9fd380Sjfb8856606 
192*2d9fd380Sjfb8856606 /*
193*2d9fd380Sjfb8856606  * Add data to the binary blob at the current offset.
194*2d9fd380Sjfb8856606  *
195*2d9fd380Sjfb8856606  * blob [in] The blob that data is added to.  The blob must
196*2d9fd380Sjfb8856606  * be initialized prior to pushing data.
197*2d9fd380Sjfb8856606  *
198*2d9fd380Sjfb8856606  * data [in] 64-bit value to be added to the blob.
199*2d9fd380Sjfb8856606  *
200*2d9fd380Sjfb8856606  * datalen [in] The number of bits to be added to the blob.
201*2d9fd380Sjfb8856606  *
202*2d9fd380Sjfb8856606  * The offset of the data is updated after each push of data.
203*2d9fd380Sjfb8856606  * NULL returned on error, ptr to pushed data otherwise
204*2d9fd380Sjfb8856606  */
205*2d9fd380Sjfb8856606 uint8_t *
206*2d9fd380Sjfb8856606 ulp_blob_push_64(struct ulp_blob *blob,
207*2d9fd380Sjfb8856606 		 uint64_t *data,
208*2d9fd380Sjfb8856606 		 uint32_t datalen);
209*2d9fd380Sjfb8856606 
210*2d9fd380Sjfb8856606 /*
211*2d9fd380Sjfb8856606  * Add data to the binary blob at the current offset.
212*2d9fd380Sjfb8856606  *
213*2d9fd380Sjfb8856606  * blob [in] The blob that data is added to.  The blob must
214*2d9fd380Sjfb8856606  * be initialized prior to pushing data.
215*2d9fd380Sjfb8856606  *
216*2d9fd380Sjfb8856606  * data [in] 32-bit value to be added to the blob.
217*2d9fd380Sjfb8856606  *
218*2d9fd380Sjfb8856606  * datalen [in] The number of bits to be added ot the blob.
219*2d9fd380Sjfb8856606  *
220*2d9fd380Sjfb8856606  * The offset of the data is updated after each push of data.
221*2d9fd380Sjfb8856606  * NULL returned on error, pointer pushed value otherwise.
222*2d9fd380Sjfb8856606  */
223*2d9fd380Sjfb8856606 uint8_t *
224*2d9fd380Sjfb8856606 ulp_blob_push_32(struct ulp_blob *blob,
225*2d9fd380Sjfb8856606 		 uint32_t *data,
226*2d9fd380Sjfb8856606 		 uint32_t datalen);
227*2d9fd380Sjfb8856606 
228*2d9fd380Sjfb8856606 /*
229*2d9fd380Sjfb8856606  * Add encap data to the binary blob at the current offset.
230*2d9fd380Sjfb8856606  *
231*2d9fd380Sjfb8856606  * blob [in] The blob that data is added to.  The blob must
232*2d9fd380Sjfb8856606  * be initialized prior to pushing data.
233*2d9fd380Sjfb8856606  *
234*2d9fd380Sjfb8856606  * data [in] value to be added to the blob.
235*2d9fd380Sjfb8856606  *
236*2d9fd380Sjfb8856606  * datalen [in] The number of bits to be added to the blob.
237*2d9fd380Sjfb8856606  *
238*2d9fd380Sjfb8856606  * The offset of the data is updated after each push of data.
239*2d9fd380Sjfb8856606  * NULL returned on error, pointer pushed value otherwise.
240*2d9fd380Sjfb8856606  */
241*2d9fd380Sjfb8856606 uint32_t
242*2d9fd380Sjfb8856606 ulp_blob_push_encap(struct ulp_blob *blob,
243*2d9fd380Sjfb8856606 		    uint8_t *data,
244*2d9fd380Sjfb8856606 		    uint32_t datalen);
245*2d9fd380Sjfb8856606 
246*2d9fd380Sjfb8856606 /*
247*2d9fd380Sjfb8856606  * Get the data portion of the binary blob.
248*2d9fd380Sjfb8856606  *
249*2d9fd380Sjfb8856606  * blob [in] The blob's data to be retrieved. The blob must be
250*2d9fd380Sjfb8856606  * initialized prior to pushing data.
251*2d9fd380Sjfb8856606  *
252*2d9fd380Sjfb8856606  * datalen [out] The number of bits to that are filled.
253*2d9fd380Sjfb8856606  *
254*2d9fd380Sjfb8856606  * returns a byte array of the blob data.  Returns NULL on error.
255*2d9fd380Sjfb8856606  */
256*2d9fd380Sjfb8856606 uint8_t *
257*2d9fd380Sjfb8856606 ulp_blob_data_get(struct ulp_blob *blob,
258*2d9fd380Sjfb8856606 		  uint16_t *datalen);
259*2d9fd380Sjfb8856606 
260*2d9fd380Sjfb8856606 /*
261*2d9fd380Sjfb8856606  * Extract data from the binary blob using given offset.
262*2d9fd380Sjfb8856606  *
263*2d9fd380Sjfb8856606  * blob [in] The blob that data is extracted from. The blob must
264*2d9fd380Sjfb8856606  * be initialized prior to pulling data.
265*2d9fd380Sjfb8856606  *
266*2d9fd380Sjfb8856606  * data [in] A pointer to put the data.
267*2d9fd380Sjfb8856606  * data_size [in] size of the data buffer in bytes.
268*2d9fd380Sjfb8856606  *offset [in] - Offset in the blob to extract the data in bits format.
269*2d9fd380Sjfb8856606  * len [in] The number of bits to be pulled from the blob.
270*2d9fd380Sjfb8856606  *
271*2d9fd380Sjfb8856606  * Output: zero on success, -1 on failure
272*2d9fd380Sjfb8856606  */
273*2d9fd380Sjfb8856606 int32_t
274*2d9fd380Sjfb8856606 ulp_blob_pull(struct ulp_blob *blob, uint8_t *data, uint32_t data_size,
275*2d9fd380Sjfb8856606 	      uint16_t offset, uint16_t len);
276*2d9fd380Sjfb8856606 
277*2d9fd380Sjfb8856606 /*
278*2d9fd380Sjfb8856606  * Adds pad to an initialized blob at the current offset
279*2d9fd380Sjfb8856606  *
280*2d9fd380Sjfb8856606  * blob [in] The blob that data is added to.  The blob must
281*2d9fd380Sjfb8856606  * be initialized prior to pushing data.
282*2d9fd380Sjfb8856606  *
283*2d9fd380Sjfb8856606  * datalen [in] The number of bits of pad to add
284*2d9fd380Sjfb8856606  *
285*2d9fd380Sjfb8856606  * returns the number of pad bits added, -1 on failure
286*2d9fd380Sjfb8856606  */
287*2d9fd380Sjfb8856606 int32_t
288*2d9fd380Sjfb8856606 ulp_blob_pad_push(struct ulp_blob *blob,
289*2d9fd380Sjfb8856606 		  uint32_t datalen);
290*2d9fd380Sjfb8856606 
291*2d9fd380Sjfb8856606 /*
292*2d9fd380Sjfb8856606  * Set the 64 bit swap start index of the binary blob.
293*2d9fd380Sjfb8856606  *
294*2d9fd380Sjfb8856606  * blob [in] The blob's data to be retrieved. The blob must be
295*2d9fd380Sjfb8856606  * initialized prior to pushing data.
296*2d9fd380Sjfb8856606  *
297*2d9fd380Sjfb8856606  * returns void.
298*2d9fd380Sjfb8856606  */
299*2d9fd380Sjfb8856606 void
300*2d9fd380Sjfb8856606 ulp_blob_encap_swap_idx_set(struct ulp_blob *blob);
301*2d9fd380Sjfb8856606 
302*2d9fd380Sjfb8856606 /*
303*2d9fd380Sjfb8856606  * Perform the encap buffer swap to 64 bit reversal.
304*2d9fd380Sjfb8856606  *
305*2d9fd380Sjfb8856606  * blob [in] The blob's data to be used for swap.
306*2d9fd380Sjfb8856606  *
307*2d9fd380Sjfb8856606  * returns void.
308*2d9fd380Sjfb8856606  */
309*2d9fd380Sjfb8856606 void
310*2d9fd380Sjfb8856606 ulp_blob_perform_encap_swap(struct ulp_blob *blob);
311*2d9fd380Sjfb8856606 
312*2d9fd380Sjfb8856606 /*
313*2d9fd380Sjfb8856606  * Perform the blob buffer reversal byte wise.
314*2d9fd380Sjfb8856606  * This api makes the first byte the last and
315*2d9fd380Sjfb8856606  * vice-versa.
316*2d9fd380Sjfb8856606  *
317*2d9fd380Sjfb8856606  * blob [in] The blob's data to be used for swap.
318*2d9fd380Sjfb8856606  *
319*2d9fd380Sjfb8856606  * returns void.
320*2d9fd380Sjfb8856606  */
321*2d9fd380Sjfb8856606 void
322*2d9fd380Sjfb8856606 ulp_blob_perform_byte_reverse(struct ulp_blob *blob);
323*2d9fd380Sjfb8856606 
324*2d9fd380Sjfb8856606 /*
325*2d9fd380Sjfb8856606  * Perform the blob buffer 64 bit word swap.
326*2d9fd380Sjfb8856606  * This api makes the first 4 bytes the last in
327*2d9fd380Sjfb8856606  * a given 64 bit value and vice-versa.
328*2d9fd380Sjfb8856606  *
329*2d9fd380Sjfb8856606  * blob [in] The blob's data to be used for swap.
330*2d9fd380Sjfb8856606  *
331*2d9fd380Sjfb8856606  * returns void.
332*2d9fd380Sjfb8856606  */
333*2d9fd380Sjfb8856606 void
334*2d9fd380Sjfb8856606 ulp_blob_perform_64B_word_swap(struct ulp_blob *blob);
335*2d9fd380Sjfb8856606 
336*2d9fd380Sjfb8856606 /*
337*2d9fd380Sjfb8856606  * Perform the blob buffer 64 bit byte swap.
338*2d9fd380Sjfb8856606  * This api makes the first byte the last in
339*2d9fd380Sjfb8856606  * a given 64 bit value and vice-versa.
340*2d9fd380Sjfb8856606  *
341*2d9fd380Sjfb8856606  * blob [in] The blob's data to be used for swap.
342*2d9fd380Sjfb8856606  *
343*2d9fd380Sjfb8856606  * returns void.
344*2d9fd380Sjfb8856606  */
345*2d9fd380Sjfb8856606 void
346*2d9fd380Sjfb8856606 ulp_blob_perform_64B_byte_swap(struct ulp_blob *blob);
347*2d9fd380Sjfb8856606 
348*2d9fd380Sjfb8856606 /*
349*2d9fd380Sjfb8856606  * Read data from the operand
350*2d9fd380Sjfb8856606  *
351*2d9fd380Sjfb8856606  * operand [in] A pointer to a 16 Byte operand
352*2d9fd380Sjfb8856606  *
353*2d9fd380Sjfb8856606  * val [in/out] The variable to copy the operand to
354*2d9fd380Sjfb8856606  *
355*2d9fd380Sjfb8856606  * bitlen [in] The number of bits to read into val
356*2d9fd380Sjfb8856606  *
357*2d9fd380Sjfb8856606  * returns number of bits read, zero on error
358*2d9fd380Sjfb8856606  */
359*2d9fd380Sjfb8856606 uint16_t
360*2d9fd380Sjfb8856606 ulp_operand_read(uint8_t *operand,
361*2d9fd380Sjfb8856606 		 uint8_t *val,
362*2d9fd380Sjfb8856606 		 uint16_t bitlen);
363*2d9fd380Sjfb8856606 
364*2d9fd380Sjfb8856606 /*
365*2d9fd380Sjfb8856606  * copy the buffer in the encap format which is 2 bytes.
366*2d9fd380Sjfb8856606  * The MSB of the src is placed at the LSB of dst.
367*2d9fd380Sjfb8856606  *
368*2d9fd380Sjfb8856606  * dst [out] The destination buffer
369*2d9fd380Sjfb8856606  * src [in] The source buffer dst
370*2d9fd380Sjfb8856606  * size[in] size of the buffer.
371*2d9fd380Sjfb8856606  * align[in] The alignment is either 8 or 16.
372*2d9fd380Sjfb8856606  */
373*2d9fd380Sjfb8856606 void
374*2d9fd380Sjfb8856606 ulp_encap_buffer_copy(uint8_t *dst,
375*2d9fd380Sjfb8856606 		      const uint8_t *src,
376*2d9fd380Sjfb8856606 		      uint16_t size,
377*2d9fd380Sjfb8856606 		      uint16_t align);
378*2d9fd380Sjfb8856606 
379*2d9fd380Sjfb8856606 /*
380*2d9fd380Sjfb8856606  * Check the buffer is empty
381*2d9fd380Sjfb8856606  *
382*2d9fd380Sjfb8856606  * buf [in] The buffer
383*2d9fd380Sjfb8856606  * size [in] The size of the buffer
384*2d9fd380Sjfb8856606  */
385*2d9fd380Sjfb8856606 int32_t ulp_buffer_is_empty(const uint8_t *buf, uint32_t size);
386*2d9fd380Sjfb8856606 
387*2d9fd380Sjfb8856606 /* Function to check if bitmap is zero.Return 1 on success */
388*2d9fd380Sjfb8856606 uint32_t ulp_bitmap_is_zero(uint8_t *bitmap, int32_t size);
389*2d9fd380Sjfb8856606 
390*2d9fd380Sjfb8856606 /* Function to check if bitmap is ones. Return 1 on success */
391*2d9fd380Sjfb8856606 uint32_t ulp_bitmap_is_ones(uint8_t *bitmap, int32_t size);
392*2d9fd380Sjfb8856606 
393*2d9fd380Sjfb8856606 /* Function to check if bitmap is not zero. Return 1 on success */
394*2d9fd380Sjfb8856606 uint32_t ulp_bitmap_notzero(uint8_t *bitmap, int32_t size);
395*2d9fd380Sjfb8856606 
396*2d9fd380Sjfb8856606 #endif /* _ULP_UTILS_H_ */
397