xref: /dpdk/drivers/compress/qat/dev/qat_comp_pmd_gen4.c (revision 2e98e808b99d9893aba4d64754f381b4cb0715ea)
12d148597SFan Zhang /* SPDX-License-Identifier: BSD-3-Clause
22d148597SFan Zhang  * Copyright(c) 2021 Intel Corporation
32d148597SFan Zhang  */
42d148597SFan Zhang 
52d148597SFan Zhang #include "qat_comp.h"
62d148597SFan Zhang #include "qat_comp_pmd.h"
72d148597SFan Zhang #include "qat_comp_pmd_gens.h"
82d148597SFan Zhang #include "icp_qat_hw_gen4_comp.h"
92d148597SFan Zhang #include "icp_qat_hw_gen4_comp_defs.h"
102d148597SFan Zhang 
112d148597SFan Zhang #define QAT_NUM_INTERM_BUFS_GEN4 0
122d148597SFan Zhang 
132d148597SFan Zhang static const struct rte_compressdev_capabilities
142d148597SFan Zhang qat_gen4_comp_capabilities[] = {
152d148597SFan Zhang 	{/* COMPRESSION - deflate */
162d148597SFan Zhang 	 .algo = RTE_COMP_ALGO_DEFLATE,
172d148597SFan Zhang 	 .comp_feature_flags = RTE_COMP_FF_MULTI_PKT_CHECKSUM |
182d148597SFan Zhang 				RTE_COMP_FF_CRC32_CHECKSUM |
192d148597SFan Zhang 				RTE_COMP_FF_ADLER32_CHECKSUM |
202d148597SFan Zhang 				RTE_COMP_FF_CRC32_ADLER32_CHECKSUM |
212d148597SFan Zhang 				RTE_COMP_FF_SHAREABLE_PRIV_XFORM |
222d148597SFan Zhang 				RTE_COMP_FF_HUFFMAN_FIXED |
232d148597SFan Zhang 				RTE_COMP_FF_HUFFMAN_DYNAMIC |
242d148597SFan Zhang 				RTE_COMP_FF_OOP_SGL_IN_SGL_OUT |
252d148597SFan Zhang 				RTE_COMP_FF_OOP_SGL_IN_LB_OUT |
262d148597SFan Zhang 				RTE_COMP_FF_OOP_LB_IN_SGL_OUT,
272d148597SFan Zhang 	 .window_size = {.min = 15, .max = 15, .increment = 0} },
2833b84a2eSMichael Baum 	 RTE_COMP_END_OF_CAPABILITIES_LIST() };
292d148597SFan Zhang 
3059cda512SCiara Power int
qat_comp_dev_config_gen4(struct rte_compressdev * dev,struct rte_compressdev_config * config)312d148597SFan Zhang qat_comp_dev_config_gen4(struct rte_compressdev *dev,
322d148597SFan Zhang 		struct rte_compressdev_config *config)
332d148597SFan Zhang {
342d148597SFan Zhang 	/* QAT GEN4 doesn't need preallocated intermediate buffers */
352d148597SFan Zhang 
362d148597SFan Zhang 	return qat_comp_dev_config(dev, config);
372d148597SFan Zhang }
382d148597SFan Zhang 
392d148597SFan Zhang static struct rte_compressdev_ops qat_comp_ops_gen4 = {
402d148597SFan Zhang 
412d148597SFan Zhang 	/* Device related operations */
422d148597SFan Zhang 	.dev_configure		= qat_comp_dev_config_gen4,
432d148597SFan Zhang 	.dev_start		= qat_comp_dev_start,
442d148597SFan Zhang 	.dev_stop		= qat_comp_dev_stop,
452d148597SFan Zhang 	.dev_close		= qat_comp_dev_close,
462d148597SFan Zhang 	.dev_infos_get		= qat_comp_dev_info_get,
472d148597SFan Zhang 
482d148597SFan Zhang 	.stats_get		= qat_comp_stats_get,
492d148597SFan Zhang 	.stats_reset		= qat_comp_stats_reset,
502d148597SFan Zhang 	.queue_pair_setup	= qat_comp_qp_setup,
512d148597SFan Zhang 	.queue_pair_release	= qat_comp_qp_release,
522d148597SFan Zhang 
532d148597SFan Zhang 	/* Compression related operations */
542d148597SFan Zhang 	.private_xform_create	= qat_comp_private_xform_create,
552d148597SFan Zhang 	.private_xform_free	= qat_comp_private_xform_free,
562d148597SFan Zhang 	.stream_create		= qat_comp_stream_create,
572d148597SFan Zhang 	.stream_free		= qat_comp_stream_free
582d148597SFan Zhang };
592d148597SFan Zhang 
602d148597SFan Zhang static struct qat_comp_capabilities_info
qat_comp_cap_get_gen4(struct qat_pci_device * qat_dev __rte_unused)612d148597SFan Zhang qat_comp_cap_get_gen4(struct qat_pci_device *qat_dev __rte_unused)
622d148597SFan Zhang {
632d148597SFan Zhang 	struct qat_comp_capabilities_info capa_info = {
642d148597SFan Zhang 		.data = qat_gen4_comp_capabilities,
652d148597SFan Zhang 		.size = sizeof(qat_gen4_comp_capabilities)
662d148597SFan Zhang 	};
672d148597SFan Zhang 	return capa_info;
682d148597SFan Zhang }
692d148597SFan Zhang 
7059cda512SCiara Power uint16_t
qat_comp_get_ram_bank_flags_gen4(void)712d148597SFan Zhang qat_comp_get_ram_bank_flags_gen4(void)
722d148597SFan Zhang {
732d148597SFan Zhang 	return 0;
742d148597SFan Zhang }
752d148597SFan Zhang 
7659cda512SCiara Power int
qat_comp_set_slice_cfg_word_gen4(struct qat_comp_xform * qat_xform,const struct rte_comp_xform * xform,enum rte_comp_op_type op_type,uint32_t * comp_slice_cfg_word)772d148597SFan Zhang qat_comp_set_slice_cfg_word_gen4(struct qat_comp_xform *qat_xform,
782d148597SFan Zhang 		const struct rte_comp_xform *xform,
792d148597SFan Zhang 		enum rte_comp_op_type op_type, uint32_t *comp_slice_cfg_word)
802d148597SFan Zhang {
812d148597SFan Zhang 	if (qat_xform->qat_comp_request_type ==
822d148597SFan Zhang 			QAT_COMP_REQUEST_FIXED_COMP_STATELESS ||
832d148597SFan Zhang 	    qat_xform->qat_comp_request_type ==
842d148597SFan Zhang 			QAT_COMP_REQUEST_DYNAMIC_COMP_STATELESS) {
852d148597SFan Zhang 		/* Compression */
862d148597SFan Zhang 		struct icp_qat_hw_comp_20_config_csr_upper hw_comp_upper_csr;
872d148597SFan Zhang 		struct icp_qat_hw_comp_20_config_csr_lower hw_comp_lower_csr;
882d148597SFan Zhang 
892d148597SFan Zhang 		memset(&hw_comp_upper_csr, 0, sizeof(hw_comp_upper_csr));
902d148597SFan Zhang 		memset(&hw_comp_lower_csr, 0, sizeof(hw_comp_lower_csr));
912d148597SFan Zhang 
922d148597SFan Zhang 		hw_comp_lower_csr.lllbd =
932d148597SFan Zhang 			ICP_QAT_HW_COMP_20_LLLBD_CTRL_LLLBD_DISABLED;
942d148597SFan Zhang 
952d148597SFan Zhang 		if (xform->compress.algo == RTE_COMP_ALGO_DEFLATE) {
962d148597SFan Zhang 			hw_comp_lower_csr.skip_ctrl =
972d148597SFan Zhang 				ICP_QAT_HW_COMP_20_BYTE_SKIP_3BYTE_LITERAL;
982d148597SFan Zhang 
992d148597SFan Zhang 			if (qat_xform->qat_comp_request_type ==
1002d148597SFan Zhang 				QAT_COMP_REQUEST_DYNAMIC_COMP_STATELESS) {
1012d148597SFan Zhang 				hw_comp_lower_csr.algo =
1022d148597SFan Zhang 					ICP_QAT_HW_COMP_20_HW_COMP_FORMAT_ILZ77;
1032d148597SFan Zhang 				hw_comp_lower_csr.lllbd =
1042d148597SFan Zhang 				    ICP_QAT_HW_COMP_20_LLLBD_CTRL_LLLBD_ENABLED;
1052d148597SFan Zhang 			} else {
1062d148597SFan Zhang 				hw_comp_lower_csr.algo =
1072d148597SFan Zhang 				      ICP_QAT_HW_COMP_20_HW_COMP_FORMAT_DEFLATE;
1082d148597SFan Zhang 				hw_comp_upper_csr.scb_ctrl =
1092d148597SFan Zhang 					ICP_QAT_HW_COMP_20_SCB_CONTROL_DISABLE;
1102d148597SFan Zhang 			}
1112d148597SFan Zhang 
1122d148597SFan Zhang 			if (op_type == RTE_COMP_OP_STATEFUL) {
1132d148597SFan Zhang 				hw_comp_upper_csr.som_ctrl =
1142d148597SFan Zhang 				     ICP_QAT_HW_COMP_20_SOM_CONTROL_REPLAY_MODE;
1152d148597SFan Zhang 			}
1162d148597SFan Zhang 		} else {
1172d148597SFan Zhang 			QAT_LOG(ERR, "Compression algorithm not supported");
1182d148597SFan Zhang 			return -EINVAL;
1192d148597SFan Zhang 		}
1202d148597SFan Zhang 
1212d148597SFan Zhang 		switch (xform->compress.level) {
1222d148597SFan Zhang 		case 1:
1232d148597SFan Zhang 		case 2:
1242d148597SFan Zhang 		case 3:
1252d148597SFan Zhang 		case 4:
1262d148597SFan Zhang 		case 5:
1272d148597SFan Zhang 			hw_comp_lower_csr.sd =
1282d148597SFan Zhang 					ICP_QAT_HW_COMP_20_SEARCH_DEPTH_LEVEL_1;
1292d148597SFan Zhang 			hw_comp_lower_csr.hash_col =
1302d148597SFan Zhang 			      ICP_QAT_HW_COMP_20_SKIP_HASH_COLLISION_DONT_ALLOW;
1312d148597SFan Zhang 			break;
1322d148597SFan Zhang 		case 6:
1332d148597SFan Zhang 		case 7:
1342d148597SFan Zhang 		case 8:
1352d148597SFan Zhang 		case RTE_COMP_LEVEL_PMD_DEFAULT:
1362d148597SFan Zhang 			hw_comp_lower_csr.sd =
1372d148597SFan Zhang 					ICP_QAT_HW_COMP_20_SEARCH_DEPTH_LEVEL_6;
1382d148597SFan Zhang 			break;
1392d148597SFan Zhang 		case 9:
1402d148597SFan Zhang 		case 10:
1412d148597SFan Zhang 		case 11:
1422d148597SFan Zhang 		case 12:
1432d148597SFan Zhang 			hw_comp_lower_csr.sd =
1442d148597SFan Zhang 					ICP_QAT_HW_COMP_20_SEARCH_DEPTH_LEVEL_9;
1452d148597SFan Zhang 			break;
1462d148597SFan Zhang 		default:
1472d148597SFan Zhang 			QAT_LOG(ERR, "Compression level not supported");
1482d148597SFan Zhang 			return -EINVAL;
1492d148597SFan Zhang 		}
1502d148597SFan Zhang 
1512d148597SFan Zhang 		hw_comp_lower_csr.abd = ICP_QAT_HW_COMP_20_ABD_ABD_DISABLED;
1522d148597SFan Zhang 		hw_comp_lower_csr.hash_update =
1532d148597SFan Zhang 			ICP_QAT_HW_COMP_20_SKIP_HASH_UPDATE_DONT_ALLOW;
1542d148597SFan Zhang 		hw_comp_lower_csr.edmm =
1552d148597SFan Zhang 		      ICP_QAT_HW_COMP_20_EXTENDED_DELAY_MATCH_MODE_EDMM_ENABLED;
1562d148597SFan Zhang 
1572d148597SFan Zhang 		hw_comp_upper_csr.nice =
1582d148597SFan Zhang 			ICP_QAT_HW_COMP_20_CONFIG_CSR_NICE_PARAM_DEFAULT_VAL;
1592d148597SFan Zhang 		hw_comp_upper_csr.lazy =
1602d148597SFan Zhang 			ICP_QAT_HW_COMP_20_CONFIG_CSR_LAZY_PARAM_DEFAULT_VAL;
1612d148597SFan Zhang 
1622d148597SFan Zhang 		comp_slice_cfg_word[0] =
1632d148597SFan Zhang 				ICP_QAT_FW_COMP_20_BUILD_CONFIG_LOWER(
1642d148597SFan Zhang 					hw_comp_lower_csr);
1652d148597SFan Zhang 		comp_slice_cfg_word[1] =
1662d148597SFan Zhang 				ICP_QAT_FW_COMP_20_BUILD_CONFIG_UPPER(
1672d148597SFan Zhang 					hw_comp_upper_csr);
1682d148597SFan Zhang 	} else {
1692d148597SFan Zhang 		/* Decompression */
1702d148597SFan Zhang 		struct icp_qat_hw_decomp_20_config_csr_lower
1712d148597SFan Zhang 				hw_decomp_lower_csr;
1722d148597SFan Zhang 
1732d148597SFan Zhang 		memset(&hw_decomp_lower_csr, 0, sizeof(hw_decomp_lower_csr));
1742d148597SFan Zhang 
1752d148597SFan Zhang 		if (xform->compress.algo == RTE_COMP_ALGO_DEFLATE)
1762d148597SFan Zhang 			hw_decomp_lower_csr.algo =
1772d148597SFan Zhang 				ICP_QAT_HW_DECOMP_20_HW_DECOMP_FORMAT_DEFLATE;
1782d148597SFan Zhang 		else {
1792d148597SFan Zhang 			QAT_LOG(ERR, "Compression algorithm not supported");
1802d148597SFan Zhang 			return -EINVAL;
1812d148597SFan Zhang 		}
1822d148597SFan Zhang 
1832d148597SFan Zhang 		comp_slice_cfg_word[0] =
1842d148597SFan Zhang 				ICP_QAT_FW_DECOMP_20_BUILD_CONFIG_LOWER(
1852d148597SFan Zhang 					hw_decomp_lower_csr);
1862d148597SFan Zhang 		comp_slice_cfg_word[1] = 0;
1872d148597SFan Zhang 	}
1882d148597SFan Zhang 
1892d148597SFan Zhang 	return 0;
1902d148597SFan Zhang }
1912d148597SFan Zhang 
19259cda512SCiara Power unsigned int
qat_comp_get_num_im_bufs_required_gen4(void)1932d148597SFan Zhang qat_comp_get_num_im_bufs_required_gen4(void)
1942d148597SFan Zhang {
1952d148597SFan Zhang 	return QAT_NUM_INTERM_BUFS_GEN4;
1962d148597SFan Zhang }
1972d148597SFan Zhang 
1982d148597SFan Zhang 
RTE_INIT(qat_comp_pmd_gen4_init)1992d148597SFan Zhang RTE_INIT(qat_comp_pmd_gen4_init)
2002d148597SFan Zhang {
201*2e98e808SArkadiusz Kusztal 	qat_comp_gen_dev_ops[QAT_VQAT].compressdev_ops =
2022d148597SFan Zhang 		qat_comp_gen_dev_ops[QAT_GEN4].compressdev_ops =
2032d148597SFan Zhang 			&qat_comp_ops_gen4;
204*2e98e808SArkadiusz Kusztal 	qat_comp_gen_dev_ops[QAT_VQAT].qat_comp_get_capabilities =
2052d148597SFan Zhang 		qat_comp_gen_dev_ops[QAT_GEN4].qat_comp_get_capabilities =
2062d148597SFan Zhang 			qat_comp_cap_get_gen4;
207*2e98e808SArkadiusz Kusztal 	qat_comp_gen_dev_ops[QAT_VQAT].qat_comp_get_num_im_bufs_required =
2082d148597SFan Zhang 		qat_comp_gen_dev_ops[QAT_GEN4].qat_comp_get_num_im_bufs_required =
2092d148597SFan Zhang 			qat_comp_get_num_im_bufs_required_gen4;
210*2e98e808SArkadiusz Kusztal 	qat_comp_gen_dev_ops[QAT_VQAT].qat_comp_get_ram_bank_flags =
2112d148597SFan Zhang 		qat_comp_gen_dev_ops[QAT_GEN4].qat_comp_get_ram_bank_flags =
2122d148597SFan Zhang 			qat_comp_get_ram_bank_flags_gen4;
213*2e98e808SArkadiusz Kusztal 	qat_comp_gen_dev_ops[QAT_VQAT].qat_comp_set_slice_cfg_word =
2142d148597SFan Zhang 		qat_comp_gen_dev_ops[QAT_GEN4].qat_comp_set_slice_cfg_word =
2152d148597SFan Zhang 			qat_comp_set_slice_cfg_word_gen4;
216*2e98e808SArkadiusz Kusztal 	qat_comp_gen_dev_ops[QAT_VQAT].qat_comp_get_feature_flags =
2172d148597SFan Zhang 		qat_comp_gen_dev_ops[QAT_GEN4].qat_comp_get_feature_flags =
2182d148597SFan Zhang 			qat_comp_get_features_gen1;
2192d148597SFan Zhang }
220