1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606  * Copyright(c) 2017-2018 Intel Corporation
3d30ea906Sjfb8856606  */
4d30ea906Sjfb8856606 
5d30ea906Sjfb8856606 #include <string.h>
6d30ea906Sjfb8856606 #include <stdarg.h>
7d30ea906Sjfb8856606 #include <stdio.h>
8d30ea906Sjfb8856606 #include <inttypes.h>
9d30ea906Sjfb8856606 
104418919fSjohnjiang #include <rte_string_fns.h>
11d30ea906Sjfb8856606 #include <rte_malloc.h>
12d30ea906Sjfb8856606 #include <rte_eal.h>
13d30ea906Sjfb8856606 #include <rte_memzone.h>
14d30ea906Sjfb8856606 
15d30ea906Sjfb8856606 #include "rte_compressdev.h"
16d30ea906Sjfb8856606 #include "rte_compressdev_internal.h"
17d30ea906Sjfb8856606 #include "rte_compressdev_pmd.h"
18d30ea906Sjfb8856606 
19d30ea906Sjfb8856606 #define RTE_COMPRESSDEV_DETACHED  (0)
20d30ea906Sjfb8856606 #define RTE_COMPRESSDEV_ATTACHED  (1)
21d30ea906Sjfb8856606 
22d30ea906Sjfb8856606 static struct rte_compressdev rte_comp_devices[RTE_COMPRESS_MAX_DEVS];
23d30ea906Sjfb8856606 
24d30ea906Sjfb8856606 static struct rte_compressdev_global compressdev_globals = {
25d30ea906Sjfb8856606 		.devs			= rte_comp_devices,
26d30ea906Sjfb8856606 		.data			= { NULL },
27d30ea906Sjfb8856606 		.nb_devs		= 0,
28d30ea906Sjfb8856606 		.max_devs		= RTE_COMPRESS_MAX_DEVS
29d30ea906Sjfb8856606 };
30d30ea906Sjfb8856606 
314418919fSjohnjiang const struct rte_compressdev_capabilities *
rte_compressdev_capability_get(uint8_t dev_id,enum rte_comp_algorithm algo)32d30ea906Sjfb8856606 rte_compressdev_capability_get(uint8_t dev_id,
33d30ea906Sjfb8856606 			enum rte_comp_algorithm algo)
34d30ea906Sjfb8856606 {
35d30ea906Sjfb8856606 	const struct rte_compressdev_capabilities *capability;
36d30ea906Sjfb8856606 	struct rte_compressdev_info dev_info;
37d30ea906Sjfb8856606 	int i = 0;
38d30ea906Sjfb8856606 
39d30ea906Sjfb8856606 	if (dev_id >= compressdev_globals.nb_devs) {
40d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR, "Invalid dev_id=%d", dev_id);
41d30ea906Sjfb8856606 		return NULL;
42d30ea906Sjfb8856606 	}
43d30ea906Sjfb8856606 	rte_compressdev_info_get(dev_id, &dev_info);
44d30ea906Sjfb8856606 
45d30ea906Sjfb8856606 	while ((capability = &dev_info.capabilities[i++])->algo !=
46d30ea906Sjfb8856606 			RTE_COMP_ALGO_UNSPECIFIED){
47d30ea906Sjfb8856606 		if (capability->algo == algo)
48d30ea906Sjfb8856606 			return capability;
49d30ea906Sjfb8856606 	}
50d30ea906Sjfb8856606 
51d30ea906Sjfb8856606 	return NULL;
52d30ea906Sjfb8856606 }
53d30ea906Sjfb8856606 
544418919fSjohnjiang const char *
rte_compressdev_get_feature_name(uint64_t flag)55d30ea906Sjfb8856606 rte_compressdev_get_feature_name(uint64_t flag)
56d30ea906Sjfb8856606 {
57d30ea906Sjfb8856606 	switch (flag) {
58d30ea906Sjfb8856606 	case RTE_COMPDEV_FF_HW_ACCELERATED:
59d30ea906Sjfb8856606 		return "HW_ACCELERATED";
60d30ea906Sjfb8856606 	case RTE_COMPDEV_FF_CPU_SSE:
61d30ea906Sjfb8856606 		return "CPU_SSE";
62d30ea906Sjfb8856606 	case RTE_COMPDEV_FF_CPU_AVX:
63d30ea906Sjfb8856606 		return "CPU_AVX";
64d30ea906Sjfb8856606 	case RTE_COMPDEV_FF_CPU_AVX2:
65d30ea906Sjfb8856606 		return "CPU_AVX2";
66d30ea906Sjfb8856606 	case RTE_COMPDEV_FF_CPU_AVX512:
67d30ea906Sjfb8856606 		return "CPU_AVX512";
68d30ea906Sjfb8856606 	case RTE_COMPDEV_FF_CPU_NEON:
69d30ea906Sjfb8856606 		return "CPU_NEON";
704418919fSjohnjiang 	case RTE_COMPDEV_FF_OP_DONE_IN_DEQUEUE:
714418919fSjohnjiang 		return "OP_DONE_IN_DEQ";
72d30ea906Sjfb8856606 	default:
73d30ea906Sjfb8856606 		return NULL;
74d30ea906Sjfb8856606 	}
75d30ea906Sjfb8856606 }
76d30ea906Sjfb8856606 
77d30ea906Sjfb8856606 static struct rte_compressdev *
rte_compressdev_get_dev(uint8_t dev_id)78d30ea906Sjfb8856606 rte_compressdev_get_dev(uint8_t dev_id)
79d30ea906Sjfb8856606 {
80d30ea906Sjfb8856606 	return &compressdev_globals.devs[dev_id];
81d30ea906Sjfb8856606 }
82d30ea906Sjfb8856606 
834418919fSjohnjiang struct rte_compressdev *
rte_compressdev_pmd_get_named_dev(const char * name)84d30ea906Sjfb8856606 rte_compressdev_pmd_get_named_dev(const char *name)
85d30ea906Sjfb8856606 {
86d30ea906Sjfb8856606 	struct rte_compressdev *dev;
87d30ea906Sjfb8856606 	unsigned int i;
88d30ea906Sjfb8856606 
89d30ea906Sjfb8856606 	if (name == NULL)
90d30ea906Sjfb8856606 		return NULL;
91d30ea906Sjfb8856606 
92d30ea906Sjfb8856606 	for (i = 0; i < compressdev_globals.max_devs; i++) {
93d30ea906Sjfb8856606 		dev = &compressdev_globals.devs[i];
94d30ea906Sjfb8856606 
95d30ea906Sjfb8856606 		if ((dev->attached == RTE_COMPRESSDEV_ATTACHED) &&
96d30ea906Sjfb8856606 				(strcmp(dev->data->name, name) == 0))
97d30ea906Sjfb8856606 			return dev;
98d30ea906Sjfb8856606 	}
99d30ea906Sjfb8856606 
100d30ea906Sjfb8856606 	return NULL;
101d30ea906Sjfb8856606 }
102d30ea906Sjfb8856606 
103d30ea906Sjfb8856606 static unsigned int
rte_compressdev_is_valid_dev(uint8_t dev_id)104d30ea906Sjfb8856606 rte_compressdev_is_valid_dev(uint8_t dev_id)
105d30ea906Sjfb8856606 {
106d30ea906Sjfb8856606 	struct rte_compressdev *dev = NULL;
107d30ea906Sjfb8856606 
108d30ea906Sjfb8856606 	if (dev_id >= compressdev_globals.nb_devs)
109d30ea906Sjfb8856606 		return 0;
110d30ea906Sjfb8856606 
111d30ea906Sjfb8856606 	dev = rte_compressdev_get_dev(dev_id);
112d30ea906Sjfb8856606 	if (dev->attached != RTE_COMPRESSDEV_ATTACHED)
113d30ea906Sjfb8856606 		return 0;
114d30ea906Sjfb8856606 	else
115d30ea906Sjfb8856606 		return 1;
116d30ea906Sjfb8856606 }
117d30ea906Sjfb8856606 
118d30ea906Sjfb8856606 
1194418919fSjohnjiang int
rte_compressdev_get_dev_id(const char * name)120d30ea906Sjfb8856606 rte_compressdev_get_dev_id(const char *name)
121d30ea906Sjfb8856606 {
122d30ea906Sjfb8856606 	unsigned int i;
123d30ea906Sjfb8856606 
124d30ea906Sjfb8856606 	if (name == NULL)
125d30ea906Sjfb8856606 		return -1;
126d30ea906Sjfb8856606 
127d30ea906Sjfb8856606 	for (i = 0; i < compressdev_globals.nb_devs; i++)
128d30ea906Sjfb8856606 		if ((strcmp(compressdev_globals.devs[i].data->name, name)
129d30ea906Sjfb8856606 				== 0) &&
130d30ea906Sjfb8856606 				(compressdev_globals.devs[i].attached ==
131d30ea906Sjfb8856606 						RTE_COMPRESSDEV_ATTACHED))
132d30ea906Sjfb8856606 			return i;
133d30ea906Sjfb8856606 
134d30ea906Sjfb8856606 	return -1;
135d30ea906Sjfb8856606 }
136d30ea906Sjfb8856606 
1374418919fSjohnjiang uint8_t
rte_compressdev_count(void)138d30ea906Sjfb8856606 rte_compressdev_count(void)
139d30ea906Sjfb8856606 {
140d30ea906Sjfb8856606 	return compressdev_globals.nb_devs;
141d30ea906Sjfb8856606 }
142d30ea906Sjfb8856606 
1434418919fSjohnjiang uint8_t
rte_compressdev_devices_get(const char * driver_name,uint8_t * devices,uint8_t nb_devices)144d30ea906Sjfb8856606 rte_compressdev_devices_get(const char *driver_name, uint8_t *devices,
145d30ea906Sjfb8856606 	uint8_t nb_devices)
146d30ea906Sjfb8856606 {
147d30ea906Sjfb8856606 	uint8_t i, count = 0;
148d30ea906Sjfb8856606 	struct rte_compressdev *devs = compressdev_globals.devs;
149d30ea906Sjfb8856606 	uint8_t max_devs = compressdev_globals.max_devs;
150d30ea906Sjfb8856606 
151d30ea906Sjfb8856606 	for (i = 0; i < max_devs && count < nb_devices;	i++) {
152d30ea906Sjfb8856606 
153d30ea906Sjfb8856606 		if (devs[i].attached == RTE_COMPRESSDEV_ATTACHED) {
154d30ea906Sjfb8856606 			int cmp;
155d30ea906Sjfb8856606 
156d30ea906Sjfb8856606 			cmp = strncmp(devs[i].device->driver->name,
157d30ea906Sjfb8856606 					driver_name,
158d30ea906Sjfb8856606 					strlen(driver_name));
159d30ea906Sjfb8856606 
160d30ea906Sjfb8856606 			if (cmp == 0)
161d30ea906Sjfb8856606 				devices[count++] = devs[i].data->dev_id;
162d30ea906Sjfb8856606 		}
163d30ea906Sjfb8856606 	}
164d30ea906Sjfb8856606 
165d30ea906Sjfb8856606 	return count;
166d30ea906Sjfb8856606 }
167d30ea906Sjfb8856606 
1684418919fSjohnjiang int
rte_compressdev_socket_id(uint8_t dev_id)169d30ea906Sjfb8856606 rte_compressdev_socket_id(uint8_t dev_id)
170d30ea906Sjfb8856606 {
171d30ea906Sjfb8856606 	struct rte_compressdev *dev;
172d30ea906Sjfb8856606 
173d30ea906Sjfb8856606 	if (!rte_compressdev_is_valid_dev(dev_id))
174d30ea906Sjfb8856606 		return -1;
175d30ea906Sjfb8856606 
176d30ea906Sjfb8856606 	dev = rte_compressdev_get_dev(dev_id);
177d30ea906Sjfb8856606 
178d30ea906Sjfb8856606 	return dev->data->socket_id;
179d30ea906Sjfb8856606 }
180d30ea906Sjfb8856606 
181d30ea906Sjfb8856606 static inline int
rte_compressdev_data_alloc(uint8_t dev_id,struct rte_compressdev_data ** data,int socket_id)182d30ea906Sjfb8856606 rte_compressdev_data_alloc(uint8_t dev_id, struct rte_compressdev_data **data,
183d30ea906Sjfb8856606 		int socket_id)
184d30ea906Sjfb8856606 {
185d30ea906Sjfb8856606 	char mz_name[RTE_COMPRESSDEV_NAME_MAX_LEN];
186d30ea906Sjfb8856606 	const struct rte_memzone *mz;
187d30ea906Sjfb8856606 	int n;
188d30ea906Sjfb8856606 
189d30ea906Sjfb8856606 	/* generate memzone name */
190d30ea906Sjfb8856606 	n = snprintf(mz_name, sizeof(mz_name),
191d30ea906Sjfb8856606 			"rte_compressdev_data_%u", dev_id);
192d30ea906Sjfb8856606 	if (n >= (int)sizeof(mz_name))
193d30ea906Sjfb8856606 		return -EINVAL;
194d30ea906Sjfb8856606 
195d30ea906Sjfb8856606 	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
196d30ea906Sjfb8856606 		mz = rte_memzone_reserve(mz_name,
197d30ea906Sjfb8856606 				sizeof(struct rte_compressdev_data),
198d30ea906Sjfb8856606 				socket_id, 0);
199d30ea906Sjfb8856606 	} else
200d30ea906Sjfb8856606 		mz = rte_memzone_lookup(mz_name);
201d30ea906Sjfb8856606 
202d30ea906Sjfb8856606 	if (mz == NULL)
203d30ea906Sjfb8856606 		return -ENOMEM;
204d30ea906Sjfb8856606 
205d30ea906Sjfb8856606 	*data = mz->addr;
206d30ea906Sjfb8856606 	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
207d30ea906Sjfb8856606 		memset(*data, 0, sizeof(struct rte_compressdev_data));
208d30ea906Sjfb8856606 
209d30ea906Sjfb8856606 	return 0;
210d30ea906Sjfb8856606 }
211d30ea906Sjfb8856606 
212d30ea906Sjfb8856606 static uint8_t
rte_compressdev_find_free_device_index(void)213d30ea906Sjfb8856606 rte_compressdev_find_free_device_index(void)
214d30ea906Sjfb8856606 {
215d30ea906Sjfb8856606 	uint8_t dev_id;
216d30ea906Sjfb8856606 
217d30ea906Sjfb8856606 	for (dev_id = 0; dev_id < RTE_COMPRESS_MAX_DEVS; dev_id++) {
218d30ea906Sjfb8856606 		if (rte_comp_devices[dev_id].attached ==
219d30ea906Sjfb8856606 				RTE_COMPRESSDEV_DETACHED)
220d30ea906Sjfb8856606 			return dev_id;
221d30ea906Sjfb8856606 	}
222d30ea906Sjfb8856606 	return RTE_COMPRESS_MAX_DEVS;
223d30ea906Sjfb8856606 }
224d30ea906Sjfb8856606 
2254418919fSjohnjiang struct rte_compressdev *
rte_compressdev_pmd_allocate(const char * name,int socket_id)226d30ea906Sjfb8856606 rte_compressdev_pmd_allocate(const char *name, int socket_id)
227d30ea906Sjfb8856606 {
228d30ea906Sjfb8856606 	struct rte_compressdev *compressdev;
229d30ea906Sjfb8856606 	uint8_t dev_id;
230d30ea906Sjfb8856606 
231d30ea906Sjfb8856606 	if (rte_compressdev_pmd_get_named_dev(name) != NULL) {
232d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR,
233d30ea906Sjfb8856606 			"comp device with name %s already allocated!", name);
234d30ea906Sjfb8856606 		return NULL;
235d30ea906Sjfb8856606 	}
236d30ea906Sjfb8856606 
237d30ea906Sjfb8856606 	dev_id = rte_compressdev_find_free_device_index();
238d30ea906Sjfb8856606 	if (dev_id == RTE_COMPRESS_MAX_DEVS) {
239d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR, "Reached maximum number of comp devices");
240d30ea906Sjfb8856606 		return NULL;
241d30ea906Sjfb8856606 	}
242d30ea906Sjfb8856606 	compressdev = rte_compressdev_get_dev(dev_id);
243d30ea906Sjfb8856606 
244d30ea906Sjfb8856606 	if (compressdev->data == NULL) {
245d30ea906Sjfb8856606 		struct rte_compressdev_data *compressdev_data =
246d30ea906Sjfb8856606 				compressdev_globals.data[dev_id];
247d30ea906Sjfb8856606 
248d30ea906Sjfb8856606 		int retval = rte_compressdev_data_alloc(dev_id,
249d30ea906Sjfb8856606 				&compressdev_data, socket_id);
250d30ea906Sjfb8856606 
251d30ea906Sjfb8856606 		if (retval < 0 || compressdev_data == NULL)
252d30ea906Sjfb8856606 			return NULL;
253d30ea906Sjfb8856606 
254d30ea906Sjfb8856606 		compressdev->data = compressdev_data;
255d30ea906Sjfb8856606 
2564418919fSjohnjiang 		strlcpy(compressdev->data->name, name,
2574418919fSjohnjiang 			RTE_COMPRESSDEV_NAME_MAX_LEN);
258d30ea906Sjfb8856606 
259d30ea906Sjfb8856606 		compressdev->data->dev_id = dev_id;
260d30ea906Sjfb8856606 		compressdev->data->socket_id = socket_id;
261d30ea906Sjfb8856606 		compressdev->data->dev_started = 0;
262d30ea906Sjfb8856606 
263d30ea906Sjfb8856606 		compressdev->attached = RTE_COMPRESSDEV_ATTACHED;
264d30ea906Sjfb8856606 
265d30ea906Sjfb8856606 		compressdev_globals.nb_devs++;
266d30ea906Sjfb8856606 	}
267d30ea906Sjfb8856606 
268d30ea906Sjfb8856606 	return compressdev;
269d30ea906Sjfb8856606 }
270d30ea906Sjfb8856606 
2714418919fSjohnjiang int
rte_compressdev_pmd_release_device(struct rte_compressdev * compressdev)272d30ea906Sjfb8856606 rte_compressdev_pmd_release_device(struct rte_compressdev *compressdev)
273d30ea906Sjfb8856606 {
274d30ea906Sjfb8856606 	int ret;
275d30ea906Sjfb8856606 
276d30ea906Sjfb8856606 	if (compressdev == NULL)
277d30ea906Sjfb8856606 		return -EINVAL;
278d30ea906Sjfb8856606 
279d30ea906Sjfb8856606 	/* Close device only if device operations have been set */
280d30ea906Sjfb8856606 	if (compressdev->dev_ops) {
281d30ea906Sjfb8856606 		ret = rte_compressdev_close(compressdev->data->dev_id);
282d30ea906Sjfb8856606 		if (ret < 0)
283d30ea906Sjfb8856606 			return ret;
284d30ea906Sjfb8856606 	}
285d30ea906Sjfb8856606 
286d30ea906Sjfb8856606 	compressdev->attached = RTE_COMPRESSDEV_DETACHED;
287d30ea906Sjfb8856606 	compressdev_globals.nb_devs--;
288d30ea906Sjfb8856606 	return 0;
289d30ea906Sjfb8856606 }
290d30ea906Sjfb8856606 
2914418919fSjohnjiang uint16_t
rte_compressdev_queue_pair_count(uint8_t dev_id)292d30ea906Sjfb8856606 rte_compressdev_queue_pair_count(uint8_t dev_id)
293d30ea906Sjfb8856606 {
294d30ea906Sjfb8856606 	struct rte_compressdev *dev;
295d30ea906Sjfb8856606 
296d30ea906Sjfb8856606 	dev = &rte_comp_devices[dev_id];
297d30ea906Sjfb8856606 	return dev->data->nb_queue_pairs;
298d30ea906Sjfb8856606 }
299d30ea906Sjfb8856606 
300d30ea906Sjfb8856606 static int
rte_compressdev_queue_pairs_config(struct rte_compressdev * dev,uint16_t nb_qpairs,int socket_id)301d30ea906Sjfb8856606 rte_compressdev_queue_pairs_config(struct rte_compressdev *dev,
302d30ea906Sjfb8856606 		uint16_t nb_qpairs, int socket_id)
303d30ea906Sjfb8856606 {
304d30ea906Sjfb8856606 	struct rte_compressdev_info dev_info;
305d30ea906Sjfb8856606 	void **qp;
306d30ea906Sjfb8856606 	unsigned int i;
307d30ea906Sjfb8856606 
308d30ea906Sjfb8856606 	if ((dev == NULL) || (nb_qpairs < 1)) {
309d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR, "invalid param: dev %p, nb_queues %u",
310d30ea906Sjfb8856606 							dev, nb_qpairs);
311d30ea906Sjfb8856606 		return -EINVAL;
312d30ea906Sjfb8856606 	}
313d30ea906Sjfb8856606 
314d30ea906Sjfb8856606 	COMPRESSDEV_LOG(DEBUG, "Setup %d queues pairs on device %u",
315d30ea906Sjfb8856606 			nb_qpairs, dev->data->dev_id);
316d30ea906Sjfb8856606 
317d30ea906Sjfb8856606 	memset(&dev_info, 0, sizeof(struct rte_compressdev_info));
318d30ea906Sjfb8856606 
319d30ea906Sjfb8856606 	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_infos_get, -ENOTSUP);
320d30ea906Sjfb8856606 	(*dev->dev_ops->dev_infos_get)(dev, &dev_info);
321d30ea906Sjfb8856606 
322d30ea906Sjfb8856606 	if ((dev_info.max_nb_queue_pairs != 0) &&
323d30ea906Sjfb8856606 			(nb_qpairs > dev_info.max_nb_queue_pairs)) {
324d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR, "Invalid num queue_pairs (%u) for dev %u",
325d30ea906Sjfb8856606 				nb_qpairs, dev->data->dev_id);
326d30ea906Sjfb8856606 		return -EINVAL;
327d30ea906Sjfb8856606 	}
328d30ea906Sjfb8856606 
329d30ea906Sjfb8856606 	if (dev->data->queue_pairs == NULL) { /* first time configuration */
330d30ea906Sjfb8856606 		dev->data->queue_pairs = rte_zmalloc_socket(
331d30ea906Sjfb8856606 				"compressdev->queue_pairs",
332d30ea906Sjfb8856606 				sizeof(dev->data->queue_pairs[0]) * nb_qpairs,
333d30ea906Sjfb8856606 				RTE_CACHE_LINE_SIZE, socket_id);
334d30ea906Sjfb8856606 
335d30ea906Sjfb8856606 		if (dev->data->queue_pairs == NULL) {
336d30ea906Sjfb8856606 			dev->data->nb_queue_pairs = 0;
337d30ea906Sjfb8856606 			COMPRESSDEV_LOG(ERR,
338d30ea906Sjfb8856606 			"failed to get memory for qp meta data, nb_queues %u",
339d30ea906Sjfb8856606 							nb_qpairs);
340d30ea906Sjfb8856606 			return -(ENOMEM);
341d30ea906Sjfb8856606 		}
342d30ea906Sjfb8856606 	} else { /* re-configure */
343d30ea906Sjfb8856606 		int ret;
344d30ea906Sjfb8856606 		uint16_t old_nb_queues = dev->data->nb_queue_pairs;
345d30ea906Sjfb8856606 
346d30ea906Sjfb8856606 		qp = dev->data->queue_pairs;
347d30ea906Sjfb8856606 
348d30ea906Sjfb8856606 		RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->queue_pair_release,
349d30ea906Sjfb8856606 				-ENOTSUP);
350d30ea906Sjfb8856606 
351d30ea906Sjfb8856606 		for (i = nb_qpairs; i < old_nb_queues; i++) {
352d30ea906Sjfb8856606 			ret = (*dev->dev_ops->queue_pair_release)(dev, i);
353d30ea906Sjfb8856606 			if (ret < 0)
354d30ea906Sjfb8856606 				return ret;
355d30ea906Sjfb8856606 		}
356d30ea906Sjfb8856606 
357d30ea906Sjfb8856606 		qp = rte_realloc(qp, sizeof(qp[0]) * nb_qpairs,
358d30ea906Sjfb8856606 				RTE_CACHE_LINE_SIZE);
359d30ea906Sjfb8856606 		if (qp == NULL) {
360d30ea906Sjfb8856606 			COMPRESSDEV_LOG(ERR,
361d30ea906Sjfb8856606 			"failed to realloc qp meta data, nb_queues %u",
362d30ea906Sjfb8856606 						nb_qpairs);
363d30ea906Sjfb8856606 			return -(ENOMEM);
364d30ea906Sjfb8856606 		}
365d30ea906Sjfb8856606 
366d30ea906Sjfb8856606 		if (nb_qpairs > old_nb_queues) {
367d30ea906Sjfb8856606 			uint16_t new_qs = nb_qpairs - old_nb_queues;
368d30ea906Sjfb8856606 
369d30ea906Sjfb8856606 			memset(qp + old_nb_queues, 0,
370d30ea906Sjfb8856606 				sizeof(qp[0]) * new_qs);
371d30ea906Sjfb8856606 		}
372d30ea906Sjfb8856606 
373d30ea906Sjfb8856606 		dev->data->queue_pairs = qp;
374d30ea906Sjfb8856606 
375d30ea906Sjfb8856606 	}
376d30ea906Sjfb8856606 	dev->data->nb_queue_pairs = nb_qpairs;
377d30ea906Sjfb8856606 	return 0;
378d30ea906Sjfb8856606 }
379d30ea906Sjfb8856606 
380d30ea906Sjfb8856606 static int
rte_compressdev_queue_pairs_release(struct rte_compressdev * dev)381d30ea906Sjfb8856606 rte_compressdev_queue_pairs_release(struct rte_compressdev *dev)
382d30ea906Sjfb8856606 {
383d30ea906Sjfb8856606 	uint16_t num_qps, i;
384d30ea906Sjfb8856606 	int ret;
385d30ea906Sjfb8856606 
386d30ea906Sjfb8856606 	if (dev == NULL) {
387d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR, "invalid param: dev %p", dev);
388d30ea906Sjfb8856606 		return -EINVAL;
389d30ea906Sjfb8856606 	}
390d30ea906Sjfb8856606 
391d30ea906Sjfb8856606 	num_qps = dev->data->nb_queue_pairs;
392d30ea906Sjfb8856606 
393d30ea906Sjfb8856606 	if (num_qps == 0)
394d30ea906Sjfb8856606 		return 0;
395d30ea906Sjfb8856606 
396d30ea906Sjfb8856606 	COMPRESSDEV_LOG(DEBUG, "Free %d queues pairs on device %u",
397d30ea906Sjfb8856606 			dev->data->nb_queue_pairs, dev->data->dev_id);
398d30ea906Sjfb8856606 
399d30ea906Sjfb8856606 	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->queue_pair_release,
400d30ea906Sjfb8856606 				-ENOTSUP);
401d30ea906Sjfb8856606 
402d30ea906Sjfb8856606 	for (i = 0; i < num_qps; i++) {
403d30ea906Sjfb8856606 		ret = (*dev->dev_ops->queue_pair_release)(dev, i);
404d30ea906Sjfb8856606 		if (ret < 0)
405d30ea906Sjfb8856606 			return ret;
406d30ea906Sjfb8856606 	}
407d30ea906Sjfb8856606 
408d30ea906Sjfb8856606 	if (dev->data->queue_pairs != NULL)
409d30ea906Sjfb8856606 		rte_free(dev->data->queue_pairs);
410d30ea906Sjfb8856606 	dev->data->queue_pairs = NULL;
411d30ea906Sjfb8856606 	dev->data->nb_queue_pairs = 0;
412d30ea906Sjfb8856606 
413d30ea906Sjfb8856606 	return 0;
414d30ea906Sjfb8856606 }
415d30ea906Sjfb8856606 
4164418919fSjohnjiang int
rte_compressdev_configure(uint8_t dev_id,struct rte_compressdev_config * config)417d30ea906Sjfb8856606 rte_compressdev_configure(uint8_t dev_id, struct rte_compressdev_config *config)
418d30ea906Sjfb8856606 {
419d30ea906Sjfb8856606 	struct rte_compressdev *dev;
420d30ea906Sjfb8856606 	int diag;
421d30ea906Sjfb8856606 
422d30ea906Sjfb8856606 	if (!rte_compressdev_is_valid_dev(dev_id)) {
423d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR, "Invalid dev_id=%" PRIu8, dev_id);
424d30ea906Sjfb8856606 		return -EINVAL;
425d30ea906Sjfb8856606 	}
426d30ea906Sjfb8856606 
427d30ea906Sjfb8856606 	dev = &rte_comp_devices[dev_id];
428d30ea906Sjfb8856606 
429d30ea906Sjfb8856606 	if (dev->data->dev_started) {
430d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR,
431d30ea906Sjfb8856606 		    "device %d must be stopped to allow configuration", dev_id);
432d30ea906Sjfb8856606 		return -EBUSY;
433d30ea906Sjfb8856606 	}
434d30ea906Sjfb8856606 
435d30ea906Sjfb8856606 	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_configure, -ENOTSUP);
436d30ea906Sjfb8856606 
437d30ea906Sjfb8856606 	/* Setup new number of queue pairs and reconfigure device. */
438d30ea906Sjfb8856606 	diag = rte_compressdev_queue_pairs_config(dev, config->nb_queue_pairs,
439d30ea906Sjfb8856606 			config->socket_id);
440d30ea906Sjfb8856606 	if (diag != 0) {
441d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR,
442d30ea906Sjfb8856606 			"dev%d rte_comp_dev_queue_pairs_config = %d",
443d30ea906Sjfb8856606 				dev_id, diag);
444d30ea906Sjfb8856606 		return diag;
445d30ea906Sjfb8856606 	}
446d30ea906Sjfb8856606 
447d30ea906Sjfb8856606 	return (*dev->dev_ops->dev_configure)(dev, config);
448d30ea906Sjfb8856606 }
449d30ea906Sjfb8856606 
4504418919fSjohnjiang int
rte_compressdev_start(uint8_t dev_id)451d30ea906Sjfb8856606 rte_compressdev_start(uint8_t dev_id)
452d30ea906Sjfb8856606 {
453d30ea906Sjfb8856606 	struct rte_compressdev *dev;
454d30ea906Sjfb8856606 	int diag;
455d30ea906Sjfb8856606 
456d30ea906Sjfb8856606 	COMPRESSDEV_LOG(DEBUG, "Start dev_id=%" PRIu8, dev_id);
457d30ea906Sjfb8856606 
458d30ea906Sjfb8856606 	if (!rte_compressdev_is_valid_dev(dev_id)) {
459d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR, "Invalid dev_id=%" PRIu8, dev_id);
460d30ea906Sjfb8856606 		return -EINVAL;
461d30ea906Sjfb8856606 	}
462d30ea906Sjfb8856606 
463d30ea906Sjfb8856606 	dev = &rte_comp_devices[dev_id];
464d30ea906Sjfb8856606 
465d30ea906Sjfb8856606 	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_start, -ENOTSUP);
466d30ea906Sjfb8856606 
467d30ea906Sjfb8856606 	if (dev->data->dev_started != 0) {
468d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR,
469d30ea906Sjfb8856606 		    "Device with dev_id=%" PRIu8 " already started", dev_id);
470d30ea906Sjfb8856606 		return 0;
471d30ea906Sjfb8856606 	}
472d30ea906Sjfb8856606 
473d30ea906Sjfb8856606 	diag = (*dev->dev_ops->dev_start)(dev);
474d30ea906Sjfb8856606 	if (diag == 0)
475d30ea906Sjfb8856606 		dev->data->dev_started = 1;
476d30ea906Sjfb8856606 	else
477d30ea906Sjfb8856606 		return diag;
478d30ea906Sjfb8856606 
479d30ea906Sjfb8856606 	return 0;
480d30ea906Sjfb8856606 }
481d30ea906Sjfb8856606 
4824418919fSjohnjiang void
rte_compressdev_stop(uint8_t dev_id)483d30ea906Sjfb8856606 rte_compressdev_stop(uint8_t dev_id)
484d30ea906Sjfb8856606 {
485d30ea906Sjfb8856606 	struct rte_compressdev *dev;
486d30ea906Sjfb8856606 
487d30ea906Sjfb8856606 	if (!rte_compressdev_is_valid_dev(dev_id)) {
488d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR, "Invalid dev_id=%" PRIu8, dev_id);
489d30ea906Sjfb8856606 		return;
490d30ea906Sjfb8856606 	}
491d30ea906Sjfb8856606 
492d30ea906Sjfb8856606 	dev = &rte_comp_devices[dev_id];
493d30ea906Sjfb8856606 
494d30ea906Sjfb8856606 	RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_stop);
495d30ea906Sjfb8856606 
496d30ea906Sjfb8856606 	if (dev->data->dev_started == 0) {
497d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR,
498d30ea906Sjfb8856606 		    "Device with dev_id=%" PRIu8 " already stopped", dev_id);
499d30ea906Sjfb8856606 		return;
500d30ea906Sjfb8856606 	}
501d30ea906Sjfb8856606 
502d30ea906Sjfb8856606 	(*dev->dev_ops->dev_stop)(dev);
503d30ea906Sjfb8856606 	dev->data->dev_started = 0;
504d30ea906Sjfb8856606 }
505d30ea906Sjfb8856606 
5064418919fSjohnjiang int
rte_compressdev_close(uint8_t dev_id)507d30ea906Sjfb8856606 rte_compressdev_close(uint8_t dev_id)
508d30ea906Sjfb8856606 {
509d30ea906Sjfb8856606 	struct rte_compressdev *dev;
510d30ea906Sjfb8856606 	int retval;
511d30ea906Sjfb8856606 
512d30ea906Sjfb8856606 	if (!rte_compressdev_is_valid_dev(dev_id)) {
513d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR, "Invalid dev_id=%" PRIu8, dev_id);
514d30ea906Sjfb8856606 		return -1;
515d30ea906Sjfb8856606 	}
516d30ea906Sjfb8856606 
517d30ea906Sjfb8856606 	dev = &rte_comp_devices[dev_id];
518d30ea906Sjfb8856606 
519d30ea906Sjfb8856606 	/* Device must be stopped before it can be closed */
520d30ea906Sjfb8856606 	if (dev->data->dev_started == 1) {
521d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR, "Device %u must be stopped before closing",
522d30ea906Sjfb8856606 				dev_id);
523d30ea906Sjfb8856606 		return -EBUSY;
524d30ea906Sjfb8856606 	}
525d30ea906Sjfb8856606 
526d30ea906Sjfb8856606 	/* Free queue pairs memory */
527d30ea906Sjfb8856606 	retval = rte_compressdev_queue_pairs_release(dev);
528d30ea906Sjfb8856606 
529d30ea906Sjfb8856606 	if (retval < 0)
530d30ea906Sjfb8856606 		return retval;
531d30ea906Sjfb8856606 
532d30ea906Sjfb8856606 	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_close, -ENOTSUP);
533d30ea906Sjfb8856606 	retval = (*dev->dev_ops->dev_close)(dev);
534d30ea906Sjfb8856606 
535d30ea906Sjfb8856606 	if (retval < 0)
536d30ea906Sjfb8856606 		return retval;
537d30ea906Sjfb8856606 
538d30ea906Sjfb8856606 	return 0;
539d30ea906Sjfb8856606 }
540d30ea906Sjfb8856606 
5414418919fSjohnjiang int
rte_compressdev_queue_pair_setup(uint8_t dev_id,uint16_t queue_pair_id,uint32_t max_inflight_ops,int socket_id)542d30ea906Sjfb8856606 rte_compressdev_queue_pair_setup(uint8_t dev_id, uint16_t queue_pair_id,
543d30ea906Sjfb8856606 		uint32_t max_inflight_ops, int socket_id)
544d30ea906Sjfb8856606 {
545d30ea906Sjfb8856606 	struct rte_compressdev *dev;
546d30ea906Sjfb8856606 
547d30ea906Sjfb8856606 	if (!rte_compressdev_is_valid_dev(dev_id)) {
548d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR, "Invalid dev_id=%" PRIu8, dev_id);
549d30ea906Sjfb8856606 		return -EINVAL;
550d30ea906Sjfb8856606 	}
551d30ea906Sjfb8856606 
552d30ea906Sjfb8856606 	dev = &rte_comp_devices[dev_id];
553d30ea906Sjfb8856606 	if (queue_pair_id >= dev->data->nb_queue_pairs) {
554d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR, "Invalid queue_pair_id=%d", queue_pair_id);
555d30ea906Sjfb8856606 		return -EINVAL;
556d30ea906Sjfb8856606 	}
557d30ea906Sjfb8856606 
558d30ea906Sjfb8856606 	if (dev->data->dev_started) {
559d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR,
560d30ea906Sjfb8856606 		    "device %d must be stopped to allow configuration", dev_id);
561d30ea906Sjfb8856606 		return -EBUSY;
562d30ea906Sjfb8856606 	}
563d30ea906Sjfb8856606 
564d30ea906Sjfb8856606 	if (max_inflight_ops == 0) {
565d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR,
566d30ea906Sjfb8856606 			"Invalid maximum number of inflight operations");
567d30ea906Sjfb8856606 		return -EINVAL;
568d30ea906Sjfb8856606 	}
569d30ea906Sjfb8856606 
570d30ea906Sjfb8856606 	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->queue_pair_setup, -ENOTSUP);
571d30ea906Sjfb8856606 
572d30ea906Sjfb8856606 	return (*dev->dev_ops->queue_pair_setup)(dev, queue_pair_id,
573d30ea906Sjfb8856606 			max_inflight_ops, socket_id);
574d30ea906Sjfb8856606 }
575d30ea906Sjfb8856606 
5764418919fSjohnjiang uint16_t
rte_compressdev_dequeue_burst(uint8_t dev_id,uint16_t qp_id,struct rte_comp_op ** ops,uint16_t nb_ops)577d30ea906Sjfb8856606 rte_compressdev_dequeue_burst(uint8_t dev_id, uint16_t qp_id,
578d30ea906Sjfb8856606 		struct rte_comp_op **ops, uint16_t nb_ops)
579d30ea906Sjfb8856606 {
580d30ea906Sjfb8856606 	struct rte_compressdev *dev = &rte_comp_devices[dev_id];
581d30ea906Sjfb8856606 
582d30ea906Sjfb8856606 	nb_ops = (*dev->dequeue_burst)
583d30ea906Sjfb8856606 			(dev->data->queue_pairs[qp_id], ops, nb_ops);
584d30ea906Sjfb8856606 
585d30ea906Sjfb8856606 	return nb_ops;
586d30ea906Sjfb8856606 }
587d30ea906Sjfb8856606 
5884418919fSjohnjiang uint16_t
rte_compressdev_enqueue_burst(uint8_t dev_id,uint16_t qp_id,struct rte_comp_op ** ops,uint16_t nb_ops)589d30ea906Sjfb8856606 rte_compressdev_enqueue_burst(uint8_t dev_id, uint16_t qp_id,
590d30ea906Sjfb8856606 		struct rte_comp_op **ops, uint16_t nb_ops)
591d30ea906Sjfb8856606 {
592d30ea906Sjfb8856606 	struct rte_compressdev *dev = &rte_comp_devices[dev_id];
593d30ea906Sjfb8856606 
594d30ea906Sjfb8856606 	return (*dev->enqueue_burst)(
595d30ea906Sjfb8856606 			dev->data->queue_pairs[qp_id], ops, nb_ops);
596d30ea906Sjfb8856606 }
597d30ea906Sjfb8856606 
5984418919fSjohnjiang int
rte_compressdev_stats_get(uint8_t dev_id,struct rte_compressdev_stats * stats)599d30ea906Sjfb8856606 rte_compressdev_stats_get(uint8_t dev_id, struct rte_compressdev_stats *stats)
600d30ea906Sjfb8856606 {
601d30ea906Sjfb8856606 	struct rte_compressdev *dev;
602d30ea906Sjfb8856606 
603d30ea906Sjfb8856606 	if (!rte_compressdev_is_valid_dev(dev_id)) {
604d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR, "Invalid dev_id=%d", dev_id);
605d30ea906Sjfb8856606 		return -ENODEV;
606d30ea906Sjfb8856606 	}
607d30ea906Sjfb8856606 
608d30ea906Sjfb8856606 	if (stats == NULL) {
609d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR, "Invalid stats ptr");
610d30ea906Sjfb8856606 		return -EINVAL;
611d30ea906Sjfb8856606 	}
612d30ea906Sjfb8856606 
613d30ea906Sjfb8856606 	dev = &rte_comp_devices[dev_id];
614d30ea906Sjfb8856606 	memset(stats, 0, sizeof(*stats));
615d30ea906Sjfb8856606 
616d30ea906Sjfb8856606 	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->stats_get, -ENOTSUP);
617d30ea906Sjfb8856606 	(*dev->dev_ops->stats_get)(dev, stats);
618d30ea906Sjfb8856606 	return 0;
619d30ea906Sjfb8856606 }
620d30ea906Sjfb8856606 
6214418919fSjohnjiang void
rte_compressdev_stats_reset(uint8_t dev_id)622d30ea906Sjfb8856606 rte_compressdev_stats_reset(uint8_t dev_id)
623d30ea906Sjfb8856606 {
624d30ea906Sjfb8856606 	struct rte_compressdev *dev;
625d30ea906Sjfb8856606 
626d30ea906Sjfb8856606 	if (!rte_compressdev_is_valid_dev(dev_id)) {
627d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR, "Invalid dev_id=%" PRIu8, dev_id);
628d30ea906Sjfb8856606 		return;
629d30ea906Sjfb8856606 	}
630d30ea906Sjfb8856606 
631d30ea906Sjfb8856606 	dev = &rte_comp_devices[dev_id];
632d30ea906Sjfb8856606 
633d30ea906Sjfb8856606 	RTE_FUNC_PTR_OR_RET(*dev->dev_ops->stats_reset);
634d30ea906Sjfb8856606 	(*dev->dev_ops->stats_reset)(dev);
635d30ea906Sjfb8856606 }
636d30ea906Sjfb8856606 
637d30ea906Sjfb8856606 
6384418919fSjohnjiang void
rte_compressdev_info_get(uint8_t dev_id,struct rte_compressdev_info * dev_info)639d30ea906Sjfb8856606 rte_compressdev_info_get(uint8_t dev_id, struct rte_compressdev_info *dev_info)
640d30ea906Sjfb8856606 {
641d30ea906Sjfb8856606 	struct rte_compressdev *dev;
642d30ea906Sjfb8856606 
643d30ea906Sjfb8856606 	if (dev_id >= compressdev_globals.nb_devs) {
644d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR, "Invalid dev_id=%d", dev_id);
645d30ea906Sjfb8856606 		return;
646d30ea906Sjfb8856606 	}
647d30ea906Sjfb8856606 
648d30ea906Sjfb8856606 	dev = &rte_comp_devices[dev_id];
649d30ea906Sjfb8856606 
650d30ea906Sjfb8856606 	memset(dev_info, 0, sizeof(struct rte_compressdev_info));
651d30ea906Sjfb8856606 
652d30ea906Sjfb8856606 	RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_infos_get);
653d30ea906Sjfb8856606 	(*dev->dev_ops->dev_infos_get)(dev, dev_info);
654d30ea906Sjfb8856606 
655d30ea906Sjfb8856606 	dev_info->driver_name = dev->device->driver->name;
656d30ea906Sjfb8856606 }
657d30ea906Sjfb8856606 
6584418919fSjohnjiang int
rte_compressdev_private_xform_create(uint8_t dev_id,const struct rte_comp_xform * xform,void ** priv_xform)659d30ea906Sjfb8856606 rte_compressdev_private_xform_create(uint8_t dev_id,
660d30ea906Sjfb8856606 		const struct rte_comp_xform *xform,
661d30ea906Sjfb8856606 		void **priv_xform)
662d30ea906Sjfb8856606 {
663d30ea906Sjfb8856606 	struct rte_compressdev *dev;
664d30ea906Sjfb8856606 	int ret;
665d30ea906Sjfb8856606 
666d30ea906Sjfb8856606 	dev = rte_compressdev_get_dev(dev_id);
667d30ea906Sjfb8856606 
668d30ea906Sjfb8856606 	if (xform == NULL || priv_xform == NULL || dev == NULL)
669d30ea906Sjfb8856606 		return -EINVAL;
670d30ea906Sjfb8856606 
671d30ea906Sjfb8856606 	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->private_xform_create, -ENOTSUP);
672d30ea906Sjfb8856606 	ret = (*dev->dev_ops->private_xform_create)(dev, xform, priv_xform);
673d30ea906Sjfb8856606 	if (ret < 0) {
674d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR,
675d30ea906Sjfb8856606 			"dev_id %d failed to create private_xform: err=%d",
676d30ea906Sjfb8856606 			dev_id, ret);
677d30ea906Sjfb8856606 		return ret;
678d30ea906Sjfb8856606 	};
679d30ea906Sjfb8856606 
680d30ea906Sjfb8856606 	return 0;
681d30ea906Sjfb8856606 }
682d30ea906Sjfb8856606 
6834418919fSjohnjiang int
rte_compressdev_private_xform_free(uint8_t dev_id,void * priv_xform)684d30ea906Sjfb8856606 rte_compressdev_private_xform_free(uint8_t dev_id, void *priv_xform)
685d30ea906Sjfb8856606 {
686d30ea906Sjfb8856606 	struct rte_compressdev *dev;
687d30ea906Sjfb8856606 	int ret;
688d30ea906Sjfb8856606 
689d30ea906Sjfb8856606 	dev = rte_compressdev_get_dev(dev_id);
690d30ea906Sjfb8856606 
691d30ea906Sjfb8856606 	if (dev == NULL || priv_xform == NULL)
692d30ea906Sjfb8856606 		return -EINVAL;
693d30ea906Sjfb8856606 
694d30ea906Sjfb8856606 	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->private_xform_free, -ENOTSUP);
695d30ea906Sjfb8856606 	ret = dev->dev_ops->private_xform_free(dev, priv_xform);
696d30ea906Sjfb8856606 	if (ret < 0) {
697d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR,
698d30ea906Sjfb8856606 			"dev_id %d failed to free private xform: err=%d",
699d30ea906Sjfb8856606 			dev_id, ret);
700d30ea906Sjfb8856606 		return ret;
701d30ea906Sjfb8856606 	};
702d30ea906Sjfb8856606 
703d30ea906Sjfb8856606 	return 0;
704d30ea906Sjfb8856606 }
705d30ea906Sjfb8856606 
7064418919fSjohnjiang int
rte_compressdev_stream_create(uint8_t dev_id,const struct rte_comp_xform * xform,void ** stream)707d30ea906Sjfb8856606 rte_compressdev_stream_create(uint8_t dev_id,
708d30ea906Sjfb8856606 		const struct rte_comp_xform *xform,
709d30ea906Sjfb8856606 		void **stream)
710d30ea906Sjfb8856606 {
711d30ea906Sjfb8856606 	struct rte_compressdev *dev;
712d30ea906Sjfb8856606 	int ret;
713d30ea906Sjfb8856606 
714d30ea906Sjfb8856606 	dev = rte_compressdev_get_dev(dev_id);
715d30ea906Sjfb8856606 
716d30ea906Sjfb8856606 	if (xform == NULL || dev == NULL || stream == NULL)
717d30ea906Sjfb8856606 		return -EINVAL;
718d30ea906Sjfb8856606 
719d30ea906Sjfb8856606 	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->stream_create, -ENOTSUP);
720d30ea906Sjfb8856606 	ret = (*dev->dev_ops->stream_create)(dev, xform, stream);
721d30ea906Sjfb8856606 	if (ret < 0) {
722d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR,
723d30ea906Sjfb8856606 			"dev_id %d failed to create stream: err=%d",
724d30ea906Sjfb8856606 			dev_id, ret);
725d30ea906Sjfb8856606 		return ret;
726d30ea906Sjfb8856606 	};
727d30ea906Sjfb8856606 
728d30ea906Sjfb8856606 	return 0;
729d30ea906Sjfb8856606 }
730d30ea906Sjfb8856606 
731d30ea906Sjfb8856606 
7324418919fSjohnjiang int
rte_compressdev_stream_free(uint8_t dev_id,void * stream)733d30ea906Sjfb8856606 rte_compressdev_stream_free(uint8_t dev_id, void *stream)
734d30ea906Sjfb8856606 {
735d30ea906Sjfb8856606 	struct rte_compressdev *dev;
736d30ea906Sjfb8856606 	int ret;
737d30ea906Sjfb8856606 
738d30ea906Sjfb8856606 	dev = rte_compressdev_get_dev(dev_id);
739d30ea906Sjfb8856606 
740d30ea906Sjfb8856606 	if (dev == NULL || stream == NULL)
741d30ea906Sjfb8856606 		return -EINVAL;
742d30ea906Sjfb8856606 
743d30ea906Sjfb8856606 	RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->stream_free, -ENOTSUP);
744d30ea906Sjfb8856606 	ret = dev->dev_ops->stream_free(dev, stream);
745d30ea906Sjfb8856606 	if (ret < 0) {
746d30ea906Sjfb8856606 		COMPRESSDEV_LOG(ERR,
747d30ea906Sjfb8856606 			"dev_id %d failed to free stream: err=%d",
748d30ea906Sjfb8856606 			dev_id, ret);
749d30ea906Sjfb8856606 		return ret;
750d30ea906Sjfb8856606 	};
751d30ea906Sjfb8856606 
752d30ea906Sjfb8856606 	return 0;
753d30ea906Sjfb8856606 }
754d30ea906Sjfb8856606 
7554418919fSjohnjiang const char *
rte_compressdev_name_get(uint8_t dev_id)756d30ea906Sjfb8856606 rte_compressdev_name_get(uint8_t dev_id)
757d30ea906Sjfb8856606 {
758d30ea906Sjfb8856606 	struct rte_compressdev *dev = rte_compressdev_get_dev(dev_id);
759d30ea906Sjfb8856606 
760d30ea906Sjfb8856606 	if (dev == NULL)
761d30ea906Sjfb8856606 		return NULL;
762d30ea906Sjfb8856606 
763d30ea906Sjfb8856606 	return dev->data->name;
764d30ea906Sjfb8856606 }
765d30ea906Sjfb8856606 
766*2d9fd380Sjfb8856606 RTE_LOG_REGISTER(compressdev_logtype, lib.compressdev, NOTICE);
767