xref: /dpdk/drivers/common/qat/qat_common.c (revision 99ab2806687b79112be6068e4203842a0cccd0b5)
198c4a35cSTomasz Jozwiak /* SPDX-License-Identifier: BSD-3-Clause
298c4a35cSTomasz Jozwiak  * Copyright(c) 2018 Intel Corporation
398c4a35cSTomasz Jozwiak  */
498c4a35cSTomasz Jozwiak 
598c4a35cSTomasz Jozwiak #include "qat_common.h"
698c4a35cSTomasz Jozwiak #include "qat_device.h"
798c4a35cSTomasz Jozwiak #include "qat_logs.h"
898c4a35cSTomasz Jozwiak 
9*99ab2806SArkadiusz Kusztal #define QAT_LEGACY_CAPA "qat_legacy_capa"
10*99ab2806SArkadiusz Kusztal 
11*99ab2806SArkadiusz Kusztal static const char *const arguments[] = {
12*99ab2806SArkadiusz Kusztal 	QAT_LEGACY_CAPA,
13*99ab2806SArkadiusz Kusztal 	NULL
14*99ab2806SArkadiusz Kusztal };
15*99ab2806SArkadiusz Kusztal 
16*99ab2806SArkadiusz Kusztal const char *const *qat_cmdline_defines[QAT_MAX_SERVICES + 1] = {
17*99ab2806SArkadiusz Kusztal 	[QAT_MAX_SERVICES] = arguments,
18*99ab2806SArkadiusz Kusztal };
19*99ab2806SArkadiusz Kusztal 
20f0f369a6SFan Zhang const char *
qat_service_get_str(enum qat_service_type type)21f0f369a6SFan Zhang qat_service_get_str(enum qat_service_type type)
22f0f369a6SFan Zhang {
23f0f369a6SFan Zhang 	switch (type) {
24f0f369a6SFan Zhang 	case QAT_SERVICE_SYMMETRIC:
25f0f369a6SFan Zhang 		return "sym";
26f0f369a6SFan Zhang 	case QAT_SERVICE_ASYMMETRIC:
27f0f369a6SFan Zhang 		return "asym";
28f0f369a6SFan Zhang 	case QAT_SERVICE_COMPRESSION:
29f0f369a6SFan Zhang 		return "comp";
30f0f369a6SFan Zhang 	default:
31f0f369a6SFan Zhang 		return "invalid";
32f0f369a6SFan Zhang 	}
33f0f369a6SFan Zhang }
34f0f369a6SFan Zhang 
3598c4a35cSTomasz Jozwiak int
qat_sgl_fill_array(struct rte_mbuf * buf,int64_t offset,void * list_in,uint32_t data_len,const uint16_t max_segs)36b30aa891STomasz Jozwiak qat_sgl_fill_array(struct rte_mbuf *buf, int64_t offset,
37944027acSFiona Trahe 		void *list_in, uint32_t data_len,
38944027acSFiona Trahe 		const uint16_t max_segs)
3998c4a35cSTomasz Jozwiak {
40b30aa891STomasz Jozwiak 	int res = -EINVAL;
41b30aa891STomasz Jozwiak 	uint32_t buf_len, nr;
42944027acSFiona Trahe 	struct qat_sgl *list = (struct qat_sgl *)list_in;
43944027acSFiona Trahe #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG
44944027acSFiona Trahe 	uint8_t *virt_addr[max_segs];
45944027acSFiona Trahe #endif
4698c4a35cSTomasz Jozwiak 
47b30aa891STomasz Jozwiak 	for (nr = buf_len = 0; buf &&  nr < max_segs; buf = buf->next)  {
48b30aa891STomasz Jozwiak 		if (offset >= rte_pktmbuf_data_len(buf)) {
49b30aa891STomasz Jozwiak 			offset -= rte_pktmbuf_data_len(buf);
50b30aa891STomasz Jozwiak 			continue;
5198c4a35cSTomasz Jozwiak 		}
5298c4a35cSTomasz Jozwiak 
53b30aa891STomasz Jozwiak 		list->buffers[nr].len = rte_pktmbuf_data_len(buf) - offset;
5498c4a35cSTomasz Jozwiak 		list->buffers[nr].resrvd = 0;
55b30aa891STomasz Jozwiak 		list->buffers[nr].addr = rte_pktmbuf_iova_offset(buf, offset);
56b30aa891STomasz Jozwiak 
57944027acSFiona Trahe #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG
58b30aa891STomasz Jozwiak 		virt_addr[nr] = rte_pktmbuf_mtod_offset(buf, uint8_t*, offset);
59944027acSFiona Trahe #endif
60b30aa891STomasz Jozwiak 		offset = 0;
6198c4a35cSTomasz Jozwiak 		buf_len += list->buffers[nr].len;
6298c4a35cSTomasz Jozwiak 
63944027acSFiona Trahe 		if (buf_len >= data_len) {
64b30aa891STomasz Jozwiak 			list->buffers[nr].len -= buf_len - data_len;
65b30aa891STomasz Jozwiak 			res = 0;
66b30aa891STomasz Jozwiak 			break;
6798c4a35cSTomasz Jozwiak 		}
6898c4a35cSTomasz Jozwiak 		++nr;
6998c4a35cSTomasz Jozwiak 	}
7098c4a35cSTomasz Jozwiak 
71b30aa891STomasz Jozwiak 	if (unlikely(res != 0)) {
72b30aa891STomasz Jozwiak 		if (nr == max_segs) {
73b30aa891STomasz Jozwiak 			QAT_DP_LOG(ERR, "Exceeded max segments in QAT SGL (%u)",
74b30aa891STomasz Jozwiak 				   max_segs);
75b30aa891STomasz Jozwiak 		} else {
76b30aa891STomasz Jozwiak 			QAT_DP_LOG(ERR, "Mbuf chain is too short");
77b30aa891STomasz Jozwiak 		}
78b30aa891STomasz Jozwiak 	} else {
79b30aa891STomasz Jozwiak 
80b30aa891STomasz Jozwiak 		list->num_bufs = ++nr;
81944027acSFiona Trahe #if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG
82944027acSFiona Trahe 		QAT_DP_LOG(INFO, "SGL with %d buffers:", list->num_bufs);
83b30aa891STomasz Jozwiak 		for (nr = 0; nr < list->num_bufs; nr++) {
84944027acSFiona Trahe 			QAT_DP_LOG(INFO,
85944027acSFiona Trahe 				"QAT SGL buf %d, len = %d, iova = 0x%012"PRIx64,
86b30aa891STomasz Jozwiak 				 nr, list->buffers[nr].len,
87b30aa891STomasz Jozwiak 				 list->buffers[nr].addr);
88944027acSFiona Trahe 			QAT_DP_HEXDUMP_LOG(DEBUG, "qat SGL",
89b30aa891STomasz Jozwiak 					   virt_addr[nr],
90b30aa891STomasz Jozwiak 					   list->buffers[nr].len);
91944027acSFiona Trahe 		}
92944027acSFiona Trahe #endif
93b30aa891STomasz Jozwiak 	}
94944027acSFiona Trahe 
95b30aa891STomasz Jozwiak 	return res;
9698c4a35cSTomasz Jozwiak }
9798c4a35cSTomasz Jozwiak 
qat_stats_get(struct qat_pci_device * dev,struct qat_common_stats * stats,enum qat_service_type service)9898c4a35cSTomasz Jozwiak void qat_stats_get(struct qat_pci_device *dev,
9998c4a35cSTomasz Jozwiak 		struct qat_common_stats *stats,
10098c4a35cSTomasz Jozwiak 		enum qat_service_type service)
10198c4a35cSTomasz Jozwiak {
10298c4a35cSTomasz Jozwiak 	int i;
10398c4a35cSTomasz Jozwiak 	struct qat_qp **qp;
10498c4a35cSTomasz Jozwiak 
10598c4a35cSTomasz Jozwiak 	if (stats == NULL || dev == NULL || service >= QAT_SERVICE_INVALID) {
10698c4a35cSTomasz Jozwiak 		QAT_LOG(ERR, "invalid param: stats %p, dev %p, service %d",
10798c4a35cSTomasz Jozwiak 				stats, dev, service);
10898c4a35cSTomasz Jozwiak 		return;
10998c4a35cSTomasz Jozwiak 	}
11098c4a35cSTomasz Jozwiak 
11198c4a35cSTomasz Jozwiak 	qp = dev->qps_in_use[service];
11298c4a35cSTomasz Jozwiak 	for (i = 0; i < ADF_MAX_QPS_ON_ANY_SERVICE; i++) {
11398c4a35cSTomasz Jozwiak 		if (qp[i] == NULL) {
11498c4a35cSTomasz Jozwiak 			QAT_LOG(DEBUG, "Service %d Uninitialised qp %d",
11598c4a35cSTomasz Jozwiak 					service, i);
11698c4a35cSTomasz Jozwiak 			continue;
11798c4a35cSTomasz Jozwiak 		}
11898c4a35cSTomasz Jozwiak 
11998c4a35cSTomasz Jozwiak 		stats->enqueued_count += qp[i]->stats.enqueued_count;
12098c4a35cSTomasz Jozwiak 		stats->dequeued_count += qp[i]->stats.dequeued_count;
12198c4a35cSTomasz Jozwiak 		stats->enqueue_err_count += qp[i]->stats.enqueue_err_count;
12298c4a35cSTomasz Jozwiak 		stats->dequeue_err_count += qp[i]->stats.dequeue_err_count;
12347c3f7a4SArek Kusztal 		stats->threshold_hit_count += qp[i]->stats.threshold_hit_count;
12447c3f7a4SArek Kusztal 		QAT_LOG(DEBUG, "Threshold was used for qp %d %"PRIu64" times",
12547c3f7a4SArek Kusztal 				i, stats->threshold_hit_count);
12698c4a35cSTomasz Jozwiak 	}
12798c4a35cSTomasz Jozwiak }
12898c4a35cSTomasz Jozwiak 
qat_stats_reset(struct qat_pci_device * dev,enum qat_service_type service)12998c4a35cSTomasz Jozwiak void qat_stats_reset(struct qat_pci_device *dev,
13098c4a35cSTomasz Jozwiak 		enum qat_service_type service)
13198c4a35cSTomasz Jozwiak {
13298c4a35cSTomasz Jozwiak 	int i;
13398c4a35cSTomasz Jozwiak 	struct qat_qp **qp;
13498c4a35cSTomasz Jozwiak 
13598c4a35cSTomasz Jozwiak 	if (dev == NULL || service >= QAT_SERVICE_INVALID) {
13698c4a35cSTomasz Jozwiak 		QAT_LOG(ERR, "invalid param: dev %p, service %d",
13798c4a35cSTomasz Jozwiak 				dev, service);
13898c4a35cSTomasz Jozwiak 		return;
13998c4a35cSTomasz Jozwiak 	}
14098c4a35cSTomasz Jozwiak 
14198c4a35cSTomasz Jozwiak 	qp = dev->qps_in_use[service];
14298c4a35cSTomasz Jozwiak 	for (i = 0; i < ADF_MAX_QPS_ON_ANY_SERVICE; i++) {
14398c4a35cSTomasz Jozwiak 		if (qp[i] == NULL) {
14498c4a35cSTomasz Jozwiak 			QAT_LOG(DEBUG, "Service %d Uninitialised qp %d",
14598c4a35cSTomasz Jozwiak 					service, i);
14698c4a35cSTomasz Jozwiak 			continue;
14798c4a35cSTomasz Jozwiak 		}
14898c4a35cSTomasz Jozwiak 		memset(&(qp[i]->stats), 0, sizeof(qp[i]->stats));
14998c4a35cSTomasz Jozwiak 	}
15098c4a35cSTomasz Jozwiak 
15198c4a35cSTomasz Jozwiak 	QAT_LOG(DEBUG, "QAT: %d stats cleared", service);
15298c4a35cSTomasz Jozwiak }
153