X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fbnxt%2Ftf_ulp%2Fulp_utils.h;h=e1b0e773f3a265bc5c7f0d8b64a3730e93240ffc;hb=1e5acc5be59bae297e75d4ba14ee2b625df40fa1;hp=c054a77a90ecf8a3702b8e6af7e5e30a61874b61;hpb=9238ac2a5cad854e67a35877e183a15d22e476bd;p=dpdk.git diff --git a/drivers/net/bnxt/tf_ulp/ulp_utils.h b/drivers/net/bnxt/tf_ulp/ulp_utils.h index c054a77a90..e1b0e773f3 100644 --- a/drivers/net/bnxt/tf_ulp/ulp_utils.h +++ b/drivers/net/bnxt/tf_ulp/ulp_utils.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause - * Copyright(c) 2014-2019 Broadcom + * Copyright(c) 2014-2021 Broadcom * All rights reserved. */ @@ -9,8 +9,11 @@ #include "bnxt.h" #include "ulp_template_db_enum.h" +#define ULP_BUFFER_ALIGN_8_BITS 8 #define ULP_BUFFER_ALIGN_8_BYTE 8 #define ULP_BUFFER_ALIGN_16_BYTE 16 +#define ULP_BUFFER_ALIGN_64_BYTE 64 +#define ULP_64B_IN_BYTES 8 /* * Macros for bitmap sets and gets @@ -53,12 +56,18 @@ /* Macro to convert bits to bytes with no round off*/ #define ULP_BITS_2_BYTE_NR(bits_x) ((bits_x) / 8) +/* Macro to round off to next multiple of 8*/ +#define ULP_BYTE_ROUND_OFF_8(x) (((x) + 7) & ~7) + +/* Macro to check bits are byte aligned */ +#define ULP_BITS_IS_BYTE_NOT_ALIGNED(x) ((x) % 8) + /* Macros to read the computed fields */ #define ULP_COMP_FLD_IDX_RD(params, idx) \ - rte_be_to_cpu_32((params)->comp_fld[(idx)]) + rte_be_to_cpu_64((params)->comp_fld[(idx)]) #define ULP_COMP_FLD_IDX_WR(params, idx, val) \ - ((params)->comp_fld[(idx)] = rte_cpu_to_be_32((val))) + ((params)->comp_fld[(idx)] = rte_cpu_to_be_64((uint64_t)(val))) /* * Making the blob statically sized to 128 bytes for now. * The blob must be initialized with ulp_blob_init prior to using. @@ -84,7 +93,7 @@ struct ulp_regfile_entry { }; struct ulp_regfile { - struct ulp_regfile_entry entry[BNXT_ULP_REGFILE_INDEX_LAST]; + struct ulp_regfile_entry entry[BNXT_ULP_RF_IDX_LAST]; }; /* @@ -108,7 +117,7 @@ ulp_regfile_init(struct ulp_regfile *regfile); */ uint32_t ulp_regfile_read(struct ulp_regfile *regfile, - enum bnxt_ulp_regfile_index field, + enum bnxt_ulp_rf_idx field, uint64_t *data); /* @@ -121,13 +130,45 @@ ulp_regfile_read(struct ulp_regfile *regfile, * data [in] The value is written into this variable. It is going to be in the * same byte order as it was written. * - * returns zero on error + * returns zero on success */ -uint32_t +int32_t ulp_regfile_write(struct ulp_regfile *regfile, - enum bnxt_ulp_regfile_index field, + enum bnxt_ulp_rf_idx field, uint64_t data); +/* + * Add data to the byte array in Little endian format. + * + * bs [in] The byte array where data is pushed + * + * pos [in] The offset where data is pushed + * + * len [in] The number of bits to be added to the data array. + * + * val [in] The data to be added to the data array. + * + * returns the number of bits pushed. + */ +uint32_t +ulp_bs_push_lsb(uint8_t *bs, uint16_t pos, uint8_t len, uint8_t *val); + +/* + * Add data to the byte array in Big endian format. + * + * bs [in] The byte array where data is pushed + * + * pos [in] The offset where data is pushed + * + * len [in] The number of bits to be added to the data array. + * + * val [in] The data to be added to the data array. + * + * returns the number of bits pushed. + */ +uint32_t +ulp_bs_push_msb(uint8_t *bs, uint16_t pos, uint8_t len, uint8_t *val); + /* * Initializes the blob structure for creating binary blob * @@ -163,6 +204,25 @@ ulp_blob_push(struct ulp_blob *blob, uint8_t *data, uint32_t datalen); +/* + * Insert data into the binary blob at the given offset. + * + * blob [in] The blob that data is added to. The blob must + * be initialized prior to pushing data. + * + * offset [in] The offset where the data needs to be inserted. + * + * data [in/out] A pointer to bytes to be added to the blob. + * + * datalen [in] The number of bits to be added to the blob. + * + * The offset of the data is updated after each push of data. + * NULL returned on error. + */ +uint32_t +ulp_blob_insert(struct ulp_blob *blob, uint32_t offset, + uint8_t *data, uint32_t datalen); + /* * Add data to the binary blob at the current offset. * @@ -212,7 +272,7 @@ ulp_blob_push_32(struct ulp_blob *blob, * The offset of the data is updated after each push of data. * NULL returned on error, pointer pushed value otherwise. */ -uint32_t +int32_t ulp_blob_push_encap(struct ulp_blob *blob, uint8_t *data, uint32_t datalen); @@ -231,6 +291,52 @@ uint8_t * ulp_blob_data_get(struct ulp_blob *blob, uint16_t *datalen); +/* + * Get the data length of the binary blob. + * + * blob [in] The blob's data len to be retrieved. + * + * returns length of the binary blob + */ +uint16_t +ulp_blob_data_len_get(struct ulp_blob *blob); + +/* + * Get data from the byte array in Little endian format. + * + * src [in] The byte array where data is extracted from + * + * dst [out] The byte array where data is pulled into + * + * size [in] The size of dst array in bytes + * + * offset [in] The offset where data is pulled + * + * len [in] The number of bits to be extracted from the data array + * + * returns None. + */ +void +ulp_bs_pull_lsb(uint8_t *src, uint8_t *dst, uint32_t size, + uint32_t offset, uint32_t len); + +/* + * Get data from the byte array in Big endian format. + * + * src [in] The byte array where data is extracted from + * + * dst [out] The byte array where data is pulled into + * + * offset [in] The offset where data is pulled + * + * len [in] The number of bits to be extracted from the data array + * + * returns None. + */ +void +ulp_bs_pull_msb(uint8_t *src, uint8_t *dst, + uint32_t offset, uint32_t len); + /* * Extract data from the binary blob using given offset. * @@ -262,6 +368,20 @@ int32_t ulp_blob_pad_push(struct ulp_blob *blob, uint32_t datalen); +/* + * Adds pad to an initialized blob at the current offset based on + * the alignment. + * + * blob [in] The blob that needs to be aligned + * + * align [in] Alignment in bits. + * + * returns the number of pad bits added, -1 on failure + */ +int32_t +ulp_blob_pad_align(struct ulp_blob *blob, + uint32_t align); + /* * Set the 64 bit swap start index of the binary blob. * @@ -289,11 +409,71 @@ ulp_blob_perform_encap_swap(struct ulp_blob *blob); * vice-versa. * * blob [in] The blob's data to be used for swap. + * chunk_size[in] the swap is done within the chunk in bytes * * returns void. */ void -ulp_blob_perform_byte_reverse(struct ulp_blob *blob); +ulp_blob_perform_byte_reverse(struct ulp_blob *blob, + uint32_t chunk_size); + +/* + * Perform the blob buffer 64 bit word swap. + * This api makes the first 4 bytes the last in + * a given 64 bit value and vice-versa. + * + * blob [in] The blob's data to be used for swap. + * + * returns void. + */ +void +ulp_blob_perform_64B_word_swap(struct ulp_blob *blob); + +/* + * Perform the blob buffer 64 bit byte swap. + * This api makes the first byte the last in + * a given 64 bit value and vice-versa. + * + * blob [in] The blob's data to be used for swap. + * + * returns void. + */ +void +ulp_blob_perform_64B_byte_swap(struct ulp_blob *blob); + +/* + * Perform the blob buffer merge. + * This api makes the src blob merged to the dst blob. + * The block size and pad size help in padding the dst blob + * + * dst [in] The destination blob, the blob to be merged. + * src [in] The src blob. + * block_size [in] The size of the block after which padding gets applied. + * pad [in] The size of the pad to be applied. + * + * returns 0 on success. + */ +int32_t +ulp_blob_block_merge(struct ulp_blob *dst, struct ulp_blob *src, + uint32_t block_size, uint32_t pad); + +/* + * Append bits from src blob to dst blob. + * Only works on BE blobs + * + * dst [in/out] The destination blob to append to + * + * src [in] The src blob to append from + * + * src_offset [in] The bit offset from src to start at + * + * src_len [in] The number of bits to append to dst + * + * returns 0 on success, non-zero on error + */ +int32_t +ulp_blob_append(struct ulp_blob *dst, struct ulp_blob *src, + uint16_t src_offset, uint16_t src_len); /* * Read data from the operand @@ -341,6 +521,9 @@ uint32_t ulp_bitmap_is_zero(uint8_t *bitmap, int32_t size); uint32_t ulp_bitmap_is_ones(uint8_t *bitmap, int32_t size); /* Function to check if bitmap is not zero. Return 1 on success */ -uint32_t ulp_bitmap_notzero(uint8_t *bitmap, int32_t size); +uint32_t ulp_bitmap_notzero(const uint8_t *bitmap, int32_t size); + +/* returns 0 if input is power of 2 */ +int32_t ulp_util_is_power_of_2(uint64_t x); #endif /* _ULP_UTILS_H_ */