1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause 2d30ea906Sjfb8856606 * Copyright(c) 2017 Intel Corporation 3d30ea906Sjfb8856606 */ 4d30ea906Sjfb8856606 5d30ea906Sjfb8856606 #include <stdio.h> 6d30ea906Sjfb8856606 #include <inttypes.h> 7d30ea906Sjfb8856606 #include <math.h> 8d30ea906Sjfb8856606 9d30ea906Sjfb8856606 #include <rte_eal.h> 10d30ea906Sjfb8856606 #include <rte_common.h> 11d30ea906Sjfb8856606 #include <rte_dev.h> 12d30ea906Sjfb8856606 #include <rte_launch.h> 13d30ea906Sjfb8856606 #include <rte_bbdev.h> 14d30ea906Sjfb8856606 #include <rte_cycles.h> 15d30ea906Sjfb8856606 #include <rte_lcore.h> 16d30ea906Sjfb8856606 #include <rte_malloc.h> 17d30ea906Sjfb8856606 #include <rte_random.h> 18d30ea906Sjfb8856606 #include <rte_hexdump.h> 19*4418919fSjohnjiang #include <rte_interrupts.h> 20*4418919fSjohnjiang 21*4418919fSjohnjiang #ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC 22*4418919fSjohnjiang #include <fpga_lte_fec.h> 23*4418919fSjohnjiang #endif 24d30ea906Sjfb8856606 25d30ea906Sjfb8856606 #include "main.h" 26d30ea906Sjfb8856606 #include "test_bbdev_vector.h" 27d30ea906Sjfb8856606 28d30ea906Sjfb8856606 #define GET_SOCKET(socket_id) (((socket_id) == SOCKET_ID_ANY) ? 0 : (socket_id)) 29d30ea906Sjfb8856606 30d30ea906Sjfb8856606 #define MAX_QUEUES RTE_MAX_LCORE 31*4418919fSjohnjiang #define TEST_REPETITIONS 1000 32*4418919fSjohnjiang 33*4418919fSjohnjiang #ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC 34*4418919fSjohnjiang #define FPGA_PF_DRIVER_NAME ("intel_fpga_lte_fec_pf") 35*4418919fSjohnjiang #define FPGA_VF_DRIVER_NAME ("intel_fpga_lte_fec_vf") 36*4418919fSjohnjiang #define VF_UL_QUEUE_VALUE 4 37*4418919fSjohnjiang #define VF_DL_QUEUE_VALUE 4 38*4418919fSjohnjiang #define UL_BANDWIDTH 3 39*4418919fSjohnjiang #define DL_BANDWIDTH 3 40*4418919fSjohnjiang #define UL_LOAD_BALANCE 128 41*4418919fSjohnjiang #define DL_LOAD_BALANCE 128 42*4418919fSjohnjiang #define FLR_TIMEOUT 610 43*4418919fSjohnjiang #endif 44d30ea906Sjfb8856606 45d30ea906Sjfb8856606 #define OPS_CACHE_SIZE 256U 46d30ea906Sjfb8856606 #define OPS_POOL_SIZE_MIN 511U /* 0.5K per queue */ 47d30ea906Sjfb8856606 48d30ea906Sjfb8856606 #define SYNC_WAIT 0 49d30ea906Sjfb8856606 #define SYNC_START 1 50d30ea906Sjfb8856606 51d30ea906Sjfb8856606 #define INVALID_QUEUE_ID -1 52d30ea906Sjfb8856606 53d30ea906Sjfb8856606 static struct test_bbdev_vector test_vector; 54d30ea906Sjfb8856606 55d30ea906Sjfb8856606 /* Switch between PMD and Interrupt for throughput TC */ 56d30ea906Sjfb8856606 static bool intr_enabled; 57d30ea906Sjfb8856606 58d30ea906Sjfb8856606 /* Represents tested active devices */ 59d30ea906Sjfb8856606 static struct active_device { 60d30ea906Sjfb8856606 const char *driver_name; 61d30ea906Sjfb8856606 uint8_t dev_id; 62d30ea906Sjfb8856606 uint16_t supported_ops; 63d30ea906Sjfb8856606 uint16_t queue_ids[MAX_QUEUES]; 64d30ea906Sjfb8856606 uint16_t nb_queues; 65d30ea906Sjfb8856606 struct rte_mempool *ops_mempool; 66d30ea906Sjfb8856606 struct rte_mempool *in_mbuf_pool; 67d30ea906Sjfb8856606 struct rte_mempool *hard_out_mbuf_pool; 68d30ea906Sjfb8856606 struct rte_mempool *soft_out_mbuf_pool; 69*4418919fSjohnjiang struct rte_mempool *harq_in_mbuf_pool; 70*4418919fSjohnjiang struct rte_mempool *harq_out_mbuf_pool; 71d30ea906Sjfb8856606 } active_devs[RTE_BBDEV_MAX_DEVS]; 72d30ea906Sjfb8856606 73d30ea906Sjfb8856606 static uint8_t nb_active_devs; 74d30ea906Sjfb8856606 75d30ea906Sjfb8856606 /* Data buffers used by BBDEV ops */ 76d30ea906Sjfb8856606 struct test_buffers { 77d30ea906Sjfb8856606 struct rte_bbdev_op_data *inputs; 78d30ea906Sjfb8856606 struct rte_bbdev_op_data *hard_outputs; 79d30ea906Sjfb8856606 struct rte_bbdev_op_data *soft_outputs; 80*4418919fSjohnjiang struct rte_bbdev_op_data *harq_inputs; 81*4418919fSjohnjiang struct rte_bbdev_op_data *harq_outputs; 82d30ea906Sjfb8856606 }; 83d30ea906Sjfb8856606 84d30ea906Sjfb8856606 /* Operation parameters specific for given test case */ 85d30ea906Sjfb8856606 struct test_op_params { 86d30ea906Sjfb8856606 struct rte_mempool *mp; 87d30ea906Sjfb8856606 struct rte_bbdev_dec_op *ref_dec_op; 88d30ea906Sjfb8856606 struct rte_bbdev_enc_op *ref_enc_op; 89d30ea906Sjfb8856606 uint16_t burst_sz; 90d30ea906Sjfb8856606 uint16_t num_to_process; 91d30ea906Sjfb8856606 uint16_t num_lcores; 92d30ea906Sjfb8856606 int vector_mask; 93d30ea906Sjfb8856606 rte_atomic16_t sync; 94d30ea906Sjfb8856606 struct test_buffers q_bufs[RTE_MAX_NUMA_NODES][MAX_QUEUES]; 95d30ea906Sjfb8856606 }; 96d30ea906Sjfb8856606 97d30ea906Sjfb8856606 /* Contains per lcore params */ 98d30ea906Sjfb8856606 struct thread_params { 99d30ea906Sjfb8856606 uint8_t dev_id; 100d30ea906Sjfb8856606 uint16_t queue_id; 101*4418919fSjohnjiang uint32_t lcore_id; 102d30ea906Sjfb8856606 uint64_t start_time; 103*4418919fSjohnjiang double ops_per_sec; 104d30ea906Sjfb8856606 double mbps; 105*4418919fSjohnjiang uint8_t iter_count; 106d30ea906Sjfb8856606 rte_atomic16_t nb_dequeued; 107d30ea906Sjfb8856606 rte_atomic16_t processing_status; 108*4418919fSjohnjiang rte_atomic16_t burst_sz; 109d30ea906Sjfb8856606 struct test_op_params *op_params; 110*4418919fSjohnjiang struct rte_bbdev_dec_op *dec_ops[MAX_BURST]; 111*4418919fSjohnjiang struct rte_bbdev_enc_op *enc_ops[MAX_BURST]; 112d30ea906Sjfb8856606 }; 113d30ea906Sjfb8856606 114d30ea906Sjfb8856606 #ifdef RTE_BBDEV_OFFLOAD_COST 115d30ea906Sjfb8856606 /* Stores time statistics */ 116d30ea906Sjfb8856606 struct test_time_stats { 117d30ea906Sjfb8856606 /* Stores software enqueue total working time */ 118*4418919fSjohnjiang uint64_t enq_sw_total_time; 119d30ea906Sjfb8856606 /* Stores minimum value of software enqueue working time */ 120d30ea906Sjfb8856606 uint64_t enq_sw_min_time; 121d30ea906Sjfb8856606 /* Stores maximum value of software enqueue working time */ 122d30ea906Sjfb8856606 uint64_t enq_sw_max_time; 123d30ea906Sjfb8856606 /* Stores turbo enqueue total working time */ 124*4418919fSjohnjiang uint64_t enq_acc_total_time; 125*4418919fSjohnjiang /* Stores minimum value of accelerator enqueue working time */ 126*4418919fSjohnjiang uint64_t enq_acc_min_time; 127*4418919fSjohnjiang /* Stores maximum value of accelerator enqueue working time */ 128*4418919fSjohnjiang uint64_t enq_acc_max_time; 129d30ea906Sjfb8856606 /* Stores dequeue total working time */ 130*4418919fSjohnjiang uint64_t deq_total_time; 131d30ea906Sjfb8856606 /* Stores minimum value of dequeue working time */ 132d30ea906Sjfb8856606 uint64_t deq_min_time; 133d30ea906Sjfb8856606 /* Stores maximum value of dequeue working time */ 134d30ea906Sjfb8856606 uint64_t deq_max_time; 135d30ea906Sjfb8856606 }; 136d30ea906Sjfb8856606 #endif 137d30ea906Sjfb8856606 138d30ea906Sjfb8856606 typedef int (test_case_function)(struct active_device *ad, 139d30ea906Sjfb8856606 struct test_op_params *op_params); 140d30ea906Sjfb8856606 141d30ea906Sjfb8856606 static inline void 142*4418919fSjohnjiang mbuf_reset(struct rte_mbuf *m) 143*4418919fSjohnjiang { 144*4418919fSjohnjiang m->pkt_len = 0; 145*4418919fSjohnjiang 146*4418919fSjohnjiang do { 147*4418919fSjohnjiang m->data_len = 0; 148*4418919fSjohnjiang m = m->next; 149*4418919fSjohnjiang } while (m != NULL); 150*4418919fSjohnjiang } 151*4418919fSjohnjiang 152*4418919fSjohnjiang /* Read flag value 0/1 from bitmap */ 153*4418919fSjohnjiang static inline bool 154*4418919fSjohnjiang check_bit(uint32_t bitmap, uint32_t bitmask) 155*4418919fSjohnjiang { 156*4418919fSjohnjiang return bitmap & bitmask; 157*4418919fSjohnjiang } 158*4418919fSjohnjiang 159*4418919fSjohnjiang static inline void 160d30ea906Sjfb8856606 set_avail_op(struct active_device *ad, enum rte_bbdev_op_type op_type) 161d30ea906Sjfb8856606 { 162d30ea906Sjfb8856606 ad->supported_ops |= (1 << op_type); 163d30ea906Sjfb8856606 } 164d30ea906Sjfb8856606 165d30ea906Sjfb8856606 static inline bool 166d30ea906Sjfb8856606 is_avail_op(struct active_device *ad, enum rte_bbdev_op_type op_type) 167d30ea906Sjfb8856606 { 168d30ea906Sjfb8856606 return ad->supported_ops & (1 << op_type); 169d30ea906Sjfb8856606 } 170d30ea906Sjfb8856606 171d30ea906Sjfb8856606 static inline bool 172d30ea906Sjfb8856606 flags_match(uint32_t flags_req, uint32_t flags_present) 173d30ea906Sjfb8856606 { 174d30ea906Sjfb8856606 return (flags_req & flags_present) == flags_req; 175d30ea906Sjfb8856606 } 176d30ea906Sjfb8856606 177d30ea906Sjfb8856606 static void 178d30ea906Sjfb8856606 clear_soft_out_cap(uint32_t *op_flags) 179d30ea906Sjfb8856606 { 180d30ea906Sjfb8856606 *op_flags &= ~RTE_BBDEV_TURBO_SOFT_OUTPUT; 181d30ea906Sjfb8856606 *op_flags &= ~RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT; 182d30ea906Sjfb8856606 *op_flags &= ~RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT; 183d30ea906Sjfb8856606 } 184d30ea906Sjfb8856606 185d30ea906Sjfb8856606 static int 186d30ea906Sjfb8856606 check_dev_cap(const struct rte_bbdev_info *dev_info) 187d30ea906Sjfb8856606 { 188d30ea906Sjfb8856606 unsigned int i; 189*4418919fSjohnjiang unsigned int nb_inputs, nb_soft_outputs, nb_hard_outputs, 190*4418919fSjohnjiang nb_harq_inputs, nb_harq_outputs; 191d30ea906Sjfb8856606 const struct rte_bbdev_op_cap *op_cap = dev_info->drv.capabilities; 192d30ea906Sjfb8856606 193d30ea906Sjfb8856606 nb_inputs = test_vector.entries[DATA_INPUT].nb_segments; 194d30ea906Sjfb8856606 nb_soft_outputs = test_vector.entries[DATA_SOFT_OUTPUT].nb_segments; 195d30ea906Sjfb8856606 nb_hard_outputs = test_vector.entries[DATA_HARD_OUTPUT].nb_segments; 196*4418919fSjohnjiang nb_harq_inputs = test_vector.entries[DATA_HARQ_INPUT].nb_segments; 197*4418919fSjohnjiang nb_harq_outputs = test_vector.entries[DATA_HARQ_OUTPUT].nb_segments; 198d30ea906Sjfb8856606 199d30ea906Sjfb8856606 for (i = 0; op_cap->type != RTE_BBDEV_OP_NONE; ++i, ++op_cap) { 200d30ea906Sjfb8856606 if (op_cap->type != test_vector.op_type) 201d30ea906Sjfb8856606 continue; 202d30ea906Sjfb8856606 203d30ea906Sjfb8856606 if (op_cap->type == RTE_BBDEV_OP_TURBO_DEC) { 204d30ea906Sjfb8856606 const struct rte_bbdev_op_cap_turbo_dec *cap = 205d30ea906Sjfb8856606 &op_cap->cap.turbo_dec; 206d30ea906Sjfb8856606 /* Ignore lack of soft output capability, just skip 207d30ea906Sjfb8856606 * checking if soft output is valid. 208d30ea906Sjfb8856606 */ 209d30ea906Sjfb8856606 if ((test_vector.turbo_dec.op_flags & 210d30ea906Sjfb8856606 RTE_BBDEV_TURBO_SOFT_OUTPUT) && 211d30ea906Sjfb8856606 !(cap->capability_flags & 212d30ea906Sjfb8856606 RTE_BBDEV_TURBO_SOFT_OUTPUT)) { 213d30ea906Sjfb8856606 printf( 214*4418919fSjohnjiang "INFO: Device \"%s\" does not support soft output - soft output flags will be ignored.\n", 215d30ea906Sjfb8856606 dev_info->dev_name); 216d30ea906Sjfb8856606 clear_soft_out_cap( 217d30ea906Sjfb8856606 &test_vector.turbo_dec.op_flags); 218d30ea906Sjfb8856606 } 219d30ea906Sjfb8856606 220d30ea906Sjfb8856606 if (!flags_match(test_vector.turbo_dec.op_flags, 221d30ea906Sjfb8856606 cap->capability_flags)) 222d30ea906Sjfb8856606 return TEST_FAILED; 223d30ea906Sjfb8856606 if (nb_inputs > cap->num_buffers_src) { 224d30ea906Sjfb8856606 printf("Too many inputs defined: %u, max: %u\n", 225d30ea906Sjfb8856606 nb_inputs, cap->num_buffers_src); 226d30ea906Sjfb8856606 return TEST_FAILED; 227d30ea906Sjfb8856606 } 228d30ea906Sjfb8856606 if (nb_soft_outputs > cap->num_buffers_soft_out && 229d30ea906Sjfb8856606 (test_vector.turbo_dec.op_flags & 230d30ea906Sjfb8856606 RTE_BBDEV_TURBO_SOFT_OUTPUT)) { 231d30ea906Sjfb8856606 printf( 232d30ea906Sjfb8856606 "Too many soft outputs defined: %u, max: %u\n", 233d30ea906Sjfb8856606 nb_soft_outputs, 234d30ea906Sjfb8856606 cap->num_buffers_soft_out); 235d30ea906Sjfb8856606 return TEST_FAILED; 236d30ea906Sjfb8856606 } 237d30ea906Sjfb8856606 if (nb_hard_outputs > cap->num_buffers_hard_out) { 238d30ea906Sjfb8856606 printf( 239d30ea906Sjfb8856606 "Too many hard outputs defined: %u, max: %u\n", 240d30ea906Sjfb8856606 nb_hard_outputs, 241d30ea906Sjfb8856606 cap->num_buffers_hard_out); 242d30ea906Sjfb8856606 return TEST_FAILED; 243d30ea906Sjfb8856606 } 244d30ea906Sjfb8856606 if (intr_enabled && !(cap->capability_flags & 245d30ea906Sjfb8856606 RTE_BBDEV_TURBO_DEC_INTERRUPTS)) { 246d30ea906Sjfb8856606 printf( 247d30ea906Sjfb8856606 "Dequeue interrupts are not supported!\n"); 248d30ea906Sjfb8856606 return TEST_FAILED; 249d30ea906Sjfb8856606 } 250d30ea906Sjfb8856606 251d30ea906Sjfb8856606 return TEST_SUCCESS; 252d30ea906Sjfb8856606 } else if (op_cap->type == RTE_BBDEV_OP_TURBO_ENC) { 253d30ea906Sjfb8856606 const struct rte_bbdev_op_cap_turbo_enc *cap = 254d30ea906Sjfb8856606 &op_cap->cap.turbo_enc; 255d30ea906Sjfb8856606 256d30ea906Sjfb8856606 if (!flags_match(test_vector.turbo_enc.op_flags, 257d30ea906Sjfb8856606 cap->capability_flags)) 258d30ea906Sjfb8856606 return TEST_FAILED; 259d30ea906Sjfb8856606 if (nb_inputs > cap->num_buffers_src) { 260d30ea906Sjfb8856606 printf("Too many inputs defined: %u, max: %u\n", 261d30ea906Sjfb8856606 nb_inputs, cap->num_buffers_src); 262d30ea906Sjfb8856606 return TEST_FAILED; 263d30ea906Sjfb8856606 } 264d30ea906Sjfb8856606 if (nb_hard_outputs > cap->num_buffers_dst) { 265d30ea906Sjfb8856606 printf( 266d30ea906Sjfb8856606 "Too many hard outputs defined: %u, max: %u\n", 267*4418919fSjohnjiang nb_hard_outputs, cap->num_buffers_dst); 268d30ea906Sjfb8856606 return TEST_FAILED; 269d30ea906Sjfb8856606 } 270d30ea906Sjfb8856606 if (intr_enabled && !(cap->capability_flags & 271d30ea906Sjfb8856606 RTE_BBDEV_TURBO_ENC_INTERRUPTS)) { 272d30ea906Sjfb8856606 printf( 273d30ea906Sjfb8856606 "Dequeue interrupts are not supported!\n"); 274d30ea906Sjfb8856606 return TEST_FAILED; 275d30ea906Sjfb8856606 } 276d30ea906Sjfb8856606 277d30ea906Sjfb8856606 return TEST_SUCCESS; 278*4418919fSjohnjiang } else if (op_cap->type == RTE_BBDEV_OP_LDPC_ENC) { 279*4418919fSjohnjiang const struct rte_bbdev_op_cap_ldpc_enc *cap = 280*4418919fSjohnjiang &op_cap->cap.ldpc_enc; 281*4418919fSjohnjiang 282*4418919fSjohnjiang if (!flags_match(test_vector.ldpc_enc.op_flags, 283*4418919fSjohnjiang cap->capability_flags)){ 284*4418919fSjohnjiang printf("Flag Mismatch\n"); 285*4418919fSjohnjiang return TEST_FAILED; 286*4418919fSjohnjiang } 287*4418919fSjohnjiang if (nb_inputs > cap->num_buffers_src) { 288*4418919fSjohnjiang printf("Too many inputs defined: %u, max: %u\n", 289*4418919fSjohnjiang nb_inputs, cap->num_buffers_src); 290*4418919fSjohnjiang return TEST_FAILED; 291*4418919fSjohnjiang } 292*4418919fSjohnjiang if (nb_hard_outputs > cap->num_buffers_dst) { 293*4418919fSjohnjiang printf( 294*4418919fSjohnjiang "Too many hard outputs defined: %u, max: %u\n", 295*4418919fSjohnjiang nb_hard_outputs, cap->num_buffers_dst); 296*4418919fSjohnjiang return TEST_FAILED; 297*4418919fSjohnjiang } 298*4418919fSjohnjiang if (intr_enabled && !(cap->capability_flags & 299*4418919fSjohnjiang RTE_BBDEV_TURBO_ENC_INTERRUPTS)) { 300*4418919fSjohnjiang printf( 301*4418919fSjohnjiang "Dequeue interrupts are not supported!\n"); 302*4418919fSjohnjiang return TEST_FAILED; 303*4418919fSjohnjiang } 304*4418919fSjohnjiang 305*4418919fSjohnjiang return TEST_SUCCESS; 306*4418919fSjohnjiang } else if (op_cap->type == RTE_BBDEV_OP_LDPC_DEC) { 307*4418919fSjohnjiang const struct rte_bbdev_op_cap_ldpc_dec *cap = 308*4418919fSjohnjiang &op_cap->cap.ldpc_dec; 309*4418919fSjohnjiang 310*4418919fSjohnjiang if (!flags_match(test_vector.ldpc_dec.op_flags, 311*4418919fSjohnjiang cap->capability_flags)){ 312*4418919fSjohnjiang printf("Flag Mismatch\n"); 313*4418919fSjohnjiang return TEST_FAILED; 314*4418919fSjohnjiang } 315*4418919fSjohnjiang if (nb_inputs > cap->num_buffers_src) { 316*4418919fSjohnjiang printf("Too many inputs defined: %u, max: %u\n", 317*4418919fSjohnjiang nb_inputs, cap->num_buffers_src); 318*4418919fSjohnjiang return TEST_FAILED; 319*4418919fSjohnjiang } 320*4418919fSjohnjiang if (nb_hard_outputs > cap->num_buffers_hard_out) { 321*4418919fSjohnjiang printf( 322*4418919fSjohnjiang "Too many hard outputs defined: %u, max: %u\n", 323*4418919fSjohnjiang nb_hard_outputs, 324*4418919fSjohnjiang cap->num_buffers_hard_out); 325*4418919fSjohnjiang return TEST_FAILED; 326*4418919fSjohnjiang } 327*4418919fSjohnjiang if (nb_harq_inputs > cap->num_buffers_hard_out) { 328*4418919fSjohnjiang printf( 329*4418919fSjohnjiang "Too many HARQ inputs defined: %u, max: %u\n", 330*4418919fSjohnjiang nb_hard_outputs, 331*4418919fSjohnjiang cap->num_buffers_hard_out); 332*4418919fSjohnjiang return TEST_FAILED; 333*4418919fSjohnjiang } 334*4418919fSjohnjiang if (nb_harq_outputs > cap->num_buffers_hard_out) { 335*4418919fSjohnjiang printf( 336*4418919fSjohnjiang "Too many HARQ outputs defined: %u, max: %u\n", 337*4418919fSjohnjiang nb_hard_outputs, 338*4418919fSjohnjiang cap->num_buffers_hard_out); 339*4418919fSjohnjiang return TEST_FAILED; 340*4418919fSjohnjiang } 341*4418919fSjohnjiang if (intr_enabled && !(cap->capability_flags & 342*4418919fSjohnjiang RTE_BBDEV_TURBO_DEC_INTERRUPTS)) { 343*4418919fSjohnjiang printf( 344*4418919fSjohnjiang "Dequeue interrupts are not supported!\n"); 345*4418919fSjohnjiang return TEST_FAILED; 346*4418919fSjohnjiang } 347*4418919fSjohnjiang 348*4418919fSjohnjiang return TEST_SUCCESS; 349d30ea906Sjfb8856606 } 350d30ea906Sjfb8856606 } 351d30ea906Sjfb8856606 352d30ea906Sjfb8856606 if ((i == 0) && (test_vector.op_type == RTE_BBDEV_OP_NONE)) 353d30ea906Sjfb8856606 return TEST_SUCCESS; /* Special case for NULL device */ 354d30ea906Sjfb8856606 355d30ea906Sjfb8856606 return TEST_FAILED; 356d30ea906Sjfb8856606 } 357d30ea906Sjfb8856606 358d30ea906Sjfb8856606 /* calculates optimal mempool size not smaller than the val */ 359d30ea906Sjfb8856606 static unsigned int 360d30ea906Sjfb8856606 optimal_mempool_size(unsigned int val) 361d30ea906Sjfb8856606 { 362d30ea906Sjfb8856606 return rte_align32pow2(val + 1) - 1; 363d30ea906Sjfb8856606 } 364d30ea906Sjfb8856606 365d30ea906Sjfb8856606 /* allocates mbuf mempool for inputs and outputs */ 366d30ea906Sjfb8856606 static struct rte_mempool * 367d30ea906Sjfb8856606 create_mbuf_pool(struct op_data_entries *entries, uint8_t dev_id, 368d30ea906Sjfb8856606 int socket_id, unsigned int mbuf_pool_size, 369d30ea906Sjfb8856606 const char *op_type_str) 370d30ea906Sjfb8856606 { 371d30ea906Sjfb8856606 unsigned int i; 372d30ea906Sjfb8856606 uint32_t max_seg_sz = 0; 373d30ea906Sjfb8856606 char pool_name[RTE_MEMPOOL_NAMESIZE]; 374d30ea906Sjfb8856606 375d30ea906Sjfb8856606 /* find max input segment size */ 376d30ea906Sjfb8856606 for (i = 0; i < entries->nb_segments; ++i) 377d30ea906Sjfb8856606 if (entries->segments[i].length > max_seg_sz) 378d30ea906Sjfb8856606 max_seg_sz = entries->segments[i].length; 379d30ea906Sjfb8856606 380d30ea906Sjfb8856606 snprintf(pool_name, sizeof(pool_name), "%s_pool_%u", op_type_str, 381d30ea906Sjfb8856606 dev_id); 382d30ea906Sjfb8856606 return rte_pktmbuf_pool_create(pool_name, mbuf_pool_size, 0, 0, 383d30ea906Sjfb8856606 RTE_MAX(max_seg_sz + RTE_PKTMBUF_HEADROOM, 384d30ea906Sjfb8856606 (unsigned int)RTE_MBUF_DEFAULT_BUF_SIZE), socket_id); 385d30ea906Sjfb8856606 } 386d30ea906Sjfb8856606 387d30ea906Sjfb8856606 static int 388d30ea906Sjfb8856606 create_mempools(struct active_device *ad, int socket_id, 389d30ea906Sjfb8856606 enum rte_bbdev_op_type org_op_type, uint16_t num_ops) 390d30ea906Sjfb8856606 { 391d30ea906Sjfb8856606 struct rte_mempool *mp; 392d30ea906Sjfb8856606 unsigned int ops_pool_size, mbuf_pool_size = 0; 393d30ea906Sjfb8856606 char pool_name[RTE_MEMPOOL_NAMESIZE]; 394d30ea906Sjfb8856606 const char *op_type_str; 395d30ea906Sjfb8856606 enum rte_bbdev_op_type op_type = org_op_type; 396d30ea906Sjfb8856606 397d30ea906Sjfb8856606 struct op_data_entries *in = &test_vector.entries[DATA_INPUT]; 398d30ea906Sjfb8856606 struct op_data_entries *hard_out = 399d30ea906Sjfb8856606 &test_vector.entries[DATA_HARD_OUTPUT]; 400d30ea906Sjfb8856606 struct op_data_entries *soft_out = 401d30ea906Sjfb8856606 &test_vector.entries[DATA_SOFT_OUTPUT]; 402*4418919fSjohnjiang struct op_data_entries *harq_in = 403*4418919fSjohnjiang &test_vector.entries[DATA_HARQ_INPUT]; 404*4418919fSjohnjiang struct op_data_entries *harq_out = 405*4418919fSjohnjiang &test_vector.entries[DATA_HARQ_OUTPUT]; 406d30ea906Sjfb8856606 407d30ea906Sjfb8856606 /* allocate ops mempool */ 408d30ea906Sjfb8856606 ops_pool_size = optimal_mempool_size(RTE_MAX( 409d30ea906Sjfb8856606 /* Ops used plus 1 reference op */ 410d30ea906Sjfb8856606 RTE_MAX((unsigned int)(ad->nb_queues * num_ops + 1), 411d30ea906Sjfb8856606 /* Minimal cache size plus 1 reference op */ 412d30ea906Sjfb8856606 (unsigned int)(1.5 * rte_lcore_count() * 413d30ea906Sjfb8856606 OPS_CACHE_SIZE + 1)), 414d30ea906Sjfb8856606 OPS_POOL_SIZE_MIN)); 415d30ea906Sjfb8856606 416d30ea906Sjfb8856606 if (org_op_type == RTE_BBDEV_OP_NONE) 417d30ea906Sjfb8856606 op_type = RTE_BBDEV_OP_TURBO_ENC; 418d30ea906Sjfb8856606 419d30ea906Sjfb8856606 op_type_str = rte_bbdev_op_type_str(op_type); 420d30ea906Sjfb8856606 TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); 421d30ea906Sjfb8856606 422d30ea906Sjfb8856606 snprintf(pool_name, sizeof(pool_name), "%s_pool_%u", op_type_str, 423d30ea906Sjfb8856606 ad->dev_id); 424d30ea906Sjfb8856606 mp = rte_bbdev_op_pool_create(pool_name, op_type, 425d30ea906Sjfb8856606 ops_pool_size, OPS_CACHE_SIZE, socket_id); 426d30ea906Sjfb8856606 TEST_ASSERT_NOT_NULL(mp, 427d30ea906Sjfb8856606 "ERROR Failed to create %u items ops pool for dev %u on socket %u.", 428d30ea906Sjfb8856606 ops_pool_size, 429d30ea906Sjfb8856606 ad->dev_id, 430d30ea906Sjfb8856606 socket_id); 431d30ea906Sjfb8856606 ad->ops_mempool = mp; 432d30ea906Sjfb8856606 433d30ea906Sjfb8856606 /* Do not create inputs and outputs mbufs for BaseBand Null Device */ 434d30ea906Sjfb8856606 if (org_op_type == RTE_BBDEV_OP_NONE) 435d30ea906Sjfb8856606 return TEST_SUCCESS; 436d30ea906Sjfb8856606 437d30ea906Sjfb8856606 /* Inputs */ 438d30ea906Sjfb8856606 mbuf_pool_size = optimal_mempool_size(ops_pool_size * in->nb_segments); 439d30ea906Sjfb8856606 mp = create_mbuf_pool(in, ad->dev_id, socket_id, mbuf_pool_size, "in"); 440d30ea906Sjfb8856606 TEST_ASSERT_NOT_NULL(mp, 441d30ea906Sjfb8856606 "ERROR Failed to create %u items input pktmbuf pool for dev %u on socket %u.", 442d30ea906Sjfb8856606 mbuf_pool_size, 443d30ea906Sjfb8856606 ad->dev_id, 444d30ea906Sjfb8856606 socket_id); 445d30ea906Sjfb8856606 ad->in_mbuf_pool = mp; 446d30ea906Sjfb8856606 447d30ea906Sjfb8856606 /* Hard outputs */ 448d30ea906Sjfb8856606 mbuf_pool_size = optimal_mempool_size(ops_pool_size * 449d30ea906Sjfb8856606 hard_out->nb_segments); 450d30ea906Sjfb8856606 mp = create_mbuf_pool(hard_out, ad->dev_id, socket_id, mbuf_pool_size, 451d30ea906Sjfb8856606 "hard_out"); 452d30ea906Sjfb8856606 TEST_ASSERT_NOT_NULL(mp, 453d30ea906Sjfb8856606 "ERROR Failed to create %u items hard output pktmbuf pool for dev %u on socket %u.", 454d30ea906Sjfb8856606 mbuf_pool_size, 455d30ea906Sjfb8856606 ad->dev_id, 456d30ea906Sjfb8856606 socket_id); 457d30ea906Sjfb8856606 ad->hard_out_mbuf_pool = mp; 458d30ea906Sjfb8856606 459d30ea906Sjfb8856606 460d30ea906Sjfb8856606 /* Soft outputs */ 461*4418919fSjohnjiang if (soft_out->nb_segments > 0) { 462d30ea906Sjfb8856606 mbuf_pool_size = optimal_mempool_size(ops_pool_size * 463d30ea906Sjfb8856606 soft_out->nb_segments); 464*4418919fSjohnjiang mp = create_mbuf_pool(soft_out, ad->dev_id, socket_id, 465*4418919fSjohnjiang mbuf_pool_size, 466d30ea906Sjfb8856606 "soft_out"); 467d30ea906Sjfb8856606 TEST_ASSERT_NOT_NULL(mp, 468d30ea906Sjfb8856606 "ERROR Failed to create %uB soft output pktmbuf pool for dev %u on socket %u.", 469d30ea906Sjfb8856606 mbuf_pool_size, 470d30ea906Sjfb8856606 ad->dev_id, 471d30ea906Sjfb8856606 socket_id); 472d30ea906Sjfb8856606 ad->soft_out_mbuf_pool = mp; 473*4418919fSjohnjiang } 474d30ea906Sjfb8856606 475*4418919fSjohnjiang /* HARQ inputs */ 476*4418919fSjohnjiang if (harq_in->nb_segments > 0) { 477*4418919fSjohnjiang mbuf_pool_size = optimal_mempool_size(ops_pool_size * 478*4418919fSjohnjiang harq_in->nb_segments); 479*4418919fSjohnjiang mp = create_mbuf_pool(harq_in, ad->dev_id, socket_id, 480*4418919fSjohnjiang mbuf_pool_size, 481*4418919fSjohnjiang "harq_in"); 482*4418919fSjohnjiang TEST_ASSERT_NOT_NULL(mp, 483*4418919fSjohnjiang "ERROR Failed to create %uB harq input pktmbuf pool for dev %u on socket %u.", 484*4418919fSjohnjiang mbuf_pool_size, 485*4418919fSjohnjiang ad->dev_id, 486*4418919fSjohnjiang socket_id); 487*4418919fSjohnjiang ad->harq_in_mbuf_pool = mp; 488*4418919fSjohnjiang } 489*4418919fSjohnjiang 490*4418919fSjohnjiang /* HARQ outputs */ 491*4418919fSjohnjiang if (harq_out->nb_segments > 0) { 492*4418919fSjohnjiang mbuf_pool_size = optimal_mempool_size(ops_pool_size * 493*4418919fSjohnjiang harq_out->nb_segments); 494*4418919fSjohnjiang mp = create_mbuf_pool(harq_out, ad->dev_id, socket_id, 495*4418919fSjohnjiang mbuf_pool_size, 496*4418919fSjohnjiang "harq_out"); 497*4418919fSjohnjiang TEST_ASSERT_NOT_NULL(mp, 498*4418919fSjohnjiang "ERROR Failed to create %uB harq output pktmbuf pool for dev %u on socket %u.", 499*4418919fSjohnjiang mbuf_pool_size, 500*4418919fSjohnjiang ad->dev_id, 501*4418919fSjohnjiang socket_id); 502*4418919fSjohnjiang ad->harq_out_mbuf_pool = mp; 503*4418919fSjohnjiang } 504*4418919fSjohnjiang 505*4418919fSjohnjiang return TEST_SUCCESS; 506d30ea906Sjfb8856606 } 507d30ea906Sjfb8856606 508d30ea906Sjfb8856606 static int 509d30ea906Sjfb8856606 add_bbdev_dev(uint8_t dev_id, struct rte_bbdev_info *info, 510d30ea906Sjfb8856606 struct test_bbdev_vector *vector) 511d30ea906Sjfb8856606 { 512d30ea906Sjfb8856606 int ret; 513d30ea906Sjfb8856606 unsigned int queue_id; 514d30ea906Sjfb8856606 struct rte_bbdev_queue_conf qconf; 515d30ea906Sjfb8856606 struct active_device *ad = &active_devs[nb_active_devs]; 516d30ea906Sjfb8856606 unsigned int nb_queues; 517d30ea906Sjfb8856606 enum rte_bbdev_op_type op_type = vector->op_type; 518d30ea906Sjfb8856606 519*4418919fSjohnjiang /* Configure fpga lte fec with PF & VF values 520*4418919fSjohnjiang * if '-i' flag is set and using fpga device 521*4418919fSjohnjiang */ 522*4418919fSjohnjiang #ifdef RTE_LIBRTE_PMD_BBDEV_FPGA_LTE_FEC 523*4418919fSjohnjiang if ((get_init_device() == true) && 524*4418919fSjohnjiang (!strcmp(info->drv.driver_name, FPGA_PF_DRIVER_NAME))) { 525*4418919fSjohnjiang struct fpga_lte_fec_conf conf; 526*4418919fSjohnjiang unsigned int i; 527*4418919fSjohnjiang 528*4418919fSjohnjiang printf("Configure FPGA FEC Driver %s with default values\n", 529*4418919fSjohnjiang info->drv.driver_name); 530*4418919fSjohnjiang 531*4418919fSjohnjiang /* clear default configuration before initialization */ 532*4418919fSjohnjiang memset(&conf, 0, sizeof(struct fpga_lte_fec_conf)); 533*4418919fSjohnjiang 534*4418919fSjohnjiang /* Set PF mode : 535*4418919fSjohnjiang * true if PF is used for data plane 536*4418919fSjohnjiang * false for VFs 537*4418919fSjohnjiang */ 538*4418919fSjohnjiang conf.pf_mode_en = true; 539*4418919fSjohnjiang 540*4418919fSjohnjiang for (i = 0; i < FPGA_LTE_FEC_NUM_VFS; ++i) { 541*4418919fSjohnjiang /* Number of UL queues per VF (fpga supports 8 VFs) */ 542*4418919fSjohnjiang conf.vf_ul_queues_number[i] = VF_UL_QUEUE_VALUE; 543*4418919fSjohnjiang /* Number of DL queues per VF (fpga supports 8 VFs) */ 544*4418919fSjohnjiang conf.vf_dl_queues_number[i] = VF_DL_QUEUE_VALUE; 545*4418919fSjohnjiang } 546*4418919fSjohnjiang 547*4418919fSjohnjiang /* UL bandwidth. Needed for schedule algorithm */ 548*4418919fSjohnjiang conf.ul_bandwidth = UL_BANDWIDTH; 549*4418919fSjohnjiang /* DL bandwidth */ 550*4418919fSjohnjiang conf.dl_bandwidth = DL_BANDWIDTH; 551*4418919fSjohnjiang 552*4418919fSjohnjiang /* UL & DL load Balance Factor to 64 */ 553*4418919fSjohnjiang conf.ul_load_balance = UL_LOAD_BALANCE; 554*4418919fSjohnjiang conf.dl_load_balance = DL_LOAD_BALANCE; 555*4418919fSjohnjiang 556*4418919fSjohnjiang /**< FLR timeout value */ 557*4418919fSjohnjiang conf.flr_time_out = FLR_TIMEOUT; 558*4418919fSjohnjiang 559*4418919fSjohnjiang /* setup FPGA PF with configuration information */ 560*4418919fSjohnjiang ret = fpga_lte_fec_configure(info->dev_name, &conf); 561*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, 562*4418919fSjohnjiang "Failed to configure 4G FPGA PF for bbdev %s", 563*4418919fSjohnjiang info->dev_name); 564*4418919fSjohnjiang } 565*4418919fSjohnjiang #endif 566d30ea906Sjfb8856606 nb_queues = RTE_MIN(rte_lcore_count(), info->drv.max_num_queues); 567*4418919fSjohnjiang nb_queues = RTE_MIN(nb_queues, (unsigned int) MAX_QUEUES); 568*4418919fSjohnjiang 569d30ea906Sjfb8856606 /* setup device */ 570d30ea906Sjfb8856606 ret = rte_bbdev_setup_queues(dev_id, nb_queues, info->socket_id); 571d30ea906Sjfb8856606 if (ret < 0) { 572d30ea906Sjfb8856606 printf("rte_bbdev_setup_queues(%u, %u, %d) ret %i\n", 573d30ea906Sjfb8856606 dev_id, nb_queues, info->socket_id, ret); 574d30ea906Sjfb8856606 return TEST_FAILED; 575d30ea906Sjfb8856606 } 576d30ea906Sjfb8856606 577d30ea906Sjfb8856606 /* configure interrupts if needed */ 578d30ea906Sjfb8856606 if (intr_enabled) { 579d30ea906Sjfb8856606 ret = rte_bbdev_intr_enable(dev_id); 580d30ea906Sjfb8856606 if (ret < 0) { 581d30ea906Sjfb8856606 printf("rte_bbdev_intr_enable(%u) ret %i\n", dev_id, 582d30ea906Sjfb8856606 ret); 583d30ea906Sjfb8856606 return TEST_FAILED; 584d30ea906Sjfb8856606 } 585d30ea906Sjfb8856606 } 586d30ea906Sjfb8856606 587d30ea906Sjfb8856606 /* setup device queues */ 588d30ea906Sjfb8856606 qconf.socket = info->socket_id; 589d30ea906Sjfb8856606 qconf.queue_size = info->drv.default_queue_conf.queue_size; 590d30ea906Sjfb8856606 qconf.priority = 0; 591d30ea906Sjfb8856606 qconf.deferred_start = 0; 592d30ea906Sjfb8856606 qconf.op_type = op_type; 593d30ea906Sjfb8856606 594d30ea906Sjfb8856606 for (queue_id = 0; queue_id < nb_queues; ++queue_id) { 595d30ea906Sjfb8856606 ret = rte_bbdev_queue_configure(dev_id, queue_id, &qconf); 596d30ea906Sjfb8856606 if (ret != 0) { 597d30ea906Sjfb8856606 printf( 598d30ea906Sjfb8856606 "Allocated all queues (id=%u) at prio%u on dev%u\n", 599d30ea906Sjfb8856606 queue_id, qconf.priority, dev_id); 600d30ea906Sjfb8856606 qconf.priority++; 601d30ea906Sjfb8856606 ret = rte_bbdev_queue_configure(ad->dev_id, queue_id, 602d30ea906Sjfb8856606 &qconf); 603d30ea906Sjfb8856606 } 604d30ea906Sjfb8856606 if (ret != 0) { 605d30ea906Sjfb8856606 printf("All queues on dev %u allocated: %u\n", 606d30ea906Sjfb8856606 dev_id, queue_id); 607d30ea906Sjfb8856606 break; 608d30ea906Sjfb8856606 } 609d30ea906Sjfb8856606 ad->queue_ids[queue_id] = queue_id; 610d30ea906Sjfb8856606 } 611d30ea906Sjfb8856606 TEST_ASSERT(queue_id != 0, 612d30ea906Sjfb8856606 "ERROR Failed to configure any queues on dev %u", 613d30ea906Sjfb8856606 dev_id); 614d30ea906Sjfb8856606 ad->nb_queues = queue_id; 615d30ea906Sjfb8856606 616d30ea906Sjfb8856606 set_avail_op(ad, op_type); 617d30ea906Sjfb8856606 618d30ea906Sjfb8856606 return TEST_SUCCESS; 619d30ea906Sjfb8856606 } 620d30ea906Sjfb8856606 621d30ea906Sjfb8856606 static int 622d30ea906Sjfb8856606 add_active_device(uint8_t dev_id, struct rte_bbdev_info *info, 623d30ea906Sjfb8856606 struct test_bbdev_vector *vector) 624d30ea906Sjfb8856606 { 625d30ea906Sjfb8856606 int ret; 626d30ea906Sjfb8856606 627d30ea906Sjfb8856606 active_devs[nb_active_devs].driver_name = info->drv.driver_name; 628d30ea906Sjfb8856606 active_devs[nb_active_devs].dev_id = dev_id; 629d30ea906Sjfb8856606 630d30ea906Sjfb8856606 ret = add_bbdev_dev(dev_id, info, vector); 631d30ea906Sjfb8856606 if (ret == TEST_SUCCESS) 632d30ea906Sjfb8856606 ++nb_active_devs; 633d30ea906Sjfb8856606 return ret; 634d30ea906Sjfb8856606 } 635d30ea906Sjfb8856606 636d30ea906Sjfb8856606 static uint8_t 637d30ea906Sjfb8856606 populate_active_devices(void) 638d30ea906Sjfb8856606 { 639d30ea906Sjfb8856606 int ret; 640d30ea906Sjfb8856606 uint8_t dev_id; 641d30ea906Sjfb8856606 uint8_t nb_devs_added = 0; 642d30ea906Sjfb8856606 struct rte_bbdev_info info; 643d30ea906Sjfb8856606 644d30ea906Sjfb8856606 RTE_BBDEV_FOREACH(dev_id) { 645d30ea906Sjfb8856606 rte_bbdev_info_get(dev_id, &info); 646d30ea906Sjfb8856606 647d30ea906Sjfb8856606 if (check_dev_cap(&info)) { 648d30ea906Sjfb8856606 printf( 649d30ea906Sjfb8856606 "Device %d (%s) does not support specified capabilities\n", 650d30ea906Sjfb8856606 dev_id, info.dev_name); 651d30ea906Sjfb8856606 continue; 652d30ea906Sjfb8856606 } 653d30ea906Sjfb8856606 654d30ea906Sjfb8856606 ret = add_active_device(dev_id, &info, &test_vector); 655d30ea906Sjfb8856606 if (ret != 0) { 656d30ea906Sjfb8856606 printf("Adding active bbdev %s skipped\n", 657d30ea906Sjfb8856606 info.dev_name); 658d30ea906Sjfb8856606 continue; 659d30ea906Sjfb8856606 } 660d30ea906Sjfb8856606 nb_devs_added++; 661d30ea906Sjfb8856606 } 662d30ea906Sjfb8856606 663d30ea906Sjfb8856606 return nb_devs_added; 664d30ea906Sjfb8856606 } 665d30ea906Sjfb8856606 666d30ea906Sjfb8856606 static int 667d30ea906Sjfb8856606 read_test_vector(void) 668d30ea906Sjfb8856606 { 669d30ea906Sjfb8856606 int ret; 670d30ea906Sjfb8856606 671d30ea906Sjfb8856606 memset(&test_vector, 0, sizeof(test_vector)); 672d30ea906Sjfb8856606 printf("Test vector file = %s\n", get_vector_filename()); 673d30ea906Sjfb8856606 ret = test_bbdev_vector_read(get_vector_filename(), &test_vector); 674d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(ret, "Failed to parse file %s\n", 675d30ea906Sjfb8856606 get_vector_filename()); 676d30ea906Sjfb8856606 677d30ea906Sjfb8856606 return TEST_SUCCESS; 678d30ea906Sjfb8856606 } 679d30ea906Sjfb8856606 680d30ea906Sjfb8856606 static int 681d30ea906Sjfb8856606 testsuite_setup(void) 682d30ea906Sjfb8856606 { 683d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n"); 684d30ea906Sjfb8856606 685d30ea906Sjfb8856606 if (populate_active_devices() == 0) { 686d30ea906Sjfb8856606 printf("No suitable devices found!\n"); 687d30ea906Sjfb8856606 return TEST_SKIPPED; 688d30ea906Sjfb8856606 } 689d30ea906Sjfb8856606 690d30ea906Sjfb8856606 return TEST_SUCCESS; 691d30ea906Sjfb8856606 } 692d30ea906Sjfb8856606 693d30ea906Sjfb8856606 static int 694d30ea906Sjfb8856606 interrupt_testsuite_setup(void) 695d30ea906Sjfb8856606 { 696d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n"); 697d30ea906Sjfb8856606 698d30ea906Sjfb8856606 /* Enable interrupts */ 699d30ea906Sjfb8856606 intr_enabled = true; 700d30ea906Sjfb8856606 701d30ea906Sjfb8856606 /* Special case for NULL device (RTE_BBDEV_OP_NONE) */ 702d30ea906Sjfb8856606 if (populate_active_devices() == 0 || 703d30ea906Sjfb8856606 test_vector.op_type == RTE_BBDEV_OP_NONE) { 704d30ea906Sjfb8856606 intr_enabled = false; 705d30ea906Sjfb8856606 printf("No suitable devices found!\n"); 706d30ea906Sjfb8856606 return TEST_SKIPPED; 707d30ea906Sjfb8856606 } 708d30ea906Sjfb8856606 709d30ea906Sjfb8856606 return TEST_SUCCESS; 710d30ea906Sjfb8856606 } 711d30ea906Sjfb8856606 712d30ea906Sjfb8856606 static void 713d30ea906Sjfb8856606 testsuite_teardown(void) 714d30ea906Sjfb8856606 { 715d30ea906Sjfb8856606 uint8_t dev_id; 716d30ea906Sjfb8856606 717d30ea906Sjfb8856606 /* Unconfigure devices */ 718d30ea906Sjfb8856606 RTE_BBDEV_FOREACH(dev_id) 719d30ea906Sjfb8856606 rte_bbdev_close(dev_id); 720d30ea906Sjfb8856606 721d30ea906Sjfb8856606 /* Clear active devices structs. */ 722d30ea906Sjfb8856606 memset(active_devs, 0, sizeof(active_devs)); 723d30ea906Sjfb8856606 nb_active_devs = 0; 724d30ea906Sjfb8856606 } 725d30ea906Sjfb8856606 726d30ea906Sjfb8856606 static int 727d30ea906Sjfb8856606 ut_setup(void) 728d30ea906Sjfb8856606 { 729d30ea906Sjfb8856606 uint8_t i, dev_id; 730d30ea906Sjfb8856606 731d30ea906Sjfb8856606 for (i = 0; i < nb_active_devs; i++) { 732d30ea906Sjfb8856606 dev_id = active_devs[i].dev_id; 733d30ea906Sjfb8856606 /* reset bbdev stats */ 734d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id), 735d30ea906Sjfb8856606 "Failed to reset stats of bbdev %u", dev_id); 736d30ea906Sjfb8856606 /* start the device */ 737d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id), 738d30ea906Sjfb8856606 "Failed to start bbdev %u", dev_id); 739d30ea906Sjfb8856606 } 740d30ea906Sjfb8856606 741d30ea906Sjfb8856606 return TEST_SUCCESS; 742d30ea906Sjfb8856606 } 743d30ea906Sjfb8856606 744d30ea906Sjfb8856606 static void 745d30ea906Sjfb8856606 ut_teardown(void) 746d30ea906Sjfb8856606 { 747d30ea906Sjfb8856606 uint8_t i, dev_id; 748d30ea906Sjfb8856606 struct rte_bbdev_stats stats; 749d30ea906Sjfb8856606 750d30ea906Sjfb8856606 for (i = 0; i < nb_active_devs; i++) { 751d30ea906Sjfb8856606 dev_id = active_devs[i].dev_id; 752d30ea906Sjfb8856606 /* read stats and print */ 753d30ea906Sjfb8856606 rte_bbdev_stats_get(dev_id, &stats); 754d30ea906Sjfb8856606 /* Stop the device */ 755d30ea906Sjfb8856606 rte_bbdev_stop(dev_id); 756d30ea906Sjfb8856606 } 757d30ea906Sjfb8856606 } 758d30ea906Sjfb8856606 759d30ea906Sjfb8856606 static int 760d30ea906Sjfb8856606 init_op_data_objs(struct rte_bbdev_op_data *bufs, 761d30ea906Sjfb8856606 struct op_data_entries *ref_entries, 762d30ea906Sjfb8856606 struct rte_mempool *mbuf_pool, const uint16_t n, 763d30ea906Sjfb8856606 enum op_data_type op_type, uint16_t min_alignment) 764d30ea906Sjfb8856606 { 765d30ea906Sjfb8856606 int ret; 766d30ea906Sjfb8856606 unsigned int i, j; 767d30ea906Sjfb8856606 768d30ea906Sjfb8856606 for (i = 0; i < n; ++i) { 769d30ea906Sjfb8856606 char *data; 770d30ea906Sjfb8856606 struct op_data_buf *seg = &ref_entries->segments[0]; 771d30ea906Sjfb8856606 struct rte_mbuf *m_head = rte_pktmbuf_alloc(mbuf_pool); 772d30ea906Sjfb8856606 TEST_ASSERT_NOT_NULL(m_head, 773d30ea906Sjfb8856606 "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", 774d30ea906Sjfb8856606 op_type, n * ref_entries->nb_segments, 775d30ea906Sjfb8856606 mbuf_pool->size); 776d30ea906Sjfb8856606 777*4418919fSjohnjiang TEST_ASSERT_SUCCESS(((seg->length + RTE_PKTMBUF_HEADROOM) > 778*4418919fSjohnjiang (uint32_t)UINT16_MAX), 779*4418919fSjohnjiang "Given data is bigger than allowed mbuf segment size"); 780*4418919fSjohnjiang 781d30ea906Sjfb8856606 bufs[i].data = m_head; 782d30ea906Sjfb8856606 bufs[i].offset = 0; 783d30ea906Sjfb8856606 bufs[i].length = 0; 784d30ea906Sjfb8856606 785*4418919fSjohnjiang if ((op_type == DATA_INPUT) || (op_type == DATA_HARQ_INPUT)) { 786d30ea906Sjfb8856606 data = rte_pktmbuf_append(m_head, seg->length); 787d30ea906Sjfb8856606 TEST_ASSERT_NOT_NULL(data, 788d30ea906Sjfb8856606 "Couldn't append %u bytes to mbuf from %d data type mbuf pool", 789d30ea906Sjfb8856606 seg->length, op_type); 790d30ea906Sjfb8856606 791d30ea906Sjfb8856606 TEST_ASSERT(data == RTE_PTR_ALIGN(data, min_alignment), 792d30ea906Sjfb8856606 "Data addr in mbuf (%p) is not aligned to device min alignment (%u)", 793d30ea906Sjfb8856606 data, min_alignment); 794d30ea906Sjfb8856606 rte_memcpy(data, seg->addr, seg->length); 795d30ea906Sjfb8856606 bufs[i].length += seg->length; 796d30ea906Sjfb8856606 797d30ea906Sjfb8856606 for (j = 1; j < ref_entries->nb_segments; ++j) { 798d30ea906Sjfb8856606 struct rte_mbuf *m_tail = 799d30ea906Sjfb8856606 rte_pktmbuf_alloc(mbuf_pool); 800d30ea906Sjfb8856606 TEST_ASSERT_NOT_NULL(m_tail, 801d30ea906Sjfb8856606 "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", 802d30ea906Sjfb8856606 op_type, 803d30ea906Sjfb8856606 n * ref_entries->nb_segments, 804d30ea906Sjfb8856606 mbuf_pool->size); 805d30ea906Sjfb8856606 seg += 1; 806d30ea906Sjfb8856606 807d30ea906Sjfb8856606 data = rte_pktmbuf_append(m_tail, seg->length); 808d30ea906Sjfb8856606 TEST_ASSERT_NOT_NULL(data, 809d30ea906Sjfb8856606 "Couldn't append %u bytes to mbuf from %d data type mbuf pool", 810d30ea906Sjfb8856606 seg->length, op_type); 811d30ea906Sjfb8856606 812d30ea906Sjfb8856606 TEST_ASSERT(data == RTE_PTR_ALIGN(data, 813d30ea906Sjfb8856606 min_alignment), 814d30ea906Sjfb8856606 "Data addr in mbuf (%p) is not aligned to device min alignment (%u)", 815d30ea906Sjfb8856606 data, min_alignment); 816d30ea906Sjfb8856606 rte_memcpy(data, seg->addr, seg->length); 817d30ea906Sjfb8856606 bufs[i].length += seg->length; 818d30ea906Sjfb8856606 819d30ea906Sjfb8856606 ret = rte_pktmbuf_chain(m_head, m_tail); 820d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(ret, 821d30ea906Sjfb8856606 "Couldn't chain mbufs from %d data type mbuf pool", 822d30ea906Sjfb8856606 op_type); 823d30ea906Sjfb8856606 } 824*4418919fSjohnjiang } else { 825*4418919fSjohnjiang 826*4418919fSjohnjiang /* allocate chained-mbuf for output buffer */ 827*4418919fSjohnjiang for (j = 1; j < ref_entries->nb_segments; ++j) { 828*4418919fSjohnjiang struct rte_mbuf *m_tail = 829*4418919fSjohnjiang rte_pktmbuf_alloc(mbuf_pool); 830*4418919fSjohnjiang TEST_ASSERT_NOT_NULL(m_tail, 831*4418919fSjohnjiang "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", 832*4418919fSjohnjiang op_type, 833*4418919fSjohnjiang n * ref_entries->nb_segments, 834*4418919fSjohnjiang mbuf_pool->size); 835*4418919fSjohnjiang 836*4418919fSjohnjiang ret = rte_pktmbuf_chain(m_head, m_tail); 837*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, 838*4418919fSjohnjiang "Couldn't chain mbufs from %d data type mbuf pool", 839*4418919fSjohnjiang op_type); 840*4418919fSjohnjiang } 841d30ea906Sjfb8856606 } 842d30ea906Sjfb8856606 } 843d30ea906Sjfb8856606 844d30ea906Sjfb8856606 return 0; 845d30ea906Sjfb8856606 } 846d30ea906Sjfb8856606 847d30ea906Sjfb8856606 static int 848d30ea906Sjfb8856606 allocate_buffers_on_socket(struct rte_bbdev_op_data **buffers, const int len, 849d30ea906Sjfb8856606 const int socket) 850d30ea906Sjfb8856606 { 851d30ea906Sjfb8856606 int i; 852d30ea906Sjfb8856606 853d30ea906Sjfb8856606 *buffers = rte_zmalloc_socket(NULL, len, 0, socket); 854d30ea906Sjfb8856606 if (*buffers == NULL) { 855d30ea906Sjfb8856606 printf("WARNING: Failed to allocate op_data on socket %d\n", 856d30ea906Sjfb8856606 socket); 857d30ea906Sjfb8856606 /* try to allocate memory on other detected sockets */ 858d30ea906Sjfb8856606 for (i = 0; i < socket; i++) { 859d30ea906Sjfb8856606 *buffers = rte_zmalloc_socket(NULL, len, 0, i); 860d30ea906Sjfb8856606 if (*buffers != NULL) 861d30ea906Sjfb8856606 break; 862d30ea906Sjfb8856606 } 863d30ea906Sjfb8856606 } 864d30ea906Sjfb8856606 865d30ea906Sjfb8856606 return (*buffers == NULL) ? TEST_FAILED : TEST_SUCCESS; 866d30ea906Sjfb8856606 } 867d30ea906Sjfb8856606 868d30ea906Sjfb8856606 static void 869d30ea906Sjfb8856606 limit_input_llr_val_range(struct rte_bbdev_op_data *input_ops, 870*4418919fSjohnjiang const uint16_t n, const int8_t max_llr_modulus) 871d30ea906Sjfb8856606 { 872d30ea906Sjfb8856606 uint16_t i, byte_idx; 873d30ea906Sjfb8856606 874d30ea906Sjfb8856606 for (i = 0; i < n; ++i) { 875d30ea906Sjfb8856606 struct rte_mbuf *m = input_ops[i].data; 876d30ea906Sjfb8856606 while (m != NULL) { 877d30ea906Sjfb8856606 int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *, 878d30ea906Sjfb8856606 input_ops[i].offset); 879*4418919fSjohnjiang for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m); 880d30ea906Sjfb8856606 ++byte_idx) 881d30ea906Sjfb8856606 llr[byte_idx] = round((double)max_llr_modulus * 882d30ea906Sjfb8856606 llr[byte_idx] / INT8_MAX); 883d30ea906Sjfb8856606 884d30ea906Sjfb8856606 m = m->next; 885d30ea906Sjfb8856606 } 886d30ea906Sjfb8856606 } 887d30ea906Sjfb8856606 } 888d30ea906Sjfb8856606 889*4418919fSjohnjiang static void 890*4418919fSjohnjiang ldpc_input_llr_scaling(struct rte_bbdev_op_data *input_ops, 891*4418919fSjohnjiang const uint16_t n, const int8_t llr_size, 892*4418919fSjohnjiang const int8_t llr_decimals) 893*4418919fSjohnjiang { 894*4418919fSjohnjiang if (input_ops == NULL) 895*4418919fSjohnjiang return; 896*4418919fSjohnjiang 897*4418919fSjohnjiang uint16_t i, byte_idx; 898*4418919fSjohnjiang 899*4418919fSjohnjiang int16_t llr_max, llr_min, llr_tmp; 900*4418919fSjohnjiang llr_max = (1 << (llr_size - 1)) - 1; 901*4418919fSjohnjiang llr_min = -llr_max; 902*4418919fSjohnjiang for (i = 0; i < n; ++i) { 903*4418919fSjohnjiang struct rte_mbuf *m = input_ops[i].data; 904*4418919fSjohnjiang while (m != NULL) { 905*4418919fSjohnjiang int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *, 906*4418919fSjohnjiang input_ops[i].offset); 907*4418919fSjohnjiang for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m); 908*4418919fSjohnjiang ++byte_idx) { 909*4418919fSjohnjiang 910*4418919fSjohnjiang llr_tmp = llr[byte_idx]; 911*4418919fSjohnjiang if (llr_decimals == 2) 912*4418919fSjohnjiang llr_tmp *= 2; 913*4418919fSjohnjiang else if (llr_decimals == 0) 914*4418919fSjohnjiang llr_tmp /= 2; 915*4418919fSjohnjiang llr_tmp = RTE_MIN(llr_max, 916*4418919fSjohnjiang RTE_MAX(llr_min, llr_tmp)); 917*4418919fSjohnjiang llr[byte_idx] = (int8_t) llr_tmp; 918*4418919fSjohnjiang } 919*4418919fSjohnjiang 920*4418919fSjohnjiang m = m->next; 921*4418919fSjohnjiang } 922*4418919fSjohnjiang } 923*4418919fSjohnjiang } 924*4418919fSjohnjiang 925*4418919fSjohnjiang 926*4418919fSjohnjiang 927d30ea906Sjfb8856606 static int 928d30ea906Sjfb8856606 fill_queue_buffers(struct test_op_params *op_params, 929d30ea906Sjfb8856606 struct rte_mempool *in_mp, struct rte_mempool *hard_out_mp, 930*4418919fSjohnjiang struct rte_mempool *soft_out_mp, 931*4418919fSjohnjiang struct rte_mempool *harq_in_mp, struct rte_mempool *harq_out_mp, 932*4418919fSjohnjiang uint16_t queue_id, 933d30ea906Sjfb8856606 const struct rte_bbdev_op_cap *capabilities, 934d30ea906Sjfb8856606 uint16_t min_alignment, const int socket_id) 935d30ea906Sjfb8856606 { 936d30ea906Sjfb8856606 int ret; 937d30ea906Sjfb8856606 enum op_data_type type; 938d30ea906Sjfb8856606 const uint16_t n = op_params->num_to_process; 939d30ea906Sjfb8856606 940d30ea906Sjfb8856606 struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = { 941d30ea906Sjfb8856606 in_mp, 942d30ea906Sjfb8856606 soft_out_mp, 943d30ea906Sjfb8856606 hard_out_mp, 944*4418919fSjohnjiang harq_in_mp, 945*4418919fSjohnjiang harq_out_mp, 946d30ea906Sjfb8856606 }; 947d30ea906Sjfb8856606 948d30ea906Sjfb8856606 struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = { 949d30ea906Sjfb8856606 &op_params->q_bufs[socket_id][queue_id].inputs, 950d30ea906Sjfb8856606 &op_params->q_bufs[socket_id][queue_id].soft_outputs, 951d30ea906Sjfb8856606 &op_params->q_bufs[socket_id][queue_id].hard_outputs, 952*4418919fSjohnjiang &op_params->q_bufs[socket_id][queue_id].harq_inputs, 953*4418919fSjohnjiang &op_params->q_bufs[socket_id][queue_id].harq_outputs, 954d30ea906Sjfb8856606 }; 955d30ea906Sjfb8856606 956d30ea906Sjfb8856606 for (type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) { 957d30ea906Sjfb8856606 struct op_data_entries *ref_entries = 958d30ea906Sjfb8856606 &test_vector.entries[type]; 959d30ea906Sjfb8856606 if (ref_entries->nb_segments == 0) 960d30ea906Sjfb8856606 continue; 961d30ea906Sjfb8856606 962d30ea906Sjfb8856606 ret = allocate_buffers_on_socket(queue_ops[type], 963d30ea906Sjfb8856606 n * sizeof(struct rte_bbdev_op_data), 964d30ea906Sjfb8856606 socket_id); 965d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(ret, 966d30ea906Sjfb8856606 "Couldn't allocate memory for rte_bbdev_op_data structs"); 967d30ea906Sjfb8856606 968d30ea906Sjfb8856606 ret = init_op_data_objs(*queue_ops[type], ref_entries, 969d30ea906Sjfb8856606 mbuf_pools[type], n, type, min_alignment); 970d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(ret, 971d30ea906Sjfb8856606 "Couldn't init rte_bbdev_op_data structs"); 972d30ea906Sjfb8856606 } 973d30ea906Sjfb8856606 974d30ea906Sjfb8856606 if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) 975d30ea906Sjfb8856606 limit_input_llr_val_range(*queue_ops[DATA_INPUT], n, 976d30ea906Sjfb8856606 capabilities->cap.turbo_dec.max_llr_modulus); 977d30ea906Sjfb8856606 978*4418919fSjohnjiang if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) { 979*4418919fSjohnjiang ldpc_input_llr_scaling(*queue_ops[DATA_INPUT], n, 980*4418919fSjohnjiang capabilities->cap.ldpc_dec.llr_size, 981*4418919fSjohnjiang capabilities->cap.ldpc_dec.llr_decimals); 982*4418919fSjohnjiang ldpc_input_llr_scaling(*queue_ops[DATA_HARQ_INPUT], n, 983*4418919fSjohnjiang capabilities->cap.ldpc_dec.llr_size, 984*4418919fSjohnjiang capabilities->cap.ldpc_dec.llr_decimals); 985*4418919fSjohnjiang } 986*4418919fSjohnjiang 987d30ea906Sjfb8856606 return 0; 988d30ea906Sjfb8856606 } 989d30ea906Sjfb8856606 990d30ea906Sjfb8856606 static void 991d30ea906Sjfb8856606 free_buffers(struct active_device *ad, struct test_op_params *op_params) 992d30ea906Sjfb8856606 { 993d30ea906Sjfb8856606 unsigned int i, j; 994d30ea906Sjfb8856606 995d30ea906Sjfb8856606 rte_mempool_free(ad->ops_mempool); 996d30ea906Sjfb8856606 rte_mempool_free(ad->in_mbuf_pool); 997d30ea906Sjfb8856606 rte_mempool_free(ad->hard_out_mbuf_pool); 998d30ea906Sjfb8856606 rte_mempool_free(ad->soft_out_mbuf_pool); 999*4418919fSjohnjiang rte_mempool_free(ad->harq_in_mbuf_pool); 1000*4418919fSjohnjiang rte_mempool_free(ad->harq_out_mbuf_pool); 1001d30ea906Sjfb8856606 1002d30ea906Sjfb8856606 for (i = 0; i < rte_lcore_count(); ++i) { 1003d30ea906Sjfb8856606 for (j = 0; j < RTE_MAX_NUMA_NODES; ++j) { 1004d30ea906Sjfb8856606 rte_free(op_params->q_bufs[j][i].inputs); 1005d30ea906Sjfb8856606 rte_free(op_params->q_bufs[j][i].hard_outputs); 1006d30ea906Sjfb8856606 rte_free(op_params->q_bufs[j][i].soft_outputs); 1007*4418919fSjohnjiang rte_free(op_params->q_bufs[j][i].harq_inputs); 1008*4418919fSjohnjiang rte_free(op_params->q_bufs[j][i].harq_outputs); 1009d30ea906Sjfb8856606 } 1010d30ea906Sjfb8856606 } 1011d30ea906Sjfb8856606 } 1012d30ea906Sjfb8856606 1013d30ea906Sjfb8856606 static void 1014d30ea906Sjfb8856606 copy_reference_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, 1015d30ea906Sjfb8856606 unsigned int start_idx, 1016d30ea906Sjfb8856606 struct rte_bbdev_op_data *inputs, 1017d30ea906Sjfb8856606 struct rte_bbdev_op_data *hard_outputs, 1018d30ea906Sjfb8856606 struct rte_bbdev_op_data *soft_outputs, 1019d30ea906Sjfb8856606 struct rte_bbdev_dec_op *ref_op) 1020d30ea906Sjfb8856606 { 1021d30ea906Sjfb8856606 unsigned int i; 1022d30ea906Sjfb8856606 struct rte_bbdev_op_turbo_dec *turbo_dec = &ref_op->turbo_dec; 1023d30ea906Sjfb8856606 1024d30ea906Sjfb8856606 for (i = 0; i < n; ++i) { 1025d30ea906Sjfb8856606 if (turbo_dec->code_block_mode == 0) { 1026d30ea906Sjfb8856606 ops[i]->turbo_dec.tb_params.ea = 1027d30ea906Sjfb8856606 turbo_dec->tb_params.ea; 1028d30ea906Sjfb8856606 ops[i]->turbo_dec.tb_params.eb = 1029d30ea906Sjfb8856606 turbo_dec->tb_params.eb; 1030d30ea906Sjfb8856606 ops[i]->turbo_dec.tb_params.k_pos = 1031d30ea906Sjfb8856606 turbo_dec->tb_params.k_pos; 1032d30ea906Sjfb8856606 ops[i]->turbo_dec.tb_params.k_neg = 1033d30ea906Sjfb8856606 turbo_dec->tb_params.k_neg; 1034d30ea906Sjfb8856606 ops[i]->turbo_dec.tb_params.c = 1035d30ea906Sjfb8856606 turbo_dec->tb_params.c; 1036d30ea906Sjfb8856606 ops[i]->turbo_dec.tb_params.c_neg = 1037d30ea906Sjfb8856606 turbo_dec->tb_params.c_neg; 1038d30ea906Sjfb8856606 ops[i]->turbo_dec.tb_params.cab = 1039d30ea906Sjfb8856606 turbo_dec->tb_params.cab; 1040*4418919fSjohnjiang ops[i]->turbo_dec.tb_params.r = 1041*4418919fSjohnjiang turbo_dec->tb_params.r; 1042d30ea906Sjfb8856606 } else { 1043d30ea906Sjfb8856606 ops[i]->turbo_dec.cb_params.e = turbo_dec->cb_params.e; 1044d30ea906Sjfb8856606 ops[i]->turbo_dec.cb_params.k = turbo_dec->cb_params.k; 1045d30ea906Sjfb8856606 } 1046d30ea906Sjfb8856606 1047d30ea906Sjfb8856606 ops[i]->turbo_dec.ext_scale = turbo_dec->ext_scale; 1048d30ea906Sjfb8856606 ops[i]->turbo_dec.iter_max = turbo_dec->iter_max; 1049d30ea906Sjfb8856606 ops[i]->turbo_dec.iter_min = turbo_dec->iter_min; 1050d30ea906Sjfb8856606 ops[i]->turbo_dec.op_flags = turbo_dec->op_flags; 1051d30ea906Sjfb8856606 ops[i]->turbo_dec.rv_index = turbo_dec->rv_index; 1052d30ea906Sjfb8856606 ops[i]->turbo_dec.num_maps = turbo_dec->num_maps; 1053d30ea906Sjfb8856606 ops[i]->turbo_dec.code_block_mode = turbo_dec->code_block_mode; 1054d30ea906Sjfb8856606 1055d30ea906Sjfb8856606 ops[i]->turbo_dec.hard_output = hard_outputs[start_idx + i]; 1056d30ea906Sjfb8856606 ops[i]->turbo_dec.input = inputs[start_idx + i]; 1057d30ea906Sjfb8856606 if (soft_outputs != NULL) 1058d30ea906Sjfb8856606 ops[i]->turbo_dec.soft_output = 1059d30ea906Sjfb8856606 soft_outputs[start_idx + i]; 1060d30ea906Sjfb8856606 } 1061d30ea906Sjfb8856606 } 1062d30ea906Sjfb8856606 1063d30ea906Sjfb8856606 static void 1064d30ea906Sjfb8856606 copy_reference_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n, 1065d30ea906Sjfb8856606 unsigned int start_idx, 1066d30ea906Sjfb8856606 struct rte_bbdev_op_data *inputs, 1067d30ea906Sjfb8856606 struct rte_bbdev_op_data *outputs, 1068d30ea906Sjfb8856606 struct rte_bbdev_enc_op *ref_op) 1069d30ea906Sjfb8856606 { 1070d30ea906Sjfb8856606 unsigned int i; 1071d30ea906Sjfb8856606 struct rte_bbdev_op_turbo_enc *turbo_enc = &ref_op->turbo_enc; 1072d30ea906Sjfb8856606 for (i = 0; i < n; ++i) { 1073d30ea906Sjfb8856606 if (turbo_enc->code_block_mode == 0) { 1074d30ea906Sjfb8856606 ops[i]->turbo_enc.tb_params.ea = 1075d30ea906Sjfb8856606 turbo_enc->tb_params.ea; 1076d30ea906Sjfb8856606 ops[i]->turbo_enc.tb_params.eb = 1077d30ea906Sjfb8856606 turbo_enc->tb_params.eb; 1078d30ea906Sjfb8856606 ops[i]->turbo_enc.tb_params.k_pos = 1079d30ea906Sjfb8856606 turbo_enc->tb_params.k_pos; 1080d30ea906Sjfb8856606 ops[i]->turbo_enc.tb_params.k_neg = 1081d30ea906Sjfb8856606 turbo_enc->tb_params.k_neg; 1082d30ea906Sjfb8856606 ops[i]->turbo_enc.tb_params.c = 1083d30ea906Sjfb8856606 turbo_enc->tb_params.c; 1084d30ea906Sjfb8856606 ops[i]->turbo_enc.tb_params.c_neg = 1085d30ea906Sjfb8856606 turbo_enc->tb_params.c_neg; 1086d30ea906Sjfb8856606 ops[i]->turbo_enc.tb_params.cab = 1087d30ea906Sjfb8856606 turbo_enc->tb_params.cab; 1088d30ea906Sjfb8856606 ops[i]->turbo_enc.tb_params.ncb_pos = 1089d30ea906Sjfb8856606 turbo_enc->tb_params.ncb_pos; 1090d30ea906Sjfb8856606 ops[i]->turbo_enc.tb_params.ncb_neg = 1091d30ea906Sjfb8856606 turbo_enc->tb_params.ncb_neg; 1092d30ea906Sjfb8856606 ops[i]->turbo_enc.tb_params.r = turbo_enc->tb_params.r; 1093d30ea906Sjfb8856606 } else { 1094d30ea906Sjfb8856606 ops[i]->turbo_enc.cb_params.e = turbo_enc->cb_params.e; 1095d30ea906Sjfb8856606 ops[i]->turbo_enc.cb_params.k = turbo_enc->cb_params.k; 1096d30ea906Sjfb8856606 ops[i]->turbo_enc.cb_params.ncb = 1097d30ea906Sjfb8856606 turbo_enc->cb_params.ncb; 1098d30ea906Sjfb8856606 } 1099d30ea906Sjfb8856606 ops[i]->turbo_enc.rv_index = turbo_enc->rv_index; 1100d30ea906Sjfb8856606 ops[i]->turbo_enc.op_flags = turbo_enc->op_flags; 1101d30ea906Sjfb8856606 ops[i]->turbo_enc.code_block_mode = turbo_enc->code_block_mode; 1102d30ea906Sjfb8856606 1103d30ea906Sjfb8856606 ops[i]->turbo_enc.output = outputs[start_idx + i]; 1104d30ea906Sjfb8856606 ops[i]->turbo_enc.input = inputs[start_idx + i]; 1105d30ea906Sjfb8856606 } 1106d30ea906Sjfb8856606 } 1107d30ea906Sjfb8856606 1108*4418919fSjohnjiang static void 1109*4418919fSjohnjiang copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, 1110*4418919fSjohnjiang unsigned int start_idx, 1111*4418919fSjohnjiang struct rte_bbdev_op_data *inputs, 1112*4418919fSjohnjiang struct rte_bbdev_op_data *hard_outputs, 1113*4418919fSjohnjiang struct rte_bbdev_op_data *soft_outputs, 1114*4418919fSjohnjiang struct rte_bbdev_op_data *harq_inputs, 1115*4418919fSjohnjiang struct rte_bbdev_op_data *harq_outputs, 1116*4418919fSjohnjiang struct rte_bbdev_dec_op *ref_op) 1117*4418919fSjohnjiang { 1118*4418919fSjohnjiang unsigned int i; 1119*4418919fSjohnjiang struct rte_bbdev_op_ldpc_dec *ldpc_dec = &ref_op->ldpc_dec; 1120*4418919fSjohnjiang 1121*4418919fSjohnjiang for (i = 0; i < n; ++i) { 1122*4418919fSjohnjiang if (ldpc_dec->code_block_mode == 0) { 1123*4418919fSjohnjiang ops[i]->ldpc_dec.tb_params.ea = 1124*4418919fSjohnjiang ldpc_dec->tb_params.ea; 1125*4418919fSjohnjiang ops[i]->ldpc_dec.tb_params.eb = 1126*4418919fSjohnjiang ldpc_dec->tb_params.eb; 1127*4418919fSjohnjiang ops[i]->ldpc_dec.tb_params.c = 1128*4418919fSjohnjiang ldpc_dec->tb_params.c; 1129*4418919fSjohnjiang ops[i]->ldpc_dec.tb_params.cab = 1130*4418919fSjohnjiang ldpc_dec->tb_params.cab; 1131*4418919fSjohnjiang ops[i]->ldpc_dec.tb_params.r = 1132*4418919fSjohnjiang ldpc_dec->tb_params.r; 1133*4418919fSjohnjiang } else { 1134*4418919fSjohnjiang ops[i]->ldpc_dec.cb_params.e = ldpc_dec->cb_params.e; 1135*4418919fSjohnjiang } 1136*4418919fSjohnjiang 1137*4418919fSjohnjiang ops[i]->ldpc_dec.basegraph = ldpc_dec->basegraph; 1138*4418919fSjohnjiang ops[i]->ldpc_dec.z_c = ldpc_dec->z_c; 1139*4418919fSjohnjiang ops[i]->ldpc_dec.q_m = ldpc_dec->q_m; 1140*4418919fSjohnjiang ops[i]->ldpc_dec.n_filler = ldpc_dec->n_filler; 1141*4418919fSjohnjiang ops[i]->ldpc_dec.n_cb = ldpc_dec->n_cb; 1142*4418919fSjohnjiang ops[i]->ldpc_dec.iter_max = ldpc_dec->iter_max; 1143*4418919fSjohnjiang ops[i]->ldpc_dec.rv_index = ldpc_dec->rv_index; 1144*4418919fSjohnjiang ops[i]->ldpc_dec.op_flags = ldpc_dec->op_flags; 1145*4418919fSjohnjiang ops[i]->ldpc_dec.code_block_mode = ldpc_dec->code_block_mode; 1146*4418919fSjohnjiang 1147*4418919fSjohnjiang ops[i]->ldpc_dec.hard_output = hard_outputs[start_idx + i]; 1148*4418919fSjohnjiang ops[i]->ldpc_dec.input = inputs[start_idx + i]; 1149*4418919fSjohnjiang if (soft_outputs != NULL) 1150*4418919fSjohnjiang ops[i]->ldpc_dec.soft_output = 1151*4418919fSjohnjiang soft_outputs[start_idx + i]; 1152*4418919fSjohnjiang if (harq_inputs != NULL) 1153*4418919fSjohnjiang ops[i]->ldpc_dec.harq_combined_input = 1154*4418919fSjohnjiang harq_inputs[start_idx + i]; 1155*4418919fSjohnjiang if (harq_outputs != NULL) 1156*4418919fSjohnjiang ops[i]->ldpc_dec.harq_combined_output = 1157*4418919fSjohnjiang harq_outputs[start_idx + i]; 1158*4418919fSjohnjiang } 1159*4418919fSjohnjiang } 1160*4418919fSjohnjiang 1161*4418919fSjohnjiang 1162*4418919fSjohnjiang static void 1163*4418919fSjohnjiang copy_reference_ldpc_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n, 1164*4418919fSjohnjiang unsigned int start_idx, 1165*4418919fSjohnjiang struct rte_bbdev_op_data *inputs, 1166*4418919fSjohnjiang struct rte_bbdev_op_data *outputs, 1167*4418919fSjohnjiang struct rte_bbdev_enc_op *ref_op) 1168*4418919fSjohnjiang { 1169*4418919fSjohnjiang unsigned int i; 1170*4418919fSjohnjiang struct rte_bbdev_op_ldpc_enc *ldpc_enc = &ref_op->ldpc_enc; 1171*4418919fSjohnjiang for (i = 0; i < n; ++i) { 1172*4418919fSjohnjiang if (ldpc_enc->code_block_mode == 0) { 1173*4418919fSjohnjiang ops[i]->ldpc_enc.tb_params.ea = ldpc_enc->tb_params.ea; 1174*4418919fSjohnjiang ops[i]->ldpc_enc.tb_params.eb = ldpc_enc->tb_params.eb; 1175*4418919fSjohnjiang ops[i]->ldpc_enc.tb_params.cab = 1176*4418919fSjohnjiang ldpc_enc->tb_params.cab; 1177*4418919fSjohnjiang ops[i]->ldpc_enc.tb_params.c = ldpc_enc->tb_params.c; 1178*4418919fSjohnjiang ops[i]->ldpc_enc.tb_params.r = ldpc_enc->tb_params.r; 1179*4418919fSjohnjiang } else { 1180*4418919fSjohnjiang ops[i]->ldpc_enc.cb_params.e = ldpc_enc->cb_params.e; 1181*4418919fSjohnjiang } 1182*4418919fSjohnjiang ops[i]->ldpc_enc.basegraph = ldpc_enc->basegraph; 1183*4418919fSjohnjiang ops[i]->ldpc_enc.z_c = ldpc_enc->z_c; 1184*4418919fSjohnjiang ops[i]->ldpc_enc.q_m = ldpc_enc->q_m; 1185*4418919fSjohnjiang ops[i]->ldpc_enc.n_filler = ldpc_enc->n_filler; 1186*4418919fSjohnjiang ops[i]->ldpc_enc.n_cb = ldpc_enc->n_cb; 1187*4418919fSjohnjiang ops[i]->ldpc_enc.rv_index = ldpc_enc->rv_index; 1188*4418919fSjohnjiang ops[i]->ldpc_enc.op_flags = ldpc_enc->op_flags; 1189*4418919fSjohnjiang ops[i]->ldpc_enc.code_block_mode = ldpc_enc->code_block_mode; 1190*4418919fSjohnjiang ops[i]->ldpc_enc.output = outputs[start_idx + i]; 1191*4418919fSjohnjiang ops[i]->ldpc_enc.input = inputs[start_idx + i]; 1192*4418919fSjohnjiang } 1193*4418919fSjohnjiang } 1194*4418919fSjohnjiang 1195d30ea906Sjfb8856606 static int 1196d30ea906Sjfb8856606 check_dec_status_and_ordering(struct rte_bbdev_dec_op *op, 1197d30ea906Sjfb8856606 unsigned int order_idx, const int expected_status) 1198d30ea906Sjfb8856606 { 1199d30ea906Sjfb8856606 TEST_ASSERT(op->status == expected_status, 1200d30ea906Sjfb8856606 "op_status (%d) != expected_status (%d)", 1201d30ea906Sjfb8856606 op->status, expected_status); 1202d30ea906Sjfb8856606 1203d30ea906Sjfb8856606 TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data, 1204d30ea906Sjfb8856606 "Ordering error, expected %p, got %p", 1205d30ea906Sjfb8856606 (void *)(uintptr_t)order_idx, op->opaque_data); 1206d30ea906Sjfb8856606 1207d30ea906Sjfb8856606 return TEST_SUCCESS; 1208d30ea906Sjfb8856606 } 1209d30ea906Sjfb8856606 1210d30ea906Sjfb8856606 static int 1211d30ea906Sjfb8856606 check_enc_status_and_ordering(struct rte_bbdev_enc_op *op, 1212d30ea906Sjfb8856606 unsigned int order_idx, const int expected_status) 1213d30ea906Sjfb8856606 { 1214d30ea906Sjfb8856606 TEST_ASSERT(op->status == expected_status, 1215d30ea906Sjfb8856606 "op_status (%d) != expected_status (%d)", 1216d30ea906Sjfb8856606 op->status, expected_status); 1217d30ea906Sjfb8856606 1218d30ea906Sjfb8856606 TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data, 1219d30ea906Sjfb8856606 "Ordering error, expected %p, got %p", 1220d30ea906Sjfb8856606 (void *)(uintptr_t)order_idx, op->opaque_data); 1221d30ea906Sjfb8856606 1222d30ea906Sjfb8856606 return TEST_SUCCESS; 1223d30ea906Sjfb8856606 } 1224d30ea906Sjfb8856606 1225d30ea906Sjfb8856606 static inline int 1226d30ea906Sjfb8856606 validate_op_chain(struct rte_bbdev_op_data *op, 1227d30ea906Sjfb8856606 struct op_data_entries *orig_op) 1228d30ea906Sjfb8856606 { 1229d30ea906Sjfb8856606 uint8_t i; 1230d30ea906Sjfb8856606 struct rte_mbuf *m = op->data; 1231d30ea906Sjfb8856606 uint8_t nb_dst_segments = orig_op->nb_segments; 1232*4418919fSjohnjiang uint32_t total_data_size = 0; 1233d30ea906Sjfb8856606 1234d30ea906Sjfb8856606 TEST_ASSERT(nb_dst_segments == m->nb_segs, 1235d30ea906Sjfb8856606 "Number of segments differ in original (%u) and filled (%u) op", 1236d30ea906Sjfb8856606 nb_dst_segments, m->nb_segs); 1237d30ea906Sjfb8856606 1238*4418919fSjohnjiang /* Validate each mbuf segment length */ 1239d30ea906Sjfb8856606 for (i = 0; i < nb_dst_segments; ++i) { 1240d30ea906Sjfb8856606 /* Apply offset to the first mbuf segment */ 1241d30ea906Sjfb8856606 uint16_t offset = (i == 0) ? op->offset : 0; 1242*4418919fSjohnjiang uint16_t data_len = rte_pktmbuf_data_len(m) - offset; 1243*4418919fSjohnjiang total_data_size += orig_op->segments[i].length; 1244d30ea906Sjfb8856606 1245d30ea906Sjfb8856606 TEST_ASSERT(orig_op->segments[i].length == data_len, 1246d30ea906Sjfb8856606 "Length of segment differ in original (%u) and filled (%u) op", 1247d30ea906Sjfb8856606 orig_op->segments[i].length, data_len); 1248d30ea906Sjfb8856606 TEST_ASSERT_BUFFERS_ARE_EQUAL(orig_op->segments[i].addr, 1249d30ea906Sjfb8856606 rte_pktmbuf_mtod_offset(m, uint32_t *, offset), 1250d30ea906Sjfb8856606 data_len, 1251d30ea906Sjfb8856606 "Output buffers (CB=%u) are not equal", i); 1252d30ea906Sjfb8856606 m = m->next; 1253d30ea906Sjfb8856606 } 1254d30ea906Sjfb8856606 1255*4418919fSjohnjiang /* Validate total mbuf pkt length */ 1256*4418919fSjohnjiang uint32_t pkt_len = rte_pktmbuf_pkt_len(op->data) - op->offset; 1257*4418919fSjohnjiang TEST_ASSERT(total_data_size == pkt_len, 1258*4418919fSjohnjiang "Length of data differ in original (%u) and filled (%u) op", 1259*4418919fSjohnjiang total_data_size, pkt_len); 1260d30ea906Sjfb8856606 1261d30ea906Sjfb8856606 return TEST_SUCCESS; 1262d30ea906Sjfb8856606 } 1263d30ea906Sjfb8856606 1264d30ea906Sjfb8856606 static int 1265d30ea906Sjfb8856606 validate_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, 1266d30ea906Sjfb8856606 struct rte_bbdev_dec_op *ref_op, const int vector_mask) 1267d30ea906Sjfb8856606 { 1268d30ea906Sjfb8856606 unsigned int i; 1269d30ea906Sjfb8856606 int ret; 1270d30ea906Sjfb8856606 struct op_data_entries *hard_data_orig = 1271d30ea906Sjfb8856606 &test_vector.entries[DATA_HARD_OUTPUT]; 1272d30ea906Sjfb8856606 struct op_data_entries *soft_data_orig = 1273d30ea906Sjfb8856606 &test_vector.entries[DATA_SOFT_OUTPUT]; 1274d30ea906Sjfb8856606 struct rte_bbdev_op_turbo_dec *ops_td; 1275d30ea906Sjfb8856606 struct rte_bbdev_op_data *hard_output; 1276d30ea906Sjfb8856606 struct rte_bbdev_op_data *soft_output; 1277d30ea906Sjfb8856606 struct rte_bbdev_op_turbo_dec *ref_td = &ref_op->turbo_dec; 1278d30ea906Sjfb8856606 1279d30ea906Sjfb8856606 for (i = 0; i < n; ++i) { 1280d30ea906Sjfb8856606 ops_td = &ops[i]->turbo_dec; 1281d30ea906Sjfb8856606 hard_output = &ops_td->hard_output; 1282d30ea906Sjfb8856606 soft_output = &ops_td->soft_output; 1283d30ea906Sjfb8856606 1284d30ea906Sjfb8856606 if (vector_mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT) 1285d30ea906Sjfb8856606 TEST_ASSERT(ops_td->iter_count <= ref_td->iter_count, 1286d30ea906Sjfb8856606 "Returned iter_count (%d) > expected iter_count (%d)", 1287d30ea906Sjfb8856606 ops_td->iter_count, ref_td->iter_count); 1288d30ea906Sjfb8856606 ret = check_dec_status_and_ordering(ops[i], i, ref_op->status); 1289d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(ret, 1290d30ea906Sjfb8856606 "Checking status and ordering for decoder failed"); 1291d30ea906Sjfb8856606 1292d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(validate_op_chain(hard_output, 1293d30ea906Sjfb8856606 hard_data_orig), 1294d30ea906Sjfb8856606 "Hard output buffers (CB=%u) are not equal", 1295d30ea906Sjfb8856606 i); 1296d30ea906Sjfb8856606 1297d30ea906Sjfb8856606 if (ref_op->turbo_dec.op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT) 1298d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(validate_op_chain(soft_output, 1299d30ea906Sjfb8856606 soft_data_orig), 1300d30ea906Sjfb8856606 "Soft output buffers (CB=%u) are not equal", 1301d30ea906Sjfb8856606 i); 1302d30ea906Sjfb8856606 } 1303d30ea906Sjfb8856606 1304d30ea906Sjfb8856606 return TEST_SUCCESS; 1305d30ea906Sjfb8856606 } 1306d30ea906Sjfb8856606 1307*4418919fSjohnjiang 1308*4418919fSjohnjiang static int 1309*4418919fSjohnjiang validate_ldpc_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, 1310*4418919fSjohnjiang struct rte_bbdev_dec_op *ref_op, const int vector_mask) 1311*4418919fSjohnjiang { 1312*4418919fSjohnjiang unsigned int i; 1313*4418919fSjohnjiang int ret; 1314*4418919fSjohnjiang struct op_data_entries *hard_data_orig = 1315*4418919fSjohnjiang &test_vector.entries[DATA_HARD_OUTPUT]; 1316*4418919fSjohnjiang struct op_data_entries *soft_data_orig = 1317*4418919fSjohnjiang &test_vector.entries[DATA_SOFT_OUTPUT]; 1318*4418919fSjohnjiang struct op_data_entries *harq_data_orig = 1319*4418919fSjohnjiang &test_vector.entries[DATA_HARQ_OUTPUT]; 1320*4418919fSjohnjiang struct rte_bbdev_op_ldpc_dec *ops_td; 1321*4418919fSjohnjiang struct rte_bbdev_op_data *hard_output; 1322*4418919fSjohnjiang struct rte_bbdev_op_data *harq_output; 1323*4418919fSjohnjiang struct rte_bbdev_op_data *soft_output; 1324*4418919fSjohnjiang struct rte_bbdev_op_ldpc_dec *ref_td = &ref_op->ldpc_dec; 1325*4418919fSjohnjiang 1326*4418919fSjohnjiang for (i = 0; i < n; ++i) { 1327*4418919fSjohnjiang ops_td = &ops[i]->ldpc_dec; 1328*4418919fSjohnjiang hard_output = &ops_td->hard_output; 1329*4418919fSjohnjiang harq_output = &ops_td->harq_combined_output; 1330*4418919fSjohnjiang soft_output = &ops_td->soft_output; 1331*4418919fSjohnjiang 1332*4418919fSjohnjiang ret = check_dec_status_and_ordering(ops[i], i, ref_op->status); 1333*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, 1334*4418919fSjohnjiang "Checking status and ordering for decoder failed"); 1335*4418919fSjohnjiang if (vector_mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT) 1336*4418919fSjohnjiang TEST_ASSERT(ops_td->iter_count <= ref_td->iter_count, 1337*4418919fSjohnjiang "Returned iter_count (%d) > expected iter_count (%d)", 1338*4418919fSjohnjiang ops_td->iter_count, ref_td->iter_count); 1339*4418919fSjohnjiang /* We can ignore data when the decoding failed to converge */ 1340*4418919fSjohnjiang if ((ops[i]->status & (1 << RTE_BBDEV_SYNDROME_ERROR)) == 0) 1341*4418919fSjohnjiang TEST_ASSERT_SUCCESS(validate_op_chain(hard_output, 1342*4418919fSjohnjiang hard_data_orig), 1343*4418919fSjohnjiang "Hard output buffers (CB=%u) are not equal", 1344*4418919fSjohnjiang i); 1345*4418919fSjohnjiang 1346*4418919fSjohnjiang if (ref_op->ldpc_dec.op_flags & RTE_BBDEV_LDPC_SOFT_OUT_ENABLE) 1347*4418919fSjohnjiang TEST_ASSERT_SUCCESS(validate_op_chain(soft_output, 1348*4418919fSjohnjiang soft_data_orig), 1349*4418919fSjohnjiang "Soft output buffers (CB=%u) are not equal", 1350*4418919fSjohnjiang i); 1351*4418919fSjohnjiang if (ref_op->ldpc_dec.op_flags & 1352*4418919fSjohnjiang RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE) { 1353*4418919fSjohnjiang ldpc_input_llr_scaling(harq_output, 1, 8, 0); 1354*4418919fSjohnjiang TEST_ASSERT_SUCCESS(validate_op_chain(harq_output, 1355*4418919fSjohnjiang harq_data_orig), 1356*4418919fSjohnjiang "HARQ output buffers (CB=%u) are not equal", 1357*4418919fSjohnjiang i); 1358*4418919fSjohnjiang } 1359*4418919fSjohnjiang } 1360*4418919fSjohnjiang 1361*4418919fSjohnjiang return TEST_SUCCESS; 1362*4418919fSjohnjiang } 1363*4418919fSjohnjiang 1364*4418919fSjohnjiang 1365d30ea906Sjfb8856606 static int 1366d30ea906Sjfb8856606 validate_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n, 1367d30ea906Sjfb8856606 struct rte_bbdev_enc_op *ref_op) 1368d30ea906Sjfb8856606 { 1369d30ea906Sjfb8856606 unsigned int i; 1370d30ea906Sjfb8856606 int ret; 1371d30ea906Sjfb8856606 struct op_data_entries *hard_data_orig = 1372d30ea906Sjfb8856606 &test_vector.entries[DATA_HARD_OUTPUT]; 1373d30ea906Sjfb8856606 1374d30ea906Sjfb8856606 for (i = 0; i < n; ++i) { 1375d30ea906Sjfb8856606 ret = check_enc_status_and_ordering(ops[i], i, ref_op->status); 1376d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(ret, 1377d30ea906Sjfb8856606 "Checking status and ordering for encoder failed"); 1378d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(validate_op_chain( 1379d30ea906Sjfb8856606 &ops[i]->turbo_enc.output, 1380d30ea906Sjfb8856606 hard_data_orig), 1381d30ea906Sjfb8856606 "Output buffers (CB=%u) are not equal", 1382d30ea906Sjfb8856606 i); 1383d30ea906Sjfb8856606 } 1384d30ea906Sjfb8856606 1385d30ea906Sjfb8856606 return TEST_SUCCESS; 1386d30ea906Sjfb8856606 } 1387d30ea906Sjfb8856606 1388*4418919fSjohnjiang static int 1389*4418919fSjohnjiang validate_ldpc_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n, 1390*4418919fSjohnjiang struct rte_bbdev_enc_op *ref_op) 1391*4418919fSjohnjiang { 1392*4418919fSjohnjiang unsigned int i; 1393*4418919fSjohnjiang int ret; 1394*4418919fSjohnjiang struct op_data_entries *hard_data_orig = 1395*4418919fSjohnjiang &test_vector.entries[DATA_HARD_OUTPUT]; 1396*4418919fSjohnjiang 1397*4418919fSjohnjiang for (i = 0; i < n; ++i) { 1398*4418919fSjohnjiang ret = check_enc_status_and_ordering(ops[i], i, ref_op->status); 1399*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, 1400*4418919fSjohnjiang "Checking status and ordering for encoder failed"); 1401*4418919fSjohnjiang TEST_ASSERT_SUCCESS(validate_op_chain( 1402*4418919fSjohnjiang &ops[i]->ldpc_enc.output, 1403*4418919fSjohnjiang hard_data_orig), 1404*4418919fSjohnjiang "Output buffers (CB=%u) are not equal", 1405*4418919fSjohnjiang i); 1406*4418919fSjohnjiang } 1407*4418919fSjohnjiang 1408*4418919fSjohnjiang return TEST_SUCCESS; 1409*4418919fSjohnjiang } 1410*4418919fSjohnjiang 1411d30ea906Sjfb8856606 static void 1412d30ea906Sjfb8856606 create_reference_dec_op(struct rte_bbdev_dec_op *op) 1413d30ea906Sjfb8856606 { 1414d30ea906Sjfb8856606 unsigned int i; 1415d30ea906Sjfb8856606 struct op_data_entries *entry; 1416d30ea906Sjfb8856606 1417d30ea906Sjfb8856606 op->turbo_dec = test_vector.turbo_dec; 1418d30ea906Sjfb8856606 entry = &test_vector.entries[DATA_INPUT]; 1419d30ea906Sjfb8856606 for (i = 0; i < entry->nb_segments; ++i) 1420d30ea906Sjfb8856606 op->turbo_dec.input.length += 1421d30ea906Sjfb8856606 entry->segments[i].length; 1422d30ea906Sjfb8856606 } 1423d30ea906Sjfb8856606 1424d30ea906Sjfb8856606 static void 1425*4418919fSjohnjiang create_reference_ldpc_dec_op(struct rte_bbdev_dec_op *op) 1426*4418919fSjohnjiang { 1427*4418919fSjohnjiang unsigned int i; 1428*4418919fSjohnjiang struct op_data_entries *entry; 1429*4418919fSjohnjiang 1430*4418919fSjohnjiang op->ldpc_dec = test_vector.ldpc_dec; 1431*4418919fSjohnjiang entry = &test_vector.entries[DATA_INPUT]; 1432*4418919fSjohnjiang for (i = 0; i < entry->nb_segments; ++i) 1433*4418919fSjohnjiang op->ldpc_dec.input.length += 1434*4418919fSjohnjiang entry->segments[i].length; 1435*4418919fSjohnjiang if (test_vector.ldpc_dec.op_flags & 1436*4418919fSjohnjiang RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE) { 1437*4418919fSjohnjiang entry = &test_vector.entries[DATA_HARQ_INPUT]; 1438*4418919fSjohnjiang for (i = 0; i < entry->nb_segments; ++i) 1439*4418919fSjohnjiang op->ldpc_dec.harq_combined_input.length += 1440*4418919fSjohnjiang entry->segments[i].length; 1441*4418919fSjohnjiang } 1442*4418919fSjohnjiang } 1443*4418919fSjohnjiang 1444*4418919fSjohnjiang 1445*4418919fSjohnjiang static void 1446d30ea906Sjfb8856606 create_reference_enc_op(struct rte_bbdev_enc_op *op) 1447d30ea906Sjfb8856606 { 1448d30ea906Sjfb8856606 unsigned int i; 1449d30ea906Sjfb8856606 struct op_data_entries *entry; 1450d30ea906Sjfb8856606 1451d30ea906Sjfb8856606 op->turbo_enc = test_vector.turbo_enc; 1452d30ea906Sjfb8856606 entry = &test_vector.entries[DATA_INPUT]; 1453d30ea906Sjfb8856606 for (i = 0; i < entry->nb_segments; ++i) 1454d30ea906Sjfb8856606 op->turbo_enc.input.length += 1455d30ea906Sjfb8856606 entry->segments[i].length; 1456d30ea906Sjfb8856606 } 1457d30ea906Sjfb8856606 1458*4418919fSjohnjiang static void 1459*4418919fSjohnjiang create_reference_ldpc_enc_op(struct rte_bbdev_enc_op *op) 1460*4418919fSjohnjiang { 1461*4418919fSjohnjiang unsigned int i; 1462*4418919fSjohnjiang struct op_data_entries *entry; 1463*4418919fSjohnjiang 1464*4418919fSjohnjiang op->ldpc_enc = test_vector.ldpc_enc; 1465*4418919fSjohnjiang entry = &test_vector.entries[DATA_INPUT]; 1466*4418919fSjohnjiang for (i = 0; i < entry->nb_segments; ++i) 1467*4418919fSjohnjiang op->ldpc_enc.input.length += 1468*4418919fSjohnjiang entry->segments[i].length; 1469*4418919fSjohnjiang } 1470*4418919fSjohnjiang 1471*4418919fSjohnjiang static uint32_t 1472*4418919fSjohnjiang calc_dec_TB_size(struct rte_bbdev_dec_op *op) 1473*4418919fSjohnjiang { 1474*4418919fSjohnjiang uint8_t i; 1475*4418919fSjohnjiang uint32_t c, r, tb_size = 0; 1476*4418919fSjohnjiang 1477*4418919fSjohnjiang if (op->turbo_dec.code_block_mode) { 1478*4418919fSjohnjiang tb_size = op->turbo_dec.tb_params.k_neg; 1479*4418919fSjohnjiang } else { 1480*4418919fSjohnjiang c = op->turbo_dec.tb_params.c; 1481*4418919fSjohnjiang r = op->turbo_dec.tb_params.r; 1482*4418919fSjohnjiang for (i = 0; i < c-r; i++) 1483*4418919fSjohnjiang tb_size += (r < op->turbo_dec.tb_params.c_neg) ? 1484*4418919fSjohnjiang op->turbo_dec.tb_params.k_neg : 1485*4418919fSjohnjiang op->turbo_dec.tb_params.k_pos; 1486*4418919fSjohnjiang } 1487*4418919fSjohnjiang return tb_size; 1488*4418919fSjohnjiang } 1489*4418919fSjohnjiang 1490*4418919fSjohnjiang static uint32_t 1491*4418919fSjohnjiang calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op *op) 1492*4418919fSjohnjiang { 1493*4418919fSjohnjiang uint8_t i; 1494*4418919fSjohnjiang uint32_t c, r, tb_size = 0; 1495*4418919fSjohnjiang uint16_t sys_cols = (op->ldpc_dec.basegraph == 1) ? 22 : 10; 1496*4418919fSjohnjiang 1497*4418919fSjohnjiang if (op->ldpc_dec.code_block_mode) { 1498*4418919fSjohnjiang tb_size = sys_cols * op->ldpc_dec.z_c - op->ldpc_dec.n_filler; 1499*4418919fSjohnjiang } else { 1500*4418919fSjohnjiang c = op->ldpc_dec.tb_params.c; 1501*4418919fSjohnjiang r = op->ldpc_dec.tb_params.r; 1502*4418919fSjohnjiang for (i = 0; i < c-r; i++) 1503*4418919fSjohnjiang tb_size += sys_cols * op->ldpc_dec.z_c 1504*4418919fSjohnjiang - op->ldpc_dec.n_filler; 1505*4418919fSjohnjiang } 1506*4418919fSjohnjiang return tb_size; 1507*4418919fSjohnjiang } 1508*4418919fSjohnjiang 1509*4418919fSjohnjiang static uint32_t 1510*4418919fSjohnjiang calc_enc_TB_size(struct rte_bbdev_enc_op *op) 1511*4418919fSjohnjiang { 1512*4418919fSjohnjiang uint8_t i; 1513*4418919fSjohnjiang uint32_t c, r, tb_size = 0; 1514*4418919fSjohnjiang 1515*4418919fSjohnjiang if (op->turbo_enc.code_block_mode) { 1516*4418919fSjohnjiang tb_size = op->turbo_enc.tb_params.k_neg; 1517*4418919fSjohnjiang } else { 1518*4418919fSjohnjiang c = op->turbo_enc.tb_params.c; 1519*4418919fSjohnjiang r = op->turbo_enc.tb_params.r; 1520*4418919fSjohnjiang for (i = 0; i < c-r; i++) 1521*4418919fSjohnjiang tb_size += (r < op->turbo_enc.tb_params.c_neg) ? 1522*4418919fSjohnjiang op->turbo_enc.tb_params.k_neg : 1523*4418919fSjohnjiang op->turbo_enc.tb_params.k_pos; 1524*4418919fSjohnjiang } 1525*4418919fSjohnjiang return tb_size; 1526*4418919fSjohnjiang } 1527*4418919fSjohnjiang 1528*4418919fSjohnjiang static uint32_t 1529*4418919fSjohnjiang calc_ldpc_enc_TB_size(struct rte_bbdev_enc_op *op) 1530*4418919fSjohnjiang { 1531*4418919fSjohnjiang uint8_t i; 1532*4418919fSjohnjiang uint32_t c, r, tb_size = 0; 1533*4418919fSjohnjiang uint16_t sys_cols = (op->ldpc_enc.basegraph == 1) ? 22 : 10; 1534*4418919fSjohnjiang 1535*4418919fSjohnjiang if (op->turbo_enc.code_block_mode) { 1536*4418919fSjohnjiang tb_size = sys_cols * op->ldpc_enc.z_c - op->ldpc_enc.n_filler; 1537*4418919fSjohnjiang } else { 1538*4418919fSjohnjiang c = op->turbo_enc.tb_params.c; 1539*4418919fSjohnjiang r = op->turbo_enc.tb_params.r; 1540*4418919fSjohnjiang for (i = 0; i < c-r; i++) 1541*4418919fSjohnjiang tb_size += sys_cols * op->ldpc_enc.z_c 1542*4418919fSjohnjiang - op->ldpc_enc.n_filler; 1543*4418919fSjohnjiang } 1544*4418919fSjohnjiang return tb_size; 1545*4418919fSjohnjiang } 1546*4418919fSjohnjiang 1547*4418919fSjohnjiang 1548d30ea906Sjfb8856606 static int 1549d30ea906Sjfb8856606 init_test_op_params(struct test_op_params *op_params, 1550d30ea906Sjfb8856606 enum rte_bbdev_op_type op_type, const int expected_status, 1551d30ea906Sjfb8856606 const int vector_mask, struct rte_mempool *ops_mp, 1552d30ea906Sjfb8856606 uint16_t burst_sz, uint16_t num_to_process, uint16_t num_lcores) 1553d30ea906Sjfb8856606 { 1554d30ea906Sjfb8856606 int ret = 0; 1555*4418919fSjohnjiang if (op_type == RTE_BBDEV_OP_TURBO_DEC || 1556*4418919fSjohnjiang op_type == RTE_BBDEV_OP_LDPC_DEC) 1557d30ea906Sjfb8856606 ret = rte_bbdev_dec_op_alloc_bulk(ops_mp, 1558d30ea906Sjfb8856606 &op_params->ref_dec_op, 1); 1559d30ea906Sjfb8856606 else 1560d30ea906Sjfb8856606 ret = rte_bbdev_enc_op_alloc_bulk(ops_mp, 1561d30ea906Sjfb8856606 &op_params->ref_enc_op, 1); 1562d30ea906Sjfb8856606 1563d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(ret, "rte_bbdev_op_alloc_bulk() failed"); 1564d30ea906Sjfb8856606 1565d30ea906Sjfb8856606 op_params->mp = ops_mp; 1566d30ea906Sjfb8856606 op_params->burst_sz = burst_sz; 1567d30ea906Sjfb8856606 op_params->num_to_process = num_to_process; 1568d30ea906Sjfb8856606 op_params->num_lcores = num_lcores; 1569d30ea906Sjfb8856606 op_params->vector_mask = vector_mask; 1570*4418919fSjohnjiang if (op_type == RTE_BBDEV_OP_TURBO_DEC || 1571*4418919fSjohnjiang op_type == RTE_BBDEV_OP_LDPC_DEC) 1572d30ea906Sjfb8856606 op_params->ref_dec_op->status = expected_status; 1573*4418919fSjohnjiang else if (op_type == RTE_BBDEV_OP_TURBO_ENC 1574*4418919fSjohnjiang || op_type == RTE_BBDEV_OP_LDPC_ENC) 1575d30ea906Sjfb8856606 op_params->ref_enc_op->status = expected_status; 1576d30ea906Sjfb8856606 return 0; 1577d30ea906Sjfb8856606 } 1578d30ea906Sjfb8856606 1579d30ea906Sjfb8856606 static int 1580d30ea906Sjfb8856606 run_test_case_on_device(test_case_function *test_case_func, uint8_t dev_id, 1581d30ea906Sjfb8856606 struct test_op_params *op_params) 1582d30ea906Sjfb8856606 { 1583d30ea906Sjfb8856606 int t_ret, f_ret, socket_id = SOCKET_ID_ANY; 1584d30ea906Sjfb8856606 unsigned int i; 1585d30ea906Sjfb8856606 struct active_device *ad; 1586d30ea906Sjfb8856606 unsigned int burst_sz = get_burst_sz(); 1587d30ea906Sjfb8856606 enum rte_bbdev_op_type op_type = test_vector.op_type; 1588d30ea906Sjfb8856606 const struct rte_bbdev_op_cap *capabilities = NULL; 1589d30ea906Sjfb8856606 1590d30ea906Sjfb8856606 ad = &active_devs[dev_id]; 1591d30ea906Sjfb8856606 1592d30ea906Sjfb8856606 /* Check if device supports op_type */ 1593d30ea906Sjfb8856606 if (!is_avail_op(ad, test_vector.op_type)) 1594d30ea906Sjfb8856606 return TEST_SUCCESS; 1595d30ea906Sjfb8856606 1596d30ea906Sjfb8856606 struct rte_bbdev_info info; 1597d30ea906Sjfb8856606 rte_bbdev_info_get(ad->dev_id, &info); 1598d30ea906Sjfb8856606 socket_id = GET_SOCKET(info.socket_id); 1599d30ea906Sjfb8856606 1600d30ea906Sjfb8856606 f_ret = create_mempools(ad, socket_id, op_type, 1601d30ea906Sjfb8856606 get_num_ops()); 1602d30ea906Sjfb8856606 if (f_ret != TEST_SUCCESS) { 1603d30ea906Sjfb8856606 printf("Couldn't create mempools"); 1604d30ea906Sjfb8856606 goto fail; 1605d30ea906Sjfb8856606 } 1606d30ea906Sjfb8856606 if (op_type == RTE_BBDEV_OP_NONE) 1607d30ea906Sjfb8856606 op_type = RTE_BBDEV_OP_TURBO_ENC; 1608d30ea906Sjfb8856606 1609d30ea906Sjfb8856606 f_ret = init_test_op_params(op_params, test_vector.op_type, 1610d30ea906Sjfb8856606 test_vector.expected_status, 1611d30ea906Sjfb8856606 test_vector.mask, 1612d30ea906Sjfb8856606 ad->ops_mempool, 1613d30ea906Sjfb8856606 burst_sz, 1614d30ea906Sjfb8856606 get_num_ops(), 1615d30ea906Sjfb8856606 get_num_lcores()); 1616d30ea906Sjfb8856606 if (f_ret != TEST_SUCCESS) { 1617d30ea906Sjfb8856606 printf("Couldn't init test op params"); 1618d30ea906Sjfb8856606 goto fail; 1619d30ea906Sjfb8856606 } 1620d30ea906Sjfb8856606 1621*4418919fSjohnjiang 1622*4418919fSjohnjiang /* Find capabilities */ 1623d30ea906Sjfb8856606 const struct rte_bbdev_op_cap *cap = info.drv.capabilities; 1624*4418919fSjohnjiang for (i = 0; i < RTE_BBDEV_OP_TYPE_COUNT; i++) { 1625*4418919fSjohnjiang if (cap->type == test_vector.op_type) { 1626d30ea906Sjfb8856606 capabilities = cap; 1627d30ea906Sjfb8856606 break; 1628d30ea906Sjfb8856606 } 1629*4418919fSjohnjiang cap++; 1630d30ea906Sjfb8856606 } 1631d30ea906Sjfb8856606 TEST_ASSERT_NOT_NULL(capabilities, 1632*4418919fSjohnjiang "Couldn't find capabilities"); 1633d30ea906Sjfb8856606 1634*4418919fSjohnjiang if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) { 1635d30ea906Sjfb8856606 create_reference_dec_op(op_params->ref_dec_op); 1636d30ea906Sjfb8856606 } else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) 1637d30ea906Sjfb8856606 create_reference_enc_op(op_params->ref_enc_op); 1638*4418919fSjohnjiang else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) 1639*4418919fSjohnjiang create_reference_ldpc_enc_op(op_params->ref_enc_op); 1640*4418919fSjohnjiang else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) 1641*4418919fSjohnjiang create_reference_ldpc_dec_op(op_params->ref_dec_op); 1642d30ea906Sjfb8856606 1643d30ea906Sjfb8856606 for (i = 0; i < ad->nb_queues; ++i) { 1644d30ea906Sjfb8856606 f_ret = fill_queue_buffers(op_params, 1645d30ea906Sjfb8856606 ad->in_mbuf_pool, 1646d30ea906Sjfb8856606 ad->hard_out_mbuf_pool, 1647d30ea906Sjfb8856606 ad->soft_out_mbuf_pool, 1648*4418919fSjohnjiang ad->harq_in_mbuf_pool, 1649*4418919fSjohnjiang ad->harq_out_mbuf_pool, 1650d30ea906Sjfb8856606 ad->queue_ids[i], 1651d30ea906Sjfb8856606 capabilities, 1652d30ea906Sjfb8856606 info.drv.min_alignment, 1653d30ea906Sjfb8856606 socket_id); 1654d30ea906Sjfb8856606 if (f_ret != TEST_SUCCESS) { 1655d30ea906Sjfb8856606 printf("Couldn't init queue buffers"); 1656d30ea906Sjfb8856606 goto fail; 1657d30ea906Sjfb8856606 } 1658d30ea906Sjfb8856606 } 1659d30ea906Sjfb8856606 1660d30ea906Sjfb8856606 /* Run test case function */ 1661d30ea906Sjfb8856606 t_ret = test_case_func(ad, op_params); 1662d30ea906Sjfb8856606 1663d30ea906Sjfb8856606 /* Free active device resources and return */ 1664d30ea906Sjfb8856606 free_buffers(ad, op_params); 1665d30ea906Sjfb8856606 return t_ret; 1666d30ea906Sjfb8856606 1667d30ea906Sjfb8856606 fail: 1668d30ea906Sjfb8856606 free_buffers(ad, op_params); 1669d30ea906Sjfb8856606 return TEST_FAILED; 1670d30ea906Sjfb8856606 } 1671d30ea906Sjfb8856606 1672d30ea906Sjfb8856606 /* Run given test function per active device per supported op type 1673d30ea906Sjfb8856606 * per burst size. 1674d30ea906Sjfb8856606 */ 1675d30ea906Sjfb8856606 static int 1676d30ea906Sjfb8856606 run_test_case(test_case_function *test_case_func) 1677d30ea906Sjfb8856606 { 1678d30ea906Sjfb8856606 int ret = 0; 1679d30ea906Sjfb8856606 uint8_t dev; 1680d30ea906Sjfb8856606 1681d30ea906Sjfb8856606 /* Alloc op_params */ 1682d30ea906Sjfb8856606 struct test_op_params *op_params = rte_zmalloc(NULL, 1683d30ea906Sjfb8856606 sizeof(struct test_op_params), RTE_CACHE_LINE_SIZE); 1684d30ea906Sjfb8856606 TEST_ASSERT_NOT_NULL(op_params, "Failed to alloc %zuB for op_params", 1685d30ea906Sjfb8856606 RTE_ALIGN(sizeof(struct test_op_params), 1686d30ea906Sjfb8856606 RTE_CACHE_LINE_SIZE)); 1687d30ea906Sjfb8856606 1688d30ea906Sjfb8856606 /* For each device run test case function */ 1689d30ea906Sjfb8856606 for (dev = 0; dev < nb_active_devs; ++dev) 1690d30ea906Sjfb8856606 ret |= run_test_case_on_device(test_case_func, dev, op_params); 1691d30ea906Sjfb8856606 1692d30ea906Sjfb8856606 rte_free(op_params); 1693d30ea906Sjfb8856606 1694d30ea906Sjfb8856606 return ret; 1695d30ea906Sjfb8856606 } 1696d30ea906Sjfb8856606 1697d30ea906Sjfb8856606 static void 1698d30ea906Sjfb8856606 dequeue_event_callback(uint16_t dev_id, 1699d30ea906Sjfb8856606 enum rte_bbdev_event_type event, void *cb_arg, 1700d30ea906Sjfb8856606 void *ret_param) 1701d30ea906Sjfb8856606 { 1702d30ea906Sjfb8856606 int ret; 1703d30ea906Sjfb8856606 uint16_t i; 1704d30ea906Sjfb8856606 uint64_t total_time; 1705*4418919fSjohnjiang uint16_t deq, burst_sz, num_ops; 1706*4418919fSjohnjiang uint16_t queue_id = *(uint16_t *) ret_param; 1707d30ea906Sjfb8856606 struct rte_bbdev_info info; 1708*4418919fSjohnjiang double tb_len_bits; 1709d30ea906Sjfb8856606 struct thread_params *tp = cb_arg; 1710d30ea906Sjfb8856606 1711d30ea906Sjfb8856606 /* Find matching thread params using queue_id */ 1712d30ea906Sjfb8856606 for (i = 0; i < MAX_QUEUES; ++i, ++tp) 1713d30ea906Sjfb8856606 if (tp->queue_id == queue_id) 1714d30ea906Sjfb8856606 break; 1715d30ea906Sjfb8856606 1716d30ea906Sjfb8856606 if (i == MAX_QUEUES) { 1717d30ea906Sjfb8856606 printf("%s: Queue_id from interrupt details was not found!\n", 1718d30ea906Sjfb8856606 __func__); 1719d30ea906Sjfb8856606 return; 1720d30ea906Sjfb8856606 } 1721d30ea906Sjfb8856606 1722d30ea906Sjfb8856606 if (unlikely(event != RTE_BBDEV_EVENT_DEQUEUE)) { 1723d30ea906Sjfb8856606 rte_atomic16_set(&tp->processing_status, TEST_FAILED); 1724d30ea906Sjfb8856606 printf( 1725d30ea906Sjfb8856606 "Dequeue interrupt handler called for incorrect event!\n"); 1726d30ea906Sjfb8856606 return; 1727d30ea906Sjfb8856606 } 1728d30ea906Sjfb8856606 1729*4418919fSjohnjiang burst_sz = rte_atomic16_read(&tp->burst_sz); 1730*4418919fSjohnjiang num_ops = tp->op_params->num_to_process; 1731d30ea906Sjfb8856606 1732*4418919fSjohnjiang if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC || 1733*4418919fSjohnjiang test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) 1734*4418919fSjohnjiang deq = rte_bbdev_dequeue_dec_ops(dev_id, queue_id, 1735*4418919fSjohnjiang &tp->dec_ops[ 1736*4418919fSjohnjiang rte_atomic16_read(&tp->nb_dequeued)], 1737d30ea906Sjfb8856606 burst_sz); 1738d30ea906Sjfb8856606 else 1739*4418919fSjohnjiang deq = rte_bbdev_dequeue_enc_ops(dev_id, queue_id, 1740*4418919fSjohnjiang &tp->enc_ops[ 1741*4418919fSjohnjiang rte_atomic16_read(&tp->nb_dequeued)], 1742d30ea906Sjfb8856606 burst_sz); 1743d30ea906Sjfb8856606 1744d30ea906Sjfb8856606 if (deq < burst_sz) { 1745d30ea906Sjfb8856606 printf( 1746d30ea906Sjfb8856606 "After receiving the interrupt all operations should be dequeued. Expected: %u, got: %u\n", 1747d30ea906Sjfb8856606 burst_sz, deq); 1748d30ea906Sjfb8856606 rte_atomic16_set(&tp->processing_status, TEST_FAILED); 1749d30ea906Sjfb8856606 return; 1750d30ea906Sjfb8856606 } 1751d30ea906Sjfb8856606 1752*4418919fSjohnjiang if (rte_atomic16_read(&tp->nb_dequeued) + deq < num_ops) { 1753d30ea906Sjfb8856606 rte_atomic16_add(&tp->nb_dequeued, deq); 1754d30ea906Sjfb8856606 return; 1755d30ea906Sjfb8856606 } 1756d30ea906Sjfb8856606 1757d30ea906Sjfb8856606 total_time = rte_rdtsc_precise() - tp->start_time; 1758d30ea906Sjfb8856606 1759d30ea906Sjfb8856606 rte_bbdev_info_get(dev_id, &info); 1760d30ea906Sjfb8856606 1761d30ea906Sjfb8856606 ret = TEST_SUCCESS; 1762*4418919fSjohnjiang 1763*4418919fSjohnjiang if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) { 1764*4418919fSjohnjiang struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; 1765*4418919fSjohnjiang ret = validate_dec_op(tp->dec_ops, num_ops, ref_op, 1766*4418919fSjohnjiang tp->op_params->vector_mask); 1767*4418919fSjohnjiang /* get the max of iter_count for all dequeued ops */ 1768*4418919fSjohnjiang for (i = 0; i < num_ops; ++i) 1769*4418919fSjohnjiang tp->iter_count = RTE_MAX( 1770*4418919fSjohnjiang tp->dec_ops[i]->turbo_dec.iter_count, 1771*4418919fSjohnjiang tp->iter_count); 1772*4418919fSjohnjiang rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq); 1773*4418919fSjohnjiang } else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) { 1774*4418919fSjohnjiang struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; 1775*4418919fSjohnjiang ret = validate_enc_op(tp->enc_ops, num_ops, ref_op); 1776*4418919fSjohnjiang rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq); 1777*4418919fSjohnjiang } else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) { 1778*4418919fSjohnjiang struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; 1779*4418919fSjohnjiang ret = validate_ldpc_enc_op(tp->enc_ops, num_ops, ref_op); 1780*4418919fSjohnjiang rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq); 1781*4418919fSjohnjiang } else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) { 1782*4418919fSjohnjiang struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; 1783*4418919fSjohnjiang ret = validate_ldpc_dec_op(tp->dec_ops, num_ops, ref_op, 1784*4418919fSjohnjiang tp->op_params->vector_mask); 1785*4418919fSjohnjiang rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq); 1786*4418919fSjohnjiang } 1787d30ea906Sjfb8856606 1788d30ea906Sjfb8856606 if (ret) { 1789d30ea906Sjfb8856606 printf("Buffers validation failed\n"); 1790d30ea906Sjfb8856606 rte_atomic16_set(&tp->processing_status, TEST_FAILED); 1791d30ea906Sjfb8856606 } 1792d30ea906Sjfb8856606 1793d30ea906Sjfb8856606 switch (test_vector.op_type) { 1794d30ea906Sjfb8856606 case RTE_BBDEV_OP_TURBO_DEC: 1795*4418919fSjohnjiang tb_len_bits = calc_dec_TB_size(tp->op_params->ref_dec_op); 1796d30ea906Sjfb8856606 break; 1797d30ea906Sjfb8856606 case RTE_BBDEV_OP_TURBO_ENC: 1798*4418919fSjohnjiang tb_len_bits = calc_enc_TB_size(tp->op_params->ref_enc_op); 1799*4418919fSjohnjiang break; 1800*4418919fSjohnjiang case RTE_BBDEV_OP_LDPC_DEC: 1801*4418919fSjohnjiang tb_len_bits = calc_ldpc_dec_TB_size(tp->op_params->ref_dec_op); 1802*4418919fSjohnjiang break; 1803*4418919fSjohnjiang case RTE_BBDEV_OP_LDPC_ENC: 1804*4418919fSjohnjiang tb_len_bits = calc_ldpc_enc_TB_size(tp->op_params->ref_enc_op); 1805d30ea906Sjfb8856606 break; 1806d30ea906Sjfb8856606 case RTE_BBDEV_OP_NONE: 1807*4418919fSjohnjiang tb_len_bits = 0.0; 1808d30ea906Sjfb8856606 break; 1809d30ea906Sjfb8856606 default: 1810d30ea906Sjfb8856606 printf("Unknown op type: %d\n", test_vector.op_type); 1811d30ea906Sjfb8856606 rte_atomic16_set(&tp->processing_status, TEST_FAILED); 1812d30ea906Sjfb8856606 return; 1813d30ea906Sjfb8856606 } 1814d30ea906Sjfb8856606 1815*4418919fSjohnjiang tp->ops_per_sec += ((double)num_ops) / 1816d30ea906Sjfb8856606 ((double)total_time / (double)rte_get_tsc_hz()); 1817*4418919fSjohnjiang tp->mbps += (((double)(num_ops * tb_len_bits)) / 1000000.0) / 1818d30ea906Sjfb8856606 ((double)total_time / (double)rte_get_tsc_hz()); 1819d30ea906Sjfb8856606 1820d30ea906Sjfb8856606 rte_atomic16_add(&tp->nb_dequeued, deq); 1821d30ea906Sjfb8856606 } 1822d30ea906Sjfb8856606 1823d30ea906Sjfb8856606 static int 1824d30ea906Sjfb8856606 throughput_intr_lcore_dec(void *arg) 1825d30ea906Sjfb8856606 { 1826d30ea906Sjfb8856606 struct thread_params *tp = arg; 1827d30ea906Sjfb8856606 unsigned int enqueued; 1828d30ea906Sjfb8856606 const uint16_t queue_id = tp->queue_id; 1829d30ea906Sjfb8856606 const uint16_t burst_sz = tp->op_params->burst_sz; 1830d30ea906Sjfb8856606 const uint16_t num_to_process = tp->op_params->num_to_process; 1831*4418919fSjohnjiang struct rte_bbdev_dec_op *ops[num_to_process]; 1832d30ea906Sjfb8856606 struct test_buffers *bufs = NULL; 1833d30ea906Sjfb8856606 struct rte_bbdev_info info; 1834*4418919fSjohnjiang int ret, i, j; 1835*4418919fSjohnjiang uint16_t num_to_enq, enq; 1836d30ea906Sjfb8856606 1837d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 1838d30ea906Sjfb8856606 "BURST_SIZE should be <= %u", MAX_BURST); 1839d30ea906Sjfb8856606 1840d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), 1841d30ea906Sjfb8856606 "Failed to enable interrupts for dev: %u, queue_id: %u", 1842d30ea906Sjfb8856606 tp->dev_id, queue_id); 1843d30ea906Sjfb8856606 1844d30ea906Sjfb8856606 rte_bbdev_info_get(tp->dev_id, &info); 1845*4418919fSjohnjiang 1846*4418919fSjohnjiang TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), 1847*4418919fSjohnjiang "NUM_OPS cannot exceed %u for this device", 1848*4418919fSjohnjiang info.drv.queue_size_lim); 1849*4418919fSjohnjiang 1850d30ea906Sjfb8856606 bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 1851d30ea906Sjfb8856606 1852d30ea906Sjfb8856606 rte_atomic16_clear(&tp->processing_status); 1853d30ea906Sjfb8856606 rte_atomic16_clear(&tp->nb_dequeued); 1854d30ea906Sjfb8856606 1855d30ea906Sjfb8856606 while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) 1856d30ea906Sjfb8856606 rte_pause(); 1857d30ea906Sjfb8856606 1858*4418919fSjohnjiang ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops, 1859*4418919fSjohnjiang num_to_process); 1860*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", 1861*4418919fSjohnjiang num_to_process); 1862*4418919fSjohnjiang if (test_vector.op_type != RTE_BBDEV_OP_NONE) 1863*4418919fSjohnjiang copy_reference_dec_op(ops, num_to_process, 0, bufs->inputs, 1864*4418919fSjohnjiang bufs->hard_outputs, bufs->soft_outputs, 1865*4418919fSjohnjiang tp->op_params->ref_dec_op); 1866*4418919fSjohnjiang 1867*4418919fSjohnjiang /* Set counter to validate the ordering */ 1868*4418919fSjohnjiang for (j = 0; j < num_to_process; ++j) 1869*4418919fSjohnjiang ops[j]->opaque_data = (void *)(uintptr_t)j; 1870*4418919fSjohnjiang 1871*4418919fSjohnjiang for (j = 0; j < TEST_REPETITIONS; ++j) { 1872*4418919fSjohnjiang for (i = 0; i < num_to_process; ++i) 1873*4418919fSjohnjiang rte_pktmbuf_reset(ops[i]->turbo_dec.hard_output.data); 1874*4418919fSjohnjiang 1875d30ea906Sjfb8856606 tp->start_time = rte_rdtsc_precise(); 1876d30ea906Sjfb8856606 for (enqueued = 0; enqueued < num_to_process;) { 1877*4418919fSjohnjiang num_to_enq = burst_sz; 1878d30ea906Sjfb8856606 1879d30ea906Sjfb8856606 if (unlikely(num_to_process - enqueued < num_to_enq)) 1880d30ea906Sjfb8856606 num_to_enq = num_to_process - enqueued; 1881d30ea906Sjfb8856606 1882*4418919fSjohnjiang enq = 0; 1883*4418919fSjohnjiang do { 1884*4418919fSjohnjiang enq += rte_bbdev_enqueue_dec_ops(tp->dev_id, 1885*4418919fSjohnjiang queue_id, &ops[enqueued], 1886d30ea906Sjfb8856606 num_to_enq); 1887*4418919fSjohnjiang } while (unlikely(num_to_enq != enq)); 1888*4418919fSjohnjiang enqueued += enq; 1889*4418919fSjohnjiang 1890*4418919fSjohnjiang /* Write to thread burst_sz current number of enqueued 1891*4418919fSjohnjiang * descriptors. It ensures that proper number of 1892*4418919fSjohnjiang * descriptors will be dequeued in callback 1893*4418919fSjohnjiang * function - needed for last batch in case where 1894*4418919fSjohnjiang * the number of operations is not a multiple of 1895*4418919fSjohnjiang * burst size. 1896*4418919fSjohnjiang */ 1897*4418919fSjohnjiang rte_atomic16_set(&tp->burst_sz, num_to_enq); 1898*4418919fSjohnjiang 1899*4418919fSjohnjiang /* Wait until processing of previous batch is 1900*4418919fSjohnjiang * completed 1901*4418919fSjohnjiang */ 1902*4418919fSjohnjiang while (rte_atomic16_read(&tp->nb_dequeued) != 1903*4418919fSjohnjiang (int16_t) enqueued) 1904*4418919fSjohnjiang rte_pause(); 1905d30ea906Sjfb8856606 } 1906*4418919fSjohnjiang if (j != TEST_REPETITIONS - 1) 1907*4418919fSjohnjiang rte_atomic16_clear(&tp->nb_dequeued); 1908d30ea906Sjfb8856606 } 1909d30ea906Sjfb8856606 1910d30ea906Sjfb8856606 return TEST_SUCCESS; 1911d30ea906Sjfb8856606 } 1912d30ea906Sjfb8856606 1913d30ea906Sjfb8856606 static int 1914d30ea906Sjfb8856606 throughput_intr_lcore_enc(void *arg) 1915d30ea906Sjfb8856606 { 1916d30ea906Sjfb8856606 struct thread_params *tp = arg; 1917d30ea906Sjfb8856606 unsigned int enqueued; 1918d30ea906Sjfb8856606 const uint16_t queue_id = tp->queue_id; 1919d30ea906Sjfb8856606 const uint16_t burst_sz = tp->op_params->burst_sz; 1920d30ea906Sjfb8856606 const uint16_t num_to_process = tp->op_params->num_to_process; 1921*4418919fSjohnjiang struct rte_bbdev_enc_op *ops[num_to_process]; 1922d30ea906Sjfb8856606 struct test_buffers *bufs = NULL; 1923d30ea906Sjfb8856606 struct rte_bbdev_info info; 1924*4418919fSjohnjiang int ret, i, j; 1925*4418919fSjohnjiang uint16_t num_to_enq, enq; 1926d30ea906Sjfb8856606 1927d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 1928d30ea906Sjfb8856606 "BURST_SIZE should be <= %u", MAX_BURST); 1929d30ea906Sjfb8856606 1930d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), 1931d30ea906Sjfb8856606 "Failed to enable interrupts for dev: %u, queue_id: %u", 1932d30ea906Sjfb8856606 tp->dev_id, queue_id); 1933d30ea906Sjfb8856606 1934d30ea906Sjfb8856606 rte_bbdev_info_get(tp->dev_id, &info); 1935*4418919fSjohnjiang 1936*4418919fSjohnjiang TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), 1937*4418919fSjohnjiang "NUM_OPS cannot exceed %u for this device", 1938*4418919fSjohnjiang info.drv.queue_size_lim); 1939*4418919fSjohnjiang 1940d30ea906Sjfb8856606 bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 1941d30ea906Sjfb8856606 1942d30ea906Sjfb8856606 rte_atomic16_clear(&tp->processing_status); 1943d30ea906Sjfb8856606 rte_atomic16_clear(&tp->nb_dequeued); 1944d30ea906Sjfb8856606 1945d30ea906Sjfb8856606 while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) 1946d30ea906Sjfb8856606 rte_pause(); 1947d30ea906Sjfb8856606 1948*4418919fSjohnjiang ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops, 1949*4418919fSjohnjiang num_to_process); 1950*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", 1951*4418919fSjohnjiang num_to_process); 1952*4418919fSjohnjiang if (test_vector.op_type != RTE_BBDEV_OP_NONE) 1953*4418919fSjohnjiang copy_reference_enc_op(ops, num_to_process, 0, bufs->inputs, 1954*4418919fSjohnjiang bufs->hard_outputs, tp->op_params->ref_enc_op); 1955*4418919fSjohnjiang 1956*4418919fSjohnjiang /* Set counter to validate the ordering */ 1957*4418919fSjohnjiang for (j = 0; j < num_to_process; ++j) 1958*4418919fSjohnjiang ops[j]->opaque_data = (void *)(uintptr_t)j; 1959*4418919fSjohnjiang 1960*4418919fSjohnjiang for (j = 0; j < TEST_REPETITIONS; ++j) { 1961*4418919fSjohnjiang for (i = 0; i < num_to_process; ++i) 1962*4418919fSjohnjiang rte_pktmbuf_reset(ops[i]->turbo_enc.output.data); 1963*4418919fSjohnjiang 1964d30ea906Sjfb8856606 tp->start_time = rte_rdtsc_precise(); 1965d30ea906Sjfb8856606 for (enqueued = 0; enqueued < num_to_process;) { 1966*4418919fSjohnjiang num_to_enq = burst_sz; 1967d30ea906Sjfb8856606 1968d30ea906Sjfb8856606 if (unlikely(num_to_process - enqueued < num_to_enq)) 1969d30ea906Sjfb8856606 num_to_enq = num_to_process - enqueued; 1970d30ea906Sjfb8856606 1971*4418919fSjohnjiang enq = 0; 1972*4418919fSjohnjiang do { 1973*4418919fSjohnjiang enq += rte_bbdev_enqueue_enc_ops(tp->dev_id, 1974*4418919fSjohnjiang queue_id, &ops[enqueued], 1975d30ea906Sjfb8856606 num_to_enq); 1976*4418919fSjohnjiang } while (unlikely(enq != num_to_enq)); 1977*4418919fSjohnjiang enqueued += enq; 1978*4418919fSjohnjiang 1979*4418919fSjohnjiang /* Write to thread burst_sz current number of enqueued 1980*4418919fSjohnjiang * descriptors. It ensures that proper number of 1981*4418919fSjohnjiang * descriptors will be dequeued in callback 1982*4418919fSjohnjiang * function - needed for last batch in case where 1983*4418919fSjohnjiang * the number of operations is not a multiple of 1984*4418919fSjohnjiang * burst size. 1985*4418919fSjohnjiang */ 1986*4418919fSjohnjiang rte_atomic16_set(&tp->burst_sz, num_to_enq); 1987*4418919fSjohnjiang 1988*4418919fSjohnjiang /* Wait until processing of previous batch is 1989*4418919fSjohnjiang * completed 1990*4418919fSjohnjiang */ 1991*4418919fSjohnjiang while (rte_atomic16_read(&tp->nb_dequeued) != 1992*4418919fSjohnjiang (int16_t) enqueued) 1993*4418919fSjohnjiang rte_pause(); 1994d30ea906Sjfb8856606 } 1995*4418919fSjohnjiang if (j != TEST_REPETITIONS - 1) 1996*4418919fSjohnjiang rte_atomic16_clear(&tp->nb_dequeued); 1997d30ea906Sjfb8856606 } 1998d30ea906Sjfb8856606 1999d30ea906Sjfb8856606 return TEST_SUCCESS; 2000d30ea906Sjfb8856606 } 2001d30ea906Sjfb8856606 2002d30ea906Sjfb8856606 static int 2003d30ea906Sjfb8856606 throughput_pmd_lcore_dec(void *arg) 2004d30ea906Sjfb8856606 { 2005d30ea906Sjfb8856606 struct thread_params *tp = arg; 2006*4418919fSjohnjiang uint16_t enq, deq; 2007*4418919fSjohnjiang uint64_t total_time = 0, start_time; 2008d30ea906Sjfb8856606 const uint16_t queue_id = tp->queue_id; 2009d30ea906Sjfb8856606 const uint16_t burst_sz = tp->op_params->burst_sz; 2010*4418919fSjohnjiang const uint16_t num_ops = tp->op_params->num_to_process; 2011*4418919fSjohnjiang struct rte_bbdev_dec_op *ops_enq[num_ops]; 2012*4418919fSjohnjiang struct rte_bbdev_dec_op *ops_deq[num_ops]; 2013d30ea906Sjfb8856606 struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; 2014d30ea906Sjfb8856606 struct test_buffers *bufs = NULL; 2015*4418919fSjohnjiang int i, j, ret; 2016d30ea906Sjfb8856606 struct rte_bbdev_info info; 2017*4418919fSjohnjiang uint16_t num_to_enq; 2018d30ea906Sjfb8856606 2019d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 2020d30ea906Sjfb8856606 "BURST_SIZE should be <= %u", MAX_BURST); 2021d30ea906Sjfb8856606 2022d30ea906Sjfb8856606 rte_bbdev_info_get(tp->dev_id, &info); 2023*4418919fSjohnjiang 2024*4418919fSjohnjiang TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), 2025*4418919fSjohnjiang "NUM_OPS cannot exceed %u for this device", 2026*4418919fSjohnjiang info.drv.queue_size_lim); 2027*4418919fSjohnjiang 2028d30ea906Sjfb8856606 bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 2029d30ea906Sjfb8856606 2030d30ea906Sjfb8856606 while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) 2031d30ea906Sjfb8856606 rte_pause(); 2032d30ea906Sjfb8856606 2033*4418919fSjohnjiang ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); 2034*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); 2035d30ea906Sjfb8856606 2036d30ea906Sjfb8856606 if (test_vector.op_type != RTE_BBDEV_OP_NONE) 2037*4418919fSjohnjiang copy_reference_dec_op(ops_enq, num_ops, 0, bufs->inputs, 2038*4418919fSjohnjiang bufs->hard_outputs, bufs->soft_outputs, ref_op); 2039d30ea906Sjfb8856606 2040*4418919fSjohnjiang /* Set counter to validate the ordering */ 2041*4418919fSjohnjiang for (j = 0; j < num_ops; ++j) 2042*4418919fSjohnjiang ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 2043*4418919fSjohnjiang 2044*4418919fSjohnjiang for (i = 0; i < TEST_REPETITIONS; ++i) { 2045*4418919fSjohnjiang 2046*4418919fSjohnjiang for (j = 0; j < num_ops; ++j) 2047*4418919fSjohnjiang mbuf_reset(ops_enq[j]->turbo_dec.hard_output.data); 2048*4418919fSjohnjiang 2049*4418919fSjohnjiang start_time = rte_rdtsc_precise(); 2050*4418919fSjohnjiang 2051*4418919fSjohnjiang for (enq = 0, deq = 0; enq < num_ops;) { 2052*4418919fSjohnjiang num_to_enq = burst_sz; 2053*4418919fSjohnjiang 2054*4418919fSjohnjiang if (unlikely(num_ops - enq < num_to_enq)) 2055*4418919fSjohnjiang num_to_enq = num_ops - enq; 2056*4418919fSjohnjiang 2057*4418919fSjohnjiang enq += rte_bbdev_enqueue_dec_ops(tp->dev_id, 2058*4418919fSjohnjiang queue_id, &ops_enq[enq], num_to_enq); 2059*4418919fSjohnjiang 2060*4418919fSjohnjiang deq += rte_bbdev_dequeue_dec_ops(tp->dev_id, 2061*4418919fSjohnjiang queue_id, &ops_deq[deq], enq - deq); 2062d30ea906Sjfb8856606 } 2063*4418919fSjohnjiang 2064*4418919fSjohnjiang /* dequeue the remaining */ 2065*4418919fSjohnjiang while (deq < enq) { 2066*4418919fSjohnjiang deq += rte_bbdev_dequeue_dec_ops(tp->dev_id, 2067*4418919fSjohnjiang queue_id, &ops_deq[deq], enq - deq); 2068d30ea906Sjfb8856606 } 2069d30ea906Sjfb8856606 2070*4418919fSjohnjiang total_time += rte_rdtsc_precise() - start_time; 2071*4418919fSjohnjiang } 2072d30ea906Sjfb8856606 2073*4418919fSjohnjiang tp->iter_count = 0; 2074*4418919fSjohnjiang /* get the max of iter_count for all dequeued ops */ 2075*4418919fSjohnjiang for (i = 0; i < num_ops; ++i) { 2076*4418919fSjohnjiang tp->iter_count = RTE_MAX(ops_enq[i]->turbo_dec.iter_count, 2077*4418919fSjohnjiang tp->iter_count); 2078*4418919fSjohnjiang } 2079d30ea906Sjfb8856606 2080d30ea906Sjfb8856606 if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 2081*4418919fSjohnjiang ret = validate_dec_op(ops_deq, num_ops, ref_op, 2082*4418919fSjohnjiang tp->op_params->vector_mask); 2083*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 2084d30ea906Sjfb8856606 } 2085d30ea906Sjfb8856606 2086*4418919fSjohnjiang rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); 2087*4418919fSjohnjiang 2088*4418919fSjohnjiang double tb_len_bits = calc_dec_TB_size(ref_op); 2089*4418919fSjohnjiang 2090*4418919fSjohnjiang tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / 2091d30ea906Sjfb8856606 ((double)total_time / (double)rte_get_tsc_hz()); 2092*4418919fSjohnjiang tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) / 2093*4418919fSjohnjiang 1000000.0) / ((double)total_time / 2094*4418919fSjohnjiang (double)rte_get_tsc_hz()); 2095*4418919fSjohnjiang 2096*4418919fSjohnjiang return TEST_SUCCESS; 2097*4418919fSjohnjiang } 2098*4418919fSjohnjiang 2099*4418919fSjohnjiang static int 2100*4418919fSjohnjiang throughput_pmd_lcore_ldpc_dec(void *arg) 2101*4418919fSjohnjiang { 2102*4418919fSjohnjiang struct thread_params *tp = arg; 2103*4418919fSjohnjiang uint16_t enq, deq; 2104*4418919fSjohnjiang uint64_t total_time = 0, start_time; 2105*4418919fSjohnjiang const uint16_t queue_id = tp->queue_id; 2106*4418919fSjohnjiang const uint16_t burst_sz = tp->op_params->burst_sz; 2107*4418919fSjohnjiang const uint16_t num_ops = tp->op_params->num_to_process; 2108*4418919fSjohnjiang struct rte_bbdev_dec_op *ops_enq[num_ops]; 2109*4418919fSjohnjiang struct rte_bbdev_dec_op *ops_deq[num_ops]; 2110*4418919fSjohnjiang struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; 2111*4418919fSjohnjiang struct test_buffers *bufs = NULL; 2112*4418919fSjohnjiang int i, j, ret; 2113*4418919fSjohnjiang struct rte_bbdev_info info; 2114*4418919fSjohnjiang uint16_t num_to_enq; 2115*4418919fSjohnjiang 2116*4418919fSjohnjiang TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 2117*4418919fSjohnjiang "BURST_SIZE should be <= %u", MAX_BURST); 2118*4418919fSjohnjiang 2119*4418919fSjohnjiang rte_bbdev_info_get(tp->dev_id, &info); 2120*4418919fSjohnjiang 2121*4418919fSjohnjiang TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), 2122*4418919fSjohnjiang "NUM_OPS cannot exceed %u for this device", 2123*4418919fSjohnjiang info.drv.queue_size_lim); 2124*4418919fSjohnjiang 2125*4418919fSjohnjiang bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 2126*4418919fSjohnjiang 2127*4418919fSjohnjiang while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) 2128*4418919fSjohnjiang rte_pause(); 2129*4418919fSjohnjiang 2130*4418919fSjohnjiang ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); 2131*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); 2132*4418919fSjohnjiang 2133*4418919fSjohnjiang /* For throughput tests we need to disable early termination */ 2134*4418919fSjohnjiang if (check_bit(ref_op->ldpc_dec.op_flags, 2135*4418919fSjohnjiang RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE)) 2136*4418919fSjohnjiang ref_op->ldpc_dec.op_flags -= 2137*4418919fSjohnjiang RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; 2138*4418919fSjohnjiang ref_op->ldpc_dec.iter_max = 6; 2139*4418919fSjohnjiang ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; 2140*4418919fSjohnjiang 2141*4418919fSjohnjiang if (test_vector.op_type != RTE_BBDEV_OP_NONE) 2142*4418919fSjohnjiang copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, 2143*4418919fSjohnjiang bufs->hard_outputs, bufs->soft_outputs, 2144*4418919fSjohnjiang bufs->harq_inputs, bufs->harq_outputs, ref_op); 2145*4418919fSjohnjiang 2146*4418919fSjohnjiang /* Set counter to validate the ordering */ 2147*4418919fSjohnjiang for (j = 0; j < num_ops; ++j) 2148*4418919fSjohnjiang ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 2149*4418919fSjohnjiang 2150*4418919fSjohnjiang for (i = 0; i < TEST_REPETITIONS; ++i) { 2151*4418919fSjohnjiang for (j = 0; j < num_ops; ++j) { 2152*4418919fSjohnjiang mbuf_reset(ops_enq[j]->ldpc_dec.hard_output.data); 2153*4418919fSjohnjiang if (check_bit(ref_op->ldpc_dec.op_flags, 2154*4418919fSjohnjiang RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE)) 2155*4418919fSjohnjiang mbuf_reset( 2156*4418919fSjohnjiang ops_enq[j]->ldpc_dec.harq_combined_output.data); 2157*4418919fSjohnjiang } 2158*4418919fSjohnjiang 2159*4418919fSjohnjiang start_time = rte_rdtsc_precise(); 2160*4418919fSjohnjiang 2161*4418919fSjohnjiang for (enq = 0, deq = 0; enq < num_ops;) { 2162*4418919fSjohnjiang num_to_enq = burst_sz; 2163*4418919fSjohnjiang 2164*4418919fSjohnjiang if (unlikely(num_ops - enq < num_to_enq)) 2165*4418919fSjohnjiang num_to_enq = num_ops - enq; 2166*4418919fSjohnjiang 2167*4418919fSjohnjiang enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id, 2168*4418919fSjohnjiang queue_id, &ops_enq[enq], num_to_enq); 2169*4418919fSjohnjiang 2170*4418919fSjohnjiang deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, 2171*4418919fSjohnjiang queue_id, &ops_deq[deq], enq - deq); 2172*4418919fSjohnjiang } 2173*4418919fSjohnjiang 2174*4418919fSjohnjiang /* dequeue the remaining */ 2175*4418919fSjohnjiang while (deq < enq) { 2176*4418919fSjohnjiang deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, 2177*4418919fSjohnjiang queue_id, &ops_deq[deq], enq - deq); 2178*4418919fSjohnjiang } 2179*4418919fSjohnjiang 2180*4418919fSjohnjiang total_time += rte_rdtsc_precise() - start_time; 2181*4418919fSjohnjiang } 2182*4418919fSjohnjiang 2183*4418919fSjohnjiang tp->iter_count = 0; 2184*4418919fSjohnjiang /* get the max of iter_count for all dequeued ops */ 2185*4418919fSjohnjiang for (i = 0; i < num_ops; ++i) { 2186*4418919fSjohnjiang tp->iter_count = RTE_MAX(ops_enq[i]->ldpc_dec.iter_count, 2187*4418919fSjohnjiang tp->iter_count); 2188*4418919fSjohnjiang } 2189*4418919fSjohnjiang 2190*4418919fSjohnjiang if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 2191*4418919fSjohnjiang ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op, 2192*4418919fSjohnjiang tp->op_params->vector_mask); 2193*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 2194*4418919fSjohnjiang } 2195*4418919fSjohnjiang 2196*4418919fSjohnjiang rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); 2197*4418919fSjohnjiang 2198*4418919fSjohnjiang double tb_len_bits = calc_ldpc_dec_TB_size(ref_op); 2199*4418919fSjohnjiang 2200*4418919fSjohnjiang tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / 2201d30ea906Sjfb8856606 ((double)total_time / (double)rte_get_tsc_hz()); 2202*4418919fSjohnjiang tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) / 2203*4418919fSjohnjiang 1000000.0) / ((double)total_time / 2204*4418919fSjohnjiang (double)rte_get_tsc_hz()); 2205d30ea906Sjfb8856606 2206d30ea906Sjfb8856606 return TEST_SUCCESS; 2207d30ea906Sjfb8856606 } 2208d30ea906Sjfb8856606 2209d30ea906Sjfb8856606 static int 2210d30ea906Sjfb8856606 throughput_pmd_lcore_enc(void *arg) 2211d30ea906Sjfb8856606 { 2212d30ea906Sjfb8856606 struct thread_params *tp = arg; 2213*4418919fSjohnjiang uint16_t enq, deq; 2214*4418919fSjohnjiang uint64_t total_time = 0, start_time; 2215d30ea906Sjfb8856606 const uint16_t queue_id = tp->queue_id; 2216d30ea906Sjfb8856606 const uint16_t burst_sz = tp->op_params->burst_sz; 2217*4418919fSjohnjiang const uint16_t num_ops = tp->op_params->num_to_process; 2218*4418919fSjohnjiang struct rte_bbdev_enc_op *ops_enq[num_ops]; 2219*4418919fSjohnjiang struct rte_bbdev_enc_op *ops_deq[num_ops]; 2220d30ea906Sjfb8856606 struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; 2221d30ea906Sjfb8856606 struct test_buffers *bufs = NULL; 2222*4418919fSjohnjiang int i, j, ret; 2223d30ea906Sjfb8856606 struct rte_bbdev_info info; 2224*4418919fSjohnjiang uint16_t num_to_enq; 2225d30ea906Sjfb8856606 2226d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 2227d30ea906Sjfb8856606 "BURST_SIZE should be <= %u", MAX_BURST); 2228d30ea906Sjfb8856606 2229d30ea906Sjfb8856606 rte_bbdev_info_get(tp->dev_id, &info); 2230*4418919fSjohnjiang 2231*4418919fSjohnjiang TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), 2232*4418919fSjohnjiang "NUM_OPS cannot exceed %u for this device", 2233*4418919fSjohnjiang info.drv.queue_size_lim); 2234*4418919fSjohnjiang 2235d30ea906Sjfb8856606 bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 2236d30ea906Sjfb8856606 2237d30ea906Sjfb8856606 while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) 2238d30ea906Sjfb8856606 rte_pause(); 2239d30ea906Sjfb8856606 2240*4418919fSjohnjiang ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq, 2241*4418919fSjohnjiang num_ops); 2242*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", 2243*4418919fSjohnjiang num_ops); 2244*4418919fSjohnjiang if (test_vector.op_type != RTE_BBDEV_OP_NONE) 2245*4418919fSjohnjiang copy_reference_enc_op(ops_enq, num_ops, 0, bufs->inputs, 2246*4418919fSjohnjiang bufs->hard_outputs, ref_op); 2247d30ea906Sjfb8856606 2248*4418919fSjohnjiang /* Set counter to validate the ordering */ 2249*4418919fSjohnjiang for (j = 0; j < num_ops; ++j) 2250*4418919fSjohnjiang ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 2251d30ea906Sjfb8856606 2252*4418919fSjohnjiang for (i = 0; i < TEST_REPETITIONS; ++i) { 2253d30ea906Sjfb8856606 2254d30ea906Sjfb8856606 if (test_vector.op_type != RTE_BBDEV_OP_NONE) 2255*4418919fSjohnjiang for (j = 0; j < num_ops; ++j) 2256*4418919fSjohnjiang mbuf_reset(ops_enq[j]->turbo_enc.output.data); 2257d30ea906Sjfb8856606 2258*4418919fSjohnjiang start_time = rte_rdtsc_precise(); 2259*4418919fSjohnjiang 2260*4418919fSjohnjiang for (enq = 0, deq = 0; enq < num_ops;) { 2261*4418919fSjohnjiang num_to_enq = burst_sz; 2262*4418919fSjohnjiang 2263*4418919fSjohnjiang if (unlikely(num_ops - enq < num_to_enq)) 2264*4418919fSjohnjiang num_to_enq = num_ops - enq; 2265*4418919fSjohnjiang 2266*4418919fSjohnjiang enq += rte_bbdev_enqueue_enc_ops(tp->dev_id, 2267*4418919fSjohnjiang queue_id, &ops_enq[enq], num_to_enq); 2268*4418919fSjohnjiang 2269*4418919fSjohnjiang deq += rte_bbdev_dequeue_enc_ops(tp->dev_id, 2270*4418919fSjohnjiang queue_id, &ops_deq[deq], enq - deq); 2271d30ea906Sjfb8856606 } 2272*4418919fSjohnjiang 2273*4418919fSjohnjiang /* dequeue the remaining */ 2274*4418919fSjohnjiang while (deq < enq) { 2275*4418919fSjohnjiang deq += rte_bbdev_dequeue_enc_ops(tp->dev_id, 2276*4418919fSjohnjiang queue_id, &ops_deq[deq], enq - deq); 2277d30ea906Sjfb8856606 } 2278d30ea906Sjfb8856606 2279*4418919fSjohnjiang total_time += rte_rdtsc_precise() - start_time; 2280*4418919fSjohnjiang } 2281d30ea906Sjfb8856606 2282d30ea906Sjfb8856606 if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 2283*4418919fSjohnjiang ret = validate_enc_op(ops_deq, num_ops, ref_op); 2284*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 2285d30ea906Sjfb8856606 } 2286d30ea906Sjfb8856606 2287*4418919fSjohnjiang rte_bbdev_enc_op_free_bulk(ops_enq, num_ops); 2288d30ea906Sjfb8856606 2289*4418919fSjohnjiang double tb_len_bits = calc_enc_TB_size(ref_op); 2290*4418919fSjohnjiang 2291*4418919fSjohnjiang tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / 2292d30ea906Sjfb8856606 ((double)total_time / (double)rte_get_tsc_hz()); 2293*4418919fSjohnjiang tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) 2294*4418919fSjohnjiang / 1000000.0) / ((double)total_time / 2295*4418919fSjohnjiang (double)rte_get_tsc_hz()); 2296d30ea906Sjfb8856606 2297d30ea906Sjfb8856606 return TEST_SUCCESS; 2298d30ea906Sjfb8856606 } 2299*4418919fSjohnjiang 2300*4418919fSjohnjiang static int 2301*4418919fSjohnjiang throughput_pmd_lcore_ldpc_enc(void *arg) 2302d30ea906Sjfb8856606 { 2303*4418919fSjohnjiang struct thread_params *tp = arg; 2304*4418919fSjohnjiang uint16_t enq, deq; 2305*4418919fSjohnjiang uint64_t total_time = 0, start_time; 2306*4418919fSjohnjiang const uint16_t queue_id = tp->queue_id; 2307*4418919fSjohnjiang const uint16_t burst_sz = tp->op_params->burst_sz; 2308*4418919fSjohnjiang const uint16_t num_ops = tp->op_params->num_to_process; 2309*4418919fSjohnjiang struct rte_bbdev_enc_op *ops_enq[num_ops]; 2310*4418919fSjohnjiang struct rte_bbdev_enc_op *ops_deq[num_ops]; 2311*4418919fSjohnjiang struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; 2312*4418919fSjohnjiang struct test_buffers *bufs = NULL; 2313*4418919fSjohnjiang int i, j, ret; 2314*4418919fSjohnjiang struct rte_bbdev_info info; 2315*4418919fSjohnjiang uint16_t num_to_enq; 2316*4418919fSjohnjiang 2317*4418919fSjohnjiang TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 2318*4418919fSjohnjiang "BURST_SIZE should be <= %u", MAX_BURST); 2319*4418919fSjohnjiang 2320*4418919fSjohnjiang rte_bbdev_info_get(tp->dev_id, &info); 2321*4418919fSjohnjiang 2322*4418919fSjohnjiang TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), 2323*4418919fSjohnjiang "NUM_OPS cannot exceed %u for this device", 2324*4418919fSjohnjiang info.drv.queue_size_lim); 2325*4418919fSjohnjiang 2326*4418919fSjohnjiang bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 2327*4418919fSjohnjiang 2328*4418919fSjohnjiang while (rte_atomic16_read(&tp->op_params->sync) == SYNC_WAIT) 2329*4418919fSjohnjiang rte_pause(); 2330*4418919fSjohnjiang 2331*4418919fSjohnjiang ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq, 2332*4418919fSjohnjiang num_ops); 2333*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", 2334*4418919fSjohnjiang num_ops); 2335*4418919fSjohnjiang if (test_vector.op_type != RTE_BBDEV_OP_NONE) 2336*4418919fSjohnjiang copy_reference_ldpc_enc_op(ops_enq, num_ops, 0, bufs->inputs, 2337*4418919fSjohnjiang bufs->hard_outputs, ref_op); 2338*4418919fSjohnjiang 2339*4418919fSjohnjiang /* Set counter to validate the ordering */ 2340*4418919fSjohnjiang for (j = 0; j < num_ops; ++j) 2341*4418919fSjohnjiang ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 2342*4418919fSjohnjiang 2343*4418919fSjohnjiang for (i = 0; i < TEST_REPETITIONS; ++i) { 2344*4418919fSjohnjiang 2345*4418919fSjohnjiang if (test_vector.op_type != RTE_BBDEV_OP_NONE) 2346*4418919fSjohnjiang for (j = 0; j < num_ops; ++j) 2347*4418919fSjohnjiang mbuf_reset(ops_enq[j]->turbo_enc.output.data); 2348*4418919fSjohnjiang 2349*4418919fSjohnjiang start_time = rte_rdtsc_precise(); 2350*4418919fSjohnjiang 2351*4418919fSjohnjiang for (enq = 0, deq = 0; enq < num_ops;) { 2352*4418919fSjohnjiang num_to_enq = burst_sz; 2353*4418919fSjohnjiang 2354*4418919fSjohnjiang if (unlikely(num_ops - enq < num_to_enq)) 2355*4418919fSjohnjiang num_to_enq = num_ops - enq; 2356*4418919fSjohnjiang 2357*4418919fSjohnjiang enq += rte_bbdev_enqueue_ldpc_enc_ops(tp->dev_id, 2358*4418919fSjohnjiang queue_id, &ops_enq[enq], num_to_enq); 2359*4418919fSjohnjiang 2360*4418919fSjohnjiang deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id, 2361*4418919fSjohnjiang queue_id, &ops_deq[deq], enq - deq); 2362*4418919fSjohnjiang } 2363*4418919fSjohnjiang 2364*4418919fSjohnjiang /* dequeue the remaining */ 2365*4418919fSjohnjiang while (deq < enq) { 2366*4418919fSjohnjiang deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id, 2367*4418919fSjohnjiang queue_id, &ops_deq[deq], enq - deq); 2368*4418919fSjohnjiang } 2369*4418919fSjohnjiang 2370*4418919fSjohnjiang total_time += rte_rdtsc_precise() - start_time; 2371*4418919fSjohnjiang } 2372*4418919fSjohnjiang 2373*4418919fSjohnjiang if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 2374*4418919fSjohnjiang ret = validate_ldpc_enc_op(ops_deq, num_ops, ref_op); 2375*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 2376*4418919fSjohnjiang } 2377*4418919fSjohnjiang 2378*4418919fSjohnjiang rte_bbdev_enc_op_free_bulk(ops_enq, num_ops); 2379*4418919fSjohnjiang 2380*4418919fSjohnjiang double tb_len_bits = calc_ldpc_enc_TB_size(ref_op); 2381*4418919fSjohnjiang 2382*4418919fSjohnjiang tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / 2383*4418919fSjohnjiang ((double)total_time / (double)rte_get_tsc_hz()); 2384*4418919fSjohnjiang tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) 2385*4418919fSjohnjiang / 1000000.0) / ((double)total_time / 2386*4418919fSjohnjiang (double)rte_get_tsc_hz()); 2387*4418919fSjohnjiang 2388*4418919fSjohnjiang return TEST_SUCCESS; 2389*4418919fSjohnjiang } 2390*4418919fSjohnjiang 2391*4418919fSjohnjiang static void 2392*4418919fSjohnjiang print_enc_throughput(struct thread_params *t_params, unsigned int used_cores) 2393*4418919fSjohnjiang { 2394*4418919fSjohnjiang unsigned int iter = 0; 2395d30ea906Sjfb8856606 double total_mops = 0, total_mbps = 0; 2396d30ea906Sjfb8856606 2397*4418919fSjohnjiang for (iter = 0; iter < used_cores; iter++) { 2398*4418919fSjohnjiang printf( 2399*4418919fSjohnjiang "Throughput for core (%u): %.8lg Ops/s, %.8lg Mbps\n", 2400*4418919fSjohnjiang t_params[iter].lcore_id, t_params[iter].ops_per_sec, 2401*4418919fSjohnjiang t_params[iter].mbps); 2402*4418919fSjohnjiang total_mops += t_params[iter].ops_per_sec; 2403*4418919fSjohnjiang total_mbps += t_params[iter].mbps; 2404d30ea906Sjfb8856606 } 2405d30ea906Sjfb8856606 printf( 2406*4418919fSjohnjiang "\nTotal throughput for %u cores: %.8lg MOPS, %.8lg Mbps\n", 2407d30ea906Sjfb8856606 used_cores, total_mops, total_mbps); 2408d30ea906Sjfb8856606 } 2409d30ea906Sjfb8856606 2410*4418919fSjohnjiang static void 2411*4418919fSjohnjiang print_dec_throughput(struct thread_params *t_params, unsigned int used_cores) 2412*4418919fSjohnjiang { 2413*4418919fSjohnjiang unsigned int iter = 0; 2414*4418919fSjohnjiang double total_mops = 0, total_mbps = 0; 2415*4418919fSjohnjiang uint8_t iter_count = 0; 2416*4418919fSjohnjiang 2417*4418919fSjohnjiang for (iter = 0; iter < used_cores; iter++) { 2418*4418919fSjohnjiang printf( 2419*4418919fSjohnjiang "Throughput for core (%u): %.8lg Ops/s, %.8lg Mbps @ max %u iterations\n", 2420*4418919fSjohnjiang t_params[iter].lcore_id, t_params[iter].ops_per_sec, 2421*4418919fSjohnjiang t_params[iter].mbps, t_params[iter].iter_count); 2422*4418919fSjohnjiang total_mops += t_params[iter].ops_per_sec; 2423*4418919fSjohnjiang total_mbps += t_params[iter].mbps; 2424*4418919fSjohnjiang iter_count = RTE_MAX(iter_count, t_params[iter].iter_count); 2425*4418919fSjohnjiang } 2426*4418919fSjohnjiang printf( 2427*4418919fSjohnjiang "\nTotal throughput for %u cores: %.8lg MOPS, %.8lg Mbps @ max %u iterations\n", 2428*4418919fSjohnjiang used_cores, total_mops, total_mbps, iter_count); 2429*4418919fSjohnjiang } 2430*4418919fSjohnjiang 2431d30ea906Sjfb8856606 /* 2432d30ea906Sjfb8856606 * Test function that determines how long an enqueue + dequeue of a burst 2433d30ea906Sjfb8856606 * takes on available lcores. 2434d30ea906Sjfb8856606 */ 2435d30ea906Sjfb8856606 static int 2436d30ea906Sjfb8856606 throughput_test(struct active_device *ad, 2437d30ea906Sjfb8856606 struct test_op_params *op_params) 2438d30ea906Sjfb8856606 { 2439d30ea906Sjfb8856606 int ret; 2440d30ea906Sjfb8856606 unsigned int lcore_id, used_cores = 0; 2441*4418919fSjohnjiang struct thread_params *t_params, *tp; 2442d30ea906Sjfb8856606 struct rte_bbdev_info info; 2443d30ea906Sjfb8856606 lcore_function_t *throughput_function; 2444d30ea906Sjfb8856606 uint16_t num_lcores; 2445d30ea906Sjfb8856606 const char *op_type_str; 2446d30ea906Sjfb8856606 2447d30ea906Sjfb8856606 rte_bbdev_info_get(ad->dev_id, &info); 2448d30ea906Sjfb8856606 2449d30ea906Sjfb8856606 op_type_str = rte_bbdev_op_type_str(test_vector.op_type); 2450d30ea906Sjfb8856606 TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", 2451d30ea906Sjfb8856606 test_vector.op_type); 2452d30ea906Sjfb8856606 2453*4418919fSjohnjiang printf("+ ------------------------------------------------------- +\n"); 2454*4418919fSjohnjiang printf("== test: throughput\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, op type: %s, itr mode: %s, GHz: %lg\n", 2455d30ea906Sjfb8856606 info.dev_name, ad->nb_queues, op_params->burst_sz, 2456d30ea906Sjfb8856606 op_params->num_to_process, op_params->num_lcores, 2457d30ea906Sjfb8856606 op_type_str, 2458d30ea906Sjfb8856606 intr_enabled ? "Interrupt mode" : "PMD mode", 2459d30ea906Sjfb8856606 (double)rte_get_tsc_hz() / 1000000000.0); 2460d30ea906Sjfb8856606 2461d30ea906Sjfb8856606 /* Set number of lcores */ 2462d30ea906Sjfb8856606 num_lcores = (ad->nb_queues < (op_params->num_lcores)) 2463d30ea906Sjfb8856606 ? ad->nb_queues 2464d30ea906Sjfb8856606 : op_params->num_lcores; 2465d30ea906Sjfb8856606 2466*4418919fSjohnjiang /* Allocate memory for thread parameters structure */ 2467*4418919fSjohnjiang t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), 2468*4418919fSjohnjiang RTE_CACHE_LINE_SIZE); 2469*4418919fSjohnjiang TEST_ASSERT_NOT_NULL(t_params, "Failed to alloc %zuB for t_params", 2470*4418919fSjohnjiang RTE_ALIGN(sizeof(struct thread_params) * num_lcores, 2471*4418919fSjohnjiang RTE_CACHE_LINE_SIZE)); 2472*4418919fSjohnjiang 2473d30ea906Sjfb8856606 if (intr_enabled) { 2474d30ea906Sjfb8856606 if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) 2475d30ea906Sjfb8856606 throughput_function = throughput_intr_lcore_dec; 2476*4418919fSjohnjiang else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) 2477*4418919fSjohnjiang throughput_function = throughput_intr_lcore_dec; 2478*4418919fSjohnjiang else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) 2479*4418919fSjohnjiang throughput_function = throughput_intr_lcore_enc; 2480*4418919fSjohnjiang else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) 2481*4418919fSjohnjiang throughput_function = throughput_intr_lcore_enc; 2482d30ea906Sjfb8856606 else 2483d30ea906Sjfb8856606 throughput_function = throughput_intr_lcore_enc; 2484d30ea906Sjfb8856606 2485d30ea906Sjfb8856606 /* Dequeue interrupt callback registration */ 2486d30ea906Sjfb8856606 ret = rte_bbdev_callback_register(ad->dev_id, 2487d30ea906Sjfb8856606 RTE_BBDEV_EVENT_DEQUEUE, dequeue_event_callback, 2488*4418919fSjohnjiang t_params); 2489*4418919fSjohnjiang if (ret < 0) { 2490*4418919fSjohnjiang rte_free(t_params); 2491d30ea906Sjfb8856606 return ret; 2492*4418919fSjohnjiang } 2493d30ea906Sjfb8856606 } else { 2494d30ea906Sjfb8856606 if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) 2495d30ea906Sjfb8856606 throughput_function = throughput_pmd_lcore_dec; 2496*4418919fSjohnjiang else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) 2497*4418919fSjohnjiang throughput_function = throughput_pmd_lcore_ldpc_dec; 2498*4418919fSjohnjiang else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) 2499*4418919fSjohnjiang throughput_function = throughput_pmd_lcore_enc; 2500*4418919fSjohnjiang else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) 2501*4418919fSjohnjiang throughput_function = throughput_pmd_lcore_ldpc_enc; 2502d30ea906Sjfb8856606 else 2503d30ea906Sjfb8856606 throughput_function = throughput_pmd_lcore_enc; 2504d30ea906Sjfb8856606 } 2505d30ea906Sjfb8856606 2506d30ea906Sjfb8856606 rte_atomic16_set(&op_params->sync, SYNC_WAIT); 2507d30ea906Sjfb8856606 2508*4418919fSjohnjiang /* Master core is set at first entry */ 2509*4418919fSjohnjiang t_params[0].dev_id = ad->dev_id; 2510*4418919fSjohnjiang t_params[0].lcore_id = rte_lcore_id(); 2511*4418919fSjohnjiang t_params[0].op_params = op_params; 2512*4418919fSjohnjiang t_params[0].queue_id = ad->queue_ids[used_cores++]; 2513*4418919fSjohnjiang t_params[0].iter_count = 0; 2514d30ea906Sjfb8856606 2515d30ea906Sjfb8856606 RTE_LCORE_FOREACH_SLAVE(lcore_id) { 2516d30ea906Sjfb8856606 if (used_cores >= num_lcores) 2517d30ea906Sjfb8856606 break; 2518d30ea906Sjfb8856606 2519*4418919fSjohnjiang t_params[used_cores].dev_id = ad->dev_id; 2520*4418919fSjohnjiang t_params[used_cores].lcore_id = lcore_id; 2521*4418919fSjohnjiang t_params[used_cores].op_params = op_params; 2522*4418919fSjohnjiang t_params[used_cores].queue_id = ad->queue_ids[used_cores]; 2523*4418919fSjohnjiang t_params[used_cores].iter_count = 0; 2524d30ea906Sjfb8856606 2525*4418919fSjohnjiang rte_eal_remote_launch(throughput_function, 2526*4418919fSjohnjiang &t_params[used_cores++], lcore_id); 2527d30ea906Sjfb8856606 } 2528d30ea906Sjfb8856606 2529d30ea906Sjfb8856606 rte_atomic16_set(&op_params->sync, SYNC_START); 2530*4418919fSjohnjiang ret = throughput_function(&t_params[0]); 2531d30ea906Sjfb8856606 2532d30ea906Sjfb8856606 /* Master core is always used */ 2533*4418919fSjohnjiang for (used_cores = 1; used_cores < num_lcores; used_cores++) 2534*4418919fSjohnjiang ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id); 2535d30ea906Sjfb8856606 2536d30ea906Sjfb8856606 /* Return if test failed */ 2537*4418919fSjohnjiang if (ret) { 2538*4418919fSjohnjiang rte_free(t_params); 2539d30ea906Sjfb8856606 return ret; 2540*4418919fSjohnjiang } 2541d30ea906Sjfb8856606 2542d30ea906Sjfb8856606 /* Print throughput if interrupts are disabled and test passed */ 2543d30ea906Sjfb8856606 if (!intr_enabled) { 2544*4418919fSjohnjiang if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC || 2545*4418919fSjohnjiang test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) 2546*4418919fSjohnjiang print_dec_throughput(t_params, num_lcores); 2547*4418919fSjohnjiang else 2548*4418919fSjohnjiang print_enc_throughput(t_params, num_lcores); 2549*4418919fSjohnjiang rte_free(t_params); 2550d30ea906Sjfb8856606 return ret; 2551d30ea906Sjfb8856606 } 2552d30ea906Sjfb8856606 2553d30ea906Sjfb8856606 /* In interrupt TC we need to wait for the interrupt callback to deqeue 2554d30ea906Sjfb8856606 * all pending operations. Skip waiting for queues which reported an 2555d30ea906Sjfb8856606 * error using processing_status variable. 2556d30ea906Sjfb8856606 * Wait for master lcore operations. 2557d30ea906Sjfb8856606 */ 2558*4418919fSjohnjiang tp = &t_params[0]; 2559d30ea906Sjfb8856606 while ((rte_atomic16_read(&tp->nb_dequeued) < 2560d30ea906Sjfb8856606 op_params->num_to_process) && 2561d30ea906Sjfb8856606 (rte_atomic16_read(&tp->processing_status) != 2562d30ea906Sjfb8856606 TEST_FAILED)) 2563d30ea906Sjfb8856606 rte_pause(); 2564d30ea906Sjfb8856606 2565*4418919fSjohnjiang tp->ops_per_sec /= TEST_REPETITIONS; 2566*4418919fSjohnjiang tp->mbps /= TEST_REPETITIONS; 2567*4418919fSjohnjiang ret |= (int)rte_atomic16_read(&tp->processing_status); 2568d30ea906Sjfb8856606 2569d30ea906Sjfb8856606 /* Wait for slave lcores operations */ 2570*4418919fSjohnjiang for (used_cores = 1; used_cores < num_lcores; used_cores++) { 2571*4418919fSjohnjiang tp = &t_params[used_cores]; 2572d30ea906Sjfb8856606 2573d30ea906Sjfb8856606 while ((rte_atomic16_read(&tp->nb_dequeued) < 2574d30ea906Sjfb8856606 op_params->num_to_process) && 2575d30ea906Sjfb8856606 (rte_atomic16_read(&tp->processing_status) != 2576d30ea906Sjfb8856606 TEST_FAILED)) 2577d30ea906Sjfb8856606 rte_pause(); 2578d30ea906Sjfb8856606 2579*4418919fSjohnjiang tp->ops_per_sec /= TEST_REPETITIONS; 2580*4418919fSjohnjiang tp->mbps /= TEST_REPETITIONS; 2581*4418919fSjohnjiang ret |= (int)rte_atomic16_read(&tp->processing_status); 2582d30ea906Sjfb8856606 } 2583d30ea906Sjfb8856606 2584d30ea906Sjfb8856606 /* Print throughput if test passed */ 2585*4418919fSjohnjiang if (!ret) { 2586*4418919fSjohnjiang if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC || 2587*4418919fSjohnjiang test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) 2588*4418919fSjohnjiang print_dec_throughput(t_params, num_lcores); 2589*4418919fSjohnjiang else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC || 2590*4418919fSjohnjiang test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) 2591*4418919fSjohnjiang print_enc_throughput(t_params, num_lcores); 2592*4418919fSjohnjiang } 2593d30ea906Sjfb8856606 2594*4418919fSjohnjiang rte_free(t_params); 2595d30ea906Sjfb8856606 return ret; 2596d30ea906Sjfb8856606 } 2597d30ea906Sjfb8856606 2598d30ea906Sjfb8856606 static int 2599d30ea906Sjfb8856606 latency_test_dec(struct rte_mempool *mempool, 2600d30ea906Sjfb8856606 struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op, 2601d30ea906Sjfb8856606 int vector_mask, uint16_t dev_id, uint16_t queue_id, 2602d30ea906Sjfb8856606 const uint16_t num_to_process, uint16_t burst_sz, 2603d30ea906Sjfb8856606 uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) 2604d30ea906Sjfb8856606 { 2605d30ea906Sjfb8856606 int ret = TEST_SUCCESS; 2606d30ea906Sjfb8856606 uint16_t i, j, dequeued; 2607d30ea906Sjfb8856606 struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 2608d30ea906Sjfb8856606 uint64_t start_time = 0, last_time = 0; 2609d30ea906Sjfb8856606 2610d30ea906Sjfb8856606 for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 2611d30ea906Sjfb8856606 uint16_t enq = 0, deq = 0; 2612d30ea906Sjfb8856606 bool first_time = true; 2613d30ea906Sjfb8856606 last_time = 0; 2614d30ea906Sjfb8856606 2615d30ea906Sjfb8856606 if (unlikely(num_to_process - dequeued < burst_sz)) 2616d30ea906Sjfb8856606 burst_sz = num_to_process - dequeued; 2617d30ea906Sjfb8856606 2618d30ea906Sjfb8856606 ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); 2619d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(ret, 2620d30ea906Sjfb8856606 "rte_bbdev_dec_op_alloc_bulk() failed"); 2621d30ea906Sjfb8856606 if (test_vector.op_type != RTE_BBDEV_OP_NONE) 2622d30ea906Sjfb8856606 copy_reference_dec_op(ops_enq, burst_sz, dequeued, 2623d30ea906Sjfb8856606 bufs->inputs, 2624d30ea906Sjfb8856606 bufs->hard_outputs, 2625d30ea906Sjfb8856606 bufs->soft_outputs, 2626d30ea906Sjfb8856606 ref_op); 2627d30ea906Sjfb8856606 2628d30ea906Sjfb8856606 /* Set counter to validate the ordering */ 2629d30ea906Sjfb8856606 for (j = 0; j < burst_sz; ++j) 2630d30ea906Sjfb8856606 ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 2631d30ea906Sjfb8856606 2632d30ea906Sjfb8856606 start_time = rte_rdtsc_precise(); 2633d30ea906Sjfb8856606 2634d30ea906Sjfb8856606 enq = rte_bbdev_enqueue_dec_ops(dev_id, queue_id, &ops_enq[enq], 2635d30ea906Sjfb8856606 burst_sz); 2636d30ea906Sjfb8856606 TEST_ASSERT(enq == burst_sz, 2637d30ea906Sjfb8856606 "Error enqueueing burst, expected %u, got %u", 2638d30ea906Sjfb8856606 burst_sz, enq); 2639d30ea906Sjfb8856606 2640d30ea906Sjfb8856606 /* Dequeue */ 2641d30ea906Sjfb8856606 do { 2642d30ea906Sjfb8856606 deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, 2643d30ea906Sjfb8856606 &ops_deq[deq], burst_sz - deq); 2644d30ea906Sjfb8856606 if (likely(first_time && (deq > 0))) { 2645d30ea906Sjfb8856606 last_time = rte_rdtsc_precise() - start_time; 2646d30ea906Sjfb8856606 first_time = false; 2647d30ea906Sjfb8856606 } 2648d30ea906Sjfb8856606 } while (unlikely(burst_sz != deq)); 2649d30ea906Sjfb8856606 2650d30ea906Sjfb8856606 *max_time = RTE_MAX(*max_time, last_time); 2651d30ea906Sjfb8856606 *min_time = RTE_MIN(*min_time, last_time); 2652d30ea906Sjfb8856606 *total_time += last_time; 2653d30ea906Sjfb8856606 2654d30ea906Sjfb8856606 if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 2655d30ea906Sjfb8856606 ret = validate_dec_op(ops_deq, burst_sz, ref_op, 2656d30ea906Sjfb8856606 vector_mask); 2657d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 2658d30ea906Sjfb8856606 } 2659d30ea906Sjfb8856606 2660d30ea906Sjfb8856606 rte_bbdev_dec_op_free_bulk(ops_enq, deq); 2661d30ea906Sjfb8856606 dequeued += deq; 2662d30ea906Sjfb8856606 } 2663d30ea906Sjfb8856606 2664d30ea906Sjfb8856606 return i; 2665d30ea906Sjfb8856606 } 2666d30ea906Sjfb8856606 2667d30ea906Sjfb8856606 static int 2668*4418919fSjohnjiang latency_test_ldpc_dec(struct rte_mempool *mempool, 2669*4418919fSjohnjiang struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op, 2670*4418919fSjohnjiang int vector_mask, uint16_t dev_id, uint16_t queue_id, 2671*4418919fSjohnjiang const uint16_t num_to_process, uint16_t burst_sz, 2672*4418919fSjohnjiang uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) 2673*4418919fSjohnjiang { 2674*4418919fSjohnjiang int ret = TEST_SUCCESS; 2675*4418919fSjohnjiang uint16_t i, j, dequeued; 2676*4418919fSjohnjiang struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 2677*4418919fSjohnjiang uint64_t start_time = 0, last_time = 0; 2678*4418919fSjohnjiang 2679*4418919fSjohnjiang for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 2680*4418919fSjohnjiang uint16_t enq = 0, deq = 0; 2681*4418919fSjohnjiang bool first_time = true; 2682*4418919fSjohnjiang last_time = 0; 2683*4418919fSjohnjiang 2684*4418919fSjohnjiang if (unlikely(num_to_process - dequeued < burst_sz)) 2685*4418919fSjohnjiang burst_sz = num_to_process - dequeued; 2686*4418919fSjohnjiang 2687*4418919fSjohnjiang ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); 2688*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, 2689*4418919fSjohnjiang "rte_bbdev_dec_op_alloc_bulk() failed"); 2690*4418919fSjohnjiang if (test_vector.op_type != RTE_BBDEV_OP_NONE) 2691*4418919fSjohnjiang copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued, 2692*4418919fSjohnjiang bufs->inputs, 2693*4418919fSjohnjiang bufs->hard_outputs, 2694*4418919fSjohnjiang bufs->soft_outputs, 2695*4418919fSjohnjiang bufs->harq_inputs, 2696*4418919fSjohnjiang bufs->harq_outputs, 2697*4418919fSjohnjiang ref_op); 2698*4418919fSjohnjiang 2699*4418919fSjohnjiang /* Set counter to validate the ordering */ 2700*4418919fSjohnjiang for (j = 0; j < burst_sz; ++j) 2701*4418919fSjohnjiang ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 2702*4418919fSjohnjiang 2703*4418919fSjohnjiang start_time = rte_rdtsc_precise(); 2704*4418919fSjohnjiang 2705*4418919fSjohnjiang enq = rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, 2706*4418919fSjohnjiang &ops_enq[enq], burst_sz); 2707*4418919fSjohnjiang TEST_ASSERT(enq == burst_sz, 2708*4418919fSjohnjiang "Error enqueueing burst, expected %u, got %u", 2709*4418919fSjohnjiang burst_sz, enq); 2710*4418919fSjohnjiang 2711*4418919fSjohnjiang /* Dequeue */ 2712*4418919fSjohnjiang do { 2713*4418919fSjohnjiang deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, 2714*4418919fSjohnjiang &ops_deq[deq], burst_sz - deq); 2715*4418919fSjohnjiang if (likely(first_time && (deq > 0))) { 2716*4418919fSjohnjiang last_time = rte_rdtsc_precise() - start_time; 2717*4418919fSjohnjiang first_time = false; 2718*4418919fSjohnjiang } 2719*4418919fSjohnjiang } while (unlikely(burst_sz != deq)); 2720*4418919fSjohnjiang 2721*4418919fSjohnjiang *max_time = RTE_MAX(*max_time, last_time); 2722*4418919fSjohnjiang *min_time = RTE_MIN(*min_time, last_time); 2723*4418919fSjohnjiang *total_time += last_time; 2724*4418919fSjohnjiang 2725*4418919fSjohnjiang if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 2726*4418919fSjohnjiang ret = validate_ldpc_dec_op(ops_deq, burst_sz, ref_op, 2727*4418919fSjohnjiang vector_mask); 2728*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 2729*4418919fSjohnjiang } 2730*4418919fSjohnjiang 2731*4418919fSjohnjiang rte_bbdev_dec_op_free_bulk(ops_enq, deq); 2732*4418919fSjohnjiang dequeued += deq; 2733*4418919fSjohnjiang } 2734*4418919fSjohnjiang 2735*4418919fSjohnjiang return i; 2736*4418919fSjohnjiang } 2737*4418919fSjohnjiang 2738*4418919fSjohnjiang static int 2739d30ea906Sjfb8856606 latency_test_enc(struct rte_mempool *mempool, 2740d30ea906Sjfb8856606 struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op, 2741d30ea906Sjfb8856606 uint16_t dev_id, uint16_t queue_id, 2742d30ea906Sjfb8856606 const uint16_t num_to_process, uint16_t burst_sz, 2743d30ea906Sjfb8856606 uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) 2744d30ea906Sjfb8856606 { 2745d30ea906Sjfb8856606 int ret = TEST_SUCCESS; 2746d30ea906Sjfb8856606 uint16_t i, j, dequeued; 2747d30ea906Sjfb8856606 struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 2748d30ea906Sjfb8856606 uint64_t start_time = 0, last_time = 0; 2749d30ea906Sjfb8856606 2750d30ea906Sjfb8856606 for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 2751d30ea906Sjfb8856606 uint16_t enq = 0, deq = 0; 2752d30ea906Sjfb8856606 bool first_time = true; 2753d30ea906Sjfb8856606 last_time = 0; 2754d30ea906Sjfb8856606 2755d30ea906Sjfb8856606 if (unlikely(num_to_process - dequeued < burst_sz)) 2756d30ea906Sjfb8856606 burst_sz = num_to_process - dequeued; 2757d30ea906Sjfb8856606 2758d30ea906Sjfb8856606 ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); 2759d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(ret, 2760d30ea906Sjfb8856606 "rte_bbdev_enc_op_alloc_bulk() failed"); 2761d30ea906Sjfb8856606 if (test_vector.op_type != RTE_BBDEV_OP_NONE) 2762d30ea906Sjfb8856606 copy_reference_enc_op(ops_enq, burst_sz, dequeued, 2763d30ea906Sjfb8856606 bufs->inputs, 2764d30ea906Sjfb8856606 bufs->hard_outputs, 2765d30ea906Sjfb8856606 ref_op); 2766d30ea906Sjfb8856606 2767d30ea906Sjfb8856606 /* Set counter to validate the ordering */ 2768d30ea906Sjfb8856606 for (j = 0; j < burst_sz; ++j) 2769d30ea906Sjfb8856606 ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 2770d30ea906Sjfb8856606 2771d30ea906Sjfb8856606 start_time = rte_rdtsc_precise(); 2772d30ea906Sjfb8856606 2773d30ea906Sjfb8856606 enq = rte_bbdev_enqueue_enc_ops(dev_id, queue_id, &ops_enq[enq], 2774d30ea906Sjfb8856606 burst_sz); 2775d30ea906Sjfb8856606 TEST_ASSERT(enq == burst_sz, 2776d30ea906Sjfb8856606 "Error enqueueing burst, expected %u, got %u", 2777d30ea906Sjfb8856606 burst_sz, enq); 2778d30ea906Sjfb8856606 2779d30ea906Sjfb8856606 /* Dequeue */ 2780d30ea906Sjfb8856606 do { 2781d30ea906Sjfb8856606 deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, 2782d30ea906Sjfb8856606 &ops_deq[deq], burst_sz - deq); 2783d30ea906Sjfb8856606 if (likely(first_time && (deq > 0))) { 2784d30ea906Sjfb8856606 last_time += rte_rdtsc_precise() - start_time; 2785d30ea906Sjfb8856606 first_time = false; 2786d30ea906Sjfb8856606 } 2787d30ea906Sjfb8856606 } while (unlikely(burst_sz != deq)); 2788d30ea906Sjfb8856606 2789d30ea906Sjfb8856606 *max_time = RTE_MAX(*max_time, last_time); 2790d30ea906Sjfb8856606 *min_time = RTE_MIN(*min_time, last_time); 2791d30ea906Sjfb8856606 *total_time += last_time; 2792d30ea906Sjfb8856606 2793d30ea906Sjfb8856606 if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 2794d30ea906Sjfb8856606 ret = validate_enc_op(ops_deq, burst_sz, ref_op); 2795d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 2796d30ea906Sjfb8856606 } 2797d30ea906Sjfb8856606 2798d30ea906Sjfb8856606 rte_bbdev_enc_op_free_bulk(ops_enq, deq); 2799d30ea906Sjfb8856606 dequeued += deq; 2800d30ea906Sjfb8856606 } 2801d30ea906Sjfb8856606 2802d30ea906Sjfb8856606 return i; 2803d30ea906Sjfb8856606 } 2804d30ea906Sjfb8856606 2805d30ea906Sjfb8856606 static int 2806*4418919fSjohnjiang latency_test_ldpc_enc(struct rte_mempool *mempool, 2807*4418919fSjohnjiang struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op, 2808*4418919fSjohnjiang uint16_t dev_id, uint16_t queue_id, 2809*4418919fSjohnjiang const uint16_t num_to_process, uint16_t burst_sz, 2810*4418919fSjohnjiang uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) 2811*4418919fSjohnjiang { 2812*4418919fSjohnjiang int ret = TEST_SUCCESS; 2813*4418919fSjohnjiang uint16_t i, j, dequeued; 2814*4418919fSjohnjiang struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 2815*4418919fSjohnjiang uint64_t start_time = 0, last_time = 0; 2816*4418919fSjohnjiang 2817*4418919fSjohnjiang for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 2818*4418919fSjohnjiang uint16_t enq = 0, deq = 0; 2819*4418919fSjohnjiang bool first_time = true; 2820*4418919fSjohnjiang last_time = 0; 2821*4418919fSjohnjiang 2822*4418919fSjohnjiang if (unlikely(num_to_process - dequeued < burst_sz)) 2823*4418919fSjohnjiang burst_sz = num_to_process - dequeued; 2824*4418919fSjohnjiang 2825*4418919fSjohnjiang ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); 2826*4418919fSjohnjiang 2827*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, 2828*4418919fSjohnjiang "rte_bbdev_enc_op_alloc_bulk() failed"); 2829*4418919fSjohnjiang if (test_vector.op_type != RTE_BBDEV_OP_NONE) 2830*4418919fSjohnjiang copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued, 2831*4418919fSjohnjiang bufs->inputs, 2832*4418919fSjohnjiang bufs->hard_outputs, 2833*4418919fSjohnjiang ref_op); 2834*4418919fSjohnjiang 2835*4418919fSjohnjiang /* Set counter to validate the ordering */ 2836*4418919fSjohnjiang for (j = 0; j < burst_sz; ++j) 2837*4418919fSjohnjiang ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 2838*4418919fSjohnjiang 2839*4418919fSjohnjiang start_time = rte_rdtsc_precise(); 2840*4418919fSjohnjiang 2841*4418919fSjohnjiang /* 2842*4418919fSjohnjiang * printf("Latency Debug %d\n", 2843*4418919fSjohnjiang * ops_enq[0]->ldpc_enc.cb_params.z_c); REMOVEME 2844*4418919fSjohnjiang */ 2845*4418919fSjohnjiang 2846*4418919fSjohnjiang enq = rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id, 2847*4418919fSjohnjiang &ops_enq[enq], burst_sz); 2848*4418919fSjohnjiang TEST_ASSERT(enq == burst_sz, 2849*4418919fSjohnjiang "Error enqueueing burst, expected %u, got %u", 2850*4418919fSjohnjiang burst_sz, enq); 2851*4418919fSjohnjiang 2852*4418919fSjohnjiang /* Dequeue */ 2853*4418919fSjohnjiang do { 2854*4418919fSjohnjiang deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, 2855*4418919fSjohnjiang &ops_deq[deq], burst_sz - deq); 2856*4418919fSjohnjiang if (likely(first_time && (deq > 0))) { 2857*4418919fSjohnjiang last_time += rte_rdtsc_precise() - start_time; 2858*4418919fSjohnjiang first_time = false; 2859*4418919fSjohnjiang } 2860*4418919fSjohnjiang } while (unlikely(burst_sz != deq)); 2861*4418919fSjohnjiang 2862*4418919fSjohnjiang *max_time = RTE_MAX(*max_time, last_time); 2863*4418919fSjohnjiang *min_time = RTE_MIN(*min_time, last_time); 2864*4418919fSjohnjiang *total_time += last_time; 2865*4418919fSjohnjiang 2866*4418919fSjohnjiang if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 2867*4418919fSjohnjiang ret = validate_enc_op(ops_deq, burst_sz, ref_op); 2868*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 2869*4418919fSjohnjiang } 2870*4418919fSjohnjiang 2871*4418919fSjohnjiang /* 2872*4418919fSjohnjiang * printf("Ready to free - deq %d num_to_process %d\n", FIXME 2873*4418919fSjohnjiang * deq, num_to_process); 2874*4418919fSjohnjiang * printf("cache %d\n", ops_enq[0]->mempool->cache_size); 2875*4418919fSjohnjiang */ 2876*4418919fSjohnjiang rte_bbdev_enc_op_free_bulk(ops_enq, deq); 2877*4418919fSjohnjiang dequeued += deq; 2878*4418919fSjohnjiang } 2879*4418919fSjohnjiang 2880*4418919fSjohnjiang return i; 2881*4418919fSjohnjiang } 2882*4418919fSjohnjiang 2883*4418919fSjohnjiang static int 2884d30ea906Sjfb8856606 latency_test(struct active_device *ad, 2885d30ea906Sjfb8856606 struct test_op_params *op_params) 2886d30ea906Sjfb8856606 { 2887d30ea906Sjfb8856606 int iter; 2888d30ea906Sjfb8856606 uint16_t burst_sz = op_params->burst_sz; 2889d30ea906Sjfb8856606 const uint16_t num_to_process = op_params->num_to_process; 2890d30ea906Sjfb8856606 const enum rte_bbdev_op_type op_type = test_vector.op_type; 2891d30ea906Sjfb8856606 const uint16_t queue_id = ad->queue_ids[0]; 2892d30ea906Sjfb8856606 struct test_buffers *bufs = NULL; 2893d30ea906Sjfb8856606 struct rte_bbdev_info info; 2894d30ea906Sjfb8856606 uint64_t total_time, min_time, max_time; 2895d30ea906Sjfb8856606 const char *op_type_str; 2896d30ea906Sjfb8856606 2897d30ea906Sjfb8856606 total_time = max_time = 0; 2898d30ea906Sjfb8856606 min_time = UINT64_MAX; 2899d30ea906Sjfb8856606 2900d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 2901d30ea906Sjfb8856606 "BURST_SIZE should be <= %u", MAX_BURST); 2902d30ea906Sjfb8856606 2903d30ea906Sjfb8856606 rte_bbdev_info_get(ad->dev_id, &info); 2904d30ea906Sjfb8856606 bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 2905d30ea906Sjfb8856606 2906d30ea906Sjfb8856606 op_type_str = rte_bbdev_op_type_str(op_type); 2907d30ea906Sjfb8856606 TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); 2908d30ea906Sjfb8856606 2909*4418919fSjohnjiang printf("+ ------------------------------------------------------- +\n"); 2910*4418919fSjohnjiang printf("== test: validation/latency\ndev: %s, burst size: %u, num ops: %u, op type: %s\n", 2911d30ea906Sjfb8856606 info.dev_name, burst_sz, num_to_process, op_type_str); 2912d30ea906Sjfb8856606 2913d30ea906Sjfb8856606 if (op_type == RTE_BBDEV_OP_TURBO_DEC) 2914d30ea906Sjfb8856606 iter = latency_test_dec(op_params->mp, bufs, 2915d30ea906Sjfb8856606 op_params->ref_dec_op, op_params->vector_mask, 2916d30ea906Sjfb8856606 ad->dev_id, queue_id, num_to_process, 2917d30ea906Sjfb8856606 burst_sz, &total_time, &min_time, &max_time); 2918*4418919fSjohnjiang else if (op_type == RTE_BBDEV_OP_TURBO_ENC) 2919d30ea906Sjfb8856606 iter = latency_test_enc(op_params->mp, bufs, 2920d30ea906Sjfb8856606 op_params->ref_enc_op, ad->dev_id, queue_id, 2921d30ea906Sjfb8856606 num_to_process, burst_sz, &total_time, 2922d30ea906Sjfb8856606 &min_time, &max_time); 2923*4418919fSjohnjiang else if (op_type == RTE_BBDEV_OP_LDPC_ENC) 2924*4418919fSjohnjiang iter = latency_test_ldpc_enc(op_params->mp, bufs, 2925*4418919fSjohnjiang op_params->ref_enc_op, ad->dev_id, queue_id, 2926*4418919fSjohnjiang num_to_process, burst_sz, &total_time, 2927*4418919fSjohnjiang &min_time, &max_time); 2928*4418919fSjohnjiang else if (op_type == RTE_BBDEV_OP_LDPC_DEC) 2929*4418919fSjohnjiang iter = latency_test_ldpc_dec(op_params->mp, bufs, 2930*4418919fSjohnjiang op_params->ref_dec_op, op_params->vector_mask, 2931*4418919fSjohnjiang ad->dev_id, queue_id, num_to_process, 2932*4418919fSjohnjiang burst_sz, &total_time, &min_time, &max_time); 2933*4418919fSjohnjiang else 2934*4418919fSjohnjiang iter = latency_test_enc(op_params->mp, bufs, 2935*4418919fSjohnjiang op_params->ref_enc_op, 2936*4418919fSjohnjiang ad->dev_id, queue_id, 2937*4418919fSjohnjiang num_to_process, burst_sz, &total_time, 2938*4418919fSjohnjiang &min_time, &max_time); 2939d30ea906Sjfb8856606 2940d30ea906Sjfb8856606 if (iter <= 0) 2941d30ea906Sjfb8856606 return TEST_FAILED; 2942d30ea906Sjfb8856606 2943*4418919fSjohnjiang printf("Operation latency:\n" 2944*4418919fSjohnjiang "\tavg: %lg cycles, %lg us\n" 2945*4418919fSjohnjiang "\tmin: %lg cycles, %lg us\n" 2946*4418919fSjohnjiang "\tmax: %lg cycles, %lg us\n", 2947d30ea906Sjfb8856606 (double)total_time / (double)iter, 2948d30ea906Sjfb8856606 (double)(total_time * 1000000) / (double)iter / 2949d30ea906Sjfb8856606 (double)rte_get_tsc_hz(), (double)min_time, 2950d30ea906Sjfb8856606 (double)(min_time * 1000000) / (double)rte_get_tsc_hz(), 2951d30ea906Sjfb8856606 (double)max_time, (double)(max_time * 1000000) / 2952d30ea906Sjfb8856606 (double)rte_get_tsc_hz()); 2953d30ea906Sjfb8856606 2954d30ea906Sjfb8856606 return TEST_SUCCESS; 2955d30ea906Sjfb8856606 } 2956d30ea906Sjfb8856606 2957d30ea906Sjfb8856606 #ifdef RTE_BBDEV_OFFLOAD_COST 2958d30ea906Sjfb8856606 static int 2959d30ea906Sjfb8856606 get_bbdev_queue_stats(uint16_t dev_id, uint16_t queue_id, 2960d30ea906Sjfb8856606 struct rte_bbdev_stats *stats) 2961d30ea906Sjfb8856606 { 2962d30ea906Sjfb8856606 struct rte_bbdev *dev = &rte_bbdev_devices[dev_id]; 2963d30ea906Sjfb8856606 struct rte_bbdev_stats *q_stats; 2964d30ea906Sjfb8856606 2965d30ea906Sjfb8856606 if (queue_id >= dev->data->num_queues) 2966d30ea906Sjfb8856606 return -1; 2967d30ea906Sjfb8856606 2968d30ea906Sjfb8856606 q_stats = &dev->data->queues[queue_id].queue_stats; 2969d30ea906Sjfb8856606 2970d30ea906Sjfb8856606 stats->enqueued_count = q_stats->enqueued_count; 2971d30ea906Sjfb8856606 stats->dequeued_count = q_stats->dequeued_count; 2972d30ea906Sjfb8856606 stats->enqueue_err_count = q_stats->enqueue_err_count; 2973d30ea906Sjfb8856606 stats->dequeue_err_count = q_stats->dequeue_err_count; 2974*4418919fSjohnjiang stats->acc_offload_cycles = q_stats->acc_offload_cycles; 2975d30ea906Sjfb8856606 2976d30ea906Sjfb8856606 return 0; 2977d30ea906Sjfb8856606 } 2978d30ea906Sjfb8856606 2979d30ea906Sjfb8856606 static int 2980d30ea906Sjfb8856606 offload_latency_test_dec(struct rte_mempool *mempool, struct test_buffers *bufs, 2981d30ea906Sjfb8856606 struct rte_bbdev_dec_op *ref_op, uint16_t dev_id, 2982d30ea906Sjfb8856606 uint16_t queue_id, const uint16_t num_to_process, 2983d30ea906Sjfb8856606 uint16_t burst_sz, struct test_time_stats *time_st) 2984d30ea906Sjfb8856606 { 2985d30ea906Sjfb8856606 int i, dequeued, ret; 2986d30ea906Sjfb8856606 struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 2987d30ea906Sjfb8856606 uint64_t enq_start_time, deq_start_time; 2988d30ea906Sjfb8856606 uint64_t enq_sw_last_time, deq_last_time; 2989d30ea906Sjfb8856606 struct rte_bbdev_stats stats; 2990d30ea906Sjfb8856606 2991d30ea906Sjfb8856606 for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 2992d30ea906Sjfb8856606 uint16_t enq = 0, deq = 0; 2993d30ea906Sjfb8856606 2994d30ea906Sjfb8856606 if (unlikely(num_to_process - dequeued < burst_sz)) 2995d30ea906Sjfb8856606 burst_sz = num_to_process - dequeued; 2996d30ea906Sjfb8856606 2997*4418919fSjohnjiang rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); 2998d30ea906Sjfb8856606 if (test_vector.op_type != RTE_BBDEV_OP_NONE) 2999d30ea906Sjfb8856606 copy_reference_dec_op(ops_enq, burst_sz, dequeued, 3000d30ea906Sjfb8856606 bufs->inputs, 3001d30ea906Sjfb8856606 bufs->hard_outputs, 3002d30ea906Sjfb8856606 bufs->soft_outputs, 3003d30ea906Sjfb8856606 ref_op); 3004d30ea906Sjfb8856606 3005d30ea906Sjfb8856606 /* Start time meas for enqueue function offload latency */ 3006d30ea906Sjfb8856606 enq_start_time = rte_rdtsc_precise(); 3007d30ea906Sjfb8856606 do { 3008d30ea906Sjfb8856606 enq += rte_bbdev_enqueue_dec_ops(dev_id, queue_id, 3009d30ea906Sjfb8856606 &ops_enq[enq], burst_sz - enq); 3010d30ea906Sjfb8856606 } while (unlikely(burst_sz != enq)); 3011d30ea906Sjfb8856606 3012d30ea906Sjfb8856606 ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); 3013d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(ret, 3014d30ea906Sjfb8856606 "Failed to get stats for queue (%u) of device (%u)", 3015d30ea906Sjfb8856606 queue_id, dev_id); 3016d30ea906Sjfb8856606 3017d30ea906Sjfb8856606 enq_sw_last_time = rte_rdtsc_precise() - enq_start_time - 3018*4418919fSjohnjiang stats.acc_offload_cycles; 3019d30ea906Sjfb8856606 time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, 3020d30ea906Sjfb8856606 enq_sw_last_time); 3021d30ea906Sjfb8856606 time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, 3022d30ea906Sjfb8856606 enq_sw_last_time); 3023*4418919fSjohnjiang time_st->enq_sw_total_time += enq_sw_last_time; 3024d30ea906Sjfb8856606 3025*4418919fSjohnjiang time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, 3026*4418919fSjohnjiang stats.acc_offload_cycles); 3027*4418919fSjohnjiang time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, 3028*4418919fSjohnjiang stats.acc_offload_cycles); 3029*4418919fSjohnjiang time_st->enq_acc_total_time += stats.acc_offload_cycles; 3030d30ea906Sjfb8856606 3031*4418919fSjohnjiang /* give time for device to process ops */ 3032*4418919fSjohnjiang rte_delay_us(200); 3033d30ea906Sjfb8856606 3034d30ea906Sjfb8856606 /* Start time meas for dequeue function offload latency */ 3035d30ea906Sjfb8856606 deq_start_time = rte_rdtsc_precise(); 3036d30ea906Sjfb8856606 /* Dequeue one operation */ 3037d30ea906Sjfb8856606 do { 3038d30ea906Sjfb8856606 deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, 3039d30ea906Sjfb8856606 &ops_deq[deq], 1); 3040d30ea906Sjfb8856606 } while (unlikely(deq != 1)); 3041d30ea906Sjfb8856606 3042d30ea906Sjfb8856606 deq_last_time = rte_rdtsc_precise() - deq_start_time; 3043d30ea906Sjfb8856606 time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, 3044d30ea906Sjfb8856606 deq_last_time); 3045d30ea906Sjfb8856606 time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, 3046d30ea906Sjfb8856606 deq_last_time); 3047*4418919fSjohnjiang time_st->deq_total_time += deq_last_time; 3048*4418919fSjohnjiang 3049*4418919fSjohnjiang /* Dequeue remaining operations if needed*/ 3050*4418919fSjohnjiang while (burst_sz != deq) 3051*4418919fSjohnjiang deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, 3052*4418919fSjohnjiang &ops_deq[deq], burst_sz - deq); 3053*4418919fSjohnjiang 3054*4418919fSjohnjiang rte_bbdev_dec_op_free_bulk(ops_enq, deq); 3055*4418919fSjohnjiang dequeued += deq; 3056*4418919fSjohnjiang } 3057*4418919fSjohnjiang 3058*4418919fSjohnjiang return i; 3059*4418919fSjohnjiang } 3060*4418919fSjohnjiang 3061*4418919fSjohnjiang static int 3062*4418919fSjohnjiang offload_latency_test_ldpc_dec(struct rte_mempool *mempool, 3063*4418919fSjohnjiang struct test_buffers *bufs, 3064*4418919fSjohnjiang struct rte_bbdev_dec_op *ref_op, uint16_t dev_id, 3065*4418919fSjohnjiang uint16_t queue_id, const uint16_t num_to_process, 3066*4418919fSjohnjiang uint16_t burst_sz, struct test_time_stats *time_st) 3067*4418919fSjohnjiang { 3068*4418919fSjohnjiang int i, dequeued, ret; 3069*4418919fSjohnjiang struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 3070*4418919fSjohnjiang uint64_t enq_start_time, deq_start_time; 3071*4418919fSjohnjiang uint64_t enq_sw_last_time, deq_last_time; 3072*4418919fSjohnjiang struct rte_bbdev_stats stats; 3073*4418919fSjohnjiang 3074*4418919fSjohnjiang for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 3075*4418919fSjohnjiang uint16_t enq = 0, deq = 0; 3076*4418919fSjohnjiang 3077*4418919fSjohnjiang if (unlikely(num_to_process - dequeued < burst_sz)) 3078*4418919fSjohnjiang burst_sz = num_to_process - dequeued; 3079*4418919fSjohnjiang 3080*4418919fSjohnjiang rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); 3081*4418919fSjohnjiang if (test_vector.op_type != RTE_BBDEV_OP_NONE) 3082*4418919fSjohnjiang copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued, 3083*4418919fSjohnjiang bufs->inputs, 3084*4418919fSjohnjiang bufs->hard_outputs, 3085*4418919fSjohnjiang bufs->soft_outputs, 3086*4418919fSjohnjiang bufs->harq_inputs, 3087*4418919fSjohnjiang bufs->harq_outputs, 3088*4418919fSjohnjiang ref_op); 3089*4418919fSjohnjiang 3090*4418919fSjohnjiang /* Start time meas for enqueue function offload latency */ 3091*4418919fSjohnjiang enq_start_time = rte_rdtsc_precise(); 3092*4418919fSjohnjiang do { 3093*4418919fSjohnjiang enq += rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, 3094*4418919fSjohnjiang &ops_enq[enq], burst_sz - enq); 3095*4418919fSjohnjiang } while (unlikely(burst_sz != enq)); 3096*4418919fSjohnjiang 3097*4418919fSjohnjiang ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); 3098*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, 3099*4418919fSjohnjiang "Failed to get stats for queue (%u) of device (%u)", 3100*4418919fSjohnjiang queue_id, dev_id); 3101*4418919fSjohnjiang 3102*4418919fSjohnjiang enq_sw_last_time = rte_rdtsc_precise() - enq_start_time - 3103*4418919fSjohnjiang stats.acc_offload_cycles; 3104*4418919fSjohnjiang time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, 3105*4418919fSjohnjiang enq_sw_last_time); 3106*4418919fSjohnjiang time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, 3107*4418919fSjohnjiang enq_sw_last_time); 3108*4418919fSjohnjiang time_st->enq_sw_total_time += enq_sw_last_time; 3109*4418919fSjohnjiang 3110*4418919fSjohnjiang time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, 3111*4418919fSjohnjiang stats.acc_offload_cycles); 3112*4418919fSjohnjiang time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, 3113*4418919fSjohnjiang stats.acc_offload_cycles); 3114*4418919fSjohnjiang time_st->enq_acc_total_time += stats.acc_offload_cycles; 3115*4418919fSjohnjiang 3116*4418919fSjohnjiang /* give time for device to process ops */ 3117*4418919fSjohnjiang rte_delay_us(200); 3118*4418919fSjohnjiang 3119*4418919fSjohnjiang /* Start time meas for dequeue function offload latency */ 3120*4418919fSjohnjiang deq_start_time = rte_rdtsc_precise(); 3121*4418919fSjohnjiang /* Dequeue one operation */ 3122*4418919fSjohnjiang do { 3123*4418919fSjohnjiang deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, 3124*4418919fSjohnjiang &ops_deq[deq], 1); 3125*4418919fSjohnjiang } while (unlikely(deq != 1)); 3126*4418919fSjohnjiang 3127*4418919fSjohnjiang deq_last_time = rte_rdtsc_precise() - deq_start_time; 3128*4418919fSjohnjiang time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, 3129*4418919fSjohnjiang deq_last_time); 3130*4418919fSjohnjiang time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, 3131*4418919fSjohnjiang deq_last_time); 3132*4418919fSjohnjiang time_st->deq_total_time += deq_last_time; 3133d30ea906Sjfb8856606 3134d30ea906Sjfb8856606 /* Dequeue remaining operations if needed*/ 3135d30ea906Sjfb8856606 while (burst_sz != deq) 3136d30ea906Sjfb8856606 deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, 3137d30ea906Sjfb8856606 &ops_deq[deq], burst_sz - deq); 3138d30ea906Sjfb8856606 3139d30ea906Sjfb8856606 rte_bbdev_dec_op_free_bulk(ops_enq, deq); 3140d30ea906Sjfb8856606 dequeued += deq; 3141d30ea906Sjfb8856606 } 3142d30ea906Sjfb8856606 3143d30ea906Sjfb8856606 return i; 3144d30ea906Sjfb8856606 } 3145d30ea906Sjfb8856606 3146d30ea906Sjfb8856606 static int 3147d30ea906Sjfb8856606 offload_latency_test_enc(struct rte_mempool *mempool, struct test_buffers *bufs, 3148d30ea906Sjfb8856606 struct rte_bbdev_enc_op *ref_op, uint16_t dev_id, 3149d30ea906Sjfb8856606 uint16_t queue_id, const uint16_t num_to_process, 3150d30ea906Sjfb8856606 uint16_t burst_sz, struct test_time_stats *time_st) 3151d30ea906Sjfb8856606 { 3152d30ea906Sjfb8856606 int i, dequeued, ret; 3153d30ea906Sjfb8856606 struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 3154d30ea906Sjfb8856606 uint64_t enq_start_time, deq_start_time; 3155d30ea906Sjfb8856606 uint64_t enq_sw_last_time, deq_last_time; 3156d30ea906Sjfb8856606 struct rte_bbdev_stats stats; 3157d30ea906Sjfb8856606 3158d30ea906Sjfb8856606 for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 3159d30ea906Sjfb8856606 uint16_t enq = 0, deq = 0; 3160d30ea906Sjfb8856606 3161d30ea906Sjfb8856606 if (unlikely(num_to_process - dequeued < burst_sz)) 3162d30ea906Sjfb8856606 burst_sz = num_to_process - dequeued; 3163d30ea906Sjfb8856606 31641646932aSjfb8856606 ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); 3165*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, "rte_bbdev_op_alloc_bulk() failed"); 3166d30ea906Sjfb8856606 if (test_vector.op_type != RTE_BBDEV_OP_NONE) 3167d30ea906Sjfb8856606 copy_reference_enc_op(ops_enq, burst_sz, dequeued, 3168d30ea906Sjfb8856606 bufs->inputs, 3169d30ea906Sjfb8856606 bufs->hard_outputs, 3170d30ea906Sjfb8856606 ref_op); 3171d30ea906Sjfb8856606 3172d30ea906Sjfb8856606 /* Start time meas for enqueue function offload latency */ 3173d30ea906Sjfb8856606 enq_start_time = rte_rdtsc_precise(); 3174d30ea906Sjfb8856606 do { 3175d30ea906Sjfb8856606 enq += rte_bbdev_enqueue_enc_ops(dev_id, queue_id, 3176d30ea906Sjfb8856606 &ops_enq[enq], burst_sz - enq); 3177d30ea906Sjfb8856606 } while (unlikely(burst_sz != enq)); 3178d30ea906Sjfb8856606 3179d30ea906Sjfb8856606 ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); 3180d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS(ret, 3181d30ea906Sjfb8856606 "Failed to get stats for queue (%u) of device (%u)", 3182d30ea906Sjfb8856606 queue_id, dev_id); 3183d30ea906Sjfb8856606 3184d30ea906Sjfb8856606 enq_sw_last_time = rte_rdtsc_precise() - enq_start_time - 3185*4418919fSjohnjiang stats.acc_offload_cycles; 3186d30ea906Sjfb8856606 time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, 3187d30ea906Sjfb8856606 enq_sw_last_time); 3188d30ea906Sjfb8856606 time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, 3189d30ea906Sjfb8856606 enq_sw_last_time); 3190*4418919fSjohnjiang time_st->enq_sw_total_time += enq_sw_last_time; 3191d30ea906Sjfb8856606 3192*4418919fSjohnjiang time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, 3193*4418919fSjohnjiang stats.acc_offload_cycles); 3194*4418919fSjohnjiang time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, 3195*4418919fSjohnjiang stats.acc_offload_cycles); 3196*4418919fSjohnjiang time_st->enq_acc_total_time += stats.acc_offload_cycles; 3197d30ea906Sjfb8856606 3198*4418919fSjohnjiang /* give time for device to process ops */ 3199*4418919fSjohnjiang rte_delay_us(200); 3200d30ea906Sjfb8856606 3201d30ea906Sjfb8856606 /* Start time meas for dequeue function offload latency */ 3202d30ea906Sjfb8856606 deq_start_time = rte_rdtsc_precise(); 3203d30ea906Sjfb8856606 /* Dequeue one operation */ 3204d30ea906Sjfb8856606 do { 3205d30ea906Sjfb8856606 deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, 3206d30ea906Sjfb8856606 &ops_deq[deq], 1); 3207d30ea906Sjfb8856606 } while (unlikely(deq != 1)); 3208d30ea906Sjfb8856606 3209d30ea906Sjfb8856606 deq_last_time = rte_rdtsc_precise() - deq_start_time; 3210d30ea906Sjfb8856606 time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, 3211d30ea906Sjfb8856606 deq_last_time); 3212d30ea906Sjfb8856606 time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, 3213d30ea906Sjfb8856606 deq_last_time); 3214*4418919fSjohnjiang time_st->deq_total_time += deq_last_time; 3215d30ea906Sjfb8856606 3216d30ea906Sjfb8856606 while (burst_sz != deq) 3217d30ea906Sjfb8856606 deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, 3218d30ea906Sjfb8856606 &ops_deq[deq], burst_sz - deq); 3219d30ea906Sjfb8856606 3220d30ea906Sjfb8856606 rte_bbdev_enc_op_free_bulk(ops_enq, deq); 3221d30ea906Sjfb8856606 dequeued += deq; 3222d30ea906Sjfb8856606 } 3223d30ea906Sjfb8856606 3224d30ea906Sjfb8856606 return i; 3225d30ea906Sjfb8856606 } 3226*4418919fSjohnjiang 3227*4418919fSjohnjiang static int 3228*4418919fSjohnjiang offload_latency_test_ldpc_enc(struct rte_mempool *mempool, 3229*4418919fSjohnjiang struct test_buffers *bufs, 3230*4418919fSjohnjiang struct rte_bbdev_enc_op *ref_op, uint16_t dev_id, 3231*4418919fSjohnjiang uint16_t queue_id, const uint16_t num_to_process, 3232*4418919fSjohnjiang uint16_t burst_sz, struct test_time_stats *time_st) 3233*4418919fSjohnjiang { 3234*4418919fSjohnjiang int i, dequeued, ret; 3235*4418919fSjohnjiang struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 3236*4418919fSjohnjiang uint64_t enq_start_time, deq_start_time; 3237*4418919fSjohnjiang uint64_t enq_sw_last_time, deq_last_time; 3238*4418919fSjohnjiang struct rte_bbdev_stats stats; 3239*4418919fSjohnjiang 3240*4418919fSjohnjiang for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 3241*4418919fSjohnjiang uint16_t enq = 0, deq = 0; 3242*4418919fSjohnjiang 3243*4418919fSjohnjiang if (unlikely(num_to_process - dequeued < burst_sz)) 3244*4418919fSjohnjiang burst_sz = num_to_process - dequeued; 3245*4418919fSjohnjiang 3246*4418919fSjohnjiang ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); 3247*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, "rte_bbdev_op_alloc_bulk() failed"); 3248*4418919fSjohnjiang if (test_vector.op_type != RTE_BBDEV_OP_NONE) 3249*4418919fSjohnjiang copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued, 3250*4418919fSjohnjiang bufs->inputs, 3251*4418919fSjohnjiang bufs->hard_outputs, 3252*4418919fSjohnjiang ref_op); 3253*4418919fSjohnjiang 3254*4418919fSjohnjiang /* Start time meas for enqueue function offload latency */ 3255*4418919fSjohnjiang enq_start_time = rte_rdtsc_precise(); 3256*4418919fSjohnjiang do { 3257*4418919fSjohnjiang enq += rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id, 3258*4418919fSjohnjiang &ops_enq[enq], burst_sz - enq); 3259*4418919fSjohnjiang } while (unlikely(burst_sz != enq)); 3260*4418919fSjohnjiang 3261*4418919fSjohnjiang ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); 3262*4418919fSjohnjiang TEST_ASSERT_SUCCESS(ret, 3263*4418919fSjohnjiang "Failed to get stats for queue (%u) of device (%u)", 3264*4418919fSjohnjiang queue_id, dev_id); 3265*4418919fSjohnjiang 3266*4418919fSjohnjiang enq_sw_last_time = rte_rdtsc_precise() - enq_start_time - 3267*4418919fSjohnjiang stats.acc_offload_cycles; 3268*4418919fSjohnjiang time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, 3269*4418919fSjohnjiang enq_sw_last_time); 3270*4418919fSjohnjiang time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, 3271*4418919fSjohnjiang enq_sw_last_time); 3272*4418919fSjohnjiang time_st->enq_sw_total_time += enq_sw_last_time; 3273*4418919fSjohnjiang 3274*4418919fSjohnjiang time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, 3275*4418919fSjohnjiang stats.acc_offload_cycles); 3276*4418919fSjohnjiang time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, 3277*4418919fSjohnjiang stats.acc_offload_cycles); 3278*4418919fSjohnjiang time_st->enq_acc_total_time += stats.acc_offload_cycles; 3279*4418919fSjohnjiang 3280*4418919fSjohnjiang /* give time for device to process ops */ 3281*4418919fSjohnjiang rte_delay_us(200); 3282*4418919fSjohnjiang 3283*4418919fSjohnjiang /* Start time meas for dequeue function offload latency */ 3284*4418919fSjohnjiang deq_start_time = rte_rdtsc_precise(); 3285*4418919fSjohnjiang /* Dequeue one operation */ 3286*4418919fSjohnjiang do { 3287*4418919fSjohnjiang deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, 3288*4418919fSjohnjiang &ops_deq[deq], 1); 3289*4418919fSjohnjiang } while (unlikely(deq != 1)); 3290*4418919fSjohnjiang 3291*4418919fSjohnjiang deq_last_time = rte_rdtsc_precise() - deq_start_time; 3292*4418919fSjohnjiang time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, 3293*4418919fSjohnjiang deq_last_time); 3294*4418919fSjohnjiang time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, 3295*4418919fSjohnjiang deq_last_time); 3296*4418919fSjohnjiang time_st->deq_total_time += deq_last_time; 3297*4418919fSjohnjiang 3298*4418919fSjohnjiang while (burst_sz != deq) 3299*4418919fSjohnjiang deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, 3300*4418919fSjohnjiang &ops_deq[deq], burst_sz - deq); 3301*4418919fSjohnjiang 3302*4418919fSjohnjiang rte_bbdev_enc_op_free_bulk(ops_enq, deq); 3303*4418919fSjohnjiang dequeued += deq; 3304*4418919fSjohnjiang } 3305*4418919fSjohnjiang 3306*4418919fSjohnjiang return i; 3307*4418919fSjohnjiang } 3308d30ea906Sjfb8856606 #endif 3309d30ea906Sjfb8856606 3310d30ea906Sjfb8856606 static int 3311d30ea906Sjfb8856606 offload_cost_test(struct active_device *ad, 3312d30ea906Sjfb8856606 struct test_op_params *op_params) 3313d30ea906Sjfb8856606 { 3314d30ea906Sjfb8856606 #ifndef RTE_BBDEV_OFFLOAD_COST 3315d30ea906Sjfb8856606 RTE_SET_USED(ad); 3316d30ea906Sjfb8856606 RTE_SET_USED(op_params); 3317d30ea906Sjfb8856606 printf("Offload latency test is disabled.\n"); 3318d30ea906Sjfb8856606 printf("Set RTE_BBDEV_OFFLOAD_COST to 'y' to turn the test on.\n"); 3319d30ea906Sjfb8856606 return TEST_SKIPPED; 3320d30ea906Sjfb8856606 #else 3321d30ea906Sjfb8856606 int iter; 3322d30ea906Sjfb8856606 uint16_t burst_sz = op_params->burst_sz; 3323d30ea906Sjfb8856606 const uint16_t num_to_process = op_params->num_to_process; 3324d30ea906Sjfb8856606 const enum rte_bbdev_op_type op_type = test_vector.op_type; 3325d30ea906Sjfb8856606 const uint16_t queue_id = ad->queue_ids[0]; 3326d30ea906Sjfb8856606 struct test_buffers *bufs = NULL; 3327d30ea906Sjfb8856606 struct rte_bbdev_info info; 3328d30ea906Sjfb8856606 const char *op_type_str; 3329d30ea906Sjfb8856606 struct test_time_stats time_st; 3330d30ea906Sjfb8856606 3331d30ea906Sjfb8856606 memset(&time_st, 0, sizeof(struct test_time_stats)); 3332d30ea906Sjfb8856606 time_st.enq_sw_min_time = UINT64_MAX; 3333*4418919fSjohnjiang time_st.enq_acc_min_time = UINT64_MAX; 3334d30ea906Sjfb8856606 time_st.deq_min_time = UINT64_MAX; 3335d30ea906Sjfb8856606 3336d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 3337d30ea906Sjfb8856606 "BURST_SIZE should be <= %u", MAX_BURST); 3338d30ea906Sjfb8856606 3339d30ea906Sjfb8856606 rte_bbdev_info_get(ad->dev_id, &info); 3340d30ea906Sjfb8856606 bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 3341d30ea906Sjfb8856606 3342d30ea906Sjfb8856606 op_type_str = rte_bbdev_op_type_str(op_type); 3343d30ea906Sjfb8856606 TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); 3344d30ea906Sjfb8856606 3345*4418919fSjohnjiang printf("+ ------------------------------------------------------- +\n"); 3346*4418919fSjohnjiang printf("== test: offload latency test\ndev: %s, burst size: %u, num ops: %u, op type: %s\n", 3347d30ea906Sjfb8856606 info.dev_name, burst_sz, num_to_process, op_type_str); 3348d30ea906Sjfb8856606 3349d30ea906Sjfb8856606 if (op_type == RTE_BBDEV_OP_TURBO_DEC) 3350d30ea906Sjfb8856606 iter = offload_latency_test_dec(op_params->mp, bufs, 3351d30ea906Sjfb8856606 op_params->ref_dec_op, ad->dev_id, queue_id, 3352d30ea906Sjfb8856606 num_to_process, burst_sz, &time_st); 3353*4418919fSjohnjiang else if (op_type == RTE_BBDEV_OP_TURBO_ENC) 3354*4418919fSjohnjiang iter = offload_latency_test_enc(op_params->mp, bufs, 3355*4418919fSjohnjiang op_params->ref_enc_op, ad->dev_id, queue_id, 3356*4418919fSjohnjiang num_to_process, burst_sz, &time_st); 3357*4418919fSjohnjiang else if (op_type == RTE_BBDEV_OP_LDPC_ENC) 3358*4418919fSjohnjiang iter = offload_latency_test_ldpc_enc(op_params->mp, bufs, 3359*4418919fSjohnjiang op_params->ref_enc_op, ad->dev_id, queue_id, 3360*4418919fSjohnjiang num_to_process, burst_sz, &time_st); 3361*4418919fSjohnjiang else if (op_type == RTE_BBDEV_OP_LDPC_DEC) 3362*4418919fSjohnjiang iter = offload_latency_test_ldpc_dec(op_params->mp, bufs, 3363*4418919fSjohnjiang op_params->ref_dec_op, ad->dev_id, queue_id, 3364*4418919fSjohnjiang num_to_process, burst_sz, &time_st); 3365d30ea906Sjfb8856606 else 3366d30ea906Sjfb8856606 iter = offload_latency_test_enc(op_params->mp, bufs, 3367d30ea906Sjfb8856606 op_params->ref_enc_op, ad->dev_id, queue_id, 3368d30ea906Sjfb8856606 num_to_process, burst_sz, &time_st); 3369d30ea906Sjfb8856606 3370d30ea906Sjfb8856606 if (iter <= 0) 3371d30ea906Sjfb8856606 return TEST_FAILED; 3372d30ea906Sjfb8856606 3373*4418919fSjohnjiang printf("Enqueue driver offload cost latency:\n" 3374*4418919fSjohnjiang "\tavg: %lg cycles, %lg us\n" 3375*4418919fSjohnjiang "\tmin: %lg cycles, %lg us\n" 3376*4418919fSjohnjiang "\tmax: %lg cycles, %lg us\n" 3377*4418919fSjohnjiang "Enqueue accelerator offload cost latency:\n" 3378*4418919fSjohnjiang "\tavg: %lg cycles, %lg us\n" 3379*4418919fSjohnjiang "\tmin: %lg cycles, %lg us\n" 3380*4418919fSjohnjiang "\tmax: %lg cycles, %lg us\n", 3381*4418919fSjohnjiang (double)time_st.enq_sw_total_time / (double)iter, 3382*4418919fSjohnjiang (double)(time_st.enq_sw_total_time * 1000000) / 3383d30ea906Sjfb8856606 (double)iter / (double)rte_get_tsc_hz(), 3384d30ea906Sjfb8856606 (double)time_st.enq_sw_min_time, 3385d30ea906Sjfb8856606 (double)(time_st.enq_sw_min_time * 1000000) / 3386d30ea906Sjfb8856606 rte_get_tsc_hz(), (double)time_st.enq_sw_max_time, 3387d30ea906Sjfb8856606 (double)(time_st.enq_sw_max_time * 1000000) / 3388*4418919fSjohnjiang rte_get_tsc_hz(), (double)time_st.enq_acc_total_time / 3389d30ea906Sjfb8856606 (double)iter, 3390*4418919fSjohnjiang (double)(time_st.enq_acc_total_time * 1000000) / 3391d30ea906Sjfb8856606 (double)iter / (double)rte_get_tsc_hz(), 3392*4418919fSjohnjiang (double)time_st.enq_acc_min_time, 3393*4418919fSjohnjiang (double)(time_st.enq_acc_min_time * 1000000) / 3394*4418919fSjohnjiang rte_get_tsc_hz(), (double)time_st.enq_acc_max_time, 3395*4418919fSjohnjiang (double)(time_st.enq_acc_max_time * 1000000) / 3396d30ea906Sjfb8856606 rte_get_tsc_hz()); 3397d30ea906Sjfb8856606 3398*4418919fSjohnjiang printf("Dequeue offload cost latency - one op:\n" 3399*4418919fSjohnjiang "\tavg: %lg cycles, %lg us\n" 3400*4418919fSjohnjiang "\tmin: %lg cycles, %lg us\n" 3401*4418919fSjohnjiang "\tmax: %lg cycles, %lg us\n", 3402*4418919fSjohnjiang (double)time_st.deq_total_time / (double)iter, 3403*4418919fSjohnjiang (double)(time_st.deq_total_time * 1000000) / 3404d30ea906Sjfb8856606 (double)iter / (double)rte_get_tsc_hz(), 3405d30ea906Sjfb8856606 (double)time_st.deq_min_time, 3406d30ea906Sjfb8856606 (double)(time_st.deq_min_time * 1000000) / 3407d30ea906Sjfb8856606 rte_get_tsc_hz(), (double)time_st.deq_max_time, 3408d30ea906Sjfb8856606 (double)(time_st.deq_max_time * 1000000) / 3409d30ea906Sjfb8856606 rte_get_tsc_hz()); 3410d30ea906Sjfb8856606 3411d30ea906Sjfb8856606 return TEST_SUCCESS; 3412d30ea906Sjfb8856606 #endif 3413d30ea906Sjfb8856606 } 3414d30ea906Sjfb8856606 3415d30ea906Sjfb8856606 #ifdef RTE_BBDEV_OFFLOAD_COST 3416d30ea906Sjfb8856606 static int 3417d30ea906Sjfb8856606 offload_latency_empty_q_test_dec(uint16_t dev_id, uint16_t queue_id, 3418d30ea906Sjfb8856606 const uint16_t num_to_process, uint16_t burst_sz, 3419*4418919fSjohnjiang uint64_t *deq_total_time, uint64_t *deq_min_time, 3420d30ea906Sjfb8856606 uint64_t *deq_max_time) 3421d30ea906Sjfb8856606 { 3422d30ea906Sjfb8856606 int i, deq_total; 3423d30ea906Sjfb8856606 struct rte_bbdev_dec_op *ops[MAX_BURST]; 3424d30ea906Sjfb8856606 uint64_t deq_start_time, deq_last_time; 3425d30ea906Sjfb8856606 3426d30ea906Sjfb8856606 /* Test deq offload latency from an empty queue */ 3427d30ea906Sjfb8856606 3428d30ea906Sjfb8856606 for (i = 0, deq_total = 0; deq_total < num_to_process; 3429d30ea906Sjfb8856606 ++i, deq_total += burst_sz) { 3430d30ea906Sjfb8856606 deq_start_time = rte_rdtsc_precise(); 3431d30ea906Sjfb8856606 3432d30ea906Sjfb8856606 if (unlikely(num_to_process - deq_total < burst_sz)) 3433d30ea906Sjfb8856606 burst_sz = num_to_process - deq_total; 3434d30ea906Sjfb8856606 rte_bbdev_dequeue_dec_ops(dev_id, queue_id, ops, burst_sz); 3435d30ea906Sjfb8856606 3436d30ea906Sjfb8856606 deq_last_time = rte_rdtsc_precise() - deq_start_time; 3437d30ea906Sjfb8856606 *deq_max_time = RTE_MAX(*deq_max_time, deq_last_time); 3438d30ea906Sjfb8856606 *deq_min_time = RTE_MIN(*deq_min_time, deq_last_time); 3439*4418919fSjohnjiang *deq_total_time += deq_last_time; 3440d30ea906Sjfb8856606 } 3441d30ea906Sjfb8856606 3442d30ea906Sjfb8856606 return i; 3443d30ea906Sjfb8856606 } 3444d30ea906Sjfb8856606 3445d30ea906Sjfb8856606 static int 3446d30ea906Sjfb8856606 offload_latency_empty_q_test_enc(uint16_t dev_id, uint16_t queue_id, 3447d30ea906Sjfb8856606 const uint16_t num_to_process, uint16_t burst_sz, 3448*4418919fSjohnjiang uint64_t *deq_total_time, uint64_t *deq_min_time, 3449d30ea906Sjfb8856606 uint64_t *deq_max_time) 3450d30ea906Sjfb8856606 { 3451d30ea906Sjfb8856606 int i, deq_total; 3452d30ea906Sjfb8856606 struct rte_bbdev_enc_op *ops[MAX_BURST]; 3453d30ea906Sjfb8856606 uint64_t deq_start_time, deq_last_time; 3454d30ea906Sjfb8856606 3455d30ea906Sjfb8856606 /* Test deq offload latency from an empty queue */ 3456d30ea906Sjfb8856606 for (i = 0, deq_total = 0; deq_total < num_to_process; 3457d30ea906Sjfb8856606 ++i, deq_total += burst_sz) { 3458d30ea906Sjfb8856606 deq_start_time = rte_rdtsc_precise(); 3459d30ea906Sjfb8856606 3460d30ea906Sjfb8856606 if (unlikely(num_to_process - deq_total < burst_sz)) 3461d30ea906Sjfb8856606 burst_sz = num_to_process - deq_total; 3462d30ea906Sjfb8856606 rte_bbdev_dequeue_enc_ops(dev_id, queue_id, ops, burst_sz); 3463d30ea906Sjfb8856606 3464d30ea906Sjfb8856606 deq_last_time = rte_rdtsc_precise() - deq_start_time; 3465d30ea906Sjfb8856606 *deq_max_time = RTE_MAX(*deq_max_time, deq_last_time); 3466d30ea906Sjfb8856606 *deq_min_time = RTE_MIN(*deq_min_time, deq_last_time); 3467*4418919fSjohnjiang *deq_total_time += deq_last_time; 3468d30ea906Sjfb8856606 } 3469d30ea906Sjfb8856606 3470d30ea906Sjfb8856606 return i; 3471d30ea906Sjfb8856606 } 3472d30ea906Sjfb8856606 #endif 3473d30ea906Sjfb8856606 3474d30ea906Sjfb8856606 static int 3475d30ea906Sjfb8856606 offload_latency_empty_q_test(struct active_device *ad, 3476d30ea906Sjfb8856606 struct test_op_params *op_params) 3477d30ea906Sjfb8856606 { 3478d30ea906Sjfb8856606 #ifndef RTE_BBDEV_OFFLOAD_COST 3479d30ea906Sjfb8856606 RTE_SET_USED(ad); 3480d30ea906Sjfb8856606 RTE_SET_USED(op_params); 3481d30ea906Sjfb8856606 printf("Offload latency empty dequeue test is disabled.\n"); 3482d30ea906Sjfb8856606 printf("Set RTE_BBDEV_OFFLOAD_COST to 'y' to turn the test on.\n"); 3483d30ea906Sjfb8856606 return TEST_SKIPPED; 3484d30ea906Sjfb8856606 #else 3485d30ea906Sjfb8856606 int iter; 3486*4418919fSjohnjiang uint64_t deq_total_time, deq_min_time, deq_max_time; 3487d30ea906Sjfb8856606 uint16_t burst_sz = op_params->burst_sz; 3488d30ea906Sjfb8856606 const uint16_t num_to_process = op_params->num_to_process; 3489d30ea906Sjfb8856606 const enum rte_bbdev_op_type op_type = test_vector.op_type; 3490d30ea906Sjfb8856606 const uint16_t queue_id = ad->queue_ids[0]; 3491d30ea906Sjfb8856606 struct rte_bbdev_info info; 3492d30ea906Sjfb8856606 const char *op_type_str; 3493d30ea906Sjfb8856606 3494*4418919fSjohnjiang deq_total_time = deq_max_time = 0; 3495d30ea906Sjfb8856606 deq_min_time = UINT64_MAX; 3496d30ea906Sjfb8856606 3497d30ea906Sjfb8856606 TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 3498d30ea906Sjfb8856606 "BURST_SIZE should be <= %u", MAX_BURST); 3499d30ea906Sjfb8856606 3500d30ea906Sjfb8856606 rte_bbdev_info_get(ad->dev_id, &info); 3501d30ea906Sjfb8856606 3502d30ea906Sjfb8856606 op_type_str = rte_bbdev_op_type_str(op_type); 3503d30ea906Sjfb8856606 TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); 3504d30ea906Sjfb8856606 3505*4418919fSjohnjiang printf("+ ------------------------------------------------------- +\n"); 3506*4418919fSjohnjiang printf("== test: offload latency empty dequeue\ndev: %s, burst size: %u, num ops: %u, op type: %s\n", 3507d30ea906Sjfb8856606 info.dev_name, burst_sz, num_to_process, op_type_str); 3508d30ea906Sjfb8856606 3509d30ea906Sjfb8856606 if (op_type == RTE_BBDEV_OP_TURBO_DEC) 3510d30ea906Sjfb8856606 iter = offload_latency_empty_q_test_dec(ad->dev_id, queue_id, 3511*4418919fSjohnjiang num_to_process, burst_sz, &deq_total_time, 3512d30ea906Sjfb8856606 &deq_min_time, &deq_max_time); 3513d30ea906Sjfb8856606 else 3514d30ea906Sjfb8856606 iter = offload_latency_empty_q_test_enc(ad->dev_id, queue_id, 3515*4418919fSjohnjiang num_to_process, burst_sz, &deq_total_time, 3516d30ea906Sjfb8856606 &deq_min_time, &deq_max_time); 3517d30ea906Sjfb8856606 3518d30ea906Sjfb8856606 if (iter <= 0) 3519d30ea906Sjfb8856606 return TEST_FAILED; 3520d30ea906Sjfb8856606 3521*4418919fSjohnjiang printf("Empty dequeue offload:\n" 3522*4418919fSjohnjiang "\tavg: %lg cycles, %lg us\n" 3523*4418919fSjohnjiang "\tmin: %lg cycles, %lg us\n" 3524*4418919fSjohnjiang "\tmax: %lg cycles, %lg us\n", 3525*4418919fSjohnjiang (double)deq_total_time / (double)iter, 3526*4418919fSjohnjiang (double)(deq_total_time * 1000000) / (double)iter / 3527d30ea906Sjfb8856606 (double)rte_get_tsc_hz(), (double)deq_min_time, 3528d30ea906Sjfb8856606 (double)(deq_min_time * 1000000) / rte_get_tsc_hz(), 3529d30ea906Sjfb8856606 (double)deq_max_time, (double)(deq_max_time * 1000000) / 3530d30ea906Sjfb8856606 rte_get_tsc_hz()); 3531d30ea906Sjfb8856606 3532d30ea906Sjfb8856606 return TEST_SUCCESS; 3533d30ea906Sjfb8856606 #endif 3534d30ea906Sjfb8856606 } 3535d30ea906Sjfb8856606 3536d30ea906Sjfb8856606 static int 3537d30ea906Sjfb8856606 throughput_tc(void) 3538d30ea906Sjfb8856606 { 3539d30ea906Sjfb8856606 return run_test_case(throughput_test); 3540d30ea906Sjfb8856606 } 3541d30ea906Sjfb8856606 3542d30ea906Sjfb8856606 static int 3543d30ea906Sjfb8856606 offload_cost_tc(void) 3544d30ea906Sjfb8856606 { 3545d30ea906Sjfb8856606 return run_test_case(offload_cost_test); 3546d30ea906Sjfb8856606 } 3547d30ea906Sjfb8856606 3548d30ea906Sjfb8856606 static int 3549d30ea906Sjfb8856606 offload_latency_empty_q_tc(void) 3550d30ea906Sjfb8856606 { 3551d30ea906Sjfb8856606 return run_test_case(offload_latency_empty_q_test); 3552d30ea906Sjfb8856606 } 3553d30ea906Sjfb8856606 3554d30ea906Sjfb8856606 static int 3555d30ea906Sjfb8856606 latency_tc(void) 3556d30ea906Sjfb8856606 { 3557d30ea906Sjfb8856606 return run_test_case(latency_test); 3558d30ea906Sjfb8856606 } 3559d30ea906Sjfb8856606 3560d30ea906Sjfb8856606 static int 3561d30ea906Sjfb8856606 interrupt_tc(void) 3562d30ea906Sjfb8856606 { 3563d30ea906Sjfb8856606 return run_test_case(throughput_test); 3564d30ea906Sjfb8856606 } 3565d30ea906Sjfb8856606 3566d30ea906Sjfb8856606 static struct unit_test_suite bbdev_throughput_testsuite = { 3567d30ea906Sjfb8856606 .suite_name = "BBdev Throughput Tests", 3568d30ea906Sjfb8856606 .setup = testsuite_setup, 3569d30ea906Sjfb8856606 .teardown = testsuite_teardown, 3570d30ea906Sjfb8856606 .unit_test_cases = { 3571d30ea906Sjfb8856606 TEST_CASE_ST(ut_setup, ut_teardown, throughput_tc), 3572d30ea906Sjfb8856606 TEST_CASES_END() /**< NULL terminate unit test array */ 3573d30ea906Sjfb8856606 } 3574d30ea906Sjfb8856606 }; 3575d30ea906Sjfb8856606 3576d30ea906Sjfb8856606 static struct unit_test_suite bbdev_validation_testsuite = { 3577d30ea906Sjfb8856606 .suite_name = "BBdev Validation Tests", 3578d30ea906Sjfb8856606 .setup = testsuite_setup, 3579d30ea906Sjfb8856606 .teardown = testsuite_teardown, 3580d30ea906Sjfb8856606 .unit_test_cases = { 3581d30ea906Sjfb8856606 TEST_CASE_ST(ut_setup, ut_teardown, latency_tc), 3582d30ea906Sjfb8856606 TEST_CASES_END() /**< NULL terminate unit test array */ 3583d30ea906Sjfb8856606 } 3584d30ea906Sjfb8856606 }; 3585d30ea906Sjfb8856606 3586d30ea906Sjfb8856606 static struct unit_test_suite bbdev_latency_testsuite = { 3587d30ea906Sjfb8856606 .suite_name = "BBdev Latency Tests", 3588d30ea906Sjfb8856606 .setup = testsuite_setup, 3589d30ea906Sjfb8856606 .teardown = testsuite_teardown, 3590d30ea906Sjfb8856606 .unit_test_cases = { 3591d30ea906Sjfb8856606 TEST_CASE_ST(ut_setup, ut_teardown, latency_tc), 3592d30ea906Sjfb8856606 TEST_CASES_END() /**< NULL terminate unit test array */ 3593d30ea906Sjfb8856606 } 3594d30ea906Sjfb8856606 }; 3595d30ea906Sjfb8856606 3596d30ea906Sjfb8856606 static struct unit_test_suite bbdev_offload_cost_testsuite = { 3597d30ea906Sjfb8856606 .suite_name = "BBdev Offload Cost Tests", 3598d30ea906Sjfb8856606 .setup = testsuite_setup, 3599d30ea906Sjfb8856606 .teardown = testsuite_teardown, 3600d30ea906Sjfb8856606 .unit_test_cases = { 3601d30ea906Sjfb8856606 TEST_CASE_ST(ut_setup, ut_teardown, offload_cost_tc), 3602d30ea906Sjfb8856606 TEST_CASE_ST(ut_setup, ut_teardown, offload_latency_empty_q_tc), 3603d30ea906Sjfb8856606 TEST_CASES_END() /**< NULL terminate unit test array */ 3604d30ea906Sjfb8856606 } 3605d30ea906Sjfb8856606 }; 3606d30ea906Sjfb8856606 3607d30ea906Sjfb8856606 static struct unit_test_suite bbdev_interrupt_testsuite = { 3608d30ea906Sjfb8856606 .suite_name = "BBdev Interrupt Tests", 3609d30ea906Sjfb8856606 .setup = interrupt_testsuite_setup, 3610d30ea906Sjfb8856606 .teardown = testsuite_teardown, 3611d30ea906Sjfb8856606 .unit_test_cases = { 3612d30ea906Sjfb8856606 TEST_CASE_ST(ut_setup, ut_teardown, interrupt_tc), 3613d30ea906Sjfb8856606 TEST_CASES_END() /**< NULL terminate unit test array */ 3614d30ea906Sjfb8856606 } 3615d30ea906Sjfb8856606 }; 3616d30ea906Sjfb8856606 3617d30ea906Sjfb8856606 REGISTER_TEST_COMMAND(throughput, bbdev_throughput_testsuite); 3618d30ea906Sjfb8856606 REGISTER_TEST_COMMAND(validation, bbdev_validation_testsuite); 3619d30ea906Sjfb8856606 REGISTER_TEST_COMMAND(latency, bbdev_latency_testsuite); 3620d30ea906Sjfb8856606 REGISTER_TEST_COMMAND(offload, bbdev_offload_cost_testsuite); 3621d30ea906Sjfb8856606 REGISTER_TEST_COMMAND(interrupt, bbdev_interrupt_testsuite); 3622