xref: /spdk/test/accel/dif/dif.c (revision f74d16bead289b710674d39aadc9f2e1e599df3f)
159456660SKrzysztof Sprzaczkowski /*   SPDX-License-Identifier: BSD-3-Clause
259456660SKrzysztof Sprzaczkowski  *   Copyright (C) 2023 Intel Corporation.
359456660SKrzysztof Sprzaczkowski  *   All rights reserved.
459456660SKrzysztof Sprzaczkowski  */
559456660SKrzysztof Sprzaczkowski 
659456660SKrzysztof Sprzaczkowski #include "spdk/stdinc.h"
759456660SKrzysztof Sprzaczkowski 
859456660SKrzysztof Sprzaczkowski #include "spdk/accel.h"
959456660SKrzysztof Sprzaczkowski #include "spdk/env.h"
1059456660SKrzysztof Sprzaczkowski #include "spdk/log.h"
1159456660SKrzysztof Sprzaczkowski #include "spdk/thread.h"
1259456660SKrzysztof Sprzaczkowski #include "spdk/event.h"
1359456660SKrzysztof Sprzaczkowski #include "spdk/rpc.h"
1459456660SKrzysztof Sprzaczkowski #include "spdk/util.h"
1559456660SKrzysztof Sprzaczkowski #include "spdk/string.h"
1659456660SKrzysztof Sprzaczkowski #include "spdk_internal/cunit.h"
1759456660SKrzysztof Sprzaczkowski 
1859456660SKrzysztof Sprzaczkowski #include "CUnit/Basic.h"
1959456660SKrzysztof Sprzaczkowski 
2059456660SKrzysztof Sprzaczkowski pthread_mutex_t g_test_mutex;
2159456660SKrzysztof Sprzaczkowski pthread_cond_t g_test_cond;
2259456660SKrzysztof Sprzaczkowski 
2359456660SKrzysztof Sprzaczkowski #define WORKER_COUNT 2
2459456660SKrzysztof Sprzaczkowski #define WORKER_IO 0
2559456660SKrzysztof Sprzaczkowski #define WORKER_UT 1
2659456660SKrzysztof Sprzaczkowski 
2759456660SKrzysztof Sprzaczkowski static struct spdk_thread *g_thread[WORKER_COUNT];
2859456660SKrzysztof Sprzaczkowski static int g_num_failures = 0;
2959456660SKrzysztof Sprzaczkowski static bool g_shutdown = false;
3059456660SKrzysztof Sprzaczkowski static bool g_completion_success;
3159456660SKrzysztof Sprzaczkowski struct spdk_io_channel	*g_channel = NULL;
3259456660SKrzysztof Sprzaczkowski 
3359456660SKrzysztof Sprzaczkowski struct dif_task {
34f62ac001SKrzysztof Sprzaczkowski 	struct iovec		*dst_iovs;
35f62ac001SKrzysztof Sprzaczkowski 	uint32_t		dst_iovcnt;
3659456660SKrzysztof Sprzaczkowski 	struct iovec		*src_iovs;
3759456660SKrzysztof Sprzaczkowski 	uint32_t		src_iovcnt;
38a506f666SShuhei Matsumoto 	struct iovec		*aux_iovs;
39a506f666SShuhei Matsumoto 	uint32_t		aux_iovcnt;
40a63a45fcSSlawomir Ptak 	struct iovec		md_iov;
4159456660SKrzysztof Sprzaczkowski 	uint32_t		num_blocks; /* used for the DIF related operations */
4259456660SKrzysztof Sprzaczkowski 	struct spdk_dif_ctx	dif_ctx;
4359456660SKrzysztof Sprzaczkowski 	struct spdk_dif_error	dif_err;
4459456660SKrzysztof Sprzaczkowski };
4559456660SKrzysztof Sprzaczkowski 
4659456660SKrzysztof Sprzaczkowski static void
4759456660SKrzysztof Sprzaczkowski execute_spdk_function(spdk_msg_fn fn, void *arg)
4859456660SKrzysztof Sprzaczkowski {
4959456660SKrzysztof Sprzaczkowski 	pthread_mutex_lock(&g_test_mutex);
5059456660SKrzysztof Sprzaczkowski 	spdk_thread_send_msg(g_thread[WORKER_IO], fn, arg);
5159456660SKrzysztof Sprzaczkowski 	pthread_cond_wait(&g_test_cond, &g_test_mutex);
5259456660SKrzysztof Sprzaczkowski 	pthread_mutex_unlock(&g_test_mutex);
5359456660SKrzysztof Sprzaczkowski }
5459456660SKrzysztof Sprzaczkowski 
5559456660SKrzysztof Sprzaczkowski static void
5659456660SKrzysztof Sprzaczkowski wake_ut_thread(void)
5759456660SKrzysztof Sprzaczkowski {
5859456660SKrzysztof Sprzaczkowski 	pthread_mutex_lock(&g_test_mutex);
5959456660SKrzysztof Sprzaczkowski 	pthread_cond_signal(&g_test_cond);
6059456660SKrzysztof Sprzaczkowski 	pthread_mutex_unlock(&g_test_mutex);
6159456660SKrzysztof Sprzaczkowski }
6259456660SKrzysztof Sprzaczkowski 
6359456660SKrzysztof Sprzaczkowski static void
6459456660SKrzysztof Sprzaczkowski exit_io_thread(void *arg)
6559456660SKrzysztof Sprzaczkowski {
6659456660SKrzysztof Sprzaczkowski 	assert(spdk_get_thread() == g_thread[WORKER_IO]);
6759456660SKrzysztof Sprzaczkowski 	spdk_thread_exit(g_thread[WORKER_IO]);
6859456660SKrzysztof Sprzaczkowski 	wake_ut_thread();
6959456660SKrzysztof Sprzaczkowski }
7059456660SKrzysztof Sprzaczkowski 
7159456660SKrzysztof Sprzaczkowski #define DATA_PATTERN 0x5A
7259456660SKrzysztof Sprzaczkowski 
7359456660SKrzysztof Sprzaczkowski static int g_xfer_size_bytes = 4096;
7459456660SKrzysztof Sprzaczkowski static int g_block_size_bytes = 512;
7559456660SKrzysztof Sprzaczkowski static int g_md_size_bytes = 8;
7659456660SKrzysztof Sprzaczkowski struct dif_task g_dif_task;
7759456660SKrzysztof Sprzaczkowski 
7859456660SKrzysztof Sprzaczkowski struct accel_dif_request {
79a506f666SShuhei Matsumoto 	struct spdk_accel_sequence *sequence;
8059456660SKrzysztof Sprzaczkowski 	struct spdk_io_channel *channel;
81f62ac001SKrzysztof Sprzaczkowski 	struct iovec *dst_iovs;
82f62ac001SKrzysztof Sprzaczkowski 	size_t dst_iovcnt;
8359456660SKrzysztof Sprzaczkowski 	struct iovec *src_iovs;
8459456660SKrzysztof Sprzaczkowski 	size_t src_iovcnt;
85a506f666SShuhei Matsumoto 	struct iovec *aux_iovs;
86a506f666SShuhei Matsumoto 	size_t aux_iovcnt;
87a63a45fcSSlawomir Ptak 	struct iovec *md_iov;
8859456660SKrzysztof Sprzaczkowski 	uint32_t num_blocks;
8959456660SKrzysztof Sprzaczkowski 	const struct spdk_dif_ctx *ctx;
9059456660SKrzysztof Sprzaczkowski 	struct spdk_dif_error *err;
9159456660SKrzysztof Sprzaczkowski 	spdk_accel_completion_cb cb_fn;
9259456660SKrzysztof Sprzaczkowski 	void *cb_arg;
9359456660SKrzysztof Sprzaczkowski };
9459456660SKrzysztof Sprzaczkowski 
9559456660SKrzysztof Sprzaczkowski static void
9659456660SKrzysztof Sprzaczkowski accel_dif_oper_done(void *arg1, int status)
9759456660SKrzysztof Sprzaczkowski {
9859456660SKrzysztof Sprzaczkowski 	if (status == 0) {
9959456660SKrzysztof Sprzaczkowski 		g_completion_success = true;
10059456660SKrzysztof Sprzaczkowski 	}
10159456660SKrzysztof Sprzaczkowski 	wake_ut_thread();
10259456660SKrzysztof Sprzaczkowski }
10359456660SKrzysztof Sprzaczkowski 
104086cb8deSKrzysztof Sprzaczkowski static bool
105086cb8deSKrzysztof Sprzaczkowski accel_dif_error_validate(const uint32_t dif_flags,
106086cb8deSKrzysztof Sprzaczkowski 			 const struct spdk_dif_error *err)
107086cb8deSKrzysztof Sprzaczkowski {
108a63a45fcSSlawomir Ptak 	if (dif_flags & SPDK_DIF_FLAGS_GUARD_CHECK) {
109086cb8deSKrzysztof Sprzaczkowski 		return err->err_type == SPDK_DIF_GUARD_ERROR;
110a63a45fcSSlawomir Ptak 	} else if (dif_flags & SPDK_DIF_FLAGS_APPTAG_CHECK) {
111086cb8deSKrzysztof Sprzaczkowski 		return err->err_type == SPDK_DIF_APPTAG_ERROR;
112a63a45fcSSlawomir Ptak 	} else if (dif_flags & SPDK_DIF_FLAGS_REFTAG_CHECK) {
113086cb8deSKrzysztof Sprzaczkowski 		return err->err_type == SPDK_DIF_REFTAG_ERROR;
114086cb8deSKrzysztof Sprzaczkowski 	}
115a63a45fcSSlawomir Ptak 
116a63a45fcSSlawomir Ptak 	return false;
117086cb8deSKrzysztof Sprzaczkowski }
118086cb8deSKrzysztof Sprzaczkowski 
11959456660SKrzysztof Sprzaczkowski static int
12047494478SKrzysztof Sprzaczkowski alloc_dif_verify_bufs(struct dif_task *task, uint32_t chained_count)
12159456660SKrzysztof Sprzaczkowski {
12259456660SKrzysztof Sprzaczkowski 	int src_buff_len = g_xfer_size_bytes;
12359456660SKrzysztof Sprzaczkowski 	uint32_t i = 0;
12459456660SKrzysztof Sprzaczkowski 
12559456660SKrzysztof Sprzaczkowski 	assert(chained_count > 0);
12659456660SKrzysztof Sprzaczkowski 	task->src_iovcnt = chained_count;
12759456660SKrzysztof Sprzaczkowski 	task->src_iovs = calloc(task->src_iovcnt, sizeof(struct iovec));
12847494478SKrzysztof Sprzaczkowski 	if (spdk_unlikely(task->src_iovs == NULL)) {
12947494478SKrzysztof Sprzaczkowski 		return -ENOMEM;
13047494478SKrzysztof Sprzaczkowski 	}
13159456660SKrzysztof Sprzaczkowski 
13259456660SKrzysztof Sprzaczkowski 	src_buff_len += (g_xfer_size_bytes / g_block_size_bytes) * g_md_size_bytes;
13359456660SKrzysztof Sprzaczkowski 
13459456660SKrzysztof Sprzaczkowski 	for (i = 0; i < task->src_iovcnt; i++) {
13559456660SKrzysztof Sprzaczkowski 		task->src_iovs[i].iov_base = spdk_dma_zmalloc(src_buff_len, 0, NULL);
13647494478SKrzysztof Sprzaczkowski 		if (spdk_unlikely(task->src_iovs[i].iov_base == NULL)) {
13747494478SKrzysztof Sprzaczkowski 			return -ENOMEM;
13847494478SKrzysztof Sprzaczkowski 		}
13959456660SKrzysztof Sprzaczkowski 
14059456660SKrzysztof Sprzaczkowski 		memset(task->src_iovs[i].iov_base, DATA_PATTERN, src_buff_len);
14159456660SKrzysztof Sprzaczkowski 		task->src_iovs[i].iov_len = src_buff_len;
14259456660SKrzysztof Sprzaczkowski 	}
14359456660SKrzysztof Sprzaczkowski 
14459456660SKrzysztof Sprzaczkowski 	task->num_blocks = (g_xfer_size_bytes * chained_count) / g_block_size_bytes;
14559456660SKrzysztof Sprzaczkowski 
14659456660SKrzysztof Sprzaczkowski 	return 0;
14759456660SKrzysztof Sprzaczkowski }
14859456660SKrzysztof Sprzaczkowski 
149a63a45fcSSlawomir Ptak static int
150a63a45fcSSlawomir Ptak alloc_dix_bufs(struct dif_task *task, uint32_t chained_count)
151a63a45fcSSlawomir Ptak {
152a63a45fcSSlawomir Ptak 	int src_buff_len = g_xfer_size_bytes, md_buff_len;
153a63a45fcSSlawomir Ptak 	uint32_t i = 0;
154a63a45fcSSlawomir Ptak 
155a63a45fcSSlawomir Ptak 	assert(chained_count > 0);
156a63a45fcSSlawomir Ptak 	task->src_iovcnt = chained_count;
157a63a45fcSSlawomir Ptak 	task->src_iovs = calloc(task->src_iovcnt, sizeof(struct iovec));
158a63a45fcSSlawomir Ptak 	if (spdk_unlikely(task->src_iovs == NULL)) {
159a63a45fcSSlawomir Ptak 		return -ENOMEM;
160a63a45fcSSlawomir Ptak 	}
161a63a45fcSSlawomir Ptak 
162a63a45fcSSlawomir Ptak 	md_buff_len = (g_xfer_size_bytes / g_block_size_bytes) * g_md_size_bytes * chained_count;
163a63a45fcSSlawomir Ptak 
164a63a45fcSSlawomir Ptak 	for (i = 0; i < task->src_iovcnt; i++) {
165a63a45fcSSlawomir Ptak 		task->src_iovs[i].iov_base = spdk_dma_zmalloc(src_buff_len, 0, NULL);
166a63a45fcSSlawomir Ptak 		if (spdk_unlikely(task->src_iovs[i].iov_base == NULL)) {
167a63a45fcSSlawomir Ptak 			return -ENOMEM;
168a63a45fcSSlawomir Ptak 		}
169a63a45fcSSlawomir Ptak 
170a63a45fcSSlawomir Ptak 		memset(task->src_iovs[i].iov_base, DATA_PATTERN, src_buff_len);
171a63a45fcSSlawomir Ptak 		task->src_iovs[i].iov_len = src_buff_len;
172a63a45fcSSlawomir Ptak 	}
173a63a45fcSSlawomir Ptak 
174a63a45fcSSlawomir Ptak 	task->md_iov.iov_base = spdk_dma_zmalloc(md_buff_len, 0, NULL);
175a63a45fcSSlawomir Ptak 	if (spdk_unlikely(task->md_iov.iov_base == NULL)) {
176a63a45fcSSlawomir Ptak 		return -ENOMEM;
177a63a45fcSSlawomir Ptak 	}
178a63a45fcSSlawomir Ptak 
179a63a45fcSSlawomir Ptak 	task->md_iov.iov_len = md_buff_len;
180a63a45fcSSlawomir Ptak 	task->num_blocks = (g_xfer_size_bytes * chained_count) / g_block_size_bytes;
181a63a45fcSSlawomir Ptak 
182a63a45fcSSlawomir Ptak 	return 0;
183a63a45fcSSlawomir Ptak }
184a63a45fcSSlawomir Ptak 
18547494478SKrzysztof Sprzaczkowski static void
18647494478SKrzysztof Sprzaczkowski free_dif_verify_bufs(struct dif_task *task)
18759456660SKrzysztof Sprzaczkowski {
18859456660SKrzysztof Sprzaczkowski 	uint32_t i = 0;
18959456660SKrzysztof Sprzaczkowski 
19047494478SKrzysztof Sprzaczkowski 	if (task->src_iovs != NULL) {
19159456660SKrzysztof Sprzaczkowski 		for (i = 0; i < task->src_iovcnt; i++) {
19247494478SKrzysztof Sprzaczkowski 			if (task->src_iovs[i].iov_base != NULL) {
19359456660SKrzysztof Sprzaczkowski 				spdk_dma_free(task->src_iovs[i].iov_base);
19459456660SKrzysztof Sprzaczkowski 			}
19547494478SKrzysztof Sprzaczkowski 		}
19659456660SKrzysztof Sprzaczkowski 		free(task->src_iovs);
19747494478SKrzysztof Sprzaczkowski 	}
19859456660SKrzysztof Sprzaczkowski }
19959456660SKrzysztof Sprzaczkowski 
200a63a45fcSSlawomir Ptak static void
201a63a45fcSSlawomir Ptak free_dix_bufs(struct dif_task *task)
202a63a45fcSSlawomir Ptak {
203a63a45fcSSlawomir Ptak 	uint32_t i = 0;
204a63a45fcSSlawomir Ptak 
205a63a45fcSSlawomir Ptak 	if (task->src_iovs != NULL) {
206a63a45fcSSlawomir Ptak 		for (i = 0; i < task->src_iovcnt; i++) {
207a63a45fcSSlawomir Ptak 			if (task->src_iovs[i].iov_base != NULL) {
208a63a45fcSSlawomir Ptak 				spdk_dma_free(task->src_iovs[i].iov_base);
209a63a45fcSSlawomir Ptak 			}
210a63a45fcSSlawomir Ptak 		}
211a63a45fcSSlawomir Ptak 		free(task->src_iovs);
212a63a45fcSSlawomir Ptak 	}
213a63a45fcSSlawomir Ptak 
214a63a45fcSSlawomir Ptak 	if (task->md_iov.iov_base != NULL) {
215a63a45fcSSlawomir Ptak 		spdk_dma_free(task->md_iov.iov_base);
216a63a45fcSSlawomir Ptak 	}
217a63a45fcSSlawomir Ptak }
218a63a45fcSSlawomir Ptak 
219f62ac001SKrzysztof Sprzaczkowski static int
220086cb8deSKrzysztof Sprzaczkowski alloc_dif_verify_copy_bufs(struct dif_task *task, uint32_t chained_count)
221086cb8deSKrzysztof Sprzaczkowski {
222086cb8deSKrzysztof Sprzaczkowski 	int dst_buff_len = g_xfer_size_bytes;
223086cb8deSKrzysztof Sprzaczkowski 	uint32_t data_size_with_md;
224086cb8deSKrzysztof Sprzaczkowski 	uint32_t i = 0;
225086cb8deSKrzysztof Sprzaczkowski 
226086cb8deSKrzysztof Sprzaczkowski 	assert(chained_count > 0);
227086cb8deSKrzysztof Sprzaczkowski 	task->src_iovcnt = chained_count;
228086cb8deSKrzysztof Sprzaczkowski 	task->src_iovs = calloc(task->src_iovcnt, sizeof(struct iovec));
229086cb8deSKrzysztof Sprzaczkowski 	if (spdk_unlikely(task->src_iovs == NULL)) {
230086cb8deSKrzysztof Sprzaczkowski 		return -ENOMEM;
231086cb8deSKrzysztof Sprzaczkowski 	}
232086cb8deSKrzysztof Sprzaczkowski 
233086cb8deSKrzysztof Sprzaczkowski 	task->num_blocks = g_xfer_size_bytes / g_block_size_bytes;
234086cb8deSKrzysztof Sprzaczkowski 
235086cb8deSKrzysztof Sprzaczkowski 	/* Add bytes for each block for metadata */
236086cb8deSKrzysztof Sprzaczkowski 	data_size_with_md = g_xfer_size_bytes + (task->num_blocks * g_md_size_bytes);
237086cb8deSKrzysztof Sprzaczkowski 
238086cb8deSKrzysztof Sprzaczkowski 	for (i = 0; i < task->src_iovcnt; i++) {
239086cb8deSKrzysztof Sprzaczkowski 		task->src_iovs[i].iov_base = spdk_dma_zmalloc(data_size_with_md, 0, NULL);
240086cb8deSKrzysztof Sprzaczkowski 		if (spdk_unlikely(task->src_iovs[i].iov_base == NULL)) {
241086cb8deSKrzysztof Sprzaczkowski 			return -ENOMEM;
242086cb8deSKrzysztof Sprzaczkowski 		}
243086cb8deSKrzysztof Sprzaczkowski 
244086cb8deSKrzysztof Sprzaczkowski 		memset(task->src_iovs[i].iov_base, DATA_PATTERN, data_size_with_md);
245086cb8deSKrzysztof Sprzaczkowski 		task->src_iovs[i].iov_len = data_size_with_md;
246086cb8deSKrzysztof Sprzaczkowski 	}
247086cb8deSKrzysztof Sprzaczkowski 
248086cb8deSKrzysztof Sprzaczkowski 	task->dst_iovcnt = chained_count;
249086cb8deSKrzysztof Sprzaczkowski 	task->dst_iovs = calloc(task->dst_iovcnt, sizeof(struct iovec));
250086cb8deSKrzysztof Sprzaczkowski 	if (spdk_unlikely(task->dst_iovs == NULL)) {
251086cb8deSKrzysztof Sprzaczkowski 		return -ENOMEM;
252086cb8deSKrzysztof Sprzaczkowski 	}
253086cb8deSKrzysztof Sprzaczkowski 
254086cb8deSKrzysztof Sprzaczkowski 	for (i = 0; i < task->dst_iovcnt; i++) {
255086cb8deSKrzysztof Sprzaczkowski 		task->dst_iovs[i].iov_base = spdk_dma_zmalloc(dst_buff_len, 0, NULL);
256086cb8deSKrzysztof Sprzaczkowski 		if (spdk_unlikely(task->dst_iovs[i].iov_base == NULL)) {
257086cb8deSKrzysztof Sprzaczkowski 			return -ENOMEM;
258086cb8deSKrzysztof Sprzaczkowski 		}
259086cb8deSKrzysztof Sprzaczkowski 
260086cb8deSKrzysztof Sprzaczkowski 		memset(task->dst_iovs[i].iov_base, 0, dst_buff_len);
261086cb8deSKrzysztof Sprzaczkowski 		task->dst_iovs[i].iov_len = dst_buff_len;
262086cb8deSKrzysztof Sprzaczkowski 	}
263086cb8deSKrzysztof Sprzaczkowski 
264086cb8deSKrzysztof Sprzaczkowski 	return 0;
265086cb8deSKrzysztof Sprzaczkowski }
266086cb8deSKrzysztof Sprzaczkowski 
267086cb8deSKrzysztof Sprzaczkowski static void
268086cb8deSKrzysztof Sprzaczkowski free_dif_verify_copy_bufs(struct dif_task *task)
269086cb8deSKrzysztof Sprzaczkowski {
270086cb8deSKrzysztof Sprzaczkowski 	uint32_t i = 0;
271086cb8deSKrzysztof Sprzaczkowski 
272086cb8deSKrzysztof Sprzaczkowski 	if (task->dst_iovs != NULL) {
273086cb8deSKrzysztof Sprzaczkowski 		for (i = 0; i < task->dst_iovcnt; i++) {
274086cb8deSKrzysztof Sprzaczkowski 			if (task->dst_iovs[i].iov_base != NULL) {
275086cb8deSKrzysztof Sprzaczkowski 				spdk_dma_free(task->dst_iovs[i].iov_base);
276086cb8deSKrzysztof Sprzaczkowski 			}
277086cb8deSKrzysztof Sprzaczkowski 		}
278086cb8deSKrzysztof Sprzaczkowski 		free(task->dst_iovs);
279086cb8deSKrzysztof Sprzaczkowski 	}
280086cb8deSKrzysztof Sprzaczkowski 
281086cb8deSKrzysztof Sprzaczkowski 	if (task->src_iovs != NULL) {
282086cb8deSKrzysztof Sprzaczkowski 		for (i = 0; i < task->src_iovcnt; i++) {
283086cb8deSKrzysztof Sprzaczkowski 			if (task->src_iovs[i].iov_base != NULL) {
284086cb8deSKrzysztof Sprzaczkowski 				spdk_dma_free(task->src_iovs[i].iov_base);
285086cb8deSKrzysztof Sprzaczkowski 			}
286086cb8deSKrzysztof Sprzaczkowski 		}
287086cb8deSKrzysztof Sprzaczkowski 		free(task->src_iovs);
288086cb8deSKrzysztof Sprzaczkowski 	}
289086cb8deSKrzysztof Sprzaczkowski }
290086cb8deSKrzysztof Sprzaczkowski 
291086cb8deSKrzysztof Sprzaczkowski static int
29247494478SKrzysztof Sprzaczkowski alloc_dif_generate_copy_bufs(struct dif_task *task, uint32_t chained_count)
293f62ac001SKrzysztof Sprzaczkowski {
294f62ac001SKrzysztof Sprzaczkowski 	int src_buff_len = g_xfer_size_bytes;
295f62ac001SKrzysztof Sprzaczkowski 	uint32_t transfer_size_with_md;
296f62ac001SKrzysztof Sprzaczkowski 	uint32_t i = 0;
297f62ac001SKrzysztof Sprzaczkowski 
298f62ac001SKrzysztof Sprzaczkowski 	assert(chained_count > 0);
299f62ac001SKrzysztof Sprzaczkowski 	task->dst_iovcnt = chained_count;
300f62ac001SKrzysztof Sprzaczkowski 	task->dst_iovs = calloc(task->dst_iovcnt, sizeof(struct iovec));
30147494478SKrzysztof Sprzaczkowski 	if (spdk_unlikely(task->dst_iovs == NULL)) {
30247494478SKrzysztof Sprzaczkowski 		return -ENOMEM;
30347494478SKrzysztof Sprzaczkowski 	}
304f62ac001SKrzysztof Sprzaczkowski 
305f62ac001SKrzysztof Sprzaczkowski 	task->num_blocks = g_xfer_size_bytes / g_block_size_bytes;
306f62ac001SKrzysztof Sprzaczkowski 
307f62ac001SKrzysztof Sprzaczkowski 	/* Add bytes for each block for metadata */
308f62ac001SKrzysztof Sprzaczkowski 	transfer_size_with_md = g_xfer_size_bytes + (task->num_blocks * g_md_size_bytes);
309f62ac001SKrzysztof Sprzaczkowski 
310f62ac001SKrzysztof Sprzaczkowski 	for (i = 0; i < task->dst_iovcnt; i++) {
311f62ac001SKrzysztof Sprzaczkowski 		task->dst_iovs[i].iov_base = spdk_dma_zmalloc(transfer_size_with_md, 0, NULL);
31247494478SKrzysztof Sprzaczkowski 		if (spdk_unlikely(task->dst_iovs[i].iov_base == NULL)) {
31347494478SKrzysztof Sprzaczkowski 			return -ENOMEM;
31447494478SKrzysztof Sprzaczkowski 		}
315f62ac001SKrzysztof Sprzaczkowski 
316f62ac001SKrzysztof Sprzaczkowski 		memset(task->dst_iovs[i].iov_base, 0, transfer_size_with_md);
317f62ac001SKrzysztof Sprzaczkowski 		task->dst_iovs[i].iov_len = transfer_size_with_md;
318f62ac001SKrzysztof Sprzaczkowski 	}
319f62ac001SKrzysztof Sprzaczkowski 
320f62ac001SKrzysztof Sprzaczkowski 	task->src_iovcnt = chained_count;
321f62ac001SKrzysztof Sprzaczkowski 	task->src_iovs = calloc(task->src_iovcnt, sizeof(struct iovec));
32247494478SKrzysztof Sprzaczkowski 	if (spdk_unlikely(task->src_iovs == NULL)) {
32347494478SKrzysztof Sprzaczkowski 		return -ENOMEM;
32447494478SKrzysztof Sprzaczkowski 	}
325f62ac001SKrzysztof Sprzaczkowski 
326f62ac001SKrzysztof Sprzaczkowski 	for (i = 0; i < task->src_iovcnt; i++) {
327f62ac001SKrzysztof Sprzaczkowski 		task->src_iovs[i].iov_base = spdk_dma_zmalloc(src_buff_len, 0, NULL);
32847494478SKrzysztof Sprzaczkowski 		if (spdk_unlikely(task->src_iovs[i].iov_base == NULL)) {
32947494478SKrzysztof Sprzaczkowski 			return -ENOMEM;
33047494478SKrzysztof Sprzaczkowski 		}
331f62ac001SKrzysztof Sprzaczkowski 
332f62ac001SKrzysztof Sprzaczkowski 		memset(task->src_iovs[i].iov_base, DATA_PATTERN, src_buff_len);
333f62ac001SKrzysztof Sprzaczkowski 		task->src_iovs[i].iov_len = src_buff_len;
334f62ac001SKrzysztof Sprzaczkowski 	}
335f62ac001SKrzysztof Sprzaczkowski 
336f62ac001SKrzysztof Sprzaczkowski 	return 0;
337f62ac001SKrzysztof Sprzaczkowski }
338f62ac001SKrzysztof Sprzaczkowski 
33947494478SKrzysztof Sprzaczkowski static void
34047494478SKrzysztof Sprzaczkowski free_dif_generate_copy_bufs(struct dif_task *task)
341f62ac001SKrzysztof Sprzaczkowski {
342f62ac001SKrzysztof Sprzaczkowski 	uint32_t i = 0;
343f62ac001SKrzysztof Sprzaczkowski 
34447494478SKrzysztof Sprzaczkowski 	if (task->dst_iovs != NULL) {
345f62ac001SKrzysztof Sprzaczkowski 		for (i = 0; i < task->dst_iovcnt; i++) {
34647494478SKrzysztof Sprzaczkowski 			if (task->dst_iovs[i].iov_base != NULL) {
347f62ac001SKrzysztof Sprzaczkowski 				spdk_dma_free(task->dst_iovs[i].iov_base);
348f62ac001SKrzysztof Sprzaczkowski 			}
34947494478SKrzysztof Sprzaczkowski 		}
350f62ac001SKrzysztof Sprzaczkowski 		free(task->dst_iovs);
35147494478SKrzysztof Sprzaczkowski 	}
352f62ac001SKrzysztof Sprzaczkowski 
35347494478SKrzysztof Sprzaczkowski 	if (task->src_iovs != NULL) {
354f62ac001SKrzysztof Sprzaczkowski 		for (i = 0; i < task->src_iovcnt; i++) {
35547494478SKrzysztof Sprzaczkowski 			if (task->src_iovs[i].iov_base != NULL) {
356f62ac001SKrzysztof Sprzaczkowski 				spdk_dma_free(task->src_iovs[i].iov_base);
357f62ac001SKrzysztof Sprzaczkowski 			}
35847494478SKrzysztof Sprzaczkowski 		}
359f62ac001SKrzysztof Sprzaczkowski 		free(task->src_iovs);
36047494478SKrzysztof Sprzaczkowski 	}
361f62ac001SKrzysztof Sprzaczkowski }
362f62ac001SKrzysztof Sprzaczkowski 
363a506f666SShuhei Matsumoto static int
364a506f666SShuhei Matsumoto alloc_dif_generate_copy_sequence_bufs(struct dif_task *task, uint32_t chained_count)
365a506f666SShuhei Matsumoto {
366a506f666SShuhei Matsumoto 	int src_buff_len = g_xfer_size_bytes;
367a506f666SShuhei Matsumoto 	uint32_t transfer_size_with_md;
368a506f666SShuhei Matsumoto 	uint32_t i = 0;
369a506f666SShuhei Matsumoto 
370a506f666SShuhei Matsumoto 	assert(chained_count > 0);
371a506f666SShuhei Matsumoto 	task->dst_iovcnt = chained_count;
372a506f666SShuhei Matsumoto 	task->dst_iovs = calloc(task->dst_iovcnt, sizeof(struct iovec));
373a506f666SShuhei Matsumoto 	if (spdk_unlikely(task->dst_iovs == NULL)) {
374a506f666SShuhei Matsumoto 		return -ENOMEM;
375a506f666SShuhei Matsumoto 	}
376a506f666SShuhei Matsumoto 
377a506f666SShuhei Matsumoto 	task->num_blocks = g_xfer_size_bytes / g_block_size_bytes;
378a506f666SShuhei Matsumoto 
379a506f666SShuhei Matsumoto 	/* Add bytes for each block for metadata */
380a506f666SShuhei Matsumoto 	transfer_size_with_md = g_xfer_size_bytes + (task->num_blocks * g_md_size_bytes);
381a506f666SShuhei Matsumoto 
382a506f666SShuhei Matsumoto 	for (i = 0; i < task->dst_iovcnt; i++) {
383a506f666SShuhei Matsumoto 		task->dst_iovs[i].iov_base = spdk_dma_zmalloc(transfer_size_with_md, 0, NULL);
384a506f666SShuhei Matsumoto 		if (spdk_unlikely(task->dst_iovs[i].iov_base == NULL)) {
385a506f666SShuhei Matsumoto 			return -ENOMEM;
386a506f666SShuhei Matsumoto 		}
387a506f666SShuhei Matsumoto 
388a506f666SShuhei Matsumoto 		memset(task->dst_iovs[i].iov_base, 0, transfer_size_with_md);
389a506f666SShuhei Matsumoto 		task->dst_iovs[i].iov_len = transfer_size_with_md;
390a506f666SShuhei Matsumoto 	}
391a506f666SShuhei Matsumoto 
392a506f666SShuhei Matsumoto 	task->src_iovcnt = chained_count;
393a506f666SShuhei Matsumoto 	task->src_iovs = calloc(task->src_iovcnt, sizeof(struct iovec));
394a506f666SShuhei Matsumoto 	if (spdk_unlikely(task->src_iovs == NULL)) {
395a506f666SShuhei Matsumoto 		return -ENOMEM;
396a506f666SShuhei Matsumoto 	}
397a506f666SShuhei Matsumoto 
398a506f666SShuhei Matsumoto 	for (i = 0; i < task->src_iovcnt; i++) {
399a506f666SShuhei Matsumoto 		task->src_iovs[i].iov_base = spdk_dma_zmalloc(src_buff_len, 0, NULL);
400a506f666SShuhei Matsumoto 		if (spdk_unlikely(task->src_iovs[i].iov_base == NULL)) {
401a506f666SShuhei Matsumoto 			return -ENOMEM;
402a506f666SShuhei Matsumoto 		}
403a506f666SShuhei Matsumoto 
404a506f666SShuhei Matsumoto 		memset(task->src_iovs[i].iov_base, DATA_PATTERN, src_buff_len);
405a506f666SShuhei Matsumoto 		task->src_iovs[i].iov_len = src_buff_len;
406a506f666SShuhei Matsumoto 	}
407a506f666SShuhei Matsumoto 
408a506f666SShuhei Matsumoto 	/*
409a506f666SShuhei Matsumoto 	 * For write, we do not want to insert DIF in place because host does not expect
410a506f666SShuhei Matsumoto 	 * write buffer to be updated. We allocate auxiliary buffer to simulate such case.
411a506f666SShuhei Matsumoto 	 */
412a506f666SShuhei Matsumoto 	task->aux_iovcnt = chained_count;
413a506f666SShuhei Matsumoto 	task->aux_iovs = calloc(task->aux_iovcnt, sizeof(struct iovec));
414a506f666SShuhei Matsumoto 	if (spdk_unlikely(task->aux_iovs == NULL)) {
415a506f666SShuhei Matsumoto 		return -ENOMEM;
416a506f666SShuhei Matsumoto 	}
417a506f666SShuhei Matsumoto 
418a506f666SShuhei Matsumoto 	for (i = 0; i < task->aux_iovcnt; i++) {
419a506f666SShuhei Matsumoto 		task->aux_iovs[i].iov_base = spdk_dma_zmalloc(transfer_size_with_md, 0, NULL);
420a506f666SShuhei Matsumoto 		if (spdk_unlikely(task->aux_iovs[i].iov_base == NULL)) {
421a506f666SShuhei Matsumoto 			return -ENOMEM;
422a506f666SShuhei Matsumoto 		}
423a506f666SShuhei Matsumoto 
424a506f666SShuhei Matsumoto 		memset(task->aux_iovs[i].iov_base, 0, transfer_size_with_md);
425a506f666SShuhei Matsumoto 		task->aux_iovs[i].iov_len = transfer_size_with_md;
426a506f666SShuhei Matsumoto 	}
427a506f666SShuhei Matsumoto 
428a506f666SShuhei Matsumoto 	return 0;
429a506f666SShuhei Matsumoto }
430a506f666SShuhei Matsumoto 
431a506f666SShuhei Matsumoto static void
432a506f666SShuhei Matsumoto free_dif_generate_copy_sequence_bufs(struct dif_task *task)
433a506f666SShuhei Matsumoto {
434a506f666SShuhei Matsumoto 	uint32_t i = 0;
435a506f666SShuhei Matsumoto 
436a506f666SShuhei Matsumoto 	if (task->dst_iovs != NULL) {
437a506f666SShuhei Matsumoto 		for (i = 0; i < task->dst_iovcnt; i++) {
438a506f666SShuhei Matsumoto 			if (task->dst_iovs[i].iov_base != NULL) {
439a506f666SShuhei Matsumoto 				spdk_dma_free(task->dst_iovs[i].iov_base);
440a506f666SShuhei Matsumoto 			}
441a506f666SShuhei Matsumoto 		}
442a506f666SShuhei Matsumoto 		free(task->dst_iovs);
443a506f666SShuhei Matsumoto 	}
444a506f666SShuhei Matsumoto 
445a506f666SShuhei Matsumoto 	if (task->src_iovs != NULL) {
446a506f666SShuhei Matsumoto 		for (i = 0; i < task->src_iovcnt; i++) {
447a506f666SShuhei Matsumoto 			if (task->src_iovs[i].iov_base != NULL) {
448a506f666SShuhei Matsumoto 				spdk_dma_free(task->src_iovs[i].iov_base);
449a506f666SShuhei Matsumoto 			}
450a506f666SShuhei Matsumoto 		}
451a506f666SShuhei Matsumoto 		free(task->src_iovs);
452a506f666SShuhei Matsumoto 	}
453a506f666SShuhei Matsumoto 
454a506f666SShuhei Matsumoto 	if (task->aux_iovs != NULL) {
455a506f666SShuhei Matsumoto 		for (i = 0; i < task->aux_iovcnt; i++) {
456a506f666SShuhei Matsumoto 			if (task->aux_iovs[i].iov_base != NULL) {
457a506f666SShuhei Matsumoto 				spdk_dma_free(task->aux_iovs[i].iov_base);
458a506f666SShuhei Matsumoto 			}
459a506f666SShuhei Matsumoto 		}
460a506f666SShuhei Matsumoto 		free(task->aux_iovs);
461a506f666SShuhei Matsumoto 	}
462a506f666SShuhei Matsumoto }
463a506f666SShuhei Matsumoto 
46459456660SKrzysztof Sprzaczkowski static void
46559456660SKrzysztof Sprzaczkowski accel_dif_verify_test(void *arg)
46659456660SKrzysztof Sprzaczkowski {
46759456660SKrzysztof Sprzaczkowski 	int rc;
46859456660SKrzysztof Sprzaczkowski 	struct accel_dif_request *req = arg;
46959456660SKrzysztof Sprzaczkowski 
47059456660SKrzysztof Sprzaczkowski 	g_completion_success = false;
47159456660SKrzysztof Sprzaczkowski 	rc = spdk_accel_submit_dif_verify(req->channel, req->src_iovs, req->src_iovcnt,
47259456660SKrzysztof Sprzaczkowski 					  req->num_blocks, req->ctx, req->err,
47359456660SKrzysztof Sprzaczkowski 					  req->cb_fn, req->cb_arg);
47459456660SKrzysztof Sprzaczkowski 	if (rc) {
47559456660SKrzysztof Sprzaczkowski 		wake_ut_thread();
47659456660SKrzysztof Sprzaczkowski 	}
47759456660SKrzysztof Sprzaczkowski }
47859456660SKrzysztof Sprzaczkowski 
479f62ac001SKrzysztof Sprzaczkowski static void
480a63a45fcSSlawomir Ptak accel_dix_verify_test(void *arg)
481a63a45fcSSlawomir Ptak {
482a63a45fcSSlawomir Ptak 	int rc;
483a63a45fcSSlawomir Ptak 	struct accel_dif_request *req = arg;
484a63a45fcSSlawomir Ptak 
485a63a45fcSSlawomir Ptak 	g_completion_success = false;
486a63a45fcSSlawomir Ptak 	rc = spdk_accel_submit_dix_verify(req->channel, req->src_iovs, req->src_iovcnt, req->md_iov,
487a63a45fcSSlawomir Ptak 					  req->num_blocks, req->ctx, req->err, req->cb_fn,
488a63a45fcSSlawomir Ptak 					  req->cb_arg);
489a63a45fcSSlawomir Ptak 	if (rc) {
490a63a45fcSSlawomir Ptak 		wake_ut_thread();
491a63a45fcSSlawomir Ptak 	}
492a63a45fcSSlawomir Ptak }
493a63a45fcSSlawomir Ptak 
494a63a45fcSSlawomir Ptak static void
495a63a45fcSSlawomir Ptak accel_dix_generate_test(void *arg)
496a63a45fcSSlawomir Ptak {
497a63a45fcSSlawomir Ptak 	int rc;
498a63a45fcSSlawomir Ptak 	struct accel_dif_request *req = arg;
499a63a45fcSSlawomir Ptak 
500a63a45fcSSlawomir Ptak 	g_completion_success = false;
501a63a45fcSSlawomir Ptak 	rc = spdk_accel_submit_dix_generate(req->channel, req->src_iovs, req->src_iovcnt,
502a63a45fcSSlawomir Ptak 					    req->md_iov, req->num_blocks, req->ctx, req->cb_fn, req->cb_arg);
503a63a45fcSSlawomir Ptak 	if (rc) {
504a63a45fcSSlawomir Ptak 		wake_ut_thread();
505a63a45fcSSlawomir Ptak 	}
506a63a45fcSSlawomir Ptak }
507a63a45fcSSlawomir Ptak 
508a63a45fcSSlawomir Ptak static void
509086cb8deSKrzysztof Sprzaczkowski accel_dif_verify_copy_test(void *arg)
510086cb8deSKrzysztof Sprzaczkowski {
511086cb8deSKrzysztof Sprzaczkowski 	int rc;
512086cb8deSKrzysztof Sprzaczkowski 	struct accel_dif_request *req = arg;
513086cb8deSKrzysztof Sprzaczkowski 
514086cb8deSKrzysztof Sprzaczkowski 	g_completion_success = false;
515086cb8deSKrzysztof Sprzaczkowski 	rc = spdk_accel_submit_dif_verify_copy(req->channel, req->dst_iovs, req->dst_iovcnt,
516086cb8deSKrzysztof Sprzaczkowski 					       req->src_iovs, req->src_iovcnt,
517086cb8deSKrzysztof Sprzaczkowski 					       req->num_blocks, req->ctx, req->err,
518086cb8deSKrzysztof Sprzaczkowski 					       req->cb_fn, req->cb_arg);
519086cb8deSKrzysztof Sprzaczkowski 	if (rc) {
520086cb8deSKrzysztof Sprzaczkowski 		wake_ut_thread();
521086cb8deSKrzysztof Sprzaczkowski 	}
522086cb8deSKrzysztof Sprzaczkowski }
523086cb8deSKrzysztof Sprzaczkowski 
524086cb8deSKrzysztof Sprzaczkowski static void
525f62ac001SKrzysztof Sprzaczkowski accel_dif_generate_copy_test(void *arg)
526f62ac001SKrzysztof Sprzaczkowski {
527f62ac001SKrzysztof Sprzaczkowski 	int rc;
528f62ac001SKrzysztof Sprzaczkowski 	struct accel_dif_request *req = arg;
529f62ac001SKrzysztof Sprzaczkowski 
530f62ac001SKrzysztof Sprzaczkowski 	g_completion_success = false;
531f62ac001SKrzysztof Sprzaczkowski 	rc = spdk_accel_submit_dif_generate_copy(req->channel, req->dst_iovs, req->dst_iovcnt,
532f62ac001SKrzysztof Sprzaczkowski 			req->src_iovs, req->src_iovcnt, req->num_blocks, req->ctx,
533f62ac001SKrzysztof Sprzaczkowski 			req->cb_fn, req->cb_arg);
534f62ac001SKrzysztof Sprzaczkowski 	if (rc) {
535f62ac001SKrzysztof Sprzaczkowski 		wake_ut_thread();
536f62ac001SKrzysztof Sprzaczkowski 	}
537f62ac001SKrzysztof Sprzaczkowski }
53859456660SKrzysztof Sprzaczkowski 
53959456660SKrzysztof Sprzaczkowski static void
540a506f666SShuhei Matsumoto accel_dif_generate_copy_sequence_test(void *arg)
541a506f666SShuhei Matsumoto {
542a506f666SShuhei Matsumoto 	int rc;
543a506f666SShuhei Matsumoto 	struct accel_dif_request *req = arg;
544a506f666SShuhei Matsumoto 
545a506f666SShuhei Matsumoto 	g_completion_success = false;
546a506f666SShuhei Matsumoto 	req->sequence = NULL;
547a506f666SShuhei Matsumoto 
548a506f666SShuhei Matsumoto 	rc = spdk_accel_append_dif_generate_copy(&req->sequence, req->channel,
549a506f666SShuhei Matsumoto 			req->aux_iovs, req->aux_iovcnt, NULL, NULL,
550a506f666SShuhei Matsumoto 			req->src_iovs, req->src_iovcnt, NULL, NULL,
551a506f666SShuhei Matsumoto 			req->num_blocks, req->ctx, NULL, NULL);
552a506f666SShuhei Matsumoto 	if (rc) {
553a506f666SShuhei Matsumoto 		wake_ut_thread();
554a506f666SShuhei Matsumoto 		return;
555a506f666SShuhei Matsumoto 	}
556a506f666SShuhei Matsumoto 
557a506f666SShuhei Matsumoto 	rc = spdk_accel_append_copy(&req->sequence, req->channel,
558a506f666SShuhei Matsumoto 				    req->dst_iovs, req->dst_iovcnt, NULL, NULL,
559a506f666SShuhei Matsumoto 				    req->aux_iovs, req->aux_iovcnt, NULL, NULL,
560a506f666SShuhei Matsumoto 				    NULL, NULL);
561a506f666SShuhei Matsumoto 	if (rc) {
562a506f666SShuhei Matsumoto 		spdk_accel_sequence_abort(req->sequence);
563a506f666SShuhei Matsumoto 		wake_ut_thread();
564a506f666SShuhei Matsumoto 		return;
565a506f666SShuhei Matsumoto 	}
566a506f666SShuhei Matsumoto 
567a506f666SShuhei Matsumoto 	spdk_accel_sequence_finish(req->sequence, req->cb_fn, req->cb_arg);
568a506f666SShuhei Matsumoto }
569a506f666SShuhei Matsumoto 
570a506f666SShuhei Matsumoto static void
571a506f666SShuhei Matsumoto accel_dif_verify_copy_sequence_test(void *arg)
572a506f666SShuhei Matsumoto {
573a506f666SShuhei Matsumoto 	int rc;
574a506f666SShuhei Matsumoto 	struct accel_dif_request *req = arg;
575a506f666SShuhei Matsumoto 
576a506f666SShuhei Matsumoto 	g_completion_success = false;
577a506f666SShuhei Matsumoto 	req->sequence = NULL;
578a506f666SShuhei Matsumoto 
579a506f666SShuhei Matsumoto 	rc = spdk_accel_append_dif_verify_copy(&req->sequence, req->channel,
580a506f666SShuhei Matsumoto 					       req->dst_iovs, req->dst_iovcnt, NULL, NULL,
581a506f666SShuhei Matsumoto 					       req->dst_iovs, req->dst_iovcnt, NULL, NULL,
582a506f666SShuhei Matsumoto 					       req->num_blocks, req->ctx, req->err,
583a506f666SShuhei Matsumoto 					       NULL, NULL);
584a506f666SShuhei Matsumoto 	if (rc) {
585a506f666SShuhei Matsumoto 		wake_ut_thread();
586a506f666SShuhei Matsumoto 		return;
587a506f666SShuhei Matsumoto 	}
588a506f666SShuhei Matsumoto 
589a506f666SShuhei Matsumoto 	rc = spdk_accel_append_copy(&req->sequence, req->channel,
590a506f666SShuhei Matsumoto 				    req->dst_iovs, req->dst_iovcnt, NULL, NULL,
591a506f666SShuhei Matsumoto 				    req->src_iovs, req->src_iovcnt, NULL, NULL,
592a506f666SShuhei Matsumoto 				    NULL, NULL);
593a506f666SShuhei Matsumoto 	if (rc) {
594a506f666SShuhei Matsumoto 		spdk_accel_sequence_abort(req->sequence);
595a506f666SShuhei Matsumoto 		wake_ut_thread();
596a506f666SShuhei Matsumoto 		return;
597a506f666SShuhei Matsumoto 	}
598a506f666SShuhei Matsumoto 
599a506f666SShuhei Matsumoto 	spdk_accel_sequence_reverse(req->sequence);
600a506f666SShuhei Matsumoto 	spdk_accel_sequence_finish(req->sequence, req->cb_fn, req->cb_arg);
601a506f666SShuhei Matsumoto }
602a506f666SShuhei Matsumoto 
603a506f666SShuhei Matsumoto static void
60459456660SKrzysztof Sprzaczkowski accel_dif_verify_op_dif_generated_do_check(uint32_t dif_flags)
60559456660SKrzysztof Sprzaczkowski {
60659456660SKrzysztof Sprzaczkowski 	struct spdk_dif_ctx_init_ext_opts dif_opts;
60759456660SKrzysztof Sprzaczkowski 	struct accel_dif_request req;
60859456660SKrzysztof Sprzaczkowski 	struct dif_task *task = &g_dif_task;
60959456660SKrzysztof Sprzaczkowski 	int rc;
61059456660SKrzysztof Sprzaczkowski 
61147494478SKrzysztof Sprzaczkowski 	rc = alloc_dif_verify_bufs(task, 1);
61247494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
61359456660SKrzysztof Sprzaczkowski 
61459456660SKrzysztof Sprzaczkowski 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
61559456660SKrzysztof Sprzaczkowski 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
61659456660SKrzysztof Sprzaczkowski 
61759456660SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
61859456660SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
61959456660SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
62059456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
62159456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_GUARD_CHECK |
62259456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_APPTAG_CHECK |
62359456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
62459456660SKrzysztof Sprzaczkowski 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
62547494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
62659456660SKrzysztof Sprzaczkowski 
62759456660SKrzysztof Sprzaczkowski 	rc = spdk_dif_generate(task->src_iovs, task->src_iovcnt, task->num_blocks, &task->dif_ctx);
62847494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
62959456660SKrzysztof Sprzaczkowski 
63059456660SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
63159456660SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
63259456660SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
63359456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
63459456660SKrzysztof Sprzaczkowski 			       dif_flags,
63559456660SKrzysztof Sprzaczkowski 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
63647494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
63759456660SKrzysztof Sprzaczkowski 
63859456660SKrzysztof Sprzaczkowski 	req.channel = g_channel;
63959456660SKrzysztof Sprzaczkowski 	req.src_iovs = task->src_iovs;
64059456660SKrzysztof Sprzaczkowski 	req.src_iovcnt = task->src_iovcnt;
64159456660SKrzysztof Sprzaczkowski 	req.num_blocks = task->num_blocks;
64259456660SKrzysztof Sprzaczkowski 	req.ctx = &task->dif_ctx;
64359456660SKrzysztof Sprzaczkowski 	req.err = &task->dif_err;
64459456660SKrzysztof Sprzaczkowski 	req.cb_fn = accel_dif_oper_done;
64559456660SKrzysztof Sprzaczkowski 	req.cb_arg = task;
64659456660SKrzysztof Sprzaczkowski 
64759456660SKrzysztof Sprzaczkowski 	execute_spdk_function(accel_dif_verify_test, &req);
64859456660SKrzysztof Sprzaczkowski 	CU_ASSERT_EQUAL(g_completion_success, true);
64959456660SKrzysztof Sprzaczkowski 
65047494478SKrzysztof Sprzaczkowski 	free_dif_verify_bufs(task);
65159456660SKrzysztof Sprzaczkowski }
65259456660SKrzysztof Sprzaczkowski 
65359456660SKrzysztof Sprzaczkowski static void
654a63a45fcSSlawomir Ptak accel_dix_generate_verify(struct accel_dif_request *req,
655a63a45fcSSlawomir Ptak 			  uint32_t dif_flags_generate, uint32_t dif_flags_verify)
656a63a45fcSSlawomir Ptak {
657a63a45fcSSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
658a63a45fcSSlawomir Ptak 	struct dif_task *task = &g_dif_task;
659a63a45fcSSlawomir Ptak 	int rc;
660a63a45fcSSlawomir Ptak 
661a63a45fcSSlawomir Ptak 	rc = alloc_dix_bufs(task, 1);
662a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
663a63a45fcSSlawomir Ptak 
664a63a45fcSSlawomir Ptak 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
665a63a45fcSSlawomir Ptak 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
666a63a45fcSSlawomir Ptak 
667a63a45fcSSlawomir Ptak 	rc = spdk_dif_ctx_init(&task->dif_ctx,
668a63a45fcSSlawomir Ptak 			       g_block_size_bytes,
669a63a45fcSSlawomir Ptak 			       g_md_size_bytes, false, true,
670a63a45fcSSlawomir Ptak 			       SPDK_DIF_TYPE1,
671a63a45fcSSlawomir Ptak 			       dif_flags_generate,
672a63a45fcSSlawomir Ptak 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
673a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
674a63a45fcSSlawomir Ptak 
675a63a45fcSSlawomir Ptak 	rc = spdk_dix_generate(task->src_iovs, task->src_iovcnt, &task->md_iov, task->num_blocks,
676a63a45fcSSlawomir Ptak 			       &task->dif_ctx);
677a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
678a63a45fcSSlawomir Ptak 
679a63a45fcSSlawomir Ptak 	rc = spdk_dif_ctx_init(&task->dif_ctx,
680a63a45fcSSlawomir Ptak 			       g_block_size_bytes,
681a63a45fcSSlawomir Ptak 			       g_md_size_bytes, false, true,
682a63a45fcSSlawomir Ptak 			       SPDK_DIF_TYPE1,
683a63a45fcSSlawomir Ptak 			       dif_flags_verify,
684a63a45fcSSlawomir Ptak 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
685a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
686a63a45fcSSlawomir Ptak 
687a63a45fcSSlawomir Ptak 	req->channel = g_channel;
688a63a45fcSSlawomir Ptak 	req->src_iovs = task->src_iovs;
689a63a45fcSSlawomir Ptak 	req->src_iovcnt = task->src_iovcnt;
690a63a45fcSSlawomir Ptak 	req->md_iov = &task->md_iov;
691a63a45fcSSlawomir Ptak 	req->num_blocks = task->num_blocks;
692a63a45fcSSlawomir Ptak 	req->ctx = &task->dif_ctx;
693a63a45fcSSlawomir Ptak 	req->err = &task->dif_err;
694a63a45fcSSlawomir Ptak 	req->cb_fn = accel_dif_oper_done;
695a63a45fcSSlawomir Ptak 	req->cb_arg = task;
696a63a45fcSSlawomir Ptak 
697a63a45fcSSlawomir Ptak 	execute_spdk_function(accel_dix_verify_test, req);
698a63a45fcSSlawomir Ptak 
699a63a45fcSSlawomir Ptak 	free_dix_bufs(task);
700a63a45fcSSlawomir Ptak }
701a63a45fcSSlawomir Ptak 
702a63a45fcSSlawomir Ptak static void
70359456660SKrzysztof Sprzaczkowski accel_dif_verify_op_dif_generated_guard_check(void)
70459456660SKrzysztof Sprzaczkowski {
70559456660SKrzysztof Sprzaczkowski 	accel_dif_verify_op_dif_generated_do_check(SPDK_DIF_FLAGS_GUARD_CHECK);
70659456660SKrzysztof Sprzaczkowski }
70759456660SKrzysztof Sprzaczkowski 
70859456660SKrzysztof Sprzaczkowski static void
70959456660SKrzysztof Sprzaczkowski accel_dif_verify_op_dif_generated_apptag_check(void)
71059456660SKrzysztof Sprzaczkowski {
71159456660SKrzysztof Sprzaczkowski 	accel_dif_verify_op_dif_generated_do_check(SPDK_DIF_FLAGS_APPTAG_CHECK);
71259456660SKrzysztof Sprzaczkowski }
71359456660SKrzysztof Sprzaczkowski 
71459456660SKrzysztof Sprzaczkowski static void
71559456660SKrzysztof Sprzaczkowski accel_dif_verify_op_dif_generated_reftag_check(void)
71659456660SKrzysztof Sprzaczkowski {
71759456660SKrzysztof Sprzaczkowski 	accel_dif_verify_op_dif_generated_do_check(SPDK_DIF_FLAGS_REFTAG_CHECK);
71859456660SKrzysztof Sprzaczkowski }
71959456660SKrzysztof Sprzaczkowski 
72059456660SKrzysztof Sprzaczkowski static void
721a63a45fcSSlawomir Ptak accel_dix_verify_op_dix_generated_guard_check(void)
722a63a45fcSSlawomir Ptak {
723a63a45fcSSlawomir Ptak 	struct accel_dif_request req;
724*f74d16beSSlawomir Ptak 	const char *module_name = NULL;
725*f74d16beSSlawomir Ptak 	int rc;
726*f74d16beSSlawomir Ptak 
727*f74d16beSSlawomir Ptak 	rc = spdk_accel_get_opc_module_name(SPDK_ACCEL_OPC_DIX_VERIFY, &module_name);
728*f74d16beSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
729*f74d16beSSlawomir Ptak 
730*f74d16beSSlawomir Ptak 	/* Intel DSA does not allow for selective DIF fields verification for DIX */
731*f74d16beSSlawomir Ptak 	if (!strcmp(module_name, "dsa")) {
732*f74d16beSSlawomir Ptak 		return;
733*f74d16beSSlawomir Ptak 	}
734*f74d16beSSlawomir Ptak 
735a63a45fcSSlawomir Ptak 	accel_dix_generate_verify(&req, SPDK_DIF_FLAGS_GUARD_CHECK |
736a63a45fcSSlawomir Ptak 				  SPDK_DIF_FLAGS_APPTAG_CHECK |
737a63a45fcSSlawomir Ptak 				  SPDK_DIF_FLAGS_REFTAG_CHECK, SPDK_DIF_FLAGS_GUARD_CHECK);
738a63a45fcSSlawomir Ptak 
739a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(g_completion_success, true);
740a63a45fcSSlawomir Ptak }
741a63a45fcSSlawomir Ptak 
742a63a45fcSSlawomir Ptak static void
743a63a45fcSSlawomir Ptak accel_dix_verify_op_dix_generated_apptag_check(void)
744a63a45fcSSlawomir Ptak {
745a63a45fcSSlawomir Ptak 	struct accel_dif_request req;
746*f74d16beSSlawomir Ptak 	const char *module_name = NULL;
747*f74d16beSSlawomir Ptak 	int rc;
748*f74d16beSSlawomir Ptak 
749*f74d16beSSlawomir Ptak 	rc = spdk_accel_get_opc_module_name(SPDK_ACCEL_OPC_DIX_VERIFY, &module_name);
750*f74d16beSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
751*f74d16beSSlawomir Ptak 
752*f74d16beSSlawomir Ptak 	/* Intel DSA does not allow for selective DIF fields verification for DIX */
753*f74d16beSSlawomir Ptak 	if (!strcmp(module_name, "dsa")) {
754*f74d16beSSlawomir Ptak 		return;
755*f74d16beSSlawomir Ptak 	}
756*f74d16beSSlawomir Ptak 
757a63a45fcSSlawomir Ptak 	accel_dix_generate_verify(&req, SPDK_DIF_FLAGS_GUARD_CHECK |
758a63a45fcSSlawomir Ptak 				  SPDK_DIF_FLAGS_APPTAG_CHECK |
759a63a45fcSSlawomir Ptak 				  SPDK_DIF_FLAGS_REFTAG_CHECK, SPDK_DIF_FLAGS_APPTAG_CHECK);
760a63a45fcSSlawomir Ptak 
761a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(g_completion_success, true);
762a63a45fcSSlawomir Ptak }
763a63a45fcSSlawomir Ptak 
764a63a45fcSSlawomir Ptak static void
765a63a45fcSSlawomir Ptak accel_dix_verify_op_dix_generated_reftag_check(void)
766a63a45fcSSlawomir Ptak {
767a63a45fcSSlawomir Ptak 	struct accel_dif_request req;
768*f74d16beSSlawomir Ptak 	const char *module_name = NULL;
769*f74d16beSSlawomir Ptak 	int rc;
770*f74d16beSSlawomir Ptak 
771*f74d16beSSlawomir Ptak 	rc = spdk_accel_get_opc_module_name(SPDK_ACCEL_OPC_DIX_VERIFY, &module_name);
772*f74d16beSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
773*f74d16beSSlawomir Ptak 
774*f74d16beSSlawomir Ptak 	/* Intel DSA does not allow for selective DIF fields verification for DIX */
775*f74d16beSSlawomir Ptak 	if (!strcmp(module_name, "dsa")) {
776*f74d16beSSlawomir Ptak 		return;
777*f74d16beSSlawomir Ptak 	}
778*f74d16beSSlawomir Ptak 
779a63a45fcSSlawomir Ptak 	accel_dix_generate_verify(&req, SPDK_DIF_FLAGS_GUARD_CHECK |
780a63a45fcSSlawomir Ptak 				  SPDK_DIF_FLAGS_APPTAG_CHECK |
781a63a45fcSSlawomir Ptak 				  SPDK_DIF_FLAGS_REFTAG_CHECK, SPDK_DIF_FLAGS_REFTAG_CHECK);
782a63a45fcSSlawomir Ptak 
783a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(g_completion_success, true);
784a63a45fcSSlawomir Ptak }
785a63a45fcSSlawomir Ptak 
786a63a45fcSSlawomir Ptak static void
787a63a45fcSSlawomir Ptak accel_dix_verify_op_dix_generated_all_flags_check(void)
788a63a45fcSSlawomir Ptak {
789a63a45fcSSlawomir Ptak 	struct accel_dif_request req;
790a63a45fcSSlawomir Ptak 	accel_dix_generate_verify(&req, SPDK_DIF_FLAGS_GUARD_CHECK |
791a63a45fcSSlawomir Ptak 				  SPDK_DIF_FLAGS_APPTAG_CHECK |
792a63a45fcSSlawomir Ptak 				  SPDK_DIF_FLAGS_REFTAG_CHECK,
793a63a45fcSSlawomir Ptak 				  SPDK_DIF_FLAGS_GUARD_CHECK |
794a63a45fcSSlawomir Ptak 				  SPDK_DIF_FLAGS_APPTAG_CHECK |
795a63a45fcSSlawomir Ptak 				  SPDK_DIF_FLAGS_REFTAG_CHECK);
796a63a45fcSSlawomir Ptak 
797a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(g_completion_success, true);
798a63a45fcSSlawomir Ptak }
799a63a45fcSSlawomir Ptak 
800a63a45fcSSlawomir Ptak static void
801a63a45fcSSlawomir Ptak accel_dix_verify_op_dix_not_generated_all_flags_check(void)
802a63a45fcSSlawomir Ptak {
803a63a45fcSSlawomir Ptak 	struct accel_dif_request req;
804a63a45fcSSlawomir Ptak 	accel_dix_generate_verify(&req, 0,
805a63a45fcSSlawomir Ptak 				  SPDK_DIF_FLAGS_GUARD_CHECK |
806a63a45fcSSlawomir Ptak 				  SPDK_DIF_FLAGS_APPTAG_CHECK |
807a63a45fcSSlawomir Ptak 				  SPDK_DIF_FLAGS_REFTAG_CHECK);
808a63a45fcSSlawomir Ptak 
809a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(g_completion_success, false);
810a63a45fcSSlawomir Ptak }
811a63a45fcSSlawomir Ptak 
812a63a45fcSSlawomir Ptak static void
81359456660SKrzysztof Sprzaczkowski accel_dif_verify_op_dif_not_generated_do_check(uint32_t dif_flags)
81459456660SKrzysztof Sprzaczkowski {
81559456660SKrzysztof Sprzaczkowski 	struct spdk_dif_ctx_init_ext_opts dif_opts;
81659456660SKrzysztof Sprzaczkowski 	struct accel_dif_request req;
81759456660SKrzysztof Sprzaczkowski 	struct dif_task *task = &g_dif_task;
81859456660SKrzysztof Sprzaczkowski 	int rc;
81959456660SKrzysztof Sprzaczkowski 
82047494478SKrzysztof Sprzaczkowski 	rc = alloc_dif_verify_bufs(task, 1);
82147494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
82259456660SKrzysztof Sprzaczkowski 
82359456660SKrzysztof Sprzaczkowski 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
82459456660SKrzysztof Sprzaczkowski 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
82559456660SKrzysztof Sprzaczkowski 
82659456660SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
82759456660SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
82859456660SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
82959456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
83059456660SKrzysztof Sprzaczkowski 			       dif_flags,
83159456660SKrzysztof Sprzaczkowski 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
83247494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
83359456660SKrzysztof Sprzaczkowski 
83459456660SKrzysztof Sprzaczkowski 	req.channel = g_channel;
83559456660SKrzysztof Sprzaczkowski 	req.src_iovs = task->src_iovs;
83659456660SKrzysztof Sprzaczkowski 	req.src_iovcnt = task->src_iovcnt;
83759456660SKrzysztof Sprzaczkowski 	req.num_blocks = task->num_blocks;
83859456660SKrzysztof Sprzaczkowski 	req.ctx = &task->dif_ctx;
83959456660SKrzysztof Sprzaczkowski 	req.err = &task->dif_err;
84059456660SKrzysztof Sprzaczkowski 	req.cb_fn = accel_dif_oper_done;
84159456660SKrzysztof Sprzaczkowski 	req.cb_arg = task;
84259456660SKrzysztof Sprzaczkowski 
84359456660SKrzysztof Sprzaczkowski 	execute_spdk_function(accel_dif_verify_test, &req);
84459456660SKrzysztof Sprzaczkowski 	CU_ASSERT_EQUAL(g_completion_success, false);
84547494478SKrzysztof Sprzaczkowski 	CU_ASSERT_EQUAL(accel_dif_error_validate(dif_flags, req.err), true);
84659456660SKrzysztof Sprzaczkowski 
84747494478SKrzysztof Sprzaczkowski 	free_dif_verify_bufs(task);
84859456660SKrzysztof Sprzaczkowski }
84959456660SKrzysztof Sprzaczkowski 
85059456660SKrzysztof Sprzaczkowski static void
85159456660SKrzysztof Sprzaczkowski accel_dif_verify_op_dif_not_generated_guard_check(void)
85259456660SKrzysztof Sprzaczkowski {
85359456660SKrzysztof Sprzaczkowski 	accel_dif_verify_op_dif_not_generated_do_check(SPDK_DIF_FLAGS_GUARD_CHECK);
85459456660SKrzysztof Sprzaczkowski }
85559456660SKrzysztof Sprzaczkowski 
85659456660SKrzysztof Sprzaczkowski static void
857a63a45fcSSlawomir Ptak accel_dix_verify_op_dix_not_generated_guard_check(void)
858a63a45fcSSlawomir Ptak {
859*f74d16beSSlawomir Ptak 	const char *module_name = NULL;
860a63a45fcSSlawomir Ptak 	uint32_t dif_flags_verify = SPDK_DIF_FLAGS_GUARD_CHECK;
861a63a45fcSSlawomir Ptak 	struct accel_dif_request req;
862*f74d16beSSlawomir Ptak 	int rc;
863*f74d16beSSlawomir Ptak 
864*f74d16beSSlawomir Ptak 	rc = spdk_accel_get_opc_module_name(SPDK_ACCEL_OPC_DIX_VERIFY, &module_name);
865*f74d16beSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
866*f74d16beSSlawomir Ptak 
867*f74d16beSSlawomir Ptak 	/* Intel DSA does not allow for selective DIF fields verification for DIX */
868*f74d16beSSlawomir Ptak 	if (!strcmp(module_name, "dsa")) {
869*f74d16beSSlawomir Ptak 		return;
870*f74d16beSSlawomir Ptak 	}
871a63a45fcSSlawomir Ptak 
872a63a45fcSSlawomir Ptak 	accel_dix_generate_verify(&req, 0, dif_flags_verify);
873a63a45fcSSlawomir Ptak 
874a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(g_completion_success, false);
875a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(accel_dif_error_validate(dif_flags_verify, req.err), true);
876a63a45fcSSlawomir Ptak }
877a63a45fcSSlawomir Ptak 
878a63a45fcSSlawomir Ptak static void
87959456660SKrzysztof Sprzaczkowski accel_dif_verify_op_dif_not_generated_apptag_check(void)
88059456660SKrzysztof Sprzaczkowski {
88159456660SKrzysztof Sprzaczkowski 	accel_dif_verify_op_dif_not_generated_do_check(SPDK_DIF_FLAGS_APPTAG_CHECK);
88259456660SKrzysztof Sprzaczkowski }
88359456660SKrzysztof Sprzaczkowski 
88459456660SKrzysztof Sprzaczkowski static void
885a63a45fcSSlawomir Ptak accel_dix_verify_op_dix_not_generated_apptag_check(void)
886a63a45fcSSlawomir Ptak {
887*f74d16beSSlawomir Ptak 	const char *module_name = NULL;
888a63a45fcSSlawomir Ptak 	uint32_t dif_flags_verify = SPDK_DIF_FLAGS_APPTAG_CHECK;
889a63a45fcSSlawomir Ptak 	struct accel_dif_request req;
890*f74d16beSSlawomir Ptak 	int rc;
891*f74d16beSSlawomir Ptak 
892*f74d16beSSlawomir Ptak 	rc = spdk_accel_get_opc_module_name(SPDK_ACCEL_OPC_DIX_VERIFY, &module_name);
893*f74d16beSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
894*f74d16beSSlawomir Ptak 
895*f74d16beSSlawomir Ptak 	/* Intel DSA does not allow for selective DIF fields verification for DIX */
896*f74d16beSSlawomir Ptak 	if (!strcmp(module_name, "dsa")) {
897*f74d16beSSlawomir Ptak 		return;
898*f74d16beSSlawomir Ptak 	}
899a63a45fcSSlawomir Ptak 
900a63a45fcSSlawomir Ptak 	accel_dix_generate_verify(&req, 0, dif_flags_verify);
901a63a45fcSSlawomir Ptak 
902a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(g_completion_success, false);
903a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(accel_dif_error_validate(dif_flags_verify, req.err), true);
904a63a45fcSSlawomir Ptak }
905a63a45fcSSlawomir Ptak 
906a63a45fcSSlawomir Ptak static void
90759456660SKrzysztof Sprzaczkowski accel_dif_verify_op_dif_not_generated_reftag_check(void)
90859456660SKrzysztof Sprzaczkowski {
90959456660SKrzysztof Sprzaczkowski 	accel_dif_verify_op_dif_not_generated_do_check(SPDK_DIF_FLAGS_REFTAG_CHECK);
91059456660SKrzysztof Sprzaczkowski }
91159456660SKrzysztof Sprzaczkowski 
91259456660SKrzysztof Sprzaczkowski static void
913a63a45fcSSlawomir Ptak accel_dix_verify_op_dix_not_generated_reftag_check(void)
914a63a45fcSSlawomir Ptak {
915*f74d16beSSlawomir Ptak 	const char *module_name = NULL;
916a63a45fcSSlawomir Ptak 	uint32_t dif_flags_verify = SPDK_DIF_FLAGS_REFTAG_CHECK;
917a63a45fcSSlawomir Ptak 	struct accel_dif_request req;
918*f74d16beSSlawomir Ptak 	int rc;
919*f74d16beSSlawomir Ptak 
920*f74d16beSSlawomir Ptak 	rc = spdk_accel_get_opc_module_name(SPDK_ACCEL_OPC_DIX_VERIFY, &module_name);
921*f74d16beSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
922*f74d16beSSlawomir Ptak 
923*f74d16beSSlawomir Ptak 	/* Intel DSA does not allow for selective DIF fields verification for DIX */
924*f74d16beSSlawomir Ptak 	if (!strcmp(module_name, "dsa")) {
925*f74d16beSSlawomir Ptak 		return;
926*f74d16beSSlawomir Ptak 	}
927a63a45fcSSlawomir Ptak 
928a63a45fcSSlawomir Ptak 	accel_dix_generate_verify(&req, 0, dif_flags_verify);
929a63a45fcSSlawomir Ptak 
930a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(g_completion_success, false);
931a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(accel_dif_error_validate(dif_flags_verify, req.err), true);
932a63a45fcSSlawomir Ptak }
933a63a45fcSSlawomir Ptak 
934a63a45fcSSlawomir Ptak static void
935*f74d16beSSlawomir Ptak accel_dix_verify_op_dix_guard_not_generated_all_flags_check(void)
936*f74d16beSSlawomir Ptak {
937*f74d16beSSlawomir Ptak 	struct accel_dif_request req;
938*f74d16beSSlawomir Ptak 	accel_dix_generate_verify(&req,
939*f74d16beSSlawomir Ptak 				  SPDK_DIF_FLAGS_APPTAG_CHECK |
940*f74d16beSSlawomir Ptak 				  SPDK_DIF_FLAGS_REFTAG_CHECK,
941*f74d16beSSlawomir Ptak 				  SPDK_DIF_FLAGS_GUARD_CHECK |
942*f74d16beSSlawomir Ptak 				  SPDK_DIF_FLAGS_APPTAG_CHECK |
943*f74d16beSSlawomir Ptak 				  SPDK_DIF_FLAGS_REFTAG_CHECK);
944*f74d16beSSlawomir Ptak 
945*f74d16beSSlawomir Ptak 	CU_ASSERT_EQUAL(g_completion_success, false);
946*f74d16beSSlawomir Ptak 	CU_ASSERT_EQUAL(accel_dif_error_validate(SPDK_DIF_FLAGS_GUARD_CHECK, req.err), true);
947*f74d16beSSlawomir Ptak }
948*f74d16beSSlawomir Ptak 
949*f74d16beSSlawomir Ptak static void
950*f74d16beSSlawomir Ptak accel_dix_verify_op_dix_apptag_not_generated_all_flags_check(void)
951*f74d16beSSlawomir Ptak {
952*f74d16beSSlawomir Ptak 	struct accel_dif_request req;
953*f74d16beSSlawomir Ptak 	accel_dix_generate_verify(&req,
954*f74d16beSSlawomir Ptak 				  SPDK_DIF_FLAGS_GUARD_CHECK |
955*f74d16beSSlawomir Ptak 				  SPDK_DIF_FLAGS_REFTAG_CHECK,
956*f74d16beSSlawomir Ptak 				  SPDK_DIF_FLAGS_GUARD_CHECK |
957*f74d16beSSlawomir Ptak 				  SPDK_DIF_FLAGS_APPTAG_CHECK |
958*f74d16beSSlawomir Ptak 				  SPDK_DIF_FLAGS_REFTAG_CHECK);
959*f74d16beSSlawomir Ptak 
960*f74d16beSSlawomir Ptak 	CU_ASSERT_EQUAL(g_completion_success, false);
961*f74d16beSSlawomir Ptak 	CU_ASSERT_EQUAL(accel_dif_error_validate(SPDK_DIF_FLAGS_APPTAG_CHECK, req.err), true);
962*f74d16beSSlawomir Ptak }
963*f74d16beSSlawomir Ptak 
964*f74d16beSSlawomir Ptak static void
965*f74d16beSSlawomir Ptak accel_dix_verify_op_dix_reftag_not_generated_all_flags_check(void)
966*f74d16beSSlawomir Ptak {
967*f74d16beSSlawomir Ptak 	struct accel_dif_request req;
968*f74d16beSSlawomir Ptak 	accel_dix_generate_verify(&req,
969*f74d16beSSlawomir Ptak 				  SPDK_DIF_FLAGS_GUARD_CHECK |
970*f74d16beSSlawomir Ptak 				  SPDK_DIF_FLAGS_APPTAG_CHECK,
971*f74d16beSSlawomir Ptak 				  SPDK_DIF_FLAGS_GUARD_CHECK |
972*f74d16beSSlawomir Ptak 				  SPDK_DIF_FLAGS_APPTAG_CHECK |
973*f74d16beSSlawomir Ptak 				  SPDK_DIF_FLAGS_REFTAG_CHECK);
974*f74d16beSSlawomir Ptak 
975*f74d16beSSlawomir Ptak 	CU_ASSERT_EQUAL(g_completion_success, false);
976*f74d16beSSlawomir Ptak 	CU_ASSERT_EQUAL(accel_dif_error_validate(SPDK_DIF_FLAGS_REFTAG_CHECK, req.err), true);
977*f74d16beSSlawomir Ptak }
978*f74d16beSSlawomir Ptak 
979*f74d16beSSlawomir Ptak static void
98059456660SKrzysztof Sprzaczkowski accel_dif_verify_op_apptag_correct_apptag_check(void)
98159456660SKrzysztof Sprzaczkowski {
98259456660SKrzysztof Sprzaczkowski 	struct spdk_dif_ctx_init_ext_opts dif_opts;
98359456660SKrzysztof Sprzaczkowski 	struct accel_dif_request req;
98459456660SKrzysztof Sprzaczkowski 	struct dif_task *task = &g_dif_task;
98559456660SKrzysztof Sprzaczkowski 	int rc;
98659456660SKrzysztof Sprzaczkowski 
98747494478SKrzysztof Sprzaczkowski 	rc = alloc_dif_verify_bufs(task, 1);
98847494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
98959456660SKrzysztof Sprzaczkowski 
99059456660SKrzysztof Sprzaczkowski 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
99159456660SKrzysztof Sprzaczkowski 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
99259456660SKrzysztof Sprzaczkowski 
99359456660SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
99459456660SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
99559456660SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
99659456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
99759456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_APPTAG_CHECK,
99859456660SKrzysztof Sprzaczkowski 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
99947494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
100059456660SKrzysztof Sprzaczkowski 
100159456660SKrzysztof Sprzaczkowski 	rc = spdk_dif_generate(task->src_iovs, task->src_iovcnt, task->num_blocks, &task->dif_ctx);
100247494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
100359456660SKrzysztof Sprzaczkowski 
100459456660SKrzysztof Sprzaczkowski 	req.channel = g_channel;
100559456660SKrzysztof Sprzaczkowski 	req.src_iovs = task->src_iovs;
100659456660SKrzysztof Sprzaczkowski 	req.src_iovcnt = task->src_iovcnt;
100759456660SKrzysztof Sprzaczkowski 	req.num_blocks = task->num_blocks;
100859456660SKrzysztof Sprzaczkowski 	req.ctx = &task->dif_ctx;
100959456660SKrzysztof Sprzaczkowski 	req.err = &task->dif_err;
101059456660SKrzysztof Sprzaczkowski 	req.cb_fn = accel_dif_oper_done;
101159456660SKrzysztof Sprzaczkowski 	req.cb_arg = task;
101259456660SKrzysztof Sprzaczkowski 
101359456660SKrzysztof Sprzaczkowski 	execute_spdk_function(accel_dif_verify_test, &req);
101459456660SKrzysztof Sprzaczkowski 	CU_ASSERT_EQUAL(g_completion_success, true);
101559456660SKrzysztof Sprzaczkowski 
101647494478SKrzysztof Sprzaczkowski 	free_dif_verify_bufs(task);
101759456660SKrzysztof Sprzaczkowski }
101859456660SKrzysztof Sprzaczkowski 
101959456660SKrzysztof Sprzaczkowski static void
1020a63a45fcSSlawomir Ptak accel_dix_verify_op_apptag_correct_apptag_check(void)
1021a63a45fcSSlawomir Ptak {
1022*f74d16beSSlawomir Ptak 	const char *module_name = NULL;
1023a63a45fcSSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
1024a63a45fcSSlawomir Ptak 	struct accel_dif_request req;
1025a63a45fcSSlawomir Ptak 	struct dif_task *task = &g_dif_task;
1026a63a45fcSSlawomir Ptak 	int rc;
1027a63a45fcSSlawomir Ptak 
1028*f74d16beSSlawomir Ptak 	rc = spdk_accel_get_opc_module_name(SPDK_ACCEL_OPC_DIX_VERIFY, &module_name);
1029*f74d16beSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1030*f74d16beSSlawomir Ptak 
1031*f74d16beSSlawomir Ptak 	/* Intel DSA does not allow for selective DIF fields verification for DIX */
1032*f74d16beSSlawomir Ptak 	if (!strcmp(module_name, "dsa")) {
1033*f74d16beSSlawomir Ptak 		return;
1034*f74d16beSSlawomir Ptak 	}
1035*f74d16beSSlawomir Ptak 
1036a63a45fcSSlawomir Ptak 	rc = alloc_dix_bufs(task, 1);
1037a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1038a63a45fcSSlawomir Ptak 
1039a63a45fcSSlawomir Ptak 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
1040a63a45fcSSlawomir Ptak 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
1041a63a45fcSSlawomir Ptak 
1042a63a45fcSSlawomir Ptak 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1043a63a45fcSSlawomir Ptak 			       g_block_size_bytes,
1044a63a45fcSSlawomir Ptak 			       g_md_size_bytes, false, true,
1045a63a45fcSSlawomir Ptak 			       SPDK_DIF_TYPE1,
1046a63a45fcSSlawomir Ptak 			       SPDK_DIF_FLAGS_APPTAG_CHECK,
1047a63a45fcSSlawomir Ptak 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
1048a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1049a63a45fcSSlawomir Ptak 
1050a63a45fcSSlawomir Ptak 	rc = spdk_dix_generate(task->src_iovs, task->src_iovcnt, &task->md_iov, task->num_blocks,
1051a63a45fcSSlawomir Ptak 			       &task->dif_ctx);
1052a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1053a63a45fcSSlawomir Ptak 
1054a63a45fcSSlawomir Ptak 	req.channel = g_channel;
1055a63a45fcSSlawomir Ptak 	req.src_iovs = task->src_iovs;
1056a63a45fcSSlawomir Ptak 	req.src_iovcnt = task->src_iovcnt;
1057a63a45fcSSlawomir Ptak 	req.md_iov = &task->md_iov;
1058a63a45fcSSlawomir Ptak 	req.num_blocks = task->num_blocks;
1059a63a45fcSSlawomir Ptak 	req.ctx = &task->dif_ctx;
1060a63a45fcSSlawomir Ptak 	req.err = &task->dif_err;
1061a63a45fcSSlawomir Ptak 	req.cb_fn = accel_dif_oper_done;
1062a63a45fcSSlawomir Ptak 	req.cb_arg = task;
1063a63a45fcSSlawomir Ptak 
1064a63a45fcSSlawomir Ptak 	execute_spdk_function(accel_dix_verify_test, &req);
1065a63a45fcSSlawomir Ptak 
1066a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(g_completion_success, true);
1067a63a45fcSSlawomir Ptak 
1068a63a45fcSSlawomir Ptak 	free_dix_bufs(task);
1069a63a45fcSSlawomir Ptak }
1070a63a45fcSSlawomir Ptak 
1071a63a45fcSSlawomir Ptak static void
107259456660SKrzysztof Sprzaczkowski accel_dif_verify_op_apptag_incorrect_apptag_check(void)
107359456660SKrzysztof Sprzaczkowski {
107459456660SKrzysztof Sprzaczkowski 	struct spdk_dif_ctx_init_ext_opts dif_opts;
107559456660SKrzysztof Sprzaczkowski 	struct accel_dif_request req;
107659456660SKrzysztof Sprzaczkowski 	struct dif_task *task = &g_dif_task;
107759456660SKrzysztof Sprzaczkowski 	int rc;
107859456660SKrzysztof Sprzaczkowski 
107947494478SKrzysztof Sprzaczkowski 	rc = alloc_dif_verify_bufs(task, 1);
108047494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
108159456660SKrzysztof Sprzaczkowski 
108259456660SKrzysztof Sprzaczkowski 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
108359456660SKrzysztof Sprzaczkowski 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
108459456660SKrzysztof Sprzaczkowski 
108559456660SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
108659456660SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
108759456660SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
108859456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
108959456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_APPTAG_CHECK,
109059456660SKrzysztof Sprzaczkowski 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
109147494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
109259456660SKrzysztof Sprzaczkowski 
109359456660SKrzysztof Sprzaczkowski 	rc = spdk_dif_generate(task->src_iovs, task->src_iovcnt, task->num_blocks, &task->dif_ctx);
109447494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
109559456660SKrzysztof Sprzaczkowski 
109659456660SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
109759456660SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
109859456660SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
109959456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
110059456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_APPTAG_CHECK,
110159456660SKrzysztof Sprzaczkowski 			       30, 0xFFFF, 40, 0, 0, &dif_opts);
110247494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
110359456660SKrzysztof Sprzaczkowski 
110459456660SKrzysztof Sprzaczkowski 	req.channel = g_channel;
110559456660SKrzysztof Sprzaczkowski 	req.src_iovs = task->src_iovs;
110659456660SKrzysztof Sprzaczkowski 	req.src_iovcnt = task->src_iovcnt;
110759456660SKrzysztof Sprzaczkowski 	req.num_blocks = task->num_blocks;
110859456660SKrzysztof Sprzaczkowski 	req.ctx = &task->dif_ctx;
110959456660SKrzysztof Sprzaczkowski 	req.err = &task->dif_err;
111059456660SKrzysztof Sprzaczkowski 	req.cb_fn = accel_dif_oper_done;
111159456660SKrzysztof Sprzaczkowski 	req.cb_arg = task;
111259456660SKrzysztof Sprzaczkowski 
111359456660SKrzysztof Sprzaczkowski 	execute_spdk_function(accel_dif_verify_test, &req);
111459456660SKrzysztof Sprzaczkowski 	CU_ASSERT_EQUAL(g_completion_success, false);
111559456660SKrzysztof Sprzaczkowski 
111647494478SKrzysztof Sprzaczkowski 	free_dif_verify_bufs(task);
111759456660SKrzysztof Sprzaczkowski }
111859456660SKrzysztof Sprzaczkowski 
111959456660SKrzysztof Sprzaczkowski static void
1120a63a45fcSSlawomir Ptak accel_dix_verify_op_apptag_incorrect_apptag_check(void)
1121a63a45fcSSlawomir Ptak {
1122a63a45fcSSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
1123a63a45fcSSlawomir Ptak 	struct accel_dif_request req;
1124a63a45fcSSlawomir Ptak 	struct dif_task *task = &g_dif_task;
1125a63a45fcSSlawomir Ptak 	int rc;
1126a63a45fcSSlawomir Ptak 
1127a63a45fcSSlawomir Ptak 	rc = alloc_dix_bufs(task, 1);
1128a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1129a63a45fcSSlawomir Ptak 
1130a63a45fcSSlawomir Ptak 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
1131a63a45fcSSlawomir Ptak 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
1132a63a45fcSSlawomir Ptak 
1133a63a45fcSSlawomir Ptak 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1134a63a45fcSSlawomir Ptak 			       g_block_size_bytes,
1135a63a45fcSSlawomir Ptak 			       g_md_size_bytes, false, true,
1136a63a45fcSSlawomir Ptak 			       SPDK_DIF_TYPE1,
1137a63a45fcSSlawomir Ptak 			       SPDK_DIF_FLAGS_APPTAG_CHECK,
1138a63a45fcSSlawomir Ptak 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
1139a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1140a63a45fcSSlawomir Ptak 
1141a63a45fcSSlawomir Ptak 	rc = spdk_dix_generate(task->src_iovs, task->src_iovcnt, &task->md_iov, task->num_blocks,
1142a63a45fcSSlawomir Ptak 			       &task->dif_ctx);
1143a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1144a63a45fcSSlawomir Ptak 
1145a63a45fcSSlawomir Ptak 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1146a63a45fcSSlawomir Ptak 			       g_block_size_bytes,
1147a63a45fcSSlawomir Ptak 			       g_md_size_bytes, false, true,
1148a63a45fcSSlawomir Ptak 			       SPDK_DIF_TYPE1,
1149a63a45fcSSlawomir Ptak 			       SPDK_DIF_FLAGS_APPTAG_CHECK,
1150a63a45fcSSlawomir Ptak 			       30, 0xFFFF, 40, 0, 0, &dif_opts);
1151a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1152a63a45fcSSlawomir Ptak 
1153a63a45fcSSlawomir Ptak 	req.channel = g_channel;
1154a63a45fcSSlawomir Ptak 	req.src_iovs = task->src_iovs;
1155a63a45fcSSlawomir Ptak 	req.src_iovcnt = task->src_iovcnt;
1156a63a45fcSSlawomir Ptak 	req.md_iov = &task->md_iov;
1157a63a45fcSSlawomir Ptak 	req.num_blocks = task->num_blocks;
1158a63a45fcSSlawomir Ptak 	req.ctx = &task->dif_ctx;
1159a63a45fcSSlawomir Ptak 	req.err = &task->dif_err;
1160a63a45fcSSlawomir Ptak 	req.cb_fn = accel_dif_oper_done;
1161a63a45fcSSlawomir Ptak 	req.cb_arg = task;
1162a63a45fcSSlawomir Ptak 
1163a63a45fcSSlawomir Ptak 	execute_spdk_function(accel_dix_verify_test, &req);
1164a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(g_completion_success, false);
1165a63a45fcSSlawomir Ptak 
1166a63a45fcSSlawomir Ptak 	free_dix_bufs(task);
1167a63a45fcSSlawomir Ptak }
1168a63a45fcSSlawomir Ptak 
1169a63a45fcSSlawomir Ptak static void
117059456660SKrzysztof Sprzaczkowski accel_dif_verify_op_tag_incorrect_no_check_or_ignore(uint32_t dif_flags)
117159456660SKrzysztof Sprzaczkowski {
117259456660SKrzysztof Sprzaczkowski 	struct spdk_dif_ctx_init_ext_opts dif_opts;
117359456660SKrzysztof Sprzaczkowski 	struct accel_dif_request req;
117459456660SKrzysztof Sprzaczkowski 	struct dif_task *task = &g_dif_task;
117559456660SKrzysztof Sprzaczkowski 	int rc;
117659456660SKrzysztof Sprzaczkowski 
117747494478SKrzysztof Sprzaczkowski 	rc = alloc_dif_verify_bufs(task, 1);
117847494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
117959456660SKrzysztof Sprzaczkowski 
118059456660SKrzysztof Sprzaczkowski 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
118159456660SKrzysztof Sprzaczkowski 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
118259456660SKrzysztof Sprzaczkowski 
118359456660SKrzysztof Sprzaczkowski 	/* For set 'Application Tag F Detect' (Source DIF Flags)
118459456660SKrzysztof Sprzaczkowski 	 * When all bits of the Application Tag field of the source Data Integrity Field
118559456660SKrzysztof Sprzaczkowski 	 * are equal to 1, the Application Tag check is not done and the Guard field and
118659456660SKrzysztof Sprzaczkowski 	 * Reference Tag field are ignored. */
118759456660SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
118859456660SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
118959456660SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
119059456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
119159456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_GUARD_CHECK |
119259456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_APPTAG_CHECK |
119359456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
119459456660SKrzysztof Sprzaczkowski 			       10, 0xFFFF, 0xFFFF, 0, 0, &dif_opts);
119547494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
119659456660SKrzysztof Sprzaczkowski 
119759456660SKrzysztof Sprzaczkowski 	rc = spdk_dif_generate(task->src_iovs, task->src_iovcnt, task->num_blocks, &task->dif_ctx);
119847494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
119959456660SKrzysztof Sprzaczkowski 
120059456660SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
120159456660SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
120259456660SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
120359456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
120459456660SKrzysztof Sprzaczkowski 			       dif_flags,
120559456660SKrzysztof Sprzaczkowski 			       30, 0xFFFF, 40, 0, 0, &dif_opts);
120647494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
120759456660SKrzysztof Sprzaczkowski 
120859456660SKrzysztof Sprzaczkowski 	req.channel = g_channel;
120959456660SKrzysztof Sprzaczkowski 	req.src_iovs = task->src_iovs;
121059456660SKrzysztof Sprzaczkowski 	req.src_iovcnt = task->src_iovcnt;
121159456660SKrzysztof Sprzaczkowski 	req.num_blocks = task->num_blocks;
121259456660SKrzysztof Sprzaczkowski 	req.ctx = &task->dif_ctx;
121359456660SKrzysztof Sprzaczkowski 	req.err = &task->dif_err;
121459456660SKrzysztof Sprzaczkowski 	req.cb_fn = accel_dif_oper_done;
121559456660SKrzysztof Sprzaczkowski 	req.cb_arg = task;
121659456660SKrzysztof Sprzaczkowski 
121759456660SKrzysztof Sprzaczkowski 	execute_spdk_function(accel_dif_verify_test, &req);
121859456660SKrzysztof Sprzaczkowski 	CU_ASSERT_EQUAL(g_completion_success, true);
121959456660SKrzysztof Sprzaczkowski 
122047494478SKrzysztof Sprzaczkowski 	free_dif_verify_bufs(task);
122159456660SKrzysztof Sprzaczkowski }
122259456660SKrzysztof Sprzaczkowski 
122359456660SKrzysztof Sprzaczkowski static void
1224a63a45fcSSlawomir Ptak accel_dix_verify_op_tag_incorrect_no_check_or_ignore(uint32_t dif_flags)
1225a63a45fcSSlawomir Ptak {
1226*f74d16beSSlawomir Ptak 	const char *module_name = NULL;
1227a63a45fcSSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
1228a63a45fcSSlawomir Ptak 	struct accel_dif_request req;
1229a63a45fcSSlawomir Ptak 	struct dif_task *task = &g_dif_task;
1230a63a45fcSSlawomir Ptak 	int rc;
1231a63a45fcSSlawomir Ptak 
1232*f74d16beSSlawomir Ptak 	rc = spdk_accel_get_opc_module_name(SPDK_ACCEL_OPC_DIX_VERIFY, &module_name);
1233*f74d16beSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1234*f74d16beSSlawomir Ptak 
1235*f74d16beSSlawomir Ptak 	/* Intel DSA does not allow for selective DIF fields verify for DIX */
1236*f74d16beSSlawomir Ptak 	if (!strcmp(module_name, "dsa") && (dif_flags != (SPDK_DIF_FLAGS_GUARD_CHECK |
1237*f74d16beSSlawomir Ptak 					    SPDK_DIF_FLAGS_APPTAG_CHECK |
1238*f74d16beSSlawomir Ptak 					    SPDK_DIF_FLAGS_REFTAG_CHECK))) {
1239*f74d16beSSlawomir Ptak 		return;
1240*f74d16beSSlawomir Ptak 	}
1241*f74d16beSSlawomir Ptak 
1242a63a45fcSSlawomir Ptak 	rc = alloc_dix_bufs(task, 1);
1243a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1244a63a45fcSSlawomir Ptak 
1245a63a45fcSSlawomir Ptak 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
1246a63a45fcSSlawomir Ptak 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
1247a63a45fcSSlawomir Ptak 
1248a63a45fcSSlawomir Ptak 	/* For set 'Application Tag F Detect' (Source DIF Flags)
1249a63a45fcSSlawomir Ptak 	 * When all bits of the Application Tag field of the source Data Integrity Field
1250a63a45fcSSlawomir Ptak 	 * are equal to 1, the Application Tag check is not done and the Guard field and
1251a63a45fcSSlawomir Ptak 	 * Reference Tag field are ignored. */
1252a63a45fcSSlawomir Ptak 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1253a63a45fcSSlawomir Ptak 			       g_block_size_bytes,
1254a63a45fcSSlawomir Ptak 			       g_md_size_bytes, false, true,
1255a63a45fcSSlawomir Ptak 			       SPDK_DIF_TYPE1,
1256a63a45fcSSlawomir Ptak 			       SPDK_DIF_FLAGS_GUARD_CHECK |
1257a63a45fcSSlawomir Ptak 			       SPDK_DIF_FLAGS_APPTAG_CHECK |
1258a63a45fcSSlawomir Ptak 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
1259a63a45fcSSlawomir Ptak 			       10, 0xFFFF, 0xFFFF, 0, 0, &dif_opts);
1260a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1261a63a45fcSSlawomir Ptak 
1262a63a45fcSSlawomir Ptak 	rc = spdk_dix_generate(task->src_iovs, task->src_iovcnt, &task->md_iov, task->num_blocks,
1263a63a45fcSSlawomir Ptak 			       &task->dif_ctx);
1264a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1265a63a45fcSSlawomir Ptak 
1266a63a45fcSSlawomir Ptak 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1267a63a45fcSSlawomir Ptak 			       g_block_size_bytes,
1268a63a45fcSSlawomir Ptak 			       g_md_size_bytes, false, true,
1269a63a45fcSSlawomir Ptak 			       SPDK_DIF_TYPE1,
1270a63a45fcSSlawomir Ptak 			       dif_flags,
1271a63a45fcSSlawomir Ptak 			       30, 0xFFFF, 40, 0, 0, &dif_opts);
1272a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1273a63a45fcSSlawomir Ptak 
1274a63a45fcSSlawomir Ptak 	req.channel = g_channel;
1275a63a45fcSSlawomir Ptak 	req.src_iovs = task->src_iovs;
1276a63a45fcSSlawomir Ptak 	req.src_iovcnt = task->src_iovcnt;
1277a63a45fcSSlawomir Ptak 	req.md_iov = &task->md_iov;
1278a63a45fcSSlawomir Ptak 	req.num_blocks = task->num_blocks;
1279a63a45fcSSlawomir Ptak 	req.ctx = &task->dif_ctx;
1280a63a45fcSSlawomir Ptak 	req.err = &task->dif_err;
1281a63a45fcSSlawomir Ptak 	req.cb_fn = accel_dif_oper_done;
1282a63a45fcSSlawomir Ptak 	req.cb_arg = task;
1283a63a45fcSSlawomir Ptak 
1284a63a45fcSSlawomir Ptak 	execute_spdk_function(accel_dix_verify_test, &req);
1285a63a45fcSSlawomir Ptak 
1286a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(g_completion_success, true);
1287a63a45fcSSlawomir Ptak 
1288a63a45fcSSlawomir Ptak 	free_dix_bufs(task);
1289a63a45fcSSlawomir Ptak }
1290a63a45fcSSlawomir Ptak 
1291a63a45fcSSlawomir Ptak static void
129259456660SKrzysztof Sprzaczkowski accel_dif_verify_op_apptag_incorrect_no_apptag_check(void)
129359456660SKrzysztof Sprzaczkowski {
129459456660SKrzysztof Sprzaczkowski 	accel_dif_verify_op_tag_incorrect_no_check_or_ignore(SPDK_DIF_FLAGS_APPTAG_CHECK);
129559456660SKrzysztof Sprzaczkowski }
129659456660SKrzysztof Sprzaczkowski 
129759456660SKrzysztof Sprzaczkowski static void
1298a63a45fcSSlawomir Ptak accel_dix_verify_op_apptag_incorrect_no_apptag_check(void)
1299a63a45fcSSlawomir Ptak {
1300a63a45fcSSlawomir Ptak 	accel_dix_verify_op_tag_incorrect_no_check_or_ignore(SPDK_DIF_FLAGS_APPTAG_CHECK);
1301a63a45fcSSlawomir Ptak }
1302a63a45fcSSlawomir Ptak 
1303a63a45fcSSlawomir Ptak static void
130459456660SKrzysztof Sprzaczkowski accel_dif_verify_op_reftag_incorrect_reftag_ignore(void)
130559456660SKrzysztof Sprzaczkowski {
130659456660SKrzysztof Sprzaczkowski 	accel_dif_verify_op_tag_incorrect_no_check_or_ignore(SPDK_DIF_FLAGS_REFTAG_CHECK);
130759456660SKrzysztof Sprzaczkowski }
130859456660SKrzysztof Sprzaczkowski 
130959456660SKrzysztof Sprzaczkowski static void
1310a63a45fcSSlawomir Ptak accel_dix_verify_op_reftag_incorrect_reftag_ignore(void)
1311a63a45fcSSlawomir Ptak {
1312a63a45fcSSlawomir Ptak 	accel_dix_verify_op_tag_incorrect_no_check_or_ignore(SPDK_DIF_FLAGS_REFTAG_CHECK);
1313a63a45fcSSlawomir Ptak }
1314a63a45fcSSlawomir Ptak 
1315a63a45fcSSlawomir Ptak static void
131659456660SKrzysztof Sprzaczkowski accel_dif_verify_op_reftag_init_correct_reftag_check(void)
131759456660SKrzysztof Sprzaczkowski {
131859456660SKrzysztof Sprzaczkowski 	struct spdk_dif_ctx_init_ext_opts dif_opts;
131959456660SKrzysztof Sprzaczkowski 	struct accel_dif_request req;
132059456660SKrzysztof Sprzaczkowski 	struct dif_task *task = &g_dif_task;
132159456660SKrzysztof Sprzaczkowski 	int rc;
132259456660SKrzysztof Sprzaczkowski 
132347494478SKrzysztof Sprzaczkowski 	rc = alloc_dif_verify_bufs(task, 2);
132447494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
132559456660SKrzysztof Sprzaczkowski 
132659456660SKrzysztof Sprzaczkowski 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
132759456660SKrzysztof Sprzaczkowski 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
132859456660SKrzysztof Sprzaczkowski 
132959456660SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
133059456660SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
133159456660SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
133259456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
133359456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
133459456660SKrzysztof Sprzaczkowski 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
133547494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
133659456660SKrzysztof Sprzaczkowski 
133759456660SKrzysztof Sprzaczkowski 	rc = spdk_dif_generate(task->src_iovs, task->src_iovcnt, task->num_blocks, &task->dif_ctx);
133847494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
133959456660SKrzysztof Sprzaczkowski 
134059456660SKrzysztof Sprzaczkowski 	req.channel = g_channel;
134159456660SKrzysztof Sprzaczkowski 	req.src_iovs = task->src_iovs;
134259456660SKrzysztof Sprzaczkowski 	req.src_iovcnt = task->src_iovcnt;
134359456660SKrzysztof Sprzaczkowski 	req.num_blocks = task->num_blocks;
134459456660SKrzysztof Sprzaczkowski 	req.ctx = &task->dif_ctx;
134559456660SKrzysztof Sprzaczkowski 	req.err = &task->dif_err;
134659456660SKrzysztof Sprzaczkowski 	req.cb_fn = accel_dif_oper_done;
134759456660SKrzysztof Sprzaczkowski 	req.cb_arg = task;
134859456660SKrzysztof Sprzaczkowski 
134959456660SKrzysztof Sprzaczkowski 	execute_spdk_function(accel_dif_verify_test, &req);
135059456660SKrzysztof Sprzaczkowski 	CU_ASSERT_EQUAL(g_completion_success, true);
135159456660SKrzysztof Sprzaczkowski 
135247494478SKrzysztof Sprzaczkowski 	free_dif_verify_bufs(task);
135359456660SKrzysztof Sprzaczkowski }
135459456660SKrzysztof Sprzaczkowski 
135559456660SKrzysztof Sprzaczkowski static void
1356a63a45fcSSlawomir Ptak accel_dix_verify_op_reftag_init_correct_reftag_check(void)
1357a63a45fcSSlawomir Ptak {
1358*f74d16beSSlawomir Ptak 	const char *module_name = NULL;
1359a63a45fcSSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
1360a63a45fcSSlawomir Ptak 	struct accel_dif_request req;
1361a63a45fcSSlawomir Ptak 	struct dif_task *task = &g_dif_task;
1362a63a45fcSSlawomir Ptak 	int rc;
1363a63a45fcSSlawomir Ptak 
1364*f74d16beSSlawomir Ptak 	rc = spdk_accel_get_opc_module_name(SPDK_ACCEL_OPC_DIX_VERIFY, &module_name);
1365*f74d16beSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1366*f74d16beSSlawomir Ptak 
1367*f74d16beSSlawomir Ptak 	/* Intel DSA does not allow for selective DIF fields verification for DIX */
1368*f74d16beSSlawomir Ptak 	if (!strcmp(module_name, "dsa")) {
1369*f74d16beSSlawomir Ptak 		return;
1370*f74d16beSSlawomir Ptak 	}
1371*f74d16beSSlawomir Ptak 
1372a63a45fcSSlawomir Ptak 	rc = alloc_dix_bufs(task, 2);
1373a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1374a63a45fcSSlawomir Ptak 
1375a63a45fcSSlawomir Ptak 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
1376a63a45fcSSlawomir Ptak 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
1377a63a45fcSSlawomir Ptak 
1378a63a45fcSSlawomir Ptak 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1379a63a45fcSSlawomir Ptak 			       g_block_size_bytes,
1380a63a45fcSSlawomir Ptak 			       g_md_size_bytes, false, true,
1381a63a45fcSSlawomir Ptak 			       SPDK_DIF_TYPE1,
1382a63a45fcSSlawomir Ptak 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
1383a63a45fcSSlawomir Ptak 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
1384a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1385a63a45fcSSlawomir Ptak 
1386a63a45fcSSlawomir Ptak 	rc = spdk_dix_generate(task->src_iovs, task->src_iovcnt, &task->md_iov, task->num_blocks,
1387a63a45fcSSlawomir Ptak 			       &task->dif_ctx);
1388a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1389a63a45fcSSlawomir Ptak 
1390a63a45fcSSlawomir Ptak 	req.channel = g_channel;
1391a63a45fcSSlawomir Ptak 	req.src_iovs = task->src_iovs;
1392a63a45fcSSlawomir Ptak 	req.src_iovcnt = task->src_iovcnt;
1393a63a45fcSSlawomir Ptak 	req.md_iov = &task->md_iov;
1394a63a45fcSSlawomir Ptak 	req.num_blocks = task->num_blocks;
1395a63a45fcSSlawomir Ptak 	req.ctx = &task->dif_ctx;
1396a63a45fcSSlawomir Ptak 	req.err = &task->dif_err;
1397a63a45fcSSlawomir Ptak 	req.cb_fn = accel_dif_oper_done;
1398a63a45fcSSlawomir Ptak 	req.cb_arg = task;
1399a63a45fcSSlawomir Ptak 
1400a63a45fcSSlawomir Ptak 	execute_spdk_function(accel_dix_verify_test, &req);
1401a63a45fcSSlawomir Ptak 
1402a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(g_completion_success, true);
1403a63a45fcSSlawomir Ptak 
1404a63a45fcSSlawomir Ptak 	free_dix_bufs(task);
1405a63a45fcSSlawomir Ptak }
1406a63a45fcSSlawomir Ptak 
1407a63a45fcSSlawomir Ptak static void
140859456660SKrzysztof Sprzaczkowski accel_dif_verify_op_reftag_init_incorrect_reftag_check(void)
140959456660SKrzysztof Sprzaczkowski {
141059456660SKrzysztof Sprzaczkowski 	struct spdk_dif_ctx_init_ext_opts dif_opts;
141159456660SKrzysztof Sprzaczkowski 	struct accel_dif_request req;
141259456660SKrzysztof Sprzaczkowski 	struct dif_task *task = &g_dif_task;
141359456660SKrzysztof Sprzaczkowski 	int rc;
141459456660SKrzysztof Sprzaczkowski 
141547494478SKrzysztof Sprzaczkowski 	rc = alloc_dif_verify_bufs(task, 2);
141647494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
141759456660SKrzysztof Sprzaczkowski 
141859456660SKrzysztof Sprzaczkowski 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
141959456660SKrzysztof Sprzaczkowski 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
142059456660SKrzysztof Sprzaczkowski 
142159456660SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
142259456660SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
142359456660SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
142459456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
142559456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
142659456660SKrzysztof Sprzaczkowski 			       16, 0xFFFF, 20, 0, 0, &dif_opts);
142747494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
142859456660SKrzysztof Sprzaczkowski 
142959456660SKrzysztof Sprzaczkowski 	rc = spdk_dif_generate(task->src_iovs, task->src_iovcnt, task->num_blocks, &task->dif_ctx);
143047494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
143159456660SKrzysztof Sprzaczkowski 
143259456660SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
143359456660SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
143459456660SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
143559456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
143659456660SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
143759456660SKrzysztof Sprzaczkowski 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
143847494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
143959456660SKrzysztof Sprzaczkowski 
144059456660SKrzysztof Sprzaczkowski 	req.channel = g_channel;
144159456660SKrzysztof Sprzaczkowski 	req.src_iovs = task->src_iovs;
144259456660SKrzysztof Sprzaczkowski 	req.src_iovcnt = task->src_iovcnt;
144359456660SKrzysztof Sprzaczkowski 	req.num_blocks = task->num_blocks;
144459456660SKrzysztof Sprzaczkowski 	req.ctx = &task->dif_ctx;
144559456660SKrzysztof Sprzaczkowski 	req.err = &task->dif_err;
144659456660SKrzysztof Sprzaczkowski 	req.cb_fn = accel_dif_oper_done;
144759456660SKrzysztof Sprzaczkowski 	req.cb_arg = task;
144859456660SKrzysztof Sprzaczkowski 
144959456660SKrzysztof Sprzaczkowski 	execute_spdk_function(accel_dif_verify_test, &req);
145059456660SKrzysztof Sprzaczkowski 	CU_ASSERT_EQUAL(g_completion_success, false);
145159456660SKrzysztof Sprzaczkowski 
145247494478SKrzysztof Sprzaczkowski 	free_dif_verify_bufs(task);
145359456660SKrzysztof Sprzaczkowski }
145459456660SKrzysztof Sprzaczkowski 
145559456660SKrzysztof Sprzaczkowski static void
1456a63a45fcSSlawomir Ptak accel_dix_verify_op_reftag_init_incorrect_reftag_check(void)
1457a63a45fcSSlawomir Ptak {
1458a63a45fcSSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
1459a63a45fcSSlawomir Ptak 	struct accel_dif_request req;
1460a63a45fcSSlawomir Ptak 	struct dif_task *task = &g_dif_task;
1461a63a45fcSSlawomir Ptak 	int rc;
1462a63a45fcSSlawomir Ptak 
1463a63a45fcSSlawomir Ptak 	rc = alloc_dix_bufs(task, 2);
1464a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1465a63a45fcSSlawomir Ptak 
1466a63a45fcSSlawomir Ptak 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
1467a63a45fcSSlawomir Ptak 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
1468a63a45fcSSlawomir Ptak 
1469a63a45fcSSlawomir Ptak 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1470a63a45fcSSlawomir Ptak 			       g_block_size_bytes,
1471a63a45fcSSlawomir Ptak 			       g_md_size_bytes, false, true,
1472a63a45fcSSlawomir Ptak 			       SPDK_DIF_TYPE1,
1473a63a45fcSSlawomir Ptak 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
1474a63a45fcSSlawomir Ptak 			       16, 0xFFFF, 20, 0, 0, &dif_opts);
1475a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1476a63a45fcSSlawomir Ptak 
1477a63a45fcSSlawomir Ptak 	rc = spdk_dix_generate(task->src_iovs, task->src_iovcnt, &task->md_iov, task->num_blocks,
1478a63a45fcSSlawomir Ptak 			       &task->dif_ctx);
1479a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1480a63a45fcSSlawomir Ptak 
1481a63a45fcSSlawomir Ptak 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1482a63a45fcSSlawomir Ptak 			       g_block_size_bytes,
1483a63a45fcSSlawomir Ptak 			       g_md_size_bytes, false, true,
1484a63a45fcSSlawomir Ptak 			       SPDK_DIF_TYPE1,
1485a63a45fcSSlawomir Ptak 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
1486a63a45fcSSlawomir Ptak 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
1487a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1488a63a45fcSSlawomir Ptak 
1489a63a45fcSSlawomir Ptak 	req.channel = g_channel;
1490a63a45fcSSlawomir Ptak 	req.src_iovs = task->src_iovs;
1491a63a45fcSSlawomir Ptak 	req.src_iovcnt = task->src_iovcnt;
1492a63a45fcSSlawomir Ptak 	req.md_iov = &task->md_iov;
1493a63a45fcSSlawomir Ptak 	req.num_blocks = task->num_blocks;
1494a63a45fcSSlawomir Ptak 	req.ctx = &task->dif_ctx;
1495a63a45fcSSlawomir Ptak 	req.err = &task->dif_err;
1496a63a45fcSSlawomir Ptak 	req.cb_fn = accel_dif_oper_done;
1497a63a45fcSSlawomir Ptak 	req.cb_arg = task;
1498a63a45fcSSlawomir Ptak 
1499a63a45fcSSlawomir Ptak 	execute_spdk_function(accel_dix_verify_test, &req);
1500a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(g_completion_success, false);
1501a63a45fcSSlawomir Ptak 
1502a63a45fcSSlawomir Ptak 	free_dix_bufs(task);
1503a63a45fcSSlawomir Ptak }
1504a63a45fcSSlawomir Ptak 
1505a63a45fcSSlawomir Ptak static void
1506086cb8deSKrzysztof Sprzaczkowski accel_dif_verify_copy_op_dif_generated_do_check(uint32_t dif_flags)
1507086cb8deSKrzysztof Sprzaczkowski {
1508086cb8deSKrzysztof Sprzaczkowski 	struct spdk_dif_ctx_init_ext_opts dif_opts;
1509086cb8deSKrzysztof Sprzaczkowski 	struct accel_dif_request req;
1510086cb8deSKrzysztof Sprzaczkowski 	struct dif_task *task = &g_dif_task;
1511086cb8deSKrzysztof Sprzaczkowski 	int rc;
1512086cb8deSKrzysztof Sprzaczkowski 
1513086cb8deSKrzysztof Sprzaczkowski 	rc = alloc_dif_verify_copy_bufs(task, 1);
151447494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1515086cb8deSKrzysztof Sprzaczkowski 
1516086cb8deSKrzysztof Sprzaczkowski 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
1517086cb8deSKrzysztof Sprzaczkowski 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
1518086cb8deSKrzysztof Sprzaczkowski 
1519086cb8deSKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1520086cb8deSKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
1521086cb8deSKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
1522086cb8deSKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
1523086cb8deSKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_GUARD_CHECK |
1524086cb8deSKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_APPTAG_CHECK |
1525086cb8deSKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
1526086cb8deSKrzysztof Sprzaczkowski 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
152747494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1528086cb8deSKrzysztof Sprzaczkowski 
1529086cb8deSKrzysztof Sprzaczkowski 	rc = spdk_dif_generate(task->src_iovs, task->src_iovcnt, task->num_blocks, &task->dif_ctx);
153047494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1531086cb8deSKrzysztof Sprzaczkowski 
1532086cb8deSKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1533086cb8deSKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
1534086cb8deSKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
1535086cb8deSKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
1536086cb8deSKrzysztof Sprzaczkowski 			       dif_flags,
1537086cb8deSKrzysztof Sprzaczkowski 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
153847494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1539086cb8deSKrzysztof Sprzaczkowski 
1540086cb8deSKrzysztof Sprzaczkowski 	req.channel = g_channel;
1541086cb8deSKrzysztof Sprzaczkowski 	req.dst_iovs = task->dst_iovs;
1542086cb8deSKrzysztof Sprzaczkowski 	req.dst_iovcnt = task->dst_iovcnt;
1543086cb8deSKrzysztof Sprzaczkowski 	req.src_iovs = task->src_iovs;
1544086cb8deSKrzysztof Sprzaczkowski 	req.src_iovcnt = task->src_iovcnt;
1545086cb8deSKrzysztof Sprzaczkowski 	req.num_blocks = task->num_blocks;
1546086cb8deSKrzysztof Sprzaczkowski 	req.ctx = &task->dif_ctx;
1547086cb8deSKrzysztof Sprzaczkowski 	req.err = &task->dif_err;
1548086cb8deSKrzysztof Sprzaczkowski 	req.cb_fn = accel_dif_oper_done;
1549086cb8deSKrzysztof Sprzaczkowski 	req.cb_arg = task;
1550086cb8deSKrzysztof Sprzaczkowski 
1551086cb8deSKrzysztof Sprzaczkowski 	execute_spdk_function(accel_dif_verify_copy_test, &req);
1552086cb8deSKrzysztof Sprzaczkowski 	CU_ASSERT_EQUAL(g_completion_success, true);
1553086cb8deSKrzysztof Sprzaczkowski 
1554086cb8deSKrzysztof Sprzaczkowski 	free_dif_verify_copy_bufs(task);
1555086cb8deSKrzysztof Sprzaczkowski }
1556086cb8deSKrzysztof Sprzaczkowski 
1557086cb8deSKrzysztof Sprzaczkowski static void
1558086cb8deSKrzysztof Sprzaczkowski accel_dif_verify_copy_op_dif_generated_guard_check(void)
1559086cb8deSKrzysztof Sprzaczkowski {
1560086cb8deSKrzysztof Sprzaczkowski 	accel_dif_verify_copy_op_dif_generated_do_check(SPDK_DIF_FLAGS_GUARD_CHECK);
1561086cb8deSKrzysztof Sprzaczkowski }
1562086cb8deSKrzysztof Sprzaczkowski 
1563086cb8deSKrzysztof Sprzaczkowski static void
1564086cb8deSKrzysztof Sprzaczkowski accel_dif_verify_copy_op_dif_generated_apptag_check(void)
1565086cb8deSKrzysztof Sprzaczkowski {
1566086cb8deSKrzysztof Sprzaczkowski 	accel_dif_verify_copy_op_dif_generated_do_check(SPDK_DIF_FLAGS_APPTAG_CHECK);
1567086cb8deSKrzysztof Sprzaczkowski }
1568086cb8deSKrzysztof Sprzaczkowski 
1569086cb8deSKrzysztof Sprzaczkowski static void
1570086cb8deSKrzysztof Sprzaczkowski accel_dif_verify_copy_op_dif_generated_reftag_check(void)
1571086cb8deSKrzysztof Sprzaczkowski {
1572086cb8deSKrzysztof Sprzaczkowski 	accel_dif_verify_copy_op_dif_generated_do_check(SPDK_DIF_FLAGS_REFTAG_CHECK);
1573086cb8deSKrzysztof Sprzaczkowski }
1574086cb8deSKrzysztof Sprzaczkowski 
1575086cb8deSKrzysztof Sprzaczkowski static void
1576086cb8deSKrzysztof Sprzaczkowski accel_dif_verify_copy_op_dif_not_generated_do_check(uint32_t dif_flags)
1577086cb8deSKrzysztof Sprzaczkowski {
1578086cb8deSKrzysztof Sprzaczkowski 	struct spdk_dif_ctx_init_ext_opts dif_opts;
1579086cb8deSKrzysztof Sprzaczkowski 	struct accel_dif_request req;
1580086cb8deSKrzysztof Sprzaczkowski 	struct dif_task *task = &g_dif_task;
1581086cb8deSKrzysztof Sprzaczkowski 	int rc;
1582086cb8deSKrzysztof Sprzaczkowski 
1583086cb8deSKrzysztof Sprzaczkowski 	rc = alloc_dif_verify_copy_bufs(task, 1);
158447494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1585086cb8deSKrzysztof Sprzaczkowski 
1586086cb8deSKrzysztof Sprzaczkowski 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
1587086cb8deSKrzysztof Sprzaczkowski 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
1588086cb8deSKrzysztof Sprzaczkowski 
1589086cb8deSKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1590086cb8deSKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
1591086cb8deSKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
1592086cb8deSKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
1593086cb8deSKrzysztof Sprzaczkowski 			       dif_flags,
1594086cb8deSKrzysztof Sprzaczkowski 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
159547494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1596086cb8deSKrzysztof Sprzaczkowski 
1597086cb8deSKrzysztof Sprzaczkowski 	req.channel = g_channel;
1598086cb8deSKrzysztof Sprzaczkowski 	req.dst_iovs = task->dst_iovs;
1599086cb8deSKrzysztof Sprzaczkowski 	req.dst_iovcnt = task->dst_iovcnt;
1600086cb8deSKrzysztof Sprzaczkowski 	req.src_iovs = task->src_iovs;
1601086cb8deSKrzysztof Sprzaczkowski 	req.src_iovcnt = task->src_iovcnt;
1602086cb8deSKrzysztof Sprzaczkowski 	req.num_blocks = task->num_blocks;
1603086cb8deSKrzysztof Sprzaczkowski 	req.ctx = &task->dif_ctx;
1604086cb8deSKrzysztof Sprzaczkowski 	req.err = &task->dif_err;
1605086cb8deSKrzysztof Sprzaczkowski 	req.cb_fn = accel_dif_oper_done;
1606086cb8deSKrzysztof Sprzaczkowski 	req.cb_arg = task;
1607086cb8deSKrzysztof Sprzaczkowski 
1608086cb8deSKrzysztof Sprzaczkowski 	execute_spdk_function(accel_dif_verify_copy_test, &req);
1609086cb8deSKrzysztof Sprzaczkowski 	CU_ASSERT_EQUAL(g_completion_success, false);
1610086cb8deSKrzysztof Sprzaczkowski 	CU_ASSERT_EQUAL(accel_dif_error_validate(dif_flags, req.err), true);
1611086cb8deSKrzysztof Sprzaczkowski 
1612086cb8deSKrzysztof Sprzaczkowski 	free_dif_verify_copy_bufs(task);
1613086cb8deSKrzysztof Sprzaczkowski }
1614086cb8deSKrzysztof Sprzaczkowski 
1615086cb8deSKrzysztof Sprzaczkowski static void
1616086cb8deSKrzysztof Sprzaczkowski accel_dif_verify_copy_op_dif_not_generated_guard_check(void)
1617086cb8deSKrzysztof Sprzaczkowski {
1618086cb8deSKrzysztof Sprzaczkowski 	accel_dif_verify_copy_op_dif_not_generated_do_check(SPDK_DIF_FLAGS_GUARD_CHECK);
1619086cb8deSKrzysztof Sprzaczkowski }
1620086cb8deSKrzysztof Sprzaczkowski 
1621086cb8deSKrzysztof Sprzaczkowski static void
1622086cb8deSKrzysztof Sprzaczkowski accel_dif_verify_copy_op_dif_not_generated_apptag_check(void)
1623086cb8deSKrzysztof Sprzaczkowski {
1624086cb8deSKrzysztof Sprzaczkowski 	accel_dif_verify_copy_op_dif_not_generated_do_check(SPDK_DIF_FLAGS_APPTAG_CHECK);
1625086cb8deSKrzysztof Sprzaczkowski }
1626086cb8deSKrzysztof Sprzaczkowski 
1627086cb8deSKrzysztof Sprzaczkowski static void
1628086cb8deSKrzysztof Sprzaczkowski accel_dif_verify_copy_op_dif_not_generated_reftag_check(void)
1629086cb8deSKrzysztof Sprzaczkowski {
1630086cb8deSKrzysztof Sprzaczkowski 	accel_dif_verify_copy_op_dif_not_generated_do_check(SPDK_DIF_FLAGS_REFTAG_CHECK);
1631086cb8deSKrzysztof Sprzaczkowski }
1632086cb8deSKrzysztof Sprzaczkowski 
1633086cb8deSKrzysztof Sprzaczkowski static void
1634f62ac001SKrzysztof Sprzaczkowski accel_dif_generate_copy_op_dif_generated_do_check(uint32_t dif_flags)
1635f62ac001SKrzysztof Sprzaczkowski {
1636f62ac001SKrzysztof Sprzaczkowski 	struct spdk_dif_ctx_init_ext_opts dif_opts;
1637f62ac001SKrzysztof Sprzaczkowski 	struct accel_dif_request req;
1638f62ac001SKrzysztof Sprzaczkowski 	struct dif_task *task = &g_dif_task;
1639f62ac001SKrzysztof Sprzaczkowski 	struct spdk_dif_error err_blk;
1640f62ac001SKrzysztof Sprzaczkowski 	int rc;
1641f62ac001SKrzysztof Sprzaczkowski 
164247494478SKrzysztof Sprzaczkowski 	rc = alloc_dif_generate_copy_bufs(task, 1);
164347494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1644f62ac001SKrzysztof Sprzaczkowski 
1645f62ac001SKrzysztof Sprzaczkowski 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
1646f62ac001SKrzysztof Sprzaczkowski 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
1647f62ac001SKrzysztof Sprzaczkowski 
1648f62ac001SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1649f62ac001SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
1650f62ac001SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
1651f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
1652f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_GUARD_CHECK |
1653f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_APPTAG_CHECK |
1654f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
1655f62ac001SKrzysztof Sprzaczkowski 			       16, 0xFFFF, 10, 0, 0, &dif_opts);
165647494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1657f62ac001SKrzysztof Sprzaczkowski 
1658f62ac001SKrzysztof Sprzaczkowski 	req.channel = g_channel;
1659f62ac001SKrzysztof Sprzaczkowski 	req.dst_iovs = task->dst_iovs;
1660f62ac001SKrzysztof Sprzaczkowski 	req.dst_iovcnt = task->dst_iovcnt;
1661f62ac001SKrzysztof Sprzaczkowski 	req.src_iovs = task->src_iovs;
1662f62ac001SKrzysztof Sprzaczkowski 	req.src_iovcnt = task->src_iovcnt;
1663f62ac001SKrzysztof Sprzaczkowski 	req.num_blocks = task->num_blocks;
1664f62ac001SKrzysztof Sprzaczkowski 	req.ctx = &task->dif_ctx;
1665f62ac001SKrzysztof Sprzaczkowski 	req.err = &task->dif_err;
1666f62ac001SKrzysztof Sprzaczkowski 	req.cb_fn = accel_dif_oper_done;
1667f62ac001SKrzysztof Sprzaczkowski 	req.cb_arg = task;
1668f62ac001SKrzysztof Sprzaczkowski 
1669f62ac001SKrzysztof Sprzaczkowski 	execute_spdk_function(accel_dif_generate_copy_test, &req);
1670f62ac001SKrzysztof Sprzaczkowski 	CU_ASSERT_EQUAL(g_completion_success, true);
1671f62ac001SKrzysztof Sprzaczkowski 
1672f62ac001SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1673f62ac001SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
1674f62ac001SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
1675f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
1676f62ac001SKrzysztof Sprzaczkowski 			       dif_flags,
1677f62ac001SKrzysztof Sprzaczkowski 			       16, 0xFFFF, 10, 0, 0, &dif_opts);
167847494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1679f62ac001SKrzysztof Sprzaczkowski 
1680f62ac001SKrzysztof Sprzaczkowski 	rc = spdk_dif_verify(req.dst_iovs, req.dst_iovcnt, req.num_blocks,
1681f62ac001SKrzysztof Sprzaczkowski 			     &task->dif_ctx, &err_blk);
168247494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1683f62ac001SKrzysztof Sprzaczkowski 
168447494478SKrzysztof Sprzaczkowski 	free_dif_generate_copy_bufs(task);
1685f62ac001SKrzysztof Sprzaczkowski }
1686f62ac001SKrzysztof Sprzaczkowski 
1687f62ac001SKrzysztof Sprzaczkowski static void
1688a63a45fcSSlawomir Ptak accel_dix_generate_op_dix_generated_do_check(uint32_t dif_flags)
1689a63a45fcSSlawomir Ptak {
1690a63a45fcSSlawomir Ptak 	struct spdk_dif_ctx_init_ext_opts dif_opts;
1691a63a45fcSSlawomir Ptak 	struct accel_dif_request req;
1692a63a45fcSSlawomir Ptak 	struct dif_task *task = &g_dif_task;
1693a63a45fcSSlawomir Ptak 	struct spdk_dif_error err_blk;
1694a63a45fcSSlawomir Ptak 	int rc;
1695a63a45fcSSlawomir Ptak 
1696a63a45fcSSlawomir Ptak 	rc = alloc_dix_bufs(task, 3);
1697a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1698a63a45fcSSlawomir Ptak 
1699a63a45fcSSlawomir Ptak 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
1700a63a45fcSSlawomir Ptak 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
1701a63a45fcSSlawomir Ptak 
1702a63a45fcSSlawomir Ptak 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1703a63a45fcSSlawomir Ptak 			       g_block_size_bytes,
1704a63a45fcSSlawomir Ptak 			       g_md_size_bytes, false, true,
1705a63a45fcSSlawomir Ptak 			       SPDK_DIF_TYPE1,
1706a63a45fcSSlawomir Ptak 			       SPDK_DIF_FLAGS_GUARD_CHECK |
1707a63a45fcSSlawomir Ptak 			       SPDK_DIF_FLAGS_APPTAG_CHECK |
1708a63a45fcSSlawomir Ptak 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
1709a63a45fcSSlawomir Ptak 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
1710a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1711a63a45fcSSlawomir Ptak 
1712a63a45fcSSlawomir Ptak 	req.channel = g_channel;
1713a63a45fcSSlawomir Ptak 	req.src_iovs = task->src_iovs;
1714a63a45fcSSlawomir Ptak 	req.src_iovcnt = task->src_iovcnt;
1715a63a45fcSSlawomir Ptak 	req.md_iov = &task->md_iov;
1716a63a45fcSSlawomir Ptak 	req.num_blocks = task->num_blocks;
1717a63a45fcSSlawomir Ptak 	req.ctx = &task->dif_ctx;
1718a63a45fcSSlawomir Ptak 	req.err = &task->dif_err;
1719a63a45fcSSlawomir Ptak 	req.cb_fn = accel_dif_oper_done;
1720a63a45fcSSlawomir Ptak 	req.cb_arg = task;
1721a63a45fcSSlawomir Ptak 
1722a63a45fcSSlawomir Ptak 	execute_spdk_function(accel_dix_generate_test, &req);
1723a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(g_completion_success, true);
1724a63a45fcSSlawomir Ptak 
1725a63a45fcSSlawomir Ptak 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1726a63a45fcSSlawomir Ptak 			       g_block_size_bytes,
1727a63a45fcSSlawomir Ptak 			       g_md_size_bytes, false, true,
1728a63a45fcSSlawomir Ptak 			       SPDK_DIF_TYPE1,
1729a63a45fcSSlawomir Ptak 			       dif_flags,
1730a63a45fcSSlawomir Ptak 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
1731a63a45fcSSlawomir Ptak 	SPDK_CU_ASSERT_FATAL(rc == 0);
1732a63a45fcSSlawomir Ptak 
1733a63a45fcSSlawomir Ptak 	rc = spdk_dix_verify(req.src_iovs, req.src_iovcnt, req.md_iov, req.num_blocks,
1734a63a45fcSSlawomir Ptak 			     &task->dif_ctx, &err_blk);
1735a63a45fcSSlawomir Ptak 	CU_ASSERT_EQUAL(rc, 0);
1736a63a45fcSSlawomir Ptak 
1737a63a45fcSSlawomir Ptak 	free_dix_bufs(task);
1738a63a45fcSSlawomir Ptak }
1739a63a45fcSSlawomir Ptak 
1740a63a45fcSSlawomir Ptak static void
1741f62ac001SKrzysztof Sprzaczkowski accel_dif_generate_copy_op_dif_generated_guard_check(void)
1742f62ac001SKrzysztof Sprzaczkowski {
1743f62ac001SKrzysztof Sprzaczkowski 	accel_dif_generate_copy_op_dif_generated_do_check(SPDK_DIF_FLAGS_GUARD_CHECK);
1744f62ac001SKrzysztof Sprzaczkowski }
1745f62ac001SKrzysztof Sprzaczkowski 
1746f62ac001SKrzysztof Sprzaczkowski static void
1747a63a45fcSSlawomir Ptak accel_dix_generate_op_dix_generated_guard_check(void)
1748a63a45fcSSlawomir Ptak {
1749a63a45fcSSlawomir Ptak 	accel_dix_generate_op_dix_generated_do_check(SPDK_DIF_FLAGS_GUARD_CHECK);
1750a63a45fcSSlawomir Ptak }
1751a63a45fcSSlawomir Ptak 
1752a63a45fcSSlawomir Ptak static void
1753f62ac001SKrzysztof Sprzaczkowski accel_dif_generate_copy_op_dif_generated_apptag_check(void)
1754f62ac001SKrzysztof Sprzaczkowski {
1755f62ac001SKrzysztof Sprzaczkowski 	accel_dif_generate_copy_op_dif_generated_do_check(SPDK_DIF_FLAGS_APPTAG_CHECK);
1756f62ac001SKrzysztof Sprzaczkowski }
1757f62ac001SKrzysztof Sprzaczkowski 
1758f62ac001SKrzysztof Sprzaczkowski static void
1759a63a45fcSSlawomir Ptak accel_dix_generate_op_dix_generated_apptag_check(void)
1760a63a45fcSSlawomir Ptak {
1761a63a45fcSSlawomir Ptak 	accel_dix_generate_op_dix_generated_do_check(SPDK_DIF_FLAGS_APPTAG_CHECK);
1762a63a45fcSSlawomir Ptak }
1763a63a45fcSSlawomir Ptak 
1764a63a45fcSSlawomir Ptak static void
1765f62ac001SKrzysztof Sprzaczkowski accel_dif_generate_copy_op_dif_generated_reftag_check(void)
1766f62ac001SKrzysztof Sprzaczkowski {
1767f62ac001SKrzysztof Sprzaczkowski 	accel_dif_generate_copy_op_dif_generated_do_check(SPDK_DIF_FLAGS_REFTAG_CHECK);
1768f62ac001SKrzysztof Sprzaczkowski }
1769f62ac001SKrzysztof Sprzaczkowski 
1770f62ac001SKrzysztof Sprzaczkowski static void
1771a63a45fcSSlawomir Ptak accel_dix_generate_op_dix_generated_reftag_check(void)
1772a63a45fcSSlawomir Ptak {
1773a63a45fcSSlawomir Ptak 	accel_dix_generate_op_dix_generated_do_check(SPDK_DIF_FLAGS_REFTAG_CHECK);
1774a63a45fcSSlawomir Ptak }
1775a63a45fcSSlawomir Ptak 
1776a63a45fcSSlawomir Ptak static void
1777f62ac001SKrzysztof Sprzaczkowski accel_dif_generate_copy_op_dif_generated_no_guard_check_flag_set(void)
1778f62ac001SKrzysztof Sprzaczkowski {
1779f62ac001SKrzysztof Sprzaczkowski 	const char *module_name = NULL;
1780f62ac001SKrzysztof Sprzaczkowski 	struct spdk_dif_ctx_init_ext_opts dif_opts;
1781f62ac001SKrzysztof Sprzaczkowski 	struct accel_dif_request req;
1782f62ac001SKrzysztof Sprzaczkowski 	struct dif_task *task = &g_dif_task;
1783f62ac001SKrzysztof Sprzaczkowski 	int rc;
1784f62ac001SKrzysztof Sprzaczkowski 
1785f62ac001SKrzysztof Sprzaczkowski 	rc = spdk_accel_get_opc_module_name(SPDK_ACCEL_OPC_DIF_GENERATE_COPY, &module_name);
178647494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1787f62ac001SKrzysztof Sprzaczkowski 
178847494478SKrzysztof Sprzaczkowski 	rc = alloc_dif_generate_copy_bufs(task, 1);
178947494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1790f62ac001SKrzysztof Sprzaczkowski 
1791f62ac001SKrzysztof Sprzaczkowski 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
1792f62ac001SKrzysztof Sprzaczkowski 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
1793f62ac001SKrzysztof Sprzaczkowski 
1794f62ac001SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1795f62ac001SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
1796f62ac001SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
1797f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
1798f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_APPTAG_CHECK |
1799f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
1800f62ac001SKrzysztof Sprzaczkowski 			       16, 0xFFFF, 10, 0, 0, &dif_opts);
180147494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1802f62ac001SKrzysztof Sprzaczkowski 
1803f62ac001SKrzysztof Sprzaczkowski 	req.channel = g_channel;
1804f62ac001SKrzysztof Sprzaczkowski 	req.dst_iovs = task->dst_iovs;
1805f62ac001SKrzysztof Sprzaczkowski 	req.dst_iovcnt = task->dst_iovcnt;
1806f62ac001SKrzysztof Sprzaczkowski 	req.src_iovs = task->src_iovs;
1807f62ac001SKrzysztof Sprzaczkowski 	req.src_iovcnt = task->src_iovcnt;
1808f62ac001SKrzysztof Sprzaczkowski 	req.num_blocks = task->num_blocks;
1809f62ac001SKrzysztof Sprzaczkowski 	req.ctx = &task->dif_ctx;
1810f62ac001SKrzysztof Sprzaczkowski 	req.err = &task->dif_err;
1811f62ac001SKrzysztof Sprzaczkowski 	req.cb_fn = accel_dif_oper_done;
1812f62ac001SKrzysztof Sprzaczkowski 	req.cb_arg = task;
1813f62ac001SKrzysztof Sprzaczkowski 
1814f62ac001SKrzysztof Sprzaczkowski 	execute_spdk_function(accel_dif_generate_copy_test, &req);
1815f62ac001SKrzysztof Sprzaczkowski 
1816f62ac001SKrzysztof Sprzaczkowski 	/* Intel DSA does not allow for selective DIF fields generation */
1817f62ac001SKrzysztof Sprzaczkowski 	if (!strcmp(module_name, "dsa")) {
1818f62ac001SKrzysztof Sprzaczkowski 		CU_ASSERT_EQUAL(g_completion_success, false);
1819f62ac001SKrzysztof Sprzaczkowski 	} else if (!strcmp(module_name, "software")) {
1820f62ac001SKrzysztof Sprzaczkowski 		CU_ASSERT_EQUAL(g_completion_success, true);
1821f62ac001SKrzysztof Sprzaczkowski 	} else {
182247494478SKrzysztof Sprzaczkowski 		SPDK_CU_ASSERT_FATAL(false);
1823f62ac001SKrzysztof Sprzaczkowski 	}
1824f62ac001SKrzysztof Sprzaczkowski 
182547494478SKrzysztof Sprzaczkowski 	free_dif_generate_copy_bufs(task);
1826f62ac001SKrzysztof Sprzaczkowski }
1827f62ac001SKrzysztof Sprzaczkowski 
1828f62ac001SKrzysztof Sprzaczkowski static void
1829f62ac001SKrzysztof Sprzaczkowski accel_dif_generate_copy_op_dif_generated_no_apptag_check_flag_set(void)
1830f62ac001SKrzysztof Sprzaczkowski {
1831f62ac001SKrzysztof Sprzaczkowski 	const char *module_name = NULL;
1832f62ac001SKrzysztof Sprzaczkowski 	struct spdk_dif_ctx_init_ext_opts dif_opts;
1833f62ac001SKrzysztof Sprzaczkowski 	struct accel_dif_request req;
1834f62ac001SKrzysztof Sprzaczkowski 	struct dif_task *task = &g_dif_task;
1835f62ac001SKrzysztof Sprzaczkowski 	int rc;
1836f62ac001SKrzysztof Sprzaczkowski 
1837f62ac001SKrzysztof Sprzaczkowski 	rc = spdk_accel_get_opc_module_name(SPDK_ACCEL_OPC_DIF_GENERATE_COPY, &module_name);
183847494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1839f62ac001SKrzysztof Sprzaczkowski 
184047494478SKrzysztof Sprzaczkowski 	rc = alloc_dif_generate_copy_bufs(task, 1);
184147494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1842f62ac001SKrzysztof Sprzaczkowski 
1843f62ac001SKrzysztof Sprzaczkowski 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
1844f62ac001SKrzysztof Sprzaczkowski 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
1845f62ac001SKrzysztof Sprzaczkowski 
1846f62ac001SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1847f62ac001SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
1848f62ac001SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
1849f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
1850f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_GUARD_CHECK |
1851f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
1852f62ac001SKrzysztof Sprzaczkowski 			       16, 0xFFFF, 10, 0, 0, &dif_opts);
185347494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1854f62ac001SKrzysztof Sprzaczkowski 
1855f62ac001SKrzysztof Sprzaczkowski 	req.channel = g_channel;
1856f62ac001SKrzysztof Sprzaczkowski 	req.dst_iovs = task->dst_iovs;
1857f62ac001SKrzysztof Sprzaczkowski 	req.dst_iovcnt = task->dst_iovcnt;
1858f62ac001SKrzysztof Sprzaczkowski 	req.src_iovs = task->src_iovs;
1859f62ac001SKrzysztof Sprzaczkowski 	req.src_iovcnt = task->src_iovcnt;
1860f62ac001SKrzysztof Sprzaczkowski 	req.num_blocks = task->num_blocks;
1861f62ac001SKrzysztof Sprzaczkowski 	req.ctx = &task->dif_ctx;
1862f62ac001SKrzysztof Sprzaczkowski 	req.err = &task->dif_err;
1863f62ac001SKrzysztof Sprzaczkowski 	req.cb_fn = accel_dif_oper_done;
1864f62ac001SKrzysztof Sprzaczkowski 	req.cb_arg = task;
1865f62ac001SKrzysztof Sprzaczkowski 
1866f62ac001SKrzysztof Sprzaczkowski 	execute_spdk_function(accel_dif_generate_copy_test, &req);
1867f62ac001SKrzysztof Sprzaczkowski 
1868f62ac001SKrzysztof Sprzaczkowski 	/* Intel DSA does not allow for selective DIF fields generation */
1869f62ac001SKrzysztof Sprzaczkowski 	if (!strcmp(module_name, "dsa")) {
1870f62ac001SKrzysztof Sprzaczkowski 		CU_ASSERT_EQUAL(g_completion_success, false);
1871f62ac001SKrzysztof Sprzaczkowski 	} else if (!strcmp(module_name, "software")) {
1872f62ac001SKrzysztof Sprzaczkowski 		CU_ASSERT_EQUAL(g_completion_success, true);
1873f62ac001SKrzysztof Sprzaczkowski 	} else {
187447494478SKrzysztof Sprzaczkowski 		SPDK_CU_ASSERT_FATAL(false);
1875f62ac001SKrzysztof Sprzaczkowski 	}
1876f62ac001SKrzysztof Sprzaczkowski 
187747494478SKrzysztof Sprzaczkowski 	free_dif_generate_copy_bufs(task);
1878f62ac001SKrzysztof Sprzaczkowski }
1879f62ac001SKrzysztof Sprzaczkowski 
1880f62ac001SKrzysztof Sprzaczkowski static void
1881f62ac001SKrzysztof Sprzaczkowski accel_dif_generate_copy_op_dif_generated_no_reftag_check_flag_set(void)
1882f62ac001SKrzysztof Sprzaczkowski {
1883f62ac001SKrzysztof Sprzaczkowski 	const char *module_name = NULL;
1884f62ac001SKrzysztof Sprzaczkowski 	struct spdk_dif_ctx_init_ext_opts dif_opts;
1885f62ac001SKrzysztof Sprzaczkowski 	struct accel_dif_request req;
1886f62ac001SKrzysztof Sprzaczkowski 	struct dif_task *task = &g_dif_task;
1887f62ac001SKrzysztof Sprzaczkowski 	int rc;
1888f62ac001SKrzysztof Sprzaczkowski 
1889f62ac001SKrzysztof Sprzaczkowski 	rc = spdk_accel_get_opc_module_name(SPDK_ACCEL_OPC_DIF_GENERATE_COPY, &module_name);
189047494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1891f62ac001SKrzysztof Sprzaczkowski 
189247494478SKrzysztof Sprzaczkowski 	rc = alloc_dif_generate_copy_bufs(task, 1);
189347494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1894f62ac001SKrzysztof Sprzaczkowski 
1895f62ac001SKrzysztof Sprzaczkowski 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
1896f62ac001SKrzysztof Sprzaczkowski 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
1897f62ac001SKrzysztof Sprzaczkowski 
1898f62ac001SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1899f62ac001SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
1900f62ac001SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
1901f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
1902f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_GUARD_CHECK |
1903f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_APPTAG_CHECK,
1904f62ac001SKrzysztof Sprzaczkowski 			       16, 0xFFFF, 10, 0, 0, &dif_opts);
190547494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1906f62ac001SKrzysztof Sprzaczkowski 
1907f62ac001SKrzysztof Sprzaczkowski 	req.channel = g_channel;
1908f62ac001SKrzysztof Sprzaczkowski 	req.dst_iovs = task->dst_iovs;
1909f62ac001SKrzysztof Sprzaczkowski 	req.dst_iovcnt = task->dst_iovcnt;
1910f62ac001SKrzysztof Sprzaczkowski 	req.src_iovs = task->src_iovs;
1911f62ac001SKrzysztof Sprzaczkowski 	req.src_iovcnt = task->src_iovcnt;
1912f62ac001SKrzysztof Sprzaczkowski 	req.num_blocks = task->num_blocks;
1913f62ac001SKrzysztof Sprzaczkowski 	req.ctx = &task->dif_ctx;
1914f62ac001SKrzysztof Sprzaczkowski 	req.err = &task->dif_err;
1915f62ac001SKrzysztof Sprzaczkowski 	req.cb_fn = accel_dif_oper_done;
1916f62ac001SKrzysztof Sprzaczkowski 	req.cb_arg = task;
1917f62ac001SKrzysztof Sprzaczkowski 
1918f62ac001SKrzysztof Sprzaczkowski 	execute_spdk_function(accel_dif_generate_copy_test, &req);
1919f62ac001SKrzysztof Sprzaczkowski 
1920f62ac001SKrzysztof Sprzaczkowski 	/* Intel DSA does not allow for selective DIF fields generation */
1921f62ac001SKrzysztof Sprzaczkowski 	if (!strcmp(module_name, "dsa")) {
1922f62ac001SKrzysztof Sprzaczkowski 		CU_ASSERT_EQUAL(g_completion_success, false);
1923f62ac001SKrzysztof Sprzaczkowski 	} else if (!strcmp(module_name, "software")) {
1924f62ac001SKrzysztof Sprzaczkowski 		CU_ASSERT_EQUAL(g_completion_success, true);
1925f62ac001SKrzysztof Sprzaczkowski 	} else {
192647494478SKrzysztof Sprzaczkowski 		SPDK_CU_ASSERT_FATAL(false);
1927f62ac001SKrzysztof Sprzaczkowski 	}
1928f62ac001SKrzysztof Sprzaczkowski 
192947494478SKrzysztof Sprzaczkowski 	free_dif_generate_copy_bufs(task);
1930f62ac001SKrzysztof Sprzaczkowski }
1931f62ac001SKrzysztof Sprzaczkowski 
1932f62ac001SKrzysztof Sprzaczkowski static void
1933f62ac001SKrzysztof Sprzaczkowski accel_dif_generate_copy_op_iovecs_len_validate(void)
1934f62ac001SKrzysztof Sprzaczkowski {
1935f62ac001SKrzysztof Sprzaczkowski 	struct spdk_dif_ctx_init_ext_opts dif_opts;
1936f62ac001SKrzysztof Sprzaczkowski 	struct accel_dif_request req;
1937f62ac001SKrzysztof Sprzaczkowski 	struct dif_task *task = &g_dif_task;
1938f62ac001SKrzysztof Sprzaczkowski 	int rc;
1939f62ac001SKrzysztof Sprzaczkowski 
194047494478SKrzysztof Sprzaczkowski 	rc = alloc_dif_generate_copy_bufs(task, 1);
194147494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1942f62ac001SKrzysztof Sprzaczkowski 
1943f62ac001SKrzysztof Sprzaczkowski 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
1944f62ac001SKrzysztof Sprzaczkowski 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
1945f62ac001SKrzysztof Sprzaczkowski 
1946f62ac001SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1947f62ac001SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
1948f62ac001SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
1949f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
1950f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_GUARD_CHECK |
1951f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_APPTAG_CHECK |
1952f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
1953f62ac001SKrzysztof Sprzaczkowski 			       16, 0xFFFF, 10, 0, 0, &dif_opts);
195447494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1955f62ac001SKrzysztof Sprzaczkowski 
1956f62ac001SKrzysztof Sprzaczkowski 	req.channel = g_channel;
1957f62ac001SKrzysztof Sprzaczkowski 	req.dst_iovs = task->dst_iovs;
1958f62ac001SKrzysztof Sprzaczkowski 	/* Make iov_len param incorrect */
1959d3032139SShuhei Matsumoto 	req.dst_iovs->iov_len -= 16;
1960f62ac001SKrzysztof Sprzaczkowski 	req.dst_iovcnt = task->dst_iovcnt;
1961f62ac001SKrzysztof Sprzaczkowski 	req.src_iovs = task->src_iovs;
1962f62ac001SKrzysztof Sprzaczkowski 	req.src_iovcnt = task->src_iovcnt;
1963f62ac001SKrzysztof Sprzaczkowski 	req.num_blocks = task->num_blocks;
1964f62ac001SKrzysztof Sprzaczkowski 	req.ctx = &task->dif_ctx;
1965f62ac001SKrzysztof Sprzaczkowski 	req.err = &task->dif_err;
1966f62ac001SKrzysztof Sprzaczkowski 	req.cb_fn = accel_dif_oper_done;
1967f62ac001SKrzysztof Sprzaczkowski 	req.cb_arg = task;
1968f62ac001SKrzysztof Sprzaczkowski 
1969f62ac001SKrzysztof Sprzaczkowski 	execute_spdk_function(accel_dif_generate_copy_test, &req);
1970f62ac001SKrzysztof Sprzaczkowski 	CU_ASSERT_EQUAL(g_completion_success, false);
1971f62ac001SKrzysztof Sprzaczkowski 
197247494478SKrzysztof Sprzaczkowski 	free_dif_generate_copy_bufs(task);
1973f62ac001SKrzysztof Sprzaczkowski }
1974f62ac001SKrzysztof Sprzaczkowski 
1975f62ac001SKrzysztof Sprzaczkowski static void
1976f62ac001SKrzysztof Sprzaczkowski accel_dif_generate_copy_op_buf_align_validate(void)
1977f62ac001SKrzysztof Sprzaczkowski {
1978f62ac001SKrzysztof Sprzaczkowski 	struct spdk_dif_ctx_init_ext_opts dif_opts;
1979f62ac001SKrzysztof Sprzaczkowski 	struct accel_dif_request req;
1980f62ac001SKrzysztof Sprzaczkowski 	struct dif_task *task = &g_dif_task;
1981f62ac001SKrzysztof Sprzaczkowski 	int rc;
1982f62ac001SKrzysztof Sprzaczkowski 
198347494478SKrzysztof Sprzaczkowski 	rc = alloc_dif_generate_copy_bufs(task, 1);
198447494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1985f62ac001SKrzysztof Sprzaczkowski 
1986f62ac001SKrzysztof Sprzaczkowski 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
1987f62ac001SKrzysztof Sprzaczkowski 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
1988f62ac001SKrzysztof Sprzaczkowski 
1989f62ac001SKrzysztof Sprzaczkowski 	rc = spdk_dif_ctx_init(&task->dif_ctx,
1990f62ac001SKrzysztof Sprzaczkowski 			       g_block_size_bytes + g_md_size_bytes,
1991f62ac001SKrzysztof Sprzaczkowski 			       g_md_size_bytes, true, true,
1992f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_TYPE1,
1993f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_GUARD_CHECK |
1994f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_APPTAG_CHECK |
1995f62ac001SKrzysztof Sprzaczkowski 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
1996f62ac001SKrzysztof Sprzaczkowski 			       16, 0xFFFF, 10, 0, 0, &dif_opts);
199747494478SKrzysztof Sprzaczkowski 	SPDK_CU_ASSERT_FATAL(rc == 0);
1998f62ac001SKrzysztof Sprzaczkowski 
1999f62ac001SKrzysztof Sprzaczkowski 	req.channel = g_channel;
2000f62ac001SKrzysztof Sprzaczkowski 	req.dst_iovs = task->dst_iovs;
2001f62ac001SKrzysztof Sprzaczkowski 	req.dst_iovcnt = task->dst_iovcnt;
2002f62ac001SKrzysztof Sprzaczkowski 	req.src_iovs = task->src_iovs;
2003f62ac001SKrzysztof Sprzaczkowski 	req.src_iovcnt = task->src_iovcnt;
2004f62ac001SKrzysztof Sprzaczkowski 	req.num_blocks = task->num_blocks;
2005f62ac001SKrzysztof Sprzaczkowski 	req.ctx = &task->dif_ctx;
2006f62ac001SKrzysztof Sprzaczkowski 	req.err = &task->dif_err;
2007f62ac001SKrzysztof Sprzaczkowski 	req.cb_fn = accel_dif_oper_done;
2008f62ac001SKrzysztof Sprzaczkowski 	req.cb_arg = task;
2009f62ac001SKrzysztof Sprzaczkowski 
2010f62ac001SKrzysztof Sprzaczkowski 	execute_spdk_function(accel_dif_generate_copy_test, &req);
2011f62ac001SKrzysztof Sprzaczkowski 	CU_ASSERT_EQUAL(g_completion_success, true);
2012f62ac001SKrzysztof Sprzaczkowski 
201347494478SKrzysztof Sprzaczkowski 	free_dif_generate_copy_bufs(task);
2014f62ac001SKrzysztof Sprzaczkowski }
2015f62ac001SKrzysztof Sprzaczkowski 
2016f62ac001SKrzysztof Sprzaczkowski static void
2017a506f666SShuhei Matsumoto accel_dif_generate_copy_sequence_dif_generated_do_check(uint32_t dif_flags)
2018a506f666SShuhei Matsumoto {
2019a506f666SShuhei Matsumoto 	struct spdk_dif_ctx_init_ext_opts dif_opts;
2020a506f666SShuhei Matsumoto 	struct accel_dif_request req;
2021a506f666SShuhei Matsumoto 	struct dif_task *task = &g_dif_task;
2022a506f666SShuhei Matsumoto 	struct spdk_dif_error err_blk;
2023a506f666SShuhei Matsumoto 	int rc;
2024a506f666SShuhei Matsumoto 
2025a506f666SShuhei Matsumoto 	rc = alloc_dif_generate_copy_sequence_bufs(task, 1);
2026a506f666SShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(rc == 0);
2027a506f666SShuhei Matsumoto 
2028a506f666SShuhei Matsumoto 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
2029a506f666SShuhei Matsumoto 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
2030a506f666SShuhei Matsumoto 
2031a506f666SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&task->dif_ctx,
2032a506f666SShuhei Matsumoto 			       g_block_size_bytes + g_md_size_bytes,
2033a506f666SShuhei Matsumoto 			       g_md_size_bytes, true, true,
2034a506f666SShuhei Matsumoto 			       SPDK_DIF_TYPE1,
2035a506f666SShuhei Matsumoto 			       SPDK_DIF_FLAGS_GUARD_CHECK |
2036a506f666SShuhei Matsumoto 			       SPDK_DIF_FLAGS_APPTAG_CHECK |
2037a506f666SShuhei Matsumoto 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
2038a506f666SShuhei Matsumoto 			       16, 0xFFFF, 10, 0, 0, &dif_opts);
2039a506f666SShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(rc == 0);
2040a506f666SShuhei Matsumoto 
2041a506f666SShuhei Matsumoto 	req.channel = g_channel;
2042a506f666SShuhei Matsumoto 	req.dst_iovs = task->dst_iovs;
2043a506f666SShuhei Matsumoto 	req.dst_iovcnt = task->dst_iovcnt;
2044a506f666SShuhei Matsumoto 	req.src_iovs = task->src_iovs;
2045a506f666SShuhei Matsumoto 	req.src_iovcnt = task->src_iovcnt;
2046a506f666SShuhei Matsumoto 	req.aux_iovs = task->aux_iovs;
2047a506f666SShuhei Matsumoto 	req.aux_iovcnt = task->aux_iovcnt;
2048a506f666SShuhei Matsumoto 	req.num_blocks = task->num_blocks;
2049a506f666SShuhei Matsumoto 	req.ctx = &task->dif_ctx;
2050a506f666SShuhei Matsumoto 	req.err = &task->dif_err;
2051a506f666SShuhei Matsumoto 	req.cb_fn = accel_dif_oper_done;
2052a506f666SShuhei Matsumoto 	req.cb_arg = task;
2053a506f666SShuhei Matsumoto 
2054a506f666SShuhei Matsumoto 	execute_spdk_function(accel_dif_generate_copy_sequence_test, &req);
2055a506f666SShuhei Matsumoto 	CU_ASSERT_EQUAL(g_completion_success, true);
2056a506f666SShuhei Matsumoto 
2057a506f666SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&task->dif_ctx,
2058a506f666SShuhei Matsumoto 			       g_block_size_bytes + g_md_size_bytes,
2059a506f666SShuhei Matsumoto 			       g_md_size_bytes, true, true,
2060a506f666SShuhei Matsumoto 			       SPDK_DIF_TYPE1,
2061a506f666SShuhei Matsumoto 			       dif_flags,
2062a506f666SShuhei Matsumoto 			       16, 0xFFFF, 10, 0, 0, &dif_opts);
2063a506f666SShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(rc == 0);
2064a506f666SShuhei Matsumoto 
2065a506f666SShuhei Matsumoto 	rc = spdk_dif_verify(req.dst_iovs, req.dst_iovcnt, req.num_blocks,
2066a506f666SShuhei Matsumoto 			     &task->dif_ctx, &err_blk);
2067a506f666SShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(rc == 0);
2068a506f666SShuhei Matsumoto 
2069a506f666SShuhei Matsumoto 	free_dif_generate_copy_sequence_bufs(task);
2070a506f666SShuhei Matsumoto }
2071a506f666SShuhei Matsumoto 
2072a506f666SShuhei Matsumoto static void
2073a506f666SShuhei Matsumoto accel_dif_generate_copy_sequence_dif_generated_guard_check(void)
2074a506f666SShuhei Matsumoto {
2075a506f666SShuhei Matsumoto 	accel_dif_generate_copy_sequence_dif_generated_do_check(SPDK_DIF_FLAGS_GUARD_CHECK);
2076a506f666SShuhei Matsumoto }
2077a506f666SShuhei Matsumoto 
2078a506f666SShuhei Matsumoto static void
2079a506f666SShuhei Matsumoto accel_dif_generate_copy_sequence_dif_generated_apptag_check(void)
2080a506f666SShuhei Matsumoto {
2081a506f666SShuhei Matsumoto 	accel_dif_generate_copy_sequence_dif_generated_do_check(SPDK_DIF_FLAGS_APPTAG_CHECK);
2082a506f666SShuhei Matsumoto }
2083a506f666SShuhei Matsumoto 
2084a506f666SShuhei Matsumoto static void
2085a506f666SShuhei Matsumoto accel_dif_generate_copy_sequence_dif_generated_reftag_check(void)
2086a506f666SShuhei Matsumoto {
2087a506f666SShuhei Matsumoto 	accel_dif_generate_copy_sequence_dif_generated_do_check(SPDK_DIF_FLAGS_REFTAG_CHECK);
2088a506f666SShuhei Matsumoto }
2089a506f666SShuhei Matsumoto 
2090a506f666SShuhei Matsumoto static void
2091a506f666SShuhei Matsumoto accel_dif_verify_copy_sequence_dif_generated_do_check(uint32_t dif_flags)
2092a506f666SShuhei Matsumoto {
2093a506f666SShuhei Matsumoto 	struct spdk_dif_ctx_init_ext_opts dif_opts;
2094a506f666SShuhei Matsumoto 	struct accel_dif_request req;
2095a506f666SShuhei Matsumoto 	struct dif_task *task = &g_dif_task;
2096a506f666SShuhei Matsumoto 	int rc;
2097a506f666SShuhei Matsumoto 
2098a506f666SShuhei Matsumoto 	rc = alloc_dif_verify_copy_bufs(task, 1);
2099a506f666SShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(rc == 0);
2100a506f666SShuhei Matsumoto 
2101a506f666SShuhei Matsumoto 	dif_opts.size = SPDK_SIZEOF(&dif_opts, dif_pi_format);
2102a506f666SShuhei Matsumoto 	dif_opts.dif_pi_format = SPDK_DIF_PI_FORMAT_16;
2103a506f666SShuhei Matsumoto 
2104a506f666SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&task->dif_ctx,
2105a506f666SShuhei Matsumoto 			       g_block_size_bytes + g_md_size_bytes,
2106a506f666SShuhei Matsumoto 			       g_md_size_bytes, true, true,
2107a506f666SShuhei Matsumoto 			       SPDK_DIF_TYPE1,
2108a506f666SShuhei Matsumoto 			       SPDK_DIF_FLAGS_GUARD_CHECK |
2109a506f666SShuhei Matsumoto 			       SPDK_DIF_FLAGS_APPTAG_CHECK |
2110a506f666SShuhei Matsumoto 			       SPDK_DIF_FLAGS_REFTAG_CHECK,
2111a506f666SShuhei Matsumoto 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
2112a506f666SShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(rc == 0);
2113a506f666SShuhei Matsumoto 
2114a506f666SShuhei Matsumoto 	rc = spdk_dif_generate(task->src_iovs, task->src_iovcnt, task->num_blocks, &task->dif_ctx);
2115a506f666SShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(rc == 0);
2116a506f666SShuhei Matsumoto 
2117a506f666SShuhei Matsumoto 	rc = spdk_dif_ctx_init(&task->dif_ctx,
2118a506f666SShuhei Matsumoto 			       g_block_size_bytes + g_md_size_bytes,
2119a506f666SShuhei Matsumoto 			       g_md_size_bytes, true, true,
2120a506f666SShuhei Matsumoto 			       SPDK_DIF_TYPE1,
2121a506f666SShuhei Matsumoto 			       dif_flags,
2122a506f666SShuhei Matsumoto 			       10, 0xFFFF, 20, 0, 0, &dif_opts);
2123a506f666SShuhei Matsumoto 	SPDK_CU_ASSERT_FATAL(rc == 0);
2124a506f666SShuhei Matsumoto 
2125a506f666SShuhei Matsumoto 	req.channel = g_channel;
2126a506f666SShuhei Matsumoto 	req.dst_iovs = task->dst_iovs;
2127a506f666SShuhei Matsumoto 	req.dst_iovcnt = task->dst_iovcnt;
2128a506f666SShuhei Matsumoto 	req.src_iovs = task->src_iovs;
2129a506f666SShuhei Matsumoto 	req.src_iovcnt = task->src_iovcnt;
2130a506f666SShuhei Matsumoto 	req.num_blocks = task->num_blocks;
2131a506f666SShuhei Matsumoto 	req.ctx = &task->dif_ctx;
2132a506f666SShuhei Matsumoto 	req.err = &task->dif_err;
2133a506f666SShuhei Matsumoto 	req.cb_fn = accel_dif_oper_done;
2134a506f666SShuhei Matsumoto 	req.cb_arg = task;
2135a506f666SShuhei Matsumoto 
2136a506f666SShuhei Matsumoto 	execute_spdk_function(accel_dif_verify_copy_sequence_test, &req);
2137a506f666SShuhei Matsumoto 	CU_ASSERT_EQUAL(g_completion_success, true);
2138a506f666SShuhei Matsumoto 
2139a506f666SShuhei Matsumoto 	free_dif_verify_copy_bufs(task);
2140a506f666SShuhei Matsumoto }
2141a506f666SShuhei Matsumoto 
2142a506f666SShuhei Matsumoto static void
2143a506f666SShuhei Matsumoto accel_dif_verify_copy_sequence_dif_generated_guard_check(void)
2144a506f666SShuhei Matsumoto {
2145a506f666SShuhei Matsumoto 	accel_dif_verify_copy_sequence_dif_generated_do_check(SPDK_DIF_FLAGS_GUARD_CHECK);
2146a506f666SShuhei Matsumoto }
2147a506f666SShuhei Matsumoto 
2148a506f666SShuhei Matsumoto static void
2149a506f666SShuhei Matsumoto accel_dif_verify_copy_sequence_dif_generated_apptag_check(void)
2150a506f666SShuhei Matsumoto {
2151a506f666SShuhei Matsumoto 	accel_dif_verify_copy_sequence_dif_generated_do_check(SPDK_DIF_FLAGS_APPTAG_CHECK);
2152a506f666SShuhei Matsumoto }
2153a506f666SShuhei Matsumoto 
2154a506f666SShuhei Matsumoto static void
2155a506f666SShuhei Matsumoto accel_dif_verify_copy_sequence_dif_generated_reftag_check(void)
2156a506f666SShuhei Matsumoto {
2157a506f666SShuhei Matsumoto 	accel_dif_verify_copy_sequence_dif_generated_do_check(SPDK_DIF_FLAGS_REFTAG_CHECK);
2158a506f666SShuhei Matsumoto }
2159a506f666SShuhei Matsumoto 
2160a506f666SShuhei Matsumoto static void
216159456660SKrzysztof Sprzaczkowski _stop_init_thread(void *arg)
216259456660SKrzysztof Sprzaczkowski {
216359456660SKrzysztof Sprzaczkowski 	unsigned num_failures = g_num_failures;
216459456660SKrzysztof Sprzaczkowski 
216559456660SKrzysztof Sprzaczkowski 	g_num_failures = 0;
216659456660SKrzysztof Sprzaczkowski 
216759456660SKrzysztof Sprzaczkowski 	assert(spdk_get_thread() == g_thread[WORKER_UT]);
216859456660SKrzysztof Sprzaczkowski 	assert(spdk_thread_is_app_thread(NULL));
216959456660SKrzysztof Sprzaczkowski 	execute_spdk_function(exit_io_thread, NULL);
217059456660SKrzysztof Sprzaczkowski 	spdk_app_stop(num_failures);
217159456660SKrzysztof Sprzaczkowski }
217259456660SKrzysztof Sprzaczkowski 
217359456660SKrzysztof Sprzaczkowski static void
217459456660SKrzysztof Sprzaczkowski stop_init_thread(unsigned num_failures, struct spdk_jsonrpc_request *request)
217559456660SKrzysztof Sprzaczkowski {
217659456660SKrzysztof Sprzaczkowski 	g_num_failures = num_failures;
217759456660SKrzysztof Sprzaczkowski 
217859456660SKrzysztof Sprzaczkowski 	spdk_thread_send_msg(g_thread[WORKER_UT], _stop_init_thread, request);
217959456660SKrzysztof Sprzaczkowski }
218059456660SKrzysztof Sprzaczkowski 
218159456660SKrzysztof Sprzaczkowski static int
218259456660SKrzysztof Sprzaczkowski setup_accel_tests(void)
218359456660SKrzysztof Sprzaczkowski {
218459456660SKrzysztof Sprzaczkowski 	unsigned rc = 0;
218559456660SKrzysztof Sprzaczkowski 	CU_pSuite suite = NULL;
218659456660SKrzysztof Sprzaczkowski 
218759456660SKrzysztof Sprzaczkowski 	suite = CU_add_suite("accel_dif", NULL, NULL);
218859456660SKrzysztof Sprzaczkowski 	if (suite == NULL) {
218959456660SKrzysztof Sprzaczkowski 		CU_cleanup_registry();
219059456660SKrzysztof Sprzaczkowski 		rc = CU_get_error();
219159456660SKrzysztof Sprzaczkowski 		return -rc;
219259456660SKrzysztof Sprzaczkowski 	}
219359456660SKrzysztof Sprzaczkowski 
219459456660SKrzysztof Sprzaczkowski 	if (CU_add_test(suite, "verify: DIF generated, GUARD check",
219559456660SKrzysztof Sprzaczkowski 			accel_dif_verify_op_dif_generated_guard_check) == NULL ||
2196a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIX generated, GUARD check",
2197a63a45fcSSlawomir Ptak 			accel_dix_verify_op_dix_generated_guard_check) == NULL ||
219859456660SKrzysztof Sprzaczkowski 	    CU_add_test(suite, "verify: DIF generated, APPTAG check",
219959456660SKrzysztof Sprzaczkowski 			accel_dif_verify_op_dif_generated_apptag_check) == NULL ||
2200a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIX generated, APPTAG check",
2201a63a45fcSSlawomir Ptak 			accel_dix_verify_op_dix_generated_apptag_check) == NULL ||
220259456660SKrzysztof Sprzaczkowski 	    CU_add_test(suite, "verify: DIF generated, REFTAG check",
220359456660SKrzysztof Sprzaczkowski 			accel_dif_verify_op_dif_generated_reftag_check) == NULL ||
2204a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIX generated, REFTAG check",
2205a63a45fcSSlawomir Ptak 			accel_dix_verify_op_dix_generated_reftag_check) == NULL ||
2206a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIX generated, all flags check",
2207a63a45fcSSlawomir Ptak 			accel_dix_verify_op_dix_generated_all_flags_check) == NULL ||
220859456660SKrzysztof Sprzaczkowski 
220959456660SKrzysztof Sprzaczkowski 	    CU_add_test(suite, "verify: DIF not generated, GUARD check",
221059456660SKrzysztof Sprzaczkowski 			accel_dif_verify_op_dif_not_generated_guard_check) == NULL ||
2211a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIX not generated, GUARD check",
2212a63a45fcSSlawomir Ptak 			accel_dix_verify_op_dix_not_generated_guard_check) == NULL ||
221359456660SKrzysztof Sprzaczkowski 	    CU_add_test(suite, "verify: DIF not generated, APPTAG check",
221459456660SKrzysztof Sprzaczkowski 			accel_dif_verify_op_dif_not_generated_apptag_check) == NULL ||
2215a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIX not generated, APPTAG check",
2216a63a45fcSSlawomir Ptak 			accel_dix_verify_op_dix_not_generated_apptag_check) == NULL ||
221759456660SKrzysztof Sprzaczkowski 	    CU_add_test(suite, "verify: DIF not generated, REFTAG check",
221859456660SKrzysztof Sprzaczkowski 			accel_dif_verify_op_dif_not_generated_reftag_check) == NULL ||
2219a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIX not generated, REFTAG check",
2220a63a45fcSSlawomir Ptak 			accel_dix_verify_op_dix_not_generated_reftag_check) == NULL ||
2221a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIX not generated, all flags check",
2222a63a45fcSSlawomir Ptak 			accel_dix_verify_op_dix_not_generated_all_flags_check) == NULL ||
2223*f74d16beSSlawomir Ptak 	    CU_add_test(suite, "verify: DIX guard not generated, all flags check",
2224*f74d16beSSlawomir Ptak 			accel_dix_verify_op_dix_guard_not_generated_all_flags_check) == NULL ||
2225*f74d16beSSlawomir Ptak 	    CU_add_test(suite, "verify: DIX apptag not generated, all flags check",
2226*f74d16beSSlawomir Ptak 			accel_dix_verify_op_dix_apptag_not_generated_all_flags_check) == NULL ||
2227*f74d16beSSlawomir Ptak 	    CU_add_test(suite, "verify: DIX reftag not generated, all flags check",
2228*f74d16beSSlawomir Ptak 			accel_dix_verify_op_dix_reftag_not_generated_all_flags_check) == NULL ||
222959456660SKrzysztof Sprzaczkowski 
2230a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIF APPTAG correct, APPTAG check",
223159456660SKrzysztof Sprzaczkowski 			accel_dif_verify_op_apptag_correct_apptag_check) == NULL ||
2232a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIX APPTAG correct, APPTAG check",
2233a63a45fcSSlawomir Ptak 			accel_dix_verify_op_apptag_correct_apptag_check) == NULL ||
2234a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIF APPTAG incorrect, APPTAG check",
223559456660SKrzysztof Sprzaczkowski 			accel_dif_verify_op_apptag_incorrect_apptag_check) == NULL ||
2236a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIX APPTAG incorrect, APPTAG check",
2237a63a45fcSSlawomir Ptak 			accel_dix_verify_op_apptag_incorrect_apptag_check) == NULL ||
2238a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIF APPTAG incorrect, no APPTAG check",
223959456660SKrzysztof Sprzaczkowski 			accel_dif_verify_op_apptag_incorrect_no_apptag_check) == NULL ||
2240a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIX APPTAG incorrect, no APPTAG check",
2241a63a45fcSSlawomir Ptak 			accel_dix_verify_op_apptag_incorrect_no_apptag_check) == NULL ||
2242a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIF REFTAG incorrect, REFTAG ignore",
224359456660SKrzysztof Sprzaczkowski 			accel_dif_verify_op_reftag_incorrect_reftag_ignore) == NULL ||
2244a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIX REFTAG incorrect, REFTAG ignore",
2245a63a45fcSSlawomir Ptak 			accel_dix_verify_op_reftag_incorrect_reftag_ignore) == NULL ||
224659456660SKrzysztof Sprzaczkowski 
2247a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIF REFTAG_INIT correct, REFTAG check",
224859456660SKrzysztof Sprzaczkowski 			accel_dif_verify_op_reftag_init_correct_reftag_check) == NULL ||
2249a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIX REFTAG_INIT correct, REFTAG check",
2250a63a45fcSSlawomir Ptak 			accel_dix_verify_op_reftag_init_correct_reftag_check) == NULL ||
2251a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIF REFTAG_INIT incorrect, REFTAG check",
2252f62ac001SKrzysztof Sprzaczkowski 			accel_dif_verify_op_reftag_init_incorrect_reftag_check) == NULL ||
2253a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "verify: DIX REFTAG_INIT incorrect, REFTAG check",
2254a63a45fcSSlawomir Ptak 			accel_dix_verify_op_reftag_init_incorrect_reftag_check) == NULL ||
2255f62ac001SKrzysztof Sprzaczkowski 
2256086cb8deSKrzysztof Sprzaczkowski 	    CU_add_test(suite, "verify copy: DIF generated, GUARD check",
2257086cb8deSKrzysztof Sprzaczkowski 			accel_dif_verify_copy_op_dif_generated_guard_check) == NULL ||
2258086cb8deSKrzysztof Sprzaczkowski 	    CU_add_test(suite, "verify copy: DIF generated, APPTAG check",
2259086cb8deSKrzysztof Sprzaczkowski 			accel_dif_verify_copy_op_dif_generated_apptag_check) == NULL ||
2260086cb8deSKrzysztof Sprzaczkowski 	    CU_add_test(suite, "verify copy: DIF generated, REFTAG check",
2261086cb8deSKrzysztof Sprzaczkowski 			accel_dif_verify_copy_op_dif_generated_reftag_check) == NULL ||
2262086cb8deSKrzysztof Sprzaczkowski 
2263086cb8deSKrzysztof Sprzaczkowski 	    CU_add_test(suite, "verify copy: DIF not generated, GUARD check",
2264086cb8deSKrzysztof Sprzaczkowski 			accel_dif_verify_copy_op_dif_not_generated_guard_check) == NULL ||
2265086cb8deSKrzysztof Sprzaczkowski 	    CU_add_test(suite, "verify copy: DIF not generated, APPTAG check",
2266086cb8deSKrzysztof Sprzaczkowski 			accel_dif_verify_copy_op_dif_not_generated_apptag_check) == NULL ||
2267086cb8deSKrzysztof Sprzaczkowski 	    CU_add_test(suite, "verify copy: DIF not generated, REFTAG check",
2268086cb8deSKrzysztof Sprzaczkowski 			accel_dif_verify_copy_op_dif_not_generated_reftag_check) == NULL ||
2269086cb8deSKrzysztof Sprzaczkowski 
2270f62ac001SKrzysztof Sprzaczkowski 	    CU_add_test(suite, "generate copy: DIF generated, GUARD check",
2271f62ac001SKrzysztof Sprzaczkowski 			accel_dif_generate_copy_op_dif_generated_guard_check) == NULL ||
2272f62ac001SKrzysztof Sprzaczkowski 	    CU_add_test(suite, "generate copy: DIF generated, APTTAG check",
2273f62ac001SKrzysztof Sprzaczkowski 			accel_dif_generate_copy_op_dif_generated_apptag_check) == NULL ||
2274f62ac001SKrzysztof Sprzaczkowski 	    CU_add_test(suite, "generate copy: DIF generated, REFTAG check",
2275f62ac001SKrzysztof Sprzaczkowski 			accel_dif_generate_copy_op_dif_generated_reftag_check) == NULL ||
2276f62ac001SKrzysztof Sprzaczkowski 
2277a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "generate: DIX generated, GUARD check",
2278a63a45fcSSlawomir Ptak 			accel_dix_generate_op_dix_generated_guard_check) == NULL ||
2279a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "generate: DIX generated, APTTAG check",
2280a63a45fcSSlawomir Ptak 			accel_dix_generate_op_dix_generated_apptag_check) == NULL ||
2281a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "generate: DIX generated, REFTAG check",
2282a63a45fcSSlawomir Ptak 			accel_dix_generate_op_dix_generated_reftag_check) == NULL ||
2283a63a45fcSSlawomir Ptak 
2284f62ac001SKrzysztof Sprzaczkowski 	    CU_add_test(suite, "generate copy: DIF generated, no GUARD check flag set",
2285f62ac001SKrzysztof Sprzaczkowski 			accel_dif_generate_copy_op_dif_generated_no_guard_check_flag_set) == NULL ||
2286f62ac001SKrzysztof Sprzaczkowski 	    CU_add_test(suite, "generate copy: DIF generated, no APPTAG check flag set",
2287f62ac001SKrzysztof Sprzaczkowski 			accel_dif_generate_copy_op_dif_generated_no_apptag_check_flag_set) == NULL ||
2288f62ac001SKrzysztof Sprzaczkowski 	    CU_add_test(suite, "generate copy: DIF generated, no REFTAG check flag set",
2289f62ac001SKrzysztof Sprzaczkowski 			accel_dif_generate_copy_op_dif_generated_no_reftag_check_flag_set) == NULL ||
2290f62ac001SKrzysztof Sprzaczkowski 
2291a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "generate copy: DIF iovecs-len validate",
2292f62ac001SKrzysztof Sprzaczkowski 			accel_dif_generate_copy_op_iovecs_len_validate) == NULL ||
2293a63a45fcSSlawomir Ptak 	    CU_add_test(suite, "generate copy: DIF buffer alignment validate",
2294a506f666SShuhei Matsumoto 			accel_dif_generate_copy_op_buf_align_validate) == NULL ||
2295a506f666SShuhei Matsumoto 
2296a506f666SShuhei Matsumoto 	    CU_add_test(suite, "generate copy sequence: DIF generated, GUARD check",
2297a506f666SShuhei Matsumoto 			accel_dif_generate_copy_sequence_dif_generated_guard_check) == NULL ||
2298a506f666SShuhei Matsumoto 	    CU_add_test(suite, "generate copy sequence: DIF generated, APTTAG check",
2299a506f666SShuhei Matsumoto 			accel_dif_generate_copy_sequence_dif_generated_apptag_check) == NULL ||
2300a506f666SShuhei Matsumoto 	    CU_add_test(suite, "generate copy sequence: DIF generated, REFTAG check",
2301a506f666SShuhei Matsumoto 			accel_dif_generate_copy_sequence_dif_generated_reftag_check) == NULL ||
2302a506f666SShuhei Matsumoto 	    CU_add_test(suite, "verify copy sequence: DIF generated, GUARD check",
2303a506f666SShuhei Matsumoto 			accel_dif_verify_copy_sequence_dif_generated_guard_check) == NULL ||
2304a506f666SShuhei Matsumoto 	    CU_add_test(suite, "verify copy sequence: DIF generated, APPTAG check",
2305a506f666SShuhei Matsumoto 			accel_dif_verify_copy_sequence_dif_generated_apptag_check) == NULL ||
2306a506f666SShuhei Matsumoto 	    CU_add_test(suite, "verify copy sequence: DIF generated, REFTAG check",
2307a506f666SShuhei Matsumoto 			accel_dif_verify_copy_sequence_dif_generated_reftag_check) == NULL) {
230859456660SKrzysztof Sprzaczkowski 		CU_cleanup_registry();
230959456660SKrzysztof Sprzaczkowski 		rc = CU_get_error();
231059456660SKrzysztof Sprzaczkowski 		return -rc;
231159456660SKrzysztof Sprzaczkowski 	}
231259456660SKrzysztof Sprzaczkowski 	return 0;
231359456660SKrzysztof Sprzaczkowski }
231459456660SKrzysztof Sprzaczkowski 
231559456660SKrzysztof Sprzaczkowski static void
231659456660SKrzysztof Sprzaczkowski get_io_channel(void *arg)
231759456660SKrzysztof Sprzaczkowski {
231859456660SKrzysztof Sprzaczkowski 	g_channel = spdk_accel_get_io_channel();
231959456660SKrzysztof Sprzaczkowski 	assert(g_channel);
232059456660SKrzysztof Sprzaczkowski 	wake_ut_thread();
232159456660SKrzysztof Sprzaczkowski }
232259456660SKrzysztof Sprzaczkowski 
232359456660SKrzysztof Sprzaczkowski static void
232459456660SKrzysztof Sprzaczkowski put_io_channel(void *arg)
232559456660SKrzysztof Sprzaczkowski {
232659456660SKrzysztof Sprzaczkowski 	assert(g_channel);
232759456660SKrzysztof Sprzaczkowski 	spdk_put_io_channel(g_channel);
232859456660SKrzysztof Sprzaczkowski 	wake_ut_thread();
232959456660SKrzysztof Sprzaczkowski }
233059456660SKrzysztof Sprzaczkowski 
233159456660SKrzysztof Sprzaczkowski static void
233259456660SKrzysztof Sprzaczkowski run_accel_test_thread(void *arg)
233359456660SKrzysztof Sprzaczkowski {
233459456660SKrzysztof Sprzaczkowski 	struct spdk_jsonrpc_request *request = arg;
233559456660SKrzysztof Sprzaczkowski 	int rc = 0;
233659456660SKrzysztof Sprzaczkowski 
233759456660SKrzysztof Sprzaczkowski 	execute_spdk_function(get_io_channel, NULL);
233859456660SKrzysztof Sprzaczkowski 	if (g_channel == NULL) {
233959456660SKrzysztof Sprzaczkowski 		fprintf(stderr, "Unable to get an accel channel\n");
234059456660SKrzysztof Sprzaczkowski 		goto ret;
234159456660SKrzysztof Sprzaczkowski 	}
234259456660SKrzysztof Sprzaczkowski 
234359456660SKrzysztof Sprzaczkowski 	if (CU_initialize_registry() != CUE_SUCCESS) {
234459456660SKrzysztof Sprzaczkowski 		/* CUnit error, probably won't recover */
234559456660SKrzysztof Sprzaczkowski 		rc = CU_get_error();
234659456660SKrzysztof Sprzaczkowski 		rc = -rc;
234759456660SKrzysztof Sprzaczkowski 		goto ret;
234859456660SKrzysztof Sprzaczkowski 	}
234959456660SKrzysztof Sprzaczkowski 
235059456660SKrzysztof Sprzaczkowski 	rc = setup_accel_tests();
235159456660SKrzysztof Sprzaczkowski 	if (rc < 0) {
235259456660SKrzysztof Sprzaczkowski 		/* CUnit error, probably won't recover */
235359456660SKrzysztof Sprzaczkowski 		rc = -rc;
235459456660SKrzysztof Sprzaczkowski 		goto ret;
235559456660SKrzysztof Sprzaczkowski 	}
235659456660SKrzysztof Sprzaczkowski 	CU_basic_set_mode(CU_BRM_VERBOSE);
235759456660SKrzysztof Sprzaczkowski 	CU_basic_run_tests();
235859456660SKrzysztof Sprzaczkowski 	rc = CU_get_number_of_failures();
235959456660SKrzysztof Sprzaczkowski 	CU_cleanup_registry();
236059456660SKrzysztof Sprzaczkowski 
236159456660SKrzysztof Sprzaczkowski ret:
236259456660SKrzysztof Sprzaczkowski 	if (g_channel != NULL) {
236359456660SKrzysztof Sprzaczkowski 		execute_spdk_function(put_io_channel, NULL);
236459456660SKrzysztof Sprzaczkowski 	}
236559456660SKrzysztof Sprzaczkowski 	stop_init_thread(rc, request);
236659456660SKrzysztof Sprzaczkowski }
236759456660SKrzysztof Sprzaczkowski 
236859456660SKrzysztof Sprzaczkowski static void
236959456660SKrzysztof Sprzaczkowski accel_dif_test_main(void *arg1)
237059456660SKrzysztof Sprzaczkowski {
237159456660SKrzysztof Sprzaczkowski 	struct spdk_cpuset tmpmask = {};
237259456660SKrzysztof Sprzaczkowski 	uint32_t i;
237359456660SKrzysztof Sprzaczkowski 
237459456660SKrzysztof Sprzaczkowski 	pthread_mutex_init(&g_test_mutex, NULL);
237559456660SKrzysztof Sprzaczkowski 	pthread_cond_init(&g_test_cond, NULL);
237659456660SKrzysztof Sprzaczkowski 
237759456660SKrzysztof Sprzaczkowski 	/* This test runs specifically on at least two cores.
237859456660SKrzysztof Sprzaczkowski 	 * g_thread[WORKER_UT] is the app_thread on main core from event framework.
237959456660SKrzysztof Sprzaczkowski 	 * Next one is only for the tests and should always be on separate CPU cores. */
238059456660SKrzysztof Sprzaczkowski 	if (spdk_env_get_core_count() < 3) {
238159456660SKrzysztof Sprzaczkowski 		spdk_app_stop(-1);
238259456660SKrzysztof Sprzaczkowski 		return;
238359456660SKrzysztof Sprzaczkowski 	}
238459456660SKrzysztof Sprzaczkowski 
238559456660SKrzysztof Sprzaczkowski 	SPDK_ENV_FOREACH_CORE(i) {
238659456660SKrzysztof Sprzaczkowski 		if (i == spdk_env_get_current_core()) {
238759456660SKrzysztof Sprzaczkowski 			g_thread[WORKER_UT] = spdk_get_thread();
238859456660SKrzysztof Sprzaczkowski 			continue;
238959456660SKrzysztof Sprzaczkowski 		}
239059456660SKrzysztof Sprzaczkowski 		spdk_cpuset_zero(&tmpmask);
239159456660SKrzysztof Sprzaczkowski 		spdk_cpuset_set_cpu(&tmpmask, i, true);
239259456660SKrzysztof Sprzaczkowski 		if (g_thread[WORKER_IO] == NULL) {
239359456660SKrzysztof Sprzaczkowski 			g_thread[WORKER_IO] = spdk_thread_create("io_thread", &tmpmask);
239459456660SKrzysztof Sprzaczkowski 		}
239559456660SKrzysztof Sprzaczkowski 
239659456660SKrzysztof Sprzaczkowski 	}
239759456660SKrzysztof Sprzaczkowski 
239859456660SKrzysztof Sprzaczkowski 	spdk_thread_send_msg(g_thread[WORKER_UT], run_accel_test_thread, NULL);
239959456660SKrzysztof Sprzaczkowski }
240059456660SKrzysztof Sprzaczkowski 
240159456660SKrzysztof Sprzaczkowski static void
240259456660SKrzysztof Sprzaczkowski accel_dif_usage(void)
240359456660SKrzysztof Sprzaczkowski {
240459456660SKrzysztof Sprzaczkowski }
240559456660SKrzysztof Sprzaczkowski 
240659456660SKrzysztof Sprzaczkowski static int
240759456660SKrzysztof Sprzaczkowski accel_dif_parse_arg(int ch, char *arg)
240859456660SKrzysztof Sprzaczkowski {
240959456660SKrzysztof Sprzaczkowski 	return 0;
241059456660SKrzysztof Sprzaczkowski }
241159456660SKrzysztof Sprzaczkowski 
241259456660SKrzysztof Sprzaczkowski static void
241359456660SKrzysztof Sprzaczkowski spdk_dif_shutdown_cb(void)
241459456660SKrzysztof Sprzaczkowski {
241559456660SKrzysztof Sprzaczkowski 	g_shutdown = true;
241659456660SKrzysztof Sprzaczkowski 	spdk_thread_send_msg(g_thread[WORKER_UT], _stop_init_thread, NULL);
241759456660SKrzysztof Sprzaczkowski }
241859456660SKrzysztof Sprzaczkowski 
241959456660SKrzysztof Sprzaczkowski int
242059456660SKrzysztof Sprzaczkowski main(int argc, char **argv)
242159456660SKrzysztof Sprzaczkowski {
242259456660SKrzysztof Sprzaczkowski 	struct spdk_app_opts opts = {};
242359456660SKrzysztof Sprzaczkowski 	char reactor_mask[8];
242459456660SKrzysztof Sprzaczkowski 	int rc;
242559456660SKrzysztof Sprzaczkowski 
242659456660SKrzysztof Sprzaczkowski 	spdk_app_opts_init(&opts, sizeof(opts));
242759456660SKrzysztof Sprzaczkowski 	opts.name = "DIF";
242859456660SKrzysztof Sprzaczkowski 	snprintf(reactor_mask, sizeof(reactor_mask), "0x%x", (1 << (SPDK_COUNTOF(g_thread) + 1)) - 1);
242959456660SKrzysztof Sprzaczkowski 	opts.reactor_mask = reactor_mask;
243059456660SKrzysztof Sprzaczkowski 	opts.shutdown_cb = spdk_dif_shutdown_cb;
24315db859daSKrzysztof Karas 	opts.rpc_addr = NULL;
243259456660SKrzysztof Sprzaczkowski 
243359456660SKrzysztof Sprzaczkowski 	if ((rc = spdk_app_parse_args(argc, argv, &opts, "", NULL,
243459456660SKrzysztof Sprzaczkowski 				      accel_dif_parse_arg, accel_dif_usage)) !=
243559456660SKrzysztof Sprzaczkowski 	    SPDK_APP_PARSE_ARGS_SUCCESS) {
243659456660SKrzysztof Sprzaczkowski 		return rc;
243759456660SKrzysztof Sprzaczkowski 	}
243859456660SKrzysztof Sprzaczkowski 
243959456660SKrzysztof Sprzaczkowski 	rc = spdk_app_start(&opts, accel_dif_test_main, NULL);
244059456660SKrzysztof Sprzaczkowski 	spdk_app_fini();
244159456660SKrzysztof Sprzaczkowski 
244259456660SKrzysztof Sprzaczkowski 	return rc;
244359456660SKrzysztof Sprzaczkowski }
2444