xref: /dpdk/drivers/compress/qat/dev/qat_comp_pmd_gen1.c (revision 33b84a2efca7ac188def108ba8b981daa7572b9a)
12d148597SFan Zhang /* SPDX-License-Identifier: BSD-3-Clause
22d148597SFan Zhang  * Copyright(c) 2021 Intel Corporation
32d148597SFan Zhang  */
42d148597SFan Zhang 
52d148597SFan Zhang #include <rte_compressdev.h>
62d148597SFan Zhang #include <rte_compressdev_pmd.h>
72d148597SFan Zhang 
82d148597SFan Zhang #include "qat_comp_pmd.h"
92d148597SFan Zhang #include "qat_comp.h"
102d148597SFan Zhang #include "qat_comp_pmd_gens.h"
112d148597SFan Zhang 
122d148597SFan Zhang #define QAT_NUM_INTERM_BUFS_GEN1 12
132d148597SFan Zhang 
142d148597SFan Zhang const struct rte_compressdev_capabilities qat_gen1_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 				RTE_COMP_FF_STATEFUL_DECOMPRESSION,
282d148597SFan Zhang 	 .window_size = {.min = 15, .max = 15, .increment = 0} },
29*33b84a2eSMichael Baum 	 RTE_COMP_END_OF_CAPABILITIES_LIST() };
302d148597SFan Zhang 
312d148597SFan Zhang static int
qat_comp_dev_config_gen1(struct rte_compressdev * dev,struct rte_compressdev_config * config)322d148597SFan Zhang qat_comp_dev_config_gen1(struct rte_compressdev *dev,
332d148597SFan Zhang 		struct rte_compressdev_config *config)
342d148597SFan Zhang {
352d148597SFan Zhang 	struct qat_comp_dev_private *comp_dev = dev->data->dev_private;
362d148597SFan Zhang 
372d148597SFan Zhang 	if (RTE_PMD_QAT_COMP_IM_BUFFER_SIZE == 0) {
382d148597SFan Zhang 		QAT_LOG(WARNING,
392d148597SFan Zhang 			"RTE_PMD_QAT_COMP_IM_BUFFER_SIZE = 0 in config file, so"
402d148597SFan Zhang 			" QAT device can't be used for Dynamic Deflate.");
412d148597SFan Zhang 	} else {
422d148597SFan Zhang 		comp_dev->interm_buff_mz =
432d148597SFan Zhang 				qat_comp_setup_inter_buffers(comp_dev,
442d148597SFan Zhang 					RTE_PMD_QAT_COMP_IM_BUFFER_SIZE);
452d148597SFan Zhang 		if (comp_dev->interm_buff_mz == NULL)
462d148597SFan Zhang 			return -ENOMEM;
472d148597SFan Zhang 	}
482d148597SFan Zhang 
492d148597SFan Zhang 	return qat_comp_dev_config(dev, config);
502d148597SFan Zhang }
512d148597SFan Zhang 
522d148597SFan Zhang struct rte_compressdev_ops qat_comp_ops_gen1 = {
532d148597SFan Zhang 
542d148597SFan Zhang 	/* Device related operations */
552d148597SFan Zhang 	.dev_configure		= qat_comp_dev_config_gen1,
562d148597SFan Zhang 	.dev_start		= qat_comp_dev_start,
572d148597SFan Zhang 	.dev_stop		= qat_comp_dev_stop,
582d148597SFan Zhang 	.dev_close		= qat_comp_dev_close,
592d148597SFan Zhang 	.dev_infos_get		= qat_comp_dev_info_get,
602d148597SFan Zhang 
612d148597SFan Zhang 	.stats_get		= qat_comp_stats_get,
622d148597SFan Zhang 	.stats_reset		= qat_comp_stats_reset,
632d148597SFan Zhang 	.queue_pair_setup	= qat_comp_qp_setup,
642d148597SFan Zhang 	.queue_pair_release	= qat_comp_qp_release,
652d148597SFan Zhang 
662d148597SFan Zhang 	/* Compression related operations */
672d148597SFan Zhang 	.private_xform_create	= qat_comp_private_xform_create,
682d148597SFan Zhang 	.private_xform_free	= qat_comp_private_xform_free,
692d148597SFan Zhang 	.stream_create		= qat_comp_stream_create,
702d148597SFan Zhang 	.stream_free		= qat_comp_stream_free
712d148597SFan Zhang };
722d148597SFan Zhang 
732d148597SFan Zhang struct qat_comp_capabilities_info
qat_comp_cap_get_gen1(struct qat_pci_device * qat_dev __rte_unused)742d148597SFan Zhang qat_comp_cap_get_gen1(struct qat_pci_device *qat_dev __rte_unused)
752d148597SFan Zhang {
762d148597SFan Zhang 	struct qat_comp_capabilities_info capa_info = {
772d148597SFan Zhang 		.data = qat_gen1_comp_capabilities,
782d148597SFan Zhang 		.size = sizeof(qat_gen1_comp_capabilities)
792d148597SFan Zhang 	};
802d148597SFan Zhang 	return capa_info;
812d148597SFan Zhang }
822d148597SFan Zhang 
832d148597SFan Zhang uint16_t
qat_comp_get_ram_bank_flags_gen1(void)842d148597SFan Zhang qat_comp_get_ram_bank_flags_gen1(void)
852d148597SFan Zhang {
862d148597SFan Zhang 	/* Enable A, B, C, D, and E (CAMs). */
872d148597SFan Zhang 	return ICP_QAT_FW_COMP_RAM_FLAGS_BUILD(
882d148597SFan Zhang 			ICP_QAT_FW_COMP_BANK_DISABLED, /* Bank I */
892d148597SFan Zhang 			ICP_QAT_FW_COMP_BANK_DISABLED, /* Bank H */
902d148597SFan Zhang 			ICP_QAT_FW_COMP_BANK_DISABLED, /* Bank G */
912d148597SFan Zhang 			ICP_QAT_FW_COMP_BANK_DISABLED, /* Bank F */
922d148597SFan Zhang 			ICP_QAT_FW_COMP_BANK_ENABLED,  /* Bank E */
932d148597SFan Zhang 			ICP_QAT_FW_COMP_BANK_ENABLED,  /* Bank D */
942d148597SFan Zhang 			ICP_QAT_FW_COMP_BANK_ENABLED,  /* Bank C */
952d148597SFan Zhang 			ICP_QAT_FW_COMP_BANK_ENABLED,  /* Bank B */
962d148597SFan Zhang 			ICP_QAT_FW_COMP_BANK_ENABLED); /* Bank A */
972d148597SFan Zhang }
982d148597SFan Zhang 
992d148597SFan Zhang int
qat_comp_set_slice_cfg_word_gen1(struct qat_comp_xform * qat_xform,const struct rte_comp_xform * xform,__rte_unused enum rte_comp_op_type op_type,uint32_t * comp_slice_cfg_word)1002d148597SFan Zhang qat_comp_set_slice_cfg_word_gen1(struct qat_comp_xform *qat_xform,
1012d148597SFan Zhang 		const struct rte_comp_xform *xform,
1022d148597SFan Zhang 		__rte_unused enum rte_comp_op_type op_type,
1032d148597SFan Zhang 		uint32_t *comp_slice_cfg_word)
1042d148597SFan Zhang {
1052d148597SFan Zhang 	unsigned int algo, comp_level, direction;
1062d148597SFan Zhang 
1072d148597SFan Zhang 	if (xform->compress.algo == RTE_COMP_ALGO_DEFLATE)
1082d148597SFan Zhang 		algo = ICP_QAT_HW_COMPRESSION_ALGO_DEFLATE;
1092d148597SFan Zhang 	else {
1102d148597SFan Zhang 		QAT_LOG(ERR, "compression algorithm not supported");
1112d148597SFan Zhang 		return -EINVAL;
1122d148597SFan Zhang 	}
1132d148597SFan Zhang 
1142d148597SFan Zhang 	if (qat_xform->qat_comp_request_type == QAT_COMP_REQUEST_DECOMPRESS) {
1152d148597SFan Zhang 		direction = ICP_QAT_HW_COMPRESSION_DIR_DECOMPRESS;
1162d148597SFan Zhang 		comp_level = ICP_QAT_HW_COMPRESSION_DEPTH_8;
1172d148597SFan Zhang 	} else {
1182d148597SFan Zhang 		direction = ICP_QAT_HW_COMPRESSION_DIR_COMPRESS;
1192d148597SFan Zhang 
1202d148597SFan Zhang 		if (xform->compress.level == RTE_COMP_LEVEL_PMD_DEFAULT)
1212d148597SFan Zhang 			comp_level = ICP_QAT_HW_COMPRESSION_DEPTH_8;
1222d148597SFan Zhang 		else if (xform->compress.level == 1)
1232d148597SFan Zhang 			comp_level = ICP_QAT_HW_COMPRESSION_DEPTH_1;
1242d148597SFan Zhang 		else if (xform->compress.level == 2)
1252d148597SFan Zhang 			comp_level = ICP_QAT_HW_COMPRESSION_DEPTH_4;
1262d148597SFan Zhang 		else if (xform->compress.level == 3)
1272d148597SFan Zhang 			comp_level = ICP_QAT_HW_COMPRESSION_DEPTH_8;
1282d148597SFan Zhang 		else if (xform->compress.level >= 4 &&
1292d148597SFan Zhang 			 xform->compress.level <= 9)
1302d148597SFan Zhang 			comp_level = ICP_QAT_HW_COMPRESSION_DEPTH_16;
1312d148597SFan Zhang 		else {
1322d148597SFan Zhang 			QAT_LOG(ERR, "compression level not supported");
1332d148597SFan Zhang 			return -EINVAL;
1342d148597SFan Zhang 		}
1352d148597SFan Zhang 	}
1362d148597SFan Zhang 
1372d148597SFan Zhang 	comp_slice_cfg_word[0] =
1382d148597SFan Zhang 			ICP_QAT_HW_COMPRESSION_CONFIG_BUILD(
1392d148597SFan Zhang 				direction,
1402d148597SFan Zhang 				/* In CPM 1.6 only valid mode ! */
1412d148597SFan Zhang 				ICP_QAT_HW_COMPRESSION_DELAYED_MATCH_ENABLED,
1422d148597SFan Zhang 				algo,
1432d148597SFan Zhang 				/* Translate level to depth */
1442d148597SFan Zhang 				comp_level,
1452d148597SFan Zhang 				ICP_QAT_HW_COMPRESSION_FILE_TYPE_0);
1462d148597SFan Zhang 
1472d148597SFan Zhang 	return 0;
1482d148597SFan Zhang }
1492d148597SFan Zhang 
1502d148597SFan Zhang static unsigned int
qat_comp_get_num_im_bufs_required_gen1(void)1512d148597SFan Zhang qat_comp_get_num_im_bufs_required_gen1(void)
1522d148597SFan Zhang {
1532d148597SFan Zhang 	return QAT_NUM_INTERM_BUFS_GEN1;
1542d148597SFan Zhang }
1552d148597SFan Zhang 
1562d148597SFan Zhang uint64_t
qat_comp_get_features_gen1(void)1572d148597SFan Zhang qat_comp_get_features_gen1(void)
1582d148597SFan Zhang {
1592d148597SFan Zhang 	return RTE_COMPDEV_FF_HW_ACCELERATED;
1602d148597SFan Zhang }
1612d148597SFan Zhang 
RTE_INIT(qat_comp_pmd_gen1_init)1622d148597SFan Zhang RTE_INIT(qat_comp_pmd_gen1_init)
1632d148597SFan Zhang {
1642d148597SFan Zhang 	qat_comp_gen_dev_ops[QAT_GEN1].compressdev_ops =
1652d148597SFan Zhang 			&qat_comp_ops_gen1;
1662d148597SFan Zhang 	qat_comp_gen_dev_ops[QAT_GEN1].qat_comp_get_capabilities =
1672d148597SFan Zhang 			qat_comp_cap_get_gen1;
1682d148597SFan Zhang 	qat_comp_gen_dev_ops[QAT_GEN1].qat_comp_get_num_im_bufs_required =
1692d148597SFan Zhang 			qat_comp_get_num_im_bufs_required_gen1;
1702d148597SFan Zhang 	qat_comp_gen_dev_ops[QAT_GEN1].qat_comp_get_ram_bank_flags =
1712d148597SFan Zhang 			qat_comp_get_ram_bank_flags_gen1;
1722d148597SFan Zhang 	qat_comp_gen_dev_ops[QAT_GEN1].qat_comp_set_slice_cfg_word =
1732d148597SFan Zhang 			qat_comp_set_slice_cfg_word_gen1;
1742d148597SFan Zhang 	qat_comp_gen_dev_ops[QAT_GEN1].qat_comp_get_feature_flags =
1752d148597SFan Zhang 			qat_comp_get_features_gen1;
1762d148597SFan Zhang }
177