178ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */ 278ee8d1cSJulian Grajkowski /* Copyright(c) 2007-2022 Intel Corporation */ 378ee8d1cSJulian Grajkowski /** 478ee8d1cSJulian Grajkowski ***************************************************************************** 578ee8d1cSJulian Grajkowski * @file dc_datapath.h 678ee8d1cSJulian Grajkowski * 778ee8d1cSJulian Grajkowski * @ingroup Dc_DataCompression 878ee8d1cSJulian Grajkowski * 978ee8d1cSJulian Grajkowski * @description 1078ee8d1cSJulian Grajkowski * Definition of the Data Compression datapath parameters. 1178ee8d1cSJulian Grajkowski * 1278ee8d1cSJulian Grajkowski ******************* 1378ee8d1cSJulian Grajkowski * **********************************************************/ 1478ee8d1cSJulian Grajkowski #ifndef DC_DATAPATH_H_ 1578ee8d1cSJulian Grajkowski #define DC_DATAPATH_H_ 1678ee8d1cSJulian Grajkowski 1778ee8d1cSJulian Grajkowski #define LAC_QAT_DC_REQ_SZ_LW 32 1878ee8d1cSJulian Grajkowski #define LAC_QAT_DC_RESP_SZ_LW 8 1978ee8d1cSJulian Grajkowski 2078ee8d1cSJulian Grajkowski /* Restriction on the source buffer size for compression due to the firmware 2178ee8d1cSJulian Grajkowski * processing */ 2278ee8d1cSJulian Grajkowski #define DC_SRC_BUFFER_MIN_SIZE (15) 2378ee8d1cSJulian Grajkowski 2478ee8d1cSJulian Grajkowski /* Restriction on the destination buffer size for compression due to 2578ee8d1cSJulian Grajkowski * the management of skid buffers in the firmware */ 2678ee8d1cSJulian Grajkowski #define DC_DEST_BUFFER_DYN_MIN_SIZE (128) 2778ee8d1cSJulian Grajkowski #define DC_DEST_BUFFER_STA_MIN_SIZE (64) 28a977168cSMichal Gulbicki #define DC_DEST_BUFFER_DYN_MIN_SIZE_GEN4 (512) 29a977168cSMichal Gulbicki #define DC_DEST_BUFFER_STA_MIN_SIZE_GEN4 (1024) 3078ee8d1cSJulian Grajkowski /* C62x and C3xxx pcie rev0 devices require an additional 32bytes */ 3178ee8d1cSJulian Grajkowski #define DC_DEST_BUFFER_STA_ADDITIONAL_SIZE (32) 3278ee8d1cSJulian Grajkowski 3378ee8d1cSJulian Grajkowski /* C4xxx device only requires 47 bytes */ 3478ee8d1cSJulian Grajkowski #define DC_DEST_BUFFER_MIN_SIZE (47) 3578ee8d1cSJulian Grajkowski 3678ee8d1cSJulian Grajkowski /* Minimum destination buffer size for decompression */ 3778ee8d1cSJulian Grajkowski #define DC_DEST_BUFFER_DEC_MIN_SIZE (1) 3878ee8d1cSJulian Grajkowski 3978ee8d1cSJulian Grajkowski /* Restriction on the source and destination buffer sizes for compression due 4078ee8d1cSJulian Grajkowski * to the firmware taking 32 bits parameters. The max size is 2^32-1 */ 4178ee8d1cSJulian Grajkowski #define DC_BUFFER_MAX_SIZE (0xFFFFFFFF) 4278ee8d1cSJulian Grajkowski 4378ee8d1cSJulian Grajkowski /* DC Source & Destination buffer type (FLAT/SGL) */ 4478ee8d1cSJulian Grajkowski #define DC_DEFAULT_QAT_PTR_TYPE QAT_COMN_PTR_TYPE_SGL 4578ee8d1cSJulian Grajkowski #define DC_DP_QAT_PTR_TYPE QAT_COMN_PTR_TYPE_FLAT 4678ee8d1cSJulian Grajkowski 4778ee8d1cSJulian Grajkowski /* Offset to first byte of Input Byte Counter (IBC) in state register */ 4878ee8d1cSJulian Grajkowski #define DC_STATE_IBC_OFFSET (8) 4978ee8d1cSJulian Grajkowski /* Size in bytes of input byte counter (IBC) in state register */ 5078ee8d1cSJulian Grajkowski #define DC_IBC_SIZE_IN_BYTES (4) 5178ee8d1cSJulian Grajkowski 5278ee8d1cSJulian Grajkowski /* Offset to first byte to CRC32 in state register */ 5378ee8d1cSJulian Grajkowski #define DC_STATE_CRC32_OFFSET (40) 5478ee8d1cSJulian Grajkowski /* Offset to first byte to output CRC32 in state register */ 5578ee8d1cSJulian Grajkowski #define DC_STATE_OUTPUT_CRC32_OFFSET (48) 5678ee8d1cSJulian Grajkowski /* Offset to first byte to input CRC32 in state register */ 5778ee8d1cSJulian Grajkowski #define DC_STATE_INPUT_CRC32_OFFSET (52) 5878ee8d1cSJulian Grajkowski 5978ee8d1cSJulian Grajkowski /* Offset to first byte of ADLER32 in state register */ 6078ee8d1cSJulian Grajkowski #define DC_STATE_ADLER32_OFFSET (48) 6178ee8d1cSJulian Grajkowski 6278ee8d1cSJulian Grajkowski /* 8 bit mask value */ 6378ee8d1cSJulian Grajkowski #define DC_8_BIT_MASK (0xff) 6478ee8d1cSJulian Grajkowski 6578ee8d1cSJulian Grajkowski /* 8 bit shift position */ 6678ee8d1cSJulian Grajkowski #define DC_8_BIT_SHIFT_POS (8) 6778ee8d1cSJulian Grajkowski 6878ee8d1cSJulian Grajkowski /* Size in bytes of checksum */ 6978ee8d1cSJulian Grajkowski #define DC_CHECKSUM_SIZE_IN_BYTES (4) 7078ee8d1cSJulian Grajkowski 7178ee8d1cSJulian Grajkowski /* Mask used to set the most significant bit to zero */ 7278ee8d1cSJulian Grajkowski #define DC_STATE_REGISTER_ZERO_MSB_MASK (0x7F) 7378ee8d1cSJulian Grajkowski 7478ee8d1cSJulian Grajkowski /* Mask used to keep only the most significant bit and set the others to zero */ 7578ee8d1cSJulian Grajkowski #define DC_STATE_REGISTER_KEEP_MSB_MASK (0x80) 7678ee8d1cSJulian Grajkowski 7778ee8d1cSJulian Grajkowski /* Compression state register word containing the parity bit */ 7878ee8d1cSJulian Grajkowski #define DC_STATE_REGISTER_PARITY_BIT_WORD (5) 7978ee8d1cSJulian Grajkowski 8078ee8d1cSJulian Grajkowski /* Location of the parity bit within the compression state register word */ 8178ee8d1cSJulian Grajkowski #define DC_STATE_REGISTER_PARITY_BIT (7) 8278ee8d1cSJulian Grajkowski 8378ee8d1cSJulian Grajkowski /* size which needs to be reserved before the results field to 8478ee8d1cSJulian Grajkowski * align the results field with the API struct */ 8578ee8d1cSJulian Grajkowski #define DC_API_ALIGNMENT_OFFSET (offsetof(CpaDcDpOpData, results)) 8678ee8d1cSJulian Grajkowski 8778ee8d1cSJulian Grajkowski /* Mask used to check the CompressAndVerify capability bit */ 8878ee8d1cSJulian Grajkowski #define DC_CNV_EXTENDED_CAPABILITY (0x01) 8978ee8d1cSJulian Grajkowski 9078ee8d1cSJulian Grajkowski /* Mask used to check the CompressAndVerifyAndRecover capability bit */ 9178ee8d1cSJulian Grajkowski #define DC_CNVNR_EXTENDED_CAPABILITY (0x100) 9278ee8d1cSJulian Grajkowski 9378ee8d1cSJulian Grajkowski /* Default values for CNV integrity checks, 9478ee8d1cSJulian Grajkowski * those are used to inform hardware of specifying CRC parameters to be used 9578ee8d1cSJulian Grajkowski * when calculating CRCs */ 9678ee8d1cSJulian Grajkowski #define DC_CRC_POLY_DEFAULT 0x04c11db7 97a977168cSMichal Gulbicki #define DC_CRC64_POLY_DEFAULT 0x42f0e1eba9ea3693ULL 9878ee8d1cSJulian Grajkowski #define DC_XOR_FLAGS_DEFAULT 0xe0000 9978ee8d1cSJulian Grajkowski #define DC_XOR_OUT_DEFAULT 0xffffffff 100a977168cSMichal Gulbicki #define DC_XOR64_OUT_DEFAULT 0x0ULL 10178ee8d1cSJulian Grajkowski #define DC_INVALID_CRC 0x0 10278ee8d1cSJulian Grajkowski 10378ee8d1cSJulian Grajkowski /** 10478ee8d1cSJulian Grajkowski ******************************************************************************* 10578ee8d1cSJulian Grajkowski * @ingroup cpaDc Data Compression 10678ee8d1cSJulian Grajkowski * Compression cookie 10778ee8d1cSJulian Grajkowski * @description 10878ee8d1cSJulian Grajkowski * This cookie stores information for a particular compression perform op. 10978ee8d1cSJulian Grajkowski * This includes various user-supplied parameters for the operation which 11078ee8d1cSJulian Grajkowski * will be needed in our callback function. 11178ee8d1cSJulian Grajkowski * A pointer to this cookie is stored in the opaque data field of the QAT 11278ee8d1cSJulian Grajkowski * message so that it can be accessed in the asynchronous callback. 11378ee8d1cSJulian Grajkowski * @note 11478ee8d1cSJulian Grajkowski * The order of the parameters within this structure is important. It needs 11578ee8d1cSJulian Grajkowski * to match the order of the parameters in CpaDcDpOpData up to the 11678ee8d1cSJulian Grajkowski * pSessionHandle. This allows the correct processing of the callback. 11778ee8d1cSJulian Grajkowski *****************************************************************************/ 11878ee8d1cSJulian Grajkowski typedef struct dc_compression_cookie_s { 11978ee8d1cSJulian Grajkowski Cpa8U dcReqParamsBuffer[DC_API_ALIGNMENT_OFFSET]; 12078ee8d1cSJulian Grajkowski /**< Memory block - was previously reserved for request parameters. 12178ee8d1cSJulian Grajkowski * Now size maintained so following members align with API struct, 12278ee8d1cSJulian Grajkowski * but no longer used for request parameters */ 12378ee8d1cSJulian Grajkowski CpaDcRqResults reserved; 12478ee8d1cSJulian Grajkowski /**< This is reserved for results to correctly align the structure 12578ee8d1cSJulian Grajkowski * to match the one from the data plane API */ 12678ee8d1cSJulian Grajkowski CpaInstanceHandle dcInstance; 12778ee8d1cSJulian Grajkowski /**< Compression instance handle */ 12878ee8d1cSJulian Grajkowski CpaDcSessionHandle pSessionHandle; 12978ee8d1cSJulian Grajkowski /**< Pointer to the session handle */ 13078ee8d1cSJulian Grajkowski icp_qat_fw_comp_req_t request; 13178ee8d1cSJulian Grajkowski /**< Compression request */ 13278ee8d1cSJulian Grajkowski void *callbackTag; 13378ee8d1cSJulian Grajkowski /**< Opaque data supplied by the client */ 13478ee8d1cSJulian Grajkowski dc_session_desc_t *pSessionDesc; 13578ee8d1cSJulian Grajkowski /**< Pointer to the session descriptor */ 13678ee8d1cSJulian Grajkowski CpaDcFlush flushFlag; 13778ee8d1cSJulian Grajkowski /**< Flush flag */ 13878ee8d1cSJulian Grajkowski CpaDcOpData *pDcOpData; 13978ee8d1cSJulian Grajkowski /**< struct containing flags and CRC related data for this session */ 14078ee8d1cSJulian Grajkowski CpaDcRqResults *pResults; 14178ee8d1cSJulian Grajkowski /**< Pointer to result buffer holding consumed and produced data */ 14278ee8d1cSJulian Grajkowski Cpa32U srcTotalDataLenInBytes; 14378ee8d1cSJulian Grajkowski /**< Total length of the source data */ 14478ee8d1cSJulian Grajkowski Cpa32U dstTotalDataLenInBytes; 14578ee8d1cSJulian Grajkowski /**< Total length of the destination data */ 14678ee8d1cSJulian Grajkowski dc_request_dir_t compDecomp; 14778ee8d1cSJulian Grajkowski /**< Used to know whether the request is compression or decompression. 14878ee8d1cSJulian Grajkowski * Useful when defining the session as combined */ 14978ee8d1cSJulian Grajkowski CpaBufferList *pUserSrcBuff; 15078ee8d1cSJulian Grajkowski /**< virtual userspace ptr to source SGL */ 15178ee8d1cSJulian Grajkowski CpaBufferList *pUserDestBuff; 15278ee8d1cSJulian Grajkowski /**< virtual userspace ptr to destination SGL */ 153a977168cSMichal Gulbicki CpaDcCallbackFn pCbFunc; 154a977168cSMichal Gulbicki /**< Callback function defined for the traditional sessionless API */ 155a977168cSMichal Gulbicki CpaDcChecksum checksumType; 156a977168cSMichal Gulbicki /**< Type of checksum */ 157a977168cSMichal Gulbicki dc_integrity_crc_fw_t dataIntegrityCrcs; 158a977168cSMichal Gulbicki /**< Data integrity table */ 159a977168cSMichal Gulbicki 16078ee8d1cSJulian Grajkowski } dc_compression_cookie_t; 16178ee8d1cSJulian Grajkowski 16278ee8d1cSJulian Grajkowski /** 16378ee8d1cSJulian Grajkowski ***************************************************************************** 16478ee8d1cSJulian Grajkowski * @ingroup Dc_DataCompression 16578ee8d1cSJulian Grajkowski * Callback function called for compression and decompression requests in 16678ee8d1cSJulian Grajkowski * asynchronous mode 16778ee8d1cSJulian Grajkowski * 16878ee8d1cSJulian Grajkowski * @description 16978ee8d1cSJulian Grajkowski * Called to process compression and decompression response messages. This 17078ee8d1cSJulian Grajkowski * callback will check for errors, update the statistics and will call the 17178ee8d1cSJulian Grajkowski * user callback 17278ee8d1cSJulian Grajkowski * 17378ee8d1cSJulian Grajkowski * @param[in] pRespMsg Response message 17478ee8d1cSJulian Grajkowski * 17578ee8d1cSJulian Grajkowski *****************************************************************************/ 17678ee8d1cSJulian Grajkowski void dcCompression_ProcessCallback(void *pRespMsg); 17778ee8d1cSJulian Grajkowski 178a977168cSMichal Gulbicki CpaStatus dcCheckOpData(sal_compression_service_t *pService, 179a977168cSMichal Gulbicki CpaDcOpData *pOpData); 180a977168cSMichal Gulbicki 18178ee8d1cSJulian Grajkowski /** 18278ee8d1cSJulian Grajkowski ***************************************************************************** 18378ee8d1cSJulian Grajkowski * @ingroup Dc_DataCompression 18478ee8d1cSJulian Grajkowski * Describes CNV and CNVNR modes 18578ee8d1cSJulian Grajkowski * 18678ee8d1cSJulian Grajkowski * @description 18778ee8d1cSJulian Grajkowski * This enum is used to indicate the CNV modes. 18878ee8d1cSJulian Grajkowski * 18978ee8d1cSJulian Grajkowski *****************************************************************************/ 19078ee8d1cSJulian Grajkowski typedef enum dc_cnv_mode_s { 19178ee8d1cSJulian Grajkowski DC_NO_CNV = 0, 19278ee8d1cSJulian Grajkowski /* CNV = FALSE, CNVNR = FALSE */ 19378ee8d1cSJulian Grajkowski DC_CNV, 19478ee8d1cSJulian Grajkowski /* CNV = TRUE, CNVNR = FALSE */ 19578ee8d1cSJulian Grajkowski DC_CNVNR, 19678ee8d1cSJulian Grajkowski /* CNV = TRUE, CNVNR = TRUE */ 19778ee8d1cSJulian Grajkowski } dc_cnv_mode_t; 19878ee8d1cSJulian Grajkowski 199*22cf89c9SPiotr Kasierski /* Type to access extended features bit fields */ 200*22cf89c9SPiotr Kasierski typedef struct dc_extended_features_s { 201*22cf89c9SPiotr Kasierski unsigned is_cnv : 1; /* Bit<0> */ 202*22cf89c9SPiotr Kasierski unsigned padding : 7; 203*22cf89c9SPiotr Kasierski unsigned is_cnvnr : 1; /* Bit<8> */ 204*22cf89c9SPiotr Kasierski unsigned reserved : 2; 205*22cf89c9SPiotr Kasierski unsigned is_part_read : 1; /* Bit<11> */ 206*22cf89c9SPiotr Kasierski unsigned is_zero_pad : 1; /* Bit<12> */ 207*22cf89c9SPiotr Kasierski unsigned not_used : 19; 208*22cf89c9SPiotr Kasierski } dc_extd_ftrs_t; 209*22cf89c9SPiotr Kasierski 21078ee8d1cSJulian Grajkowski #endif /* DC_DATAPATH_H_ */ 211