xref: /freebsd-src/sys/dev/qat/qat_api/common/compression/include/dc_datapath.h (revision 22cf89c938886d14f5796fc49f9f020c23ea8eaf)
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