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