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