1f714a188SAmr Mokhtar /* SPDX-License-Identifier: BSD-3-Clause 2f714a188SAmr Mokhtar * Copyright(c) 2017 Intel Corporation 3f714a188SAmr Mokhtar */ 4f714a188SAmr Mokhtar 5f714a188SAmr Mokhtar #include <stdio.h> 672b452c5SDmitry Kozlyuk #include <stdlib.h> 7f714a188SAmr Mokhtar #include <inttypes.h> 847d5a049SKamil Chalupnik #include <math.h> 9f714a188SAmr Mokhtar 10f714a188SAmr Mokhtar #include <rte_eal.h> 11f714a188SAmr Mokhtar #include <rte_common.h> 12f714a188SAmr Mokhtar #include <rte_dev.h> 13f714a188SAmr Mokhtar #include <rte_launch.h> 14f714a188SAmr Mokhtar #include <rte_bbdev.h> 15f714a188SAmr Mokhtar #include <rte_cycles.h> 16f714a188SAmr Mokhtar #include <rte_lcore.h> 17f714a188SAmr Mokhtar #include <rte_malloc.h> 18f714a188SAmr Mokhtar #include <rte_random.h> 19f714a188SAmr Mokhtar #include <rte_hexdump.h> 20d819c083SNicolas Chautru #include <rte_interrupts.h> 21d819c083SNicolas Chautru 22f714a188SAmr Mokhtar #include "main.h" 23f714a188SAmr Mokhtar #include "test_bbdev_vector.h" 24f714a188SAmr Mokhtar 25f714a188SAmr Mokhtar #define GET_SOCKET(socket_id) (((socket_id) == SOCKET_ID_ANY) ? 0 : (socket_id)) 26f714a188SAmr Mokhtar 27f714a188SAmr Mokhtar #define MAX_QUEUES RTE_MAX_LCORE 282ad0b152SNicolas Chautru #define TEST_REPETITIONS 100 29e49b23ddSNicolas Chautru #define TIME_OUT_POLL 1e9 305c3f7fc5SNicolas Chautru #define WAIT_OFFLOAD_US 1000 31f714a188SAmr Mokhtar 32a8d0d473SBruce Richardson #ifdef RTE_BASEBAND_FPGA_LTE_FEC 339f17582cSNicolas Chautru #include <fpga_lte_fec.h> 349f17582cSNicolas Chautru #define FPGA_LTE_PF_DRIVER_NAME ("intel_fpga_lte_fec_pf") 359f17582cSNicolas Chautru #define FPGA_LTE_VF_DRIVER_NAME ("intel_fpga_lte_fec_vf") 369f17582cSNicolas Chautru #define VF_UL_4G_QUEUE_VALUE 4 379f17582cSNicolas Chautru #define VF_DL_4G_QUEUE_VALUE 4 389f17582cSNicolas Chautru #define UL_4G_BANDWIDTH 3 399f17582cSNicolas Chautru #define DL_4G_BANDWIDTH 3 409f17582cSNicolas Chautru #define UL_4G_LOAD_BALANCE 128 419f17582cSNicolas Chautru #define DL_4G_LOAD_BALANCE 128 429f17582cSNicolas Chautru #define FLR_4G_TIMEOUT 610 43d819c083SNicolas Chautru #endif 44d819c083SNicolas Chautru 45a8d0d473SBruce Richardson #ifdef RTE_BASEBAND_FPGA_5GNR_FEC 462d430643SNicolas Chautru #include <rte_pmd_fpga_5gnr_fec.h> 472d430643SNicolas Chautru #define FPGA_5GNR_PF_DRIVER_NAME ("intel_fpga_5gnr_fec_pf") 482d430643SNicolas Chautru #define FPGA_5GNR_VF_DRIVER_NAME ("intel_fpga_5gnr_fec_vf") 492d430643SNicolas Chautru #define VF_UL_5G_QUEUE_VALUE 4 502d430643SNicolas Chautru #define VF_DL_5G_QUEUE_VALUE 4 512d430643SNicolas Chautru #define UL_5G_BANDWIDTH 3 522d430643SNicolas Chautru #define DL_5G_BANDWIDTH 3 532d430643SNicolas Chautru #define UL_5G_LOAD_BALANCE 128 542d430643SNicolas Chautru #define DL_5G_LOAD_BALANCE 128 552d430643SNicolas Chautru #endif 562d430643SNicolas Chautru 57dcf43d24SNicolas Chautru #ifdef RTE_BASEBAND_ACC 58c1407bfaSNicolas Chautru #include <rte_acc_cfg.h> 59b17d7092SNicolas Chautru #define ACC100PF_DRIVER_NAME ("intel_acc100_pf") 60b17d7092SNicolas Chautru #define ACC100VF_DRIVER_NAME ("intel_acc100_vf") 61b17d7092SNicolas Chautru #define ACC100_QMGR_NUM_AQS 16 62b17d7092SNicolas Chautru #define ACC100_QMGR_NUM_QGS 2 63b17d7092SNicolas Chautru #define ACC100_QMGR_AQ_DEPTH 5 64b17d7092SNicolas Chautru #define ACC100_QMGR_INVALID_IDX -1 65b17d7092SNicolas Chautru #define ACC100_QMGR_RR 1 66b17d7092SNicolas Chautru #define ACC100_QOS_GBR 0 6761e02ccbSNicolas Chautru #define VRBPF_DRIVER_NAME ("intel_vran_boost_pf") 6861e02ccbSNicolas Chautru #define VRBVF_DRIVER_NAME ("intel_vran_boost_vf") 6961e02ccbSNicolas Chautru #define VRB_QMGR_NUM_AQS 16 7061e02ccbSNicolas Chautru #define VRB_QMGR_NUM_QGS 2 7161e02ccbSNicolas Chautru #define VRB_QMGR_AQ_DEPTH 5 7261e02ccbSNicolas Chautru #define VRB_QMGR_INVALID_IDX -1 7361e02ccbSNicolas Chautru #define VRB_QMGR_RR 1 7461e02ccbSNicolas Chautru #define VRB_QOS_GBR 0 75b17d7092SNicolas Chautru #endif 76b17d7092SNicolas Chautru 77f714a188SAmr Mokhtar #define OPS_CACHE_SIZE 256U 78f714a188SAmr Mokhtar #define OPS_POOL_SIZE_MIN 511U /* 0.5K per queue */ 79f714a188SAmr Mokhtar 80f714a188SAmr Mokhtar #define SYNC_WAIT 0 81f714a188SAmr Mokhtar #define SYNC_START 1 82f714a188SAmr Mokhtar 83f714a188SAmr Mokhtar #define INVALID_QUEUE_ID -1 84335c11fdSNicolas Chautru /* Increment for next code block in external HARQ memory */ 85335c11fdSNicolas Chautru #define HARQ_INCR 32768 86335c11fdSNicolas Chautru /* Headroom for filler LLRs insertion in HARQ buffer */ 87bee9ac50SHernan Vargas #define FILLER_HEADROOM 2048 88335c11fdSNicolas Chautru /* Constants from K0 computation from 3GPP 38.212 Table 5.4.2.1-2 */ 89335c11fdSNicolas Chautru #define N_ZC_1 66 /* N = 66 Zc for BG 1 */ 90335c11fdSNicolas Chautru #define N_ZC_2 50 /* N = 50 Zc for BG 2 */ 91335c11fdSNicolas Chautru #define K0_1_1 17 /* K0 fraction numerator for rv 1 and BG 1 */ 92335c11fdSNicolas Chautru #define K0_1_2 13 /* K0 fraction numerator for rv 1 and BG 2 */ 93335c11fdSNicolas Chautru #define K0_2_1 33 /* K0 fraction numerator for rv 2 and BG 1 */ 94335c11fdSNicolas Chautru #define K0_2_2 25 /* K0 fraction numerator for rv 2 and BG 2 */ 95335c11fdSNicolas Chautru #define K0_3_1 56 /* K0 fraction numerator for rv 3 and BG 1 */ 96335c11fdSNicolas Chautru #define K0_3_2 43 /* K0 fraction numerator for rv 3 and BG 2 */ 970de3cb95SHernan Vargas #define NUM_SC_PER_RB (12) /* Number of subcarriers in a RB in 3GPP. */ 980de3cb95SHernan Vargas #define BITS_PER_LLR (8) /* Number of bits in a LLR. */ 99f714a188SAmr Mokhtar 10039b601c4SHernan Vargas #define HARQ_MEM_TOLERANCE 256 101f714a188SAmr Mokhtar static struct test_bbdev_vector test_vector; 102f714a188SAmr Mokhtar 103f714a188SAmr Mokhtar /* Switch between PMD and Interrupt for throughput TC */ 104f714a188SAmr Mokhtar static bool intr_enabled; 105f714a188SAmr Mokhtar 106335c11fdSNicolas Chautru /* LLR arithmetic representation for numerical conversion */ 107335c11fdSNicolas Chautru static int ldpc_llr_decimals; 108335c11fdSNicolas Chautru static int ldpc_llr_size; 109335c11fdSNicolas Chautru /* Keep track of the LDPC decoder device capability flag */ 110335c11fdSNicolas Chautru static uint32_t ldpc_cap_flags; 111a2ea86cbSHernan Vargas /* FFT window width predefined on device and on vector. */ 112a2ea86cbSHernan Vargas static int fft_window_width_dev; 113335c11fdSNicolas Chautru 114067fae41SNicolas Chautru bool dump_ops = true; 115067fae41SNicolas Chautru 116f714a188SAmr Mokhtar /* Represents tested active devices */ 117f714a188SAmr Mokhtar static struct active_device { 118f714a188SAmr Mokhtar const char *driver_name; 119f714a188SAmr Mokhtar uint8_t dev_id; 120f714a188SAmr Mokhtar uint16_t supported_ops; 121f714a188SAmr Mokhtar uint16_t queue_ids[MAX_QUEUES]; 122f714a188SAmr Mokhtar uint16_t nb_queues; 123f714a188SAmr Mokhtar struct rte_mempool *ops_mempool; 124f714a188SAmr Mokhtar struct rte_mempool *in_mbuf_pool; 125f714a188SAmr Mokhtar struct rte_mempool *hard_out_mbuf_pool; 126f714a188SAmr Mokhtar struct rte_mempool *soft_out_mbuf_pool; 127d819c083SNicolas Chautru struct rte_mempool *harq_in_mbuf_pool; 128d819c083SNicolas Chautru struct rte_mempool *harq_out_mbuf_pool; 129f714a188SAmr Mokhtar } active_devs[RTE_BBDEV_MAX_DEVS]; 130f714a188SAmr Mokhtar 131f714a188SAmr Mokhtar static uint8_t nb_active_devs; 132f714a188SAmr Mokhtar 133f714a188SAmr Mokhtar /* Data buffers used by BBDEV ops */ 134f714a188SAmr Mokhtar struct test_buffers { 135f714a188SAmr Mokhtar struct rte_bbdev_op_data *inputs; 136f714a188SAmr Mokhtar struct rte_bbdev_op_data *hard_outputs; 137f714a188SAmr Mokhtar struct rte_bbdev_op_data *soft_outputs; 138d819c083SNicolas Chautru struct rte_bbdev_op_data *harq_inputs; 139d819c083SNicolas Chautru struct rte_bbdev_op_data *harq_outputs; 140f714a188SAmr Mokhtar }; 141f714a188SAmr Mokhtar 142f714a188SAmr Mokhtar /* Operation parameters specific for given test case */ 143f714a188SAmr Mokhtar struct test_op_params { 144f714a188SAmr Mokhtar struct rte_mempool *mp; 145f714a188SAmr Mokhtar struct rte_bbdev_dec_op *ref_dec_op; 146f714a188SAmr Mokhtar struct rte_bbdev_enc_op *ref_enc_op; 1470acdb986SNicolas Chautru struct rte_bbdev_fft_op *ref_fft_op; 14895f192a4SHernan Vargas struct rte_bbdev_mldts_op *ref_mldts_op; 149f714a188SAmr Mokhtar uint16_t burst_sz; 150f714a188SAmr Mokhtar uint16_t num_to_process; 151f714a188SAmr Mokhtar uint16_t num_lcores; 152f714a188SAmr Mokhtar int vector_mask; 153b6a7e685STyler Retzlaff RTE_ATOMIC(uint16_t) sync; 154f714a188SAmr Mokhtar struct test_buffers q_bufs[RTE_MAX_NUMA_NODES][MAX_QUEUES]; 155f714a188SAmr Mokhtar }; 156f714a188SAmr Mokhtar 157f714a188SAmr Mokhtar /* Contains per lcore params */ 158f714a188SAmr Mokhtar struct thread_params { 159f714a188SAmr Mokhtar uint8_t dev_id; 160f714a188SAmr Mokhtar uint16_t queue_id; 161b2e2aec3SKamil Chalupnik uint32_t lcore_id; 162f714a188SAmr Mokhtar uint64_t start_time; 1630b98d574SKamil Chalupnik double ops_per_sec; 164f714a188SAmr Mokhtar double mbps; 1650b98d574SKamil Chalupnik uint8_t iter_count; 166f41c6e4dSNicolas Chautru double iter_average; 167f41c6e4dSNicolas Chautru double bler; 168b6a7e685STyler Retzlaff RTE_ATOMIC(uint16_t) nb_dequeued; 169b6a7e685STyler Retzlaff RTE_ATOMIC(int16_t) processing_status; 170b6a7e685STyler Retzlaff RTE_ATOMIC(uint16_t) burst_sz; 171f714a188SAmr Mokhtar struct test_op_params *op_params; 172b2e2aec3SKamil Chalupnik struct rte_bbdev_dec_op *dec_ops[MAX_BURST]; 173b2e2aec3SKamil Chalupnik struct rte_bbdev_enc_op *enc_ops[MAX_BURST]; 1740acdb986SNicolas Chautru struct rte_bbdev_fft_op *fft_ops[MAX_BURST]; 17595f192a4SHernan Vargas struct rte_bbdev_mldts_op *mldts_ops[MAX_BURST]; 176f714a188SAmr Mokhtar }; 177f714a188SAmr Mokhtar 178864edd69SKamil Chalupnik /* Stores time statistics */ 179864edd69SKamil Chalupnik struct test_time_stats { 180864edd69SKamil Chalupnik /* Stores software enqueue total working time */ 1819fa6ebdeSKamil Chalupnik uint64_t enq_sw_total_time; 182864edd69SKamil Chalupnik /* Stores minimum value of software enqueue working time */ 183864edd69SKamil Chalupnik uint64_t enq_sw_min_time; 184864edd69SKamil Chalupnik /* Stores maximum value of software enqueue working time */ 185864edd69SKamil Chalupnik uint64_t enq_sw_max_time; 186864edd69SKamil Chalupnik /* Stores turbo enqueue total working time */ 1879fa6ebdeSKamil Chalupnik uint64_t enq_acc_total_time; 1889fa6ebdeSKamil Chalupnik /* Stores minimum value of accelerator enqueue working time */ 1899fa6ebdeSKamil Chalupnik uint64_t enq_acc_min_time; 1909fa6ebdeSKamil Chalupnik /* Stores maximum value of accelerator enqueue working time */ 1919fa6ebdeSKamil Chalupnik uint64_t enq_acc_max_time; 192864edd69SKamil Chalupnik /* Stores dequeue total working time */ 1939fa6ebdeSKamil Chalupnik uint64_t deq_total_time; 194864edd69SKamil Chalupnik /* Stores minimum value of dequeue working time */ 195864edd69SKamil Chalupnik uint64_t deq_min_time; 196864edd69SKamil Chalupnik /* Stores maximum value of dequeue working time */ 197864edd69SKamil Chalupnik uint64_t deq_max_time; 198864edd69SKamil Chalupnik }; 199864edd69SKamil Chalupnik 200f714a188SAmr Mokhtar typedef int (test_case_function)(struct active_device *ad, 201f714a188SAmr Mokhtar struct test_op_params *op_params); 202f714a188SAmr Mokhtar 203fb5e060eSHernan Vargas /* Get device status before timeout exit */ 204fb5e060eSHernan Vargas static inline void 205fb5e060eSHernan Vargas timeout_exit(uint8_t dev_id) 206fb5e060eSHernan Vargas { 207fb5e060eSHernan Vargas struct rte_bbdev_info info; 208fb5e060eSHernan Vargas rte_bbdev_info_get(dev_id, &info); 209fb5e060eSHernan Vargas printf("Device Status %s\n", rte_bbdev_device_status_str(info.drv.device_status)); 210fb5e060eSHernan Vargas } 211fb5e060eSHernan Vargas 212f714a188SAmr Mokhtar static inline void 2139585f8b1SKamil Chalupnik mbuf_reset(struct rte_mbuf *m) 2149585f8b1SKamil Chalupnik { 2159585f8b1SKamil Chalupnik m->pkt_len = 0; 2169585f8b1SKamil Chalupnik 2179585f8b1SKamil Chalupnik do { 2189585f8b1SKamil Chalupnik m->data_len = 0; 2199585f8b1SKamil Chalupnik m = m->next; 2209585f8b1SKamil Chalupnik } while (m != NULL); 2219585f8b1SKamil Chalupnik } 2229585f8b1SKamil Chalupnik 223d819c083SNicolas Chautru /* Read flag value 0/1 from bitmap */ 224d819c083SNicolas Chautru static inline bool 225d819c083SNicolas Chautru check_bit(uint32_t bitmap, uint32_t bitmask) 226d819c083SNicolas Chautru { 227d819c083SNicolas Chautru return bitmap & bitmask; 228d819c083SNicolas Chautru } 229d819c083SNicolas Chautru 2309585f8b1SKamil Chalupnik static inline void 231f714a188SAmr Mokhtar set_avail_op(struct active_device *ad, enum rte_bbdev_op_type op_type) 232f714a188SAmr Mokhtar { 233f714a188SAmr Mokhtar ad->supported_ops |= (1 << op_type); 234f714a188SAmr Mokhtar } 235f714a188SAmr Mokhtar 236f714a188SAmr Mokhtar static inline bool 237f714a188SAmr Mokhtar is_avail_op(struct active_device *ad, enum rte_bbdev_op_type op_type) 238f714a188SAmr Mokhtar { 239f714a188SAmr Mokhtar return ad->supported_ops & (1 << op_type); 240f714a188SAmr Mokhtar } 241f714a188SAmr Mokhtar 242f714a188SAmr Mokhtar static inline bool 243f714a188SAmr Mokhtar flags_match(uint32_t flags_req, uint32_t flags_present) 244f714a188SAmr Mokhtar { 245f714a188SAmr Mokhtar return (flags_req & flags_present) == flags_req; 246f714a188SAmr Mokhtar } 247f714a188SAmr Mokhtar 248f714a188SAmr Mokhtar static void 249f714a188SAmr Mokhtar clear_soft_out_cap(uint32_t *op_flags) 250f714a188SAmr Mokhtar { 251f714a188SAmr Mokhtar *op_flags &= ~RTE_BBDEV_TURBO_SOFT_OUTPUT; 252f714a188SAmr Mokhtar *op_flags &= ~RTE_BBDEV_TURBO_POS_LLR_1_BIT_SOFT_OUT; 253f714a188SAmr Mokhtar *op_flags &= ~RTE_BBDEV_TURBO_NEG_LLR_1_BIT_SOFT_OUT; 254f714a188SAmr Mokhtar } 255f714a188SAmr Mokhtar 256441ac2e0SNipun Gupta /* This API is to convert all the test vector op data entries 257441ac2e0SNipun Gupta * to big endian format. It is used when the device supports 258441ac2e0SNipun Gupta * the input in the big endian format. 259441ac2e0SNipun Gupta */ 260441ac2e0SNipun Gupta static inline void 261441ac2e0SNipun Gupta convert_op_data_to_be(void) 262441ac2e0SNipun Gupta { 263441ac2e0SNipun Gupta struct op_data_entries *op; 264441ac2e0SNipun Gupta enum op_data_type type; 265441ac2e0SNipun Gupta uint8_t nb_segs, *rem_data, temp; 266441ac2e0SNipun Gupta uint32_t *data, len; 267441ac2e0SNipun Gupta int complete, rem, i, j; 268441ac2e0SNipun Gupta 269441ac2e0SNipun Gupta for (type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) { 270441ac2e0SNipun Gupta nb_segs = test_vector.entries[type].nb_segments; 271441ac2e0SNipun Gupta op = &test_vector.entries[type]; 272441ac2e0SNipun Gupta 273441ac2e0SNipun Gupta /* Invert byte endianness for all the segments */ 274441ac2e0SNipun Gupta for (i = 0; i < nb_segs; ++i) { 275441ac2e0SNipun Gupta len = op->segments[i].length; 276441ac2e0SNipun Gupta data = op->segments[i].addr; 277441ac2e0SNipun Gupta 278441ac2e0SNipun Gupta /* Swap complete u32 bytes */ 279441ac2e0SNipun Gupta complete = len / 4; 280441ac2e0SNipun Gupta for (j = 0; j < complete; j++) 281441ac2e0SNipun Gupta data[j] = rte_bswap32(data[j]); 282441ac2e0SNipun Gupta 283441ac2e0SNipun Gupta /* Swap any remaining bytes */ 284441ac2e0SNipun Gupta rem = len % 4; 285441ac2e0SNipun Gupta rem_data = (uint8_t *)&data[j]; 286441ac2e0SNipun Gupta for (j = 0; j < rem/2; j++) { 287441ac2e0SNipun Gupta temp = rem_data[j]; 288441ac2e0SNipun Gupta rem_data[j] = rem_data[rem - j - 1]; 289441ac2e0SNipun Gupta rem_data[rem - j - 1] = temp; 290441ac2e0SNipun Gupta } 291441ac2e0SNipun Gupta } 292441ac2e0SNipun Gupta } 293441ac2e0SNipun Gupta } 294441ac2e0SNipun Gupta 295f714a188SAmr Mokhtar static int 296f714a188SAmr Mokhtar check_dev_cap(const struct rte_bbdev_info *dev_info) 297f714a188SAmr Mokhtar { 298f714a188SAmr Mokhtar unsigned int i; 299d819c083SNicolas Chautru unsigned int nb_inputs, nb_soft_outputs, nb_hard_outputs, 300d819c083SNicolas Chautru nb_harq_inputs, nb_harq_outputs; 301f714a188SAmr Mokhtar const struct rte_bbdev_op_cap *op_cap = dev_info->drv.capabilities; 302441ac2e0SNipun Gupta uint8_t dev_data_endianness = dev_info->drv.data_endianness; 303f714a188SAmr Mokhtar 304f714a188SAmr Mokhtar nb_inputs = test_vector.entries[DATA_INPUT].nb_segments; 305f714a188SAmr Mokhtar nb_soft_outputs = test_vector.entries[DATA_SOFT_OUTPUT].nb_segments; 306f714a188SAmr Mokhtar nb_hard_outputs = test_vector.entries[DATA_HARD_OUTPUT].nb_segments; 307d819c083SNicolas Chautru nb_harq_inputs = test_vector.entries[DATA_HARQ_INPUT].nb_segments; 308d819c083SNicolas Chautru nb_harq_outputs = test_vector.entries[DATA_HARQ_OUTPUT].nb_segments; 309f714a188SAmr Mokhtar 310f714a188SAmr Mokhtar for (i = 0; op_cap->type != RTE_BBDEV_OP_NONE; ++i, ++op_cap) { 311f714a188SAmr Mokhtar if (op_cap->type != test_vector.op_type) 312f714a188SAmr Mokhtar continue; 313f714a188SAmr Mokhtar 314441ac2e0SNipun Gupta if (dev_data_endianness == RTE_BIG_ENDIAN) 315441ac2e0SNipun Gupta convert_op_data_to_be(); 316441ac2e0SNipun Gupta 317f714a188SAmr Mokhtar if (op_cap->type == RTE_BBDEV_OP_TURBO_DEC) { 318f714a188SAmr Mokhtar const struct rte_bbdev_op_cap_turbo_dec *cap = 319f714a188SAmr Mokhtar &op_cap->cap.turbo_dec; 320f714a188SAmr Mokhtar /* Ignore lack of soft output capability, just skip 321f714a188SAmr Mokhtar * checking if soft output is valid. 322f714a188SAmr Mokhtar */ 323f714a188SAmr Mokhtar if ((test_vector.turbo_dec.op_flags & 324f714a188SAmr Mokhtar RTE_BBDEV_TURBO_SOFT_OUTPUT) && 325f714a188SAmr Mokhtar !(cap->capability_flags & 326f714a188SAmr Mokhtar RTE_BBDEV_TURBO_SOFT_OUTPUT)) { 327f714a188SAmr Mokhtar printf( 328d819c083SNicolas Chautru "INFO: Device \"%s\" does not support soft output - soft output flags will be ignored.\n", 329f714a188SAmr Mokhtar dev_info->dev_name); 330f714a188SAmr Mokhtar clear_soft_out_cap( 331f714a188SAmr Mokhtar &test_vector.turbo_dec.op_flags); 332f714a188SAmr Mokhtar } 333f714a188SAmr Mokhtar 334f714a188SAmr Mokhtar if (!flags_match(test_vector.turbo_dec.op_flags, 335f714a188SAmr Mokhtar cap->capability_flags)) 336f714a188SAmr Mokhtar return TEST_FAILED; 337f714a188SAmr Mokhtar if (nb_inputs > cap->num_buffers_src) { 338f714a188SAmr Mokhtar printf("Too many inputs defined: %u, max: %u\n", 339f714a188SAmr Mokhtar nb_inputs, cap->num_buffers_src); 340f714a188SAmr Mokhtar return TEST_FAILED; 341f714a188SAmr Mokhtar } 342f714a188SAmr Mokhtar if (nb_soft_outputs > cap->num_buffers_soft_out && 343f714a188SAmr Mokhtar (test_vector.turbo_dec.op_flags & 344f714a188SAmr Mokhtar RTE_BBDEV_TURBO_SOFT_OUTPUT)) { 345f714a188SAmr Mokhtar printf( 346f714a188SAmr Mokhtar "Too many soft outputs defined: %u, max: %u\n", 347f714a188SAmr Mokhtar nb_soft_outputs, 348f714a188SAmr Mokhtar cap->num_buffers_soft_out); 349f714a188SAmr Mokhtar return TEST_FAILED; 350f714a188SAmr Mokhtar } 351f714a188SAmr Mokhtar if (nb_hard_outputs > cap->num_buffers_hard_out) { 352f714a188SAmr Mokhtar printf( 353f714a188SAmr Mokhtar "Too many hard outputs defined: %u, max: %u\n", 354f714a188SAmr Mokhtar nb_hard_outputs, 355f714a188SAmr Mokhtar cap->num_buffers_hard_out); 356f714a188SAmr Mokhtar return TEST_FAILED; 357f714a188SAmr Mokhtar } 358f714a188SAmr Mokhtar if (intr_enabled && !(cap->capability_flags & 359f714a188SAmr Mokhtar RTE_BBDEV_TURBO_DEC_INTERRUPTS)) { 360f714a188SAmr Mokhtar printf( 361f714a188SAmr Mokhtar "Dequeue interrupts are not supported!\n"); 362f714a188SAmr Mokhtar return TEST_FAILED; 363f714a188SAmr Mokhtar } 364f714a188SAmr Mokhtar 365f714a188SAmr Mokhtar return TEST_SUCCESS; 366f714a188SAmr Mokhtar } else if (op_cap->type == RTE_BBDEV_OP_TURBO_ENC) { 367f714a188SAmr Mokhtar const struct rte_bbdev_op_cap_turbo_enc *cap = 368f714a188SAmr Mokhtar &op_cap->cap.turbo_enc; 369f714a188SAmr Mokhtar 370f714a188SAmr Mokhtar if (!flags_match(test_vector.turbo_enc.op_flags, 371f714a188SAmr Mokhtar cap->capability_flags)) 372f714a188SAmr Mokhtar return TEST_FAILED; 373f714a188SAmr Mokhtar if (nb_inputs > cap->num_buffers_src) { 374f714a188SAmr Mokhtar printf("Too many inputs defined: %u, max: %u\n", 375f714a188SAmr Mokhtar nb_inputs, cap->num_buffers_src); 376f714a188SAmr Mokhtar return TEST_FAILED; 377f714a188SAmr Mokhtar } 378f714a188SAmr Mokhtar if (nb_hard_outputs > cap->num_buffers_dst) { 379f714a188SAmr Mokhtar printf( 380f714a188SAmr Mokhtar "Too many hard outputs defined: %u, max: %u\n", 381d819c083SNicolas Chautru nb_hard_outputs, cap->num_buffers_dst); 382f714a188SAmr Mokhtar return TEST_FAILED; 383f714a188SAmr Mokhtar } 384f714a188SAmr Mokhtar if (intr_enabled && !(cap->capability_flags & 385f714a188SAmr Mokhtar RTE_BBDEV_TURBO_ENC_INTERRUPTS)) { 386f714a188SAmr Mokhtar printf( 387f714a188SAmr Mokhtar "Dequeue interrupts are not supported!\n"); 388f714a188SAmr Mokhtar return TEST_FAILED; 389f714a188SAmr Mokhtar } 390f714a188SAmr Mokhtar 391f714a188SAmr Mokhtar return TEST_SUCCESS; 392d819c083SNicolas Chautru } else if (op_cap->type == RTE_BBDEV_OP_LDPC_ENC) { 393d819c083SNicolas Chautru const struct rte_bbdev_op_cap_ldpc_enc *cap = 394d819c083SNicolas Chautru &op_cap->cap.ldpc_enc; 395d819c083SNicolas Chautru 396d819c083SNicolas Chautru if (!flags_match(test_vector.ldpc_enc.op_flags, 397d819c083SNicolas Chautru cap->capability_flags)){ 398d819c083SNicolas Chautru printf("Flag Mismatch\n"); 399d819c083SNicolas Chautru return TEST_FAILED; 400d819c083SNicolas Chautru } 401d819c083SNicolas Chautru if (nb_inputs > cap->num_buffers_src) { 402d819c083SNicolas Chautru printf("Too many inputs defined: %u, max: %u\n", 403d819c083SNicolas Chautru nb_inputs, cap->num_buffers_src); 404d819c083SNicolas Chautru return TEST_FAILED; 405d819c083SNicolas Chautru } 406d819c083SNicolas Chautru if (nb_hard_outputs > cap->num_buffers_dst) { 407d819c083SNicolas Chautru printf( 408d819c083SNicolas Chautru "Too many hard outputs defined: %u, max: %u\n", 409d819c083SNicolas Chautru nb_hard_outputs, cap->num_buffers_dst); 410d819c083SNicolas Chautru return TEST_FAILED; 411d819c083SNicolas Chautru } 412d819c083SNicolas Chautru if (intr_enabled && !(cap->capability_flags & 413335c11fdSNicolas Chautru RTE_BBDEV_LDPC_ENC_INTERRUPTS)) { 414d819c083SNicolas Chautru printf( 415d819c083SNicolas Chautru "Dequeue interrupts are not supported!\n"); 416d819c083SNicolas Chautru return TEST_FAILED; 417d819c083SNicolas Chautru } 418d819c083SNicolas Chautru 419d819c083SNicolas Chautru return TEST_SUCCESS; 420d819c083SNicolas Chautru } else if (op_cap->type == RTE_BBDEV_OP_LDPC_DEC) { 421d819c083SNicolas Chautru const struct rte_bbdev_op_cap_ldpc_dec *cap = 422d819c083SNicolas Chautru &op_cap->cap.ldpc_dec; 423d819c083SNicolas Chautru 424d819c083SNicolas Chautru if (!flags_match(test_vector.ldpc_dec.op_flags, 425d819c083SNicolas Chautru cap->capability_flags)){ 426d819c083SNicolas Chautru printf("Flag Mismatch\n"); 427d819c083SNicolas Chautru return TEST_FAILED; 428d819c083SNicolas Chautru } 429d819c083SNicolas Chautru if (nb_inputs > cap->num_buffers_src) { 430d819c083SNicolas Chautru printf("Too many inputs defined: %u, max: %u\n", 431d819c083SNicolas Chautru nb_inputs, cap->num_buffers_src); 432d819c083SNicolas Chautru return TEST_FAILED; 433d819c083SNicolas Chautru } 434d819c083SNicolas Chautru if (nb_hard_outputs > cap->num_buffers_hard_out) { 435d819c083SNicolas Chautru printf( 436d819c083SNicolas Chautru "Too many hard outputs defined: %u, max: %u\n", 437d819c083SNicolas Chautru nb_hard_outputs, 438d819c083SNicolas Chautru cap->num_buffers_hard_out); 439d819c083SNicolas Chautru return TEST_FAILED; 440d819c083SNicolas Chautru } 441d819c083SNicolas Chautru if (nb_harq_inputs > cap->num_buffers_hard_out) { 442d819c083SNicolas Chautru printf( 443d819c083SNicolas Chautru "Too many HARQ inputs defined: %u, max: %u\n", 44449ca9e5aSMin Hu (Connor) nb_harq_inputs, 445d819c083SNicolas Chautru cap->num_buffers_hard_out); 446d819c083SNicolas Chautru return TEST_FAILED; 447d819c083SNicolas Chautru } 448d819c083SNicolas Chautru if (nb_harq_outputs > cap->num_buffers_hard_out) { 449d819c083SNicolas Chautru printf( 450d819c083SNicolas Chautru "Too many HARQ outputs defined: %u, max: %u\n", 45149ca9e5aSMin Hu (Connor) nb_harq_outputs, 452d819c083SNicolas Chautru cap->num_buffers_hard_out); 453d819c083SNicolas Chautru return TEST_FAILED; 454d819c083SNicolas Chautru } 455d819c083SNicolas Chautru if (intr_enabled && !(cap->capability_flags & 456335c11fdSNicolas Chautru RTE_BBDEV_LDPC_DEC_INTERRUPTS)) { 457d819c083SNicolas Chautru printf( 458d819c083SNicolas Chautru "Dequeue interrupts are not supported!\n"); 459d819c083SNicolas Chautru return TEST_FAILED; 460d819c083SNicolas Chautru } 461335c11fdSNicolas Chautru if (intr_enabled && (test_vector.ldpc_dec.op_flags & 462335c11fdSNicolas Chautru (RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE | 463335c11fdSNicolas Chautru RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE | 464335c11fdSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK 465335c11fdSNicolas Chautru ))) { 466335c11fdSNicolas Chautru printf("Skip loop-back with interrupt\n"); 467335c11fdSNicolas Chautru return TEST_FAILED; 468335c11fdSNicolas Chautru } 469d819c083SNicolas Chautru return TEST_SUCCESS; 4700acdb986SNicolas Chautru } else if (op_cap->type == RTE_BBDEV_OP_FFT) { 4710acdb986SNicolas Chautru const struct rte_bbdev_op_cap_fft *cap = &op_cap->cap.fft; 4720acdb986SNicolas Chautru 4730acdb986SNicolas Chautru if (!flags_match(test_vector.fft.op_flags, cap->capability_flags)) { 4740acdb986SNicolas Chautru printf("Flag Mismatch\n"); 4750acdb986SNicolas Chautru return TEST_FAILED; 4760acdb986SNicolas Chautru } 4770acdb986SNicolas Chautru if (nb_inputs > cap->num_buffers_src) { 4780acdb986SNicolas Chautru printf("Too many inputs defined: %u, max: %u\n", 4790acdb986SNicolas Chautru nb_inputs, cap->num_buffers_src); 4800acdb986SNicolas Chautru return TEST_FAILED; 4810acdb986SNicolas Chautru } 4820acdb986SNicolas Chautru return TEST_SUCCESS; 48395f192a4SHernan Vargas } else if (op_cap->type == RTE_BBDEV_OP_MLDTS) { 48495f192a4SHernan Vargas const struct rte_bbdev_op_cap_mld *cap = &op_cap->cap.mld; 48595f192a4SHernan Vargas if (!flags_match(test_vector.mldts.op_flags, cap->capability_flags)) { 48695f192a4SHernan Vargas printf("Flag Mismatch\n"); 48795f192a4SHernan Vargas return TEST_FAILED; 48895f192a4SHernan Vargas } 48995f192a4SHernan Vargas if (nb_inputs > cap->num_buffers_src) { 49095f192a4SHernan Vargas printf("Too many inputs defined: %u, max: %u\n", 49195f192a4SHernan Vargas nb_inputs, cap->num_buffers_src); 49295f192a4SHernan Vargas return TEST_FAILED; 49395f192a4SHernan Vargas } 49495f192a4SHernan Vargas return TEST_SUCCESS; 495f714a188SAmr Mokhtar } 496f714a188SAmr Mokhtar } 497f714a188SAmr Mokhtar 498f714a188SAmr Mokhtar if ((i == 0) && (test_vector.op_type == RTE_BBDEV_OP_NONE)) 499f714a188SAmr Mokhtar return TEST_SUCCESS; /* Special case for NULL device */ 500f714a188SAmr Mokhtar 501f714a188SAmr Mokhtar return TEST_FAILED; 502f714a188SAmr Mokhtar } 503f714a188SAmr Mokhtar 504f714a188SAmr Mokhtar /* calculates optimal mempool size not smaller than the val */ 505f714a188SAmr Mokhtar static unsigned int 506f714a188SAmr Mokhtar optimal_mempool_size(unsigned int val) 507f714a188SAmr Mokhtar { 508f714a188SAmr Mokhtar return rte_align32pow2(val + 1) - 1; 509f714a188SAmr Mokhtar } 510f714a188SAmr Mokhtar 511f714a188SAmr Mokhtar /* allocates mbuf mempool for inputs and outputs */ 512f714a188SAmr Mokhtar static struct rte_mempool * 513f714a188SAmr Mokhtar create_mbuf_pool(struct op_data_entries *entries, uint8_t dev_id, 514f714a188SAmr Mokhtar int socket_id, unsigned int mbuf_pool_size, 515f714a188SAmr Mokhtar const char *op_type_str) 516f714a188SAmr Mokhtar { 517f714a188SAmr Mokhtar unsigned int i; 518f714a188SAmr Mokhtar uint32_t max_seg_sz = 0; 519f714a188SAmr Mokhtar char pool_name[RTE_MEMPOOL_NAMESIZE]; 520f714a188SAmr Mokhtar 521f714a188SAmr Mokhtar /* find max input segment size */ 522f714a188SAmr Mokhtar for (i = 0; i < entries->nb_segments; ++i) 523f714a188SAmr Mokhtar if (entries->segments[i].length > max_seg_sz) 524f714a188SAmr Mokhtar max_seg_sz = entries->segments[i].length; 525f714a188SAmr Mokhtar 526f714a188SAmr Mokhtar snprintf(pool_name, sizeof(pool_name), "%s_pool_%u", op_type_str, 527f714a188SAmr Mokhtar dev_id); 528f714a188SAmr Mokhtar return rte_pktmbuf_pool_create(pool_name, mbuf_pool_size, 0, 0, 529335c11fdSNicolas Chautru RTE_MAX(max_seg_sz + RTE_PKTMBUF_HEADROOM 530335c11fdSNicolas Chautru + FILLER_HEADROOM, 531f714a188SAmr Mokhtar (unsigned int)RTE_MBUF_DEFAULT_BUF_SIZE), socket_id); 532f714a188SAmr Mokhtar } 533f714a188SAmr Mokhtar 534f714a188SAmr Mokhtar static int 535f714a188SAmr Mokhtar create_mempools(struct active_device *ad, int socket_id, 536ad458935SKamil Chalupnik enum rte_bbdev_op_type org_op_type, uint16_t num_ops) 537f714a188SAmr Mokhtar { 538f714a188SAmr Mokhtar struct rte_mempool *mp; 539f714a188SAmr Mokhtar unsigned int ops_pool_size, mbuf_pool_size = 0; 540f714a188SAmr Mokhtar char pool_name[RTE_MEMPOOL_NAMESIZE]; 541f714a188SAmr Mokhtar const char *op_type_str; 542ad458935SKamil Chalupnik enum rte_bbdev_op_type op_type = org_op_type; 543f714a188SAmr Mokhtar 544f714a188SAmr Mokhtar struct op_data_entries *in = &test_vector.entries[DATA_INPUT]; 545f714a188SAmr Mokhtar struct op_data_entries *hard_out = 546f714a188SAmr Mokhtar &test_vector.entries[DATA_HARD_OUTPUT]; 547f714a188SAmr Mokhtar struct op_data_entries *soft_out = 548f714a188SAmr Mokhtar &test_vector.entries[DATA_SOFT_OUTPUT]; 549d819c083SNicolas Chautru struct op_data_entries *harq_in = 550d819c083SNicolas Chautru &test_vector.entries[DATA_HARQ_INPUT]; 551d819c083SNicolas Chautru struct op_data_entries *harq_out = 552d819c083SNicolas Chautru &test_vector.entries[DATA_HARQ_OUTPUT]; 553f714a188SAmr Mokhtar 554f714a188SAmr Mokhtar /* allocate ops mempool */ 555f714a188SAmr Mokhtar ops_pool_size = optimal_mempool_size(RTE_MAX( 556f714a188SAmr Mokhtar /* Ops used plus 1 reference op */ 557f714a188SAmr Mokhtar RTE_MAX((unsigned int)(ad->nb_queues * num_ops + 1), 558f714a188SAmr Mokhtar /* Minimal cache size plus 1 reference op */ 559f714a188SAmr Mokhtar (unsigned int)(1.5 * rte_lcore_count() * 560f714a188SAmr Mokhtar OPS_CACHE_SIZE + 1)), 561f714a188SAmr Mokhtar OPS_POOL_SIZE_MIN)); 562f714a188SAmr Mokhtar 563ad458935SKamil Chalupnik if (org_op_type == RTE_BBDEV_OP_NONE) 564ad458935SKamil Chalupnik op_type = RTE_BBDEV_OP_TURBO_ENC; 565ad458935SKamil Chalupnik 566f714a188SAmr Mokhtar op_type_str = rte_bbdev_op_type_str(op_type); 567f714a188SAmr Mokhtar TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); 568f714a188SAmr Mokhtar 569f714a188SAmr Mokhtar snprintf(pool_name, sizeof(pool_name), "%s_pool_%u", op_type_str, 570f714a188SAmr Mokhtar ad->dev_id); 571f714a188SAmr Mokhtar mp = rte_bbdev_op_pool_create(pool_name, op_type, 572f714a188SAmr Mokhtar ops_pool_size, OPS_CACHE_SIZE, socket_id); 573f714a188SAmr Mokhtar TEST_ASSERT_NOT_NULL(mp, 574f714a188SAmr Mokhtar "ERROR Failed to create %u items ops pool for dev %u on socket %u.", 575f714a188SAmr Mokhtar ops_pool_size, 576f714a188SAmr Mokhtar ad->dev_id, 577f714a188SAmr Mokhtar socket_id); 578f714a188SAmr Mokhtar ad->ops_mempool = mp; 579f714a188SAmr Mokhtar 580ad458935SKamil Chalupnik /* Do not create inputs and outputs mbufs for BaseBand Null Device */ 581ad458935SKamil Chalupnik if (org_op_type == RTE_BBDEV_OP_NONE) 582ad458935SKamil Chalupnik return TEST_SUCCESS; 583ad458935SKamil Chalupnik 584f714a188SAmr Mokhtar /* Inputs */ 585335c11fdSNicolas Chautru if (in->nb_segments > 0) { 586335c11fdSNicolas Chautru mbuf_pool_size = optimal_mempool_size(ops_pool_size * 587335c11fdSNicolas Chautru in->nb_segments); 588335c11fdSNicolas Chautru mp = create_mbuf_pool(in, ad->dev_id, socket_id, 589335c11fdSNicolas Chautru mbuf_pool_size, "in"); 590f714a188SAmr Mokhtar TEST_ASSERT_NOT_NULL(mp, 591f714a188SAmr Mokhtar "ERROR Failed to create %u items input pktmbuf pool for dev %u on socket %u.", 592f714a188SAmr Mokhtar mbuf_pool_size, 593f714a188SAmr Mokhtar ad->dev_id, 594f714a188SAmr Mokhtar socket_id); 595f714a188SAmr Mokhtar ad->in_mbuf_pool = mp; 596335c11fdSNicolas Chautru } 597f714a188SAmr Mokhtar 598f714a188SAmr Mokhtar /* Hard outputs */ 599335c11fdSNicolas Chautru if (hard_out->nb_segments > 0) { 600f714a188SAmr Mokhtar mbuf_pool_size = optimal_mempool_size(ops_pool_size * 601f714a188SAmr Mokhtar hard_out->nb_segments); 602335c11fdSNicolas Chautru mp = create_mbuf_pool(hard_out, ad->dev_id, socket_id, 603335c11fdSNicolas Chautru mbuf_pool_size, 604f714a188SAmr Mokhtar "hard_out"); 605f714a188SAmr Mokhtar TEST_ASSERT_NOT_NULL(mp, 606f714a188SAmr Mokhtar "ERROR Failed to create %u items hard output pktmbuf pool for dev %u on socket %u.", 607f714a188SAmr Mokhtar mbuf_pool_size, 608f714a188SAmr Mokhtar ad->dev_id, 609f714a188SAmr Mokhtar socket_id); 610f714a188SAmr Mokhtar ad->hard_out_mbuf_pool = mp; 611335c11fdSNicolas Chautru } 612f714a188SAmr Mokhtar 613f714a188SAmr Mokhtar /* Soft outputs */ 614d819c083SNicolas Chautru if (soft_out->nb_segments > 0) { 615f714a188SAmr Mokhtar mbuf_pool_size = optimal_mempool_size(ops_pool_size * 616f714a188SAmr Mokhtar soft_out->nb_segments); 617d819c083SNicolas Chautru mp = create_mbuf_pool(soft_out, ad->dev_id, socket_id, 618d819c083SNicolas Chautru mbuf_pool_size, 619f714a188SAmr Mokhtar "soft_out"); 620f714a188SAmr Mokhtar TEST_ASSERT_NOT_NULL(mp, 621f714a188SAmr Mokhtar "ERROR Failed to create %uB soft output pktmbuf pool for dev %u on socket %u.", 622f714a188SAmr Mokhtar mbuf_pool_size, 623f714a188SAmr Mokhtar ad->dev_id, 624f714a188SAmr Mokhtar socket_id); 625f714a188SAmr Mokhtar ad->soft_out_mbuf_pool = mp; 626d819c083SNicolas Chautru } 627f714a188SAmr Mokhtar 628d819c083SNicolas Chautru /* HARQ inputs */ 629d819c083SNicolas Chautru if (harq_in->nb_segments > 0) { 630d819c083SNicolas Chautru mbuf_pool_size = optimal_mempool_size(ops_pool_size * 631d819c083SNicolas Chautru harq_in->nb_segments); 632d819c083SNicolas Chautru mp = create_mbuf_pool(harq_in, ad->dev_id, socket_id, 633d819c083SNicolas Chautru mbuf_pool_size, 634d819c083SNicolas Chautru "harq_in"); 635d819c083SNicolas Chautru TEST_ASSERT_NOT_NULL(mp, 636d819c083SNicolas Chautru "ERROR Failed to create %uB harq input pktmbuf pool for dev %u on socket %u.", 637d819c083SNicolas Chautru mbuf_pool_size, 638d819c083SNicolas Chautru ad->dev_id, 639d819c083SNicolas Chautru socket_id); 640d819c083SNicolas Chautru ad->harq_in_mbuf_pool = mp; 641d819c083SNicolas Chautru } 642d819c083SNicolas Chautru 643d819c083SNicolas Chautru /* HARQ outputs */ 644d819c083SNicolas Chautru if (harq_out->nb_segments > 0) { 645d819c083SNicolas Chautru mbuf_pool_size = optimal_mempool_size(ops_pool_size * 646d819c083SNicolas Chautru harq_out->nb_segments); 647d819c083SNicolas Chautru mp = create_mbuf_pool(harq_out, ad->dev_id, socket_id, 648d819c083SNicolas Chautru mbuf_pool_size, 649d819c083SNicolas Chautru "harq_out"); 650d819c083SNicolas Chautru TEST_ASSERT_NOT_NULL(mp, 651d819c083SNicolas Chautru "ERROR Failed to create %uB harq output pktmbuf pool for dev %u on socket %u.", 652d819c083SNicolas Chautru mbuf_pool_size, 653d819c083SNicolas Chautru ad->dev_id, 654d819c083SNicolas Chautru socket_id); 655d819c083SNicolas Chautru ad->harq_out_mbuf_pool = mp; 656d819c083SNicolas Chautru } 657d819c083SNicolas Chautru 658d819c083SNicolas Chautru return TEST_SUCCESS; 659f714a188SAmr Mokhtar } 660f714a188SAmr Mokhtar 661f714a188SAmr Mokhtar static int 662f714a188SAmr Mokhtar add_bbdev_dev(uint8_t dev_id, struct rte_bbdev_info *info, 663f714a188SAmr Mokhtar struct test_bbdev_vector *vector) 664f714a188SAmr Mokhtar { 665f714a188SAmr Mokhtar int ret; 666f714a188SAmr Mokhtar unsigned int queue_id; 667f714a188SAmr Mokhtar struct rte_bbdev_queue_conf qconf; 668f714a188SAmr Mokhtar struct active_device *ad = &active_devs[nb_active_devs]; 669f714a188SAmr Mokhtar unsigned int nb_queues; 670f714a188SAmr Mokhtar enum rte_bbdev_op_type op_type = vector->op_type; 671f714a188SAmr Mokhtar 672d819c083SNicolas Chautru /* Configure fpga lte fec with PF & VF values 673d819c083SNicolas Chautru * if '-i' flag is set and using fpga device 674d819c083SNicolas Chautru */ 675a8d0d473SBruce Richardson #ifdef RTE_BASEBAND_FPGA_LTE_FEC 676d819c083SNicolas Chautru if ((get_init_device() == true) && 6779f17582cSNicolas Chautru (!strcmp(info->drv.driver_name, FPGA_LTE_PF_DRIVER_NAME))) { 678e6925585SMaxime Coquelin struct rte_fpga_lte_fec_conf conf; 679d819c083SNicolas Chautru unsigned int i; 680d819c083SNicolas Chautru 6819f17582cSNicolas Chautru printf("Configure FPGA LTE FEC Driver %s with default values\n", 682d819c083SNicolas Chautru info->drv.driver_name); 683d819c083SNicolas Chautru 684d819c083SNicolas Chautru /* clear default configuration before initialization */ 685e6925585SMaxime Coquelin memset(&conf, 0, sizeof(struct rte_fpga_lte_fec_conf)); 686d819c083SNicolas Chautru 687d819c083SNicolas Chautru /* Set PF mode : 688d819c083SNicolas Chautru * true if PF is used for data plane 689d819c083SNicolas Chautru * false for VFs 690d819c083SNicolas Chautru */ 691d819c083SNicolas Chautru conf.pf_mode_en = true; 692d819c083SNicolas Chautru 693d819c083SNicolas Chautru for (i = 0; i < FPGA_LTE_FEC_NUM_VFS; ++i) { 694d819c083SNicolas Chautru /* Number of UL queues per VF (fpga supports 8 VFs) */ 6959f17582cSNicolas Chautru conf.vf_ul_queues_number[i] = VF_UL_4G_QUEUE_VALUE; 696d819c083SNicolas Chautru /* Number of DL queues per VF (fpga supports 8 VFs) */ 6979f17582cSNicolas Chautru conf.vf_dl_queues_number[i] = VF_DL_4G_QUEUE_VALUE; 698d819c083SNicolas Chautru } 699d819c083SNicolas Chautru 700d819c083SNicolas Chautru /* UL bandwidth. Needed for schedule algorithm */ 7019f17582cSNicolas Chautru conf.ul_bandwidth = UL_4G_BANDWIDTH; 702d819c083SNicolas Chautru /* DL bandwidth */ 7039f17582cSNicolas Chautru conf.dl_bandwidth = DL_4G_BANDWIDTH; 704d819c083SNicolas Chautru 705d819c083SNicolas Chautru /* UL & DL load Balance Factor to 64 */ 7069f17582cSNicolas Chautru conf.ul_load_balance = UL_4G_LOAD_BALANCE; 7079f17582cSNicolas Chautru conf.dl_load_balance = DL_4G_LOAD_BALANCE; 708d819c083SNicolas Chautru 709d819c083SNicolas Chautru /**< FLR timeout value */ 7109f17582cSNicolas Chautru conf.flr_time_out = FLR_4G_TIMEOUT; 711d819c083SNicolas Chautru 712d819c083SNicolas Chautru /* setup FPGA PF with configuration information */ 713e6925585SMaxime Coquelin ret = rte_fpga_lte_fec_configure(info->dev_name, &conf); 714d819c083SNicolas Chautru TEST_ASSERT_SUCCESS(ret, 715d819c083SNicolas Chautru "Failed to configure 4G FPGA PF for bbdev %s", 716d819c083SNicolas Chautru info->dev_name); 717d819c083SNicolas Chautru } 718d819c083SNicolas Chautru #endif 719a8d0d473SBruce Richardson #ifdef RTE_BASEBAND_FPGA_5GNR_FEC 7202d430643SNicolas Chautru if ((get_init_device() == true) && 7212d430643SNicolas Chautru (!strcmp(info->drv.driver_name, FPGA_5GNR_PF_DRIVER_NAME))) { 7227adbb468SMaxime Coquelin struct rte_fpga_5gnr_fec_conf conf; 7232d430643SNicolas Chautru unsigned int i; 7242d430643SNicolas Chautru 7252d430643SNicolas Chautru printf("Configure FPGA 5GNR FEC Driver %s with default values\n", 7262d430643SNicolas Chautru info->drv.driver_name); 7272d430643SNicolas Chautru 7282d430643SNicolas Chautru /* clear default configuration before initialization */ 7297adbb468SMaxime Coquelin memset(&conf, 0, sizeof(struct rte_fpga_5gnr_fec_conf)); 7302d430643SNicolas Chautru 7312d430643SNicolas Chautru /* Set PF mode : 7322d430643SNicolas Chautru * true if PF is used for data plane 7332d430643SNicolas Chautru * false for VFs 7342d430643SNicolas Chautru */ 7352d430643SNicolas Chautru conf.pf_mode_en = true; 7362d430643SNicolas Chautru 7372d430643SNicolas Chautru for (i = 0; i < FPGA_5GNR_FEC_NUM_VFS; ++i) { 7382d430643SNicolas Chautru /* Number of UL queues per VF (fpga supports 8 VFs) */ 7392d430643SNicolas Chautru conf.vf_ul_queues_number[i] = VF_UL_5G_QUEUE_VALUE; 7402d430643SNicolas Chautru /* Number of DL queues per VF (fpga supports 8 VFs) */ 7412d430643SNicolas Chautru conf.vf_dl_queues_number[i] = VF_DL_5G_QUEUE_VALUE; 7422d430643SNicolas Chautru } 7432d430643SNicolas Chautru 7445884e56fSHernan Vargas /* UL bandwidth. Needed only for Vista Creek 5GNR schedule algorithm */ 7452d430643SNicolas Chautru conf.ul_bandwidth = UL_5G_BANDWIDTH; 7465884e56fSHernan Vargas /* DL bandwidth. Needed only for Vista Creek 5GNR schedule algorithm */ 7472d430643SNicolas Chautru conf.dl_bandwidth = DL_5G_BANDWIDTH; 7482d430643SNicolas Chautru 7492d430643SNicolas Chautru /* UL & DL load Balance Factor to 64 */ 7502d430643SNicolas Chautru conf.ul_load_balance = UL_5G_LOAD_BALANCE; 7512d430643SNicolas Chautru conf.dl_load_balance = DL_5G_LOAD_BALANCE; 7522d430643SNicolas Chautru 7532d430643SNicolas Chautru /* setup FPGA PF with configuration information */ 7547adbb468SMaxime Coquelin ret = rte_fpga_5gnr_fec_configure(info->dev_name, &conf); 7552d430643SNicolas Chautru TEST_ASSERT_SUCCESS(ret, 7562d430643SNicolas Chautru "Failed to configure 5G FPGA PF for bbdev %s", 7572d430643SNicolas Chautru info->dev_name); 7582d430643SNicolas Chautru } 7592d430643SNicolas Chautru #endif 760dcf43d24SNicolas Chautru #ifdef RTE_BASEBAND_ACC 761b17d7092SNicolas Chautru if ((get_init_device() == true) && 762b17d7092SNicolas Chautru (!strcmp(info->drv.driver_name, ACC100PF_DRIVER_NAME))) { 76332e8b7eaSNicolas Chautru struct rte_acc_conf conf; 764b17d7092SNicolas Chautru unsigned int i; 765b17d7092SNicolas Chautru 7665884e56fSHernan Vargas printf("Configure ACC100 FEC device %s with default values\n", 767b17d7092SNicolas Chautru info->drv.driver_name); 768b17d7092SNicolas Chautru 769b17d7092SNicolas Chautru /* clear default configuration before initialization */ 77032e8b7eaSNicolas Chautru memset(&conf, 0, sizeof(struct rte_acc_conf)); 771b17d7092SNicolas Chautru 772b17d7092SNicolas Chautru /* Always set in PF mode for built-in configuration */ 773b17d7092SNicolas Chautru conf.pf_mode_en = true; 77432e8b7eaSNicolas Chautru for (i = 0; i < RTE_ACC_NUM_VFS; ++i) { 775b17d7092SNicolas Chautru conf.arb_dl_4g[i].gbr_threshold1 = ACC100_QOS_GBR; 776b17d7092SNicolas Chautru conf.arb_dl_4g[i].gbr_threshold1 = ACC100_QOS_GBR; 777b17d7092SNicolas Chautru conf.arb_dl_4g[i].round_robin_weight = ACC100_QMGR_RR; 778b17d7092SNicolas Chautru conf.arb_ul_4g[i].gbr_threshold1 = ACC100_QOS_GBR; 779b17d7092SNicolas Chautru conf.arb_ul_4g[i].gbr_threshold1 = ACC100_QOS_GBR; 780b17d7092SNicolas Chautru conf.arb_ul_4g[i].round_robin_weight = ACC100_QMGR_RR; 781b17d7092SNicolas Chautru conf.arb_dl_5g[i].gbr_threshold1 = ACC100_QOS_GBR; 782b17d7092SNicolas Chautru conf.arb_dl_5g[i].gbr_threshold1 = ACC100_QOS_GBR; 783b17d7092SNicolas Chautru conf.arb_dl_5g[i].round_robin_weight = ACC100_QMGR_RR; 784b17d7092SNicolas Chautru conf.arb_ul_5g[i].gbr_threshold1 = ACC100_QOS_GBR; 785b17d7092SNicolas Chautru conf.arb_ul_5g[i].gbr_threshold1 = ACC100_QOS_GBR; 786b17d7092SNicolas Chautru conf.arb_ul_5g[i].round_robin_weight = ACC100_QMGR_RR; 787b17d7092SNicolas Chautru } 788b17d7092SNicolas Chautru 789b17d7092SNicolas Chautru conf.input_pos_llr_1_bit = true; 790b17d7092SNicolas Chautru conf.output_pos_llr_1_bit = true; 791b17d7092SNicolas Chautru conf.num_vf_bundles = 1; /**< Number of VF bundles to setup */ 792b17d7092SNicolas Chautru 793b17d7092SNicolas Chautru conf.q_ul_4g.num_qgroups = ACC100_QMGR_NUM_QGS; 794b17d7092SNicolas Chautru conf.q_ul_4g.first_qgroup_index = ACC100_QMGR_INVALID_IDX; 795b17d7092SNicolas Chautru conf.q_ul_4g.num_aqs_per_groups = ACC100_QMGR_NUM_AQS; 796b17d7092SNicolas Chautru conf.q_ul_4g.aq_depth_log2 = ACC100_QMGR_AQ_DEPTH; 797b17d7092SNicolas Chautru conf.q_dl_4g.num_qgroups = ACC100_QMGR_NUM_QGS; 798b17d7092SNicolas Chautru conf.q_dl_4g.first_qgroup_index = ACC100_QMGR_INVALID_IDX; 799b17d7092SNicolas Chautru conf.q_dl_4g.num_aqs_per_groups = ACC100_QMGR_NUM_AQS; 800b17d7092SNicolas Chautru conf.q_dl_4g.aq_depth_log2 = ACC100_QMGR_AQ_DEPTH; 801b17d7092SNicolas Chautru conf.q_ul_5g.num_qgroups = ACC100_QMGR_NUM_QGS; 802b17d7092SNicolas Chautru conf.q_ul_5g.first_qgroup_index = ACC100_QMGR_INVALID_IDX; 803b17d7092SNicolas Chautru conf.q_ul_5g.num_aqs_per_groups = ACC100_QMGR_NUM_AQS; 804b17d7092SNicolas Chautru conf.q_ul_5g.aq_depth_log2 = ACC100_QMGR_AQ_DEPTH; 805b17d7092SNicolas Chautru conf.q_dl_5g.num_qgroups = ACC100_QMGR_NUM_QGS; 806b17d7092SNicolas Chautru conf.q_dl_5g.first_qgroup_index = ACC100_QMGR_INVALID_IDX; 807b17d7092SNicolas Chautru conf.q_dl_5g.num_aqs_per_groups = ACC100_QMGR_NUM_AQS; 808b17d7092SNicolas Chautru conf.q_dl_5g.aq_depth_log2 = ACC100_QMGR_AQ_DEPTH; 809b17d7092SNicolas Chautru 810b17d7092SNicolas Chautru /* setup PF with configuration information */ 811c1407bfaSNicolas Chautru ret = rte_acc_configure(info->dev_name, &conf); 812b17d7092SNicolas Chautru TEST_ASSERT_SUCCESS(ret, 813b17d7092SNicolas Chautru "Failed to configure ACC100 PF for bbdev %s", 814b17d7092SNicolas Chautru info->dev_name); 815b17d7092SNicolas Chautru } 816c1407bfaSNicolas Chautru if ((get_init_device() == true) && 81761e02ccbSNicolas Chautru (!strcmp(info->drv.driver_name, VRBPF_DRIVER_NAME))) { 818c1407bfaSNicolas Chautru struct rte_acc_conf conf; 819c1407bfaSNicolas Chautru unsigned int i; 820c1407bfaSNicolas Chautru 82161e02ccbSNicolas Chautru printf("Configure Driver %s with default values\n", 822c1407bfaSNicolas Chautru info->drv.driver_name); 823c1407bfaSNicolas Chautru 824c1407bfaSNicolas Chautru /* clear default configuration before initialization */ 825c1407bfaSNicolas Chautru memset(&conf, 0, sizeof(struct rte_acc_conf)); 826c1407bfaSNicolas Chautru 827c1407bfaSNicolas Chautru /* Always set in PF mode for built-in configuration */ 828c1407bfaSNicolas Chautru conf.pf_mode_en = true; 829c1407bfaSNicolas Chautru for (i = 0; i < RTE_ACC_NUM_VFS; ++i) { 83061e02ccbSNicolas Chautru conf.arb_dl_4g[i].gbr_threshold1 = VRB_QOS_GBR; 83161e02ccbSNicolas Chautru conf.arb_dl_4g[i].gbr_threshold1 = VRB_QOS_GBR; 83261e02ccbSNicolas Chautru conf.arb_dl_4g[i].round_robin_weight = VRB_QMGR_RR; 83361e02ccbSNicolas Chautru conf.arb_ul_4g[i].gbr_threshold1 = VRB_QOS_GBR; 83461e02ccbSNicolas Chautru conf.arb_ul_4g[i].gbr_threshold1 = VRB_QOS_GBR; 83561e02ccbSNicolas Chautru conf.arb_ul_4g[i].round_robin_weight = VRB_QMGR_RR; 83661e02ccbSNicolas Chautru conf.arb_dl_5g[i].gbr_threshold1 = VRB_QOS_GBR; 83761e02ccbSNicolas Chautru conf.arb_dl_5g[i].gbr_threshold1 = VRB_QOS_GBR; 83861e02ccbSNicolas Chautru conf.arb_dl_5g[i].round_robin_weight = VRB_QMGR_RR; 83961e02ccbSNicolas Chautru conf.arb_ul_5g[i].gbr_threshold1 = VRB_QOS_GBR; 84061e02ccbSNicolas Chautru conf.arb_ul_5g[i].gbr_threshold1 = VRB_QOS_GBR; 84161e02ccbSNicolas Chautru conf.arb_ul_5g[i].round_robin_weight = VRB_QMGR_RR; 84261e02ccbSNicolas Chautru conf.arb_fft[i].gbr_threshold1 = VRB_QOS_GBR; 84361e02ccbSNicolas Chautru conf.arb_fft[i].gbr_threshold1 = VRB_QOS_GBR; 84461e02ccbSNicolas Chautru conf.arb_fft[i].round_robin_weight = VRB_QMGR_RR; 84595f192a4SHernan Vargas conf.arb_mld[i].gbr_threshold1 = VRB_QOS_GBR; 84695f192a4SHernan Vargas conf.arb_mld[i].gbr_threshold1 = VRB_QOS_GBR; 84795f192a4SHernan Vargas conf.arb_mld[i].round_robin_weight = VRB_QMGR_RR; 848c1407bfaSNicolas Chautru } 849c1407bfaSNicolas Chautru 850c1407bfaSNicolas Chautru conf.input_pos_llr_1_bit = true; 851c1407bfaSNicolas Chautru conf.output_pos_llr_1_bit = true; 852c1407bfaSNicolas Chautru conf.num_vf_bundles = 1; /**< Number of VF bundles to setup */ 853c1407bfaSNicolas Chautru 85461e02ccbSNicolas Chautru conf.q_ul_4g.num_qgroups = VRB_QMGR_NUM_QGS; 85561e02ccbSNicolas Chautru conf.q_ul_4g.first_qgroup_index = VRB_QMGR_INVALID_IDX; 85661e02ccbSNicolas Chautru conf.q_ul_4g.num_aqs_per_groups = VRB_QMGR_NUM_AQS; 85761e02ccbSNicolas Chautru conf.q_ul_4g.aq_depth_log2 = VRB_QMGR_AQ_DEPTH; 85861e02ccbSNicolas Chautru conf.q_dl_4g.num_qgroups = VRB_QMGR_NUM_QGS; 85961e02ccbSNicolas Chautru conf.q_dl_4g.first_qgroup_index = VRB_QMGR_INVALID_IDX; 86061e02ccbSNicolas Chautru conf.q_dl_4g.num_aqs_per_groups = VRB_QMGR_NUM_AQS; 86161e02ccbSNicolas Chautru conf.q_dl_4g.aq_depth_log2 = VRB_QMGR_AQ_DEPTH; 86261e02ccbSNicolas Chautru conf.q_ul_5g.num_qgroups = VRB_QMGR_NUM_QGS; 86361e02ccbSNicolas Chautru conf.q_ul_5g.first_qgroup_index = VRB_QMGR_INVALID_IDX; 86461e02ccbSNicolas Chautru conf.q_ul_5g.num_aqs_per_groups = VRB_QMGR_NUM_AQS; 86561e02ccbSNicolas Chautru conf.q_ul_5g.aq_depth_log2 = VRB_QMGR_AQ_DEPTH; 86661e02ccbSNicolas Chautru conf.q_dl_5g.num_qgroups = VRB_QMGR_NUM_QGS; 86761e02ccbSNicolas Chautru conf.q_dl_5g.first_qgroup_index = VRB_QMGR_INVALID_IDX; 86861e02ccbSNicolas Chautru conf.q_dl_5g.num_aqs_per_groups = VRB_QMGR_NUM_AQS; 86961e02ccbSNicolas Chautru conf.q_dl_5g.aq_depth_log2 = VRB_QMGR_AQ_DEPTH; 87061e02ccbSNicolas Chautru conf.q_fft.num_qgroups = VRB_QMGR_NUM_QGS; 87161e02ccbSNicolas Chautru conf.q_fft.first_qgroup_index = VRB_QMGR_INVALID_IDX; 87261e02ccbSNicolas Chautru conf.q_fft.num_aqs_per_groups = VRB_QMGR_NUM_AQS; 8730ed76d66SHernan Vargas conf.q_fft.aq_depth_log2 = VRB_QMGR_AQ_DEPTH; 87495f192a4SHernan Vargas conf.q_mld.num_qgroups = VRB_QMGR_NUM_QGS; 87595f192a4SHernan Vargas conf.q_mld.first_qgroup_index = VRB_QMGR_INVALID_IDX; 87695f192a4SHernan Vargas conf.q_mld.num_aqs_per_groups = VRB_QMGR_NUM_AQS; 87795f192a4SHernan Vargas conf.q_mld.aq_depth_log2 = VRB_QMGR_AQ_DEPTH; 878c1407bfaSNicolas Chautru 879c1407bfaSNicolas Chautru /* setup PF with configuration information */ 880c1407bfaSNicolas Chautru ret = rte_acc_configure(info->dev_name, &conf); 881c1407bfaSNicolas Chautru TEST_ASSERT_SUCCESS(ret, 88261e02ccbSNicolas Chautru "Failed to configure PF for bbdev %s", 883c1407bfaSNicolas Chautru info->dev_name); 884c1407bfaSNicolas Chautru } 885b17d7092SNicolas Chautru #endif 886b17d7092SNicolas Chautru /* Let's refresh this now this is configured */ 887b17d7092SNicolas Chautru rte_bbdev_info_get(dev_id, info); 8883190372dSHernan Vargas if (info->drv.device_status == RTE_BBDEV_DEV_FATAL_ERR) 8893190372dSHernan Vargas printf("Device Status %s\n", rte_bbdev_device_status_str(info->drv.device_status)); 890a2ea86cbSHernan Vargas if (info->drv.fft_window_width != NULL) 891a2ea86cbSHernan Vargas fft_window_width_dev = info->drv.fft_window_width[0]; 892a2ea86cbSHernan Vargas else 893a2ea86cbSHernan Vargas fft_window_width_dev = 0; 894a2ea86cbSHernan Vargas if (fft_window_width_dev != 0) 895a2ea86cbSHernan Vargas printf(" FFT Window0 width %d\n", fft_window_width_dev); 896a2ea86cbSHernan Vargas 897f714a188SAmr Mokhtar nb_queues = RTE_MIN(rte_lcore_count(), info->drv.max_num_queues); 898d819c083SNicolas Chautru nb_queues = RTE_MIN(nb_queues, (unsigned int) MAX_QUEUES); 899d819c083SNicolas Chautru 900f714a188SAmr Mokhtar /* setup device */ 901f714a188SAmr Mokhtar ret = rte_bbdev_setup_queues(dev_id, nb_queues, info->socket_id); 902f714a188SAmr Mokhtar if (ret < 0) { 903f714a188SAmr Mokhtar printf("rte_bbdev_setup_queues(%u, %u, %d) ret %i\n", 904f714a188SAmr Mokhtar dev_id, nb_queues, info->socket_id, ret); 905f714a188SAmr Mokhtar return TEST_FAILED; 906f714a188SAmr Mokhtar } 907f714a188SAmr Mokhtar 908f714a188SAmr Mokhtar /* configure interrupts if needed */ 909f714a188SAmr Mokhtar if (intr_enabled) { 910f714a188SAmr Mokhtar ret = rte_bbdev_intr_enable(dev_id); 911f714a188SAmr Mokhtar if (ret < 0) { 912f714a188SAmr Mokhtar printf("rte_bbdev_intr_enable(%u) ret %i\n", dev_id, 913f714a188SAmr Mokhtar ret); 914f714a188SAmr Mokhtar return TEST_FAILED; 915f714a188SAmr Mokhtar } 916f714a188SAmr Mokhtar } 917f714a188SAmr Mokhtar 918f714a188SAmr Mokhtar /* setup device queues */ 919f714a188SAmr Mokhtar qconf.socket = info->socket_id; 920f714a188SAmr Mokhtar qconf.queue_size = info->drv.default_queue_conf.queue_size; 921f714a188SAmr Mokhtar qconf.priority = 0; 922f714a188SAmr Mokhtar qconf.deferred_start = 0; 923f714a188SAmr Mokhtar qconf.op_type = op_type; 924f714a188SAmr Mokhtar 925f714a188SAmr Mokhtar for (queue_id = 0; queue_id < nb_queues; ++queue_id) { 926f714a188SAmr Mokhtar ret = rte_bbdev_queue_configure(dev_id, queue_id, &qconf); 927f714a188SAmr Mokhtar if (ret != 0) { 928f714a188SAmr Mokhtar printf( 929f714a188SAmr Mokhtar "Allocated all queues (id=%u) at prio%u on dev%u\n", 930f714a188SAmr Mokhtar queue_id, qconf.priority, dev_id); 931f714a188SAmr Mokhtar qconf.priority++; 932f32bbc32SHernan Vargas ret = rte_bbdev_queue_configure(ad->dev_id, queue_id, &qconf); 933f714a188SAmr Mokhtar } 934f714a188SAmr Mokhtar if (ret != 0) { 935f32bbc32SHernan Vargas printf("All queues on dev %u allocated: %u\n", dev_id, queue_id); 936f32bbc32SHernan Vargas break; 937f32bbc32SHernan Vargas } 938f32bbc32SHernan Vargas ret = rte_bbdev_queue_start(ad->dev_id, queue_id); 939f32bbc32SHernan Vargas if (ret != 0) { 940f32bbc32SHernan Vargas printf("Failed to start queue on dev %u q_id: %u\n", dev_id, queue_id); 941f714a188SAmr Mokhtar break; 942f714a188SAmr Mokhtar } 943f714a188SAmr Mokhtar ad->queue_ids[queue_id] = queue_id; 944f714a188SAmr Mokhtar } 945f714a188SAmr Mokhtar TEST_ASSERT(queue_id != 0, 946f32bbc32SHernan Vargas "ERROR Failed to configure any queues on dev %u\n" 947f32bbc32SHernan Vargas "\tthe device may not support the related operation capability\n" 948f32bbc32SHernan Vargas "\tor the device may not have been configured yet", dev_id); 949f714a188SAmr Mokhtar ad->nb_queues = queue_id; 950f714a188SAmr Mokhtar 951f714a188SAmr Mokhtar set_avail_op(ad, op_type); 952f714a188SAmr Mokhtar 953f714a188SAmr Mokhtar return TEST_SUCCESS; 954f714a188SAmr Mokhtar } 955f714a188SAmr Mokhtar 956f714a188SAmr Mokhtar static int 957f714a188SAmr Mokhtar add_active_device(uint8_t dev_id, struct rte_bbdev_info *info, 958f714a188SAmr Mokhtar struct test_bbdev_vector *vector) 959f714a188SAmr Mokhtar { 960f714a188SAmr Mokhtar int ret; 961f714a188SAmr Mokhtar 962f714a188SAmr Mokhtar active_devs[nb_active_devs].driver_name = info->drv.driver_name; 963f714a188SAmr Mokhtar active_devs[nb_active_devs].dev_id = dev_id; 964f714a188SAmr Mokhtar 965f714a188SAmr Mokhtar ret = add_bbdev_dev(dev_id, info, vector); 966f714a188SAmr Mokhtar if (ret == TEST_SUCCESS) 967f714a188SAmr Mokhtar ++nb_active_devs; 968f714a188SAmr Mokhtar return ret; 969f714a188SAmr Mokhtar } 970f714a188SAmr Mokhtar 971f714a188SAmr Mokhtar static uint8_t 972f714a188SAmr Mokhtar populate_active_devices(void) 973f714a188SAmr Mokhtar { 974f714a188SAmr Mokhtar int ret; 975f714a188SAmr Mokhtar uint8_t dev_id; 976f714a188SAmr Mokhtar uint8_t nb_devs_added = 0; 977f714a188SAmr Mokhtar struct rte_bbdev_info info; 978f714a188SAmr Mokhtar 979f714a188SAmr Mokhtar RTE_BBDEV_FOREACH(dev_id) { 980f714a188SAmr Mokhtar rte_bbdev_info_get(dev_id, &info); 981f714a188SAmr Mokhtar 982f714a188SAmr Mokhtar if (check_dev_cap(&info)) { 983f714a188SAmr Mokhtar printf( 984f714a188SAmr Mokhtar "Device %d (%s) does not support specified capabilities\n", 985f714a188SAmr Mokhtar dev_id, info.dev_name); 986f714a188SAmr Mokhtar continue; 987f714a188SAmr Mokhtar } 988f714a188SAmr Mokhtar 989f714a188SAmr Mokhtar ret = add_active_device(dev_id, &info, &test_vector); 990f714a188SAmr Mokhtar if (ret != 0) { 991f714a188SAmr Mokhtar printf("Adding active bbdev %s skipped\n", 992f714a188SAmr Mokhtar info.dev_name); 993f714a188SAmr Mokhtar continue; 994f714a188SAmr Mokhtar } 995f714a188SAmr Mokhtar nb_devs_added++; 996f714a188SAmr Mokhtar } 997f714a188SAmr Mokhtar 998f714a188SAmr Mokhtar return nb_devs_added; 999f714a188SAmr Mokhtar } 1000f714a188SAmr Mokhtar 1001f714a188SAmr Mokhtar static int 1002f714a188SAmr Mokhtar read_test_vector(void) 1003f714a188SAmr Mokhtar { 1004f714a188SAmr Mokhtar int ret; 1005f714a188SAmr Mokhtar 1006f714a188SAmr Mokhtar memset(&test_vector, 0, sizeof(test_vector)); 1007f714a188SAmr Mokhtar printf("Test vector file = %s\n", get_vector_filename()); 1008f714a188SAmr Mokhtar ret = test_bbdev_vector_read(get_vector_filename(), &test_vector); 1009f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS(ret, "Failed to parse file %s\n", 1010f714a188SAmr Mokhtar get_vector_filename()); 1011f714a188SAmr Mokhtar 1012f714a188SAmr Mokhtar return TEST_SUCCESS; 1013f714a188SAmr Mokhtar } 1014f714a188SAmr Mokhtar 1015f714a188SAmr Mokhtar static int 1016f714a188SAmr Mokhtar testsuite_setup(void) 1017f714a188SAmr Mokhtar { 1018f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n"); 1019f714a188SAmr Mokhtar 1020f714a188SAmr Mokhtar if (populate_active_devices() == 0) { 1021f714a188SAmr Mokhtar printf("No suitable devices found!\n"); 1022f714a188SAmr Mokhtar return TEST_SKIPPED; 1023f714a188SAmr Mokhtar } 1024f714a188SAmr Mokhtar 1025f714a188SAmr Mokhtar return TEST_SUCCESS; 1026f714a188SAmr Mokhtar } 1027f714a188SAmr Mokhtar 1028f714a188SAmr Mokhtar static int 1029f714a188SAmr Mokhtar interrupt_testsuite_setup(void) 1030f714a188SAmr Mokhtar { 1031f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS(read_test_vector(), "Test suite setup failed\n"); 1032f714a188SAmr Mokhtar 1033f714a188SAmr Mokhtar /* Enable interrupts */ 1034f714a188SAmr Mokhtar intr_enabled = true; 1035f714a188SAmr Mokhtar 1036f714a188SAmr Mokhtar /* Special case for NULL device (RTE_BBDEV_OP_NONE) */ 1037f714a188SAmr Mokhtar if (populate_active_devices() == 0 || 1038f714a188SAmr Mokhtar test_vector.op_type == RTE_BBDEV_OP_NONE) { 1039f714a188SAmr Mokhtar intr_enabled = false; 1040f714a188SAmr Mokhtar printf("No suitable devices found!\n"); 1041f714a188SAmr Mokhtar return TEST_SKIPPED; 1042f714a188SAmr Mokhtar } 1043f714a188SAmr Mokhtar 1044f714a188SAmr Mokhtar return TEST_SUCCESS; 1045f714a188SAmr Mokhtar } 1046f714a188SAmr Mokhtar 1047f714a188SAmr Mokhtar static void 1048f714a188SAmr Mokhtar testsuite_teardown(void) 1049f714a188SAmr Mokhtar { 1050f714a188SAmr Mokhtar uint8_t dev_id; 1051f714a188SAmr Mokhtar 1052f714a188SAmr Mokhtar /* Unconfigure devices */ 1053f714a188SAmr Mokhtar RTE_BBDEV_FOREACH(dev_id) 1054f714a188SAmr Mokhtar rte_bbdev_close(dev_id); 1055f714a188SAmr Mokhtar 1056f714a188SAmr Mokhtar /* Clear active devices structs. */ 1057f714a188SAmr Mokhtar memset(active_devs, 0, sizeof(active_devs)); 1058f714a188SAmr Mokhtar nb_active_devs = 0; 1059f162c475SNicolas Chautru 1060f162c475SNicolas Chautru /* Disable interrupts */ 1061f162c475SNicolas Chautru intr_enabled = false; 1062f714a188SAmr Mokhtar } 1063f714a188SAmr Mokhtar 1064f714a188SAmr Mokhtar static int 1065f714a188SAmr Mokhtar ut_setup(void) 1066f714a188SAmr Mokhtar { 1067f714a188SAmr Mokhtar uint8_t i, dev_id; 1068f714a188SAmr Mokhtar 1069f714a188SAmr Mokhtar for (i = 0; i < nb_active_devs; i++) { 1070f714a188SAmr Mokhtar dev_id = active_devs[i].dev_id; 1071f714a188SAmr Mokhtar /* reset bbdev stats */ 1072f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS(rte_bbdev_stats_reset(dev_id), 1073f714a188SAmr Mokhtar "Failed to reset stats of bbdev %u", dev_id); 1074f714a188SAmr Mokhtar /* start the device */ 1075f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS(rte_bbdev_start(dev_id), 1076f714a188SAmr Mokhtar "Failed to start bbdev %u", dev_id); 1077f714a188SAmr Mokhtar } 1078f714a188SAmr Mokhtar 1079f714a188SAmr Mokhtar return TEST_SUCCESS; 1080f714a188SAmr Mokhtar } 1081f714a188SAmr Mokhtar 1082f714a188SAmr Mokhtar static void 1083f714a188SAmr Mokhtar ut_teardown(void) 1084f714a188SAmr Mokhtar { 10855884e56fSHernan Vargas uint8_t i, dev_id, ret; 1086f714a188SAmr Mokhtar struct rte_bbdev_stats stats; 1087f714a188SAmr Mokhtar 1088f714a188SAmr Mokhtar for (i = 0; i < nb_active_devs; i++) { 1089f714a188SAmr Mokhtar dev_id = active_devs[i].dev_id; 1090f714a188SAmr Mokhtar /* read stats and print */ 10915884e56fSHernan Vargas ret = rte_bbdev_stats_get(dev_id, &stats); 10925884e56fSHernan Vargas if (ret != 0) 10935884e56fSHernan Vargas printf("Failed to get stats on bbdev %u\n", dev_id); 1094f714a188SAmr Mokhtar /* Stop the device */ 1095f714a188SAmr Mokhtar rte_bbdev_stop(dev_id); 1096f714a188SAmr Mokhtar } 1097f714a188SAmr Mokhtar } 1098f714a188SAmr Mokhtar 1099f714a188SAmr Mokhtar static int 1100f714a188SAmr Mokhtar init_op_data_objs(struct rte_bbdev_op_data *bufs, 1101f714a188SAmr Mokhtar struct op_data_entries *ref_entries, 1102f714a188SAmr Mokhtar struct rte_mempool *mbuf_pool, const uint16_t n, 1103f714a188SAmr Mokhtar enum op_data_type op_type, uint16_t min_alignment) 1104f714a188SAmr Mokhtar { 1105f714a188SAmr Mokhtar int ret; 1106f714a188SAmr Mokhtar unsigned int i, j; 110731a7853dSNicolas Chautru bool large_input = false; 1108f714a188SAmr Mokhtar 1109f714a188SAmr Mokhtar for (i = 0; i < n; ++i) { 1110f714a188SAmr Mokhtar char *data; 1111f714a188SAmr Mokhtar struct op_data_buf *seg = &ref_entries->segments[0]; 1112f714a188SAmr Mokhtar struct rte_mbuf *m_head = rte_pktmbuf_alloc(mbuf_pool); 1113f714a188SAmr Mokhtar TEST_ASSERT_NOT_NULL(m_head, 1114f714a188SAmr Mokhtar "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", 1115f714a188SAmr Mokhtar op_type, n * ref_entries->nb_segments, 1116f714a188SAmr Mokhtar mbuf_pool->size); 1117f714a188SAmr Mokhtar 11180acdb986SNicolas Chautru if ((seg->length + RTE_PKTMBUF_HEADROOM) > RTE_BBDEV_LDPC_E_MAX_MBUF) { 111931a7853dSNicolas Chautru /* 112031a7853dSNicolas Chautru * Special case when DPDK mbuf cannot handle 112131a7853dSNicolas Chautru * the required input size 112231a7853dSNicolas Chautru */ 112331a7853dSNicolas Chautru large_input = true; 112431a7853dSNicolas Chautru } 1125f714a188SAmr Mokhtar bufs[i].data = m_head; 1126f714a188SAmr Mokhtar bufs[i].offset = 0; 1127f714a188SAmr Mokhtar bufs[i].length = 0; 1128f714a188SAmr Mokhtar 1129d819c083SNicolas Chautru if ((op_type == DATA_INPUT) || (op_type == DATA_HARQ_INPUT)) { 11300acdb986SNicolas Chautru if (large_input) { 113131a7853dSNicolas Chautru /* Allocate a fake overused mbuf */ 113231a7853dSNicolas Chautru data = rte_malloc(NULL, seg->length, 0); 1133bc4c9418SMin Hu (Connor) TEST_ASSERT_NOT_NULL(data, 1134bc4c9418SMin Hu (Connor) "rte malloc failed with %u bytes", 1135bc4c9418SMin Hu (Connor) seg->length); 113631a7853dSNicolas Chautru memcpy(data, seg->addr, seg->length); 113731a7853dSNicolas Chautru m_head->buf_addr = data; 1138e811e2d7SShijith Thotton rte_mbuf_iova_set(m_head, rte_malloc_virt2iova(data)); 113931a7853dSNicolas Chautru m_head->data_off = 0; 114031a7853dSNicolas Chautru m_head->data_len = seg->length; 114131a7853dSNicolas Chautru } else { 1142f714a188SAmr Mokhtar data = rte_pktmbuf_append(m_head, seg->length); 1143f714a188SAmr Mokhtar TEST_ASSERT_NOT_NULL(data, 1144f714a188SAmr Mokhtar "Couldn't append %u bytes to mbuf from %d data type mbuf pool", 1145f714a188SAmr Mokhtar seg->length, op_type); 1146f714a188SAmr Mokhtar 114731a7853dSNicolas Chautru TEST_ASSERT(data == RTE_PTR_ALIGN( 114831a7853dSNicolas Chautru data, min_alignment), 1149f714a188SAmr Mokhtar "Data addr in mbuf (%p) is not aligned to device min alignment (%u)", 1150f714a188SAmr Mokhtar data, min_alignment); 1151f714a188SAmr Mokhtar rte_memcpy(data, seg->addr, seg->length); 115231a7853dSNicolas Chautru } 115331a7853dSNicolas Chautru 1154f714a188SAmr Mokhtar bufs[i].length += seg->length; 1155f714a188SAmr Mokhtar 1156f714a188SAmr Mokhtar for (j = 1; j < ref_entries->nb_segments; ++j) { 1157f714a188SAmr Mokhtar struct rte_mbuf *m_tail = 1158f714a188SAmr Mokhtar rte_pktmbuf_alloc(mbuf_pool); 1159f714a188SAmr Mokhtar TEST_ASSERT_NOT_NULL(m_tail, 1160f714a188SAmr Mokhtar "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", 1161f714a188SAmr Mokhtar op_type, 1162f714a188SAmr Mokhtar n * ref_entries->nb_segments, 1163f714a188SAmr Mokhtar mbuf_pool->size); 1164f714a188SAmr Mokhtar seg += 1; 1165f714a188SAmr Mokhtar 1166f714a188SAmr Mokhtar data = rte_pktmbuf_append(m_tail, seg->length); 1167f714a188SAmr Mokhtar TEST_ASSERT_NOT_NULL(data, 1168f714a188SAmr Mokhtar "Couldn't append %u bytes to mbuf from %d data type mbuf pool", 1169f714a188SAmr Mokhtar seg->length, op_type); 1170f714a188SAmr Mokhtar 1171f714a188SAmr Mokhtar TEST_ASSERT(data == RTE_PTR_ALIGN(data, 1172f714a188SAmr Mokhtar min_alignment), 1173f714a188SAmr Mokhtar "Data addr in mbuf (%p) is not aligned to device min alignment (%u)", 1174f714a188SAmr Mokhtar data, min_alignment); 1175f714a188SAmr Mokhtar rte_memcpy(data, seg->addr, seg->length); 1176f714a188SAmr Mokhtar bufs[i].length += seg->length; 1177f714a188SAmr Mokhtar 1178f714a188SAmr Mokhtar ret = rte_pktmbuf_chain(m_head, m_tail); 1179f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS(ret, 1180f714a188SAmr Mokhtar "Couldn't chain mbufs from %d data type mbuf pool", 1181f714a188SAmr Mokhtar op_type); 1182f714a188SAmr Mokhtar } 11839585f8b1SKamil Chalupnik } else { 11840acdb986SNicolas Chautru if (((op_type == DATA_HARD_OUTPUT) || (op_type == DATA_SOFT_OUTPUT)) 11850acdb986SNicolas Chautru && ((seg->length + RTE_PKTMBUF_HEADROOM) 11860acdb986SNicolas Chautru > RTE_BBDEV_LDPC_E_MAX_MBUF)) { 11870acdb986SNicolas Chautru /* Allocate a fake overused mbuf + margin */ 11880acdb986SNicolas Chautru data = rte_malloc(NULL, seg->length + 1024, 0); 11890acdb986SNicolas Chautru TEST_ASSERT_NOT_NULL(data, 11900acdb986SNicolas Chautru "rte malloc failed with %u bytes", 11910acdb986SNicolas Chautru seg->length + 1024); 11920acdb986SNicolas Chautru m_head->buf_addr = data; 1193a62ac101SSrikanth Yalavarthi rte_mbuf_iova_set(m_head, rte_malloc_virt2iova(data)); 11940acdb986SNicolas Chautru m_head->data_off = 0; 11950acdb986SNicolas Chautru m_head->data_len = seg->length; 11960acdb986SNicolas Chautru } else { 11979585f8b1SKamil Chalupnik /* allocate chained-mbuf for output buffer */ 11989585f8b1SKamil Chalupnik for (j = 1; j < ref_entries->nb_segments; ++j) { 11999585f8b1SKamil Chalupnik struct rte_mbuf *m_tail = 12009585f8b1SKamil Chalupnik rte_pktmbuf_alloc(mbuf_pool); 12019585f8b1SKamil Chalupnik TEST_ASSERT_NOT_NULL(m_tail, 12029585f8b1SKamil Chalupnik "Not enough mbufs in %d data type mbuf pool (needed %u, available %u)", 12039585f8b1SKamil Chalupnik op_type, 12049585f8b1SKamil Chalupnik n * ref_entries->nb_segments, 12059585f8b1SKamil Chalupnik mbuf_pool->size); 12069585f8b1SKamil Chalupnik 12079585f8b1SKamil Chalupnik ret = rte_pktmbuf_chain(m_head, m_tail); 12089585f8b1SKamil Chalupnik TEST_ASSERT_SUCCESS(ret, 12099585f8b1SKamil Chalupnik "Couldn't chain mbufs from %d data type mbuf pool", 12109585f8b1SKamil Chalupnik op_type); 12119585f8b1SKamil Chalupnik } 1212f714a188SAmr Mokhtar } 12130acdb986SNicolas Chautru bufs[i].length += seg->length; 12140acdb986SNicolas Chautru } 1215f714a188SAmr Mokhtar } 1216f714a188SAmr Mokhtar 1217f714a188SAmr Mokhtar return 0; 1218f714a188SAmr Mokhtar } 1219f714a188SAmr Mokhtar 1220f714a188SAmr Mokhtar static int 1221f714a188SAmr Mokhtar allocate_buffers_on_socket(struct rte_bbdev_op_data **buffers, const int len, 1222f714a188SAmr Mokhtar const int socket) 1223f714a188SAmr Mokhtar { 1224f714a188SAmr Mokhtar int i; 1225f714a188SAmr Mokhtar 1226f714a188SAmr Mokhtar *buffers = rte_zmalloc_socket(NULL, len, 0, socket); 1227f714a188SAmr Mokhtar if (*buffers == NULL) { 1228f714a188SAmr Mokhtar printf("WARNING: Failed to allocate op_data on socket %d\n", 1229f714a188SAmr Mokhtar socket); 1230f714a188SAmr Mokhtar /* try to allocate memory on other detected sockets */ 1231f714a188SAmr Mokhtar for (i = 0; i < socket; i++) { 1232f714a188SAmr Mokhtar *buffers = rte_zmalloc_socket(NULL, len, 0, i); 1233f714a188SAmr Mokhtar if (*buffers != NULL) 1234f714a188SAmr Mokhtar break; 1235f714a188SAmr Mokhtar } 1236f714a188SAmr Mokhtar } 1237f714a188SAmr Mokhtar 1238f714a188SAmr Mokhtar return (*buffers == NULL) ? TEST_FAILED : TEST_SUCCESS; 1239f714a188SAmr Mokhtar } 1240f714a188SAmr Mokhtar 124147d5a049SKamil Chalupnik static void 124247d5a049SKamil Chalupnik limit_input_llr_val_range(struct rte_bbdev_op_data *input_ops, 1243d819c083SNicolas Chautru const uint16_t n, const int8_t max_llr_modulus) 124447d5a049SKamil Chalupnik { 124547d5a049SKamil Chalupnik uint16_t i, byte_idx; 124647d5a049SKamil Chalupnik 124747d5a049SKamil Chalupnik for (i = 0; i < n; ++i) { 124847d5a049SKamil Chalupnik struct rte_mbuf *m = input_ops[i].data; 124947d5a049SKamil Chalupnik while (m != NULL) { 125047d5a049SKamil Chalupnik int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *, 125147d5a049SKamil Chalupnik input_ops[i].offset); 12529585f8b1SKamil Chalupnik for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m); 125347d5a049SKamil Chalupnik ++byte_idx) 125447d5a049SKamil Chalupnik llr[byte_idx] = round((double)max_llr_modulus * 125547d5a049SKamil Chalupnik llr[byte_idx] / INT8_MAX); 125647d5a049SKamil Chalupnik 125747d5a049SKamil Chalupnik m = m->next; 125847d5a049SKamil Chalupnik } 125947d5a049SKamil Chalupnik } 126047d5a049SKamil Chalupnik } 126147d5a049SKamil Chalupnik 1262335c11fdSNicolas Chautru /* 1263335c11fdSNicolas Chautru * We may have to insert filler bits 1264335c11fdSNicolas Chautru * when they are required by the HARQ assumption 1265335c11fdSNicolas Chautru */ 1266335c11fdSNicolas Chautru static void 1267335c11fdSNicolas Chautru ldpc_add_filler(struct rte_bbdev_op_data *input_ops, 1268335c11fdSNicolas Chautru const uint16_t n, struct test_op_params *op_params) 1269335c11fdSNicolas Chautru { 1270335c11fdSNicolas Chautru struct rte_bbdev_op_ldpc_dec dec = op_params->ref_dec_op->ldpc_dec; 1271335c11fdSNicolas Chautru 1272335c11fdSNicolas Chautru if (input_ops == NULL) 1273335c11fdSNicolas Chautru return; 1274335c11fdSNicolas Chautru /* No need to add filler if not required by device */ 1275335c11fdSNicolas Chautru if (!(ldpc_cap_flags & 1276335c11fdSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_FILLERS)) 1277335c11fdSNicolas Chautru return; 1278335c11fdSNicolas Chautru /* No need to add filler for loopback operation */ 1279335c11fdSNicolas Chautru if (dec.op_flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK) 1280335c11fdSNicolas Chautru return; 1281335c11fdSNicolas Chautru 1282335c11fdSNicolas Chautru uint16_t i, j, parity_offset; 1283335c11fdSNicolas Chautru for (i = 0; i < n; ++i) { 1284335c11fdSNicolas Chautru struct rte_mbuf *m = input_ops[i].data; 1285335c11fdSNicolas Chautru int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *, 1286335c11fdSNicolas Chautru input_ops[i].offset); 1287335c11fdSNicolas Chautru parity_offset = (dec.basegraph == 1 ? 20 : 8) 1288335c11fdSNicolas Chautru * dec.z_c - dec.n_filler; 1289335c11fdSNicolas Chautru uint16_t new_hin_size = input_ops[i].length + dec.n_filler; 1290335c11fdSNicolas Chautru m->data_len = new_hin_size; 1291335c11fdSNicolas Chautru input_ops[i].length = new_hin_size; 1292335c11fdSNicolas Chautru for (j = new_hin_size - 1; j >= parity_offset + dec.n_filler; 1293335c11fdSNicolas Chautru j--) 1294335c11fdSNicolas Chautru llr[j] = llr[j - dec.n_filler]; 1295335c11fdSNicolas Chautru uint16_t llr_max_pre_scaling = (1 << (ldpc_llr_size - 1)) - 1; 1296335c11fdSNicolas Chautru for (j = 0; j < dec.n_filler; j++) 1297335c11fdSNicolas Chautru llr[parity_offset + j] = llr_max_pre_scaling; 1298335c11fdSNicolas Chautru } 1299335c11fdSNicolas Chautru } 1300335c11fdSNicolas Chautru 1301d819c083SNicolas Chautru static void 1302d819c083SNicolas Chautru ldpc_input_llr_scaling(struct rte_bbdev_op_data *input_ops, 1303d819c083SNicolas Chautru const uint16_t n, const int8_t llr_size, 1304d819c083SNicolas Chautru const int8_t llr_decimals) 1305d819c083SNicolas Chautru { 1306d819c083SNicolas Chautru if (input_ops == NULL) 1307d819c083SNicolas Chautru return; 1308d819c083SNicolas Chautru 1309d819c083SNicolas Chautru uint16_t i, byte_idx; 1310d819c083SNicolas Chautru 1311d819c083SNicolas Chautru int16_t llr_max, llr_min, llr_tmp; 1312d819c083SNicolas Chautru llr_max = (1 << (llr_size - 1)) - 1; 1313d819c083SNicolas Chautru llr_min = -llr_max; 1314d819c083SNicolas Chautru for (i = 0; i < n; ++i) { 1315d819c083SNicolas Chautru struct rte_mbuf *m = input_ops[i].data; 1316d819c083SNicolas Chautru while (m != NULL) { 1317d819c083SNicolas Chautru int8_t *llr = rte_pktmbuf_mtod_offset(m, int8_t *, 1318d819c083SNicolas Chautru input_ops[i].offset); 1319d819c083SNicolas Chautru for (byte_idx = 0; byte_idx < rte_pktmbuf_data_len(m); 1320d819c083SNicolas Chautru ++byte_idx) { 1321d819c083SNicolas Chautru 1322d819c083SNicolas Chautru llr_tmp = llr[byte_idx]; 1323335c11fdSNicolas Chautru if (llr_decimals == 4) 1324335c11fdSNicolas Chautru llr_tmp *= 8; 1325335c11fdSNicolas Chautru else if (llr_decimals == 2) 1326d819c083SNicolas Chautru llr_tmp *= 2; 1327d819c083SNicolas Chautru else if (llr_decimals == 0) 1328d819c083SNicolas Chautru llr_tmp /= 2; 1329d819c083SNicolas Chautru llr_tmp = RTE_MIN(llr_max, 1330d819c083SNicolas Chautru RTE_MAX(llr_min, llr_tmp)); 1331d819c083SNicolas Chautru llr[byte_idx] = (int8_t) llr_tmp; 1332d819c083SNicolas Chautru } 1333d819c083SNicolas Chautru 1334d819c083SNicolas Chautru m = m->next; 1335d819c083SNicolas Chautru } 1336d819c083SNicolas Chautru } 1337d819c083SNicolas Chautru } 1338d819c083SNicolas Chautru 1339d819c083SNicolas Chautru 1340d819c083SNicolas Chautru 1341f714a188SAmr Mokhtar static int 1342f714a188SAmr Mokhtar fill_queue_buffers(struct test_op_params *op_params, 1343f714a188SAmr Mokhtar struct rte_mempool *in_mp, struct rte_mempool *hard_out_mp, 1344d819c083SNicolas Chautru struct rte_mempool *soft_out_mp, 1345d819c083SNicolas Chautru struct rte_mempool *harq_in_mp, struct rte_mempool *harq_out_mp, 1346d819c083SNicolas Chautru uint16_t queue_id, 134747d5a049SKamil Chalupnik const struct rte_bbdev_op_cap *capabilities, 1348f714a188SAmr Mokhtar uint16_t min_alignment, const int socket_id) 1349f714a188SAmr Mokhtar { 1350f714a188SAmr Mokhtar int ret; 1351f714a188SAmr Mokhtar enum op_data_type type; 1352f714a188SAmr Mokhtar const uint16_t n = op_params->num_to_process; 1353f714a188SAmr Mokhtar 1354f714a188SAmr Mokhtar struct rte_mempool *mbuf_pools[DATA_NUM_TYPES] = { 1355f714a188SAmr Mokhtar in_mp, 1356f714a188SAmr Mokhtar soft_out_mp, 1357f714a188SAmr Mokhtar hard_out_mp, 1358d819c083SNicolas Chautru harq_in_mp, 1359d819c083SNicolas Chautru harq_out_mp, 1360f714a188SAmr Mokhtar }; 1361f714a188SAmr Mokhtar 1362f714a188SAmr Mokhtar struct rte_bbdev_op_data **queue_ops[DATA_NUM_TYPES] = { 1363f714a188SAmr Mokhtar &op_params->q_bufs[socket_id][queue_id].inputs, 1364f714a188SAmr Mokhtar &op_params->q_bufs[socket_id][queue_id].soft_outputs, 1365f714a188SAmr Mokhtar &op_params->q_bufs[socket_id][queue_id].hard_outputs, 1366d819c083SNicolas Chautru &op_params->q_bufs[socket_id][queue_id].harq_inputs, 1367d819c083SNicolas Chautru &op_params->q_bufs[socket_id][queue_id].harq_outputs, 1368f714a188SAmr Mokhtar }; 1369f714a188SAmr Mokhtar 1370f714a188SAmr Mokhtar for (type = DATA_INPUT; type < DATA_NUM_TYPES; ++type) { 1371f714a188SAmr Mokhtar struct op_data_entries *ref_entries = 1372f714a188SAmr Mokhtar &test_vector.entries[type]; 1373f714a188SAmr Mokhtar if (ref_entries->nb_segments == 0) 1374f714a188SAmr Mokhtar continue; 1375f714a188SAmr Mokhtar 1376f714a188SAmr Mokhtar ret = allocate_buffers_on_socket(queue_ops[type], 1377f714a188SAmr Mokhtar n * sizeof(struct rte_bbdev_op_data), 1378f714a188SAmr Mokhtar socket_id); 1379f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS(ret, 1380f714a188SAmr Mokhtar "Couldn't allocate memory for rte_bbdev_op_data structs"); 1381f714a188SAmr Mokhtar 1382f714a188SAmr Mokhtar ret = init_op_data_objs(*queue_ops[type], ref_entries, 1383f714a188SAmr Mokhtar mbuf_pools[type], n, type, min_alignment); 1384f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS(ret, 1385f714a188SAmr Mokhtar "Couldn't init rte_bbdev_op_data structs"); 1386f714a188SAmr Mokhtar } 1387f714a188SAmr Mokhtar 138847d5a049SKamil Chalupnik if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) 138947d5a049SKamil Chalupnik limit_input_llr_val_range(*queue_ops[DATA_INPUT], n, 139047d5a049SKamil Chalupnik capabilities->cap.turbo_dec.max_llr_modulus); 139147d5a049SKamil Chalupnik 1392d819c083SNicolas Chautru if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) { 1393335c11fdSNicolas Chautru bool loopback = op_params->ref_dec_op->ldpc_dec.op_flags & 1394335c11fdSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK; 1395335c11fdSNicolas Chautru bool llr_comp = op_params->ref_dec_op->ldpc_dec.op_flags & 1396335c11fdSNicolas Chautru RTE_BBDEV_LDPC_LLR_COMPRESSION; 1397335c11fdSNicolas Chautru bool harq_comp = op_params->ref_dec_op->ldpc_dec.op_flags & 1398335c11fdSNicolas Chautru RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; 13999d9d73ebSHernan Vargas 1400335c11fdSNicolas Chautru ldpc_llr_decimals = capabilities->cap.ldpc_dec.llr_decimals; 1401335c11fdSNicolas Chautru ldpc_llr_size = capabilities->cap.ldpc_dec.llr_size; 1402335c11fdSNicolas Chautru ldpc_cap_flags = capabilities->cap.ldpc_dec.capability_flags; 1403335c11fdSNicolas Chautru if (!loopback && !llr_comp) 1404d819c083SNicolas Chautru ldpc_input_llr_scaling(*queue_ops[DATA_INPUT], n, 1405335c11fdSNicolas Chautru ldpc_llr_size, ldpc_llr_decimals); 1406335c11fdSNicolas Chautru if (!loopback && !harq_comp) 1407d819c083SNicolas Chautru ldpc_input_llr_scaling(*queue_ops[DATA_HARQ_INPUT], n, 1408335c11fdSNicolas Chautru ldpc_llr_size, ldpc_llr_decimals); 1409335c11fdSNicolas Chautru if (!loopback) 1410335c11fdSNicolas Chautru ldpc_add_filler(*queue_ops[DATA_HARQ_INPUT], n, 1411335c11fdSNicolas Chautru op_params); 1412d819c083SNicolas Chautru } 1413d819c083SNicolas Chautru 1414f714a188SAmr Mokhtar return 0; 1415f714a188SAmr Mokhtar } 1416f714a188SAmr Mokhtar 1417f714a188SAmr Mokhtar static void 1418f714a188SAmr Mokhtar free_buffers(struct active_device *ad, struct test_op_params *op_params) 1419f714a188SAmr Mokhtar { 1420f714a188SAmr Mokhtar unsigned int i, j; 1421f714a188SAmr Mokhtar 1422f714a188SAmr Mokhtar rte_mempool_free(ad->ops_mempool); 1423f714a188SAmr Mokhtar rte_mempool_free(ad->in_mbuf_pool); 1424f714a188SAmr Mokhtar rte_mempool_free(ad->hard_out_mbuf_pool); 1425f714a188SAmr Mokhtar rte_mempool_free(ad->soft_out_mbuf_pool); 1426d819c083SNicolas Chautru rte_mempool_free(ad->harq_in_mbuf_pool); 1427d819c083SNicolas Chautru rte_mempool_free(ad->harq_out_mbuf_pool); 1428f714a188SAmr Mokhtar 1429f714a188SAmr Mokhtar for (i = 0; i < rte_lcore_count(); ++i) { 1430f714a188SAmr Mokhtar for (j = 0; j < RTE_MAX_NUMA_NODES; ++j) { 1431f714a188SAmr Mokhtar rte_free(op_params->q_bufs[j][i].inputs); 1432f714a188SAmr Mokhtar rte_free(op_params->q_bufs[j][i].hard_outputs); 1433f714a188SAmr Mokhtar rte_free(op_params->q_bufs[j][i].soft_outputs); 1434d819c083SNicolas Chautru rte_free(op_params->q_bufs[j][i].harq_inputs); 1435d819c083SNicolas Chautru rte_free(op_params->q_bufs[j][i].harq_outputs); 1436f714a188SAmr Mokhtar } 1437f714a188SAmr Mokhtar } 1438f714a188SAmr Mokhtar } 1439f714a188SAmr Mokhtar 1440f714a188SAmr Mokhtar static void 1441f714a188SAmr Mokhtar copy_reference_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, 1442f714a188SAmr Mokhtar unsigned int start_idx, 1443f714a188SAmr Mokhtar struct rte_bbdev_op_data *inputs, 1444f714a188SAmr Mokhtar struct rte_bbdev_op_data *hard_outputs, 1445f714a188SAmr Mokhtar struct rte_bbdev_op_data *soft_outputs, 1446f714a188SAmr Mokhtar struct rte_bbdev_dec_op *ref_op) 1447f714a188SAmr Mokhtar { 1448f714a188SAmr Mokhtar unsigned int i; 1449f714a188SAmr Mokhtar struct rte_bbdev_op_turbo_dec *turbo_dec = &ref_op->turbo_dec; 1450f714a188SAmr Mokhtar 1451f714a188SAmr Mokhtar for (i = 0; i < n; ++i) { 145248fc315fSNicolas Chautru if (turbo_dec->code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) { 1453f714a188SAmr Mokhtar ops[i]->turbo_dec.tb_params.ea = 1454f714a188SAmr Mokhtar turbo_dec->tb_params.ea; 1455f714a188SAmr Mokhtar ops[i]->turbo_dec.tb_params.eb = 1456f714a188SAmr Mokhtar turbo_dec->tb_params.eb; 1457f714a188SAmr Mokhtar ops[i]->turbo_dec.tb_params.k_pos = 1458f714a188SAmr Mokhtar turbo_dec->tb_params.k_pos; 1459f714a188SAmr Mokhtar ops[i]->turbo_dec.tb_params.k_neg = 1460f714a188SAmr Mokhtar turbo_dec->tb_params.k_neg; 1461f714a188SAmr Mokhtar ops[i]->turbo_dec.tb_params.c = 1462f714a188SAmr Mokhtar turbo_dec->tb_params.c; 1463f714a188SAmr Mokhtar ops[i]->turbo_dec.tb_params.c_neg = 1464f714a188SAmr Mokhtar turbo_dec->tb_params.c_neg; 1465f714a188SAmr Mokhtar ops[i]->turbo_dec.tb_params.cab = 1466f714a188SAmr Mokhtar turbo_dec->tb_params.cab; 14670b98d574SKamil Chalupnik ops[i]->turbo_dec.tb_params.r = 14680b98d574SKamil Chalupnik turbo_dec->tb_params.r; 1469f714a188SAmr Mokhtar } else { 1470f714a188SAmr Mokhtar ops[i]->turbo_dec.cb_params.e = turbo_dec->cb_params.e; 1471f714a188SAmr Mokhtar ops[i]->turbo_dec.cb_params.k = turbo_dec->cb_params.k; 1472f714a188SAmr Mokhtar } 1473f714a188SAmr Mokhtar 1474f714a188SAmr Mokhtar ops[i]->turbo_dec.ext_scale = turbo_dec->ext_scale; 1475f714a188SAmr Mokhtar ops[i]->turbo_dec.iter_max = turbo_dec->iter_max; 1476f714a188SAmr Mokhtar ops[i]->turbo_dec.iter_min = turbo_dec->iter_min; 1477f714a188SAmr Mokhtar ops[i]->turbo_dec.op_flags = turbo_dec->op_flags; 1478f714a188SAmr Mokhtar ops[i]->turbo_dec.rv_index = turbo_dec->rv_index; 1479f714a188SAmr Mokhtar ops[i]->turbo_dec.num_maps = turbo_dec->num_maps; 1480f714a188SAmr Mokhtar ops[i]->turbo_dec.code_block_mode = turbo_dec->code_block_mode; 1481f714a188SAmr Mokhtar 1482f714a188SAmr Mokhtar ops[i]->turbo_dec.hard_output = hard_outputs[start_idx + i]; 1483f714a188SAmr Mokhtar ops[i]->turbo_dec.input = inputs[start_idx + i]; 1484f714a188SAmr Mokhtar if (soft_outputs != NULL) 1485f714a188SAmr Mokhtar ops[i]->turbo_dec.soft_output = 1486f714a188SAmr Mokhtar soft_outputs[start_idx + i]; 1487f714a188SAmr Mokhtar } 1488f714a188SAmr Mokhtar } 1489f714a188SAmr Mokhtar 1490f714a188SAmr Mokhtar static void 1491f714a188SAmr Mokhtar copy_reference_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n, 1492f714a188SAmr Mokhtar unsigned int start_idx, 1493f714a188SAmr Mokhtar struct rte_bbdev_op_data *inputs, 1494f714a188SAmr Mokhtar struct rte_bbdev_op_data *outputs, 1495f714a188SAmr Mokhtar struct rte_bbdev_enc_op *ref_op) 1496f714a188SAmr Mokhtar { 1497f714a188SAmr Mokhtar unsigned int i; 1498f714a188SAmr Mokhtar struct rte_bbdev_op_turbo_enc *turbo_enc = &ref_op->turbo_enc; 1499f714a188SAmr Mokhtar for (i = 0; i < n; ++i) { 150048fc315fSNicolas Chautru if (turbo_enc->code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) { 1501f714a188SAmr Mokhtar ops[i]->turbo_enc.tb_params.ea = 1502f714a188SAmr Mokhtar turbo_enc->tb_params.ea; 1503f714a188SAmr Mokhtar ops[i]->turbo_enc.tb_params.eb = 1504f714a188SAmr Mokhtar turbo_enc->tb_params.eb; 1505f714a188SAmr Mokhtar ops[i]->turbo_enc.tb_params.k_pos = 1506f714a188SAmr Mokhtar turbo_enc->tb_params.k_pos; 1507f714a188SAmr Mokhtar ops[i]->turbo_enc.tb_params.k_neg = 1508f714a188SAmr Mokhtar turbo_enc->tb_params.k_neg; 1509f714a188SAmr Mokhtar ops[i]->turbo_enc.tb_params.c = 1510f714a188SAmr Mokhtar turbo_enc->tb_params.c; 1511f714a188SAmr Mokhtar ops[i]->turbo_enc.tb_params.c_neg = 1512f714a188SAmr Mokhtar turbo_enc->tb_params.c_neg; 1513f714a188SAmr Mokhtar ops[i]->turbo_enc.tb_params.cab = 1514f714a188SAmr Mokhtar turbo_enc->tb_params.cab; 1515f714a188SAmr Mokhtar ops[i]->turbo_enc.tb_params.ncb_pos = 1516f714a188SAmr Mokhtar turbo_enc->tb_params.ncb_pos; 1517f714a188SAmr Mokhtar ops[i]->turbo_enc.tb_params.ncb_neg = 1518f714a188SAmr Mokhtar turbo_enc->tb_params.ncb_neg; 1519f714a188SAmr Mokhtar ops[i]->turbo_enc.tb_params.r = turbo_enc->tb_params.r; 1520f714a188SAmr Mokhtar } else { 1521f714a188SAmr Mokhtar ops[i]->turbo_enc.cb_params.e = turbo_enc->cb_params.e; 1522f714a188SAmr Mokhtar ops[i]->turbo_enc.cb_params.k = turbo_enc->cb_params.k; 1523f714a188SAmr Mokhtar ops[i]->turbo_enc.cb_params.ncb = 1524f714a188SAmr Mokhtar turbo_enc->cb_params.ncb; 1525f714a188SAmr Mokhtar } 1526f714a188SAmr Mokhtar ops[i]->turbo_enc.rv_index = turbo_enc->rv_index; 1527f714a188SAmr Mokhtar ops[i]->turbo_enc.op_flags = turbo_enc->op_flags; 1528f714a188SAmr Mokhtar ops[i]->turbo_enc.code_block_mode = turbo_enc->code_block_mode; 1529f714a188SAmr Mokhtar 1530f714a188SAmr Mokhtar ops[i]->turbo_enc.output = outputs[start_idx + i]; 1531f714a188SAmr Mokhtar ops[i]->turbo_enc.input = inputs[start_idx + i]; 1532f714a188SAmr Mokhtar } 1533f714a188SAmr Mokhtar } 1534f714a188SAmr Mokhtar 1535f41c6e4dSNicolas Chautru 1536f41c6e4dSNicolas Chautru /* Returns a random number drawn from a normal distribution 1537f41c6e4dSNicolas Chautru * with mean of 0 and variance of 1 1538f41c6e4dSNicolas Chautru * Marsaglia algorithm 1539f41c6e4dSNicolas Chautru */ 1540f41c6e4dSNicolas Chautru static double 1541f41c6e4dSNicolas Chautru randn(int n) 1542f41c6e4dSNicolas Chautru { 1543f41c6e4dSNicolas Chautru double S, Z, U1, U2, u, v, fac; 1544f41c6e4dSNicolas Chautru 1545f41c6e4dSNicolas Chautru do { 1546f41c6e4dSNicolas Chautru U1 = (double)rand() / RAND_MAX; 1547f41c6e4dSNicolas Chautru U2 = (double)rand() / RAND_MAX; 1548f41c6e4dSNicolas Chautru u = 2. * U1 - 1.; 1549f41c6e4dSNicolas Chautru v = 2. * U2 - 1.; 1550f41c6e4dSNicolas Chautru S = u * u + v * v; 1551f41c6e4dSNicolas Chautru } while (S >= 1 || S == 0); 1552f41c6e4dSNicolas Chautru fac = sqrt(-2. * log(S) / S); 1553f41c6e4dSNicolas Chautru Z = (n % 2) ? u * fac : v * fac; 1554f41c6e4dSNicolas Chautru return Z; 1555f41c6e4dSNicolas Chautru } 1556f41c6e4dSNicolas Chautru 1557f41c6e4dSNicolas Chautru static inline double 1558f41c6e4dSNicolas Chautru maxstar(double A, double B) 1559f41c6e4dSNicolas Chautru { 1560f41c6e4dSNicolas Chautru if (fabs(A - B) > 5) 1561f41c6e4dSNicolas Chautru return RTE_MAX(A, B); 1562f41c6e4dSNicolas Chautru else 1563f41c6e4dSNicolas Chautru return RTE_MAX(A, B) + log1p(exp(-fabs(A - B))); 1564f41c6e4dSNicolas Chautru } 1565f41c6e4dSNicolas Chautru 1566f41c6e4dSNicolas Chautru /* 1567f41c6e4dSNicolas Chautru * Generate Qm LLRS for Qm==8 1568f41c6e4dSNicolas Chautru * Modulation, AWGN and LLR estimation from max log development 1569f41c6e4dSNicolas Chautru */ 1570f41c6e4dSNicolas Chautru static void 1571f41c6e4dSNicolas Chautru gen_qm8_llr(int8_t *llrs, uint32_t i, double N0, double llr_max) 1572f41c6e4dSNicolas Chautru { 1573f41c6e4dSNicolas Chautru int qm = 8; 1574f41c6e4dSNicolas Chautru int qam = 256; 1575f41c6e4dSNicolas Chautru int m, k; 1576f41c6e4dSNicolas Chautru double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam]; 1577f41c6e4dSNicolas Chautru /* 5.1.4 of TS38.211 */ 1578f41c6e4dSNicolas Chautru const double symbols_I[256] = { 1579f41c6e4dSNicolas Chautru 5, 5, 7, 7, 5, 5, 7, 7, 3, 3, 1, 1, 3, 3, 1, 1, 5, 1580f41c6e4dSNicolas Chautru 5, 7, 7, 5, 5, 7, 7, 3, 3, 1, 1, 3, 3, 1, 1, 11, 1581f41c6e4dSNicolas Chautru 11, 9, 9, 11, 11, 9, 9, 13, 13, 15, 15, 13, 13, 1582f41c6e4dSNicolas Chautru 15, 15, 11, 11, 9, 9, 11, 11, 9, 9, 13, 13, 15, 1583f41c6e4dSNicolas Chautru 15, 13, 13, 15, 15, 5, 5, 7, 7, 5, 5, 7, 7, 3, 3, 1584f41c6e4dSNicolas Chautru 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7, 3, 3, 1, 1585f41c6e4dSNicolas Chautru 1, 3, 3, 1, 1, 11, 11, 9, 9, 11, 11, 9, 9, 13, 13, 1586f41c6e4dSNicolas Chautru 15, 15, 13, 13, 15, 15, 11, 11, 9, 9, 11, 11, 9, 9, 1587f41c6e4dSNicolas Chautru 13, 13, 15, 15, 13, 13, 15, 15, -5, -5, -7, -7, -5, 1588f41c6e4dSNicolas Chautru -5, -7, -7, -3, -3, -1, -1, -3, -3, -1, -1, -5, -5, 1589f41c6e4dSNicolas Chautru -7, -7, -5, -5, -7, -7, -3, -3, -1, -1, -3, -3, 1590f41c6e4dSNicolas Chautru -1, -1, -11, -11, -9, -9, -11, -11, -9, -9, -13, 1591f41c6e4dSNicolas Chautru -13, -15, -15, -13, -13, -15, -15, -11, -11, -9, 1592f41c6e4dSNicolas Chautru -9, -11, -11, -9, -9, -13, -13, -15, -15, -13, 1593f41c6e4dSNicolas Chautru -13, -15, -15, -5, -5, -7, -7, -5, -5, -7, -7, -3, 1594f41c6e4dSNicolas Chautru -3, -1, -1, -3, -3, -1, -1, -5, -5, -7, -7, -5, -5, 1595f41c6e4dSNicolas Chautru -7, -7, -3, -3, -1, -1, -3, -3, -1, -1, -11, -11, 1596f41c6e4dSNicolas Chautru -9, -9, -11, -11, -9, -9, -13, -13, -15, -15, -13, 1597f41c6e4dSNicolas Chautru -13, -15, -15, -11, -11, -9, -9, -11, -11, -9, -9, 1598f41c6e4dSNicolas Chautru -13, -13, -15, -15, -13, -13, -15, -15}; 1599f41c6e4dSNicolas Chautru const double symbols_Q[256] = { 1600f41c6e4dSNicolas Chautru 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 11, 1601f41c6e4dSNicolas Chautru 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, 15, 13, 1602f41c6e4dSNicolas Chautru 15, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 1603f41c6e4dSNicolas Chautru 11, 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, 1604f41c6e4dSNicolas Chautru 15, 13, 15, -5, -7, -5, -7, -3, -1, -3, -1, -5, 1605f41c6e4dSNicolas Chautru -7, -5, -7, -3, -1, -3, -1, -11, -9, -11, -9, -13, 1606f41c6e4dSNicolas Chautru -15, -13, -15, -11, -9, -11, -9, -13, -15, -13, 1607f41c6e4dSNicolas Chautru -15, -5, -7, -5, -7, -3, -1, -3, -1, -5, -7, -5, 1608f41c6e4dSNicolas Chautru -7, -3, -1, -3, -1, -11, -9, -11, -9, -13, -15, 1609f41c6e4dSNicolas Chautru -13, -15, -11, -9, -11, -9, -13, -15, -13, -15, 5, 1610f41c6e4dSNicolas Chautru 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 11, 1611f41c6e4dSNicolas Chautru 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 13, 15, 1612f41c6e4dSNicolas Chautru 13, 15, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 1613f41c6e4dSNicolas Chautru 3, 1, 11, 9, 11, 9, 13, 15, 13, 15, 11, 9, 11, 9, 1614f41c6e4dSNicolas Chautru 13, 15, 13, 15, -5, -7, -5, -7, -3, -1, -3, -1, 1615f41c6e4dSNicolas Chautru -5, -7, -5, -7, -3, -1, -3, -1, -11, -9, -11, -9, 1616f41c6e4dSNicolas Chautru -13, -15, -13, -15, -11, -9, -11, -9, -13, -15, 1617f41c6e4dSNicolas Chautru -13, -15, -5, -7, -5, -7, -3, -1, -3, -1, -5, -7, 1618f41c6e4dSNicolas Chautru -5, -7, -3, -1, -3, -1, -11, -9, -11, -9, -13, -15, 1619f41c6e4dSNicolas Chautru -13, -15, -11, -9, -11, -9, -13, -15, -13, -15}; 1620f41c6e4dSNicolas Chautru /* Average constellation point energy */ 1621f41c6e4dSNicolas Chautru N0 *= 170.0; 1622f41c6e4dSNicolas Chautru for (k = 0; k < qm; k++) 1623f41c6e4dSNicolas Chautru b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0; 1624f41c6e4dSNicolas Chautru /* 5.1.4 of TS38.211 */ 1625f41c6e4dSNicolas Chautru I = (1 - 2 * b[0]) * (8 - (1 - 2 * b[2]) * 1626f41c6e4dSNicolas Chautru (4 - (1 - 2 * b[4]) * (2 - (1 - 2 * b[6])))); 1627f41c6e4dSNicolas Chautru Q = (1 - 2 * b[1]) * (8 - (1 - 2 * b[3]) * 1628f41c6e4dSNicolas Chautru (4 - (1 - 2 * b[5]) * (2 - (1 - 2 * b[7])))); 1629f41c6e4dSNicolas Chautru /* AWGN channel */ 1630f41c6e4dSNicolas Chautru I += sqrt(N0 / 2) * randn(0); 1631f41c6e4dSNicolas Chautru Q += sqrt(N0 / 2) * randn(1); 1632f41c6e4dSNicolas Chautru /* 1633f41c6e4dSNicolas Chautru * Calculate the log of the probability that each of 1634f41c6e4dSNicolas Chautru * the constellation points was transmitted 1635f41c6e4dSNicolas Chautru */ 1636f41c6e4dSNicolas Chautru for (m = 0; m < qam; m++) 1637f41c6e4dSNicolas Chautru log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0) 1638f41c6e4dSNicolas Chautru + pow(Q - symbols_Q[m], 2.0)) / N0; 1639f41c6e4dSNicolas Chautru /* Calculate an LLR for each of the k_64QAM bits in the set */ 1640f41c6e4dSNicolas Chautru for (k = 0; k < qm; k++) { 1641f41c6e4dSNicolas Chautru p0 = -999999; 1642f41c6e4dSNicolas Chautru p1 = -999999; 1643f41c6e4dSNicolas Chautru /* For each constellation point */ 1644f41c6e4dSNicolas Chautru for (m = 0; m < qam; m++) { 1645f41c6e4dSNicolas Chautru if ((m >> (qm - k - 1)) & 1) 1646f41c6e4dSNicolas Chautru p1 = maxstar(p1, log_syml_prob[m]); 1647f41c6e4dSNicolas Chautru else 1648f41c6e4dSNicolas Chautru p0 = maxstar(p0, log_syml_prob[m]); 1649f41c6e4dSNicolas Chautru } 1650f41c6e4dSNicolas Chautru /* Calculate the LLR */ 1651f41c6e4dSNicolas Chautru llr_ = p0 - p1; 1652f41c6e4dSNicolas Chautru llr_ *= (1 << ldpc_llr_decimals); 1653f41c6e4dSNicolas Chautru llr_ = round(llr_); 1654f41c6e4dSNicolas Chautru if (llr_ > llr_max) 1655f41c6e4dSNicolas Chautru llr_ = llr_max; 1656f41c6e4dSNicolas Chautru if (llr_ < -llr_max) 1657f41c6e4dSNicolas Chautru llr_ = -llr_max; 1658f41c6e4dSNicolas Chautru llrs[qm * i + k] = (int8_t) llr_; 1659f41c6e4dSNicolas Chautru } 1660f41c6e4dSNicolas Chautru } 1661f41c6e4dSNicolas Chautru 1662f41c6e4dSNicolas Chautru 1663f41c6e4dSNicolas Chautru /* 1664f41c6e4dSNicolas Chautru * Generate Qm LLRS for Qm==6 1665f41c6e4dSNicolas Chautru * Modulation, AWGN and LLR estimation from max log development 1666f41c6e4dSNicolas Chautru */ 1667f41c6e4dSNicolas Chautru static void 1668f41c6e4dSNicolas Chautru gen_qm6_llr(int8_t *llrs, uint32_t i, double N0, double llr_max) 1669f41c6e4dSNicolas Chautru { 1670f41c6e4dSNicolas Chautru int qm = 6; 1671f41c6e4dSNicolas Chautru int qam = 64; 1672f41c6e4dSNicolas Chautru int m, k; 1673f41c6e4dSNicolas Chautru double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam]; 1674f41c6e4dSNicolas Chautru /* 5.1.4 of TS38.211 */ 1675f41c6e4dSNicolas Chautru const double symbols_I[64] = { 1676f41c6e4dSNicolas Chautru 3, 3, 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7, 1677f41c6e4dSNicolas Chautru 3, 3, 1, 1, 3, 3, 1, 1, 5, 5, 7, 7, 5, 5, 7, 7, 1678f41c6e4dSNicolas Chautru -3, -3, -1, -1, -3, -3, -1, -1, -5, -5, -7, -7, 1679f41c6e4dSNicolas Chautru -5, -5, -7, -7, -3, -3, -1, -1, -3, -3, -1, -1, 1680f41c6e4dSNicolas Chautru -5, -5, -7, -7, -5, -5, -7, -7}; 1681f41c6e4dSNicolas Chautru const double symbols_Q[64] = { 1682f41c6e4dSNicolas Chautru 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 5, 7, 5, 7, 1683f41c6e4dSNicolas Chautru -3, -1, -3, -1, -5, -7, -5, -7, -3, -1, -3, -1, 1684f41c6e4dSNicolas Chautru -5, -7, -5, -7, 3, 1, 3, 1, 5, 7, 5, 7, 3, 1, 3, 1, 1685f41c6e4dSNicolas Chautru 5, 7, 5, 7, -3, -1, -3, -1, -5, -7, -5, -7, 1686f41c6e4dSNicolas Chautru -3, -1, -3, -1, -5, -7, -5, -7}; 1687f41c6e4dSNicolas Chautru /* Average constellation point energy */ 1688f41c6e4dSNicolas Chautru N0 *= 42.0; 1689f41c6e4dSNicolas Chautru for (k = 0; k < qm; k++) 1690f41c6e4dSNicolas Chautru b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0; 1691f41c6e4dSNicolas Chautru /* 5.1.4 of TS38.211 */ 1692f41c6e4dSNicolas Chautru I = (1 - 2 * b[0])*(4 - (1 - 2 * b[2]) * (2 - (1 - 2 * b[4]))); 1693f41c6e4dSNicolas Chautru Q = (1 - 2 * b[1])*(4 - (1 - 2 * b[3]) * (2 - (1 - 2 * b[5]))); 1694f41c6e4dSNicolas Chautru /* AWGN channel */ 1695f41c6e4dSNicolas Chautru I += sqrt(N0 / 2) * randn(0); 1696f41c6e4dSNicolas Chautru Q += sqrt(N0 / 2) * randn(1); 1697f41c6e4dSNicolas Chautru /* 1698f41c6e4dSNicolas Chautru * Calculate the log of the probability that each of 1699f41c6e4dSNicolas Chautru * the constellation points was transmitted 1700f41c6e4dSNicolas Chautru */ 1701f41c6e4dSNicolas Chautru for (m = 0; m < qam; m++) 1702f41c6e4dSNicolas Chautru log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0) 1703f41c6e4dSNicolas Chautru + pow(Q - symbols_Q[m], 2.0)) / N0; 1704f41c6e4dSNicolas Chautru /* Calculate an LLR for each of the k_64QAM bits in the set */ 1705f41c6e4dSNicolas Chautru for (k = 0; k < qm; k++) { 1706f41c6e4dSNicolas Chautru p0 = -999999; 1707f41c6e4dSNicolas Chautru p1 = -999999; 1708f41c6e4dSNicolas Chautru /* For each constellation point */ 1709f41c6e4dSNicolas Chautru for (m = 0; m < qam; m++) { 1710f41c6e4dSNicolas Chautru if ((m >> (qm - k - 1)) & 1) 1711f41c6e4dSNicolas Chautru p1 = maxstar(p1, log_syml_prob[m]); 1712f41c6e4dSNicolas Chautru else 1713f41c6e4dSNicolas Chautru p0 = maxstar(p0, log_syml_prob[m]); 1714f41c6e4dSNicolas Chautru } 1715f41c6e4dSNicolas Chautru /* Calculate the LLR */ 1716f41c6e4dSNicolas Chautru llr_ = p0 - p1; 1717f41c6e4dSNicolas Chautru llr_ *= (1 << ldpc_llr_decimals); 1718f41c6e4dSNicolas Chautru llr_ = round(llr_); 1719f41c6e4dSNicolas Chautru if (llr_ > llr_max) 1720f41c6e4dSNicolas Chautru llr_ = llr_max; 1721f41c6e4dSNicolas Chautru if (llr_ < -llr_max) 1722f41c6e4dSNicolas Chautru llr_ = -llr_max; 1723f41c6e4dSNicolas Chautru llrs[qm * i + k] = (int8_t) llr_; 1724f41c6e4dSNicolas Chautru } 1725f41c6e4dSNicolas Chautru } 1726f41c6e4dSNicolas Chautru 1727f41c6e4dSNicolas Chautru /* 1728f41c6e4dSNicolas Chautru * Generate Qm LLRS for Qm==4 1729f41c6e4dSNicolas Chautru * Modulation, AWGN and LLR estimation from max log development 1730f41c6e4dSNicolas Chautru */ 1731f41c6e4dSNicolas Chautru static void 1732f41c6e4dSNicolas Chautru gen_qm4_llr(int8_t *llrs, uint32_t i, double N0, double llr_max) 1733f41c6e4dSNicolas Chautru { 1734f41c6e4dSNicolas Chautru int qm = 4; 1735f41c6e4dSNicolas Chautru int qam = 16; 1736f41c6e4dSNicolas Chautru int m, k; 1737f41c6e4dSNicolas Chautru double I, Q, p0, p1, llr_, b[qm], log_syml_prob[qam]; 1738f41c6e4dSNicolas Chautru /* 5.1.4 of TS38.211 */ 1739f41c6e4dSNicolas Chautru const double symbols_I[16] = {1, 1, 3, 3, 1, 1, 3, 3, 1740f41c6e4dSNicolas Chautru -1, -1, -3, -3, -1, -1, -3, -3}; 1741f41c6e4dSNicolas Chautru const double symbols_Q[16] = {1, 3, 1, 3, -1, -3, -1, -3, 1742f41c6e4dSNicolas Chautru 1, 3, 1, 3, -1, -3, -1, -3}; 1743f41c6e4dSNicolas Chautru /* Average constellation point energy */ 1744f41c6e4dSNicolas Chautru N0 *= 10.0; 1745f41c6e4dSNicolas Chautru for (k = 0; k < qm; k++) 1746f41c6e4dSNicolas Chautru b[k] = llrs[qm * i + k] < 0 ? 1.0 : 0.0; 1747f41c6e4dSNicolas Chautru /* 5.1.4 of TS38.211 */ 1748f41c6e4dSNicolas Chautru I = (1 - 2 * b[0]) * (2 - (1 - 2 * b[2])); 1749f41c6e4dSNicolas Chautru Q = (1 - 2 * b[1]) * (2 - (1 - 2 * b[3])); 1750f41c6e4dSNicolas Chautru /* AWGN channel */ 1751f41c6e4dSNicolas Chautru I += sqrt(N0 / 2) * randn(0); 1752f41c6e4dSNicolas Chautru Q += sqrt(N0 / 2) * randn(1); 1753f41c6e4dSNicolas Chautru /* 1754f41c6e4dSNicolas Chautru * Calculate the log of the probability that each of 1755f41c6e4dSNicolas Chautru * the constellation points was transmitted 1756f41c6e4dSNicolas Chautru */ 1757f41c6e4dSNicolas Chautru for (m = 0; m < qam; m++) 1758f41c6e4dSNicolas Chautru log_syml_prob[m] = -(pow(I - symbols_I[m], 2.0) 1759f41c6e4dSNicolas Chautru + pow(Q - symbols_Q[m], 2.0)) / N0; 1760f41c6e4dSNicolas Chautru /* Calculate an LLR for each of the k_64QAM bits in the set */ 1761f41c6e4dSNicolas Chautru for (k = 0; k < qm; k++) { 1762f41c6e4dSNicolas Chautru p0 = -999999; 1763f41c6e4dSNicolas Chautru p1 = -999999; 1764f41c6e4dSNicolas Chautru /* For each constellation point */ 1765f41c6e4dSNicolas Chautru for (m = 0; m < qam; m++) { 1766f41c6e4dSNicolas Chautru if ((m >> (qm - k - 1)) & 1) 1767f41c6e4dSNicolas Chautru p1 = maxstar(p1, log_syml_prob[m]); 1768f41c6e4dSNicolas Chautru else 1769f41c6e4dSNicolas Chautru p0 = maxstar(p0, log_syml_prob[m]); 1770f41c6e4dSNicolas Chautru } 1771f41c6e4dSNicolas Chautru /* Calculate the LLR */ 1772f41c6e4dSNicolas Chautru llr_ = p0 - p1; 1773f41c6e4dSNicolas Chautru llr_ *= (1 << ldpc_llr_decimals); 1774f41c6e4dSNicolas Chautru llr_ = round(llr_); 1775f41c6e4dSNicolas Chautru if (llr_ > llr_max) 1776f41c6e4dSNicolas Chautru llr_ = llr_max; 1777f41c6e4dSNicolas Chautru if (llr_ < -llr_max) 1778f41c6e4dSNicolas Chautru llr_ = -llr_max; 1779f41c6e4dSNicolas Chautru llrs[qm * i + k] = (int8_t) llr_; 1780f41c6e4dSNicolas Chautru } 1781f41c6e4dSNicolas Chautru } 1782f41c6e4dSNicolas Chautru 1783f41c6e4dSNicolas Chautru static void 1784f41c6e4dSNicolas Chautru gen_qm2_llr(int8_t *llrs, uint32_t j, double N0, double llr_max) 1785f41c6e4dSNicolas Chautru { 1786f41c6e4dSNicolas Chautru double b, b1, n; 1787f41c6e4dSNicolas Chautru double coeff = 2.0 * sqrt(N0); 1788f41c6e4dSNicolas Chautru 1789f41c6e4dSNicolas Chautru /* Ignore in vectors rare quasi null LLRs not to be saturated */ 1790f41c6e4dSNicolas Chautru if (llrs[j] < 8 && llrs[j] > -8) 1791f41c6e4dSNicolas Chautru return; 1792f41c6e4dSNicolas Chautru 1793f41c6e4dSNicolas Chautru /* Note don't change sign here */ 1794f41c6e4dSNicolas Chautru n = randn(j % 2); 1795f41c6e4dSNicolas Chautru b1 = ((llrs[j] > 0 ? 2.0 : -2.0) 1796f41c6e4dSNicolas Chautru + coeff * n) / N0; 1797f41c6e4dSNicolas Chautru b = b1 * (1 << ldpc_llr_decimals); 1798f41c6e4dSNicolas Chautru b = round(b); 1799f41c6e4dSNicolas Chautru if (b > llr_max) 1800f41c6e4dSNicolas Chautru b = llr_max; 1801f41c6e4dSNicolas Chautru if (b < -llr_max) 1802f41c6e4dSNicolas Chautru b = -llr_max; 1803f41c6e4dSNicolas Chautru llrs[j] = (int8_t) b; 1804f41c6e4dSNicolas Chautru } 1805f41c6e4dSNicolas Chautru 18067831a968SHernan Vargas /* Simple LLR generation assuming AWGN and QPSK */ 18077831a968SHernan Vargas static void 18087831a968SHernan Vargas gen_turbo_llr(int8_t *llrs, uint32_t j, double N0, double llr_max) 18097831a968SHernan Vargas { 18107831a968SHernan Vargas double b, b1, n; 18117831a968SHernan Vargas double coeff = 2.0 * sqrt(N0); 18127831a968SHernan Vargas 18137831a968SHernan Vargas /* Ignore in vectors null LLRs not to be saturated */ 18147831a968SHernan Vargas if (llrs[j] == 0) 18157831a968SHernan Vargas return; 18167831a968SHernan Vargas 18177831a968SHernan Vargas /* Note don't change sign here */ 18187831a968SHernan Vargas n = randn(j % 2); 18197831a968SHernan Vargas b1 = ((llrs[j] > 0 ? 2.0 : -2.0) 18207831a968SHernan Vargas + coeff * n) / N0; 18217831a968SHernan Vargas b = b1 * (1 << 4); 18227831a968SHernan Vargas b = round(b); 18237831a968SHernan Vargas if (b > llr_max) 18247831a968SHernan Vargas b = llr_max; 18257831a968SHernan Vargas if (b < -llr_max) 18267831a968SHernan Vargas b = -llr_max; 18277831a968SHernan Vargas llrs[j] = (int8_t) b; 18287831a968SHernan Vargas } 18297831a968SHernan Vargas 1830f41c6e4dSNicolas Chautru /* Generate LLR for a given SNR */ 1831f41c6e4dSNicolas Chautru static void 1832f41c6e4dSNicolas Chautru generate_llr_input(uint16_t n, struct rte_bbdev_op_data *inputs, 1833f41c6e4dSNicolas Chautru struct rte_bbdev_dec_op *ref_op) 1834f41c6e4dSNicolas Chautru { 1835f41c6e4dSNicolas Chautru struct rte_mbuf *m; 1836f41c6e4dSNicolas Chautru uint16_t qm; 1837f41c6e4dSNicolas Chautru uint32_t i, j, e, range; 1838f41c6e4dSNicolas Chautru double N0, llr_max; 1839f41c6e4dSNicolas Chautru 1840f41c6e4dSNicolas Chautru e = ref_op->ldpc_dec.cb_params.e; 1841f41c6e4dSNicolas Chautru qm = ref_op->ldpc_dec.q_m; 1842f41c6e4dSNicolas Chautru llr_max = (1 << (ldpc_llr_size - 1)) - 1; 1843f41c6e4dSNicolas Chautru range = e / qm; 1844f41c6e4dSNicolas Chautru N0 = 1.0 / pow(10.0, get_snr() / 10.0); 1845f41c6e4dSNicolas Chautru 1846f41c6e4dSNicolas Chautru for (i = 0; i < n; ++i) { 1847f41c6e4dSNicolas Chautru m = inputs[i].data; 1848f41c6e4dSNicolas Chautru int8_t *llrs = rte_pktmbuf_mtod_offset(m, int8_t *, 0); 1849f41c6e4dSNicolas Chautru if (qm == 8) { 1850f41c6e4dSNicolas Chautru for (j = 0; j < range; ++j) 1851f41c6e4dSNicolas Chautru gen_qm8_llr(llrs, j, N0, llr_max); 1852f41c6e4dSNicolas Chautru } else if (qm == 6) { 1853f41c6e4dSNicolas Chautru for (j = 0; j < range; ++j) 1854f41c6e4dSNicolas Chautru gen_qm6_llr(llrs, j, N0, llr_max); 1855f41c6e4dSNicolas Chautru } else if (qm == 4) { 1856f41c6e4dSNicolas Chautru for (j = 0; j < range; ++j) 1857f41c6e4dSNicolas Chautru gen_qm4_llr(llrs, j, N0, llr_max); 1858f41c6e4dSNicolas Chautru } else { 1859f41c6e4dSNicolas Chautru for (j = 0; j < e; ++j) 1860f41c6e4dSNicolas Chautru gen_qm2_llr(llrs, j, N0, llr_max); 1861f41c6e4dSNicolas Chautru } 1862f41c6e4dSNicolas Chautru } 1863f41c6e4dSNicolas Chautru } 1864f41c6e4dSNicolas Chautru 18657831a968SHernan Vargas /* Generate LLR for turbo decoder for a given SNR */ 18667831a968SHernan Vargas static void 18677831a968SHernan Vargas generate_turbo_llr_input(uint16_t n, struct rte_bbdev_op_data *inputs, 18687831a968SHernan Vargas struct rte_bbdev_dec_op *ref_op) 18697831a968SHernan Vargas { 18707831a968SHernan Vargas struct rte_mbuf *m; 18717831a968SHernan Vargas uint32_t i, j, range; 18727831a968SHernan Vargas double N0, llr_max; 18737831a968SHernan Vargas 18747831a968SHernan Vargas llr_max = 127; 18757831a968SHernan Vargas range = ref_op->turbo_dec.input.length; 18767831a968SHernan Vargas N0 = 1.0 / pow(10.0, get_snr() / 10.0); 18777831a968SHernan Vargas 18785471c7d4SHernan Vargas if (range > inputs[0].data->data_len) { 18795471c7d4SHernan Vargas printf("Warning: Limiting LLR generation to first segment (%d from %d)\n", 18805471c7d4SHernan Vargas inputs[0].data->data_len, range); 18815471c7d4SHernan Vargas range = inputs[0].data->data_len; 18825471c7d4SHernan Vargas } 18835471c7d4SHernan Vargas 18847831a968SHernan Vargas for (i = 0; i < n; ++i) { 18857831a968SHernan Vargas m = inputs[i].data; 18867831a968SHernan Vargas int8_t *llrs = rte_pktmbuf_mtod_offset(m, int8_t *, 0); 18877831a968SHernan Vargas for (j = 0; j < range; ++j) 18887831a968SHernan Vargas gen_turbo_llr(llrs, j, N0, llr_max); 18897831a968SHernan Vargas } 18907831a968SHernan Vargas } 18917831a968SHernan Vargas 1892d819c083SNicolas Chautru static void 1893d819c083SNicolas Chautru copy_reference_ldpc_dec_op(struct rte_bbdev_dec_op **ops, unsigned int n, 1894d819c083SNicolas Chautru unsigned int start_idx, 1895d819c083SNicolas Chautru struct rte_bbdev_op_data *inputs, 1896d819c083SNicolas Chautru struct rte_bbdev_op_data *hard_outputs, 1897d819c083SNicolas Chautru struct rte_bbdev_op_data *soft_outputs, 1898d819c083SNicolas Chautru struct rte_bbdev_op_data *harq_inputs, 1899d819c083SNicolas Chautru struct rte_bbdev_op_data *harq_outputs, 1900d819c083SNicolas Chautru struct rte_bbdev_dec_op *ref_op) 1901d819c083SNicolas Chautru { 1902d819c083SNicolas Chautru unsigned int i; 1903d819c083SNicolas Chautru struct rte_bbdev_op_ldpc_dec *ldpc_dec = &ref_op->ldpc_dec; 1904d819c083SNicolas Chautru 1905d819c083SNicolas Chautru for (i = 0; i < n; ++i) { 190648fc315fSNicolas Chautru if (ldpc_dec->code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) { 1907d819c083SNicolas Chautru ops[i]->ldpc_dec.tb_params.ea = 1908d819c083SNicolas Chautru ldpc_dec->tb_params.ea; 1909d819c083SNicolas Chautru ops[i]->ldpc_dec.tb_params.eb = 1910d819c083SNicolas Chautru ldpc_dec->tb_params.eb; 1911d819c083SNicolas Chautru ops[i]->ldpc_dec.tb_params.c = 1912d819c083SNicolas Chautru ldpc_dec->tb_params.c; 1913d819c083SNicolas Chautru ops[i]->ldpc_dec.tb_params.cab = 1914d819c083SNicolas Chautru ldpc_dec->tb_params.cab; 1915d819c083SNicolas Chautru ops[i]->ldpc_dec.tb_params.r = 1916d819c083SNicolas Chautru ldpc_dec->tb_params.r; 1917d819c083SNicolas Chautru } else { 1918d819c083SNicolas Chautru ops[i]->ldpc_dec.cb_params.e = ldpc_dec->cb_params.e; 1919d819c083SNicolas Chautru } 1920d819c083SNicolas Chautru 1921d819c083SNicolas Chautru ops[i]->ldpc_dec.basegraph = ldpc_dec->basegraph; 1922d819c083SNicolas Chautru ops[i]->ldpc_dec.z_c = ldpc_dec->z_c; 1923d819c083SNicolas Chautru ops[i]->ldpc_dec.q_m = ldpc_dec->q_m; 1924d819c083SNicolas Chautru ops[i]->ldpc_dec.n_filler = ldpc_dec->n_filler; 1925d819c083SNicolas Chautru ops[i]->ldpc_dec.n_cb = ldpc_dec->n_cb; 1926d819c083SNicolas Chautru ops[i]->ldpc_dec.iter_max = ldpc_dec->iter_max; 1927d819c083SNicolas Chautru ops[i]->ldpc_dec.rv_index = ldpc_dec->rv_index; 1928591d38ccSNicolas Chautru ops[i]->ldpc_dec.k0 = ldpc_dec->k0; 1929d819c083SNicolas Chautru ops[i]->ldpc_dec.op_flags = ldpc_dec->op_flags; 1930d819c083SNicolas Chautru ops[i]->ldpc_dec.code_block_mode = ldpc_dec->code_block_mode; 1931d819c083SNicolas Chautru 1932335c11fdSNicolas Chautru if (hard_outputs != NULL) 1933335c11fdSNicolas Chautru ops[i]->ldpc_dec.hard_output = 1934335c11fdSNicolas Chautru hard_outputs[start_idx + i]; 1935335c11fdSNicolas Chautru if (inputs != NULL) 1936335c11fdSNicolas Chautru ops[i]->ldpc_dec.input = 1937335c11fdSNicolas Chautru inputs[start_idx + i]; 1938d819c083SNicolas Chautru if (soft_outputs != NULL) 1939d819c083SNicolas Chautru ops[i]->ldpc_dec.soft_output = 1940d819c083SNicolas Chautru soft_outputs[start_idx + i]; 1941d819c083SNicolas Chautru if (harq_inputs != NULL) 1942d819c083SNicolas Chautru ops[i]->ldpc_dec.harq_combined_input = 1943d819c083SNicolas Chautru harq_inputs[start_idx + i]; 1944d819c083SNicolas Chautru if (harq_outputs != NULL) 1945d819c083SNicolas Chautru ops[i]->ldpc_dec.harq_combined_output = 1946d819c083SNicolas Chautru harq_outputs[start_idx + i]; 1947d819c083SNicolas Chautru } 1948d819c083SNicolas Chautru } 1949d819c083SNicolas Chautru 1950d819c083SNicolas Chautru 1951d819c083SNicolas Chautru static void 1952d819c083SNicolas Chautru copy_reference_ldpc_enc_op(struct rte_bbdev_enc_op **ops, unsigned int n, 1953d819c083SNicolas Chautru unsigned int start_idx, 1954d819c083SNicolas Chautru struct rte_bbdev_op_data *inputs, 1955d819c083SNicolas Chautru struct rte_bbdev_op_data *outputs, 1956d819c083SNicolas Chautru struct rte_bbdev_enc_op *ref_op) 1957d819c083SNicolas Chautru { 1958d819c083SNicolas Chautru unsigned int i; 1959d819c083SNicolas Chautru struct rte_bbdev_op_ldpc_enc *ldpc_enc = &ref_op->ldpc_enc; 1960d819c083SNicolas Chautru for (i = 0; i < n; ++i) { 196148fc315fSNicolas Chautru if (ldpc_enc->code_block_mode == RTE_BBDEV_TRANSPORT_BLOCK) { 1962d819c083SNicolas Chautru ops[i]->ldpc_enc.tb_params.ea = ldpc_enc->tb_params.ea; 1963d819c083SNicolas Chautru ops[i]->ldpc_enc.tb_params.eb = ldpc_enc->tb_params.eb; 1964d819c083SNicolas Chautru ops[i]->ldpc_enc.tb_params.cab = 1965d819c083SNicolas Chautru ldpc_enc->tb_params.cab; 1966d819c083SNicolas Chautru ops[i]->ldpc_enc.tb_params.c = ldpc_enc->tb_params.c; 1967d819c083SNicolas Chautru ops[i]->ldpc_enc.tb_params.r = ldpc_enc->tb_params.r; 1968d819c083SNicolas Chautru } else { 1969d819c083SNicolas Chautru ops[i]->ldpc_enc.cb_params.e = ldpc_enc->cb_params.e; 1970d819c083SNicolas Chautru } 1971d819c083SNicolas Chautru ops[i]->ldpc_enc.basegraph = ldpc_enc->basegraph; 1972d819c083SNicolas Chautru ops[i]->ldpc_enc.z_c = ldpc_enc->z_c; 1973d819c083SNicolas Chautru ops[i]->ldpc_enc.q_m = ldpc_enc->q_m; 1974d819c083SNicolas Chautru ops[i]->ldpc_enc.n_filler = ldpc_enc->n_filler; 1975d819c083SNicolas Chautru ops[i]->ldpc_enc.n_cb = ldpc_enc->n_cb; 1976d819c083SNicolas Chautru ops[i]->ldpc_enc.rv_index = ldpc_enc->rv_index; 1977d819c083SNicolas Chautru ops[i]->ldpc_enc.op_flags = ldpc_enc->op_flags; 1978d819c083SNicolas Chautru ops[i]->ldpc_enc.code_block_mode = ldpc_enc->code_block_mode; 1979d819c083SNicolas Chautru ops[i]->ldpc_enc.output = outputs[start_idx + i]; 1980d819c083SNicolas Chautru ops[i]->ldpc_enc.input = inputs[start_idx + i]; 1981d819c083SNicolas Chautru } 1982d819c083SNicolas Chautru } 1983d819c083SNicolas Chautru 19840acdb986SNicolas Chautru static void 19850acdb986SNicolas Chautru copy_reference_fft_op(struct rte_bbdev_fft_op **ops, unsigned int n, 19860acdb986SNicolas Chautru unsigned int start_idx, struct rte_bbdev_op_data *inputs, 19870acdb986SNicolas Chautru struct rte_bbdev_op_data *outputs, struct rte_bbdev_op_data *pwrouts, 19880ed76d66SHernan Vargas struct rte_bbdev_op_data *win_inputs, struct rte_bbdev_fft_op *ref_op) 19890acdb986SNicolas Chautru { 19900acdb986SNicolas Chautru unsigned int i, j; 19910acdb986SNicolas Chautru struct rte_bbdev_op_fft *fft = &ref_op->fft; 19920acdb986SNicolas Chautru for (i = 0; i < n; i++) { 19930acdb986SNicolas Chautru ops[i]->fft.input_sequence_size = fft->input_sequence_size; 19940acdb986SNicolas Chautru ops[i]->fft.input_leading_padding = fft->input_leading_padding; 19950acdb986SNicolas Chautru ops[i]->fft.output_sequence_size = fft->output_sequence_size; 19960acdb986SNicolas Chautru ops[i]->fft.output_leading_depadding = 19970acdb986SNicolas Chautru fft->output_leading_depadding; 19980acdb986SNicolas Chautru for (j = 0; j < RTE_BBDEV_MAX_CS_2; j++) 19990acdb986SNicolas Chautru ops[i]->fft.window_index[j] = fft->window_index[j]; 20000ed76d66SHernan Vargas for (j = 0; j < RTE_BBDEV_MAX_CS; j++) { 20010ed76d66SHernan Vargas ops[i]->fft.cs_theta_0[j] = fft->cs_theta_0[j]; 20020ed76d66SHernan Vargas ops[i]->fft.cs_theta_d[j] = fft->cs_theta_d[j]; 20030ed76d66SHernan Vargas ops[i]->fft.time_offset[j] = fft->time_offset[j]; 20040ed76d66SHernan Vargas } 20050acdb986SNicolas Chautru ops[i]->fft.cs_bitmap = fft->cs_bitmap; 20060acdb986SNicolas Chautru ops[i]->fft.num_antennas_log2 = fft->num_antennas_log2; 20070acdb986SNicolas Chautru ops[i]->fft.idft_log2 = fft->idft_log2; 20080acdb986SNicolas Chautru ops[i]->fft.dft_log2 = fft->dft_log2; 20090acdb986SNicolas Chautru ops[i]->fft.cs_time_adjustment = fft->cs_time_adjustment; 20100acdb986SNicolas Chautru ops[i]->fft.idft_shift = fft->idft_shift; 20110acdb986SNicolas Chautru ops[i]->fft.dft_shift = fft->dft_shift; 20120acdb986SNicolas Chautru ops[i]->fft.ncs_reciprocal = fft->ncs_reciprocal; 20130acdb986SNicolas Chautru ops[i]->fft.power_shift = fft->power_shift; 20140acdb986SNicolas Chautru ops[i]->fft.fp16_exp_adjust = fft->fp16_exp_adjust; 20150ed76d66SHernan Vargas ops[i]->fft.output_depadded_size = fft->output_depadded_size; 20160ed76d66SHernan Vargas ops[i]->fft.freq_resample_mode = fft->freq_resample_mode; 20170acdb986SNicolas Chautru ops[i]->fft.base_output = outputs[start_idx + i]; 20180acdb986SNicolas Chautru ops[i]->fft.base_input = inputs[start_idx + i]; 20190ed76d66SHernan Vargas if (win_inputs != NULL) 20200ed76d66SHernan Vargas ops[i]->fft.dewindowing_input = win_inputs[start_idx + i]; 20210acdb986SNicolas Chautru if (pwrouts != NULL) 20220acdb986SNicolas Chautru ops[i]->fft.power_meas_output = pwrouts[start_idx + i]; 20230acdb986SNicolas Chautru ops[i]->fft.op_flags = fft->op_flags; 20240acdb986SNicolas Chautru } 20250acdb986SNicolas Chautru } 20260acdb986SNicolas Chautru 202795f192a4SHernan Vargas static void 202895f192a4SHernan Vargas copy_reference_mldts_op(struct rte_bbdev_mldts_op **ops, unsigned int n, 202995f192a4SHernan Vargas unsigned int start_idx, 203095f192a4SHernan Vargas struct rte_bbdev_op_data *q_inputs, 203195f192a4SHernan Vargas struct rte_bbdev_op_data *r_inputs, 203295f192a4SHernan Vargas struct rte_bbdev_op_data *outputs, 203395f192a4SHernan Vargas struct rte_bbdev_mldts_op *ref_op) 203495f192a4SHernan Vargas { 203595f192a4SHernan Vargas unsigned int i, j; 203695f192a4SHernan Vargas struct rte_bbdev_op_mldts *mldts = &ref_op->mldts; 203795f192a4SHernan Vargas for (i = 0; i < n; i++) { 203895f192a4SHernan Vargas ops[i]->mldts.c_rep = mldts->c_rep; 203995f192a4SHernan Vargas ops[i]->mldts.num_layers = mldts->num_layers; 204095f192a4SHernan Vargas ops[i]->mldts.num_rbs = mldts->num_rbs; 204195f192a4SHernan Vargas ops[i]->mldts.op_flags = mldts->op_flags; 204295f192a4SHernan Vargas for (j = 0; j < RTE_BBDEV_MAX_MLD_LAYERS; j++) 204395f192a4SHernan Vargas ops[i]->mldts.q_m[j] = mldts->q_m[j]; 204495f192a4SHernan Vargas ops[i]->mldts.r_rep = mldts->r_rep; 204595f192a4SHernan Vargas ops[i]->mldts.c_rep = mldts->c_rep; 204695f192a4SHernan Vargas ops[i]->mldts.r_input = r_inputs[start_idx + i]; 204795f192a4SHernan Vargas ops[i]->mldts.qhy_input = q_inputs[start_idx + i]; 204895f192a4SHernan Vargas ops[i]->mldts.output = outputs[start_idx + i]; 204995f192a4SHernan Vargas } 205095f192a4SHernan Vargas } 205195f192a4SHernan Vargas 2052f714a188SAmr Mokhtar static int 2053f714a188SAmr Mokhtar check_dec_status_and_ordering(struct rte_bbdev_dec_op *op, 2054f714a188SAmr Mokhtar unsigned int order_idx, const int expected_status) 2055f714a188SAmr Mokhtar { 2056335c11fdSNicolas Chautru int status = op->status; 2057335c11fdSNicolas Chautru /* ignore parity mismatch false alarms for long iterations */ 2058335c11fdSNicolas Chautru if (get_iter_max() >= 10) { 2059335c11fdSNicolas Chautru if (!(expected_status & (1 << RTE_BBDEV_SYNDROME_ERROR)) && 2060335c11fdSNicolas Chautru (status & (1 << RTE_BBDEV_SYNDROME_ERROR))) { 2061335c11fdSNicolas Chautru printf("WARNING: Ignore Syndrome Check mismatch\n"); 2062335c11fdSNicolas Chautru status -= (1 << RTE_BBDEV_SYNDROME_ERROR); 2063335c11fdSNicolas Chautru } 2064335c11fdSNicolas Chautru if ((expected_status & (1 << RTE_BBDEV_SYNDROME_ERROR)) && 2065335c11fdSNicolas Chautru !(status & (1 << RTE_BBDEV_SYNDROME_ERROR))) { 2066335c11fdSNicolas Chautru printf("WARNING: Ignore Syndrome Check mismatch\n"); 2067335c11fdSNicolas Chautru status += (1 << RTE_BBDEV_SYNDROME_ERROR); 2068335c11fdSNicolas Chautru } 2069335c11fdSNicolas Chautru } 2070335c11fdSNicolas Chautru 2071335c11fdSNicolas Chautru TEST_ASSERT(status == expected_status, 2072f714a188SAmr Mokhtar "op_status (%d) != expected_status (%d)", 2073f714a188SAmr Mokhtar op->status, expected_status); 2074f714a188SAmr Mokhtar 2075f714a188SAmr Mokhtar TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data, 2076f714a188SAmr Mokhtar "Ordering error, expected %p, got %p", 2077f714a188SAmr Mokhtar (void *)(uintptr_t)order_idx, op->opaque_data); 2078f714a188SAmr Mokhtar 2079f714a188SAmr Mokhtar return TEST_SUCCESS; 2080f714a188SAmr Mokhtar } 2081f714a188SAmr Mokhtar 2082f714a188SAmr Mokhtar static int 2083f714a188SAmr Mokhtar check_enc_status_and_ordering(struct rte_bbdev_enc_op *op, 2084f714a188SAmr Mokhtar unsigned int order_idx, const int expected_status) 2085f714a188SAmr Mokhtar { 2086f714a188SAmr Mokhtar TEST_ASSERT(op->status == expected_status, 2087f714a188SAmr Mokhtar "op_status (%d) != expected_status (%d)", 2088f714a188SAmr Mokhtar op->status, expected_status); 2089f714a188SAmr Mokhtar 2090f714a188SAmr Mokhtar TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data, 2091f714a188SAmr Mokhtar "Ordering error, expected %p, got %p", 2092f714a188SAmr Mokhtar (void *)(uintptr_t)order_idx, op->opaque_data); 2093f714a188SAmr Mokhtar 2094f714a188SAmr Mokhtar return TEST_SUCCESS; 2095f714a188SAmr Mokhtar } 2096f714a188SAmr Mokhtar 20970acdb986SNicolas Chautru static int 20980acdb986SNicolas Chautru check_fft_status_and_ordering(struct rte_bbdev_fft_op *op, 20990acdb986SNicolas Chautru unsigned int order_idx, const int expected_status) 21000acdb986SNicolas Chautru { 21010acdb986SNicolas Chautru TEST_ASSERT(op->status == expected_status, 21020acdb986SNicolas Chautru "op_status (%d) != expected_status (%d)", 21030acdb986SNicolas Chautru op->status, expected_status); 21040acdb986SNicolas Chautru 21050acdb986SNicolas Chautru TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data, 21060acdb986SNicolas Chautru "Ordering error, expected %p, got %p", 21070acdb986SNicolas Chautru (void *)(uintptr_t)order_idx, op->opaque_data); 21080acdb986SNicolas Chautru 21090acdb986SNicolas Chautru return TEST_SUCCESS; 21100acdb986SNicolas Chautru } 21110acdb986SNicolas Chautru 211295f192a4SHernan Vargas static int 211395f192a4SHernan Vargas check_mldts_status_and_ordering(struct rte_bbdev_mldts_op *op, 211495f192a4SHernan Vargas unsigned int order_idx, const int expected_status) 211595f192a4SHernan Vargas { 211695f192a4SHernan Vargas TEST_ASSERT(op->status == expected_status, 211795f192a4SHernan Vargas "op_status (%d) != expected_status (%d)", 211895f192a4SHernan Vargas op->status, expected_status); 211995f192a4SHernan Vargas 212095f192a4SHernan Vargas TEST_ASSERT((void *)(uintptr_t)order_idx == op->opaque_data, 212195f192a4SHernan Vargas "Ordering error, expected %p, got %p", 212295f192a4SHernan Vargas (void *)(uintptr_t)order_idx, op->opaque_data); 212395f192a4SHernan Vargas 212495f192a4SHernan Vargas return TEST_SUCCESS; 212595f192a4SHernan Vargas } 212695f192a4SHernan Vargas 2127f714a188SAmr Mokhtar static inline int 2128f714a188SAmr Mokhtar validate_op_chain(struct rte_bbdev_op_data *op, 2129f714a188SAmr Mokhtar struct op_data_entries *orig_op) 2130f714a188SAmr Mokhtar { 2131f714a188SAmr Mokhtar uint8_t i; 2132f714a188SAmr Mokhtar struct rte_mbuf *m = op->data; 2133f714a188SAmr Mokhtar uint8_t nb_dst_segments = orig_op->nb_segments; 21349585f8b1SKamil Chalupnik uint32_t total_data_size = 0; 2135fd96ef37SHernan Vargas bool ignore_mbuf = false; /* ignore mbuf limitations */ 2136f714a188SAmr Mokhtar 2137f714a188SAmr Mokhtar TEST_ASSERT(nb_dst_segments == m->nb_segs, 2138f714a188SAmr Mokhtar "Number of segments differ in original (%u) and filled (%u) op", 2139f714a188SAmr Mokhtar nb_dst_segments, m->nb_segs); 2140f714a188SAmr Mokhtar 21419585f8b1SKamil Chalupnik /* Validate each mbuf segment length */ 2142f714a188SAmr Mokhtar for (i = 0; i < nb_dst_segments; ++i) { 2143f714a188SAmr Mokhtar /* Apply offset to the first mbuf segment */ 2144f714a188SAmr Mokhtar uint16_t offset = (i == 0) ? op->offset : 0; 21459585f8b1SKamil Chalupnik uint16_t data_len = rte_pktmbuf_data_len(m) - offset; 21469585f8b1SKamil Chalupnik total_data_size += orig_op->segments[i].length; 2147f714a188SAmr Mokhtar 2148494d0c9bSHernan Vargas if ((orig_op->segments[i].length + RTE_PKTMBUF_HEADROOM) 2149494d0c9bSHernan Vargas > RTE_BBDEV_LDPC_E_MAX_MBUF) 2150fd96ef37SHernan Vargas ignore_mbuf = true; 2151fd96ef37SHernan Vargas if (!ignore_mbuf) 2152f714a188SAmr Mokhtar TEST_ASSERT(orig_op->segments[i].length == data_len, 2153f714a188SAmr Mokhtar "Length of segment differ in original (%u) and filled (%u) op", 2154f714a188SAmr Mokhtar orig_op->segments[i].length, data_len); 2155f714a188SAmr Mokhtar TEST_ASSERT_BUFFERS_ARE_EQUAL(orig_op->segments[i].addr, 2156f714a188SAmr Mokhtar rte_pktmbuf_mtod_offset(m, uint32_t *, offset), 2157fd96ef37SHernan Vargas orig_op->segments[i].length, 2158f714a188SAmr Mokhtar "Output buffers (CB=%u) are not equal", i); 2159f714a188SAmr Mokhtar m = m->next; 2160f714a188SAmr Mokhtar } 2161f714a188SAmr Mokhtar 21629585f8b1SKamil Chalupnik /* Validate total mbuf pkt length */ 21639585f8b1SKamil Chalupnik uint32_t pkt_len = rte_pktmbuf_pkt_len(op->data) - op->offset; 2164fd96ef37SHernan Vargas if (!ignore_mbuf) 21659585f8b1SKamil Chalupnik TEST_ASSERT(total_data_size == pkt_len, 21669585f8b1SKamil Chalupnik "Length of data differ in original (%u) and filled (%u) op", 21679585f8b1SKamil Chalupnik total_data_size, pkt_len); 21689585f8b1SKamil Chalupnik 2169f714a188SAmr Mokhtar return TEST_SUCCESS; 2170f714a188SAmr Mokhtar } 2171f714a188SAmr Mokhtar 2172335c11fdSNicolas Chautru /* 2173335c11fdSNicolas Chautru * Compute K0 for a given configuration for HARQ output length computation 2174335c11fdSNicolas Chautru * As per definition in 3GPP 38.212 Table 5.4.2.1-2 2175335c11fdSNicolas Chautru */ 2176335c11fdSNicolas Chautru static inline uint16_t 2177591d38ccSNicolas Chautru get_k0(uint16_t n_cb, uint16_t z_c, uint8_t bg, uint8_t rv_index, uint16_t k0) 2178335c11fdSNicolas Chautru { 2179591d38ccSNicolas Chautru if (k0 > 0) 2180591d38ccSNicolas Chautru return k0; 2181335c11fdSNicolas Chautru if (rv_index == 0) 2182335c11fdSNicolas Chautru return 0; 2183335c11fdSNicolas Chautru uint16_t n = (bg == 1 ? N_ZC_1 : N_ZC_2) * z_c; 2184335c11fdSNicolas Chautru if (n_cb == n) { 2185335c11fdSNicolas Chautru if (rv_index == 1) 2186335c11fdSNicolas Chautru return (bg == 1 ? K0_1_1 : K0_1_2) * z_c; 2187335c11fdSNicolas Chautru else if (rv_index == 2) 2188335c11fdSNicolas Chautru return (bg == 1 ? K0_2_1 : K0_2_2) * z_c; 2189335c11fdSNicolas Chautru else 2190335c11fdSNicolas Chautru return (bg == 1 ? K0_3_1 : K0_3_2) * z_c; 2191335c11fdSNicolas Chautru } 2192335c11fdSNicolas Chautru /* LBRM case - includes a division by N */ 2193335c11fdSNicolas Chautru if (rv_index == 1) 2194335c11fdSNicolas Chautru return (((bg == 1 ? K0_1_1 : K0_1_2) * n_cb) 2195335c11fdSNicolas Chautru / n) * z_c; 2196335c11fdSNicolas Chautru else if (rv_index == 2) 2197335c11fdSNicolas Chautru return (((bg == 1 ? K0_2_1 : K0_2_2) * n_cb) 2198335c11fdSNicolas Chautru / n) * z_c; 2199335c11fdSNicolas Chautru else 2200335c11fdSNicolas Chautru return (((bg == 1 ? K0_3_1 : K0_3_2) * n_cb) 2201335c11fdSNicolas Chautru / n) * z_c; 2202335c11fdSNicolas Chautru } 2203335c11fdSNicolas Chautru 2204335c11fdSNicolas Chautru /* HARQ output length including the Filler bits */ 2205335c11fdSNicolas Chautru static inline uint16_t 2206335c11fdSNicolas Chautru compute_harq_len(struct rte_bbdev_op_ldpc_dec *ops_ld) 2207335c11fdSNicolas Chautru { 2208335c11fdSNicolas Chautru uint16_t k0 = 0; 2209335c11fdSNicolas Chautru uint8_t max_rv = (ops_ld->rv_index == 1) ? 3 : ops_ld->rv_index; 2210591d38ccSNicolas Chautru k0 = get_k0(ops_ld->n_cb, ops_ld->z_c, ops_ld->basegraph, max_rv, ops_ld->k0); 2211335c11fdSNicolas Chautru /* Compute RM out size and number of rows */ 2212335c11fdSNicolas Chautru uint16_t parity_offset = (ops_ld->basegraph == 1 ? 20 : 8) 2213335c11fdSNicolas Chautru * ops_ld->z_c - ops_ld->n_filler; 2214335c11fdSNicolas Chautru uint16_t deRmOutSize = RTE_MIN( 2215335c11fdSNicolas Chautru k0 + ops_ld->cb_params.e + 2216335c11fdSNicolas Chautru ((k0 > parity_offset) ? 2217335c11fdSNicolas Chautru 0 : ops_ld->n_filler), 2218335c11fdSNicolas Chautru ops_ld->n_cb); 2219335c11fdSNicolas Chautru uint16_t numRows = ((deRmOutSize + ops_ld->z_c - 1) 2220335c11fdSNicolas Chautru / ops_ld->z_c); 2221335c11fdSNicolas Chautru uint16_t harq_output_len = numRows * ops_ld->z_c; 2222335c11fdSNicolas Chautru return harq_output_len; 2223335c11fdSNicolas Chautru } 2224335c11fdSNicolas Chautru 2225335c11fdSNicolas Chautru static inline int 2226335c11fdSNicolas Chautru validate_op_harq_chain(struct rte_bbdev_op_data *op, 2227335c11fdSNicolas Chautru struct op_data_entries *orig_op, 2228335c11fdSNicolas Chautru struct rte_bbdev_op_ldpc_dec *ops_ld) 2229335c11fdSNicolas Chautru { 2230335c11fdSNicolas Chautru uint8_t i; 2231335c11fdSNicolas Chautru uint32_t j, jj, k; 2232335c11fdSNicolas Chautru struct rte_mbuf *m = op->data; 2233335c11fdSNicolas Chautru uint8_t nb_dst_segments = orig_op->nb_segments; 2234335c11fdSNicolas Chautru uint32_t total_data_size = 0; 2235335c11fdSNicolas Chautru int8_t *harq_orig, *harq_out, abs_harq_origin; 2236335c11fdSNicolas Chautru uint32_t byte_error = 0, cum_error = 0, error; 2237335c11fdSNicolas Chautru int16_t llr_max = (1 << (ldpc_llr_size - ldpc_llr_decimals)) - 1; 2238335c11fdSNicolas Chautru int16_t llr_max_pre_scaling = (1 << (ldpc_llr_size - 1)) - 1; 2239335c11fdSNicolas Chautru uint16_t parity_offset; 2240335c11fdSNicolas Chautru 2241335c11fdSNicolas Chautru TEST_ASSERT(nb_dst_segments == m->nb_segs, 2242335c11fdSNicolas Chautru "Number of segments differ in original (%u) and filled (%u) op", 2243335c11fdSNicolas Chautru nb_dst_segments, m->nb_segs); 2244335c11fdSNicolas Chautru 2245335c11fdSNicolas Chautru /* Validate each mbuf segment length */ 2246335c11fdSNicolas Chautru for (i = 0; i < nb_dst_segments; ++i) { 2247335c11fdSNicolas Chautru /* Apply offset to the first mbuf segment */ 2248335c11fdSNicolas Chautru uint16_t offset = (i == 0) ? op->offset : 0; 2249335c11fdSNicolas Chautru uint16_t data_len = rte_pktmbuf_data_len(m) - offset; 2250335c11fdSNicolas Chautru total_data_size += orig_op->segments[i].length; 2251335c11fdSNicolas Chautru 225239b601c4SHernan Vargas TEST_ASSERT(orig_op->segments[i].length < (uint32_t)(data_len + HARQ_MEM_TOLERANCE), 2253335c11fdSNicolas Chautru "Length of segment differ in original (%u) and filled (%u) op", 2254335c11fdSNicolas Chautru orig_op->segments[i].length, data_len); 2255335c11fdSNicolas Chautru harq_orig = (int8_t *) orig_op->segments[i].addr; 2256335c11fdSNicolas Chautru harq_out = rte_pktmbuf_mtod_offset(m, int8_t *, offset); 2257335c11fdSNicolas Chautru 225839b601c4SHernan Vargas /* Cannot compare HARQ output data for such cases */ 225939b601c4SHernan Vargas if ((ldpc_llr_decimals > 1) && ((ops_ld->op_flags & RTE_BBDEV_LDPC_LLR_COMPRESSION) 2260a591b77fSHernan Vargas || (ops_ld->op_flags & RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION) 2261a591b77fSHernan Vargas || (ops_ld->op_flags & RTE_BBDEV_LDPC_HARQ_4BIT_COMPRESSION))) 226239b601c4SHernan Vargas break; 226339b601c4SHernan Vargas 2264335c11fdSNicolas Chautru if (!(ldpc_cap_flags & 2265335c11fdSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_FILLERS 2266335c11fdSNicolas Chautru ) || (ops_ld->op_flags & 2267335c11fdSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)) { 2268335c11fdSNicolas Chautru data_len -= ops_ld->z_c; 2269335c11fdSNicolas Chautru parity_offset = data_len; 2270335c11fdSNicolas Chautru } else { 2271335c11fdSNicolas Chautru /* Compute RM out size and number of rows */ 2272335c11fdSNicolas Chautru parity_offset = (ops_ld->basegraph == 1 ? 20 : 8) 2273335c11fdSNicolas Chautru * ops_ld->z_c - ops_ld->n_filler; 2274335c11fdSNicolas Chautru uint16_t deRmOutSize = compute_harq_len(ops_ld) - 2275335c11fdSNicolas Chautru ops_ld->n_filler; 2276335c11fdSNicolas Chautru if (data_len > deRmOutSize) 2277335c11fdSNicolas Chautru data_len = deRmOutSize; 2278bee9ac50SHernan Vargas } 2279335c11fdSNicolas Chautru if (data_len > orig_op->segments[i].length) 2280335c11fdSNicolas Chautru data_len = orig_op->segments[i].length; 2281335c11fdSNicolas Chautru /* 2282335c11fdSNicolas Chautru * HARQ output can have minor differences 2283335c11fdSNicolas Chautru * due to integer representation and related scaling 2284335c11fdSNicolas Chautru */ 2285335c11fdSNicolas Chautru for (j = 0, jj = 0; j < data_len; j++, jj++) { 2286335c11fdSNicolas Chautru if (j == parity_offset) { 2287335c11fdSNicolas Chautru /* Special Handling of the filler bits */ 2288335c11fdSNicolas Chautru for (k = 0; k < ops_ld->n_filler; k++) { 2289335c11fdSNicolas Chautru if (harq_out[jj] != 2290335c11fdSNicolas Chautru llr_max_pre_scaling) { 2291335c11fdSNicolas Chautru printf("HARQ Filler issue %d: %d %d\n", 2292335c11fdSNicolas Chautru jj, harq_out[jj], 2293335c11fdSNicolas Chautru llr_max); 2294335c11fdSNicolas Chautru byte_error++; 2295335c11fdSNicolas Chautru } 2296335c11fdSNicolas Chautru jj++; 2297335c11fdSNicolas Chautru } 2298335c11fdSNicolas Chautru } 2299335c11fdSNicolas Chautru if (!(ops_ld->op_flags & 2300335c11fdSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK)) { 2301335c11fdSNicolas Chautru if (ldpc_llr_decimals > 1) 2302335c11fdSNicolas Chautru harq_out[jj] = (harq_out[jj] + 1) 2303335c11fdSNicolas Chautru >> (ldpc_llr_decimals - 1); 2304335c11fdSNicolas Chautru /* Saturated to S7 */ 2305335c11fdSNicolas Chautru if (harq_orig[j] > llr_max) 2306335c11fdSNicolas Chautru harq_orig[j] = llr_max; 2307335c11fdSNicolas Chautru if (harq_orig[j] < -llr_max) 2308335c11fdSNicolas Chautru harq_orig[j] = -llr_max; 2309335c11fdSNicolas Chautru } 2310335c11fdSNicolas Chautru if (harq_orig[j] != harq_out[jj]) { 2311335c11fdSNicolas Chautru error = (harq_orig[j] > harq_out[jj]) ? 2312335c11fdSNicolas Chautru harq_orig[j] - harq_out[jj] : 2313335c11fdSNicolas Chautru harq_out[jj] - harq_orig[j]; 2314335c11fdSNicolas Chautru abs_harq_origin = harq_orig[j] > 0 ? 2315335c11fdSNicolas Chautru harq_orig[j] : 2316335c11fdSNicolas Chautru -harq_orig[j]; 2317335c11fdSNicolas Chautru /* Residual quantization error */ 2318335c11fdSNicolas Chautru if ((error > 8 && (abs_harq_origin < 2319335c11fdSNicolas Chautru (llr_max - 16))) || 2320335c11fdSNicolas Chautru (error > 16)) { 23215884e56fSHernan Vargas /* 2322335c11fdSNicolas Chautru printf("HARQ mismatch %d: exp %d act %d => %d\n", 2323335c11fdSNicolas Chautru j, harq_orig[j], 2324335c11fdSNicolas Chautru harq_out[jj], error); 23255884e56fSHernan Vargas */ 2326335c11fdSNicolas Chautru byte_error++; 2327335c11fdSNicolas Chautru cum_error += error; 2328335c11fdSNicolas Chautru } 2329335c11fdSNicolas Chautru } 2330335c11fdSNicolas Chautru } 2331335c11fdSNicolas Chautru m = m->next; 2332335c11fdSNicolas Chautru } 2333335c11fdSNicolas Chautru 2334335c11fdSNicolas Chautru if (byte_error) 2335335c11fdSNicolas Chautru TEST_ASSERT(byte_error <= 1, 2336335c11fdSNicolas Chautru "HARQ output mismatch (%d) %d", 2337335c11fdSNicolas Chautru byte_error, cum_error); 2338335c11fdSNicolas Chautru 2339335c11fdSNicolas Chautru /* Validate total mbuf pkt length */ 2340335c11fdSNicolas Chautru uint32_t pkt_len = rte_pktmbuf_pkt_len(op->data) - op->offset; 234139b601c4SHernan Vargas TEST_ASSERT(total_data_size < pkt_len + HARQ_MEM_TOLERANCE, 2342335c11fdSNicolas Chautru "Length of data differ in original (%u) and filled (%u) op", 2343335c11fdSNicolas Chautru total_data_size, pkt_len); 2344335c11fdSNicolas Chautru 2345335c11fdSNicolas Chautru return TEST_SUCCESS; 2346335c11fdSNicolas Chautru } 2347335c11fdSNicolas Chautru 23480acdb986SNicolas Chautru 23490acdb986SNicolas Chautru static inline int 23500acdb986SNicolas Chautru validate_op_so_chain(struct rte_bbdev_op_data *op, 23510acdb986SNicolas Chautru struct op_data_entries *orig_op) 23520acdb986SNicolas Chautru { 23530acdb986SNicolas Chautru struct rte_mbuf *m = op->data; 23540acdb986SNicolas Chautru uint8_t i, nb_dst_segments = orig_op->nb_segments; 23550acdb986SNicolas Chautru uint32_t j, jj; 23560acdb986SNicolas Chautru int8_t *so_orig, *so_out; 23570acdb986SNicolas Chautru uint32_t byte_error = 0, error, margin_error = 0; 23580acdb986SNicolas Chautru 23590acdb986SNicolas Chautru TEST_ASSERT(nb_dst_segments == m->nb_segs, 23600acdb986SNicolas Chautru "Number of segments differ in original (%u) and filled (%u) op", 23610acdb986SNicolas Chautru nb_dst_segments, m->nb_segs); 23620acdb986SNicolas Chautru 23630acdb986SNicolas Chautru /* Validate each mbuf segment length. */ 23640acdb986SNicolas Chautru for (i = 0; i < nb_dst_segments; ++i) { 23650acdb986SNicolas Chautru /* Apply offset to the first mbuf segment. */ 23660acdb986SNicolas Chautru uint16_t offset = (i == 0) ? op->offset : 0; 23670acdb986SNicolas Chautru uint16_t data_len = rte_pktmbuf_data_len(m) - offset; 23680acdb986SNicolas Chautru 23690acdb986SNicolas Chautru TEST_ASSERT(orig_op->segments[i].length == data_len, 23700acdb986SNicolas Chautru "Length of segment differ in original (%u) and filled (%u) op", 23710acdb986SNicolas Chautru orig_op->segments[i].length, data_len); 23720acdb986SNicolas Chautru so_orig = (int8_t *) orig_op->segments[i].addr; 23730acdb986SNicolas Chautru so_out = rte_pktmbuf_mtod_offset(m, int8_t *, offset); 23740acdb986SNicolas Chautru margin_error += data_len / 8; /* Allow for few % errors. */ 23750acdb986SNicolas Chautru 23760acdb986SNicolas Chautru /* SO output can have minor differences due to algorithm variations. */ 23770acdb986SNicolas Chautru for (j = 0, jj = 0; j < data_len; j++, jj++) { 23780acdb986SNicolas Chautru if (so_orig[j] != so_out[jj]) { 23790acdb986SNicolas Chautru error = (so_orig[j] > so_out[jj]) ? so_orig[j] - so_out[jj] : 23800acdb986SNicolas Chautru so_out[jj] - so_orig[j]; 23810acdb986SNicolas Chautru /* Residual quantization error. */ 23820acdb986SNicolas Chautru if (error > 32) { 23830acdb986SNicolas Chautru printf("Warning: Soft mismatch %d: exp %d act %d => %d\n", 23840acdb986SNicolas Chautru j, so_orig[j], so_out[jj], error); 23850acdb986SNicolas Chautru byte_error++; 23860acdb986SNicolas Chautru } 23870acdb986SNicolas Chautru } 23880acdb986SNicolas Chautru } 23890acdb986SNicolas Chautru m = m->next; 23900acdb986SNicolas Chautru } 23910acdb986SNicolas Chautru 23920acdb986SNicolas Chautru if (byte_error > margin_error) 23930acdb986SNicolas Chautru TEST_ASSERT(byte_error <= 1, "Soft output mismatch (%d) %d", 23940acdb986SNicolas Chautru byte_error, margin_error); 23950acdb986SNicolas Chautru 23960acdb986SNicolas Chautru return TEST_SUCCESS; 23970acdb986SNicolas Chautru } 23980acdb986SNicolas Chautru 2399f714a188SAmr Mokhtar static int 2400f714a188SAmr Mokhtar validate_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, 2401de2ce637SHernan Vargas struct rte_bbdev_dec_op *ref_op) 2402f714a188SAmr Mokhtar { 2403f714a188SAmr Mokhtar unsigned int i; 2404f714a188SAmr Mokhtar int ret; 2405f714a188SAmr Mokhtar struct op_data_entries *hard_data_orig = 2406f714a188SAmr Mokhtar &test_vector.entries[DATA_HARD_OUTPUT]; 2407f714a188SAmr Mokhtar struct op_data_entries *soft_data_orig = 2408f714a188SAmr Mokhtar &test_vector.entries[DATA_SOFT_OUTPUT]; 2409f714a188SAmr Mokhtar struct rte_bbdev_op_turbo_dec *ops_td; 2410f714a188SAmr Mokhtar struct rte_bbdev_op_data *hard_output; 2411f714a188SAmr Mokhtar struct rte_bbdev_op_data *soft_output; 2412f714a188SAmr Mokhtar 2413f714a188SAmr Mokhtar for (i = 0; i < n; ++i) { 2414f714a188SAmr Mokhtar ops_td = &ops[i]->turbo_dec; 2415f714a188SAmr Mokhtar hard_output = &ops_td->hard_output; 2416f714a188SAmr Mokhtar soft_output = &ops_td->soft_output; 2417f714a188SAmr Mokhtar 2418f714a188SAmr Mokhtar ret = check_dec_status_and_ordering(ops[i], i, ref_op->status); 2419f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS(ret, 2420f714a188SAmr Mokhtar "Checking status and ordering for decoder failed"); 2421f714a188SAmr Mokhtar 2422f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS(validate_op_chain(hard_output, 2423f714a188SAmr Mokhtar hard_data_orig), 2424f714a188SAmr Mokhtar "Hard output buffers (CB=%u) are not equal", 2425f714a188SAmr Mokhtar i); 2426f714a188SAmr Mokhtar 2427f714a188SAmr Mokhtar if (ref_op->turbo_dec.op_flags & RTE_BBDEV_TURBO_SOFT_OUTPUT) 24280acdb986SNicolas Chautru TEST_ASSERT_SUCCESS(validate_op_so_chain(soft_output, 2429f714a188SAmr Mokhtar soft_data_orig), 2430f714a188SAmr Mokhtar "Soft output buffers (CB=%u) are not equal", 2431f714a188SAmr Mokhtar i); 2432f714a188SAmr Mokhtar } 2433f714a188SAmr Mokhtar 2434f714a188SAmr Mokhtar return TEST_SUCCESS; 2435f714a188SAmr Mokhtar } 2436f714a188SAmr Mokhtar 2437f41c6e4dSNicolas Chautru /* Check Number of code blocks errors */ 2438f41c6e4dSNicolas Chautru static int 2439f41c6e4dSNicolas Chautru validate_ldpc_bler(struct rte_bbdev_dec_op **ops, const uint16_t n) 2440f41c6e4dSNicolas Chautru { 2441f41c6e4dSNicolas Chautru unsigned int i; 2442f41c6e4dSNicolas Chautru struct op_data_entries *hard_data_orig = 2443f41c6e4dSNicolas Chautru &test_vector.entries[DATA_HARD_OUTPUT]; 2444f41c6e4dSNicolas Chautru struct rte_bbdev_op_ldpc_dec *ops_td; 2445f41c6e4dSNicolas Chautru struct rte_bbdev_op_data *hard_output; 2446f41c6e4dSNicolas Chautru int errors = 0; 2447f41c6e4dSNicolas Chautru struct rte_mbuf *m; 2448f41c6e4dSNicolas Chautru 2449f41c6e4dSNicolas Chautru for (i = 0; i < n; ++i) { 2450f41c6e4dSNicolas Chautru ops_td = &ops[i]->ldpc_dec; 2451f41c6e4dSNicolas Chautru hard_output = &ops_td->hard_output; 2452f41c6e4dSNicolas Chautru m = hard_output->data; 2453f41c6e4dSNicolas Chautru if (memcmp(rte_pktmbuf_mtod_offset(m, uint32_t *, 0), 2454f41c6e4dSNicolas Chautru hard_data_orig->segments[0].addr, 2455f41c6e4dSNicolas Chautru hard_data_orig->segments[0].length)) 2456f41c6e4dSNicolas Chautru errors++; 2457f41c6e4dSNicolas Chautru } 2458f41c6e4dSNicolas Chautru return errors; 2459f41c6e4dSNicolas Chautru } 2460f41c6e4dSNicolas Chautru 24617831a968SHernan Vargas /* Check Number of code blocks errors */ 24627831a968SHernan Vargas static int 24637831a968SHernan Vargas validate_turbo_bler(struct rte_bbdev_dec_op **ops, const uint16_t n) 24647831a968SHernan Vargas { 24657831a968SHernan Vargas unsigned int i; 24667831a968SHernan Vargas struct op_data_entries *hard_data_orig = &test_vector.entries[DATA_HARD_OUTPUT]; 24677831a968SHernan Vargas struct rte_bbdev_op_turbo_dec *ops_td; 24687831a968SHernan Vargas struct rte_bbdev_op_data *hard_output; 24697831a968SHernan Vargas int errors = 0; 24707831a968SHernan Vargas struct rte_mbuf *m; 24717831a968SHernan Vargas 24727831a968SHernan Vargas for (i = 0; i < n; ++i) { 24737831a968SHernan Vargas ops_td = &ops[i]->turbo_dec; 24747831a968SHernan Vargas hard_output = &ops_td->hard_output; 24757831a968SHernan Vargas m = hard_output->data; 24767831a968SHernan Vargas if (memcmp(rte_pktmbuf_mtod_offset(m, uint32_t *, 0), 24777831a968SHernan Vargas hard_data_orig->segments[0].addr, 24787831a968SHernan Vargas hard_data_orig->segments[0].length)) 24797831a968SHernan Vargas errors++; 24807831a968SHernan Vargas } 24817831a968SHernan Vargas return errors; 24827831a968SHernan Vargas } 24837831a968SHernan Vargas 24847831a968SHernan Vargas 2485d819c083SNicolas Chautru static int 2486d819c083SNicolas Chautru validate_ldpc_dec_op(struct rte_bbdev_dec_op **ops, const uint16_t n, 2487d819c083SNicolas Chautru struct rte_bbdev_dec_op *ref_op, const int vector_mask) 2488d819c083SNicolas Chautru { 2489d819c083SNicolas Chautru unsigned int i; 2490d819c083SNicolas Chautru int ret; 2491d819c083SNicolas Chautru struct op_data_entries *hard_data_orig = 2492d819c083SNicolas Chautru &test_vector.entries[DATA_HARD_OUTPUT]; 2493d819c083SNicolas Chautru struct op_data_entries *soft_data_orig = 2494d819c083SNicolas Chautru &test_vector.entries[DATA_SOFT_OUTPUT]; 2495d819c083SNicolas Chautru struct op_data_entries *harq_data_orig = 2496d819c083SNicolas Chautru &test_vector.entries[DATA_HARQ_OUTPUT]; 2497d819c083SNicolas Chautru struct rte_bbdev_op_ldpc_dec *ops_td; 2498d819c083SNicolas Chautru struct rte_bbdev_op_data *hard_output; 2499d819c083SNicolas Chautru struct rte_bbdev_op_data *harq_output; 2500d819c083SNicolas Chautru struct rte_bbdev_op_data *soft_output; 2501d819c083SNicolas Chautru struct rte_bbdev_op_ldpc_dec *ref_td = &ref_op->ldpc_dec; 2502d819c083SNicolas Chautru 2503d819c083SNicolas Chautru for (i = 0; i < n; ++i) { 2504d819c083SNicolas Chautru ops_td = &ops[i]->ldpc_dec; 2505d819c083SNicolas Chautru hard_output = &ops_td->hard_output; 2506d819c083SNicolas Chautru harq_output = &ops_td->harq_combined_output; 2507d819c083SNicolas Chautru soft_output = &ops_td->soft_output; 2508d819c083SNicolas Chautru 2509d819c083SNicolas Chautru ret = check_dec_status_and_ordering(ops[i], i, ref_op->status); 2510d819c083SNicolas Chautru TEST_ASSERT_SUCCESS(ret, 2511d819c083SNicolas Chautru "Checking status and ordering for decoder failed"); 2512d819c083SNicolas Chautru if (vector_mask & TEST_BBDEV_VF_EXPECTED_ITER_COUNT) 2513d819c083SNicolas Chautru TEST_ASSERT(ops_td->iter_count <= ref_td->iter_count, 2514d819c083SNicolas Chautru "Returned iter_count (%d) > expected iter_count (%d)", 2515d819c083SNicolas Chautru ops_td->iter_count, ref_td->iter_count); 2516335c11fdSNicolas Chautru /* 2517335c11fdSNicolas Chautru * We can ignore output data when the decoding failed to 2518335c11fdSNicolas Chautru * converge or for loop-back cases 2519335c11fdSNicolas Chautru */ 2520335c11fdSNicolas Chautru if (!check_bit(ops[i]->ldpc_dec.op_flags, 2521335c11fdSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK 2522335c11fdSNicolas Chautru ) && ( 2523335c11fdSNicolas Chautru ops[i]->status & (1 << RTE_BBDEV_SYNDROME_ERROR 2524335c11fdSNicolas Chautru )) == 0) 2525d819c083SNicolas Chautru TEST_ASSERT_SUCCESS(validate_op_chain(hard_output, 2526d819c083SNicolas Chautru hard_data_orig), 2527d819c083SNicolas Chautru "Hard output buffers (CB=%u) are not equal", 2528d819c083SNicolas Chautru i); 2529d819c083SNicolas Chautru 2530d819c083SNicolas Chautru if (ref_op->ldpc_dec.op_flags & RTE_BBDEV_LDPC_SOFT_OUT_ENABLE) 25319d9d73ebSHernan Vargas TEST_ASSERT_SUCCESS(validate_op_so_chain(soft_output, 2532d819c083SNicolas Chautru soft_data_orig), 2533d819c083SNicolas Chautru "Soft output buffers (CB=%u) are not equal", 2534d819c083SNicolas Chautru i); 2535d819c083SNicolas Chautru if (ref_op->ldpc_dec.op_flags & 2536d819c083SNicolas Chautru RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE) { 2537335c11fdSNicolas Chautru TEST_ASSERT_SUCCESS(validate_op_harq_chain(harq_output, 2538335c11fdSNicolas Chautru harq_data_orig, ops_td), 2539d819c083SNicolas Chautru "HARQ output buffers (CB=%u) are not equal", 2540d819c083SNicolas Chautru i); 2541d819c083SNicolas Chautru } 2542335c11fdSNicolas Chautru if (ref_op->ldpc_dec.op_flags & 2543335c11fdSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK) 2544335c11fdSNicolas Chautru TEST_ASSERT_SUCCESS(validate_op_harq_chain(harq_output, 2545335c11fdSNicolas Chautru harq_data_orig, ops_td), 2546335c11fdSNicolas Chautru "HARQ output buffers (CB=%u) are not equal", 2547335c11fdSNicolas Chautru i); 2548335c11fdSNicolas Chautru 2549d819c083SNicolas Chautru } 2550d819c083SNicolas Chautru 2551d819c083SNicolas Chautru return TEST_SUCCESS; 2552d819c083SNicolas Chautru } 2553d819c083SNicolas Chautru 2554d819c083SNicolas Chautru 2555f714a188SAmr Mokhtar static int 2556f714a188SAmr Mokhtar validate_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n, 2557f714a188SAmr Mokhtar struct rte_bbdev_enc_op *ref_op) 2558f714a188SAmr Mokhtar { 2559f714a188SAmr Mokhtar unsigned int i; 2560f714a188SAmr Mokhtar int ret; 2561f714a188SAmr Mokhtar struct op_data_entries *hard_data_orig = 2562f714a188SAmr Mokhtar &test_vector.entries[DATA_HARD_OUTPUT]; 2563f714a188SAmr Mokhtar 2564f714a188SAmr Mokhtar for (i = 0; i < n; ++i) { 2565f714a188SAmr Mokhtar ret = check_enc_status_and_ordering(ops[i], i, ref_op->status); 2566f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS(ret, 2567f714a188SAmr Mokhtar "Checking status and ordering for encoder failed"); 2568f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS(validate_op_chain( 2569f714a188SAmr Mokhtar &ops[i]->turbo_enc.output, 2570f714a188SAmr Mokhtar hard_data_orig), 2571f714a188SAmr Mokhtar "Output buffers (CB=%u) are not equal", 2572f714a188SAmr Mokhtar i); 2573f714a188SAmr Mokhtar } 2574f714a188SAmr Mokhtar 2575f714a188SAmr Mokhtar return TEST_SUCCESS; 2576f714a188SAmr Mokhtar } 2577f714a188SAmr Mokhtar 2578d819c083SNicolas Chautru static int 2579d819c083SNicolas Chautru validate_ldpc_enc_op(struct rte_bbdev_enc_op **ops, const uint16_t n, 2580d819c083SNicolas Chautru struct rte_bbdev_enc_op *ref_op) 2581d819c083SNicolas Chautru { 2582d819c083SNicolas Chautru unsigned int i; 2583d819c083SNicolas Chautru int ret; 2584d819c083SNicolas Chautru struct op_data_entries *hard_data_orig = 2585d819c083SNicolas Chautru &test_vector.entries[DATA_HARD_OUTPUT]; 2586d819c083SNicolas Chautru 2587d819c083SNicolas Chautru for (i = 0; i < n; ++i) { 2588d819c083SNicolas Chautru ret = check_enc_status_and_ordering(ops[i], i, ref_op->status); 2589d819c083SNicolas Chautru TEST_ASSERT_SUCCESS(ret, 2590d819c083SNicolas Chautru "Checking status and ordering for encoder failed"); 2591d819c083SNicolas Chautru TEST_ASSERT_SUCCESS(validate_op_chain( 2592d819c083SNicolas Chautru &ops[i]->ldpc_enc.output, 2593d819c083SNicolas Chautru hard_data_orig), 2594d819c083SNicolas Chautru "Output buffers (CB=%u) are not equal", 2595d819c083SNicolas Chautru i); 2596d819c083SNicolas Chautru } 2597d819c083SNicolas Chautru 2598d819c083SNicolas Chautru return TEST_SUCCESS; 2599d819c083SNicolas Chautru } 2600d819c083SNicolas Chautru 26010acdb986SNicolas Chautru static inline int 2602a2ea86cbSHernan Vargas validate_op_fft_chain(struct rte_bbdev_op_data *op, struct op_data_entries *orig_op, 2603a2ea86cbSHernan Vargas bool skip_validate_output) 26040acdb986SNicolas Chautru { 26050acdb986SNicolas Chautru struct rte_mbuf *m = op->data; 26060acdb986SNicolas Chautru uint8_t i, nb_dst_segments = orig_op->nb_segments; 26070ed76d66SHernan Vargas int16_t delt, abs_delt, thres_hold = 4; 26080acdb986SNicolas Chautru uint32_t j, data_len_iq, error_num; 26090acdb986SNicolas Chautru int16_t *ref_out, *op_out; 26100acdb986SNicolas Chautru 26110acdb986SNicolas Chautru TEST_ASSERT(nb_dst_segments == m->nb_segs, 26120acdb986SNicolas Chautru "Number of segments differ in original (%u) and filled (%u) op fft", 26130acdb986SNicolas Chautru nb_dst_segments, m->nb_segs); 26140acdb986SNicolas Chautru 26150acdb986SNicolas Chautru /* Due to size limitation of mbuf, FFT doesn't use real mbuf. */ 26160acdb986SNicolas Chautru for (i = 0; i < nb_dst_segments; ++i) { 26170acdb986SNicolas Chautru uint16_t offset = (i == 0) ? op->offset : 0; 26180acdb986SNicolas Chautru uint32_t data_len = op->length; 26190acdb986SNicolas Chautru 26200acdb986SNicolas Chautru TEST_ASSERT(orig_op->segments[i].length == data_len, 26210acdb986SNicolas Chautru "Length of segment differ in original (%u) and filled (%u) op fft", 26220acdb986SNicolas Chautru orig_op->segments[i].length, data_len); 26230acdb986SNicolas Chautru /* Divided by 2 to get the number of 16bits data. */ 26240acdb986SNicolas Chautru data_len_iq = data_len >> 1; 26250acdb986SNicolas Chautru ref_out = (int16_t *)(orig_op->segments[i].addr); 26260acdb986SNicolas Chautru op_out = rte_pktmbuf_mtod_offset(m, int16_t *, offset); 26270acdb986SNicolas Chautru error_num = 0; 26280acdb986SNicolas Chautru for (j = 0; j < data_len_iq; j++) { 26290acdb986SNicolas Chautru delt = ref_out[j] - op_out[j]; 26300acdb986SNicolas Chautru abs_delt = delt > 0 ? delt : -delt; 26310acdb986SNicolas Chautru error_num += (abs_delt > thres_hold ? 1 : 0); 26320acdb986SNicolas Chautru } 2633a2ea86cbSHernan Vargas if ((error_num > 0) && !skip_validate_output) { 26340acdb986SNicolas Chautru rte_memdump(stdout, "Buffer A", ref_out, data_len); 26350acdb986SNicolas Chautru rte_memdump(stdout, "Buffer B", op_out, data_len); 26360acdb986SNicolas Chautru TEST_ASSERT(error_num == 0, 26370acdb986SNicolas Chautru "FFT Output are not matched total (%u) errors (%u)", 26380acdb986SNicolas Chautru data_len_iq, error_num); 26390acdb986SNicolas Chautru } 26400acdb986SNicolas Chautru 26410acdb986SNicolas Chautru m = m->next; 26420acdb986SNicolas Chautru } 26430acdb986SNicolas Chautru 26440acdb986SNicolas Chautru return TEST_SUCCESS; 26450acdb986SNicolas Chautru } 26460acdb986SNicolas Chautru 264795f192a4SHernan Vargas static inline int 2648c268644aSHernan Vargas validate_op_fft_meas_chain(struct rte_bbdev_op_data *op, struct op_data_entries *orig_op, 2649c268644aSHernan Vargas bool skip_validate_output) 2650c268644aSHernan Vargas { 2651c268644aSHernan Vargas struct rte_mbuf *m = op->data; 2652c268644aSHernan Vargas uint8_t i, nb_dst_segments = orig_op->nb_segments; 2653c268644aSHernan Vargas double thres_hold = 1.0; 2654c268644aSHernan Vargas uint32_t j, data_len_iq, error_num; 2655c268644aSHernan Vargas int32_t *ref_out, *op_out; 2656c268644aSHernan Vargas double estSNR, refSNR, delt, abs_delt; 2657c268644aSHernan Vargas 2658c268644aSHernan Vargas TEST_ASSERT(nb_dst_segments == m->nb_segs, 2659c268644aSHernan Vargas "Number of segments differ in original (%u) and filled (%u) op fft", 2660c268644aSHernan Vargas nb_dst_segments, m->nb_segs); 2661c268644aSHernan Vargas 2662c268644aSHernan Vargas /* Due to size limitation of mbuf, FFT doesn't use real mbuf. */ 2663c268644aSHernan Vargas for (i = 0; i < nb_dst_segments; ++i) { 2664c268644aSHernan Vargas uint16_t offset = (i == 0) ? op->offset : 0; 2665c268644aSHernan Vargas uint32_t data_len = op->length; 2666c268644aSHernan Vargas 2667c268644aSHernan Vargas TEST_ASSERT(orig_op->segments[i].length == data_len, 2668c268644aSHernan Vargas "Length of segment differ in original (%u) and filled (%u) op fft", 2669c268644aSHernan Vargas orig_op->segments[i].length, data_len); 2670c268644aSHernan Vargas 2671c268644aSHernan Vargas /* Divided by 4 to get the number of 32 bits data. */ 2672c268644aSHernan Vargas data_len_iq = data_len >> 2; 2673c268644aSHernan Vargas ref_out = (int32_t *)(orig_op->segments[i].addr); 2674c268644aSHernan Vargas op_out = rte_pktmbuf_mtod_offset(m, int32_t *, offset); 2675c268644aSHernan Vargas error_num = 0; 2676c268644aSHernan Vargas for (j = 0; j < data_len_iq; j++) { 2677c268644aSHernan Vargas estSNR = 10*log10(op_out[j]); 2678c268644aSHernan Vargas refSNR = 10*log10(ref_out[j]); 2679c268644aSHernan Vargas delt = refSNR - estSNR; 2680c268644aSHernan Vargas abs_delt = delt > 0 ? delt : -delt; 2681c268644aSHernan Vargas error_num += (abs_delt > thres_hold ? 1 : 0); 2682c268644aSHernan Vargas } 2683c268644aSHernan Vargas if ((error_num > 0) && !skip_validate_output) { 2684c268644aSHernan Vargas rte_memdump(stdout, "Buffer A", ref_out, data_len); 2685c268644aSHernan Vargas rte_memdump(stdout, "Buffer B", op_out, data_len); 2686c268644aSHernan Vargas TEST_ASSERT(error_num == 0, 2687c268644aSHernan Vargas "FFT Output are not matched total (%u) errors (%u)", 2688c268644aSHernan Vargas data_len_iq, error_num); 2689c268644aSHernan Vargas } 2690c268644aSHernan Vargas 2691c268644aSHernan Vargas m = m->next; 2692c268644aSHernan Vargas } 2693c268644aSHernan Vargas 2694c268644aSHernan Vargas return TEST_SUCCESS; 2695c268644aSHernan Vargas } 2696c268644aSHernan Vargas 2697c268644aSHernan Vargas static inline int 269895f192a4SHernan Vargas validate_op_mldts_chain(struct rte_bbdev_op_data *op, 269995f192a4SHernan Vargas struct op_data_entries *orig_op) 270095f192a4SHernan Vargas { 270195f192a4SHernan Vargas uint8_t i; 270295f192a4SHernan Vargas struct rte_mbuf *m = op->data; 270395f192a4SHernan Vargas uint8_t nb_dst_segments = orig_op->nb_segments; 270495f192a4SHernan Vargas /*the result is not bit exact*/ 270595f192a4SHernan Vargas int16_t thres_hold = 3; 270695f192a4SHernan Vargas int16_t delt, abs_delt; 270795f192a4SHernan Vargas uint32_t j, data_len_iq; 270895f192a4SHernan Vargas uint32_t error_num; 270995f192a4SHernan Vargas int8_t *ref_out; 271095f192a4SHernan Vargas int8_t *op_out; 271195f192a4SHernan Vargas 271295f192a4SHernan Vargas TEST_ASSERT(nb_dst_segments == m->nb_segs, 271395f192a4SHernan Vargas "Number of segments differ in original (%u) and filled (%u) op mldts", 271495f192a4SHernan Vargas nb_dst_segments, m->nb_segs); 271595f192a4SHernan Vargas 271695f192a4SHernan Vargas /* Due to size limitation of mbuf, MLDTS doesn't use real mbuf. */ 271795f192a4SHernan Vargas for (i = 0; i < nb_dst_segments; ++i) { 271895f192a4SHernan Vargas uint16_t offset = (i == 0) ? op->offset : 0; 271995f192a4SHernan Vargas uint32_t data_len = op->length; 272095f192a4SHernan Vargas 272195f192a4SHernan Vargas TEST_ASSERT(orig_op->segments[i].length == data_len, 272295f192a4SHernan Vargas "Length of segment differ in original (%u) and filled (%u) op mldts", 272395f192a4SHernan Vargas orig_op->segments[i].length, data_len); 272495f192a4SHernan Vargas data_len_iq = data_len; 272595f192a4SHernan Vargas ref_out = (int8_t *)(orig_op->segments[i].addr); 272695f192a4SHernan Vargas op_out = rte_pktmbuf_mtod_offset(m, int8_t *, offset); 272795f192a4SHernan Vargas error_num = 0; 272895f192a4SHernan Vargas for (j = 0; j < data_len_iq; j++) { 272995f192a4SHernan Vargas 273095f192a4SHernan Vargas delt = ref_out[j] - op_out[j]; 273195f192a4SHernan Vargas abs_delt = delt > 0 ? delt : -delt; 273295f192a4SHernan Vargas error_num += (abs_delt > thres_hold ? 1 : 0); 273395f192a4SHernan Vargas if (error_num > 0) 273495f192a4SHernan Vargas printf("MLD Error %d: Exp %x %d Actual %x %d Diff %d\n", 273595f192a4SHernan Vargas j, ref_out[j], ref_out[j], op_out[j], op_out[j], 273695f192a4SHernan Vargas delt); 273795f192a4SHernan Vargas } 273895f192a4SHernan Vargas TEST_ASSERT(error_num == 0, 273995f192a4SHernan Vargas "MLDTS Output are not matched total (%u) errors (%u)", 274095f192a4SHernan Vargas data_len_iq, error_num); 274195f192a4SHernan Vargas 274295f192a4SHernan Vargas m = m->next; 274395f192a4SHernan Vargas } 274495f192a4SHernan Vargas 274595f192a4SHernan Vargas return TEST_SUCCESS; 274695f192a4SHernan Vargas } 274795f192a4SHernan Vargas 27480acdb986SNicolas Chautru static int 27490acdb986SNicolas Chautru validate_fft_op(struct rte_bbdev_fft_op **ops, const uint16_t n, 27500acdb986SNicolas Chautru struct rte_bbdev_fft_op *ref_op) 27510acdb986SNicolas Chautru { 27520acdb986SNicolas Chautru unsigned int i; 27530acdb986SNicolas Chautru int ret; 27540acdb986SNicolas Chautru struct op_data_entries *fft_data_orig = &test_vector.entries[DATA_HARD_OUTPUT]; 27550acdb986SNicolas Chautru struct op_data_entries *fft_pwr_orig = &test_vector.entries[DATA_SOFT_OUTPUT]; 2756a2ea86cbSHernan Vargas bool skip_validate_output = false; 2757a2ea86cbSHernan Vargas 2758a2ea86cbSHernan Vargas if ((test_vector.fft_window_width_vec > 0) && 2759a2ea86cbSHernan Vargas (test_vector.fft_window_width_vec != fft_window_width_dev)) { 2760a2ea86cbSHernan Vargas printf("The vector FFT width doesn't match with device - skip %d %d\n", 2761a2ea86cbSHernan Vargas test_vector.fft_window_width_vec, fft_window_width_dev); 2762a2ea86cbSHernan Vargas skip_validate_output = true; 2763a2ea86cbSHernan Vargas } 27640acdb986SNicolas Chautru 27650acdb986SNicolas Chautru for (i = 0; i < n; ++i) { 27660acdb986SNicolas Chautru ret = check_fft_status_and_ordering(ops[i], i, ref_op->status); 27670acdb986SNicolas Chautru TEST_ASSERT_SUCCESS(ret, "Checking status and ordering for FFT failed"); 27680acdb986SNicolas Chautru TEST_ASSERT_SUCCESS(validate_op_fft_chain( 2769a2ea86cbSHernan Vargas &ops[i]->fft.base_output, fft_data_orig, skip_validate_output), 27700acdb986SNicolas Chautru "FFT Output buffers (op=%u) are not matched", i); 27710acdb986SNicolas Chautru if (check_bit(ops[i]->fft.op_flags, RTE_BBDEV_FFT_POWER_MEAS)) 2772c268644aSHernan Vargas TEST_ASSERT_SUCCESS(validate_op_fft_meas_chain( 2773a2ea86cbSHernan Vargas &ops[i]->fft.power_meas_output, fft_pwr_orig, skip_validate_output), 27740acdb986SNicolas Chautru "FFT Power Output buffers (op=%u) are not matched", i); 27750acdb986SNicolas Chautru } 27760acdb986SNicolas Chautru 27770acdb986SNicolas Chautru return TEST_SUCCESS; 27780acdb986SNicolas Chautru } 27790acdb986SNicolas Chautru 278095f192a4SHernan Vargas static int 278195f192a4SHernan Vargas validate_mldts_op(struct rte_bbdev_mldts_op **ops, const uint16_t n, 278295f192a4SHernan Vargas struct rte_bbdev_mldts_op *ref_op) 278395f192a4SHernan Vargas { 278495f192a4SHernan Vargas unsigned int i; 278595f192a4SHernan Vargas int ret; 278695f192a4SHernan Vargas struct op_data_entries *mldts_data_orig = 278795f192a4SHernan Vargas &test_vector.entries[DATA_HARD_OUTPUT]; 278895f192a4SHernan Vargas for (i = 0; i < n; ++i) { 278995f192a4SHernan Vargas ret = check_mldts_status_and_ordering(ops[i], i, ref_op->status); 279095f192a4SHernan Vargas TEST_ASSERT_SUCCESS(ret, 279195f192a4SHernan Vargas "Checking status and ordering for MLDTS failed"); 279295f192a4SHernan Vargas TEST_ASSERT_SUCCESS(validate_op_mldts_chain( 279395f192a4SHernan Vargas &ops[i]->mldts.output, 279495f192a4SHernan Vargas mldts_data_orig), 279595f192a4SHernan Vargas "MLDTS Output buffers (op=%u) are not matched", 279695f192a4SHernan Vargas i); 279795f192a4SHernan Vargas } 279895f192a4SHernan Vargas 279995f192a4SHernan Vargas return TEST_SUCCESS; 280095f192a4SHernan Vargas } 280195f192a4SHernan Vargas 2802f714a188SAmr Mokhtar static void 2803f714a188SAmr Mokhtar create_reference_dec_op(struct rte_bbdev_dec_op *op) 2804f714a188SAmr Mokhtar { 2805f714a188SAmr Mokhtar unsigned int i; 2806f714a188SAmr Mokhtar struct op_data_entries *entry; 2807f714a188SAmr Mokhtar 2808f714a188SAmr Mokhtar op->turbo_dec = test_vector.turbo_dec; 2809f714a188SAmr Mokhtar entry = &test_vector.entries[DATA_INPUT]; 2810f714a188SAmr Mokhtar for (i = 0; i < entry->nb_segments; ++i) 2811f714a188SAmr Mokhtar op->turbo_dec.input.length += 2812f714a188SAmr Mokhtar entry->segments[i].length; 2813f714a188SAmr Mokhtar } 2814f714a188SAmr Mokhtar 2815f714a188SAmr Mokhtar static void 2816d819c083SNicolas Chautru create_reference_ldpc_dec_op(struct rte_bbdev_dec_op *op) 2817d819c083SNicolas Chautru { 2818d819c083SNicolas Chautru unsigned int i; 2819d819c083SNicolas Chautru struct op_data_entries *entry; 2820d819c083SNicolas Chautru 2821d819c083SNicolas Chautru op->ldpc_dec = test_vector.ldpc_dec; 2822d819c083SNicolas Chautru entry = &test_vector.entries[DATA_INPUT]; 2823d819c083SNicolas Chautru for (i = 0; i < entry->nb_segments; ++i) 2824d819c083SNicolas Chautru op->ldpc_dec.input.length += 2825d819c083SNicolas Chautru entry->segments[i].length; 2826d819c083SNicolas Chautru if (test_vector.ldpc_dec.op_flags & 2827d819c083SNicolas Chautru RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE) { 2828d819c083SNicolas Chautru entry = &test_vector.entries[DATA_HARQ_INPUT]; 2829d819c083SNicolas Chautru for (i = 0; i < entry->nb_segments; ++i) 2830d819c083SNicolas Chautru op->ldpc_dec.harq_combined_input.length += 2831d819c083SNicolas Chautru entry->segments[i].length; 2832d819c083SNicolas Chautru } 2833d819c083SNicolas Chautru } 2834d819c083SNicolas Chautru 28350acdb986SNicolas Chautru static void 28360acdb986SNicolas Chautru create_reference_fft_op(struct rte_bbdev_fft_op *op) 28370acdb986SNicolas Chautru { 28380acdb986SNicolas Chautru unsigned int i; 28390acdb986SNicolas Chautru struct op_data_entries *entry; 28400acdb986SNicolas Chautru op->fft = test_vector.fft; 28410acdb986SNicolas Chautru entry = &test_vector.entries[DATA_INPUT]; 28420acdb986SNicolas Chautru for (i = 0; i < entry->nb_segments; ++i) 28430acdb986SNicolas Chautru op->fft.base_input.length += entry->segments[i].length; 28440ed76d66SHernan Vargas entry = &test_vector.entries[DATA_HARQ_INPUT]; 28450ed76d66SHernan Vargas for (i = 0; i < entry->nb_segments; ++i) 28460ed76d66SHernan Vargas op->fft.dewindowing_input.length += entry->segments[i].length; 28470acdb986SNicolas Chautru } 2848d819c083SNicolas Chautru 2849d819c083SNicolas Chautru static void 285095f192a4SHernan Vargas create_reference_mldts_op(struct rte_bbdev_mldts_op *op) 285195f192a4SHernan Vargas { 285295f192a4SHernan Vargas unsigned int i; 285395f192a4SHernan Vargas struct op_data_entries *entry; 285495f192a4SHernan Vargas op->mldts = test_vector.mldts; 285595f192a4SHernan Vargas entry = &test_vector.entries[DATA_INPUT]; 285695f192a4SHernan Vargas for (i = 0; i < entry->nb_segments; ++i) 285795f192a4SHernan Vargas op->mldts.qhy_input.length += entry->segments[i].length; 285895f192a4SHernan Vargas entry = &test_vector.entries[DATA_HARQ_INPUT]; 285995f192a4SHernan Vargas for (i = 0; i < entry->nb_segments; ++i) 286095f192a4SHernan Vargas op->mldts.r_input.length += entry->segments[i].length; 286195f192a4SHernan Vargas } 286295f192a4SHernan Vargas 286395f192a4SHernan Vargas static void 2864f714a188SAmr Mokhtar create_reference_enc_op(struct rte_bbdev_enc_op *op) 2865f714a188SAmr Mokhtar { 2866f714a188SAmr Mokhtar unsigned int i; 2867f714a188SAmr Mokhtar struct op_data_entries *entry; 2868f714a188SAmr Mokhtar 2869f714a188SAmr Mokhtar op->turbo_enc = test_vector.turbo_enc; 2870f714a188SAmr Mokhtar entry = &test_vector.entries[DATA_INPUT]; 2871f714a188SAmr Mokhtar for (i = 0; i < entry->nb_segments; ++i) 2872f714a188SAmr Mokhtar op->turbo_enc.input.length += 2873f714a188SAmr Mokhtar entry->segments[i].length; 2874f714a188SAmr Mokhtar } 2875f714a188SAmr Mokhtar 2876d819c083SNicolas Chautru static void 2877d819c083SNicolas Chautru create_reference_ldpc_enc_op(struct rte_bbdev_enc_op *op) 2878d819c083SNicolas Chautru { 2879d819c083SNicolas Chautru unsigned int i; 2880d819c083SNicolas Chautru struct op_data_entries *entry; 2881d819c083SNicolas Chautru 2882d819c083SNicolas Chautru op->ldpc_enc = test_vector.ldpc_enc; 2883d819c083SNicolas Chautru entry = &test_vector.entries[DATA_INPUT]; 2884d819c083SNicolas Chautru for (i = 0; i < entry->nb_segments; ++i) 2885d819c083SNicolas Chautru op->ldpc_enc.input.length += 2886d819c083SNicolas Chautru entry->segments[i].length; 2887d819c083SNicolas Chautru } 2888d819c083SNicolas Chautru 28890b98d574SKamil Chalupnik static uint32_t 28900b98d574SKamil Chalupnik calc_dec_TB_size(struct rte_bbdev_dec_op *op) 28910b98d574SKamil Chalupnik { 28920b98d574SKamil Chalupnik uint8_t i; 28930b98d574SKamil Chalupnik uint32_t c, r, tb_size = 0; 28940b98d574SKamil Chalupnik 289548fc315fSNicolas Chautru if (op->turbo_dec.code_block_mode == RTE_BBDEV_CODE_BLOCK) { 28960b98d574SKamil Chalupnik tb_size = op->turbo_dec.tb_params.k_neg; 28970b98d574SKamil Chalupnik } else { 28980b98d574SKamil Chalupnik c = op->turbo_dec.tb_params.c; 28990b98d574SKamil Chalupnik r = op->turbo_dec.tb_params.r; 29000b98d574SKamil Chalupnik for (i = 0; i < c-r; i++) 29010b98d574SKamil Chalupnik tb_size += (r < op->turbo_dec.tb_params.c_neg) ? 29020b98d574SKamil Chalupnik op->turbo_dec.tb_params.k_neg : 29030b98d574SKamil Chalupnik op->turbo_dec.tb_params.k_pos; 29040b98d574SKamil Chalupnik } 29050b98d574SKamil Chalupnik return tb_size; 29060b98d574SKamil Chalupnik } 29070b98d574SKamil Chalupnik 29080b98d574SKamil Chalupnik static uint32_t 2909d819c083SNicolas Chautru calc_ldpc_dec_TB_size(struct rte_bbdev_dec_op *op) 2910d819c083SNicolas Chautru { 2911647144a5SHernan Vargas uint8_t num_cbs = 0; 2912647144a5SHernan Vargas uint32_t tb_size = 0; 2913d819c083SNicolas Chautru uint16_t sys_cols = (op->ldpc_dec.basegraph == 1) ? 22 : 10; 2914d819c083SNicolas Chautru 2915647144a5SHernan Vargas if (op->ldpc_dec.code_block_mode == RTE_BBDEV_CODE_BLOCK) 2916647144a5SHernan Vargas num_cbs = 1; 2917647144a5SHernan Vargas else 2918647144a5SHernan Vargas num_cbs = op->ldpc_dec.tb_params.c - op->ldpc_dec.tb_params.r; 2919647144a5SHernan Vargas 2920647144a5SHernan Vargas tb_size = (sys_cols * op->ldpc_dec.z_c - op->ldpc_dec.n_filler) * num_cbs; 2921d819c083SNicolas Chautru return tb_size; 2922d819c083SNicolas Chautru } 2923d819c083SNicolas Chautru 2924d819c083SNicolas Chautru static uint32_t 29250b98d574SKamil Chalupnik calc_enc_TB_size(struct rte_bbdev_enc_op *op) 29260b98d574SKamil Chalupnik { 29270b98d574SKamil Chalupnik uint8_t i; 29280b98d574SKamil Chalupnik uint32_t c, r, tb_size = 0; 29290b98d574SKamil Chalupnik 293048fc315fSNicolas Chautru if (op->turbo_enc.code_block_mode == RTE_BBDEV_CODE_BLOCK) { 29310b98d574SKamil Chalupnik tb_size = op->turbo_enc.tb_params.k_neg; 29320b98d574SKamil Chalupnik } else { 29330b98d574SKamil Chalupnik c = op->turbo_enc.tb_params.c; 29340b98d574SKamil Chalupnik r = op->turbo_enc.tb_params.r; 29350b98d574SKamil Chalupnik for (i = 0; i < c-r; i++) 29360b98d574SKamil Chalupnik tb_size += (r < op->turbo_enc.tb_params.c_neg) ? 29370b98d574SKamil Chalupnik op->turbo_enc.tb_params.k_neg : 29380b98d574SKamil Chalupnik op->turbo_enc.tb_params.k_pos; 29390b98d574SKamil Chalupnik } 29400b98d574SKamil Chalupnik return tb_size; 29410b98d574SKamil Chalupnik } 29420b98d574SKamil Chalupnik 2943d819c083SNicolas Chautru static uint32_t 2944d819c083SNicolas Chautru calc_ldpc_enc_TB_size(struct rte_bbdev_enc_op *op) 2945d819c083SNicolas Chautru { 2946647144a5SHernan Vargas uint8_t num_cbs = 0; 2947647144a5SHernan Vargas uint32_t tb_size = 0; 2948d819c083SNicolas Chautru uint16_t sys_cols = (op->ldpc_enc.basegraph == 1) ? 22 : 10; 2949d819c083SNicolas Chautru 2950647144a5SHernan Vargas if (op->ldpc_enc.code_block_mode == RTE_BBDEV_CODE_BLOCK) 2951647144a5SHernan Vargas num_cbs = 1; 2952647144a5SHernan Vargas else 2953647144a5SHernan Vargas num_cbs = op->ldpc_enc.tb_params.c - op->ldpc_enc.tb_params.r; 2954647144a5SHernan Vargas 2955647144a5SHernan Vargas tb_size = (sys_cols * op->ldpc_enc.z_c - op->ldpc_enc.n_filler) * num_cbs; 2956d819c083SNicolas Chautru return tb_size; 2957d819c083SNicolas Chautru } 2958d819c083SNicolas Chautru 29590acdb986SNicolas Chautru static uint32_t 29600acdb986SNicolas Chautru calc_fft_size(struct rte_bbdev_fft_op *op) 29610acdb986SNicolas Chautru { 29620acdb986SNicolas Chautru uint32_t output_size; 29630acdb986SNicolas Chautru int num_cs = 0, i; 29640acdb986SNicolas Chautru for (i = 0; i < 12; i++) 29650acdb986SNicolas Chautru if (check_bit(op->fft.cs_bitmap, 1 << i)) 29660acdb986SNicolas Chautru num_cs++; 29670acdb986SNicolas Chautru output_size = (num_cs * op->fft.output_sequence_size * 4) << op->fft.num_antennas_log2; 29680acdb986SNicolas Chautru return output_size; 29690acdb986SNicolas Chautru } 2970d819c083SNicolas Chautru 297195f192a4SHernan Vargas static uint32_t 297295f192a4SHernan Vargas calc_mldts_size(struct rte_bbdev_mldts_op *op) 297395f192a4SHernan Vargas { 29740de3cb95SHernan Vargas uint32_t output_size = 0; 29750de3cb95SHernan Vargas uint16_t i; 29760de3cb95SHernan Vargas 29770de3cb95SHernan Vargas for (i = 0; i < op->mldts.num_layers; i++) 29780de3cb95SHernan Vargas output_size += op->mldts.q_m[i]; 29790de3cb95SHernan Vargas 29800de3cb95SHernan Vargas output_size *= NUM_SC_PER_RB * BITS_PER_LLR * op->mldts.num_rbs * (op->mldts.c_rep + 1); 29810de3cb95SHernan Vargas 298295f192a4SHernan Vargas return output_size; 298395f192a4SHernan Vargas } 298495f192a4SHernan Vargas 2985f714a188SAmr Mokhtar static int 2986f714a188SAmr Mokhtar init_test_op_params(struct test_op_params *op_params, 2987f714a188SAmr Mokhtar enum rte_bbdev_op_type op_type, const int expected_status, 2988f714a188SAmr Mokhtar const int vector_mask, struct rte_mempool *ops_mp, 2989f714a188SAmr Mokhtar uint16_t burst_sz, uint16_t num_to_process, uint16_t num_lcores) 2990f714a188SAmr Mokhtar { 2991f714a188SAmr Mokhtar int ret = 0; 2992d819c083SNicolas Chautru if (op_type == RTE_BBDEV_OP_TURBO_DEC || 2993d819c083SNicolas Chautru op_type == RTE_BBDEV_OP_LDPC_DEC) 2994f714a188SAmr Mokhtar ret = rte_bbdev_dec_op_alloc_bulk(ops_mp, 2995f714a188SAmr Mokhtar &op_params->ref_dec_op, 1); 29960acdb986SNicolas Chautru else if (op_type == RTE_BBDEV_OP_FFT) 29970acdb986SNicolas Chautru ret = rte_bbdev_fft_op_alloc_bulk(ops_mp, 29980acdb986SNicolas Chautru &op_params->ref_fft_op, 1); 299995f192a4SHernan Vargas else if (op_type == RTE_BBDEV_OP_MLDTS) 300095f192a4SHernan Vargas ret = rte_bbdev_mldts_op_alloc_bulk(ops_mp, 300195f192a4SHernan Vargas &op_params->ref_mldts_op, 1); 3002f714a188SAmr Mokhtar else 3003f714a188SAmr Mokhtar ret = rte_bbdev_enc_op_alloc_bulk(ops_mp, 3004f714a188SAmr Mokhtar &op_params->ref_enc_op, 1); 3005f714a188SAmr Mokhtar 3006f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS(ret, "rte_bbdev_op_alloc_bulk() failed"); 3007f714a188SAmr Mokhtar 3008f714a188SAmr Mokhtar op_params->mp = ops_mp; 3009f714a188SAmr Mokhtar op_params->burst_sz = burst_sz; 3010f714a188SAmr Mokhtar op_params->num_to_process = num_to_process; 3011f714a188SAmr Mokhtar op_params->num_lcores = num_lcores; 3012f714a188SAmr Mokhtar op_params->vector_mask = vector_mask; 3013d819c083SNicolas Chautru if (op_type == RTE_BBDEV_OP_TURBO_DEC || 3014d819c083SNicolas Chautru op_type == RTE_BBDEV_OP_LDPC_DEC) 3015f714a188SAmr Mokhtar op_params->ref_dec_op->status = expected_status; 3016d819c083SNicolas Chautru else if (op_type == RTE_BBDEV_OP_TURBO_ENC 3017d819c083SNicolas Chautru || op_type == RTE_BBDEV_OP_LDPC_ENC) 3018f714a188SAmr Mokhtar op_params->ref_enc_op->status = expected_status; 30190acdb986SNicolas Chautru else if (op_type == RTE_BBDEV_OP_FFT) 30200acdb986SNicolas Chautru op_params->ref_fft_op->status = expected_status; 302195f192a4SHernan Vargas else if (op_type == RTE_BBDEV_OP_MLDTS) 302295f192a4SHernan Vargas op_params->ref_mldts_op->status = expected_status; 3023f714a188SAmr Mokhtar return 0; 3024f714a188SAmr Mokhtar } 3025f714a188SAmr Mokhtar 3026f714a188SAmr Mokhtar static int 3027f714a188SAmr Mokhtar run_test_case_on_device(test_case_function *test_case_func, uint8_t dev_id, 3028f714a188SAmr Mokhtar struct test_op_params *op_params) 3029f714a188SAmr Mokhtar { 3030f714a188SAmr Mokhtar int t_ret, f_ret, socket_id = SOCKET_ID_ANY; 3031f714a188SAmr Mokhtar unsigned int i; 3032f714a188SAmr Mokhtar struct active_device *ad; 3033f714a188SAmr Mokhtar unsigned int burst_sz = get_burst_sz(); 3034f714a188SAmr Mokhtar enum rte_bbdev_op_type op_type = test_vector.op_type; 303547d5a049SKamil Chalupnik const struct rte_bbdev_op_cap *capabilities = NULL; 3036f714a188SAmr Mokhtar 3037f714a188SAmr Mokhtar ad = &active_devs[dev_id]; 3038f714a188SAmr Mokhtar 3039f714a188SAmr Mokhtar /* Check if device supports op_type */ 3040f714a188SAmr Mokhtar if (!is_avail_op(ad, test_vector.op_type)) 3041f714a188SAmr Mokhtar return TEST_SUCCESS; 3042f714a188SAmr Mokhtar 3043f714a188SAmr Mokhtar struct rte_bbdev_info info; 3044f714a188SAmr Mokhtar rte_bbdev_info_get(ad->dev_id, &info); 3045f714a188SAmr Mokhtar socket_id = GET_SOCKET(info.socket_id); 3046f714a188SAmr Mokhtar 3047f714a188SAmr Mokhtar f_ret = create_mempools(ad, socket_id, op_type, 3048f714a188SAmr Mokhtar get_num_ops()); 3049f714a188SAmr Mokhtar if (f_ret != TEST_SUCCESS) { 3050f714a188SAmr Mokhtar printf("Couldn't create mempools"); 3051f714a188SAmr Mokhtar goto fail; 3052f714a188SAmr Mokhtar } 3053ad458935SKamil Chalupnik if (op_type == RTE_BBDEV_OP_NONE) 3054ad458935SKamil Chalupnik op_type = RTE_BBDEV_OP_TURBO_ENC; 3055f714a188SAmr Mokhtar 3056f714a188SAmr Mokhtar f_ret = init_test_op_params(op_params, test_vector.op_type, 3057f714a188SAmr Mokhtar test_vector.expected_status, 3058f714a188SAmr Mokhtar test_vector.mask, 3059f714a188SAmr Mokhtar ad->ops_mempool, 3060f714a188SAmr Mokhtar burst_sz, 3061f714a188SAmr Mokhtar get_num_ops(), 3062f714a188SAmr Mokhtar get_num_lcores()); 3063f714a188SAmr Mokhtar if (f_ret != TEST_SUCCESS) { 3064f714a188SAmr Mokhtar printf("Couldn't init test op params"); 3065f714a188SAmr Mokhtar goto fail; 3066f714a188SAmr Mokhtar } 3067f714a188SAmr Mokhtar 3068d819c083SNicolas Chautru 3069d819c083SNicolas Chautru /* Find capabilities */ 307047d5a049SKamil Chalupnik const struct rte_bbdev_op_cap *cap = info.drv.capabilities; 3071e70212ccSNicolas Chautru do { 3072d819c083SNicolas Chautru if (cap->type == test_vector.op_type) { 307347d5a049SKamil Chalupnik capabilities = cap; 307447d5a049SKamil Chalupnik break; 307547d5a049SKamil Chalupnik } 3076d819c083SNicolas Chautru cap++; 3077e70212ccSNicolas Chautru } while (cap->type != RTE_BBDEV_OP_NONE); 307847d5a049SKamil Chalupnik TEST_ASSERT_NOT_NULL(capabilities, 3079d819c083SNicolas Chautru "Couldn't find capabilities"); 308047d5a049SKamil Chalupnik 3081d819c083SNicolas Chautru if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) { 3082f714a188SAmr Mokhtar create_reference_dec_op(op_params->ref_dec_op); 308347d5a049SKamil Chalupnik } else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) 3084f714a188SAmr Mokhtar create_reference_enc_op(op_params->ref_enc_op); 3085d819c083SNicolas Chautru else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) 3086d819c083SNicolas Chautru create_reference_ldpc_enc_op(op_params->ref_enc_op); 3087d819c083SNicolas Chautru else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) 3088d819c083SNicolas Chautru create_reference_ldpc_dec_op(op_params->ref_dec_op); 30890acdb986SNicolas Chautru else if (test_vector.op_type == RTE_BBDEV_OP_FFT) 30900acdb986SNicolas Chautru create_reference_fft_op(op_params->ref_fft_op); 309195f192a4SHernan Vargas else if (test_vector.op_type == RTE_BBDEV_OP_MLDTS) 309295f192a4SHernan Vargas create_reference_mldts_op(op_params->ref_mldts_op); 3093f714a188SAmr Mokhtar 3094f714a188SAmr Mokhtar for (i = 0; i < ad->nb_queues; ++i) { 3095f714a188SAmr Mokhtar f_ret = fill_queue_buffers(op_params, 3096f714a188SAmr Mokhtar ad->in_mbuf_pool, 3097f714a188SAmr Mokhtar ad->hard_out_mbuf_pool, 3098f714a188SAmr Mokhtar ad->soft_out_mbuf_pool, 3099d819c083SNicolas Chautru ad->harq_in_mbuf_pool, 3100d819c083SNicolas Chautru ad->harq_out_mbuf_pool, 3101f714a188SAmr Mokhtar ad->queue_ids[i], 310247d5a049SKamil Chalupnik capabilities, 3103f714a188SAmr Mokhtar info.drv.min_alignment, 3104f714a188SAmr Mokhtar socket_id); 3105f714a188SAmr Mokhtar if (f_ret != TEST_SUCCESS) { 3106f714a188SAmr Mokhtar printf("Couldn't init queue buffers"); 3107f714a188SAmr Mokhtar goto fail; 3108f714a188SAmr Mokhtar } 3109f714a188SAmr Mokhtar } 3110f714a188SAmr Mokhtar 3111f714a188SAmr Mokhtar /* Run test case function */ 3112f714a188SAmr Mokhtar t_ret = test_case_func(ad, op_params); 3113f714a188SAmr Mokhtar 3114067fae41SNicolas Chautru if (dump_ops) { 3115067fae41SNicolas Chautru /* Dump queue information in local file. */ 3116067fae41SNicolas Chautru static FILE *fd; 3117067fae41SNicolas Chautru fd = fopen("./dump_bbdev_queue_ops.txt", "w"); 3118067fae41SNicolas Chautru if (fd == NULL) { 3119067fae41SNicolas Chautru printf("Open dump file error.\n"); 3120067fae41SNicolas Chautru return -1; 3121067fae41SNicolas Chautru } 3122067fae41SNicolas Chautru rte_bbdev_queue_ops_dump(ad->dev_id, ad->queue_ids[i], fd); 3123067fae41SNicolas Chautru fclose(fd); 3124067fae41SNicolas Chautru /* Run it once only. */ 3125067fae41SNicolas Chautru dump_ops = false; 3126067fae41SNicolas Chautru } 3127067fae41SNicolas Chautru 3128f714a188SAmr Mokhtar /* Free active device resources and return */ 3129f714a188SAmr Mokhtar free_buffers(ad, op_params); 3130f714a188SAmr Mokhtar return t_ret; 3131f714a188SAmr Mokhtar 3132f714a188SAmr Mokhtar fail: 3133f714a188SAmr Mokhtar free_buffers(ad, op_params); 3134f714a188SAmr Mokhtar return TEST_FAILED; 3135f714a188SAmr Mokhtar } 3136f714a188SAmr Mokhtar 3137f714a188SAmr Mokhtar /* Run given test function per active device per supported op type 3138f714a188SAmr Mokhtar * per burst size. 3139f714a188SAmr Mokhtar */ 3140f714a188SAmr Mokhtar static int 3141f714a188SAmr Mokhtar run_test_case(test_case_function *test_case_func) 3142f714a188SAmr Mokhtar { 3143f714a188SAmr Mokhtar int ret = 0; 3144f714a188SAmr Mokhtar uint8_t dev; 3145f714a188SAmr Mokhtar 3146f714a188SAmr Mokhtar /* Alloc op_params */ 3147f714a188SAmr Mokhtar struct test_op_params *op_params = rte_zmalloc(NULL, 3148f714a188SAmr Mokhtar sizeof(struct test_op_params), RTE_CACHE_LINE_SIZE); 3149f714a188SAmr Mokhtar TEST_ASSERT_NOT_NULL(op_params, "Failed to alloc %zuB for op_params", 3150f714a188SAmr Mokhtar RTE_ALIGN(sizeof(struct test_op_params), 3151f714a188SAmr Mokhtar RTE_CACHE_LINE_SIZE)); 3152f714a188SAmr Mokhtar 3153f714a188SAmr Mokhtar /* For each device run test case function */ 3154f714a188SAmr Mokhtar for (dev = 0; dev < nb_active_devs; ++dev) 3155f714a188SAmr Mokhtar ret |= run_test_case_on_device(test_case_func, dev, op_params); 3156f714a188SAmr Mokhtar 3157f714a188SAmr Mokhtar rte_free(op_params); 3158f714a188SAmr Mokhtar 3159f714a188SAmr Mokhtar return ret; 3160f714a188SAmr Mokhtar } 3161f714a188SAmr Mokhtar 3162335c11fdSNicolas Chautru 3163335c11fdSNicolas Chautru /* Push back the HARQ output from DDR to host */ 3164335c11fdSNicolas Chautru static void 3165335c11fdSNicolas Chautru retrieve_harq_ddr(uint16_t dev_id, uint16_t queue_id, 3166335c11fdSNicolas Chautru struct rte_bbdev_dec_op **ops, 3167335c11fdSNicolas Chautru const uint16_t n) 3168335c11fdSNicolas Chautru { 3169335c11fdSNicolas Chautru uint16_t j; 3170335c11fdSNicolas Chautru int save_status, ret; 31713d6063a0SNicolas Chautru uint32_t harq_offset = (uint32_t) queue_id * HARQ_INCR * MAX_OPS; 3172335c11fdSNicolas Chautru struct rte_bbdev_dec_op *ops_deq[MAX_BURST]; 3173335c11fdSNicolas Chautru uint32_t flags = ops[0]->ldpc_dec.op_flags; 3174335c11fdSNicolas Chautru bool loopback = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK; 3175335c11fdSNicolas Chautru bool mem_out = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; 3176335c11fdSNicolas Chautru bool hc_out = flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE; 3177335c11fdSNicolas Chautru bool h_comp = flags & RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; 3178335c11fdSNicolas Chautru for (j = 0; j < n; ++j) { 3179335c11fdSNicolas Chautru if ((loopback && mem_out) || hc_out) { 3180335c11fdSNicolas Chautru save_status = ops[j]->status; 3181335c11fdSNicolas Chautru ops[j]->ldpc_dec.op_flags = 3182335c11fdSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK + 3183335c11fdSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE; 3184335c11fdSNicolas Chautru if (h_comp) 3185335c11fdSNicolas Chautru ops[j]->ldpc_dec.op_flags += 3186335c11fdSNicolas Chautru RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; 3187335c11fdSNicolas Chautru ops[j]->ldpc_dec.harq_combined_input.offset = 3188335c11fdSNicolas Chautru harq_offset; 3189335c11fdSNicolas Chautru ops[j]->ldpc_dec.harq_combined_output.offset = 0; 3190335c11fdSNicolas Chautru harq_offset += HARQ_INCR; 3191335c11fdSNicolas Chautru if (!loopback) 3192335c11fdSNicolas Chautru ops[j]->ldpc_dec.harq_combined_input.length = 3193335c11fdSNicolas Chautru ops[j]->ldpc_dec.harq_combined_output.length; 3194335c11fdSNicolas Chautru rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, 3195335c11fdSNicolas Chautru &ops[j], 1); 3196335c11fdSNicolas Chautru ret = 0; 3197335c11fdSNicolas Chautru while (ret == 0) 3198335c11fdSNicolas Chautru ret = rte_bbdev_dequeue_ldpc_dec_ops( 3199335c11fdSNicolas Chautru dev_id, queue_id, 3200335c11fdSNicolas Chautru &ops_deq[j], 1); 3201335c11fdSNicolas Chautru ops[j]->ldpc_dec.op_flags = flags; 3202335c11fdSNicolas Chautru ops[j]->status = save_status; 3203335c11fdSNicolas Chautru } 3204335c11fdSNicolas Chautru } 3205335c11fdSNicolas Chautru } 3206335c11fdSNicolas Chautru 3207335c11fdSNicolas Chautru /* 3208335c11fdSNicolas Chautru * Push back the HARQ output from HW DDR to Host 3209335c11fdSNicolas Chautru * Preload HARQ memory input and adjust HARQ offset 3210335c11fdSNicolas Chautru */ 3211335c11fdSNicolas Chautru static void 3212335c11fdSNicolas Chautru preload_harq_ddr(uint16_t dev_id, uint16_t queue_id, 3213335c11fdSNicolas Chautru struct rte_bbdev_dec_op **ops, const uint16_t n, 3214335c11fdSNicolas Chautru bool preload) 3215335c11fdSNicolas Chautru { 3216335c11fdSNicolas Chautru uint16_t j; 32173d6063a0SNicolas Chautru int deq; 32183d6063a0SNicolas Chautru uint32_t harq_offset = (uint32_t) queue_id * HARQ_INCR * MAX_OPS; 32193d6063a0SNicolas Chautru struct rte_bbdev_op_data save_hc_in[MAX_OPS], save_hc_out[MAX_OPS]; 32203d6063a0SNicolas Chautru struct rte_bbdev_dec_op *ops_deq[MAX_OPS]; 3221335c11fdSNicolas Chautru uint32_t flags = ops[0]->ldpc_dec.op_flags; 3222335c11fdSNicolas Chautru bool mem_in = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_IN_ENABLE; 3223335c11fdSNicolas Chautru bool hc_in = flags & RTE_BBDEV_LDPC_HQ_COMBINE_IN_ENABLE; 3224335c11fdSNicolas Chautru bool mem_out = flags & RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; 3225335c11fdSNicolas Chautru bool hc_out = flags & RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE; 3226335c11fdSNicolas Chautru bool h_comp = flags & RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; 3227335c11fdSNicolas Chautru if ((mem_in || hc_in) && preload) { 32283d6063a0SNicolas Chautru for (j = 0; j < n; ++j) { 32293d6063a0SNicolas Chautru save_hc_in[j] = ops[j]->ldpc_dec.harq_combined_input; 32303d6063a0SNicolas Chautru save_hc_out[j] = ops[j]->ldpc_dec.harq_combined_output; 3231335c11fdSNicolas Chautru ops[j]->ldpc_dec.op_flags = 3232335c11fdSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK + 3233335c11fdSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; 3234335c11fdSNicolas Chautru if (h_comp) 3235335c11fdSNicolas Chautru ops[j]->ldpc_dec.op_flags += 3236335c11fdSNicolas Chautru RTE_BBDEV_LDPC_HARQ_6BIT_COMPRESSION; 3237335c11fdSNicolas Chautru ops[j]->ldpc_dec.harq_combined_output.offset = 3238335c11fdSNicolas Chautru harq_offset; 3239335c11fdSNicolas Chautru ops[j]->ldpc_dec.harq_combined_input.offset = 0; 32403d6063a0SNicolas Chautru harq_offset += HARQ_INCR; 3241335c11fdSNicolas Chautru } 32423d6063a0SNicolas Chautru rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, &ops[0], n); 32433d6063a0SNicolas Chautru deq = 0; 32443d6063a0SNicolas Chautru while (deq != n) 32453d6063a0SNicolas Chautru deq += rte_bbdev_dequeue_ldpc_dec_ops( 32463d6063a0SNicolas Chautru dev_id, queue_id, &ops_deq[deq], 32473d6063a0SNicolas Chautru n - deq); 32483d6063a0SNicolas Chautru /* Restore the operations */ 32493d6063a0SNicolas Chautru for (j = 0; j < n; ++j) { 32503d6063a0SNicolas Chautru ops[j]->ldpc_dec.op_flags = flags; 32513d6063a0SNicolas Chautru ops[j]->ldpc_dec.harq_combined_input = save_hc_in[j]; 32523d6063a0SNicolas Chautru ops[j]->ldpc_dec.harq_combined_output = save_hc_out[j]; 32533d6063a0SNicolas Chautru } 32543d6063a0SNicolas Chautru } 32553d6063a0SNicolas Chautru harq_offset = (uint32_t) queue_id * HARQ_INCR * MAX_OPS; 32563d6063a0SNicolas Chautru for (j = 0; j < n; ++j) { 3257335c11fdSNicolas Chautru /* Adjust HARQ offset when we reach external DDR */ 3258335c11fdSNicolas Chautru if (mem_in || hc_in) 3259335c11fdSNicolas Chautru ops[j]->ldpc_dec.harq_combined_input.offset 3260335c11fdSNicolas Chautru = harq_offset; 3261335c11fdSNicolas Chautru if (mem_out || hc_out) 3262335c11fdSNicolas Chautru ops[j]->ldpc_dec.harq_combined_output.offset 3263335c11fdSNicolas Chautru = harq_offset; 3264335c11fdSNicolas Chautru harq_offset += HARQ_INCR; 3265335c11fdSNicolas Chautru } 3266335c11fdSNicolas Chautru } 3267335c11fdSNicolas Chautru 3268f714a188SAmr Mokhtar static void 3269f714a188SAmr Mokhtar dequeue_event_callback(uint16_t dev_id, 3270f714a188SAmr Mokhtar enum rte_bbdev_event_type event, void *cb_arg, 3271f714a188SAmr Mokhtar void *ret_param) 3272f714a188SAmr Mokhtar { 3273f714a188SAmr Mokhtar int ret; 3274f714a188SAmr Mokhtar uint16_t i; 3275f714a188SAmr Mokhtar uint64_t total_time; 32760b98d574SKamil Chalupnik uint16_t deq, burst_sz, num_ops; 3277b2e2aec3SKamil Chalupnik uint16_t queue_id = *(uint16_t *) ret_param; 3278f714a188SAmr Mokhtar struct rte_bbdev_info info; 32790b98d574SKamil Chalupnik double tb_len_bits; 3280f714a188SAmr Mokhtar struct thread_params *tp = cb_arg; 3281f714a188SAmr Mokhtar 3282f714a188SAmr Mokhtar /* Find matching thread params using queue_id */ 3283f714a188SAmr Mokhtar for (i = 0; i < MAX_QUEUES; ++i, ++tp) 3284f714a188SAmr Mokhtar if (tp->queue_id == queue_id) 3285f714a188SAmr Mokhtar break; 3286f714a188SAmr Mokhtar 3287f714a188SAmr Mokhtar if (i == MAX_QUEUES) { 3288f714a188SAmr Mokhtar printf("%s: Queue_id from interrupt details was not found!\n", 3289f714a188SAmr Mokhtar __func__); 3290f714a188SAmr Mokhtar return; 3291f714a188SAmr Mokhtar } 3292f714a188SAmr Mokhtar 3293f714a188SAmr Mokhtar if (unlikely(event != RTE_BBDEV_EVENT_DEQUEUE)) { 3294b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->processing_status, TEST_FAILED, 3295b6a7e685STyler Retzlaff rte_memory_order_relaxed); 3296f714a188SAmr Mokhtar printf( 3297f714a188SAmr Mokhtar "Dequeue interrupt handler called for incorrect event!\n"); 3298f714a188SAmr Mokhtar return; 3299f714a188SAmr Mokhtar } 3300f714a188SAmr Mokhtar 3301b6a7e685STyler Retzlaff burst_sz = rte_atomic_load_explicit(&tp->burst_sz, rte_memory_order_relaxed); 33020b98d574SKamil Chalupnik num_ops = tp->op_params->num_to_process; 3303f714a188SAmr Mokhtar 3304335c11fdSNicolas Chautru if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) 3305b2e2aec3SKamil Chalupnik deq = rte_bbdev_dequeue_dec_ops(dev_id, queue_id, 3306b2e2aec3SKamil Chalupnik &tp->dec_ops[ 3307b6a7e685STyler Retzlaff rte_atomic_load_explicit(&tp->nb_dequeued, 3308b6a7e685STyler Retzlaff rte_memory_order_relaxed)], 3309f714a188SAmr Mokhtar burst_sz); 3310335c11fdSNicolas Chautru else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) 3311335c11fdSNicolas Chautru deq = rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, 3312335c11fdSNicolas Chautru &tp->dec_ops[ 3313b6a7e685STyler Retzlaff rte_atomic_load_explicit(&tp->nb_dequeued, 3314b6a7e685STyler Retzlaff rte_memory_order_relaxed)], 3315335c11fdSNicolas Chautru burst_sz); 3316335c11fdSNicolas Chautru else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) 3317335c11fdSNicolas Chautru deq = rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, 3318335c11fdSNicolas Chautru &tp->enc_ops[ 3319b6a7e685STyler Retzlaff rte_atomic_load_explicit(&tp->nb_dequeued, 3320b6a7e685STyler Retzlaff rte_memory_order_relaxed)], 3321335c11fdSNicolas Chautru burst_sz); 33220acdb986SNicolas Chautru else if (test_vector.op_type == RTE_BBDEV_OP_FFT) 33230acdb986SNicolas Chautru deq = rte_bbdev_dequeue_fft_ops(dev_id, queue_id, 33240acdb986SNicolas Chautru &tp->fft_ops[ 3325b6a7e685STyler Retzlaff rte_atomic_load_explicit(&tp->nb_dequeued, 3326b6a7e685STyler Retzlaff rte_memory_order_relaxed)], 33270acdb986SNicolas Chautru burst_sz); 332895f192a4SHernan Vargas else if (test_vector.op_type == RTE_BBDEV_OP_MLDTS) 332995f192a4SHernan Vargas deq = rte_bbdev_dequeue_mldts_ops(dev_id, queue_id, 333095f192a4SHernan Vargas &tp->mldts_ops[ 3331b6a7e685STyler Retzlaff rte_atomic_load_explicit(&tp->nb_dequeued, 3332b6a7e685STyler Retzlaff rte_memory_order_relaxed)], 333395f192a4SHernan Vargas burst_sz); 3334335c11fdSNicolas Chautru else /*RTE_BBDEV_OP_TURBO_ENC*/ 3335b2e2aec3SKamil Chalupnik deq = rte_bbdev_dequeue_enc_ops(dev_id, queue_id, 3336b2e2aec3SKamil Chalupnik &tp->enc_ops[ 3337b6a7e685STyler Retzlaff rte_atomic_load_explicit(&tp->nb_dequeued, 3338b6a7e685STyler Retzlaff rte_memory_order_relaxed)], 3339f714a188SAmr Mokhtar burst_sz); 3340f714a188SAmr Mokhtar 3341f714a188SAmr Mokhtar if (deq < burst_sz) { 3342f714a188SAmr Mokhtar printf( 3343f714a188SAmr Mokhtar "After receiving the interrupt all operations should be dequeued. Expected: %u, got: %u\n", 3344f714a188SAmr Mokhtar burst_sz, deq); 3345b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->processing_status, TEST_FAILED, 3346b6a7e685STyler Retzlaff rte_memory_order_relaxed); 3347f714a188SAmr Mokhtar return; 3348f714a188SAmr Mokhtar } 3349f714a188SAmr Mokhtar 3350b6a7e685STyler Retzlaff if (rte_atomic_load_explicit(&tp->nb_dequeued, rte_memory_order_relaxed) + deq < num_ops) { 3351b6a7e685STyler Retzlaff rte_atomic_fetch_add_explicit(&tp->nb_dequeued, deq, rte_memory_order_relaxed); 3352f714a188SAmr Mokhtar return; 3353f714a188SAmr Mokhtar } 3354f714a188SAmr Mokhtar 3355f714a188SAmr Mokhtar total_time = rte_rdtsc_precise() - tp->start_time; 3356f714a188SAmr Mokhtar 3357f714a188SAmr Mokhtar rte_bbdev_info_get(dev_id, &info); 3358f714a188SAmr Mokhtar 3359f714a188SAmr Mokhtar ret = TEST_SUCCESS; 33600b98d574SKamil Chalupnik 33610b98d574SKamil Chalupnik if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) { 33620b98d574SKamil Chalupnik struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; 3363de2ce637SHernan Vargas ret = validate_dec_op(tp->dec_ops, num_ops, ref_op); 3364b2e2aec3SKamil Chalupnik /* get the max of iter_count for all dequeued ops */ 3365b2e2aec3SKamil Chalupnik for (i = 0; i < num_ops; ++i) 3366b2e2aec3SKamil Chalupnik tp->iter_count = RTE_MAX( 3367b2e2aec3SKamil Chalupnik tp->dec_ops[i]->turbo_dec.iter_count, 3368b2e2aec3SKamil Chalupnik tp->iter_count); 3369b2e2aec3SKamil Chalupnik rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq); 33700b98d574SKamil Chalupnik } else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) { 33710b98d574SKamil Chalupnik struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; 3372b2e2aec3SKamil Chalupnik ret = validate_enc_op(tp->enc_ops, num_ops, ref_op); 3373b2e2aec3SKamil Chalupnik rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq); 3374d819c083SNicolas Chautru } else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) { 3375d819c083SNicolas Chautru struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; 3376d819c083SNicolas Chautru ret = validate_ldpc_enc_op(tp->enc_ops, num_ops, ref_op); 3377d819c083SNicolas Chautru rte_bbdev_enc_op_free_bulk(tp->enc_ops, deq); 33780acdb986SNicolas Chautru } else if (test_vector.op_type == RTE_BBDEV_OP_FFT) { 33790acdb986SNicolas Chautru struct rte_bbdev_fft_op *ref_op = tp->op_params->ref_fft_op; 33800acdb986SNicolas Chautru ret = validate_fft_op(tp->fft_ops, num_ops, ref_op); 33810acdb986SNicolas Chautru rte_bbdev_fft_op_free_bulk(tp->fft_ops, deq); 338295f192a4SHernan Vargas } else if (test_vector.op_type == RTE_BBDEV_OP_MLDTS) { 338395f192a4SHernan Vargas struct rte_bbdev_mldts_op *ref_op = tp->op_params->ref_mldts_op; 338495f192a4SHernan Vargas ret = validate_mldts_op(tp->mldts_ops, num_ops, ref_op); 338595f192a4SHernan Vargas rte_bbdev_mldts_op_free_bulk(tp->mldts_ops, deq); 3386d819c083SNicolas Chautru } else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) { 3387d819c083SNicolas Chautru struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; 3388d819c083SNicolas Chautru ret = validate_ldpc_dec_op(tp->dec_ops, num_ops, ref_op, 3389d819c083SNicolas Chautru tp->op_params->vector_mask); 3390d819c083SNicolas Chautru rte_bbdev_dec_op_free_bulk(tp->dec_ops, deq); 33910b98d574SKamil Chalupnik } 3392f714a188SAmr Mokhtar 3393f714a188SAmr Mokhtar if (ret) { 3394f714a188SAmr Mokhtar printf("Buffers validation failed\n"); 3395b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->processing_status, TEST_FAILED, 3396b6a7e685STyler Retzlaff rte_memory_order_relaxed); 3397f714a188SAmr Mokhtar } 3398f714a188SAmr Mokhtar 3399f714a188SAmr Mokhtar switch (test_vector.op_type) { 3400f714a188SAmr Mokhtar case RTE_BBDEV_OP_TURBO_DEC: 34010b98d574SKamil Chalupnik tb_len_bits = calc_dec_TB_size(tp->op_params->ref_dec_op); 3402f714a188SAmr Mokhtar break; 3403f714a188SAmr Mokhtar case RTE_BBDEV_OP_TURBO_ENC: 34040b98d574SKamil Chalupnik tb_len_bits = calc_enc_TB_size(tp->op_params->ref_enc_op); 3405f714a188SAmr Mokhtar break; 3406d819c083SNicolas Chautru case RTE_BBDEV_OP_LDPC_DEC: 3407d819c083SNicolas Chautru tb_len_bits = calc_ldpc_dec_TB_size(tp->op_params->ref_dec_op); 3408d819c083SNicolas Chautru break; 34090acdb986SNicolas Chautru case RTE_BBDEV_OP_FFT: 34100acdb986SNicolas Chautru tb_len_bits = calc_fft_size(tp->op_params->ref_fft_op); 34110acdb986SNicolas Chautru break; 341295f192a4SHernan Vargas case RTE_BBDEV_OP_MLDTS: 341395f192a4SHernan Vargas tb_len_bits = calc_mldts_size(tp->op_params->ref_mldts_op); 341495f192a4SHernan Vargas break; 3415d819c083SNicolas Chautru case RTE_BBDEV_OP_LDPC_ENC: 3416d819c083SNicolas Chautru tb_len_bits = calc_ldpc_enc_TB_size(tp->op_params->ref_enc_op); 3417d819c083SNicolas Chautru break; 3418f714a188SAmr Mokhtar case RTE_BBDEV_OP_NONE: 34190b98d574SKamil Chalupnik tb_len_bits = 0.0; 3420f714a188SAmr Mokhtar break; 3421f714a188SAmr Mokhtar default: 3422f714a188SAmr Mokhtar printf("Unknown op type: %d\n", test_vector.op_type); 3423b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->processing_status, TEST_FAILED, 3424b6a7e685STyler Retzlaff rte_memory_order_relaxed); 3425f714a188SAmr Mokhtar return; 3426f714a188SAmr Mokhtar } 3427f714a188SAmr Mokhtar 3428b2e2aec3SKamil Chalupnik tp->ops_per_sec += ((double)num_ops) / 3429f714a188SAmr Mokhtar ((double)total_time / (double)rte_get_tsc_hz()); 3430b2e2aec3SKamil Chalupnik tp->mbps += (((double)(num_ops * tb_len_bits)) / 1000000.0) / 3431f714a188SAmr Mokhtar ((double)total_time / (double)rte_get_tsc_hz()); 3432f714a188SAmr Mokhtar 3433b6a7e685STyler Retzlaff rte_atomic_fetch_add_explicit(&tp->nb_dequeued, deq, rte_memory_order_relaxed); 3434f714a188SAmr Mokhtar } 3435f714a188SAmr Mokhtar 3436f714a188SAmr Mokhtar static int 3437f162c475SNicolas Chautru throughput_intr_lcore_ldpc_dec(void *arg) 3438f162c475SNicolas Chautru { 3439f162c475SNicolas Chautru struct thread_params *tp = arg; 3440f162c475SNicolas Chautru unsigned int enqueued; 3441f162c475SNicolas Chautru const uint16_t queue_id = tp->queue_id; 3442f162c475SNicolas Chautru const uint16_t burst_sz = tp->op_params->burst_sz; 3443f162c475SNicolas Chautru const uint16_t num_to_process = tp->op_params->num_to_process; 3444f162c475SNicolas Chautru struct rte_bbdev_dec_op *ops[num_to_process]; 3445f162c475SNicolas Chautru struct test_buffers *bufs = NULL; 3446f162c475SNicolas Chautru struct rte_bbdev_info info; 3447f162c475SNicolas Chautru int ret, i, j; 3448f162c475SNicolas Chautru struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; 3449f162c475SNicolas Chautru uint16_t num_to_enq, enq; 3450f162c475SNicolas Chautru 3451f162c475SNicolas Chautru bool loopback = check_bit(ref_op->ldpc_dec.op_flags, 3452f162c475SNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); 3453f162c475SNicolas Chautru bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, 3454f162c475SNicolas Chautru RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); 3455f162c475SNicolas Chautru 3456f162c475SNicolas Chautru TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 3457f162c475SNicolas Chautru "BURST_SIZE should be <= %u", MAX_BURST); 3458f162c475SNicolas Chautru 3459f162c475SNicolas Chautru TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), 3460f162c475SNicolas Chautru "Failed to enable interrupts for dev: %u, queue_id: %u", 3461f162c475SNicolas Chautru tp->dev_id, queue_id); 3462f162c475SNicolas Chautru 3463f162c475SNicolas Chautru rte_bbdev_info_get(tp->dev_id, &info); 3464f162c475SNicolas Chautru 3465f162c475SNicolas Chautru TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), 3466f162c475SNicolas Chautru "NUM_OPS cannot exceed %u for this device", 3467f162c475SNicolas Chautru info.drv.queue_size_lim); 3468f162c475SNicolas Chautru 3469f162c475SNicolas Chautru bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 3470f162c475SNicolas Chautru 3471b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->processing_status, 0, rte_memory_order_relaxed); 3472b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed); 3473f162c475SNicolas Chautru 3474b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START, 3475b6a7e685STyler Retzlaff rte_memory_order_relaxed); 3476f162c475SNicolas Chautru 3477f162c475SNicolas Chautru ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops, 3478f162c475SNicolas Chautru num_to_process); 3479f162c475SNicolas Chautru TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", 3480f162c475SNicolas Chautru num_to_process); 348131fab7b4SHernan Vargas ref_op->ldpc_dec.iter_max = get_iter_max(); 348231fab7b4SHernan Vargas 3483f162c475SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) 3484f162c475SNicolas Chautru copy_reference_ldpc_dec_op(ops, num_to_process, 0, bufs->inputs, 3485f162c475SNicolas Chautru bufs->hard_outputs, bufs->soft_outputs, 3486f162c475SNicolas Chautru bufs->harq_inputs, bufs->harq_outputs, ref_op); 3487f162c475SNicolas Chautru 3488f162c475SNicolas Chautru /* Set counter to validate the ordering */ 3489f162c475SNicolas Chautru for (j = 0; j < num_to_process; ++j) 3490f162c475SNicolas Chautru ops[j]->opaque_data = (void *)(uintptr_t)j; 3491f162c475SNicolas Chautru 3492f162c475SNicolas Chautru for (j = 0; j < TEST_REPETITIONS; ++j) { 3493f162c475SNicolas Chautru for (i = 0; i < num_to_process; ++i) { 3494f162c475SNicolas Chautru if (!loopback) 34953d3047e7SHernan Vargas mbuf_reset(ops[i]->ldpc_dec.hard_output.data); 3496f162c475SNicolas Chautru if (hc_out || loopback) 34979d9d73ebSHernan Vargas mbuf_reset(ops[i]->ldpc_dec.harq_combined_output.data); 34989d9d73ebSHernan Vargas if (ops[i]->ldpc_dec.soft_output.data != NULL) 34993d3047e7SHernan Vargas mbuf_reset(ops[i]->ldpc_dec.soft_output.data); 3500f162c475SNicolas Chautru } 3501f162c475SNicolas Chautru 3502f162c475SNicolas Chautru tp->start_time = rte_rdtsc_precise(); 3503f162c475SNicolas Chautru for (enqueued = 0; enqueued < num_to_process;) { 3504f162c475SNicolas Chautru num_to_enq = burst_sz; 3505f162c475SNicolas Chautru 3506f162c475SNicolas Chautru if (unlikely(num_to_process - enqueued < num_to_enq)) 3507f162c475SNicolas Chautru num_to_enq = num_to_process - enqueued; 3508f162c475SNicolas Chautru 3509f162c475SNicolas Chautru /* Write to thread burst_sz current number of enqueued 3510f162c475SNicolas Chautru * descriptors. It ensures that proper number of 3511f162c475SNicolas Chautru * descriptors will be dequeued in callback 3512f162c475SNicolas Chautru * function - needed for last batch in case where 3513f162c475SNicolas Chautru * the number of operations is not a multiple of 3514f162c475SNicolas Chautru * burst size. 3515f162c475SNicolas Chautru */ 3516b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->burst_sz, num_to_enq, 3517b6a7e685STyler Retzlaff rte_memory_order_relaxed); 3518f162c475SNicolas Chautru 3519fdcee665SHernan Vargas enq = 0; 3520fdcee665SHernan Vargas do { 3521fdcee665SHernan Vargas enq += rte_bbdev_enqueue_ldpc_dec_ops( 3522fdcee665SHernan Vargas tp->dev_id, 3523fdcee665SHernan Vargas queue_id, &ops[enqueued], 3524fdcee665SHernan Vargas num_to_enq); 3525fdcee665SHernan Vargas } while (unlikely(num_to_enq != enq)); 3526fdcee665SHernan Vargas enqueued += enq; 3527fdcee665SHernan Vargas 3528f162c475SNicolas Chautru /* Wait until processing of previous batch is 3529f162c475SNicolas Chautru * completed 3530f162c475SNicolas Chautru */ 3531b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->nb_dequeued, enqueued, 3532b6a7e685STyler Retzlaff rte_memory_order_relaxed); 3533f162c475SNicolas Chautru } 3534f162c475SNicolas Chautru if (j != TEST_REPETITIONS - 1) 3535b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed); 3536f162c475SNicolas Chautru } 3537f162c475SNicolas Chautru 3538*92351557SNicolas Chautru TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_disable(tp->dev_id, queue_id), 3539*92351557SNicolas Chautru "Failed to disable interrupts for dev: %u, queue_id: %u", 3540*92351557SNicolas Chautru tp->dev_id, queue_id); 3541*92351557SNicolas Chautru 3542f162c475SNicolas Chautru return TEST_SUCCESS; 3543f162c475SNicolas Chautru } 3544f162c475SNicolas Chautru 3545f162c475SNicolas Chautru static int 3546f714a188SAmr Mokhtar throughput_intr_lcore_dec(void *arg) 3547f714a188SAmr Mokhtar { 3548f714a188SAmr Mokhtar struct thread_params *tp = arg; 3549f714a188SAmr Mokhtar unsigned int enqueued; 3550f714a188SAmr Mokhtar const uint16_t queue_id = tp->queue_id; 3551f714a188SAmr Mokhtar const uint16_t burst_sz = tp->op_params->burst_sz; 3552f714a188SAmr Mokhtar const uint16_t num_to_process = tp->op_params->num_to_process; 35530b98d574SKamil Chalupnik struct rte_bbdev_dec_op *ops[num_to_process]; 3554f714a188SAmr Mokhtar struct test_buffers *bufs = NULL; 3555f714a188SAmr Mokhtar struct rte_bbdev_info info; 35560acdb986SNicolas Chautru struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; 3557b2e2aec3SKamil Chalupnik int ret, i, j; 3558b2e2aec3SKamil Chalupnik uint16_t num_to_enq, enq; 3559f714a188SAmr Mokhtar 3560f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 3561f714a188SAmr Mokhtar "BURST_SIZE should be <= %u", MAX_BURST); 3562f714a188SAmr Mokhtar 3563f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), 3564f714a188SAmr Mokhtar "Failed to enable interrupts for dev: %u, queue_id: %u", 3565f714a188SAmr Mokhtar tp->dev_id, queue_id); 3566f714a188SAmr Mokhtar 3567f714a188SAmr Mokhtar rte_bbdev_info_get(tp->dev_id, &info); 35680b98d574SKamil Chalupnik 35690b98d574SKamil Chalupnik TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), 35700b98d574SKamil Chalupnik "NUM_OPS cannot exceed %u for this device", 35710b98d574SKamil Chalupnik info.drv.queue_size_lim); 35720b98d574SKamil Chalupnik 3573f714a188SAmr Mokhtar bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 3574f714a188SAmr Mokhtar 3575b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->processing_status, 0, rte_memory_order_relaxed); 3576b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed); 3577f714a188SAmr Mokhtar 3578b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START, 3579b6a7e685STyler Retzlaff rte_memory_order_relaxed); 3580f714a188SAmr Mokhtar 35810b98d574SKamil Chalupnik ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops, 35820b98d574SKamil Chalupnik num_to_process); 35830acdb986SNicolas Chautru TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_to_process); 35840acdb986SNicolas Chautru ref_op->turbo_dec.iter_max = get_iter_max(); 35850b98d574SKamil Chalupnik if (test_vector.op_type != RTE_BBDEV_OP_NONE) 35860b98d574SKamil Chalupnik copy_reference_dec_op(ops, num_to_process, 0, bufs->inputs, 35870b98d574SKamil Chalupnik bufs->hard_outputs, bufs->soft_outputs, 35880b98d574SKamil Chalupnik tp->op_params->ref_dec_op); 35890b98d574SKamil Chalupnik 35900acdb986SNicolas Chautru /* Set counter to validate the ordering. */ 3591b2e2aec3SKamil Chalupnik for (j = 0; j < num_to_process; ++j) 3592b2e2aec3SKamil Chalupnik ops[j]->opaque_data = (void *)(uintptr_t)j; 3593b2e2aec3SKamil Chalupnik 3594b2e2aec3SKamil Chalupnik for (j = 0; j < TEST_REPETITIONS; ++j) { 35950acdb986SNicolas Chautru for (i = 0; i < num_to_process; ++i) { 35963d3047e7SHernan Vargas mbuf_reset(ops[i]->turbo_dec.hard_output.data); 35970acdb986SNicolas Chautru if (ops[i]->turbo_dec.soft_output.data != NULL) 35983d3047e7SHernan Vargas mbuf_reset(ops[i]->turbo_dec.soft_output.data); 35990acdb986SNicolas Chautru } 36000acdb986SNicolas Chautru 3601f714a188SAmr Mokhtar tp->start_time = rte_rdtsc_precise(); 3602f714a188SAmr Mokhtar for (enqueued = 0; enqueued < num_to_process;) { 36030b98d574SKamil Chalupnik num_to_enq = burst_sz; 3604f714a188SAmr Mokhtar 3605f714a188SAmr Mokhtar if (unlikely(num_to_process - enqueued < num_to_enq)) 3606f714a188SAmr Mokhtar num_to_enq = num_to_process - enqueued; 3607f714a188SAmr Mokhtar 3608b2e2aec3SKamil Chalupnik /* Write to thread burst_sz current number of enqueued 3609b2e2aec3SKamil Chalupnik * descriptors. It ensures that proper number of 3610b2e2aec3SKamil Chalupnik * descriptors will be dequeued in callback 3611b2e2aec3SKamil Chalupnik * function - needed for last batch in case where 3612b2e2aec3SKamil Chalupnik * the number of operations is not a multiple of 3613b2e2aec3SKamil Chalupnik * burst size. 3614b2e2aec3SKamil Chalupnik */ 3615b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->burst_sz, num_to_enq, 3616b6a7e685STyler Retzlaff rte_memory_order_relaxed); 3617b2e2aec3SKamil Chalupnik 3618fdcee665SHernan Vargas enq = 0; 3619fdcee665SHernan Vargas do { 3620fdcee665SHernan Vargas enq += rte_bbdev_enqueue_dec_ops(tp->dev_id, 3621fdcee665SHernan Vargas queue_id, &ops[enqueued], 3622fdcee665SHernan Vargas num_to_enq); 3623fdcee665SHernan Vargas } while (unlikely(num_to_enq != enq)); 3624fdcee665SHernan Vargas enqueued += enq; 3625fdcee665SHernan Vargas 3626b2e2aec3SKamil Chalupnik /* Wait until processing of previous batch is 3627d819c083SNicolas Chautru * completed 3628b2e2aec3SKamil Chalupnik */ 3629b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->nb_dequeued, enqueued, 3630b6a7e685STyler Retzlaff rte_memory_order_relaxed); 3631b2e2aec3SKamil Chalupnik } 3632b2e2aec3SKamil Chalupnik if (j != TEST_REPETITIONS - 1) 3633b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed); 3634f714a188SAmr Mokhtar } 3635f714a188SAmr Mokhtar 3636*92351557SNicolas Chautru TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_disable(tp->dev_id, queue_id), 3637*92351557SNicolas Chautru "Failed to disable interrupts for dev: %u, queue_id: %u", 3638*92351557SNicolas Chautru tp->dev_id, queue_id); 3639*92351557SNicolas Chautru 3640f714a188SAmr Mokhtar return TEST_SUCCESS; 3641f714a188SAmr Mokhtar } 3642f714a188SAmr Mokhtar 3643f714a188SAmr Mokhtar static int 3644f714a188SAmr Mokhtar throughput_intr_lcore_enc(void *arg) 3645f714a188SAmr Mokhtar { 3646f714a188SAmr Mokhtar struct thread_params *tp = arg; 3647f714a188SAmr Mokhtar unsigned int enqueued; 3648f714a188SAmr Mokhtar const uint16_t queue_id = tp->queue_id; 3649f714a188SAmr Mokhtar const uint16_t burst_sz = tp->op_params->burst_sz; 3650f714a188SAmr Mokhtar const uint16_t num_to_process = tp->op_params->num_to_process; 36510b98d574SKamil Chalupnik struct rte_bbdev_enc_op *ops[num_to_process]; 3652f714a188SAmr Mokhtar struct test_buffers *bufs = NULL; 3653f714a188SAmr Mokhtar struct rte_bbdev_info info; 3654b2e2aec3SKamil Chalupnik int ret, i, j; 3655b2e2aec3SKamil Chalupnik uint16_t num_to_enq, enq; 3656f714a188SAmr Mokhtar 3657f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 3658f714a188SAmr Mokhtar "BURST_SIZE should be <= %u", MAX_BURST); 3659f714a188SAmr Mokhtar 3660f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), 3661f714a188SAmr Mokhtar "Failed to enable interrupts for dev: %u, queue_id: %u", 3662f714a188SAmr Mokhtar tp->dev_id, queue_id); 3663f714a188SAmr Mokhtar 3664f714a188SAmr Mokhtar rte_bbdev_info_get(tp->dev_id, &info); 36650b98d574SKamil Chalupnik 36660b98d574SKamil Chalupnik TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), 36670b98d574SKamil Chalupnik "NUM_OPS cannot exceed %u for this device", 36680b98d574SKamil Chalupnik info.drv.queue_size_lim); 36690b98d574SKamil Chalupnik 3670f714a188SAmr Mokhtar bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 3671f714a188SAmr Mokhtar 3672b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->processing_status, 0, rte_memory_order_relaxed); 3673b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed); 3674f714a188SAmr Mokhtar 3675b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START, 3676b6a7e685STyler Retzlaff rte_memory_order_relaxed); 3677f714a188SAmr Mokhtar 36780b98d574SKamil Chalupnik ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops, 36790b98d574SKamil Chalupnik num_to_process); 36800b98d574SKamil Chalupnik TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", 36810b98d574SKamil Chalupnik num_to_process); 36820b98d574SKamil Chalupnik if (test_vector.op_type != RTE_BBDEV_OP_NONE) 36830b98d574SKamil Chalupnik copy_reference_enc_op(ops, num_to_process, 0, bufs->inputs, 36840b98d574SKamil Chalupnik bufs->hard_outputs, tp->op_params->ref_enc_op); 36850b98d574SKamil Chalupnik 3686b2e2aec3SKamil Chalupnik /* Set counter to validate the ordering */ 3687b2e2aec3SKamil Chalupnik for (j = 0; j < num_to_process; ++j) 3688b2e2aec3SKamil Chalupnik ops[j]->opaque_data = (void *)(uintptr_t)j; 3689b2e2aec3SKamil Chalupnik 3690b2e2aec3SKamil Chalupnik for (j = 0; j < TEST_REPETITIONS; ++j) { 3691b2e2aec3SKamil Chalupnik for (i = 0; i < num_to_process; ++i) 36923d3047e7SHernan Vargas mbuf_reset(ops[i]->turbo_enc.output.data); 3693b2e2aec3SKamil Chalupnik 3694f714a188SAmr Mokhtar tp->start_time = rte_rdtsc_precise(); 3695f714a188SAmr Mokhtar for (enqueued = 0; enqueued < num_to_process;) { 36960b98d574SKamil Chalupnik num_to_enq = burst_sz; 3697f714a188SAmr Mokhtar 3698f714a188SAmr Mokhtar if (unlikely(num_to_process - enqueued < num_to_enq)) 3699f714a188SAmr Mokhtar num_to_enq = num_to_process - enqueued; 3700f714a188SAmr Mokhtar 3701b2e2aec3SKamil Chalupnik /* Write to thread burst_sz current number of enqueued 3702b2e2aec3SKamil Chalupnik * descriptors. It ensures that proper number of 3703b2e2aec3SKamil Chalupnik * descriptors will be dequeued in callback 3704b2e2aec3SKamil Chalupnik * function - needed for last batch in case where 3705b2e2aec3SKamil Chalupnik * the number of operations is not a multiple of 3706b2e2aec3SKamil Chalupnik * burst size. 3707b2e2aec3SKamil Chalupnik */ 3708b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->burst_sz, num_to_enq, 3709b6a7e685STyler Retzlaff rte_memory_order_relaxed); 3710b2e2aec3SKamil Chalupnik 3711fdcee665SHernan Vargas enq = 0; 3712fdcee665SHernan Vargas do { 3713fdcee665SHernan Vargas enq += rte_bbdev_enqueue_enc_ops(tp->dev_id, 3714fdcee665SHernan Vargas queue_id, &ops[enqueued], 3715fdcee665SHernan Vargas num_to_enq); 3716fdcee665SHernan Vargas } while (unlikely(enq != num_to_enq)); 3717fdcee665SHernan Vargas enqueued += enq; 3718fdcee665SHernan Vargas 3719b2e2aec3SKamil Chalupnik /* Wait until processing of previous batch is 3720d819c083SNicolas Chautru * completed 3721b2e2aec3SKamil Chalupnik */ 3722b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->nb_dequeued, enqueued, 3723b6a7e685STyler Retzlaff rte_memory_order_relaxed); 3724b2e2aec3SKamil Chalupnik } 3725b2e2aec3SKamil Chalupnik if (j != TEST_REPETITIONS - 1) 3726b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed); 3727f714a188SAmr Mokhtar } 3728f714a188SAmr Mokhtar 3729*92351557SNicolas Chautru TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_disable(tp->dev_id, queue_id), 3730*92351557SNicolas Chautru "Failed to disable interrupts for dev: %u, queue_id: %u", 3731*92351557SNicolas Chautru tp->dev_id, queue_id); 3732*92351557SNicolas Chautru 3733f714a188SAmr Mokhtar return TEST_SUCCESS; 3734f714a188SAmr Mokhtar } 3735f714a188SAmr Mokhtar 3736f162c475SNicolas Chautru 3737f162c475SNicolas Chautru static int 3738f162c475SNicolas Chautru throughput_intr_lcore_ldpc_enc(void *arg) 3739f162c475SNicolas Chautru { 3740f162c475SNicolas Chautru struct thread_params *tp = arg; 3741f162c475SNicolas Chautru unsigned int enqueued; 3742f162c475SNicolas Chautru const uint16_t queue_id = tp->queue_id; 3743f162c475SNicolas Chautru const uint16_t burst_sz = tp->op_params->burst_sz; 3744f162c475SNicolas Chautru const uint16_t num_to_process = tp->op_params->num_to_process; 3745f162c475SNicolas Chautru struct rte_bbdev_enc_op *ops[num_to_process]; 3746f162c475SNicolas Chautru struct test_buffers *bufs = NULL; 3747f162c475SNicolas Chautru struct rte_bbdev_info info; 3748f162c475SNicolas Chautru int ret, i, j; 3749f162c475SNicolas Chautru uint16_t num_to_enq, enq; 3750f162c475SNicolas Chautru 3751f162c475SNicolas Chautru TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 3752f162c475SNicolas Chautru "BURST_SIZE should be <= %u", MAX_BURST); 3753f162c475SNicolas Chautru 3754f162c475SNicolas Chautru TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), 3755f162c475SNicolas Chautru "Failed to enable interrupts for dev: %u, queue_id: %u", 3756f162c475SNicolas Chautru tp->dev_id, queue_id); 3757f162c475SNicolas Chautru 3758f162c475SNicolas Chautru rte_bbdev_info_get(tp->dev_id, &info); 3759f162c475SNicolas Chautru 3760f162c475SNicolas Chautru TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), 3761f162c475SNicolas Chautru "NUM_OPS cannot exceed %u for this device", 3762f162c475SNicolas Chautru info.drv.queue_size_lim); 3763f162c475SNicolas Chautru 3764f162c475SNicolas Chautru bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 3765f162c475SNicolas Chautru 3766b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->processing_status, 0, rte_memory_order_relaxed); 3767b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed); 3768f162c475SNicolas Chautru 3769b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START, 3770b6a7e685STyler Retzlaff rte_memory_order_relaxed); 3771f162c475SNicolas Chautru 3772f162c475SNicolas Chautru ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops, 3773f162c475SNicolas Chautru num_to_process); 3774f162c475SNicolas Chautru TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", 3775f162c475SNicolas Chautru num_to_process); 3776f162c475SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) 3777f162c475SNicolas Chautru copy_reference_ldpc_enc_op(ops, num_to_process, 0, 3778f162c475SNicolas Chautru bufs->inputs, bufs->hard_outputs, 3779f162c475SNicolas Chautru tp->op_params->ref_enc_op); 3780f162c475SNicolas Chautru 3781f162c475SNicolas Chautru /* Set counter to validate the ordering */ 3782f162c475SNicolas Chautru for (j = 0; j < num_to_process; ++j) 3783f162c475SNicolas Chautru ops[j]->opaque_data = (void *)(uintptr_t)j; 3784f162c475SNicolas Chautru 3785f162c475SNicolas Chautru for (j = 0; j < TEST_REPETITIONS; ++j) { 3786f162c475SNicolas Chautru for (i = 0; i < num_to_process; ++i) 37873d3047e7SHernan Vargas mbuf_reset(ops[i]->turbo_enc.output.data); 3788f162c475SNicolas Chautru 3789f162c475SNicolas Chautru tp->start_time = rte_rdtsc_precise(); 3790f162c475SNicolas Chautru for (enqueued = 0; enqueued < num_to_process;) { 3791f162c475SNicolas Chautru num_to_enq = burst_sz; 3792f162c475SNicolas Chautru 3793f162c475SNicolas Chautru if (unlikely(num_to_process - enqueued < num_to_enq)) 3794f162c475SNicolas Chautru num_to_enq = num_to_process - enqueued; 3795f162c475SNicolas Chautru 3796f162c475SNicolas Chautru /* Write to thread burst_sz current number of enqueued 3797f162c475SNicolas Chautru * descriptors. It ensures that proper number of 3798f162c475SNicolas Chautru * descriptors will be dequeued in callback 3799f162c475SNicolas Chautru * function - needed for last batch in case where 3800f162c475SNicolas Chautru * the number of operations is not a multiple of 3801f162c475SNicolas Chautru * burst size. 3802f162c475SNicolas Chautru */ 3803b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->burst_sz, num_to_enq, 3804b6a7e685STyler Retzlaff rte_memory_order_relaxed); 3805f162c475SNicolas Chautru 3806fdcee665SHernan Vargas enq = 0; 3807fdcee665SHernan Vargas do { 3808fdcee665SHernan Vargas enq += rte_bbdev_enqueue_ldpc_enc_ops( 3809fdcee665SHernan Vargas tp->dev_id, 3810fdcee665SHernan Vargas queue_id, &ops[enqueued], 3811fdcee665SHernan Vargas num_to_enq); 3812fdcee665SHernan Vargas } while (unlikely(enq != num_to_enq)); 3813fdcee665SHernan Vargas enqueued += enq; 3814fdcee665SHernan Vargas 3815f162c475SNicolas Chautru /* Wait until processing of previous batch is 3816f162c475SNicolas Chautru * completed 3817f162c475SNicolas Chautru */ 3818b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->nb_dequeued, enqueued, 3819b6a7e685STyler Retzlaff rte_memory_order_relaxed); 3820f162c475SNicolas Chautru } 3821f162c475SNicolas Chautru if (j != TEST_REPETITIONS - 1) 3822b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed); 3823f162c475SNicolas Chautru } 3824f162c475SNicolas Chautru 3825*92351557SNicolas Chautru TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_disable(tp->dev_id, queue_id), 3826*92351557SNicolas Chautru "Failed to disable interrupts for dev: %u, queue_id: %u", 3827*92351557SNicolas Chautru tp->dev_id, queue_id); 3828*92351557SNicolas Chautru 3829f162c475SNicolas Chautru return TEST_SUCCESS; 3830f162c475SNicolas Chautru } 3831f162c475SNicolas Chautru 38320acdb986SNicolas Chautru 38330acdb986SNicolas Chautru static int 38340acdb986SNicolas Chautru throughput_intr_lcore_fft(void *arg) 38350acdb986SNicolas Chautru { 38360acdb986SNicolas Chautru struct thread_params *tp = arg; 38370acdb986SNicolas Chautru unsigned int enqueued; 38380acdb986SNicolas Chautru const uint16_t queue_id = tp->queue_id; 38390acdb986SNicolas Chautru const uint16_t burst_sz = tp->op_params->burst_sz; 38400acdb986SNicolas Chautru const uint16_t num_to_process = tp->op_params->num_to_process; 38410acdb986SNicolas Chautru struct rte_bbdev_fft_op *ops[num_to_process]; 38420acdb986SNicolas Chautru struct test_buffers *bufs = NULL; 38430acdb986SNicolas Chautru struct rte_bbdev_info info; 38440acdb986SNicolas Chautru int ret, i, j; 38450acdb986SNicolas Chautru uint16_t num_to_enq, enq; 38460acdb986SNicolas Chautru 38470acdb986SNicolas Chautru TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 38480acdb986SNicolas Chautru "BURST_SIZE should be <= %u", MAX_BURST); 38490acdb986SNicolas Chautru 38500acdb986SNicolas Chautru TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), 38510acdb986SNicolas Chautru "Failed to enable interrupts for dev: %u, queue_id: %u", 38520acdb986SNicolas Chautru tp->dev_id, queue_id); 38530acdb986SNicolas Chautru 38540acdb986SNicolas Chautru rte_bbdev_info_get(tp->dev_id, &info); 38550acdb986SNicolas Chautru 38560acdb986SNicolas Chautru TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), 38570acdb986SNicolas Chautru "NUM_OPS cannot exceed %u for this device", 38580acdb986SNicolas Chautru info.drv.queue_size_lim); 38590acdb986SNicolas Chautru 38600acdb986SNicolas Chautru bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 38610acdb986SNicolas Chautru 3862b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->processing_status, 0, rte_memory_order_relaxed); 3863b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed); 38640acdb986SNicolas Chautru 3865b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START, 3866b6a7e685STyler Retzlaff rte_memory_order_relaxed); 38670acdb986SNicolas Chautru 38680acdb986SNicolas Chautru ret = rte_bbdev_fft_op_alloc_bulk(tp->op_params->mp, ops, 38690acdb986SNicolas Chautru num_to_process); 38700acdb986SNicolas Chautru TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", 38710acdb986SNicolas Chautru num_to_process); 38720acdb986SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) 38730acdb986SNicolas Chautru copy_reference_fft_op(ops, num_to_process, 0, bufs->inputs, 38740ed76d66SHernan Vargas bufs->hard_outputs, bufs->soft_outputs, bufs->harq_inputs, 38750ed76d66SHernan Vargas tp->op_params->ref_fft_op); 38760acdb986SNicolas Chautru 38770acdb986SNicolas Chautru /* Set counter to validate the ordering */ 38780acdb986SNicolas Chautru for (j = 0; j < num_to_process; ++j) 38790acdb986SNicolas Chautru ops[j]->opaque_data = (void *)(uintptr_t)j; 38800acdb986SNicolas Chautru 38810acdb986SNicolas Chautru for (j = 0; j < TEST_REPETITIONS; ++j) { 38820acdb986SNicolas Chautru for (i = 0; i < num_to_process; ++i) 38833d3047e7SHernan Vargas mbuf_reset(ops[i]->fft.base_output.data); 38840acdb986SNicolas Chautru 38850acdb986SNicolas Chautru tp->start_time = rte_rdtsc_precise(); 38860acdb986SNicolas Chautru for (enqueued = 0; enqueued < num_to_process;) { 38870acdb986SNicolas Chautru num_to_enq = burst_sz; 38880acdb986SNicolas Chautru 38890acdb986SNicolas Chautru if (unlikely(num_to_process - enqueued < num_to_enq)) 38900acdb986SNicolas Chautru num_to_enq = num_to_process - enqueued; 38910acdb986SNicolas Chautru 38920acdb986SNicolas Chautru /* Write to thread burst_sz current number of enqueued 38930acdb986SNicolas Chautru * descriptors. It ensures that proper number of 38940acdb986SNicolas Chautru * descriptors will be dequeued in callback 38950acdb986SNicolas Chautru * function - needed for last batch in case where 38960acdb986SNicolas Chautru * the number of operations is not a multiple of 38970acdb986SNicolas Chautru * burst size. 38980acdb986SNicolas Chautru */ 3899b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->burst_sz, num_to_enq, 3900b6a7e685STyler Retzlaff rte_memory_order_relaxed); 39010acdb986SNicolas Chautru 3902fdcee665SHernan Vargas enq = 0; 3903fdcee665SHernan Vargas do { 3904fdcee665SHernan Vargas enq += rte_bbdev_enqueue_fft_ops(tp->dev_id, 3905fdcee665SHernan Vargas queue_id, &ops[enqueued], 3906fdcee665SHernan Vargas num_to_enq); 3907fdcee665SHernan Vargas } while (unlikely(enq != num_to_enq)); 3908fdcee665SHernan Vargas enqueued += enq; 3909fdcee665SHernan Vargas 39100acdb986SNicolas Chautru /* Wait until processing of previous batch is 39110acdb986SNicolas Chautru * completed 39120acdb986SNicolas Chautru */ 3913b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->nb_dequeued, enqueued, 3914b6a7e685STyler Retzlaff rte_memory_order_relaxed); 39150acdb986SNicolas Chautru } 39160acdb986SNicolas Chautru if (j != TEST_REPETITIONS - 1) 3917b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed); 39180acdb986SNicolas Chautru } 39190acdb986SNicolas Chautru 3920*92351557SNicolas Chautru TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_disable(tp->dev_id, queue_id), 3921*92351557SNicolas Chautru "Failed to disable interrupts for dev: %u, queue_id: %u", 3922*92351557SNicolas Chautru tp->dev_id, queue_id); 3923*92351557SNicolas Chautru 39240acdb986SNicolas Chautru return TEST_SUCCESS; 39250acdb986SNicolas Chautru } 39260acdb986SNicolas Chautru 3927f714a188SAmr Mokhtar static int 392895f192a4SHernan Vargas throughput_intr_lcore_mldts(void *arg) 392995f192a4SHernan Vargas { 393095f192a4SHernan Vargas struct thread_params *tp = arg; 393195f192a4SHernan Vargas unsigned int enqueued; 393295f192a4SHernan Vargas const uint16_t queue_id = tp->queue_id; 393395f192a4SHernan Vargas const uint16_t burst_sz = tp->op_params->burst_sz; 393495f192a4SHernan Vargas const uint16_t num_to_process = tp->op_params->num_to_process; 393595f192a4SHernan Vargas struct rte_bbdev_mldts_op *ops[num_to_process]; 393695f192a4SHernan Vargas struct test_buffers *bufs = NULL; 393795f192a4SHernan Vargas struct rte_bbdev_info info; 393895f192a4SHernan Vargas int ret, i, j; 393995f192a4SHernan Vargas uint16_t num_to_enq, enq; 394095f192a4SHernan Vargas 394195f192a4SHernan Vargas TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), "BURST_SIZE should be <= %u", MAX_BURST); 394295f192a4SHernan Vargas 394395f192a4SHernan Vargas TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_enable(tp->dev_id, queue_id), 394495f192a4SHernan Vargas "Failed to enable interrupts for dev: %u, queue_id: %u", 394595f192a4SHernan Vargas tp->dev_id, queue_id); 394695f192a4SHernan Vargas 394795f192a4SHernan Vargas rte_bbdev_info_get(tp->dev_id, &info); 394895f192a4SHernan Vargas 394995f192a4SHernan Vargas TEST_ASSERT_SUCCESS((num_to_process > info.drv.queue_size_lim), 395095f192a4SHernan Vargas "NUM_OPS cannot exceed %u for this device", 395195f192a4SHernan Vargas info.drv.queue_size_lim); 395295f192a4SHernan Vargas 395395f192a4SHernan Vargas bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 395495f192a4SHernan Vargas 3955b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->processing_status, 0, rte_memory_order_relaxed); 3956b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed); 395795f192a4SHernan Vargas 3958b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START, 3959b6a7e685STyler Retzlaff rte_memory_order_relaxed); 396095f192a4SHernan Vargas 396195f192a4SHernan Vargas ret = rte_bbdev_mldts_op_alloc_bulk(tp->op_params->mp, ops, num_to_process); 396295f192a4SHernan Vargas TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_to_process); 396395f192a4SHernan Vargas if (test_vector.op_type != RTE_BBDEV_OP_NONE) 396495f192a4SHernan Vargas copy_reference_mldts_op(ops, num_to_process, 0, bufs->inputs, bufs->harq_inputs, 396595f192a4SHernan Vargas bufs->hard_outputs, tp->op_params->ref_mldts_op); 396695f192a4SHernan Vargas 396795f192a4SHernan Vargas /* Set counter to validate the ordering */ 396895f192a4SHernan Vargas for (j = 0; j < num_to_process; ++j) 396995f192a4SHernan Vargas ops[j]->opaque_data = (void *)(uintptr_t)j; 397095f192a4SHernan Vargas 397195f192a4SHernan Vargas for (j = 0; j < TEST_REPETITIONS; ++j) { 397295f192a4SHernan Vargas for (i = 0; i < num_to_process; ++i) 397395f192a4SHernan Vargas mbuf_reset(ops[i]->mldts.output.data); 397495f192a4SHernan Vargas 397595f192a4SHernan Vargas tp->start_time = rte_rdtsc_precise(); 397695f192a4SHernan Vargas for (enqueued = 0; enqueued < num_to_process;) { 397795f192a4SHernan Vargas num_to_enq = burst_sz; 397895f192a4SHernan Vargas 397995f192a4SHernan Vargas if (unlikely(num_to_process - enqueued < num_to_enq)) 398095f192a4SHernan Vargas num_to_enq = num_to_process - enqueued; 398195f192a4SHernan Vargas 398295f192a4SHernan Vargas /* Write to thread burst_sz current number of enqueued 398395f192a4SHernan Vargas * descriptors. It ensures that proper number of 398495f192a4SHernan Vargas * descriptors will be dequeued in callback 398595f192a4SHernan Vargas * function - needed for last batch in case where 398695f192a4SHernan Vargas * the number of operations is not a multiple of 398795f192a4SHernan Vargas * burst size. 398895f192a4SHernan Vargas */ 3989b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->burst_sz, num_to_enq, 3990b6a7e685STyler Retzlaff rte_memory_order_relaxed); 399195f192a4SHernan Vargas 3992fdcee665SHernan Vargas enq = 0; 3993fdcee665SHernan Vargas do { 3994fdcee665SHernan Vargas enq += rte_bbdev_enqueue_mldts_ops(tp->dev_id, 3995fdcee665SHernan Vargas queue_id, &ops[enqueued], num_to_enq); 3996fdcee665SHernan Vargas } while (unlikely(enq != num_to_enq)); 3997fdcee665SHernan Vargas enqueued += enq; 3998fdcee665SHernan Vargas 399995f192a4SHernan Vargas /* Wait until processing of previous batch is 400095f192a4SHernan Vargas * completed 400195f192a4SHernan Vargas */ 4002b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->nb_dequeued, enqueued, 4003b6a7e685STyler Retzlaff rte_memory_order_relaxed); 400495f192a4SHernan Vargas } 400595f192a4SHernan Vargas if (j != TEST_REPETITIONS - 1) 4006b6a7e685STyler Retzlaff rte_atomic_store_explicit(&tp->nb_dequeued, 0, rte_memory_order_relaxed); 400795f192a4SHernan Vargas } 400895f192a4SHernan Vargas 4009*92351557SNicolas Chautru TEST_ASSERT_SUCCESS(rte_bbdev_queue_intr_disable(tp->dev_id, queue_id), 4010*92351557SNicolas Chautru "Failed to disable interrupts for dev: %u, queue_id: %u", 4011*92351557SNicolas Chautru tp->dev_id, queue_id); 4012*92351557SNicolas Chautru 401395f192a4SHernan Vargas return TEST_SUCCESS; 401495f192a4SHernan Vargas } 401595f192a4SHernan Vargas 401695f192a4SHernan Vargas static int 4017f714a188SAmr Mokhtar throughput_pmd_lcore_dec(void *arg) 4018f714a188SAmr Mokhtar { 4019f714a188SAmr Mokhtar struct thread_params *tp = arg; 40200b98d574SKamil Chalupnik uint16_t enq, deq; 40210b98d574SKamil Chalupnik uint64_t total_time = 0, start_time; 4022f714a188SAmr Mokhtar const uint16_t queue_id = tp->queue_id; 4023f714a188SAmr Mokhtar const uint16_t burst_sz = tp->op_params->burst_sz; 40240b98d574SKamil Chalupnik const uint16_t num_ops = tp->op_params->num_to_process; 40250b98d574SKamil Chalupnik struct rte_bbdev_dec_op *ops_enq[num_ops]; 40260b98d574SKamil Chalupnik struct rte_bbdev_dec_op *ops_deq[num_ops]; 4027f714a188SAmr Mokhtar struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; 4028f714a188SAmr Mokhtar struct test_buffers *bufs = NULL; 40290b98d574SKamil Chalupnik int i, j, ret; 4030f714a188SAmr Mokhtar struct rte_bbdev_info info; 40310b98d574SKamil Chalupnik uint16_t num_to_enq; 40320acdb986SNicolas Chautru bool so_enable; 4033f714a188SAmr Mokhtar 4034f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 4035f714a188SAmr Mokhtar "BURST_SIZE should be <= %u", MAX_BURST); 4036f714a188SAmr Mokhtar 4037f714a188SAmr Mokhtar rte_bbdev_info_get(tp->dev_id, &info); 40380b98d574SKamil Chalupnik 40390b98d574SKamil Chalupnik TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), 40400b98d574SKamil Chalupnik "NUM_OPS cannot exceed %u for this device", 40410b98d574SKamil Chalupnik info.drv.queue_size_lim); 40420b98d574SKamil Chalupnik 4043f714a188SAmr Mokhtar bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 4044f714a188SAmr Mokhtar 4045b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START, 4046b6a7e685STyler Retzlaff rte_memory_order_relaxed); 4047f714a188SAmr Mokhtar 40480b98d574SKamil Chalupnik ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); 40490b98d574SKamil Chalupnik TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); 40500acdb986SNicolas Chautru ref_op->turbo_dec.iter_max = get_iter_max(); 4051f714a188SAmr Mokhtar if (test_vector.op_type != RTE_BBDEV_OP_NONE) 40520b98d574SKamil Chalupnik copy_reference_dec_op(ops_enq, num_ops, 0, bufs->inputs, 40530b98d574SKamil Chalupnik bufs->hard_outputs, bufs->soft_outputs, ref_op); 4054f714a188SAmr Mokhtar 40550acdb986SNicolas Chautru so_enable = check_bit(ops_enq[0]->turbo_dec.op_flags, RTE_BBDEV_TURBO_SOFT_OUTPUT); 40560acdb986SNicolas Chautru 40570b98d574SKamil Chalupnik /* Set counter to validate the ordering */ 40580b98d574SKamil Chalupnik for (j = 0; j < num_ops; ++j) 40590b98d574SKamil Chalupnik ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 40600b98d574SKamil Chalupnik 40610b98d574SKamil Chalupnik for (i = 0; i < TEST_REPETITIONS; ++i) { 4062fb5e060eSHernan Vargas uint32_t time_out = 0; 40639585f8b1SKamil Chalupnik for (j = 0; j < num_ops; ++j) 40649585f8b1SKamil Chalupnik mbuf_reset(ops_enq[j]->turbo_dec.hard_output.data); 40650acdb986SNicolas Chautru if (so_enable) 40660acdb986SNicolas Chautru for (j = 0; j < num_ops; ++j) 40670acdb986SNicolas Chautru mbuf_reset(ops_enq[j]->turbo_dec.soft_output.data); 40680b98d574SKamil Chalupnik 40690b98d574SKamil Chalupnik start_time = rte_rdtsc_precise(); 40700b98d574SKamil Chalupnik 40710b98d574SKamil Chalupnik for (enq = 0, deq = 0; enq < num_ops;) { 40720b98d574SKamil Chalupnik num_to_enq = burst_sz; 40730b98d574SKamil Chalupnik 40740b98d574SKamil Chalupnik if (unlikely(num_ops - enq < num_to_enq)) 40750b98d574SKamil Chalupnik num_to_enq = num_ops - enq; 40760b98d574SKamil Chalupnik 40770b98d574SKamil Chalupnik enq += rte_bbdev_enqueue_dec_ops(tp->dev_id, 40780b98d574SKamil Chalupnik queue_id, &ops_enq[enq], num_to_enq); 40790b98d574SKamil Chalupnik 40800b98d574SKamil Chalupnik deq += rte_bbdev_dequeue_dec_ops(tp->dev_id, 40810b98d574SKamil Chalupnik queue_id, &ops_deq[deq], enq - deq); 4082fb5e060eSHernan Vargas time_out++; 4083fb5e060eSHernan Vargas if (time_out >= TIME_OUT_POLL) { 4084fb5e060eSHernan Vargas timeout_exit(tp->dev_id); 4085fb5e060eSHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Enqueue timeout!"); 4086fb5e060eSHernan Vargas } 4087f714a188SAmr Mokhtar } 4088f714a188SAmr Mokhtar 40890b98d574SKamil Chalupnik /* dequeue the remaining */ 4090fb5e060eSHernan Vargas time_out = 0; 40910b98d574SKamil Chalupnik while (deq < enq) { 40920b98d574SKamil Chalupnik deq += rte_bbdev_dequeue_dec_ops(tp->dev_id, 40930b98d574SKamil Chalupnik queue_id, &ops_deq[deq], enq - deq); 4094fb5e060eSHernan Vargas time_out++; 4095fb5e060eSHernan Vargas if (time_out >= TIME_OUT_POLL) { 4096fb5e060eSHernan Vargas timeout_exit(tp->dev_id); 4097fb5e060eSHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!"); 4098fb5e060eSHernan Vargas } 40990b98d574SKamil Chalupnik } 4100f714a188SAmr Mokhtar 41010b98d574SKamil Chalupnik total_time += rte_rdtsc_precise() - start_time; 41020b98d574SKamil Chalupnik } 41030b98d574SKamil Chalupnik 41040b98d574SKamil Chalupnik tp->iter_count = 0; 41050b98d574SKamil Chalupnik /* get the max of iter_count for all dequeued ops */ 41060b98d574SKamil Chalupnik for (i = 0; i < num_ops; ++i) { 41070b98d574SKamil Chalupnik tp->iter_count = RTE_MAX(ops_enq[i]->turbo_dec.iter_count, 41080b98d574SKamil Chalupnik tp->iter_count); 41090b98d574SKamil Chalupnik } 4110f714a188SAmr Mokhtar 4111f714a188SAmr Mokhtar if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 4112de2ce637SHernan Vargas ret = validate_dec_op(ops_deq, num_ops, ref_op); 41130b98d574SKamil Chalupnik TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 4114f714a188SAmr Mokhtar } 4115f714a188SAmr Mokhtar 41160b98d574SKamil Chalupnik rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); 41170b98d574SKamil Chalupnik 41180b98d574SKamil Chalupnik double tb_len_bits = calc_dec_TB_size(ref_op); 41190b98d574SKamil Chalupnik 41200b98d574SKamil Chalupnik tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / 4121f714a188SAmr Mokhtar ((double)total_time / (double)rte_get_tsc_hz()); 41220b98d574SKamil Chalupnik tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) / 41230b98d574SKamil Chalupnik 1000000.0) / ((double)total_time / 41240b98d574SKamil Chalupnik (double)rte_get_tsc_hz()); 4125f714a188SAmr Mokhtar 4126f714a188SAmr Mokhtar return TEST_SUCCESS; 4127f714a188SAmr Mokhtar } 4128f714a188SAmr Mokhtar 4129f714a188SAmr Mokhtar static int 4130f41c6e4dSNicolas Chautru bler_pmd_lcore_ldpc_dec(void *arg) 4131f41c6e4dSNicolas Chautru { 4132f41c6e4dSNicolas Chautru struct thread_params *tp = arg; 4133f41c6e4dSNicolas Chautru uint16_t enq, deq; 4134f41c6e4dSNicolas Chautru uint64_t total_time = 0, start_time; 4135f41c6e4dSNicolas Chautru const uint16_t queue_id = tp->queue_id; 4136f41c6e4dSNicolas Chautru const uint16_t burst_sz = tp->op_params->burst_sz; 4137f41c6e4dSNicolas Chautru const uint16_t num_ops = tp->op_params->num_to_process; 4138f41c6e4dSNicolas Chautru struct rte_bbdev_dec_op *ops_enq[num_ops]; 4139f41c6e4dSNicolas Chautru struct rte_bbdev_dec_op *ops_deq[num_ops]; 4140f41c6e4dSNicolas Chautru struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; 4141f41c6e4dSNicolas Chautru struct test_buffers *bufs = NULL; 4142f41c6e4dSNicolas Chautru int i, j, ret; 4143f41c6e4dSNicolas Chautru float parity_bler = 0; 4144f41c6e4dSNicolas Chautru struct rte_bbdev_info info; 4145f41c6e4dSNicolas Chautru uint16_t num_to_enq; 4146f41c6e4dSNicolas Chautru bool extDdr = check_bit(ldpc_cap_flags, 4147f41c6e4dSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); 4148f41c6e4dSNicolas Chautru bool loopback = check_bit(ref_op->ldpc_dec.op_flags, 4149f41c6e4dSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); 4150f41c6e4dSNicolas Chautru bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, 4151f41c6e4dSNicolas Chautru RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); 4152f41c6e4dSNicolas Chautru 4153f41c6e4dSNicolas Chautru TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 4154f41c6e4dSNicolas Chautru "BURST_SIZE should be <= %u", MAX_BURST); 41557cc8009bSHernan Vargas TEST_ASSERT_SUCCESS((num_ops == 0), "NUM_OPS must be greater than 0"); 4156f41c6e4dSNicolas Chautru 4157f41c6e4dSNicolas Chautru rte_bbdev_info_get(tp->dev_id, &info); 4158f41c6e4dSNicolas Chautru 4159f41c6e4dSNicolas Chautru TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), 4160f41c6e4dSNicolas Chautru "NUM_OPS cannot exceed %u for this device", 4161f41c6e4dSNicolas Chautru info.drv.queue_size_lim); 4162f41c6e4dSNicolas Chautru 4163f41c6e4dSNicolas Chautru bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 4164f41c6e4dSNicolas Chautru 4165b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START, 4166b6a7e685STyler Retzlaff rte_memory_order_relaxed); 4167f41c6e4dSNicolas Chautru 4168f41c6e4dSNicolas Chautru ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); 4169f41c6e4dSNicolas Chautru TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); 4170f41c6e4dSNicolas Chautru 4171f41c6e4dSNicolas Chautru /* For BLER tests we need to enable early termination */ 4172b9ac824aSHernan Vargas if (!check_bit(ref_op->ldpc_dec.op_flags, RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE)) 4173b9ac824aSHernan Vargas ref_op->ldpc_dec.op_flags += RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; 4174b9ac824aSHernan Vargas 4175f41c6e4dSNicolas Chautru ref_op->ldpc_dec.iter_max = get_iter_max(); 4176f41c6e4dSNicolas Chautru 4177f41c6e4dSNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) 4178f41c6e4dSNicolas Chautru copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, 4179f41c6e4dSNicolas Chautru bufs->hard_outputs, bufs->soft_outputs, 4180f41c6e4dSNicolas Chautru bufs->harq_inputs, bufs->harq_outputs, ref_op); 4181f41c6e4dSNicolas Chautru generate_llr_input(num_ops, bufs->inputs, ref_op); 4182f41c6e4dSNicolas Chautru 4183f41c6e4dSNicolas Chautru /* Set counter to validate the ordering */ 4184f41c6e4dSNicolas Chautru for (j = 0; j < num_ops; ++j) 4185f41c6e4dSNicolas Chautru ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 4186f41c6e4dSNicolas Chautru 4187f41c6e4dSNicolas Chautru for (i = 0; i < 1; ++i) { /* Could add more iterations */ 4188fb5e060eSHernan Vargas uint32_t time_out = 0; 4189f41c6e4dSNicolas Chautru for (j = 0; j < num_ops; ++j) { 4190f41c6e4dSNicolas Chautru if (!loopback) 41919d9d73ebSHernan Vargas mbuf_reset(ops_enq[j]->ldpc_dec.hard_output.data); 4192f41c6e4dSNicolas Chautru if (hc_out || loopback) 41930acdb986SNicolas Chautru mbuf_reset(ops_enq[j]->ldpc_dec.harq_combined_output.data); 41949d9d73ebSHernan Vargas if (ops_enq[j]->ldpc_dec.soft_output.data != NULL) 41959d9d73ebSHernan Vargas mbuf_reset(ops_enq[j]->ldpc_dec.soft_output.data); 4196f41c6e4dSNicolas Chautru } 41973d6063a0SNicolas Chautru if (extDdr) 4198f41c6e4dSNicolas Chautru preload_harq_ddr(tp->dev_id, queue_id, ops_enq, 41993d6063a0SNicolas Chautru num_ops, true); 4200f41c6e4dSNicolas Chautru start_time = rte_rdtsc_precise(); 4201f41c6e4dSNicolas Chautru 4202f41c6e4dSNicolas Chautru for (enq = 0, deq = 0; enq < num_ops;) { 4203f41c6e4dSNicolas Chautru num_to_enq = burst_sz; 4204f41c6e4dSNicolas Chautru 4205f41c6e4dSNicolas Chautru if (unlikely(num_ops - enq < num_to_enq)) 4206f41c6e4dSNicolas Chautru num_to_enq = num_ops - enq; 4207f41c6e4dSNicolas Chautru 4208f41c6e4dSNicolas Chautru enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id, 4209f41c6e4dSNicolas Chautru queue_id, &ops_enq[enq], num_to_enq); 4210f41c6e4dSNicolas Chautru 4211f41c6e4dSNicolas Chautru deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, 4212f41c6e4dSNicolas Chautru queue_id, &ops_deq[deq], enq - deq); 4213fb5e060eSHernan Vargas time_out++; 4214fb5e060eSHernan Vargas if (time_out >= TIME_OUT_POLL) { 4215fb5e060eSHernan Vargas timeout_exit(tp->dev_id); 4216fb5e060eSHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Enqueue timeout!"); 4217fb5e060eSHernan Vargas } 4218f41c6e4dSNicolas Chautru } 4219f41c6e4dSNicolas Chautru 4220f41c6e4dSNicolas Chautru /* dequeue the remaining */ 4221fb5e060eSHernan Vargas time_out = 0; 4222f41c6e4dSNicolas Chautru while (deq < enq) { 4223f41c6e4dSNicolas Chautru deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, 4224f41c6e4dSNicolas Chautru queue_id, &ops_deq[deq], enq - deq); 4225fb5e060eSHernan Vargas time_out++; 4226fb5e060eSHernan Vargas if (time_out >= TIME_OUT_POLL) { 4227fb5e060eSHernan Vargas timeout_exit(tp->dev_id); 4228fb5e060eSHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!"); 4229fb5e060eSHernan Vargas } 4230f41c6e4dSNicolas Chautru } 4231f41c6e4dSNicolas Chautru 4232f41c6e4dSNicolas Chautru total_time += rte_rdtsc_precise() - start_time; 4233f41c6e4dSNicolas Chautru } 4234f41c6e4dSNicolas Chautru 4235f41c6e4dSNicolas Chautru tp->iter_count = 0; 4236f41c6e4dSNicolas Chautru tp->iter_average = 0; 4237f41c6e4dSNicolas Chautru /* get the max of iter_count for all dequeued ops */ 4238f41c6e4dSNicolas Chautru for (i = 0; i < num_ops; ++i) { 4239f41c6e4dSNicolas Chautru tp->iter_count = RTE_MAX(ops_enq[i]->ldpc_dec.iter_count, 4240f41c6e4dSNicolas Chautru tp->iter_count); 4241f41c6e4dSNicolas Chautru tp->iter_average += (double) ops_enq[i]->ldpc_dec.iter_count; 4242f41c6e4dSNicolas Chautru if (ops_enq[i]->status & (1 << RTE_BBDEV_SYNDROME_ERROR)) 4243f41c6e4dSNicolas Chautru parity_bler += 1.0; 4244f41c6e4dSNicolas Chautru } 4245f41c6e4dSNicolas Chautru 4246f41c6e4dSNicolas Chautru parity_bler /= num_ops; /* This one is based on SYND */ 4247f41c6e4dSNicolas Chautru tp->iter_average /= num_ops; 4248f41c6e4dSNicolas Chautru tp->bler = (double) validate_ldpc_bler(ops_deq, num_ops) / num_ops; 4249f41c6e4dSNicolas Chautru 4250f41c6e4dSNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE 4251f41c6e4dSNicolas Chautru && tp->bler == 0 4252f41c6e4dSNicolas Chautru && parity_bler == 0 4253f41c6e4dSNicolas Chautru && !hc_out) { 4254f41c6e4dSNicolas Chautru ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op, 4255f41c6e4dSNicolas Chautru tp->op_params->vector_mask); 4256f41c6e4dSNicolas Chautru TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 4257f41c6e4dSNicolas Chautru } 4258f41c6e4dSNicolas Chautru 4259f41c6e4dSNicolas Chautru rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); 4260f41c6e4dSNicolas Chautru 4261f41c6e4dSNicolas Chautru double tb_len_bits = calc_ldpc_dec_TB_size(ref_op); 4262f41c6e4dSNicolas Chautru tp->ops_per_sec = ((double)num_ops * 1) / 4263f41c6e4dSNicolas Chautru ((double)total_time / (double)rte_get_tsc_hz()); 4264f41c6e4dSNicolas Chautru tp->mbps = (((double)(num_ops * 1 * tb_len_bits)) / 4265f41c6e4dSNicolas Chautru 1000000.0) / ((double)total_time / 4266f41c6e4dSNicolas Chautru (double)rte_get_tsc_hz()); 4267f41c6e4dSNicolas Chautru 4268f41c6e4dSNicolas Chautru return TEST_SUCCESS; 4269f41c6e4dSNicolas Chautru } 4270f41c6e4dSNicolas Chautru 42717831a968SHernan Vargas 42727831a968SHernan Vargas static int 42737831a968SHernan Vargas bler_pmd_lcore_turbo_dec(void *arg) 42747831a968SHernan Vargas { 42757831a968SHernan Vargas struct thread_params *tp = arg; 42767831a968SHernan Vargas uint16_t enq, deq; 42777831a968SHernan Vargas uint64_t total_time = 0, start_time; 42787831a968SHernan Vargas const uint16_t queue_id = tp->queue_id; 42797831a968SHernan Vargas const uint16_t burst_sz = tp->op_params->burst_sz; 42807831a968SHernan Vargas const uint16_t num_ops = tp->op_params->num_to_process; 42817831a968SHernan Vargas struct rte_bbdev_dec_op *ops_enq[num_ops]; 42827831a968SHernan Vargas struct rte_bbdev_dec_op *ops_deq[num_ops]; 42837831a968SHernan Vargas struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; 42847831a968SHernan Vargas struct test_buffers *bufs = NULL; 42857831a968SHernan Vargas int i, j, ret; 42867831a968SHernan Vargas struct rte_bbdev_info info; 42877831a968SHernan Vargas uint16_t num_to_enq; 42887831a968SHernan Vargas 42897831a968SHernan Vargas TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 42907831a968SHernan Vargas "BURST_SIZE should be <= %u", MAX_BURST); 42917cc8009bSHernan Vargas TEST_ASSERT_SUCCESS((num_ops == 0), "NUM_OPS must be greater than 0"); 42927831a968SHernan Vargas 42937831a968SHernan Vargas rte_bbdev_info_get(tp->dev_id, &info); 42947831a968SHernan Vargas 42957831a968SHernan Vargas TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), 42967831a968SHernan Vargas "NUM_OPS cannot exceed %u for this device", 42977831a968SHernan Vargas info.drv.queue_size_lim); 42987831a968SHernan Vargas 42997831a968SHernan Vargas bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 43007831a968SHernan Vargas 4301b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START, 4302b6a7e685STyler Retzlaff rte_memory_order_relaxed); 43037831a968SHernan Vargas 43047831a968SHernan Vargas ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); 43057831a968SHernan Vargas TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); 43067831a968SHernan Vargas 43077831a968SHernan Vargas /* For BLER tests we need to enable early termination */ 4308b9ac824aSHernan Vargas if (!check_bit(ref_op->turbo_dec.op_flags, RTE_BBDEV_TURBO_EARLY_TERMINATION)) 4309b9ac824aSHernan Vargas ref_op->turbo_dec.op_flags += RTE_BBDEV_TURBO_EARLY_TERMINATION; 4310b9ac824aSHernan Vargas 43117831a968SHernan Vargas ref_op->turbo_dec.iter_max = get_iter_max(); 43127831a968SHernan Vargas 43137831a968SHernan Vargas if (test_vector.op_type != RTE_BBDEV_OP_NONE) 43147831a968SHernan Vargas copy_reference_dec_op(ops_enq, num_ops, 0, bufs->inputs, 43157831a968SHernan Vargas bufs->hard_outputs, bufs->soft_outputs, 43167831a968SHernan Vargas ref_op); 43177831a968SHernan Vargas generate_turbo_llr_input(num_ops, bufs->inputs, ref_op); 43187831a968SHernan Vargas 43197831a968SHernan Vargas /* Set counter to validate the ordering */ 43207831a968SHernan Vargas for (j = 0; j < num_ops; ++j) 43217831a968SHernan Vargas ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 43227831a968SHernan Vargas 43237831a968SHernan Vargas for (i = 0; i < 1; ++i) { /* Could add more iterations */ 43247831a968SHernan Vargas uint32_t time_out = 0; 43257831a968SHernan Vargas for (j = 0; j < num_ops; ++j) { 43267831a968SHernan Vargas mbuf_reset( 43277831a968SHernan Vargas ops_enq[j]->turbo_dec.hard_output.data); 43287831a968SHernan Vargas } 43297831a968SHernan Vargas 43307831a968SHernan Vargas start_time = rte_rdtsc_precise(); 43317831a968SHernan Vargas 43327831a968SHernan Vargas for (enq = 0, deq = 0; enq < num_ops;) { 43337831a968SHernan Vargas num_to_enq = burst_sz; 43347831a968SHernan Vargas 43357831a968SHernan Vargas if (unlikely(num_ops - enq < num_to_enq)) 43367831a968SHernan Vargas num_to_enq = num_ops - enq; 43377831a968SHernan Vargas 43387831a968SHernan Vargas enq += rte_bbdev_enqueue_dec_ops(tp->dev_id, 43397831a968SHernan Vargas queue_id, &ops_enq[enq], num_to_enq); 43407831a968SHernan Vargas 43417831a968SHernan Vargas deq += rte_bbdev_dequeue_dec_ops(tp->dev_id, 43427831a968SHernan Vargas queue_id, &ops_deq[deq], enq - deq); 43437831a968SHernan Vargas time_out++; 43447831a968SHernan Vargas if (time_out >= TIME_OUT_POLL) { 43457831a968SHernan Vargas timeout_exit(tp->dev_id); 43467831a968SHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Enqueue timeout!"); 43477831a968SHernan Vargas } 43487831a968SHernan Vargas } 43497831a968SHernan Vargas 43507831a968SHernan Vargas /* dequeue the remaining */ 43517831a968SHernan Vargas time_out = 0; 43527831a968SHernan Vargas while (deq < enq) { 43537831a968SHernan Vargas deq += rte_bbdev_dequeue_dec_ops(tp->dev_id, 43547831a968SHernan Vargas queue_id, &ops_deq[deq], enq - deq); 43557831a968SHernan Vargas time_out++; 43567831a968SHernan Vargas if (time_out >= TIME_OUT_POLL) { 43577831a968SHernan Vargas timeout_exit(tp->dev_id); 43587831a968SHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!"); 43597831a968SHernan Vargas } 43607831a968SHernan Vargas } 43617831a968SHernan Vargas 43627831a968SHernan Vargas total_time += rte_rdtsc_precise() - start_time; 43637831a968SHernan Vargas } 43647831a968SHernan Vargas 43657831a968SHernan Vargas tp->iter_count = 0; 43667831a968SHernan Vargas tp->iter_average = 0; 43677831a968SHernan Vargas /* get the max of iter_count for all dequeued ops */ 43687831a968SHernan Vargas for (i = 0; i < num_ops; ++i) { 43697831a968SHernan Vargas tp->iter_count = RTE_MAX(ops_enq[i]->turbo_dec.iter_count, 43707831a968SHernan Vargas tp->iter_count); 43717831a968SHernan Vargas tp->iter_average += (double) ops_enq[i]->turbo_dec.iter_count; 43727831a968SHernan Vargas } 43737831a968SHernan Vargas 43747831a968SHernan Vargas tp->iter_average /= num_ops; 43757831a968SHernan Vargas tp->bler = (double) validate_turbo_bler(ops_deq, num_ops) / num_ops; 43767831a968SHernan Vargas 43777831a968SHernan Vargas rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); 43787831a968SHernan Vargas 43797831a968SHernan Vargas double tb_len_bits = calc_dec_TB_size(ref_op); 43807831a968SHernan Vargas tp->ops_per_sec = ((double)num_ops * 1) / 43817831a968SHernan Vargas ((double)total_time / (double)rte_get_tsc_hz()); 43827831a968SHernan Vargas tp->mbps = (((double)(num_ops * 1 * tb_len_bits)) / 43837831a968SHernan Vargas 1000000.0) / ((double)total_time / 43847831a968SHernan Vargas (double)rte_get_tsc_hz()); 43857831a968SHernan Vargas printf("TBS %.0f Time %.0f\n", tb_len_bits, 1000000.0 * 43867831a968SHernan Vargas ((double)total_time / (double)rte_get_tsc_hz())); 43877831a968SHernan Vargas 43887831a968SHernan Vargas return TEST_SUCCESS; 43897831a968SHernan Vargas } 43907831a968SHernan Vargas 4391f41c6e4dSNicolas Chautru static int 4392d819c083SNicolas Chautru throughput_pmd_lcore_ldpc_dec(void *arg) 4393d819c083SNicolas Chautru { 4394d819c083SNicolas Chautru struct thread_params *tp = arg; 4395d819c083SNicolas Chautru uint16_t enq, deq; 4396d819c083SNicolas Chautru uint64_t total_time = 0, start_time; 4397d819c083SNicolas Chautru const uint16_t queue_id = tp->queue_id; 4398d819c083SNicolas Chautru const uint16_t burst_sz = tp->op_params->burst_sz; 4399d819c083SNicolas Chautru const uint16_t num_ops = tp->op_params->num_to_process; 4400d819c083SNicolas Chautru struct rte_bbdev_dec_op *ops_enq[num_ops]; 4401d819c083SNicolas Chautru struct rte_bbdev_dec_op *ops_deq[num_ops]; 4402d819c083SNicolas Chautru struct rte_bbdev_dec_op *ref_op = tp->op_params->ref_dec_op; 4403d819c083SNicolas Chautru struct test_buffers *bufs = NULL; 4404d819c083SNicolas Chautru int i, j, ret; 4405d819c083SNicolas Chautru struct rte_bbdev_info info; 4406d819c083SNicolas Chautru uint16_t num_to_enq; 4407335c11fdSNicolas Chautru bool extDdr = check_bit(ldpc_cap_flags, 4408335c11fdSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE); 4409335c11fdSNicolas Chautru bool loopback = check_bit(ref_op->ldpc_dec.op_flags, 4410335c11fdSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK); 4411335c11fdSNicolas Chautru bool hc_out = check_bit(ref_op->ldpc_dec.op_flags, 4412335c11fdSNicolas Chautru RTE_BBDEV_LDPC_HQ_COMBINE_OUT_ENABLE); 4413d819c083SNicolas Chautru 4414d819c083SNicolas Chautru TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 4415d819c083SNicolas Chautru "BURST_SIZE should be <= %u", MAX_BURST); 4416d819c083SNicolas Chautru 4417d819c083SNicolas Chautru rte_bbdev_info_get(tp->dev_id, &info); 4418d819c083SNicolas Chautru 4419d819c083SNicolas Chautru TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), 4420d819c083SNicolas Chautru "NUM_OPS cannot exceed %u for this device", 4421d819c083SNicolas Chautru info.drv.queue_size_lim); 4422d819c083SNicolas Chautru 4423d819c083SNicolas Chautru bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 4424d819c083SNicolas Chautru 4425b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START, 4426b6a7e685STyler Retzlaff rte_memory_order_relaxed); 4427d819c083SNicolas Chautru 4428d819c083SNicolas Chautru ret = rte_bbdev_dec_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); 4429d819c083SNicolas Chautru TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); 4430d819c083SNicolas Chautru 4431d819c083SNicolas Chautru /* For throughput tests we need to disable early termination */ 44323073445dSHernan Vargas if (check_bit(ref_op->ldpc_dec.op_flags, RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE)) 44333073445dSHernan Vargas ref_op->ldpc_dec.op_flags -= RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; 44343073445dSHernan Vargas 4435f41c6e4dSNicolas Chautru ref_op->ldpc_dec.iter_max = get_iter_max(); 44363073445dSHernan Vargas /* Since ET is disabled, the expected iter_count is iter_max */ 4437d819c083SNicolas Chautru ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; 4438d819c083SNicolas Chautru 4439d819c083SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) 4440d819c083SNicolas Chautru copy_reference_ldpc_dec_op(ops_enq, num_ops, 0, bufs->inputs, 4441d819c083SNicolas Chautru bufs->hard_outputs, bufs->soft_outputs, 4442d819c083SNicolas Chautru bufs->harq_inputs, bufs->harq_outputs, ref_op); 4443d819c083SNicolas Chautru 4444d819c083SNicolas Chautru /* Set counter to validate the ordering */ 4445d819c083SNicolas Chautru for (j = 0; j < num_ops; ++j) 4446d819c083SNicolas Chautru ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 4447d819c083SNicolas Chautru 4448d819c083SNicolas Chautru for (i = 0; i < TEST_REPETITIONS; ++i) { 4449fb5e060eSHernan Vargas uint32_t time_out = 0; 4450d819c083SNicolas Chautru for (j = 0; j < num_ops; ++j) { 4451335c11fdSNicolas Chautru if (!loopback) 44529d9d73ebSHernan Vargas mbuf_reset(ops_enq[j]->ldpc_dec.hard_output.data); 4453335c11fdSNicolas Chautru if (hc_out || loopback) 44549d9d73ebSHernan Vargas mbuf_reset(ops_enq[j]->ldpc_dec.harq_combined_output.data); 44559d9d73ebSHernan Vargas if (ops_enq[j]->ldpc_dec.soft_output.data != NULL) 44569d9d73ebSHernan Vargas mbuf_reset(ops_enq[j]->ldpc_dec.soft_output.data); 4457d819c083SNicolas Chautru } 44583d6063a0SNicolas Chautru if (extDdr) 4459335c11fdSNicolas Chautru preload_harq_ddr(tp->dev_id, queue_id, ops_enq, 44603d6063a0SNicolas Chautru num_ops, true); 4461d819c083SNicolas Chautru start_time = rte_rdtsc_precise(); 4462d819c083SNicolas Chautru 4463d819c083SNicolas Chautru for (enq = 0, deq = 0; enq < num_ops;) { 4464d819c083SNicolas Chautru num_to_enq = burst_sz; 4465d819c083SNicolas Chautru 4466d819c083SNicolas Chautru if (unlikely(num_ops - enq < num_to_enq)) 4467d819c083SNicolas Chautru num_to_enq = num_ops - enq; 4468d819c083SNicolas Chautru 4469d819c083SNicolas Chautru enq += rte_bbdev_enqueue_ldpc_dec_ops(tp->dev_id, 4470d819c083SNicolas Chautru queue_id, &ops_enq[enq], num_to_enq); 4471d819c083SNicolas Chautru 4472d819c083SNicolas Chautru deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, 4473d819c083SNicolas Chautru queue_id, &ops_deq[deq], enq - deq); 4474fb5e060eSHernan Vargas time_out++; 4475fb5e060eSHernan Vargas if (time_out >= TIME_OUT_POLL) { 4476fb5e060eSHernan Vargas timeout_exit(tp->dev_id); 4477fb5e060eSHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Enqueue timeout!"); 4478fb5e060eSHernan Vargas } 4479d819c083SNicolas Chautru } 4480d819c083SNicolas Chautru 4481d819c083SNicolas Chautru /* dequeue the remaining */ 4482fb5e060eSHernan Vargas time_out = 0; 4483d819c083SNicolas Chautru while (deq < enq) { 4484d819c083SNicolas Chautru deq += rte_bbdev_dequeue_ldpc_dec_ops(tp->dev_id, 4485d819c083SNicolas Chautru queue_id, &ops_deq[deq], enq - deq); 4486fb5e060eSHernan Vargas time_out++; 4487fb5e060eSHernan Vargas if (time_out >= TIME_OUT_POLL) { 4488fb5e060eSHernan Vargas timeout_exit(tp->dev_id); 4489fb5e060eSHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!"); 4490fb5e060eSHernan Vargas } 4491d819c083SNicolas Chautru } 4492d819c083SNicolas Chautru 4493d819c083SNicolas Chautru total_time += rte_rdtsc_precise() - start_time; 4494d819c083SNicolas Chautru } 4495d819c083SNicolas Chautru 4496d819c083SNicolas Chautru tp->iter_count = 0; 4497d819c083SNicolas Chautru /* get the max of iter_count for all dequeued ops */ 4498d819c083SNicolas Chautru for (i = 0; i < num_ops; ++i) { 4499d819c083SNicolas Chautru tp->iter_count = RTE_MAX(ops_enq[i]->ldpc_dec.iter_count, 4500d819c083SNicolas Chautru tp->iter_count); 4501d819c083SNicolas Chautru } 4502335c11fdSNicolas Chautru if (extDdr) { 4503335c11fdSNicolas Chautru /* Read loopback is not thread safe */ 4504335c11fdSNicolas Chautru retrieve_harq_ddr(tp->dev_id, queue_id, ops_enq, num_ops); 4505335c11fdSNicolas Chautru } 4506d819c083SNicolas Chautru 4507d819c083SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 4508d819c083SNicolas Chautru ret = validate_ldpc_dec_op(ops_deq, num_ops, ref_op, 4509d819c083SNicolas Chautru tp->op_params->vector_mask); 4510d819c083SNicolas Chautru TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 4511d819c083SNicolas Chautru } 4512d819c083SNicolas Chautru 4513f32bbc32SHernan Vargas ret = rte_bbdev_queue_stop(tp->dev_id, queue_id); 4514f32bbc32SHernan Vargas if (ret != 0) 4515f32bbc32SHernan Vargas printf("Failed to stop queue on dev %u q_id: %u\n", tp->dev_id, queue_id); 4516d819c083SNicolas Chautru rte_bbdev_dec_op_free_bulk(ops_enq, num_ops); 4517d819c083SNicolas Chautru 4518d819c083SNicolas Chautru double tb_len_bits = calc_ldpc_dec_TB_size(ref_op); 4519d819c083SNicolas Chautru 4520d819c083SNicolas Chautru tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / 4521d819c083SNicolas Chautru ((double)total_time / (double)rte_get_tsc_hz()); 4522d819c083SNicolas Chautru tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) / 4523d819c083SNicolas Chautru 1000000.0) / ((double)total_time / 4524d819c083SNicolas Chautru (double)rte_get_tsc_hz()); 4525d819c083SNicolas Chautru 4526d819c083SNicolas Chautru return TEST_SUCCESS; 4527d819c083SNicolas Chautru } 4528d819c083SNicolas Chautru 4529d819c083SNicolas Chautru static int 4530f714a188SAmr Mokhtar throughput_pmd_lcore_enc(void *arg) 4531f714a188SAmr Mokhtar { 4532f714a188SAmr Mokhtar struct thread_params *tp = arg; 45330b98d574SKamil Chalupnik uint16_t enq, deq; 45340b98d574SKamil Chalupnik uint64_t total_time = 0, start_time; 4535f714a188SAmr Mokhtar const uint16_t queue_id = tp->queue_id; 4536f714a188SAmr Mokhtar const uint16_t burst_sz = tp->op_params->burst_sz; 45370b98d574SKamil Chalupnik const uint16_t num_ops = tp->op_params->num_to_process; 45380b98d574SKamil Chalupnik struct rte_bbdev_enc_op *ops_enq[num_ops]; 45390b98d574SKamil Chalupnik struct rte_bbdev_enc_op *ops_deq[num_ops]; 4540f714a188SAmr Mokhtar struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; 4541f714a188SAmr Mokhtar struct test_buffers *bufs = NULL; 45420b98d574SKamil Chalupnik int i, j, ret; 4543f714a188SAmr Mokhtar struct rte_bbdev_info info; 45440b98d574SKamil Chalupnik uint16_t num_to_enq; 4545f714a188SAmr Mokhtar 4546f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 4547f714a188SAmr Mokhtar "BURST_SIZE should be <= %u", MAX_BURST); 4548f714a188SAmr Mokhtar 4549f714a188SAmr Mokhtar rte_bbdev_info_get(tp->dev_id, &info); 45500b98d574SKamil Chalupnik 45510b98d574SKamil Chalupnik TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), 45520b98d574SKamil Chalupnik "NUM_OPS cannot exceed %u for this device", 45530b98d574SKamil Chalupnik info.drv.queue_size_lim); 45540b98d574SKamil Chalupnik 4555f714a188SAmr Mokhtar bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 4556f714a188SAmr Mokhtar 4557b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START, 4558b6a7e685STyler Retzlaff rte_memory_order_relaxed); 4559f714a188SAmr Mokhtar 45600b98d574SKamil Chalupnik ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq, 45610b98d574SKamil Chalupnik num_ops); 45620b98d574SKamil Chalupnik TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", 45630b98d574SKamil Chalupnik num_ops); 45640b98d574SKamil Chalupnik if (test_vector.op_type != RTE_BBDEV_OP_NONE) 45650b98d574SKamil Chalupnik copy_reference_enc_op(ops_enq, num_ops, 0, bufs->inputs, 45660b98d574SKamil Chalupnik bufs->hard_outputs, ref_op); 4567f714a188SAmr Mokhtar 45680b98d574SKamil Chalupnik /* Set counter to validate the ordering */ 45690b98d574SKamil Chalupnik for (j = 0; j < num_ops; ++j) 45700b98d574SKamil Chalupnik ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 4571f714a188SAmr Mokhtar 45720b98d574SKamil Chalupnik for (i = 0; i < TEST_REPETITIONS; ++i) { 4573fb5e060eSHernan Vargas uint32_t time_out = 0; 4574f714a188SAmr Mokhtar if (test_vector.op_type != RTE_BBDEV_OP_NONE) 45750b98d574SKamil Chalupnik for (j = 0; j < num_ops; ++j) 45769585f8b1SKamil Chalupnik mbuf_reset(ops_enq[j]->turbo_enc.output.data); 4577f714a188SAmr Mokhtar 45780b98d574SKamil Chalupnik start_time = rte_rdtsc_precise(); 45790b98d574SKamil Chalupnik 45800b98d574SKamil Chalupnik for (enq = 0, deq = 0; enq < num_ops;) { 45810b98d574SKamil Chalupnik num_to_enq = burst_sz; 45820b98d574SKamil Chalupnik 45830b98d574SKamil Chalupnik if (unlikely(num_ops - enq < num_to_enq)) 45840b98d574SKamil Chalupnik num_to_enq = num_ops - enq; 45850b98d574SKamil Chalupnik 45860b98d574SKamil Chalupnik enq += rte_bbdev_enqueue_enc_ops(tp->dev_id, 45870b98d574SKamil Chalupnik queue_id, &ops_enq[enq], num_to_enq); 45880b98d574SKamil Chalupnik 45890b98d574SKamil Chalupnik deq += rte_bbdev_dequeue_enc_ops(tp->dev_id, 45900b98d574SKamil Chalupnik queue_id, &ops_deq[deq], enq - deq); 4591fb5e060eSHernan Vargas time_out++; 4592fb5e060eSHernan Vargas if (time_out >= TIME_OUT_POLL) { 4593fb5e060eSHernan Vargas timeout_exit(tp->dev_id); 4594fb5e060eSHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Enqueue timeout!"); 4595fb5e060eSHernan Vargas } 4596f714a188SAmr Mokhtar } 45970b98d574SKamil Chalupnik 45980b98d574SKamil Chalupnik /* dequeue the remaining */ 4599fb5e060eSHernan Vargas time_out = 0; 46000b98d574SKamil Chalupnik while (deq < enq) { 46010b98d574SKamil Chalupnik deq += rte_bbdev_dequeue_enc_ops(tp->dev_id, 46020b98d574SKamil Chalupnik queue_id, &ops_deq[deq], enq - deq); 4603fb5e060eSHernan Vargas time_out++; 4604fb5e060eSHernan Vargas if (time_out >= TIME_OUT_POLL) { 4605fb5e060eSHernan Vargas timeout_exit(tp->dev_id); 4606fb5e060eSHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!"); 4607fb5e060eSHernan Vargas } 4608f714a188SAmr Mokhtar } 4609f714a188SAmr Mokhtar 46100b98d574SKamil Chalupnik total_time += rte_rdtsc_precise() - start_time; 46110b98d574SKamil Chalupnik } 4612f714a188SAmr Mokhtar 4613f714a188SAmr Mokhtar if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 46140b98d574SKamil Chalupnik ret = validate_enc_op(ops_deq, num_ops, ref_op); 46150b98d574SKamil Chalupnik TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 4616f714a188SAmr Mokhtar } 4617f714a188SAmr Mokhtar 4618d819c083SNicolas Chautru rte_bbdev_enc_op_free_bulk(ops_enq, num_ops); 4619d819c083SNicolas Chautru 46200b98d574SKamil Chalupnik double tb_len_bits = calc_enc_TB_size(ref_op); 4621f714a188SAmr Mokhtar 46220b98d574SKamil Chalupnik tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / 4623f714a188SAmr Mokhtar ((double)total_time / (double)rte_get_tsc_hz()); 46240b98d574SKamil Chalupnik tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) 46250b98d574SKamil Chalupnik / 1000000.0) / ((double)total_time / 46260b98d574SKamil Chalupnik (double)rte_get_tsc_hz()); 4627f714a188SAmr Mokhtar 4628f714a188SAmr Mokhtar return TEST_SUCCESS; 4629f714a188SAmr Mokhtar } 46300b98d574SKamil Chalupnik 4631d819c083SNicolas Chautru static int 4632d819c083SNicolas Chautru throughput_pmd_lcore_ldpc_enc(void *arg) 4633d819c083SNicolas Chautru { 4634d819c083SNicolas Chautru struct thread_params *tp = arg; 4635d819c083SNicolas Chautru uint16_t enq, deq; 4636d819c083SNicolas Chautru uint64_t total_time = 0, start_time; 4637d819c083SNicolas Chautru const uint16_t queue_id = tp->queue_id; 4638d819c083SNicolas Chautru const uint16_t burst_sz = tp->op_params->burst_sz; 4639d819c083SNicolas Chautru const uint16_t num_ops = tp->op_params->num_to_process; 4640d819c083SNicolas Chautru struct rte_bbdev_enc_op *ops_enq[num_ops]; 4641d819c083SNicolas Chautru struct rte_bbdev_enc_op *ops_deq[num_ops]; 4642d819c083SNicolas Chautru struct rte_bbdev_enc_op *ref_op = tp->op_params->ref_enc_op; 4643d819c083SNicolas Chautru struct test_buffers *bufs = NULL; 4644d819c083SNicolas Chautru int i, j, ret; 4645d819c083SNicolas Chautru struct rte_bbdev_info info; 4646d819c083SNicolas Chautru uint16_t num_to_enq; 4647d819c083SNicolas Chautru 4648d819c083SNicolas Chautru TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 4649d819c083SNicolas Chautru "BURST_SIZE should be <= %u", MAX_BURST); 4650d819c083SNicolas Chautru 4651d819c083SNicolas Chautru rte_bbdev_info_get(tp->dev_id, &info); 4652d819c083SNicolas Chautru 4653d819c083SNicolas Chautru TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), 4654d819c083SNicolas Chautru "NUM_OPS cannot exceed %u for this device", 4655d819c083SNicolas Chautru info.drv.queue_size_lim); 4656d819c083SNicolas Chautru 4657d819c083SNicolas Chautru bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 4658d819c083SNicolas Chautru 4659b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START, 4660b6a7e685STyler Retzlaff rte_memory_order_relaxed); 4661d819c083SNicolas Chautru 4662d819c083SNicolas Chautru ret = rte_bbdev_enc_op_alloc_bulk(tp->op_params->mp, ops_enq, 4663d819c083SNicolas Chautru num_ops); 4664d819c083SNicolas Chautru TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", 4665d819c083SNicolas Chautru num_ops); 4666d819c083SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) 4667d819c083SNicolas Chautru copy_reference_ldpc_enc_op(ops_enq, num_ops, 0, bufs->inputs, 4668d819c083SNicolas Chautru bufs->hard_outputs, ref_op); 4669d819c083SNicolas Chautru 4670d819c083SNicolas Chautru /* Set counter to validate the ordering */ 4671d819c083SNicolas Chautru for (j = 0; j < num_ops; ++j) 4672d819c083SNicolas Chautru ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 4673d819c083SNicolas Chautru 4674d819c083SNicolas Chautru for (i = 0; i < TEST_REPETITIONS; ++i) { 4675fb5e060eSHernan Vargas uint32_t time_out = 0; 4676d819c083SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) 4677d819c083SNicolas Chautru for (j = 0; j < num_ops; ++j) 4678d819c083SNicolas Chautru mbuf_reset(ops_enq[j]->turbo_enc.output.data); 4679d819c083SNicolas Chautru 4680d819c083SNicolas Chautru start_time = rte_rdtsc_precise(); 4681d819c083SNicolas Chautru 4682d819c083SNicolas Chautru for (enq = 0, deq = 0; enq < num_ops;) { 4683d819c083SNicolas Chautru num_to_enq = burst_sz; 4684d819c083SNicolas Chautru 4685d819c083SNicolas Chautru if (unlikely(num_ops - enq < num_to_enq)) 4686d819c083SNicolas Chautru num_to_enq = num_ops - enq; 4687d819c083SNicolas Chautru 4688d819c083SNicolas Chautru enq += rte_bbdev_enqueue_ldpc_enc_ops(tp->dev_id, 4689d819c083SNicolas Chautru queue_id, &ops_enq[enq], num_to_enq); 4690d819c083SNicolas Chautru 4691d819c083SNicolas Chautru deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id, 4692d819c083SNicolas Chautru queue_id, &ops_deq[deq], enq - deq); 4693fb5e060eSHernan Vargas time_out++; 4694fb5e060eSHernan Vargas if (time_out >= TIME_OUT_POLL) { 4695fb5e060eSHernan Vargas timeout_exit(tp->dev_id); 4696fb5e060eSHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Enqueue timeout!"); 4697fb5e060eSHernan Vargas } 4698d819c083SNicolas Chautru } 4699d819c083SNicolas Chautru 4700d819c083SNicolas Chautru /* dequeue the remaining */ 4701fb5e060eSHernan Vargas time_out = 0; 4702d819c083SNicolas Chautru while (deq < enq) { 4703d819c083SNicolas Chautru deq += rte_bbdev_dequeue_ldpc_enc_ops(tp->dev_id, 4704d819c083SNicolas Chautru queue_id, &ops_deq[deq], enq - deq); 4705fb5e060eSHernan Vargas time_out++; 4706fb5e060eSHernan Vargas if (time_out >= TIME_OUT_POLL) { 4707fb5e060eSHernan Vargas timeout_exit(tp->dev_id); 4708fb5e060eSHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!"); 4709fb5e060eSHernan Vargas } 4710d819c083SNicolas Chautru } 4711d819c083SNicolas Chautru 4712d819c083SNicolas Chautru total_time += rte_rdtsc_precise() - start_time; 4713d819c083SNicolas Chautru } 4714d819c083SNicolas Chautru 4715d819c083SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 4716d819c083SNicolas Chautru ret = validate_ldpc_enc_op(ops_deq, num_ops, ref_op); 4717d819c083SNicolas Chautru TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 4718d819c083SNicolas Chautru } 4719d819c083SNicolas Chautru 4720d819c083SNicolas Chautru rte_bbdev_enc_op_free_bulk(ops_enq, num_ops); 4721d819c083SNicolas Chautru 4722d819c083SNicolas Chautru double tb_len_bits = calc_ldpc_enc_TB_size(ref_op); 4723d819c083SNicolas Chautru 4724d819c083SNicolas Chautru tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / 4725d819c083SNicolas Chautru ((double)total_time / (double)rte_get_tsc_hz()); 4726d819c083SNicolas Chautru tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) 4727d819c083SNicolas Chautru / 1000000.0) / ((double)total_time / 4728d819c083SNicolas Chautru (double)rte_get_tsc_hz()); 4729d819c083SNicolas Chautru 4730d819c083SNicolas Chautru return TEST_SUCCESS; 4731d819c083SNicolas Chautru } 4732d819c083SNicolas Chautru 47330acdb986SNicolas Chautru static int 47340acdb986SNicolas Chautru throughput_pmd_lcore_fft(void *arg) 47350acdb986SNicolas Chautru { 47360acdb986SNicolas Chautru struct thread_params *tp = arg; 47370acdb986SNicolas Chautru uint16_t enq, deq; 47380acdb986SNicolas Chautru uint64_t total_time = 0, start_time; 47390acdb986SNicolas Chautru const uint16_t queue_id = tp->queue_id; 47400acdb986SNicolas Chautru const uint16_t burst_sz = tp->op_params->burst_sz; 47410acdb986SNicolas Chautru const uint16_t num_ops = tp->op_params->num_to_process; 47420acdb986SNicolas Chautru struct rte_bbdev_fft_op *ops_enq[num_ops]; 47430acdb986SNicolas Chautru struct rte_bbdev_fft_op *ops_deq[num_ops]; 47440acdb986SNicolas Chautru struct rte_bbdev_fft_op *ref_op = tp->op_params->ref_fft_op; 47450acdb986SNicolas Chautru struct test_buffers *bufs = NULL; 47460acdb986SNicolas Chautru int i, j, ret; 47470acdb986SNicolas Chautru struct rte_bbdev_info info; 47480acdb986SNicolas Chautru uint16_t num_to_enq; 47490acdb986SNicolas Chautru 47500acdb986SNicolas Chautru TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 47510acdb986SNicolas Chautru "BURST_SIZE should be <= %u", MAX_BURST); 47520acdb986SNicolas Chautru 47530acdb986SNicolas Chautru rte_bbdev_info_get(tp->dev_id, &info); 47540acdb986SNicolas Chautru 47550acdb986SNicolas Chautru TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), 47560acdb986SNicolas Chautru "NUM_OPS cannot exceed %u for this device", 47570acdb986SNicolas Chautru info.drv.queue_size_lim); 47580acdb986SNicolas Chautru 47590acdb986SNicolas Chautru bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 47600acdb986SNicolas Chautru 4761b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START, 4762b6a7e685STyler Retzlaff rte_memory_order_relaxed); 47630acdb986SNicolas Chautru 47640acdb986SNicolas Chautru ret = rte_bbdev_fft_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); 47650acdb986SNicolas Chautru TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); 47660acdb986SNicolas Chautru 47670acdb986SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) 47680acdb986SNicolas Chautru copy_reference_fft_op(ops_enq, num_ops, 0, bufs->inputs, 47690ed76d66SHernan Vargas bufs->hard_outputs, bufs->soft_outputs, bufs->harq_inputs, ref_op); 47700acdb986SNicolas Chautru 47710acdb986SNicolas Chautru /* Set counter to validate the ordering */ 47720acdb986SNicolas Chautru for (j = 0; j < num_ops; ++j) 47730acdb986SNicolas Chautru ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 47740acdb986SNicolas Chautru 47750acdb986SNicolas Chautru for (i = 0; i < TEST_REPETITIONS; ++i) { 4776fb5e060eSHernan Vargas uint32_t time_out = 0; 47770acdb986SNicolas Chautru for (j = 0; j < num_ops; ++j) 47780acdb986SNicolas Chautru mbuf_reset(ops_enq[j]->fft.base_output.data); 47790acdb986SNicolas Chautru 47800acdb986SNicolas Chautru start_time = rte_rdtsc_precise(); 47810acdb986SNicolas Chautru 47820acdb986SNicolas Chautru for (enq = 0, deq = 0; enq < num_ops;) { 47830acdb986SNicolas Chautru num_to_enq = burst_sz; 47840acdb986SNicolas Chautru 47850acdb986SNicolas Chautru if (unlikely(num_ops - enq < num_to_enq)) 47860acdb986SNicolas Chautru num_to_enq = num_ops - enq; 47870acdb986SNicolas Chautru 47880acdb986SNicolas Chautru enq += rte_bbdev_enqueue_fft_ops(tp->dev_id, 47890acdb986SNicolas Chautru queue_id, &ops_enq[enq], num_to_enq); 47900acdb986SNicolas Chautru 47910acdb986SNicolas Chautru deq += rte_bbdev_dequeue_fft_ops(tp->dev_id, 47920acdb986SNicolas Chautru queue_id, &ops_deq[deq], enq - deq); 4793fb5e060eSHernan Vargas time_out++; 4794fb5e060eSHernan Vargas if (time_out >= TIME_OUT_POLL) { 4795fb5e060eSHernan Vargas timeout_exit(tp->dev_id); 4796fb5e060eSHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Enqueue timeout!"); 4797fb5e060eSHernan Vargas } 47980acdb986SNicolas Chautru } 47990acdb986SNicolas Chautru 48000acdb986SNicolas Chautru /* dequeue the remaining */ 4801fb5e060eSHernan Vargas time_out = 0; 48020acdb986SNicolas Chautru while (deq < enq) { 48030acdb986SNicolas Chautru deq += rte_bbdev_dequeue_fft_ops(tp->dev_id, 48040acdb986SNicolas Chautru queue_id, &ops_deq[deq], enq - deq); 4805fb5e060eSHernan Vargas time_out++; 4806fb5e060eSHernan Vargas if (time_out >= TIME_OUT_POLL) { 4807fb5e060eSHernan Vargas timeout_exit(tp->dev_id); 4808fb5e060eSHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!"); 4809fb5e060eSHernan Vargas } 48100acdb986SNicolas Chautru } 48110acdb986SNicolas Chautru 48120acdb986SNicolas Chautru total_time += rte_rdtsc_precise() - start_time; 48130acdb986SNicolas Chautru } 48140acdb986SNicolas Chautru 48150acdb986SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 48160acdb986SNicolas Chautru ret = validate_fft_op(ops_deq, num_ops, ref_op); 48170acdb986SNicolas Chautru TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 48180acdb986SNicolas Chautru } 48190acdb986SNicolas Chautru 48200acdb986SNicolas Chautru rte_bbdev_fft_op_free_bulk(ops_enq, num_ops); 48210acdb986SNicolas Chautru 48220acdb986SNicolas Chautru double tb_len_bits = calc_fft_size(ref_op); 48230acdb986SNicolas Chautru 48240acdb986SNicolas Chautru tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / 48250acdb986SNicolas Chautru ((double)total_time / (double)rte_get_tsc_hz()); 48260acdb986SNicolas Chautru tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) / 48270acdb986SNicolas Chautru 1000000.0) / ((double)total_time / 48280acdb986SNicolas Chautru (double)rte_get_tsc_hz()); 48290acdb986SNicolas Chautru 48300acdb986SNicolas Chautru return TEST_SUCCESS; 48310acdb986SNicolas Chautru } 48320acdb986SNicolas Chautru 483395f192a4SHernan Vargas static int 483495f192a4SHernan Vargas throughput_pmd_lcore_mldts(void *arg) 483595f192a4SHernan Vargas { 483695f192a4SHernan Vargas struct thread_params *tp = arg; 483795f192a4SHernan Vargas uint16_t enq, deq; 483895f192a4SHernan Vargas uint64_t total_time = 0, start_time; 483995f192a4SHernan Vargas const uint16_t queue_id = tp->queue_id; 484095f192a4SHernan Vargas const uint16_t burst_sz = tp->op_params->burst_sz; 484195f192a4SHernan Vargas const uint16_t num_ops = tp->op_params->num_to_process; 484295f192a4SHernan Vargas struct rte_bbdev_mldts_op *ops_enq[num_ops]; 484395f192a4SHernan Vargas struct rte_bbdev_mldts_op *ops_deq[num_ops]; 484495f192a4SHernan Vargas struct rte_bbdev_mldts_op *ref_op = tp->op_params->ref_mldts_op; 484595f192a4SHernan Vargas struct test_buffers *bufs = NULL; 484695f192a4SHernan Vargas int i, j, ret; 484795f192a4SHernan Vargas struct rte_bbdev_info info; 484895f192a4SHernan Vargas uint16_t num_to_enq; 484995f192a4SHernan Vargas 485095f192a4SHernan Vargas TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), "BURST_SIZE should be <= %u", MAX_BURST); 485195f192a4SHernan Vargas 485295f192a4SHernan Vargas rte_bbdev_info_get(tp->dev_id, &info); 485395f192a4SHernan Vargas 485495f192a4SHernan Vargas TEST_ASSERT_SUCCESS((num_ops > info.drv.queue_size_lim), 485595f192a4SHernan Vargas "NUM_OPS cannot exceed %u for this device", 485695f192a4SHernan Vargas info.drv.queue_size_lim); 485795f192a4SHernan Vargas 485895f192a4SHernan Vargas bufs = &tp->op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 485995f192a4SHernan Vargas 4860b6a7e685STyler Retzlaff rte_wait_until_equal_16((uint16_t *)(uintptr_t)&tp->op_params->sync, SYNC_START, 4861b6a7e685STyler Retzlaff rte_memory_order_relaxed); 486295f192a4SHernan Vargas 486395f192a4SHernan Vargas ret = rte_bbdev_mldts_op_alloc_bulk(tp->op_params->mp, ops_enq, num_ops); 486495f192a4SHernan Vargas TEST_ASSERT_SUCCESS(ret, "Allocation failed for %d ops", num_ops); 486595f192a4SHernan Vargas 486695f192a4SHernan Vargas if (test_vector.op_type != RTE_BBDEV_OP_NONE) 486795f192a4SHernan Vargas copy_reference_mldts_op(ops_enq, num_ops, 0, bufs->inputs, bufs->harq_inputs, 486895f192a4SHernan Vargas bufs->hard_outputs, ref_op); 486995f192a4SHernan Vargas 487095f192a4SHernan Vargas /* Set counter to validate the ordering */ 487195f192a4SHernan Vargas for (j = 0; j < num_ops; ++j) 487295f192a4SHernan Vargas ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 487395f192a4SHernan Vargas 487495f192a4SHernan Vargas for (i = 0; i < TEST_REPETITIONS; ++i) { 487595f192a4SHernan Vargas uint32_t time_out = 0; 487695f192a4SHernan Vargas for (j = 0; j < num_ops; ++j) 487795f192a4SHernan Vargas mbuf_reset(ops_enq[j]->mldts.output.data); 487895f192a4SHernan Vargas 487995f192a4SHernan Vargas start_time = rte_rdtsc_precise(); 488095f192a4SHernan Vargas 488195f192a4SHernan Vargas for (enq = 0, deq = 0; enq < num_ops;) { 488295f192a4SHernan Vargas num_to_enq = burst_sz; 488395f192a4SHernan Vargas 488495f192a4SHernan Vargas if (unlikely(num_ops - enq < num_to_enq)) 488595f192a4SHernan Vargas num_to_enq = num_ops - enq; 488695f192a4SHernan Vargas 488795f192a4SHernan Vargas enq += rte_bbdev_enqueue_mldts_ops(tp->dev_id, 488895f192a4SHernan Vargas queue_id, &ops_enq[enq], num_to_enq); 488995f192a4SHernan Vargas 489095f192a4SHernan Vargas deq += rte_bbdev_dequeue_mldts_ops(tp->dev_id, 489195f192a4SHernan Vargas queue_id, &ops_deq[deq], enq - deq); 489295f192a4SHernan Vargas time_out++; 489395f192a4SHernan Vargas if (time_out >= TIME_OUT_POLL) { 489495f192a4SHernan Vargas timeout_exit(tp->dev_id); 489595f192a4SHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Enqueue timeout!"); 489695f192a4SHernan Vargas } 489795f192a4SHernan Vargas } 489895f192a4SHernan Vargas 489995f192a4SHernan Vargas /* dequeue the remaining */ 490095f192a4SHernan Vargas time_out = 0; 490195f192a4SHernan Vargas while (deq < enq) { 490295f192a4SHernan Vargas deq += rte_bbdev_dequeue_mldts_ops(tp->dev_id, 490395f192a4SHernan Vargas queue_id, &ops_deq[deq], enq - deq); 490495f192a4SHernan Vargas time_out++; 490595f192a4SHernan Vargas if (time_out >= TIME_OUT_POLL) { 490695f192a4SHernan Vargas timeout_exit(tp->dev_id); 490795f192a4SHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!"); 490895f192a4SHernan Vargas } 490995f192a4SHernan Vargas } 491095f192a4SHernan Vargas 491195f192a4SHernan Vargas total_time += rte_rdtsc_precise() - start_time; 491295f192a4SHernan Vargas } 491395f192a4SHernan Vargas 491495f192a4SHernan Vargas if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 491595f192a4SHernan Vargas ret = validate_mldts_op(ops_deq, num_ops, ref_op); 491695f192a4SHernan Vargas TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 491795f192a4SHernan Vargas } 491895f192a4SHernan Vargas 491995f192a4SHernan Vargas rte_bbdev_mldts_op_free_bulk(ops_enq, num_ops); 492095f192a4SHernan Vargas 492195f192a4SHernan Vargas double tb_len_bits = calc_mldts_size(ref_op); 492295f192a4SHernan Vargas 492395f192a4SHernan Vargas tp->ops_per_sec = ((double)num_ops * TEST_REPETITIONS) / 492495f192a4SHernan Vargas ((double)total_time / (double)rte_get_tsc_hz()); 492595f192a4SHernan Vargas tp->mbps = (((double)(num_ops * TEST_REPETITIONS * tb_len_bits)) / 492695f192a4SHernan Vargas 1000000.0) / ((double)total_time / 492795f192a4SHernan Vargas (double)rte_get_tsc_hz()); 492895f192a4SHernan Vargas 492995f192a4SHernan Vargas return TEST_SUCCESS; 493095f192a4SHernan Vargas } 493195f192a4SHernan Vargas 4932f714a188SAmr Mokhtar static void 49330b98d574SKamil Chalupnik print_enc_throughput(struct thread_params *t_params, unsigned int used_cores) 4934f714a188SAmr Mokhtar { 4935b2e2aec3SKamil Chalupnik unsigned int iter = 0; 4936f714a188SAmr Mokhtar double total_mops = 0, total_mbps = 0; 4937f714a188SAmr Mokhtar 4938b2e2aec3SKamil Chalupnik for (iter = 0; iter < used_cores; iter++) { 49390b98d574SKamil Chalupnik printf( 49400b98d574SKamil Chalupnik "Throughput for core (%u): %.8lg Ops/s, %.8lg Mbps\n", 4941b2e2aec3SKamil Chalupnik t_params[iter].lcore_id, t_params[iter].ops_per_sec, 4942b2e2aec3SKamil Chalupnik t_params[iter].mbps); 4943b2e2aec3SKamil Chalupnik total_mops += t_params[iter].ops_per_sec; 4944b2e2aec3SKamil Chalupnik total_mbps += t_params[iter].mbps; 4945f714a188SAmr Mokhtar } 4946f714a188SAmr Mokhtar printf( 49479fa6ebdeSKamil Chalupnik "\nTotal throughput for %u cores: %.8lg MOPS, %.8lg Mbps\n", 4948f714a188SAmr Mokhtar used_cores, total_mops, total_mbps); 4949f714a188SAmr Mokhtar } 4950f714a188SAmr Mokhtar 4951f41c6e4dSNicolas Chautru /* Aggregate the performance results over the number of cores used */ 49520b98d574SKamil Chalupnik static void 49530b98d574SKamil Chalupnik print_dec_throughput(struct thread_params *t_params, unsigned int used_cores) 49540b98d574SKamil Chalupnik { 4955f41c6e4dSNicolas Chautru unsigned int core_idx = 0; 49560b98d574SKamil Chalupnik double total_mops = 0, total_mbps = 0; 49570b98d574SKamil Chalupnik uint8_t iter_count = 0; 49580b98d574SKamil Chalupnik 4959f41c6e4dSNicolas Chautru for (core_idx = 0; core_idx < used_cores; core_idx++) { 49600b98d574SKamil Chalupnik printf( 49610b98d574SKamil Chalupnik "Throughput for core (%u): %.8lg Ops/s, %.8lg Mbps @ max %u iterations\n", 4962f41c6e4dSNicolas Chautru t_params[core_idx].lcore_id, 4963f41c6e4dSNicolas Chautru t_params[core_idx].ops_per_sec, 4964f41c6e4dSNicolas Chautru t_params[core_idx].mbps, 4965f41c6e4dSNicolas Chautru t_params[core_idx].iter_count); 4966f41c6e4dSNicolas Chautru total_mops += t_params[core_idx].ops_per_sec; 4967f41c6e4dSNicolas Chautru total_mbps += t_params[core_idx].mbps; 4968f41c6e4dSNicolas Chautru iter_count = RTE_MAX(iter_count, 4969f41c6e4dSNicolas Chautru t_params[core_idx].iter_count); 49700b98d574SKamil Chalupnik } 49710b98d574SKamil Chalupnik printf( 49720b98d574SKamil Chalupnik "\nTotal throughput for %u cores: %.8lg MOPS, %.8lg Mbps @ max %u iterations\n", 49730b98d574SKamil Chalupnik used_cores, total_mops, total_mbps, iter_count); 49740b98d574SKamil Chalupnik } 49750b98d574SKamil Chalupnik 4976f41c6e4dSNicolas Chautru /* Aggregate the performance results over the number of cores used */ 4977f41c6e4dSNicolas Chautru static void 4978f41c6e4dSNicolas Chautru print_dec_bler(struct thread_params *t_params, unsigned int used_cores) 4979f41c6e4dSNicolas Chautru { 4980f41c6e4dSNicolas Chautru unsigned int core_idx = 0; 4981f41c6e4dSNicolas Chautru double total_mbps = 0, total_bler = 0, total_iter = 0; 4982f41c6e4dSNicolas Chautru double snr = get_snr(); 4983f41c6e4dSNicolas Chautru 4984f41c6e4dSNicolas Chautru for (core_idx = 0; core_idx < used_cores; core_idx++) { 4985f41c6e4dSNicolas Chautru printf("Core%u BLER %.1f %% - Iters %.1f - Tp %.1f Mbps %s\n", 4986f41c6e4dSNicolas Chautru t_params[core_idx].lcore_id, 4987f41c6e4dSNicolas Chautru t_params[core_idx].bler * 100, 4988f41c6e4dSNicolas Chautru t_params[core_idx].iter_average, 4989f41c6e4dSNicolas Chautru t_params[core_idx].mbps, 4990f41c6e4dSNicolas Chautru get_vector_filename()); 4991f41c6e4dSNicolas Chautru total_mbps += t_params[core_idx].mbps; 4992f41c6e4dSNicolas Chautru total_bler += t_params[core_idx].bler; 4993f41c6e4dSNicolas Chautru total_iter += t_params[core_idx].iter_average; 4994f41c6e4dSNicolas Chautru } 4995f41c6e4dSNicolas Chautru total_bler /= used_cores; 4996f41c6e4dSNicolas Chautru total_iter /= used_cores; 4997f41c6e4dSNicolas Chautru 49987831a968SHernan Vargas printf("SNR %.2f BLER %.1f %% - Iterations %.1f %d - Tp %.3f Mbps %s\n", 4999f41c6e4dSNicolas Chautru snr, total_bler * 100, total_iter, get_iter_max(), 5000f41c6e4dSNicolas Chautru total_mbps, get_vector_filename()); 5001f41c6e4dSNicolas Chautru } 5002f41c6e4dSNicolas Chautru 5003f41c6e4dSNicolas Chautru /* 5004f41c6e4dSNicolas Chautru * Test function that determines BLER wireless performance 5005f41c6e4dSNicolas Chautru */ 5006f41c6e4dSNicolas Chautru static int 5007f41c6e4dSNicolas Chautru bler_test(struct active_device *ad, 5008f41c6e4dSNicolas Chautru struct test_op_params *op_params) 5009f41c6e4dSNicolas Chautru { 5010f41c6e4dSNicolas Chautru int ret; 5011f41c6e4dSNicolas Chautru unsigned int lcore_id, used_cores = 0; 5012f41c6e4dSNicolas Chautru struct thread_params *t_params; 5013f41c6e4dSNicolas Chautru struct rte_bbdev_info info; 5014f41c6e4dSNicolas Chautru lcore_function_t *bler_function; 5015f41c6e4dSNicolas Chautru uint16_t num_lcores; 5016f41c6e4dSNicolas Chautru const char *op_type_str; 5017f41c6e4dSNicolas Chautru 5018f41c6e4dSNicolas Chautru rte_bbdev_info_get(ad->dev_id, &info); 5019f41c6e4dSNicolas Chautru 5020f41c6e4dSNicolas Chautru op_type_str = rte_bbdev_op_type_str(test_vector.op_type); 5021f41c6e4dSNicolas Chautru TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", 5022f41c6e4dSNicolas Chautru test_vector.op_type); 5023f41c6e4dSNicolas Chautru 5024f41c6e4dSNicolas Chautru printf("+ ------------------------------------------------------- +\n"); 5025f41c6e4dSNicolas Chautru printf("== test: bler\ndev: %s, nb_queues: %u, burst size: %u, num ops: %u, num_lcores: %u, op type: %s, itr mode: %s, GHz: %lg\n", 5026f41c6e4dSNicolas Chautru info.dev_name, ad->nb_queues, op_params->burst_sz, 5027f41c6e4dSNicolas Chautru op_params->num_to_process, op_params->num_lcores, 5028f41c6e4dSNicolas Chautru op_type_str, 5029f41c6e4dSNicolas Chautru intr_enabled ? "Interrupt mode" : "PMD mode", 5030f41c6e4dSNicolas Chautru (double)rte_get_tsc_hz() / 1000000000.0); 5031f41c6e4dSNicolas Chautru 5032f41c6e4dSNicolas Chautru /* Set number of lcores */ 5033f41c6e4dSNicolas Chautru num_lcores = (ad->nb_queues < (op_params->num_lcores)) 5034f41c6e4dSNicolas Chautru ? ad->nb_queues 5035f41c6e4dSNicolas Chautru : op_params->num_lcores; 5036f41c6e4dSNicolas Chautru 5037f41c6e4dSNicolas Chautru /* Allocate memory for thread parameters structure */ 5038f41c6e4dSNicolas Chautru t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), 5039f41c6e4dSNicolas Chautru RTE_CACHE_LINE_SIZE); 5040f41c6e4dSNicolas Chautru TEST_ASSERT_NOT_NULL(t_params, "Failed to alloc %zuB for t_params", 5041f41c6e4dSNicolas Chautru RTE_ALIGN(sizeof(struct thread_params) * num_lcores, 5042f41c6e4dSNicolas Chautru RTE_CACHE_LINE_SIZE)); 5043f41c6e4dSNicolas Chautru 50447456706aSNicolas Chautru if ((test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) && 50457456706aSNicolas Chautru !check_bit(test_vector.ldpc_dec.op_flags, 50467456706aSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_LOOPBACK) 50477456706aSNicolas Chautru && !check_bit(test_vector.ldpc_dec.op_flags, 50487456706aSNicolas Chautru RTE_BBDEV_LDPC_LLR_COMPRESSION)) 5049f41c6e4dSNicolas Chautru bler_function = bler_pmd_lcore_ldpc_dec; 50507831a968SHernan Vargas else if ((test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) && 50517831a968SHernan Vargas !check_bit(test_vector.turbo_dec.op_flags, 50527831a968SHernan Vargas RTE_BBDEV_TURBO_SOFT_OUTPUT)) 50537831a968SHernan Vargas bler_function = bler_pmd_lcore_turbo_dec; 5054f41c6e4dSNicolas Chautru else 5055f41c6e4dSNicolas Chautru return TEST_SKIPPED; 5056f41c6e4dSNicolas Chautru 5057b6a7e685STyler Retzlaff rte_atomic_store_explicit(&op_params->sync, SYNC_WAIT, rte_memory_order_relaxed); 5058f41c6e4dSNicolas Chautru 5059cb056611SStephen Hemminger /* Main core is set at first entry */ 5060f41c6e4dSNicolas Chautru t_params[0].dev_id = ad->dev_id; 5061f41c6e4dSNicolas Chautru t_params[0].lcore_id = rte_lcore_id(); 5062f41c6e4dSNicolas Chautru t_params[0].op_params = op_params; 5063f41c6e4dSNicolas Chautru t_params[0].queue_id = ad->queue_ids[used_cores++]; 5064f41c6e4dSNicolas Chautru t_params[0].iter_count = 0; 5065f41c6e4dSNicolas Chautru 5066cb056611SStephen Hemminger RTE_LCORE_FOREACH_WORKER(lcore_id) { 5067f41c6e4dSNicolas Chautru if (used_cores >= num_lcores) 5068f41c6e4dSNicolas Chautru break; 5069f41c6e4dSNicolas Chautru 5070f41c6e4dSNicolas Chautru t_params[used_cores].dev_id = ad->dev_id; 5071f41c6e4dSNicolas Chautru t_params[used_cores].lcore_id = lcore_id; 5072f41c6e4dSNicolas Chautru t_params[used_cores].op_params = op_params; 5073f41c6e4dSNicolas Chautru t_params[used_cores].queue_id = ad->queue_ids[used_cores]; 5074f41c6e4dSNicolas Chautru t_params[used_cores].iter_count = 0; 5075f41c6e4dSNicolas Chautru 5076f41c6e4dSNicolas Chautru rte_eal_remote_launch(bler_function, 5077f41c6e4dSNicolas Chautru &t_params[used_cores++], lcore_id); 5078f41c6e4dSNicolas Chautru } 5079f41c6e4dSNicolas Chautru 5080b6a7e685STyler Retzlaff rte_atomic_store_explicit(&op_params->sync, SYNC_START, rte_memory_order_relaxed); 5081f41c6e4dSNicolas Chautru ret = bler_function(&t_params[0]); 5082f41c6e4dSNicolas Chautru 5083cb056611SStephen Hemminger /* Main core is always used */ 5084f41c6e4dSNicolas Chautru for (used_cores = 1; used_cores < num_lcores; used_cores++) 5085f41c6e4dSNicolas Chautru ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id); 5086f41c6e4dSNicolas Chautru 5087f41c6e4dSNicolas Chautru print_dec_bler(t_params, num_lcores); 5088f41c6e4dSNicolas Chautru 5089f41c6e4dSNicolas Chautru /* Return if test failed */ 5090f41c6e4dSNicolas Chautru if (ret) { 5091f41c6e4dSNicolas Chautru rte_free(t_params); 5092f41c6e4dSNicolas Chautru return ret; 5093f41c6e4dSNicolas Chautru } 5094f41c6e4dSNicolas Chautru 5095f41c6e4dSNicolas Chautru /* Function to print something here*/ 5096f41c6e4dSNicolas Chautru rte_free(t_params); 5097f41c6e4dSNicolas Chautru return ret; 5098f41c6e4dSNicolas Chautru } 5099f41c6e4dSNicolas Chautru 5100f714a188SAmr Mokhtar /* 5101f714a188SAmr Mokhtar * Test function that determines how long an enqueue + dequeue of a burst 5102f714a188SAmr Mokhtar * takes on available lcores. 5103f714a188SAmr Mokhtar */ 5104f714a188SAmr Mokhtar static int 5105f714a188SAmr Mokhtar throughput_test(struct active_device *ad, 5106f714a188SAmr Mokhtar struct test_op_params *op_params) 5107f714a188SAmr Mokhtar { 5108f714a188SAmr Mokhtar int ret; 5109f714a188SAmr Mokhtar unsigned int lcore_id, used_cores = 0; 5110b2e2aec3SKamil Chalupnik struct thread_params *t_params, *tp; 5111f714a188SAmr Mokhtar struct rte_bbdev_info info; 5112f714a188SAmr Mokhtar lcore_function_t *throughput_function; 5113f714a188SAmr Mokhtar uint16_t num_lcores; 5114f714a188SAmr Mokhtar const char *op_type_str; 5115f714a188SAmr Mokhtar 5116f714a188SAmr Mokhtar rte_bbdev_info_get(ad->dev_id, &info); 5117f714a188SAmr Mokhtar 5118f714a188SAmr Mokhtar op_type_str = rte_bbdev_op_type_str(test_vector.op_type); 5119f714a188SAmr Mokhtar TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", 5120f714a188SAmr Mokhtar test_vector.op_type); 5121f714a188SAmr Mokhtar 5122d819c083SNicolas Chautru printf("+ ------------------------------------------------------- +\n"); 5123d819c083SNicolas Chautru 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", 5124f714a188SAmr Mokhtar info.dev_name, ad->nb_queues, op_params->burst_sz, 5125f714a188SAmr Mokhtar op_params->num_to_process, op_params->num_lcores, 5126f714a188SAmr Mokhtar op_type_str, 5127f714a188SAmr Mokhtar intr_enabled ? "Interrupt mode" : "PMD mode", 5128f714a188SAmr Mokhtar (double)rte_get_tsc_hz() / 1000000000.0); 5129f714a188SAmr Mokhtar 5130f714a188SAmr Mokhtar /* Set number of lcores */ 5131f714a188SAmr Mokhtar num_lcores = (ad->nb_queues < (op_params->num_lcores)) 5132f714a188SAmr Mokhtar ? ad->nb_queues 5133f714a188SAmr Mokhtar : op_params->num_lcores; 5134f714a188SAmr Mokhtar 5135b2e2aec3SKamil Chalupnik /* Allocate memory for thread parameters structure */ 5136b2e2aec3SKamil Chalupnik t_params = rte_zmalloc(NULL, num_lcores * sizeof(struct thread_params), 5137b2e2aec3SKamil Chalupnik RTE_CACHE_LINE_SIZE); 5138b2e2aec3SKamil Chalupnik TEST_ASSERT_NOT_NULL(t_params, "Failed to alloc %zuB for t_params", 5139b2e2aec3SKamil Chalupnik RTE_ALIGN(sizeof(struct thread_params) * num_lcores, 5140b2e2aec3SKamil Chalupnik RTE_CACHE_LINE_SIZE)); 5141b2e2aec3SKamil Chalupnik 5142f714a188SAmr Mokhtar if (intr_enabled) { 5143f714a188SAmr Mokhtar if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) 5144f714a188SAmr Mokhtar throughput_function = throughput_intr_lcore_dec; 5145d819c083SNicolas Chautru else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) 5146f162c475SNicolas Chautru throughput_function = throughput_intr_lcore_ldpc_dec; 5147d819c083SNicolas Chautru else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) 5148d819c083SNicolas Chautru throughput_function = throughput_intr_lcore_enc; 5149d819c083SNicolas Chautru else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) 5150f162c475SNicolas Chautru throughput_function = throughput_intr_lcore_ldpc_enc; 51510acdb986SNicolas Chautru else if (test_vector.op_type == RTE_BBDEV_OP_FFT) 51520acdb986SNicolas Chautru throughput_function = throughput_intr_lcore_fft; 515395f192a4SHernan Vargas else if (test_vector.op_type == RTE_BBDEV_OP_MLDTS) 515495f192a4SHernan Vargas throughput_function = throughput_intr_lcore_mldts; 5155f714a188SAmr Mokhtar else 5156f714a188SAmr Mokhtar throughput_function = throughput_intr_lcore_enc; 5157f714a188SAmr Mokhtar 5158f714a188SAmr Mokhtar /* Dequeue interrupt callback registration */ 5159d3345d40SAmr Mokhtar ret = rte_bbdev_callback_register(ad->dev_id, 5160d3345d40SAmr Mokhtar RTE_BBDEV_EVENT_DEQUEUE, dequeue_event_callback, 5161b2e2aec3SKamil Chalupnik t_params); 5162b2e2aec3SKamil Chalupnik if (ret < 0) { 5163b2e2aec3SKamil Chalupnik rte_free(t_params); 5164d3345d40SAmr Mokhtar return ret; 5165b2e2aec3SKamil Chalupnik } 5166f714a188SAmr Mokhtar } else { 5167f714a188SAmr Mokhtar if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC) 5168f714a188SAmr Mokhtar throughput_function = throughput_pmd_lcore_dec; 5169d819c083SNicolas Chautru else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) 5170d819c083SNicolas Chautru throughput_function = throughput_pmd_lcore_ldpc_dec; 5171d819c083SNicolas Chautru else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC) 5172d819c083SNicolas Chautru throughput_function = throughput_pmd_lcore_enc; 5173d819c083SNicolas Chautru else if (test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) 5174d819c083SNicolas Chautru throughput_function = throughput_pmd_lcore_ldpc_enc; 51750acdb986SNicolas Chautru else if (test_vector.op_type == RTE_BBDEV_OP_FFT) 51760acdb986SNicolas Chautru throughput_function = throughput_pmd_lcore_fft; 517795f192a4SHernan Vargas else if (test_vector.op_type == RTE_BBDEV_OP_MLDTS) 517895f192a4SHernan Vargas throughput_function = throughput_pmd_lcore_mldts; 5179f714a188SAmr Mokhtar else 5180f714a188SAmr Mokhtar throughput_function = throughput_pmd_lcore_enc; 5181f714a188SAmr Mokhtar } 5182f714a188SAmr Mokhtar 5183b6a7e685STyler Retzlaff rte_atomic_store_explicit(&op_params->sync, SYNC_WAIT, rte_memory_order_relaxed); 5184f714a188SAmr Mokhtar 5185cb056611SStephen Hemminger /* Main core is set at first entry */ 5186b2e2aec3SKamil Chalupnik t_params[0].dev_id = ad->dev_id; 5187b2e2aec3SKamil Chalupnik t_params[0].lcore_id = rte_lcore_id(); 5188b2e2aec3SKamil Chalupnik t_params[0].op_params = op_params; 5189b2e2aec3SKamil Chalupnik t_params[0].queue_id = ad->queue_ids[used_cores++]; 5190b2e2aec3SKamil Chalupnik t_params[0].iter_count = 0; 5191f714a188SAmr Mokhtar 5192cb056611SStephen Hemminger RTE_LCORE_FOREACH_WORKER(lcore_id) { 5193f714a188SAmr Mokhtar if (used_cores >= num_lcores) 5194f714a188SAmr Mokhtar break; 5195f714a188SAmr Mokhtar 5196b2e2aec3SKamil Chalupnik t_params[used_cores].dev_id = ad->dev_id; 5197b2e2aec3SKamil Chalupnik t_params[used_cores].lcore_id = lcore_id; 5198b2e2aec3SKamil Chalupnik t_params[used_cores].op_params = op_params; 5199b2e2aec3SKamil Chalupnik t_params[used_cores].queue_id = ad->queue_ids[used_cores]; 5200b2e2aec3SKamil Chalupnik t_params[used_cores].iter_count = 0; 5201f714a188SAmr Mokhtar 5202b2e2aec3SKamil Chalupnik rte_eal_remote_launch(throughput_function, 5203b2e2aec3SKamil Chalupnik &t_params[used_cores++], lcore_id); 5204f714a188SAmr Mokhtar } 5205f714a188SAmr Mokhtar 5206b6a7e685STyler Retzlaff rte_atomic_store_explicit(&op_params->sync, SYNC_START, rte_memory_order_relaxed); 5207b2e2aec3SKamil Chalupnik ret = throughput_function(&t_params[0]); 5208f714a188SAmr Mokhtar 5209cb056611SStephen Hemminger /* Main core is always used */ 5210b2e2aec3SKamil Chalupnik for (used_cores = 1; used_cores < num_lcores; used_cores++) 5211b2e2aec3SKamil Chalupnik ret |= rte_eal_wait_lcore(t_params[used_cores].lcore_id); 5212f714a188SAmr Mokhtar 5213f714a188SAmr Mokhtar /* Return if test failed */ 5214b2e2aec3SKamil Chalupnik if (ret) { 5215b2e2aec3SKamil Chalupnik rte_free(t_params); 5216f714a188SAmr Mokhtar return ret; 5217b2e2aec3SKamil Chalupnik } 5218f714a188SAmr Mokhtar 5219f714a188SAmr Mokhtar /* Print throughput if interrupts are disabled and test passed */ 5220f714a188SAmr Mokhtar if (!intr_enabled) { 5221d819c083SNicolas Chautru if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC || 5222d819c083SNicolas Chautru test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) 52230b98d574SKamil Chalupnik print_dec_throughput(t_params, num_lcores); 52240b98d574SKamil Chalupnik else 52250b98d574SKamil Chalupnik print_enc_throughput(t_params, num_lcores); 5226b2e2aec3SKamil Chalupnik rte_free(t_params); 5227f714a188SAmr Mokhtar return ret; 5228f714a188SAmr Mokhtar } 5229f714a188SAmr Mokhtar 5230f714a188SAmr Mokhtar /* In interrupt TC we need to wait for the interrupt callback to deqeue 5231f714a188SAmr Mokhtar * all pending operations. Skip waiting for queues which reported an 5232f714a188SAmr Mokhtar * error using processing_status variable. 5233cb056611SStephen Hemminger * Wait for main lcore operations. 5234f714a188SAmr Mokhtar */ 5235b2e2aec3SKamil Chalupnik tp = &t_params[0]; 5236b6a7e685STyler Retzlaff while ((rte_atomic_load_explicit(&tp->nb_dequeued, rte_memory_order_relaxed) < 5237f714a188SAmr Mokhtar op_params->num_to_process) && 5238b6a7e685STyler Retzlaff (rte_atomic_load_explicit(&tp->processing_status, rte_memory_order_relaxed) != 5239f714a188SAmr Mokhtar TEST_FAILED)) 5240f714a188SAmr Mokhtar rte_pause(); 5241f714a188SAmr Mokhtar 5242b2e2aec3SKamil Chalupnik tp->ops_per_sec /= TEST_REPETITIONS; 5243b2e2aec3SKamil Chalupnik tp->mbps /= TEST_REPETITIONS; 5244b6a7e685STyler Retzlaff ret |= (int)rte_atomic_load_explicit(&tp->processing_status, rte_memory_order_relaxed); 5245f714a188SAmr Mokhtar 5246cb056611SStephen Hemminger /* Wait for worker lcores operations */ 5247b2e2aec3SKamil Chalupnik for (used_cores = 1; used_cores < num_lcores; used_cores++) { 5248b2e2aec3SKamil Chalupnik tp = &t_params[used_cores]; 5249f714a188SAmr Mokhtar 5250b6a7e685STyler Retzlaff while ((rte_atomic_load_explicit(&tp->nb_dequeued, rte_memory_order_relaxed) < 5251f714a188SAmr Mokhtar op_params->num_to_process) && 5252b6a7e685STyler Retzlaff (rte_atomic_load_explicit(&tp->processing_status, 5253b6a7e685STyler Retzlaff rte_memory_order_relaxed) != TEST_FAILED)) 5254f714a188SAmr Mokhtar rte_pause(); 5255f714a188SAmr Mokhtar 5256b2e2aec3SKamil Chalupnik tp->ops_per_sec /= TEST_REPETITIONS; 5257b2e2aec3SKamil Chalupnik tp->mbps /= TEST_REPETITIONS; 5258b6a7e685STyler Retzlaff ret |= (int)rte_atomic_load_explicit(&tp->processing_status, 5259b6a7e685STyler Retzlaff rte_memory_order_relaxed); 5260f714a188SAmr Mokhtar } 5261f714a188SAmr Mokhtar 5262f714a188SAmr Mokhtar /* Print throughput if test passed */ 52630b98d574SKamil Chalupnik if (!ret) { 5264d819c083SNicolas Chautru if (test_vector.op_type == RTE_BBDEV_OP_TURBO_DEC || 5265d819c083SNicolas Chautru test_vector.op_type == RTE_BBDEV_OP_LDPC_DEC) 52660b98d574SKamil Chalupnik print_dec_throughput(t_params, num_lcores); 5267d819c083SNicolas Chautru else if (test_vector.op_type == RTE_BBDEV_OP_TURBO_ENC || 5268d819c083SNicolas Chautru test_vector.op_type == RTE_BBDEV_OP_LDPC_ENC) 52690b98d574SKamil Chalupnik print_enc_throughput(t_params, num_lcores); 52700b98d574SKamil Chalupnik } 5271b2e2aec3SKamil Chalupnik 5272b2e2aec3SKamil Chalupnik rte_free(t_params); 5273f714a188SAmr Mokhtar return ret; 5274f714a188SAmr Mokhtar } 5275f714a188SAmr Mokhtar 5276f714a188SAmr Mokhtar static int 5277864edd69SKamil Chalupnik latency_test_dec(struct rte_mempool *mempool, 5278f714a188SAmr Mokhtar struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op, 5279de2ce637SHernan Vargas uint16_t dev_id, uint16_t queue_id, 5280f714a188SAmr Mokhtar const uint16_t num_to_process, uint16_t burst_sz, 52813073445dSHernan Vargas uint64_t *total_time, uint64_t *min_time, uint64_t *max_time, bool disable_et) 5282f714a188SAmr Mokhtar { 5283f714a188SAmr Mokhtar int ret = TEST_SUCCESS; 5284f714a188SAmr Mokhtar uint16_t i, j, dequeued; 5285f714a188SAmr Mokhtar struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 5286864edd69SKamil Chalupnik uint64_t start_time = 0, last_time = 0; 5287f714a188SAmr Mokhtar 5288f714a188SAmr Mokhtar for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 5289f714a188SAmr Mokhtar uint16_t enq = 0, deq = 0; 5290fb5e060eSHernan Vargas uint32_t time_out = 0; 5291f714a188SAmr Mokhtar bool first_time = true; 5292864edd69SKamil Chalupnik last_time = 0; 5293f714a188SAmr Mokhtar 5294f714a188SAmr Mokhtar if (unlikely(num_to_process - dequeued < burst_sz)) 5295f714a188SAmr Mokhtar burst_sz = num_to_process - dequeued; 5296f714a188SAmr Mokhtar 5297b1bc4217SKamil Chalupnik ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); 52983073445dSHernan Vargas TEST_ASSERT_SUCCESS(ret, "rte_bbdev_dec_op_alloc_bulk() failed"); 52993073445dSHernan Vargas 53003073445dSHernan Vargas ref_op->turbo_dec.iter_max = get_iter_max(); 53013073445dSHernan Vargas /* For validation tests we want to enable early termination */ 53023073445dSHernan Vargas if (!disable_et && !check_bit(ref_op->turbo_dec.op_flags, 53033073445dSHernan Vargas RTE_BBDEV_TURBO_EARLY_TERMINATION)) 53043073445dSHernan Vargas ref_op->turbo_dec.op_flags |= RTE_BBDEV_TURBO_EARLY_TERMINATION; 53053073445dSHernan Vargas 5306f714a188SAmr Mokhtar if (test_vector.op_type != RTE_BBDEV_OP_NONE) 5307f714a188SAmr Mokhtar copy_reference_dec_op(ops_enq, burst_sz, dequeued, 5308f714a188SAmr Mokhtar bufs->inputs, 5309f714a188SAmr Mokhtar bufs->hard_outputs, 5310f714a188SAmr Mokhtar bufs->soft_outputs, 5311f714a188SAmr Mokhtar ref_op); 5312f714a188SAmr Mokhtar 5313f714a188SAmr Mokhtar /* Set counter to validate the ordering */ 5314f714a188SAmr Mokhtar for (j = 0; j < burst_sz; ++j) 5315f714a188SAmr Mokhtar ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 5316f714a188SAmr Mokhtar 5317f714a188SAmr Mokhtar start_time = rte_rdtsc_precise(); 5318f714a188SAmr Mokhtar 5319f714a188SAmr Mokhtar enq = rte_bbdev_enqueue_dec_ops(dev_id, queue_id, &ops_enq[enq], 5320f714a188SAmr Mokhtar burst_sz); 5321f714a188SAmr Mokhtar TEST_ASSERT(enq == burst_sz, 5322f714a188SAmr Mokhtar "Error enqueueing burst, expected %u, got %u", 5323f714a188SAmr Mokhtar burst_sz, enq); 5324f714a188SAmr Mokhtar 5325f714a188SAmr Mokhtar /* Dequeue */ 5326f714a188SAmr Mokhtar do { 5327f714a188SAmr Mokhtar deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, 5328f714a188SAmr Mokhtar &ops_deq[deq], burst_sz - deq); 5329f714a188SAmr Mokhtar if (likely(first_time && (deq > 0))) { 5330864edd69SKamil Chalupnik last_time = rte_rdtsc_precise() - start_time; 5331f714a188SAmr Mokhtar first_time = false; 5332f714a188SAmr Mokhtar } 5333fb5e060eSHernan Vargas time_out++; 5334fb5e060eSHernan Vargas if (time_out >= TIME_OUT_POLL) { 5335fb5e060eSHernan Vargas timeout_exit(dev_id); 5336fb5e060eSHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!"); 5337fb5e060eSHernan Vargas } 5338f714a188SAmr Mokhtar } while (unlikely(burst_sz != deq)); 5339f714a188SAmr Mokhtar 5340864edd69SKamil Chalupnik *max_time = RTE_MAX(*max_time, last_time); 5341864edd69SKamil Chalupnik *min_time = RTE_MIN(*min_time, last_time); 5342864edd69SKamil Chalupnik *total_time += last_time; 5343864edd69SKamil Chalupnik 5344f714a188SAmr Mokhtar if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 5345de2ce637SHernan Vargas ret = validate_dec_op(ops_deq, burst_sz, ref_op); 5346f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 5347f714a188SAmr Mokhtar } 5348f714a188SAmr Mokhtar 5349f714a188SAmr Mokhtar rte_bbdev_dec_op_free_bulk(ops_enq, deq); 5350f714a188SAmr Mokhtar dequeued += deq; 5351f714a188SAmr Mokhtar } 5352f714a188SAmr Mokhtar 5353f714a188SAmr Mokhtar return i; 5354f714a188SAmr Mokhtar } 5355f714a188SAmr Mokhtar 53560ab66275SNicolas Chautru /* Test case for latency/validation for LDPC Decoder */ 5357f714a188SAmr Mokhtar static int 5358d819c083SNicolas Chautru latency_test_ldpc_dec(struct rte_mempool *mempool, 5359d819c083SNicolas Chautru struct test_buffers *bufs, struct rte_bbdev_dec_op *ref_op, 5360d819c083SNicolas Chautru int vector_mask, uint16_t dev_id, uint16_t queue_id, 5361d819c083SNicolas Chautru const uint16_t num_to_process, uint16_t burst_sz, 53620ab66275SNicolas Chautru uint64_t *total_time, uint64_t *min_time, uint64_t *max_time, 53630ab66275SNicolas Chautru bool disable_et) 5364d819c083SNicolas Chautru { 5365d819c083SNicolas Chautru int ret = TEST_SUCCESS; 5366d819c083SNicolas Chautru uint16_t i, j, dequeued; 5367d819c083SNicolas Chautru struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 5368d819c083SNicolas Chautru uint64_t start_time = 0, last_time = 0; 5369335c11fdSNicolas Chautru bool extDdr = ldpc_cap_flags & 5370335c11fdSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; 5371d819c083SNicolas Chautru 5372d819c083SNicolas Chautru for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 5373d819c083SNicolas Chautru uint16_t enq = 0, deq = 0; 5374d1bfc723SHernan Vargas uint32_t time_out = 0; 5375d819c083SNicolas Chautru bool first_time = true; 5376d819c083SNicolas Chautru last_time = 0; 5377d819c083SNicolas Chautru 5378d819c083SNicolas Chautru if (unlikely(num_to_process - dequeued < burst_sz)) 5379d819c083SNicolas Chautru burst_sz = num_to_process - dequeued; 5380d819c083SNicolas Chautru 5381d819c083SNicolas Chautru ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); 5382d819c083SNicolas Chautru TEST_ASSERT_SUCCESS(ret, 5383d819c083SNicolas Chautru "rte_bbdev_dec_op_alloc_bulk() failed"); 5384335c11fdSNicolas Chautru 5385335c11fdSNicolas Chautru /* For latency tests we need to disable early termination */ 53860ab66275SNicolas Chautru if (disable_et && check_bit(ref_op->ldpc_dec.op_flags, 5387335c11fdSNicolas Chautru RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE)) 53883073445dSHernan Vargas ref_op->ldpc_dec.op_flags -= RTE_BBDEV_LDPC_ITERATION_STOP_ENABLE; 53893073445dSHernan Vargas 5390f41c6e4dSNicolas Chautru ref_op->ldpc_dec.iter_max = get_iter_max(); 53913073445dSHernan Vargas /* When ET is disabled, the expected iter_count is iter_max */ 53923073445dSHernan Vargas if (disable_et) 5393335c11fdSNicolas Chautru ref_op->ldpc_dec.iter_count = ref_op->ldpc_dec.iter_max; 5394335c11fdSNicolas Chautru 5395d819c083SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) 5396d819c083SNicolas Chautru copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued, 5397d819c083SNicolas Chautru bufs->inputs, 5398d819c083SNicolas Chautru bufs->hard_outputs, 5399d819c083SNicolas Chautru bufs->soft_outputs, 5400d819c083SNicolas Chautru bufs->harq_inputs, 5401d819c083SNicolas Chautru bufs->harq_outputs, 5402d819c083SNicolas Chautru ref_op); 5403d819c083SNicolas Chautru 5404335c11fdSNicolas Chautru if (extDdr) 5405335c11fdSNicolas Chautru preload_harq_ddr(dev_id, queue_id, ops_enq, 5406335c11fdSNicolas Chautru burst_sz, true); 5407335c11fdSNicolas Chautru 5408d819c083SNicolas Chautru /* Set counter to validate the ordering */ 5409d819c083SNicolas Chautru for (j = 0; j < burst_sz; ++j) 5410d819c083SNicolas Chautru ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 5411d819c083SNicolas Chautru 5412d819c083SNicolas Chautru start_time = rte_rdtsc_precise(); 5413d819c083SNicolas Chautru 5414d819c083SNicolas Chautru enq = rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, 5415d819c083SNicolas Chautru &ops_enq[enq], burst_sz); 5416d819c083SNicolas Chautru TEST_ASSERT(enq == burst_sz, 5417d819c083SNicolas Chautru "Error enqueueing burst, expected %u, got %u", 5418d819c083SNicolas Chautru burst_sz, enq); 5419d819c083SNicolas Chautru 5420d819c083SNicolas Chautru /* Dequeue */ 5421d819c083SNicolas Chautru do { 5422d819c083SNicolas Chautru deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, 5423d819c083SNicolas Chautru &ops_deq[deq], burst_sz - deq); 5424d819c083SNicolas Chautru if (likely(first_time && (deq > 0))) { 5425d819c083SNicolas Chautru last_time = rte_rdtsc_precise() - start_time; 5426d819c083SNicolas Chautru first_time = false; 5427d819c083SNicolas Chautru } 5428d1bfc723SHernan Vargas time_out++; 5429fb5e060eSHernan Vargas if (time_out >= TIME_OUT_POLL) { 5430fb5e060eSHernan Vargas timeout_exit(dev_id); 5431fb5e060eSHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!"); 5432fb5e060eSHernan Vargas } 5433fb5e060eSHernan Vargas } while (unlikely(burst_sz != deq)); 5434d819c083SNicolas Chautru 5435d819c083SNicolas Chautru *max_time = RTE_MAX(*max_time, last_time); 5436d819c083SNicolas Chautru *min_time = RTE_MIN(*min_time, last_time); 5437d819c083SNicolas Chautru *total_time += last_time; 5438d819c083SNicolas Chautru 5439335c11fdSNicolas Chautru if (extDdr) 5440335c11fdSNicolas Chautru retrieve_harq_ddr(dev_id, queue_id, ops_enq, burst_sz); 5441335c11fdSNicolas Chautru 5442fb5e060eSHernan Vargas if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 5443fb5e060eSHernan Vargas ret = validate_ldpc_dec_op(ops_deq, burst_sz, ref_op, vector_mask); 5444d819c083SNicolas Chautru TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 5445d819c083SNicolas Chautru } 5446d819c083SNicolas Chautru 5447d819c083SNicolas Chautru rte_bbdev_dec_op_free_bulk(ops_enq, deq); 5448d819c083SNicolas Chautru dequeued += deq; 5449d819c083SNicolas Chautru } 5450d819c083SNicolas Chautru return i; 5451d819c083SNicolas Chautru } 5452d819c083SNicolas Chautru 5453d819c083SNicolas Chautru static int 5454864edd69SKamil Chalupnik latency_test_enc(struct rte_mempool *mempool, 5455f714a188SAmr Mokhtar struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op, 5456f714a188SAmr Mokhtar uint16_t dev_id, uint16_t queue_id, 5457f714a188SAmr Mokhtar const uint16_t num_to_process, uint16_t burst_sz, 5458864edd69SKamil Chalupnik uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) 5459f714a188SAmr Mokhtar { 5460f714a188SAmr Mokhtar int ret = TEST_SUCCESS; 5461f714a188SAmr Mokhtar uint16_t i, j, dequeued; 5462f714a188SAmr Mokhtar struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 5463864edd69SKamil Chalupnik uint64_t start_time = 0, last_time = 0; 5464f714a188SAmr Mokhtar 5465f714a188SAmr Mokhtar for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 5466f714a188SAmr Mokhtar uint16_t enq = 0, deq = 0; 5467d1bfc723SHernan Vargas uint32_t time_out = 0; 5468f714a188SAmr Mokhtar bool first_time = true; 5469864edd69SKamil Chalupnik last_time = 0; 5470f714a188SAmr Mokhtar 5471f714a188SAmr Mokhtar if (unlikely(num_to_process - dequeued < burst_sz)) 5472f714a188SAmr Mokhtar burst_sz = num_to_process - dequeued; 5473f714a188SAmr Mokhtar 5474b1bc4217SKamil Chalupnik ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); 5475b1bc4217SKamil Chalupnik TEST_ASSERT_SUCCESS(ret, 5476b1bc4217SKamil Chalupnik "rte_bbdev_enc_op_alloc_bulk() failed"); 5477f714a188SAmr Mokhtar if (test_vector.op_type != RTE_BBDEV_OP_NONE) 5478f714a188SAmr Mokhtar copy_reference_enc_op(ops_enq, burst_sz, dequeued, 5479f714a188SAmr Mokhtar bufs->inputs, 5480f714a188SAmr Mokhtar bufs->hard_outputs, 5481f714a188SAmr Mokhtar ref_op); 5482f714a188SAmr Mokhtar 5483f714a188SAmr Mokhtar /* Set counter to validate the ordering */ 5484f714a188SAmr Mokhtar for (j = 0; j < burst_sz; ++j) 5485f714a188SAmr Mokhtar ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 5486f714a188SAmr Mokhtar 5487f714a188SAmr Mokhtar start_time = rte_rdtsc_precise(); 5488f714a188SAmr Mokhtar 5489f714a188SAmr Mokhtar enq = rte_bbdev_enqueue_enc_ops(dev_id, queue_id, &ops_enq[enq], 5490f714a188SAmr Mokhtar burst_sz); 5491f714a188SAmr Mokhtar TEST_ASSERT(enq == burst_sz, 5492f714a188SAmr Mokhtar "Error enqueueing burst, expected %u, got %u", 5493f714a188SAmr Mokhtar burst_sz, enq); 5494f714a188SAmr Mokhtar 5495f714a188SAmr Mokhtar /* Dequeue */ 5496f714a188SAmr Mokhtar do { 5497f714a188SAmr Mokhtar deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, 5498f714a188SAmr Mokhtar &ops_deq[deq], burst_sz - deq); 5499f714a188SAmr Mokhtar if (likely(first_time && (deq > 0))) { 5500864edd69SKamil Chalupnik last_time += rte_rdtsc_precise() - start_time; 5501f714a188SAmr Mokhtar first_time = false; 5502f714a188SAmr Mokhtar } 5503d1bfc723SHernan Vargas time_out++; 5504fb5e060eSHernan Vargas if (time_out >= TIME_OUT_POLL) { 5505fb5e060eSHernan Vargas timeout_exit(dev_id); 5506fb5e060eSHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!"); 5507fb5e060eSHernan Vargas } 5508fb5e060eSHernan Vargas } while (unlikely(burst_sz != deq)); 5509f714a188SAmr Mokhtar 5510864edd69SKamil Chalupnik *max_time = RTE_MAX(*max_time, last_time); 5511864edd69SKamil Chalupnik *min_time = RTE_MIN(*min_time, last_time); 5512864edd69SKamil Chalupnik *total_time += last_time; 5513fb5e060eSHernan Vargas 5514fb5e060eSHernan Vargas if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 5515f714a188SAmr Mokhtar ret = validate_enc_op(ops_deq, burst_sz, ref_op); 5516f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 5517f714a188SAmr Mokhtar } 5518f714a188SAmr Mokhtar 5519f714a188SAmr Mokhtar rte_bbdev_enc_op_free_bulk(ops_enq, deq); 5520f714a188SAmr Mokhtar dequeued += deq; 5521f714a188SAmr Mokhtar } 5522f714a188SAmr Mokhtar 5523f714a188SAmr Mokhtar return i; 5524f714a188SAmr Mokhtar } 5525f714a188SAmr Mokhtar 5526f714a188SAmr Mokhtar static int 5527d819c083SNicolas Chautru latency_test_ldpc_enc(struct rte_mempool *mempool, 5528d819c083SNicolas Chautru struct test_buffers *bufs, struct rte_bbdev_enc_op *ref_op, 5529d819c083SNicolas Chautru uint16_t dev_id, uint16_t queue_id, 5530d819c083SNicolas Chautru const uint16_t num_to_process, uint16_t burst_sz, 5531d819c083SNicolas Chautru uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) 5532d819c083SNicolas Chautru { 5533d819c083SNicolas Chautru int ret = TEST_SUCCESS; 5534d819c083SNicolas Chautru uint16_t i, j, dequeued; 5535d819c083SNicolas Chautru struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 5536d819c083SNicolas Chautru uint64_t start_time = 0, last_time = 0; 5537d819c083SNicolas Chautru 5538d819c083SNicolas Chautru for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 5539d819c083SNicolas Chautru uint16_t enq = 0, deq = 0; 5540fb5e060eSHernan Vargas uint32_t time_out = 0; 5541d819c083SNicolas Chautru bool first_time = true; 5542d819c083SNicolas Chautru last_time = 0; 5543d819c083SNicolas Chautru 5544d819c083SNicolas Chautru if (unlikely(num_to_process - dequeued < burst_sz)) 5545d819c083SNicolas Chautru burst_sz = num_to_process - dequeued; 5546d819c083SNicolas Chautru 5547d819c083SNicolas Chautru ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); 5548d819c083SNicolas Chautru TEST_ASSERT_SUCCESS(ret, 5549d819c083SNicolas Chautru "rte_bbdev_enc_op_alloc_bulk() failed"); 5550d819c083SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) 5551d819c083SNicolas Chautru copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued, 5552d819c083SNicolas Chautru bufs->inputs, 5553d819c083SNicolas Chautru bufs->hard_outputs, 5554d819c083SNicolas Chautru ref_op); 5555d819c083SNicolas Chautru 5556d819c083SNicolas Chautru /* Set counter to validate the ordering */ 5557d819c083SNicolas Chautru for (j = 0; j < burst_sz; ++j) 5558d819c083SNicolas Chautru ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 5559d819c083SNicolas Chautru 5560d819c083SNicolas Chautru start_time = rte_rdtsc_precise(); 5561d819c083SNicolas Chautru 5562d819c083SNicolas Chautru enq = rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id, 5563d819c083SNicolas Chautru &ops_enq[enq], burst_sz); 5564d819c083SNicolas Chautru TEST_ASSERT(enq == burst_sz, 5565d819c083SNicolas Chautru "Error enqueueing burst, expected %u, got %u", 5566d819c083SNicolas Chautru burst_sz, enq); 5567d819c083SNicolas Chautru 5568d819c083SNicolas Chautru /* Dequeue */ 5569d819c083SNicolas Chautru do { 5570d819c083SNicolas Chautru deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, 5571d819c083SNicolas Chautru &ops_deq[deq], burst_sz - deq); 5572d819c083SNicolas Chautru if (likely(first_time && (deq > 0))) { 5573d819c083SNicolas Chautru last_time += rte_rdtsc_precise() - start_time; 5574d819c083SNicolas Chautru first_time = false; 5575d819c083SNicolas Chautru } 5576fb5e060eSHernan Vargas time_out++; 5577fb5e060eSHernan Vargas if (time_out >= TIME_OUT_POLL) { 5578fb5e060eSHernan Vargas timeout_exit(dev_id); 5579fb5e060eSHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!"); 5580fb5e060eSHernan Vargas } 5581d819c083SNicolas Chautru } while (unlikely(burst_sz != deq)); 5582d819c083SNicolas Chautru 5583d819c083SNicolas Chautru *max_time = RTE_MAX(*max_time, last_time); 5584d819c083SNicolas Chautru *min_time = RTE_MIN(*min_time, last_time); 5585d819c083SNicolas Chautru *total_time += last_time; 5586d819c083SNicolas Chautru 5587d819c083SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 5588d819c083SNicolas Chautru ret = validate_enc_op(ops_deq, burst_sz, ref_op); 5589d819c083SNicolas Chautru TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 5590d819c083SNicolas Chautru } 5591d819c083SNicolas Chautru 5592d819c083SNicolas Chautru rte_bbdev_enc_op_free_bulk(ops_enq, deq); 5593d819c083SNicolas Chautru dequeued += deq; 5594d819c083SNicolas Chautru } 5595d819c083SNicolas Chautru 5596d819c083SNicolas Chautru return i; 5597d819c083SNicolas Chautru } 5598d819c083SNicolas Chautru 55990acdb986SNicolas Chautru 56000acdb986SNicolas Chautru static int 56010acdb986SNicolas Chautru latency_test_fft(struct rte_mempool *mempool, 56020acdb986SNicolas Chautru struct test_buffers *bufs, struct rte_bbdev_fft_op *ref_op, 56030acdb986SNicolas Chautru uint16_t dev_id, uint16_t queue_id, 56040acdb986SNicolas Chautru const uint16_t num_to_process, uint16_t burst_sz, 56050acdb986SNicolas Chautru uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) 56060acdb986SNicolas Chautru { 56070acdb986SNicolas Chautru int ret = TEST_SUCCESS; 56080acdb986SNicolas Chautru uint16_t i, j, dequeued; 56090acdb986SNicolas Chautru struct rte_bbdev_fft_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 56100acdb986SNicolas Chautru uint64_t start_time = 0, last_time = 0; 56110acdb986SNicolas Chautru 56120acdb986SNicolas Chautru for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 56130acdb986SNicolas Chautru uint16_t enq = 0, deq = 0; 5614fb5e060eSHernan Vargas uint32_t time_out = 0; 56150acdb986SNicolas Chautru bool first_time = true; 56160acdb986SNicolas Chautru last_time = 0; 56170acdb986SNicolas Chautru 56180acdb986SNicolas Chautru if (unlikely(num_to_process - dequeued < burst_sz)) 56190acdb986SNicolas Chautru burst_sz = num_to_process - dequeued; 56200acdb986SNicolas Chautru 56210acdb986SNicolas Chautru ret = rte_bbdev_fft_op_alloc_bulk(mempool, ops_enq, burst_sz); 56220acdb986SNicolas Chautru TEST_ASSERT_SUCCESS(ret, 56230acdb986SNicolas Chautru "rte_bbdev_fft_op_alloc_bulk() failed"); 56240acdb986SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) 56250acdb986SNicolas Chautru copy_reference_fft_op(ops_enq, burst_sz, dequeued, 56260acdb986SNicolas Chautru bufs->inputs, 56270ed76d66SHernan Vargas bufs->hard_outputs, bufs->soft_outputs, bufs->harq_inputs, 56280acdb986SNicolas Chautru ref_op); 56290acdb986SNicolas Chautru 56300acdb986SNicolas Chautru /* Set counter to validate the ordering */ 56310acdb986SNicolas Chautru for (j = 0; j < burst_sz; ++j) 56320acdb986SNicolas Chautru ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 56330acdb986SNicolas Chautru 56340acdb986SNicolas Chautru start_time = rte_rdtsc_precise(); 56350acdb986SNicolas Chautru 56360acdb986SNicolas Chautru enq = rte_bbdev_enqueue_fft_ops(dev_id, queue_id, 56370acdb986SNicolas Chautru &ops_enq[enq], burst_sz); 56380acdb986SNicolas Chautru TEST_ASSERT(enq == burst_sz, 56390acdb986SNicolas Chautru "Error enqueueing burst, expected %u, got %u", 56400acdb986SNicolas Chautru burst_sz, enq); 56410acdb986SNicolas Chautru 56420acdb986SNicolas Chautru /* Dequeue */ 56430acdb986SNicolas Chautru do { 56440acdb986SNicolas Chautru deq += rte_bbdev_dequeue_fft_ops(dev_id, queue_id, 56450acdb986SNicolas Chautru &ops_deq[deq], burst_sz - deq); 56460acdb986SNicolas Chautru if (likely(first_time && (deq > 0))) { 56470acdb986SNicolas Chautru last_time += rte_rdtsc_precise() - start_time; 56480acdb986SNicolas Chautru first_time = false; 56490acdb986SNicolas Chautru } 5650fb5e060eSHernan Vargas time_out++; 5651fb5e060eSHernan Vargas if (time_out >= TIME_OUT_POLL) { 5652fb5e060eSHernan Vargas timeout_exit(dev_id); 5653fb5e060eSHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!"); 5654fb5e060eSHernan Vargas } 56550acdb986SNicolas Chautru } while (unlikely(burst_sz != deq)); 56560acdb986SNicolas Chautru 56570acdb986SNicolas Chautru *max_time = RTE_MAX(*max_time, last_time); 56580acdb986SNicolas Chautru *min_time = RTE_MIN(*min_time, last_time); 56590acdb986SNicolas Chautru *total_time += last_time; 56600acdb986SNicolas Chautru 56610acdb986SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 56620acdb986SNicolas Chautru ret = validate_fft_op(ops_deq, burst_sz, ref_op); 56630acdb986SNicolas Chautru TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 56640acdb986SNicolas Chautru } 56650acdb986SNicolas Chautru 56660acdb986SNicolas Chautru rte_bbdev_fft_op_free_bulk(ops_enq, deq); 56670acdb986SNicolas Chautru dequeued += deq; 56680acdb986SNicolas Chautru } 56690acdb986SNicolas Chautru 56700acdb986SNicolas Chautru return i; 56710acdb986SNicolas Chautru } 56720acdb986SNicolas Chautru 567395f192a4SHernan Vargas static int 567495f192a4SHernan Vargas latency_test_mldts(struct rte_mempool *mempool, 567595f192a4SHernan Vargas struct test_buffers *bufs, struct rte_bbdev_mldts_op *ref_op, 567695f192a4SHernan Vargas uint16_t dev_id, uint16_t queue_id, 567795f192a4SHernan Vargas const uint16_t num_to_process, uint16_t burst_sz, 567895f192a4SHernan Vargas uint64_t *total_time, uint64_t *min_time, uint64_t *max_time) 567995f192a4SHernan Vargas { 568095f192a4SHernan Vargas int ret = TEST_SUCCESS; 568195f192a4SHernan Vargas uint16_t i, j, dequeued; 568295f192a4SHernan Vargas struct rte_bbdev_mldts_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 568395f192a4SHernan Vargas uint64_t start_time = 0, last_time = 0; 568495f192a4SHernan Vargas 568595f192a4SHernan Vargas for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 568695f192a4SHernan Vargas uint16_t enq = 0, deq = 0; 568795f192a4SHernan Vargas uint32_t time_out = 0; 568895f192a4SHernan Vargas bool first_time = true; 568995f192a4SHernan Vargas last_time = 0; 569095f192a4SHernan Vargas 569195f192a4SHernan Vargas if (unlikely(num_to_process - dequeued < burst_sz)) 569295f192a4SHernan Vargas burst_sz = num_to_process - dequeued; 569395f192a4SHernan Vargas 569495f192a4SHernan Vargas ret = rte_bbdev_mldts_op_alloc_bulk(mempool, ops_enq, burst_sz); 569595f192a4SHernan Vargas TEST_ASSERT_SUCCESS(ret, "rte_bbdev_mldts_op_alloc_bulk() failed"); 569695f192a4SHernan Vargas if (test_vector.op_type != RTE_BBDEV_OP_NONE) 569795f192a4SHernan Vargas copy_reference_mldts_op(ops_enq, burst_sz, dequeued, 569895f192a4SHernan Vargas bufs->inputs, bufs->harq_inputs, 569995f192a4SHernan Vargas bufs->hard_outputs, 570095f192a4SHernan Vargas ref_op); 570195f192a4SHernan Vargas 570295f192a4SHernan Vargas /* Set counter to validate the ordering */ 570395f192a4SHernan Vargas for (j = 0; j < burst_sz; ++j) 570495f192a4SHernan Vargas ops_enq[j]->opaque_data = (void *)(uintptr_t)j; 570595f192a4SHernan Vargas 570695f192a4SHernan Vargas start_time = rte_rdtsc_precise(); 570795f192a4SHernan Vargas 570895f192a4SHernan Vargas enq = rte_bbdev_enqueue_mldts_ops(dev_id, queue_id, &ops_enq[enq], burst_sz); 570995f192a4SHernan Vargas TEST_ASSERT(enq == burst_sz, 571095f192a4SHernan Vargas "Error enqueueing burst, expected %u, got %u", 571195f192a4SHernan Vargas burst_sz, enq); 571295f192a4SHernan Vargas 571395f192a4SHernan Vargas /* Dequeue */ 571495f192a4SHernan Vargas do { 571595f192a4SHernan Vargas deq += rte_bbdev_dequeue_mldts_ops(dev_id, queue_id, 571695f192a4SHernan Vargas &ops_deq[deq], burst_sz - deq); 571795f192a4SHernan Vargas if (likely(first_time && (deq > 0))) { 571895f192a4SHernan Vargas last_time += rte_rdtsc_precise() - start_time; 571995f192a4SHernan Vargas first_time = false; 572095f192a4SHernan Vargas } 572195f192a4SHernan Vargas time_out++; 572295f192a4SHernan Vargas if (time_out >= TIME_OUT_POLL) { 572395f192a4SHernan Vargas timeout_exit(dev_id); 572495f192a4SHernan Vargas TEST_ASSERT_SUCCESS(TEST_FAILED, "Dequeue timeout!"); 572595f192a4SHernan Vargas } 572695f192a4SHernan Vargas } while (unlikely(burst_sz != deq)); 572795f192a4SHernan Vargas 572895f192a4SHernan Vargas *max_time = RTE_MAX(*max_time, last_time); 572995f192a4SHernan Vargas *min_time = RTE_MIN(*min_time, last_time); 573095f192a4SHernan Vargas *total_time += last_time; 573195f192a4SHernan Vargas 573295f192a4SHernan Vargas if (test_vector.op_type != RTE_BBDEV_OP_NONE) { 573395f192a4SHernan Vargas ret = validate_mldts_op(ops_deq, burst_sz, ref_op); 573495f192a4SHernan Vargas TEST_ASSERT_SUCCESS(ret, "Validation failed!"); 573595f192a4SHernan Vargas } 573695f192a4SHernan Vargas 573795f192a4SHernan Vargas rte_bbdev_mldts_op_free_bulk(ops_enq, deq); 573895f192a4SHernan Vargas dequeued += deq; 573995f192a4SHernan Vargas } 574095f192a4SHernan Vargas 574195f192a4SHernan Vargas return i; 574295f192a4SHernan Vargas } 574395f192a4SHernan Vargas 57440ab66275SNicolas Chautru /* Common function for running validation and latency test cases */ 5745d819c083SNicolas Chautru static int 57460ab66275SNicolas Chautru validation_latency_test(struct active_device *ad, 57470ab66275SNicolas Chautru struct test_op_params *op_params, bool latency_flag) 5748f714a188SAmr Mokhtar { 5749f714a188SAmr Mokhtar int iter; 5750f714a188SAmr Mokhtar uint16_t burst_sz = op_params->burst_sz; 5751f714a188SAmr Mokhtar const uint16_t num_to_process = op_params->num_to_process; 5752f714a188SAmr Mokhtar const enum rte_bbdev_op_type op_type = test_vector.op_type; 5753f714a188SAmr Mokhtar const uint16_t queue_id = ad->queue_ids[0]; 5754f714a188SAmr Mokhtar struct test_buffers *bufs = NULL; 5755f714a188SAmr Mokhtar struct rte_bbdev_info info; 5756864edd69SKamil Chalupnik uint64_t total_time, min_time, max_time; 5757f714a188SAmr Mokhtar const char *op_type_str; 5758f714a188SAmr Mokhtar 5759864edd69SKamil Chalupnik total_time = max_time = 0; 5760864edd69SKamil Chalupnik min_time = UINT64_MAX; 5761864edd69SKamil Chalupnik 5762f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 5763f714a188SAmr Mokhtar "BURST_SIZE should be <= %u", MAX_BURST); 5764f714a188SAmr Mokhtar 5765f714a188SAmr Mokhtar rte_bbdev_info_get(ad->dev_id, &info); 5766f714a188SAmr Mokhtar bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 5767f714a188SAmr Mokhtar 5768f714a188SAmr Mokhtar op_type_str = rte_bbdev_op_type_str(op_type); 5769f714a188SAmr Mokhtar TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); 5770f714a188SAmr Mokhtar 5771d819c083SNicolas Chautru printf("+ ------------------------------------------------------- +\n"); 57720ab66275SNicolas Chautru if (latency_flag) 57730ab66275SNicolas Chautru printf("== test: latency\ndev:"); 57740ab66275SNicolas Chautru else 57750ab66275SNicolas Chautru printf("== test: validation\ndev:"); 57760ab66275SNicolas Chautru printf("%s, burst size: %u, num ops: %u, op type: %s\n", 5777f714a188SAmr Mokhtar info.dev_name, burst_sz, num_to_process, op_type_str); 5778f714a188SAmr Mokhtar 5779f714a188SAmr Mokhtar if (op_type == RTE_BBDEV_OP_TURBO_DEC) 5780864edd69SKamil Chalupnik iter = latency_test_dec(op_params->mp, bufs, 5781de2ce637SHernan Vargas op_params->ref_dec_op, ad->dev_id, queue_id, 5782de2ce637SHernan Vargas num_to_process, burst_sz, &total_time, 5783de2ce637SHernan Vargas &min_time, &max_time, latency_flag); 5784d819c083SNicolas Chautru else if (op_type == RTE_BBDEV_OP_LDPC_ENC) 5785d819c083SNicolas Chautru iter = latency_test_ldpc_enc(op_params->mp, bufs, 5786d819c083SNicolas Chautru op_params->ref_enc_op, ad->dev_id, queue_id, 5787d819c083SNicolas Chautru num_to_process, burst_sz, &total_time, 5788d819c083SNicolas Chautru &min_time, &max_time); 5789d819c083SNicolas Chautru else if (op_type == RTE_BBDEV_OP_LDPC_DEC) 5790d819c083SNicolas Chautru iter = latency_test_ldpc_dec(op_params->mp, bufs, 5791d819c083SNicolas Chautru op_params->ref_dec_op, op_params->vector_mask, 5792d819c083SNicolas Chautru ad->dev_id, queue_id, num_to_process, 57930ab66275SNicolas Chautru burst_sz, &total_time, &min_time, &max_time, 57940ab66275SNicolas Chautru latency_flag); 57950acdb986SNicolas Chautru else if (op_type == RTE_BBDEV_OP_FFT) 57960acdb986SNicolas Chautru iter = latency_test_fft(op_params->mp, bufs, 57970acdb986SNicolas Chautru op_params->ref_fft_op, 57980acdb986SNicolas Chautru ad->dev_id, queue_id, 57990acdb986SNicolas Chautru num_to_process, burst_sz, &total_time, 58000acdb986SNicolas Chautru &min_time, &max_time); 580195f192a4SHernan Vargas else if (op_type == RTE_BBDEV_OP_MLDTS) 580295f192a4SHernan Vargas iter = latency_test_mldts(op_params->mp, bufs, 580395f192a4SHernan Vargas op_params->ref_mldts_op, 580495f192a4SHernan Vargas ad->dev_id, queue_id, 580595f192a4SHernan Vargas num_to_process, burst_sz, &total_time, 580695f192a4SHernan Vargas &min_time, &max_time); 58070ab66275SNicolas Chautru else /* RTE_BBDEV_OP_TURBO_ENC */ 5808d819c083SNicolas Chautru iter = latency_test_enc(op_params->mp, bufs, 5809d819c083SNicolas Chautru op_params->ref_enc_op, 5810d819c083SNicolas Chautru ad->dev_id, queue_id, 5811d819c083SNicolas Chautru num_to_process, burst_sz, &total_time, 5812d819c083SNicolas Chautru &min_time, &max_time); 5813f714a188SAmr Mokhtar 5814c3aaec26SAmr Mokhtar if (iter <= 0) 5815f714a188SAmr Mokhtar return TEST_FAILED; 5816f714a188SAmr Mokhtar 58179fa6ebdeSKamil Chalupnik printf("Operation latency:\n" 5818d819c083SNicolas Chautru "\tavg: %lg cycles, %lg us\n" 5819d819c083SNicolas Chautru "\tmin: %lg cycles, %lg us\n" 5820d819c083SNicolas Chautru "\tmax: %lg cycles, %lg us\n", 5821f714a188SAmr Mokhtar (double)total_time / (double)iter, 5822f714a188SAmr Mokhtar (double)(total_time * 1000000) / (double)iter / 5823864edd69SKamil Chalupnik (double)rte_get_tsc_hz(), (double)min_time, 5824864edd69SKamil Chalupnik (double)(min_time * 1000000) / (double)rte_get_tsc_hz(), 5825864edd69SKamil Chalupnik (double)max_time, (double)(max_time * 1000000) / 5826f714a188SAmr Mokhtar (double)rte_get_tsc_hz()); 5827f714a188SAmr Mokhtar 5828f714a188SAmr Mokhtar return TEST_SUCCESS; 5829f714a188SAmr Mokhtar } 5830f714a188SAmr Mokhtar 58310ab66275SNicolas Chautru static int 58320ab66275SNicolas Chautru latency_test(struct active_device *ad, struct test_op_params *op_params) 58330ab66275SNicolas Chautru { 58340ab66275SNicolas Chautru return validation_latency_test(ad, op_params, true); 58350ab66275SNicolas Chautru } 58360ab66275SNicolas Chautru 58370ab66275SNicolas Chautru static int 58380ab66275SNicolas Chautru validation_test(struct active_device *ad, struct test_op_params *op_params) 58390ab66275SNicolas Chautru { 58400ab66275SNicolas Chautru return validation_latency_test(ad, op_params, false); 58410ab66275SNicolas Chautru } 58420ab66275SNicolas Chautru 5843864edd69SKamil Chalupnik static int 5844864edd69SKamil Chalupnik get_bbdev_queue_stats(uint16_t dev_id, uint16_t queue_id, 5845864edd69SKamil Chalupnik struct rte_bbdev_stats *stats) 5846864edd69SKamil Chalupnik { 5847864edd69SKamil Chalupnik struct rte_bbdev *dev = &rte_bbdev_devices[dev_id]; 5848864edd69SKamil Chalupnik struct rte_bbdev_stats *q_stats; 5849864edd69SKamil Chalupnik 5850864edd69SKamil Chalupnik if (queue_id >= dev->data->num_queues) 5851864edd69SKamil Chalupnik return -1; 5852864edd69SKamil Chalupnik 5853864edd69SKamil Chalupnik q_stats = &dev->data->queues[queue_id].queue_stats; 5854864edd69SKamil Chalupnik 5855864edd69SKamil Chalupnik stats->enqueued_count = q_stats->enqueued_count; 5856864edd69SKamil Chalupnik stats->dequeued_count = q_stats->dequeued_count; 5857864edd69SKamil Chalupnik stats->enqueue_err_count = q_stats->enqueue_err_count; 5858864edd69SKamil Chalupnik stats->dequeue_err_count = q_stats->dequeue_err_count; 58591228c856SNicolas Chautru stats->enqueue_warn_count = q_stats->enqueue_warn_count; 58601228c856SNicolas Chautru stats->dequeue_warn_count = q_stats->dequeue_warn_count; 58619fa6ebdeSKamil Chalupnik stats->acc_offload_cycles = q_stats->acc_offload_cycles; 5862f8d8fa0eSNicolas Chautru stats->enqueue_depth_avail = q_stats->enqueue_depth_avail; 5863864edd69SKamil Chalupnik 5864864edd69SKamil Chalupnik return 0; 5865864edd69SKamil Chalupnik } 5866864edd69SKamil Chalupnik 5867f714a188SAmr Mokhtar static int 58684a07b231SNicolas Chautru offload_latency_test_fft(struct rte_mempool *mempool, struct test_buffers *bufs, 58694a07b231SNicolas Chautru struct rte_bbdev_fft_op *ref_op, uint16_t dev_id, 58704a07b231SNicolas Chautru uint16_t queue_id, const uint16_t num_to_process, 58714a07b231SNicolas Chautru uint16_t burst_sz, struct test_time_stats *time_st) 58724a07b231SNicolas Chautru { 58734a07b231SNicolas Chautru int i, dequeued, ret; 58744a07b231SNicolas Chautru struct rte_bbdev_fft_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 58754a07b231SNicolas Chautru uint64_t enq_start_time, deq_start_time; 58764a07b231SNicolas Chautru uint64_t enq_sw_last_time, deq_last_time; 58774a07b231SNicolas Chautru struct rte_bbdev_stats stats; 58784a07b231SNicolas Chautru 58794a07b231SNicolas Chautru for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 58804a07b231SNicolas Chautru uint16_t enq = 0, deq = 0; 58814a07b231SNicolas Chautru 58824a07b231SNicolas Chautru if (unlikely(num_to_process - dequeued < burst_sz)) 58834a07b231SNicolas Chautru burst_sz = num_to_process - dequeued; 58844a07b231SNicolas Chautru 58858abe31b1SNicolas Chautru ret = rte_bbdev_fft_op_alloc_bulk(mempool, ops_enq, burst_sz); 58865884e56fSHernan Vargas TEST_ASSERT_SUCCESS(ret, "rte_bbdev_fft_op_alloc_bulk() failed"); 58874a07b231SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) 58884a07b231SNicolas Chautru copy_reference_fft_op(ops_enq, burst_sz, dequeued, 58894a07b231SNicolas Chautru bufs->inputs, 58900ed76d66SHernan Vargas bufs->hard_outputs, bufs->soft_outputs, bufs->harq_inputs, 58914a07b231SNicolas Chautru ref_op); 58924a07b231SNicolas Chautru 58934a07b231SNicolas Chautru /* Start time meas for enqueue function offload latency */ 58944a07b231SNicolas Chautru enq_start_time = rte_rdtsc_precise(); 58954a07b231SNicolas Chautru do { 58964a07b231SNicolas Chautru enq += rte_bbdev_enqueue_fft_ops(dev_id, queue_id, 58974a07b231SNicolas Chautru &ops_enq[enq], burst_sz - enq); 58984a07b231SNicolas Chautru } while (unlikely(burst_sz != enq)); 58994a07b231SNicolas Chautru 59004a07b231SNicolas Chautru ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); 59014a07b231SNicolas Chautru TEST_ASSERT_SUCCESS(ret, 59024a07b231SNicolas Chautru "Failed to get stats for queue (%u) of device (%u)", 59034a07b231SNicolas Chautru queue_id, dev_id); 59044a07b231SNicolas Chautru 59054a07b231SNicolas Chautru enq_sw_last_time = rte_rdtsc_precise() - enq_start_time - 59064a07b231SNicolas Chautru stats.acc_offload_cycles; 59074a07b231SNicolas Chautru time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, 59084a07b231SNicolas Chautru enq_sw_last_time); 59094a07b231SNicolas Chautru time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, 59104a07b231SNicolas Chautru enq_sw_last_time); 59114a07b231SNicolas Chautru time_st->enq_sw_total_time += enq_sw_last_time; 59124a07b231SNicolas Chautru 59134a07b231SNicolas Chautru time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, 59144a07b231SNicolas Chautru stats.acc_offload_cycles); 59154a07b231SNicolas Chautru time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, 59164a07b231SNicolas Chautru stats.acc_offload_cycles); 59174a07b231SNicolas Chautru time_st->enq_acc_total_time += stats.acc_offload_cycles; 59184a07b231SNicolas Chautru 59194a07b231SNicolas Chautru /* give time for device to process ops */ 59204a07b231SNicolas Chautru rte_delay_us(WAIT_OFFLOAD_US); 59214a07b231SNicolas Chautru 59224a07b231SNicolas Chautru /* Start time meas for dequeue function offload latency */ 59234a07b231SNicolas Chautru deq_start_time = rte_rdtsc_precise(); 59244a07b231SNicolas Chautru /* Dequeue one operation */ 59254a07b231SNicolas Chautru do { 59264a07b231SNicolas Chautru deq += rte_bbdev_dequeue_fft_ops(dev_id, queue_id, 59274a07b231SNicolas Chautru &ops_deq[deq], enq); 59284a07b231SNicolas Chautru } while (unlikely(deq == 0)); 59294a07b231SNicolas Chautru 59304a07b231SNicolas Chautru deq_last_time = rte_rdtsc_precise() - deq_start_time; 59314a07b231SNicolas Chautru time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, 59324a07b231SNicolas Chautru deq_last_time); 59334a07b231SNicolas Chautru time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, 59344a07b231SNicolas Chautru deq_last_time); 59354a07b231SNicolas Chautru time_st->deq_total_time += deq_last_time; 59364a07b231SNicolas Chautru 59374a07b231SNicolas Chautru /* Dequeue remaining operations if needed*/ 59384a07b231SNicolas Chautru while (burst_sz != deq) 59394a07b231SNicolas Chautru deq += rte_bbdev_dequeue_fft_ops(dev_id, queue_id, 59404a07b231SNicolas Chautru &ops_deq[deq], burst_sz - deq); 59414a07b231SNicolas Chautru 59424a07b231SNicolas Chautru rte_bbdev_fft_op_free_bulk(ops_enq, deq); 59434a07b231SNicolas Chautru dequeued += deq; 59444a07b231SNicolas Chautru } 59454a07b231SNicolas Chautru 59464a07b231SNicolas Chautru return i; 59474a07b231SNicolas Chautru } 59484a07b231SNicolas Chautru 59494a07b231SNicolas Chautru static int 595095f192a4SHernan Vargas offload_latency_test_mldts(struct rte_mempool *mempool, struct test_buffers *bufs, 595195f192a4SHernan Vargas struct rte_bbdev_mldts_op *ref_op, uint16_t dev_id, 595295f192a4SHernan Vargas uint16_t queue_id, const uint16_t num_to_process, 595395f192a4SHernan Vargas uint16_t burst_sz, struct test_time_stats *time_st) 595495f192a4SHernan Vargas { 595595f192a4SHernan Vargas int i, dequeued, ret; 595695f192a4SHernan Vargas struct rte_bbdev_mldts_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 595795f192a4SHernan Vargas uint64_t enq_start_time, deq_start_time; 595895f192a4SHernan Vargas uint64_t enq_sw_last_time, deq_last_time; 595995f192a4SHernan Vargas struct rte_bbdev_stats stats; 596095f192a4SHernan Vargas 596195f192a4SHernan Vargas for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 596295f192a4SHernan Vargas uint16_t enq = 0, deq = 0; 596395f192a4SHernan Vargas 596495f192a4SHernan Vargas if (unlikely(num_to_process - dequeued < burst_sz)) 596595f192a4SHernan Vargas burst_sz = num_to_process - dequeued; 596695f192a4SHernan Vargas 596795f192a4SHernan Vargas ret = rte_bbdev_mldts_op_alloc_bulk(mempool, ops_enq, burst_sz); 596895f192a4SHernan Vargas TEST_ASSERT_SUCCESS(ret, "rte_bbdev_mldts_op_alloc_bulk() failed"); 596995f192a4SHernan Vargas if (test_vector.op_type != RTE_BBDEV_OP_NONE) 597095f192a4SHernan Vargas copy_reference_mldts_op(ops_enq, burst_sz, dequeued, 597195f192a4SHernan Vargas bufs->inputs, bufs->harq_inputs, 597295f192a4SHernan Vargas bufs->hard_outputs, 597395f192a4SHernan Vargas ref_op); 597495f192a4SHernan Vargas 597595f192a4SHernan Vargas /* Start time meas for enqueue function offload latency */ 597695f192a4SHernan Vargas enq_start_time = rte_rdtsc_precise(); 597795f192a4SHernan Vargas do { 597895f192a4SHernan Vargas enq += rte_bbdev_enqueue_mldts_ops(dev_id, queue_id, 597995f192a4SHernan Vargas &ops_enq[enq], burst_sz - enq); 598095f192a4SHernan Vargas } while (unlikely(burst_sz != enq)); 598195f192a4SHernan Vargas 598295f192a4SHernan Vargas ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); 598395f192a4SHernan Vargas TEST_ASSERT_SUCCESS(ret, 598495f192a4SHernan Vargas "Failed to get stats for queue (%u) of device (%u)", 598595f192a4SHernan Vargas queue_id, dev_id); 598695f192a4SHernan Vargas 598795f192a4SHernan Vargas enq_sw_last_time = rte_rdtsc_precise() - enq_start_time - 598895f192a4SHernan Vargas stats.acc_offload_cycles; 598995f192a4SHernan Vargas time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, 599095f192a4SHernan Vargas enq_sw_last_time); 599195f192a4SHernan Vargas time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, 599295f192a4SHernan Vargas enq_sw_last_time); 599395f192a4SHernan Vargas time_st->enq_sw_total_time += enq_sw_last_time; 599495f192a4SHernan Vargas 599595f192a4SHernan Vargas time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, 599695f192a4SHernan Vargas stats.acc_offload_cycles); 599795f192a4SHernan Vargas time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, 599895f192a4SHernan Vargas stats.acc_offload_cycles); 599995f192a4SHernan Vargas time_st->enq_acc_total_time += stats.acc_offload_cycles; 600095f192a4SHernan Vargas 600195f192a4SHernan Vargas /* give time for device to process ops */ 600295f192a4SHernan Vargas rte_delay_us(WAIT_OFFLOAD_US); 600395f192a4SHernan Vargas 600495f192a4SHernan Vargas /* Start time meas for dequeue function offload latency */ 600595f192a4SHernan Vargas deq_start_time = rte_rdtsc_precise(); 600695f192a4SHernan Vargas /* Dequeue one operation */ 600795f192a4SHernan Vargas do { 600895f192a4SHernan Vargas deq += rte_bbdev_dequeue_mldts_ops(dev_id, queue_id, &ops_deq[deq], enq); 600995f192a4SHernan Vargas } while (unlikely(deq == 0)); 601095f192a4SHernan Vargas 601195f192a4SHernan Vargas deq_last_time = rte_rdtsc_precise() - deq_start_time; 601295f192a4SHernan Vargas time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, deq_last_time); 601395f192a4SHernan Vargas time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, deq_last_time); 601495f192a4SHernan Vargas time_st->deq_total_time += deq_last_time; 601595f192a4SHernan Vargas 601695f192a4SHernan Vargas /* Dequeue remaining operations if needed*/ 601795f192a4SHernan Vargas while (burst_sz != deq) 601895f192a4SHernan Vargas deq += rte_bbdev_dequeue_mldts_ops(dev_id, queue_id, 601995f192a4SHernan Vargas &ops_deq[deq], burst_sz - deq); 602095f192a4SHernan Vargas 602195f192a4SHernan Vargas rte_bbdev_mldts_op_free_bulk(ops_enq, deq); 602295f192a4SHernan Vargas dequeued += deq; 602395f192a4SHernan Vargas } 602495f192a4SHernan Vargas 602595f192a4SHernan Vargas return i; 602695f192a4SHernan Vargas } 602795f192a4SHernan Vargas 602895f192a4SHernan Vargas static int 6029f714a188SAmr Mokhtar offload_latency_test_dec(struct rte_mempool *mempool, struct test_buffers *bufs, 6030f714a188SAmr Mokhtar struct rte_bbdev_dec_op *ref_op, uint16_t dev_id, 6031f714a188SAmr Mokhtar uint16_t queue_id, const uint16_t num_to_process, 6032864edd69SKamil Chalupnik uint16_t burst_sz, struct test_time_stats *time_st) 6033f714a188SAmr Mokhtar { 6034864edd69SKamil Chalupnik int i, dequeued, ret; 6035f714a188SAmr Mokhtar struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 6036f714a188SAmr Mokhtar uint64_t enq_start_time, deq_start_time; 6037864edd69SKamil Chalupnik uint64_t enq_sw_last_time, deq_last_time; 6038864edd69SKamil Chalupnik struct rte_bbdev_stats stats; 6039f714a188SAmr Mokhtar 6040f714a188SAmr Mokhtar for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 6041f714a188SAmr Mokhtar uint16_t enq = 0, deq = 0; 6042f714a188SAmr Mokhtar 6043f714a188SAmr Mokhtar if (unlikely(num_to_process - dequeued < burst_sz)) 6044f714a188SAmr Mokhtar burst_sz = num_to_process - dequeued; 6045f714a188SAmr Mokhtar 60468abe31b1SNicolas Chautru ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); 60475884e56fSHernan Vargas TEST_ASSERT_SUCCESS(ret, "rte_bbdev_dec_op_alloc_bulk() failed"); 604831fab7b4SHernan Vargas ref_op->turbo_dec.iter_max = get_iter_max(); 6049f714a188SAmr Mokhtar if (test_vector.op_type != RTE_BBDEV_OP_NONE) 6050f714a188SAmr Mokhtar copy_reference_dec_op(ops_enq, burst_sz, dequeued, 6051f714a188SAmr Mokhtar bufs->inputs, 6052f714a188SAmr Mokhtar bufs->hard_outputs, 6053f714a188SAmr Mokhtar bufs->soft_outputs, 6054f714a188SAmr Mokhtar ref_op); 6055f714a188SAmr Mokhtar 6056864edd69SKamil Chalupnik /* Start time meas for enqueue function offload latency */ 6057864edd69SKamil Chalupnik enq_start_time = rte_rdtsc_precise(); 6058f714a188SAmr Mokhtar do { 6059f714a188SAmr Mokhtar enq += rte_bbdev_enqueue_dec_ops(dev_id, queue_id, 6060f714a188SAmr Mokhtar &ops_enq[enq], burst_sz - enq); 6061f714a188SAmr Mokhtar } while (unlikely(burst_sz != enq)); 6062864edd69SKamil Chalupnik 6063864edd69SKamil Chalupnik ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); 6064864edd69SKamil Chalupnik TEST_ASSERT_SUCCESS(ret, 6065864edd69SKamil Chalupnik "Failed to get stats for queue (%u) of device (%u)", 6066864edd69SKamil Chalupnik queue_id, dev_id); 6067864edd69SKamil Chalupnik 6068864edd69SKamil Chalupnik enq_sw_last_time = rte_rdtsc_precise() - enq_start_time - 60699fa6ebdeSKamil Chalupnik stats.acc_offload_cycles; 6070864edd69SKamil Chalupnik time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, 6071864edd69SKamil Chalupnik enq_sw_last_time); 6072864edd69SKamil Chalupnik time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, 6073864edd69SKamil Chalupnik enq_sw_last_time); 60749fa6ebdeSKamil Chalupnik time_st->enq_sw_total_time += enq_sw_last_time; 6075864edd69SKamil Chalupnik 60769fa6ebdeSKamil Chalupnik time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, 60779fa6ebdeSKamil Chalupnik stats.acc_offload_cycles); 60789fa6ebdeSKamil Chalupnik time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, 60799fa6ebdeSKamil Chalupnik stats.acc_offload_cycles); 60809fa6ebdeSKamil Chalupnik time_st->enq_acc_total_time += stats.acc_offload_cycles; 6081f714a188SAmr Mokhtar 6082d819c083SNicolas Chautru /* give time for device to process ops */ 60835c3f7fc5SNicolas Chautru rte_delay_us(WAIT_OFFLOAD_US); 6084f714a188SAmr Mokhtar 6085864edd69SKamil Chalupnik /* Start time meas for dequeue function offload latency */ 6086864edd69SKamil Chalupnik deq_start_time = rte_rdtsc_precise(); 6087864edd69SKamil Chalupnik /* Dequeue one operation */ 6088f714a188SAmr Mokhtar do { 6089f714a188SAmr Mokhtar deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, 6090f32e93b1SNicolas Chautru &ops_deq[deq], enq); 6091f32e93b1SNicolas Chautru } while (unlikely(deq == 0)); 6092864edd69SKamil Chalupnik 6093864edd69SKamil Chalupnik deq_last_time = rte_rdtsc_precise() - deq_start_time; 6094864edd69SKamil Chalupnik time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, 6095864edd69SKamil Chalupnik deq_last_time); 6096864edd69SKamil Chalupnik time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, 6097864edd69SKamil Chalupnik deq_last_time); 60989fa6ebdeSKamil Chalupnik time_st->deq_total_time += deq_last_time; 6099864edd69SKamil Chalupnik 6100864edd69SKamil Chalupnik /* Dequeue remaining operations if needed*/ 6101864edd69SKamil Chalupnik while (burst_sz != deq) 6102864edd69SKamil Chalupnik deq += rte_bbdev_dequeue_dec_ops(dev_id, queue_id, 6103f714a188SAmr Mokhtar &ops_deq[deq], burst_sz - deq); 6104f714a188SAmr Mokhtar 6105f714a188SAmr Mokhtar rte_bbdev_dec_op_free_bulk(ops_enq, deq); 6106f714a188SAmr Mokhtar dequeued += deq; 6107f714a188SAmr Mokhtar } 6108f714a188SAmr Mokhtar 6109f714a188SAmr Mokhtar return i; 6110f714a188SAmr Mokhtar } 6111f714a188SAmr Mokhtar 6112f714a188SAmr Mokhtar static int 6113d819c083SNicolas Chautru offload_latency_test_ldpc_dec(struct rte_mempool *mempool, 6114d819c083SNicolas Chautru struct test_buffers *bufs, 6115d819c083SNicolas Chautru struct rte_bbdev_dec_op *ref_op, uint16_t dev_id, 6116d819c083SNicolas Chautru uint16_t queue_id, const uint16_t num_to_process, 6117d819c083SNicolas Chautru uint16_t burst_sz, struct test_time_stats *time_st) 6118d819c083SNicolas Chautru { 6119d819c083SNicolas Chautru int i, dequeued, ret; 6120d819c083SNicolas Chautru struct rte_bbdev_dec_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 6121d819c083SNicolas Chautru uint64_t enq_start_time, deq_start_time; 6122d819c083SNicolas Chautru uint64_t enq_sw_last_time, deq_last_time; 6123d819c083SNicolas Chautru struct rte_bbdev_stats stats; 6124335c11fdSNicolas Chautru bool extDdr = ldpc_cap_flags & 6125335c11fdSNicolas Chautru RTE_BBDEV_LDPC_INTERNAL_HARQ_MEMORY_OUT_ENABLE; 6126d819c083SNicolas Chautru 6127d819c083SNicolas Chautru for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 6128d819c083SNicolas Chautru uint16_t enq = 0, deq = 0; 6129d819c083SNicolas Chautru 6130d819c083SNicolas Chautru if (unlikely(num_to_process - dequeued < burst_sz)) 6131d819c083SNicolas Chautru burst_sz = num_to_process - dequeued; 6132d819c083SNicolas Chautru 61338abe31b1SNicolas Chautru ret = rte_bbdev_dec_op_alloc_bulk(mempool, ops_enq, burst_sz); 61345884e56fSHernan Vargas TEST_ASSERT_SUCCESS(ret, "rte_bbdev_dec_op_alloc_bulk() failed"); 613531fab7b4SHernan Vargas ref_op->ldpc_dec.iter_max = get_iter_max(); 6136d819c083SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) 6137d819c083SNicolas Chautru copy_reference_ldpc_dec_op(ops_enq, burst_sz, dequeued, 6138d819c083SNicolas Chautru bufs->inputs, 6139d819c083SNicolas Chautru bufs->hard_outputs, 6140d819c083SNicolas Chautru bufs->soft_outputs, 6141d819c083SNicolas Chautru bufs->harq_inputs, 6142d819c083SNicolas Chautru bufs->harq_outputs, 6143d819c083SNicolas Chautru ref_op); 6144d819c083SNicolas Chautru 6145335c11fdSNicolas Chautru if (extDdr) 6146335c11fdSNicolas Chautru preload_harq_ddr(dev_id, queue_id, ops_enq, 6147335c11fdSNicolas Chautru burst_sz, true); 6148335c11fdSNicolas Chautru 6149d819c083SNicolas Chautru /* Start time meas for enqueue function offload latency */ 6150d819c083SNicolas Chautru enq_start_time = rte_rdtsc_precise(); 6151d819c083SNicolas Chautru do { 6152d819c083SNicolas Chautru enq += rte_bbdev_enqueue_ldpc_dec_ops(dev_id, queue_id, 6153d819c083SNicolas Chautru &ops_enq[enq], burst_sz - enq); 6154d819c083SNicolas Chautru } while (unlikely(burst_sz != enq)); 6155d819c083SNicolas Chautru 6156335c11fdSNicolas Chautru enq_sw_last_time = rte_rdtsc_precise() - enq_start_time; 6157d819c083SNicolas Chautru ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); 6158d819c083SNicolas Chautru TEST_ASSERT_SUCCESS(ret, 6159d819c083SNicolas Chautru "Failed to get stats for queue (%u) of device (%u)", 6160d819c083SNicolas Chautru queue_id, dev_id); 6161d819c083SNicolas Chautru 6162335c11fdSNicolas Chautru enq_sw_last_time -= stats.acc_offload_cycles; 6163d819c083SNicolas Chautru time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, 6164d819c083SNicolas Chautru enq_sw_last_time); 6165d819c083SNicolas Chautru time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, 6166d819c083SNicolas Chautru enq_sw_last_time); 6167d819c083SNicolas Chautru time_st->enq_sw_total_time += enq_sw_last_time; 6168d819c083SNicolas Chautru 6169d819c083SNicolas Chautru time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, 6170d819c083SNicolas Chautru stats.acc_offload_cycles); 6171d819c083SNicolas Chautru time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, 6172d819c083SNicolas Chautru stats.acc_offload_cycles); 6173d819c083SNicolas Chautru time_st->enq_acc_total_time += stats.acc_offload_cycles; 6174d819c083SNicolas Chautru 6175d819c083SNicolas Chautru /* give time for device to process ops */ 61765c3f7fc5SNicolas Chautru rte_delay_us(WAIT_OFFLOAD_US); 6177d819c083SNicolas Chautru 6178d819c083SNicolas Chautru /* Start time meas for dequeue function offload latency */ 6179d819c083SNicolas Chautru deq_start_time = rte_rdtsc_precise(); 6180d819c083SNicolas Chautru /* Dequeue one operation */ 6181d819c083SNicolas Chautru do { 6182d819c083SNicolas Chautru deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, 6183f32e93b1SNicolas Chautru &ops_deq[deq], enq); 6184f32e93b1SNicolas Chautru } while (unlikely(deq == 0)); 6185d819c083SNicolas Chautru 6186d819c083SNicolas Chautru deq_last_time = rte_rdtsc_precise() - deq_start_time; 6187d819c083SNicolas Chautru time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, 6188d819c083SNicolas Chautru deq_last_time); 6189d819c083SNicolas Chautru time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, 6190d819c083SNicolas Chautru deq_last_time); 6191d819c083SNicolas Chautru time_st->deq_total_time += deq_last_time; 6192d819c083SNicolas Chautru 6193d819c083SNicolas Chautru /* Dequeue remaining operations if needed*/ 6194d819c083SNicolas Chautru while (burst_sz != deq) 6195335c11fdSNicolas Chautru deq += rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, 6196d819c083SNicolas Chautru &ops_deq[deq], burst_sz - deq); 6197d819c083SNicolas Chautru 6198335c11fdSNicolas Chautru if (extDdr) { 6199335c11fdSNicolas Chautru /* Read loopback is not thread safe */ 6200335c11fdSNicolas Chautru retrieve_harq_ddr(dev_id, queue_id, ops_enq, burst_sz); 6201335c11fdSNicolas Chautru } 6202335c11fdSNicolas Chautru 6203d819c083SNicolas Chautru rte_bbdev_dec_op_free_bulk(ops_enq, deq); 6204d819c083SNicolas Chautru dequeued += deq; 6205d819c083SNicolas Chautru } 6206d819c083SNicolas Chautru 6207d819c083SNicolas Chautru return i; 6208d819c083SNicolas Chautru } 6209d819c083SNicolas Chautru 6210d819c083SNicolas Chautru static int 6211f714a188SAmr Mokhtar offload_latency_test_enc(struct rte_mempool *mempool, struct test_buffers *bufs, 6212f714a188SAmr Mokhtar struct rte_bbdev_enc_op *ref_op, uint16_t dev_id, 6213f714a188SAmr Mokhtar uint16_t queue_id, const uint16_t num_to_process, 6214864edd69SKamil Chalupnik uint16_t burst_sz, struct test_time_stats *time_st) 6215f714a188SAmr Mokhtar { 6216864edd69SKamil Chalupnik int i, dequeued, ret; 6217f714a188SAmr Mokhtar struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 6218f714a188SAmr Mokhtar uint64_t enq_start_time, deq_start_time; 6219864edd69SKamil Chalupnik uint64_t enq_sw_last_time, deq_last_time; 6220864edd69SKamil Chalupnik struct rte_bbdev_stats stats; 6221f714a188SAmr Mokhtar 6222f714a188SAmr Mokhtar for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 6223f714a188SAmr Mokhtar uint16_t enq = 0, deq = 0; 6224f714a188SAmr Mokhtar 6225f714a188SAmr Mokhtar if (unlikely(num_to_process - dequeued < burst_sz)) 6226f714a188SAmr Mokhtar burst_sz = num_to_process - dequeued; 6227f714a188SAmr Mokhtar 6228be840d08SNicolas Chautru ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); 62295884e56fSHernan Vargas TEST_ASSERT_SUCCESS(ret, "rte_bbdev_enc_op_alloc_bulk() failed"); 6230f714a188SAmr Mokhtar if (test_vector.op_type != RTE_BBDEV_OP_NONE) 6231f714a188SAmr Mokhtar copy_reference_enc_op(ops_enq, burst_sz, dequeued, 6232f714a188SAmr Mokhtar bufs->inputs, 6233f714a188SAmr Mokhtar bufs->hard_outputs, 6234f714a188SAmr Mokhtar ref_op); 6235f714a188SAmr Mokhtar 6236864edd69SKamil Chalupnik /* Start time meas for enqueue function offload latency */ 6237864edd69SKamil Chalupnik enq_start_time = rte_rdtsc_precise(); 6238f714a188SAmr Mokhtar do { 6239f714a188SAmr Mokhtar enq += rte_bbdev_enqueue_enc_ops(dev_id, queue_id, 6240f714a188SAmr Mokhtar &ops_enq[enq], burst_sz - enq); 6241f714a188SAmr Mokhtar } while (unlikely(burst_sz != enq)); 6242864edd69SKamil Chalupnik 6243335c11fdSNicolas Chautru enq_sw_last_time = rte_rdtsc_precise() - enq_start_time; 6244335c11fdSNicolas Chautru 6245864edd69SKamil Chalupnik ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); 6246864edd69SKamil Chalupnik TEST_ASSERT_SUCCESS(ret, 6247864edd69SKamil Chalupnik "Failed to get stats for queue (%u) of device (%u)", 6248864edd69SKamil Chalupnik queue_id, dev_id); 6249335c11fdSNicolas Chautru enq_sw_last_time -= stats.acc_offload_cycles; 6250864edd69SKamil Chalupnik time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, 6251864edd69SKamil Chalupnik enq_sw_last_time); 6252864edd69SKamil Chalupnik time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, 6253864edd69SKamil Chalupnik enq_sw_last_time); 62549fa6ebdeSKamil Chalupnik time_st->enq_sw_total_time += enq_sw_last_time; 6255864edd69SKamil Chalupnik 62569fa6ebdeSKamil Chalupnik time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, 62579fa6ebdeSKamil Chalupnik stats.acc_offload_cycles); 62589fa6ebdeSKamil Chalupnik time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, 62599fa6ebdeSKamil Chalupnik stats.acc_offload_cycles); 62609fa6ebdeSKamil Chalupnik time_st->enq_acc_total_time += stats.acc_offload_cycles; 6261f714a188SAmr Mokhtar 6262d819c083SNicolas Chautru /* give time for device to process ops */ 62635c3f7fc5SNicolas Chautru rte_delay_us(WAIT_OFFLOAD_US); 6264f714a188SAmr Mokhtar 6265864edd69SKamil Chalupnik /* Start time meas for dequeue function offload latency */ 6266864edd69SKamil Chalupnik deq_start_time = rte_rdtsc_precise(); 6267864edd69SKamil Chalupnik /* Dequeue one operation */ 6268f714a188SAmr Mokhtar do { 6269f714a188SAmr Mokhtar deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, 6270f32e93b1SNicolas Chautru &ops_deq[deq], enq); 6271f32e93b1SNicolas Chautru } while (unlikely(deq == 0)); 6272864edd69SKamil Chalupnik 6273864edd69SKamil Chalupnik deq_last_time = rte_rdtsc_precise() - deq_start_time; 6274864edd69SKamil Chalupnik time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, 6275864edd69SKamil Chalupnik deq_last_time); 6276864edd69SKamil Chalupnik time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, 6277864edd69SKamil Chalupnik deq_last_time); 62789fa6ebdeSKamil Chalupnik time_st->deq_total_time += deq_last_time; 6279864edd69SKamil Chalupnik 6280864edd69SKamil Chalupnik while (burst_sz != deq) 6281864edd69SKamil Chalupnik deq += rte_bbdev_dequeue_enc_ops(dev_id, queue_id, 6282f714a188SAmr Mokhtar &ops_deq[deq], burst_sz - deq); 6283f714a188SAmr Mokhtar 6284f714a188SAmr Mokhtar rte_bbdev_enc_op_free_bulk(ops_enq, deq); 6285f714a188SAmr Mokhtar dequeued += deq; 6286f714a188SAmr Mokhtar } 6287f714a188SAmr Mokhtar 6288f714a188SAmr Mokhtar return i; 6289f714a188SAmr Mokhtar } 6290d819c083SNicolas Chautru 6291d819c083SNicolas Chautru static int 6292d819c083SNicolas Chautru offload_latency_test_ldpc_enc(struct rte_mempool *mempool, 6293d819c083SNicolas Chautru struct test_buffers *bufs, 6294d819c083SNicolas Chautru struct rte_bbdev_enc_op *ref_op, uint16_t dev_id, 6295d819c083SNicolas Chautru uint16_t queue_id, const uint16_t num_to_process, 6296d819c083SNicolas Chautru uint16_t burst_sz, struct test_time_stats *time_st) 6297d819c083SNicolas Chautru { 6298d819c083SNicolas Chautru int i, dequeued, ret; 6299d819c083SNicolas Chautru struct rte_bbdev_enc_op *ops_enq[MAX_BURST], *ops_deq[MAX_BURST]; 6300d819c083SNicolas Chautru uint64_t enq_start_time, deq_start_time; 6301d819c083SNicolas Chautru uint64_t enq_sw_last_time, deq_last_time; 6302d819c083SNicolas Chautru struct rte_bbdev_stats stats; 6303d819c083SNicolas Chautru 6304d819c083SNicolas Chautru for (i = 0, dequeued = 0; dequeued < num_to_process; ++i) { 6305d819c083SNicolas Chautru uint16_t enq = 0, deq = 0; 6306d819c083SNicolas Chautru 6307d819c083SNicolas Chautru if (unlikely(num_to_process - dequeued < burst_sz)) 6308d819c083SNicolas Chautru burst_sz = num_to_process - dequeued; 6309d819c083SNicolas Chautru 6310be840d08SNicolas Chautru ret = rte_bbdev_enc_op_alloc_bulk(mempool, ops_enq, burst_sz); 63115884e56fSHernan Vargas TEST_ASSERT_SUCCESS(ret, "rte_bbdev_enc_op_alloc_bulk() failed"); 6312d819c083SNicolas Chautru if (test_vector.op_type != RTE_BBDEV_OP_NONE) 6313d819c083SNicolas Chautru copy_reference_ldpc_enc_op(ops_enq, burst_sz, dequeued, 6314d819c083SNicolas Chautru bufs->inputs, 6315d819c083SNicolas Chautru bufs->hard_outputs, 6316d819c083SNicolas Chautru ref_op); 6317d819c083SNicolas Chautru 6318d819c083SNicolas Chautru /* Start time meas for enqueue function offload latency */ 6319d819c083SNicolas Chautru enq_start_time = rte_rdtsc_precise(); 6320d819c083SNicolas Chautru do { 6321d819c083SNicolas Chautru enq += rte_bbdev_enqueue_ldpc_enc_ops(dev_id, queue_id, 6322d819c083SNicolas Chautru &ops_enq[enq], burst_sz - enq); 6323d819c083SNicolas Chautru } while (unlikely(burst_sz != enq)); 6324d819c083SNicolas Chautru 6325335c11fdSNicolas Chautru enq_sw_last_time = rte_rdtsc_precise() - enq_start_time; 6326d819c083SNicolas Chautru ret = get_bbdev_queue_stats(dev_id, queue_id, &stats); 6327d819c083SNicolas Chautru TEST_ASSERT_SUCCESS(ret, 6328d819c083SNicolas Chautru "Failed to get stats for queue (%u) of device (%u)", 6329d819c083SNicolas Chautru queue_id, dev_id); 6330d819c083SNicolas Chautru 6331335c11fdSNicolas Chautru enq_sw_last_time -= stats.acc_offload_cycles; 6332d819c083SNicolas Chautru time_st->enq_sw_max_time = RTE_MAX(time_st->enq_sw_max_time, 6333d819c083SNicolas Chautru enq_sw_last_time); 6334d819c083SNicolas Chautru time_st->enq_sw_min_time = RTE_MIN(time_st->enq_sw_min_time, 6335d819c083SNicolas Chautru enq_sw_last_time); 6336d819c083SNicolas Chautru time_st->enq_sw_total_time += enq_sw_last_time; 6337d819c083SNicolas Chautru 6338d819c083SNicolas Chautru time_st->enq_acc_max_time = RTE_MAX(time_st->enq_acc_max_time, 6339d819c083SNicolas Chautru stats.acc_offload_cycles); 6340d819c083SNicolas Chautru time_st->enq_acc_min_time = RTE_MIN(time_st->enq_acc_min_time, 6341d819c083SNicolas Chautru stats.acc_offload_cycles); 6342d819c083SNicolas Chautru time_st->enq_acc_total_time += stats.acc_offload_cycles; 6343d819c083SNicolas Chautru 6344d819c083SNicolas Chautru /* give time for device to process ops */ 63455c3f7fc5SNicolas Chautru rte_delay_us(WAIT_OFFLOAD_US); 6346d819c083SNicolas Chautru 6347d819c083SNicolas Chautru /* Start time meas for dequeue function offload latency */ 6348d819c083SNicolas Chautru deq_start_time = rte_rdtsc_precise(); 6349d819c083SNicolas Chautru /* Dequeue one operation */ 6350d819c083SNicolas Chautru do { 6351d819c083SNicolas Chautru deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, 6352f32e93b1SNicolas Chautru &ops_deq[deq], enq); 6353f32e93b1SNicolas Chautru } while (unlikely(deq == 0)); 6354d819c083SNicolas Chautru 6355d819c083SNicolas Chautru deq_last_time = rte_rdtsc_precise() - deq_start_time; 6356d819c083SNicolas Chautru time_st->deq_max_time = RTE_MAX(time_st->deq_max_time, 6357d819c083SNicolas Chautru deq_last_time); 6358d819c083SNicolas Chautru time_st->deq_min_time = RTE_MIN(time_st->deq_min_time, 6359d819c083SNicolas Chautru deq_last_time); 6360d819c083SNicolas Chautru time_st->deq_total_time += deq_last_time; 6361d819c083SNicolas Chautru 6362d819c083SNicolas Chautru while (burst_sz != deq) 6363d819c083SNicolas Chautru deq += rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, 6364d819c083SNicolas Chautru &ops_deq[deq], burst_sz - deq); 6365d819c083SNicolas Chautru 6366d819c083SNicolas Chautru rte_bbdev_enc_op_free_bulk(ops_enq, deq); 6367d819c083SNicolas Chautru dequeued += deq; 6368d819c083SNicolas Chautru } 6369d819c083SNicolas Chautru 6370d819c083SNicolas Chautru return i; 6371d819c083SNicolas Chautru } 6372f714a188SAmr Mokhtar 6373f714a188SAmr Mokhtar static int 6374864edd69SKamil Chalupnik offload_cost_test(struct active_device *ad, 6375f714a188SAmr Mokhtar struct test_op_params *op_params) 6376f714a188SAmr Mokhtar { 6377ce1b6289SHernan Vargas int iter, ret; 6378f714a188SAmr Mokhtar uint16_t burst_sz = op_params->burst_sz; 6379f714a188SAmr Mokhtar const uint16_t num_to_process = op_params->num_to_process; 6380f714a188SAmr Mokhtar const enum rte_bbdev_op_type op_type = test_vector.op_type; 6381f714a188SAmr Mokhtar const uint16_t queue_id = ad->queue_ids[0]; 6382f714a188SAmr Mokhtar struct test_buffers *bufs = NULL; 6383f714a188SAmr Mokhtar struct rte_bbdev_info info; 6384f714a188SAmr Mokhtar const char *op_type_str; 6385864edd69SKamil Chalupnik struct test_time_stats time_st; 6386864edd69SKamil Chalupnik 6387864edd69SKamil Chalupnik memset(&time_st, 0, sizeof(struct test_time_stats)); 6388864edd69SKamil Chalupnik time_st.enq_sw_min_time = UINT64_MAX; 63899fa6ebdeSKamil Chalupnik time_st.enq_acc_min_time = UINT64_MAX; 6390864edd69SKamil Chalupnik time_st.deq_min_time = UINT64_MAX; 6391f714a188SAmr Mokhtar 6392f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 6393f714a188SAmr Mokhtar "BURST_SIZE should be <= %u", MAX_BURST); 6394f714a188SAmr Mokhtar 6395f714a188SAmr Mokhtar rte_bbdev_info_get(ad->dev_id, &info); 6396f714a188SAmr Mokhtar bufs = &op_params->q_bufs[GET_SOCKET(info.socket_id)][queue_id]; 6397f714a188SAmr Mokhtar 6398f714a188SAmr Mokhtar op_type_str = rte_bbdev_op_type_str(op_type); 6399f714a188SAmr Mokhtar TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); 6400f714a188SAmr Mokhtar 6401d819c083SNicolas Chautru printf("+ ------------------------------------------------------- +\n"); 6402d819c083SNicolas Chautru printf("== test: offload latency test\ndev: %s, burst size: %u, num ops: %u, op type: %s\n", 6403f714a188SAmr Mokhtar info.dev_name, burst_sz, num_to_process, op_type_str); 6404f714a188SAmr Mokhtar 6405f714a188SAmr Mokhtar if (op_type == RTE_BBDEV_OP_TURBO_DEC) 6406f714a188SAmr Mokhtar iter = offload_latency_test_dec(op_params->mp, bufs, 6407f714a188SAmr Mokhtar op_params->ref_dec_op, ad->dev_id, queue_id, 6408864edd69SKamil Chalupnik num_to_process, burst_sz, &time_st); 6409d819c083SNicolas Chautru else if (op_type == RTE_BBDEV_OP_TURBO_ENC) 6410d819c083SNicolas Chautru iter = offload_latency_test_enc(op_params->mp, bufs, 6411d819c083SNicolas Chautru op_params->ref_enc_op, ad->dev_id, queue_id, 6412d819c083SNicolas Chautru num_to_process, burst_sz, &time_st); 6413d819c083SNicolas Chautru else if (op_type == RTE_BBDEV_OP_LDPC_ENC) 6414d819c083SNicolas Chautru iter = offload_latency_test_ldpc_enc(op_params->mp, bufs, 6415d819c083SNicolas Chautru op_params->ref_enc_op, ad->dev_id, queue_id, 6416d819c083SNicolas Chautru num_to_process, burst_sz, &time_st); 6417d819c083SNicolas Chautru else if (op_type == RTE_BBDEV_OP_LDPC_DEC) 6418d819c083SNicolas Chautru iter = offload_latency_test_ldpc_dec(op_params->mp, bufs, 6419d819c083SNicolas Chautru op_params->ref_dec_op, ad->dev_id, queue_id, 6420d819c083SNicolas Chautru num_to_process, burst_sz, &time_st); 64210acdb986SNicolas Chautru else if (op_type == RTE_BBDEV_OP_FFT) 64220acdb986SNicolas Chautru iter = offload_latency_test_fft(op_params->mp, bufs, 64230acdb986SNicolas Chautru op_params->ref_fft_op, ad->dev_id, queue_id, 64240acdb986SNicolas Chautru num_to_process, burst_sz, &time_st); 642595f192a4SHernan Vargas else if (op_type == RTE_BBDEV_OP_MLDTS) 642695f192a4SHernan Vargas iter = offload_latency_test_mldts(op_params->mp, bufs, 642795f192a4SHernan Vargas op_params->ref_mldts_op, ad->dev_id, queue_id, 642895f192a4SHernan Vargas num_to_process, burst_sz, &time_st); 6429f714a188SAmr Mokhtar else 6430f714a188SAmr Mokhtar iter = offload_latency_test_enc(op_params->mp, bufs, 6431f714a188SAmr Mokhtar op_params->ref_enc_op, ad->dev_id, queue_id, 6432864edd69SKamil Chalupnik num_to_process, burst_sz, &time_st); 6433f714a188SAmr Mokhtar 6434c3aaec26SAmr Mokhtar if (iter <= 0) 6435f714a188SAmr Mokhtar return TEST_FAILED; 6436f714a188SAmr Mokhtar 6437d819c083SNicolas Chautru printf("Enqueue driver offload cost latency:\n" 6438d819c083SNicolas Chautru "\tavg: %lg cycles, %lg us\n" 6439d819c083SNicolas Chautru "\tmin: %lg cycles, %lg us\n" 6440d819c083SNicolas Chautru "\tmax: %lg cycles, %lg us\n" 6441d819c083SNicolas Chautru "Enqueue accelerator offload cost latency:\n" 6442d819c083SNicolas Chautru "\tavg: %lg cycles, %lg us\n" 6443d819c083SNicolas Chautru "\tmin: %lg cycles, %lg us\n" 6444d819c083SNicolas Chautru "\tmax: %lg cycles, %lg us\n", 64459fa6ebdeSKamil Chalupnik (double)time_st.enq_sw_total_time / (double)iter, 64469fa6ebdeSKamil Chalupnik (double)(time_st.enq_sw_total_time * 1000000) / 6447864edd69SKamil Chalupnik (double)iter / (double)rte_get_tsc_hz(), 6448864edd69SKamil Chalupnik (double)time_st.enq_sw_min_time, 6449864edd69SKamil Chalupnik (double)(time_st.enq_sw_min_time * 1000000) / 6450864edd69SKamil Chalupnik rte_get_tsc_hz(), (double)time_st.enq_sw_max_time, 6451864edd69SKamil Chalupnik (double)(time_st.enq_sw_max_time * 1000000) / 64529fa6ebdeSKamil Chalupnik rte_get_tsc_hz(), (double)time_st.enq_acc_total_time / 6453864edd69SKamil Chalupnik (double)iter, 64549fa6ebdeSKamil Chalupnik (double)(time_st.enq_acc_total_time * 1000000) / 6455864edd69SKamil Chalupnik (double)iter / (double)rte_get_tsc_hz(), 64569fa6ebdeSKamil Chalupnik (double)time_st.enq_acc_min_time, 64579fa6ebdeSKamil Chalupnik (double)(time_st.enq_acc_min_time * 1000000) / 64589fa6ebdeSKamil Chalupnik rte_get_tsc_hz(), (double)time_st.enq_acc_max_time, 64599fa6ebdeSKamil Chalupnik (double)(time_st.enq_acc_max_time * 1000000) / 6460864edd69SKamil Chalupnik rte_get_tsc_hz()); 6461f714a188SAmr Mokhtar 64629fa6ebdeSKamil Chalupnik printf("Dequeue offload cost latency - one op:\n" 6463d819c083SNicolas Chautru "\tavg: %lg cycles, %lg us\n" 6464d819c083SNicolas Chautru "\tmin: %lg cycles, %lg us\n" 6465d819c083SNicolas Chautru "\tmax: %lg cycles, %lg us\n", 64669fa6ebdeSKamil Chalupnik (double)time_st.deq_total_time / (double)iter, 64679fa6ebdeSKamil Chalupnik (double)(time_st.deq_total_time * 1000000) / 6468864edd69SKamil Chalupnik (double)iter / (double)rte_get_tsc_hz(), 6469864edd69SKamil Chalupnik (double)time_st.deq_min_time, 6470864edd69SKamil Chalupnik (double)(time_st.deq_min_time * 1000000) / 6471864edd69SKamil Chalupnik rte_get_tsc_hz(), (double)time_st.deq_max_time, 6472864edd69SKamil Chalupnik (double)(time_st.deq_max_time * 1000000) / 6473864edd69SKamil Chalupnik rte_get_tsc_hz()); 6474f714a188SAmr Mokhtar 6475c2560435SNicolas Chautru struct rte_bbdev_stats stats = {0}; 6476ce1b6289SHernan Vargas ret = get_bbdev_queue_stats(ad->dev_id, queue_id, &stats); 6477ce1b6289SHernan Vargas TEST_ASSERT_SUCCESS(ret, 6478ce1b6289SHernan Vargas "Failed to get stats for queue (%u) of device (%u)", 6479ce1b6289SHernan Vargas queue_id, ad->dev_id); 6480c00b1677SHernan Vargas if (stats.enqueue_warn_count > 0) 6481c00b1677SHernan Vargas printf("Warning reported on the queue : %10"PRIu64"\n", 6482c00b1677SHernan Vargas stats.enqueue_warn_count); 6483c2560435SNicolas Chautru if (op_type != RTE_BBDEV_OP_LDPC_DEC) { 6484c2560435SNicolas Chautru TEST_ASSERT_SUCCESS(stats.enqueued_count != num_to_process, 6485c2560435SNicolas Chautru "Mismatch in enqueue count %10"PRIu64" %d", 6486c2560435SNicolas Chautru stats.enqueued_count, num_to_process); 6487c2560435SNicolas Chautru TEST_ASSERT_SUCCESS(stats.dequeued_count != num_to_process, 6488c2560435SNicolas Chautru "Mismatch in dequeue count %10"PRIu64" %d", 6489c2560435SNicolas Chautru stats.dequeued_count, num_to_process); 6490c2560435SNicolas Chautru } 6491c2560435SNicolas Chautru TEST_ASSERT_SUCCESS(stats.enqueue_err_count != 0, 6492c2560435SNicolas Chautru "Enqueue count Error %10"PRIu64"", 6493c2560435SNicolas Chautru stats.enqueue_err_count); 6494c2560435SNicolas Chautru TEST_ASSERT_SUCCESS(stats.dequeue_err_count != 0, 6495c2560435SNicolas Chautru "Dequeue count Error (%10"PRIu64"", 6496c2560435SNicolas Chautru stats.dequeue_err_count); 6497c2560435SNicolas Chautru 6498f714a188SAmr Mokhtar return TEST_SUCCESS; 6499f714a188SAmr Mokhtar } 6500f714a188SAmr Mokhtar 6501f714a188SAmr Mokhtar static int 6502f714a188SAmr Mokhtar offload_latency_empty_q_test_dec(uint16_t dev_id, uint16_t queue_id, 6503f714a188SAmr Mokhtar const uint16_t num_to_process, uint16_t burst_sz, 65049fa6ebdeSKamil Chalupnik uint64_t *deq_total_time, uint64_t *deq_min_time, 65056e024c4bSNicolas Chautru uint64_t *deq_max_time, const enum rte_bbdev_op_type op_type) 6506f714a188SAmr Mokhtar { 6507f714a188SAmr Mokhtar int i, deq_total; 6508f714a188SAmr Mokhtar struct rte_bbdev_dec_op *ops[MAX_BURST]; 6509864edd69SKamil Chalupnik uint64_t deq_start_time, deq_last_time; 6510f714a188SAmr Mokhtar 6511f714a188SAmr Mokhtar /* Test deq offload latency from an empty queue */ 6512864edd69SKamil Chalupnik 6513f714a188SAmr Mokhtar for (i = 0, deq_total = 0; deq_total < num_to_process; 6514f714a188SAmr Mokhtar ++i, deq_total += burst_sz) { 6515864edd69SKamil Chalupnik deq_start_time = rte_rdtsc_precise(); 6516864edd69SKamil Chalupnik 6517f714a188SAmr Mokhtar if (unlikely(num_to_process - deq_total < burst_sz)) 6518f714a188SAmr Mokhtar burst_sz = num_to_process - deq_total; 65196e024c4bSNicolas Chautru if (op_type == RTE_BBDEV_OP_LDPC_DEC) 65206e024c4bSNicolas Chautru rte_bbdev_dequeue_ldpc_dec_ops(dev_id, queue_id, ops, 65216e024c4bSNicolas Chautru burst_sz); 65226e024c4bSNicolas Chautru else 65236e024c4bSNicolas Chautru rte_bbdev_dequeue_dec_ops(dev_id, queue_id, ops, 65246e024c4bSNicolas Chautru burst_sz); 6525864edd69SKamil Chalupnik 6526864edd69SKamil Chalupnik deq_last_time = rte_rdtsc_precise() - deq_start_time; 6527864edd69SKamil Chalupnik *deq_max_time = RTE_MAX(*deq_max_time, deq_last_time); 6528864edd69SKamil Chalupnik *deq_min_time = RTE_MIN(*deq_min_time, deq_last_time); 65299fa6ebdeSKamil Chalupnik *deq_total_time += deq_last_time; 6530f714a188SAmr Mokhtar } 6531f714a188SAmr Mokhtar 6532f714a188SAmr Mokhtar return i; 6533f714a188SAmr Mokhtar } 6534f714a188SAmr Mokhtar 6535f714a188SAmr Mokhtar static int 6536f714a188SAmr Mokhtar offload_latency_empty_q_test_enc(uint16_t dev_id, uint16_t queue_id, 6537f714a188SAmr Mokhtar const uint16_t num_to_process, uint16_t burst_sz, 65389fa6ebdeSKamil Chalupnik uint64_t *deq_total_time, uint64_t *deq_min_time, 65396e024c4bSNicolas Chautru uint64_t *deq_max_time, const enum rte_bbdev_op_type op_type) 6540f714a188SAmr Mokhtar { 6541f714a188SAmr Mokhtar int i, deq_total; 6542f714a188SAmr Mokhtar struct rte_bbdev_enc_op *ops[MAX_BURST]; 6543864edd69SKamil Chalupnik uint64_t deq_start_time, deq_last_time; 6544f714a188SAmr Mokhtar 6545f714a188SAmr Mokhtar /* Test deq offload latency from an empty queue */ 6546f714a188SAmr Mokhtar for (i = 0, deq_total = 0; deq_total < num_to_process; 6547f714a188SAmr Mokhtar ++i, deq_total += burst_sz) { 6548864edd69SKamil Chalupnik deq_start_time = rte_rdtsc_precise(); 6549864edd69SKamil Chalupnik 6550f714a188SAmr Mokhtar if (unlikely(num_to_process - deq_total < burst_sz)) 6551f714a188SAmr Mokhtar burst_sz = num_to_process - deq_total; 65526e024c4bSNicolas Chautru if (op_type == RTE_BBDEV_OP_LDPC_ENC) 65536e024c4bSNicolas Chautru rte_bbdev_dequeue_ldpc_enc_ops(dev_id, queue_id, ops, 65546e024c4bSNicolas Chautru burst_sz); 65556e024c4bSNicolas Chautru else 65566e024c4bSNicolas Chautru rte_bbdev_dequeue_enc_ops(dev_id, queue_id, ops, 65576e024c4bSNicolas Chautru burst_sz); 6558864edd69SKamil Chalupnik 6559864edd69SKamil Chalupnik deq_last_time = rte_rdtsc_precise() - deq_start_time; 6560864edd69SKamil Chalupnik *deq_max_time = RTE_MAX(*deq_max_time, deq_last_time); 6561864edd69SKamil Chalupnik *deq_min_time = RTE_MIN(*deq_min_time, deq_last_time); 65629fa6ebdeSKamil Chalupnik *deq_total_time += deq_last_time; 6563f714a188SAmr Mokhtar } 6564f714a188SAmr Mokhtar 6565f714a188SAmr Mokhtar return i; 6566f714a188SAmr Mokhtar } 65676e024c4bSNicolas Chautru 6568f714a188SAmr Mokhtar static int 6569f714a188SAmr Mokhtar offload_latency_empty_q_test(struct active_device *ad, 6570f714a188SAmr Mokhtar struct test_op_params *op_params) 6571f714a188SAmr Mokhtar { 6572f714a188SAmr Mokhtar int iter; 65739fa6ebdeSKamil Chalupnik uint64_t deq_total_time, deq_min_time, deq_max_time; 6574f714a188SAmr Mokhtar uint16_t burst_sz = op_params->burst_sz; 6575f714a188SAmr Mokhtar const uint16_t num_to_process = op_params->num_to_process; 6576f714a188SAmr Mokhtar const enum rte_bbdev_op_type op_type = test_vector.op_type; 6577f714a188SAmr Mokhtar const uint16_t queue_id = ad->queue_ids[0]; 6578f714a188SAmr Mokhtar struct rte_bbdev_info info; 6579f714a188SAmr Mokhtar const char *op_type_str; 6580f714a188SAmr Mokhtar 65819fa6ebdeSKamil Chalupnik deq_total_time = deq_max_time = 0; 6582864edd69SKamil Chalupnik deq_min_time = UINT64_MAX; 6583864edd69SKamil Chalupnik 6584f714a188SAmr Mokhtar TEST_ASSERT_SUCCESS((burst_sz > MAX_BURST), 6585f714a188SAmr Mokhtar "BURST_SIZE should be <= %u", MAX_BURST); 6586f714a188SAmr Mokhtar 6587f714a188SAmr Mokhtar rte_bbdev_info_get(ad->dev_id, &info); 6588f714a188SAmr Mokhtar 6589f714a188SAmr Mokhtar op_type_str = rte_bbdev_op_type_str(op_type); 6590f714a188SAmr Mokhtar TEST_ASSERT_NOT_NULL(op_type_str, "Invalid op type: %u", op_type); 6591f714a188SAmr Mokhtar 6592d819c083SNicolas Chautru printf("+ ------------------------------------------------------- +\n"); 6593d819c083SNicolas Chautru printf("== test: offload latency empty dequeue\ndev: %s, burst size: %u, num ops: %u, op type: %s\n", 6594f714a188SAmr Mokhtar info.dev_name, burst_sz, num_to_process, op_type_str); 6595f714a188SAmr Mokhtar 65966e024c4bSNicolas Chautru if (op_type == RTE_BBDEV_OP_TURBO_DEC || 65976e024c4bSNicolas Chautru op_type == RTE_BBDEV_OP_LDPC_DEC) 6598f714a188SAmr Mokhtar iter = offload_latency_empty_q_test_dec(ad->dev_id, queue_id, 65999fa6ebdeSKamil Chalupnik num_to_process, burst_sz, &deq_total_time, 66006e024c4bSNicolas Chautru &deq_min_time, &deq_max_time, op_type); 6601f714a188SAmr Mokhtar else 6602f714a188SAmr Mokhtar iter = offload_latency_empty_q_test_enc(ad->dev_id, queue_id, 66039fa6ebdeSKamil Chalupnik num_to_process, burst_sz, &deq_total_time, 66046e024c4bSNicolas Chautru &deq_min_time, &deq_max_time, op_type); 6605f714a188SAmr Mokhtar 6606c3aaec26SAmr Mokhtar if (iter <= 0) 6607f714a188SAmr Mokhtar return TEST_FAILED; 6608f714a188SAmr Mokhtar 6609d819c083SNicolas Chautru printf("Empty dequeue offload:\n" 6610d819c083SNicolas Chautru "\tavg: %lg cycles, %lg us\n" 6611d819c083SNicolas Chautru "\tmin: %lg cycles, %lg us\n" 6612d819c083SNicolas Chautru "\tmax: %lg cycles, %lg us\n", 66139fa6ebdeSKamil Chalupnik (double)deq_total_time / (double)iter, 66149fa6ebdeSKamil Chalupnik (double)(deq_total_time * 1000000) / (double)iter / 6615864edd69SKamil Chalupnik (double)rte_get_tsc_hz(), (double)deq_min_time, 6616864edd69SKamil Chalupnik (double)(deq_min_time * 1000000) / rte_get_tsc_hz(), 6617864edd69SKamil Chalupnik (double)deq_max_time, (double)(deq_max_time * 1000000) / 6618864edd69SKamil Chalupnik rte_get_tsc_hz()); 6619f714a188SAmr Mokhtar 6620f714a188SAmr Mokhtar return TEST_SUCCESS; 6621f714a188SAmr Mokhtar } 6622f714a188SAmr Mokhtar 6623f714a188SAmr Mokhtar static int 6624f41c6e4dSNicolas Chautru bler_tc(void) 6625f41c6e4dSNicolas Chautru { 6626f41c6e4dSNicolas Chautru return run_test_case(bler_test); 6627f41c6e4dSNicolas Chautru } 6628f41c6e4dSNicolas Chautru 6629f41c6e4dSNicolas Chautru static int 6630f714a188SAmr Mokhtar throughput_tc(void) 6631f714a188SAmr Mokhtar { 6632f714a188SAmr Mokhtar return run_test_case(throughput_test); 6633f714a188SAmr Mokhtar } 6634f714a188SAmr Mokhtar 6635f714a188SAmr Mokhtar static int 6636864edd69SKamil Chalupnik offload_cost_tc(void) 6637f714a188SAmr Mokhtar { 6638864edd69SKamil Chalupnik return run_test_case(offload_cost_test); 6639f714a188SAmr Mokhtar } 6640f714a188SAmr Mokhtar 6641f714a188SAmr Mokhtar static int 6642f714a188SAmr Mokhtar offload_latency_empty_q_tc(void) 6643f714a188SAmr Mokhtar { 6644f714a188SAmr Mokhtar return run_test_case(offload_latency_empty_q_test); 6645f714a188SAmr Mokhtar } 6646f714a188SAmr Mokhtar 6647f714a188SAmr Mokhtar static int 6648864edd69SKamil Chalupnik latency_tc(void) 6649f714a188SAmr Mokhtar { 6650864edd69SKamil Chalupnik return run_test_case(latency_test); 6651f714a188SAmr Mokhtar } 6652f714a188SAmr Mokhtar 6653f714a188SAmr Mokhtar static int 66540ab66275SNicolas Chautru validation_tc(void) 66550ab66275SNicolas Chautru { 66560ab66275SNicolas Chautru return run_test_case(validation_test); 66570ab66275SNicolas Chautru } 66580ab66275SNicolas Chautru 66590ab66275SNicolas Chautru static int 6660f714a188SAmr Mokhtar interrupt_tc(void) 6661f714a188SAmr Mokhtar { 6662f714a188SAmr Mokhtar return run_test_case(throughput_test); 6663f714a188SAmr Mokhtar } 6664f714a188SAmr Mokhtar 6665f41c6e4dSNicolas Chautru static struct unit_test_suite bbdev_bler_testsuite = { 6666f41c6e4dSNicolas Chautru .suite_name = "BBdev BLER Tests", 6667f41c6e4dSNicolas Chautru .setup = testsuite_setup, 6668f41c6e4dSNicolas Chautru .teardown = testsuite_teardown, 6669f41c6e4dSNicolas Chautru .unit_test_cases = { 6670f41c6e4dSNicolas Chautru TEST_CASE_ST(ut_setup, ut_teardown, bler_tc), 6671f41c6e4dSNicolas Chautru TEST_CASES_END() /**< NULL terminate unit test array */ 6672f41c6e4dSNicolas Chautru } 6673f41c6e4dSNicolas Chautru }; 6674f41c6e4dSNicolas Chautru 6675f714a188SAmr Mokhtar static struct unit_test_suite bbdev_throughput_testsuite = { 6676f714a188SAmr Mokhtar .suite_name = "BBdev Throughput Tests", 6677f714a188SAmr Mokhtar .setup = testsuite_setup, 6678f714a188SAmr Mokhtar .teardown = testsuite_teardown, 6679f714a188SAmr Mokhtar .unit_test_cases = { 6680f714a188SAmr Mokhtar TEST_CASE_ST(ut_setup, ut_teardown, throughput_tc), 6681f714a188SAmr Mokhtar TEST_CASES_END() /**< NULL terminate unit test array */ 6682f714a188SAmr Mokhtar } 6683f714a188SAmr Mokhtar }; 6684f714a188SAmr Mokhtar 6685f714a188SAmr Mokhtar static struct unit_test_suite bbdev_validation_testsuite = { 6686f714a188SAmr Mokhtar .suite_name = "BBdev Validation Tests", 6687f714a188SAmr Mokhtar .setup = testsuite_setup, 6688f714a188SAmr Mokhtar .teardown = testsuite_teardown, 6689f714a188SAmr Mokhtar .unit_test_cases = { 66900ab66275SNicolas Chautru TEST_CASE_ST(ut_setup, ut_teardown, validation_tc), 6691f714a188SAmr Mokhtar TEST_CASES_END() /**< NULL terminate unit test array */ 6692f714a188SAmr Mokhtar } 6693f714a188SAmr Mokhtar }; 6694f714a188SAmr Mokhtar 6695f714a188SAmr Mokhtar static struct unit_test_suite bbdev_latency_testsuite = { 6696f714a188SAmr Mokhtar .suite_name = "BBdev Latency Tests", 6697f714a188SAmr Mokhtar .setup = testsuite_setup, 6698f714a188SAmr Mokhtar .teardown = testsuite_teardown, 6699f714a188SAmr Mokhtar .unit_test_cases = { 6700864edd69SKamil Chalupnik TEST_CASE_ST(ut_setup, ut_teardown, latency_tc), 6701864edd69SKamil Chalupnik TEST_CASES_END() /**< NULL terminate unit test array */ 6702864edd69SKamil Chalupnik } 6703864edd69SKamil Chalupnik }; 6704864edd69SKamil Chalupnik 6705864edd69SKamil Chalupnik static struct unit_test_suite bbdev_offload_cost_testsuite = { 6706864edd69SKamil Chalupnik .suite_name = "BBdev Offload Cost Tests", 6707864edd69SKamil Chalupnik .setup = testsuite_setup, 6708864edd69SKamil Chalupnik .teardown = testsuite_teardown, 6709864edd69SKamil Chalupnik .unit_test_cases = { 6710864edd69SKamil Chalupnik TEST_CASE_ST(ut_setup, ut_teardown, offload_cost_tc), 6711f714a188SAmr Mokhtar TEST_CASE_ST(ut_setup, ut_teardown, offload_latency_empty_q_tc), 6712f714a188SAmr Mokhtar TEST_CASES_END() /**< NULL terminate unit test array */ 6713f714a188SAmr Mokhtar } 6714f714a188SAmr Mokhtar }; 6715f714a188SAmr Mokhtar 6716f714a188SAmr Mokhtar static struct unit_test_suite bbdev_interrupt_testsuite = { 6717f714a188SAmr Mokhtar .suite_name = "BBdev Interrupt Tests", 6718f714a188SAmr Mokhtar .setup = interrupt_testsuite_setup, 6719f714a188SAmr Mokhtar .teardown = testsuite_teardown, 6720f714a188SAmr Mokhtar .unit_test_cases = { 6721f714a188SAmr Mokhtar TEST_CASE_ST(ut_setup, ut_teardown, interrupt_tc), 6722f714a188SAmr Mokhtar TEST_CASES_END() /**< NULL terminate unit test array */ 6723f714a188SAmr Mokhtar } 6724f714a188SAmr Mokhtar }; 6725f714a188SAmr Mokhtar 6726f41c6e4dSNicolas Chautru REGISTER_TEST_COMMAND(bler, bbdev_bler_testsuite); 6727f714a188SAmr Mokhtar REGISTER_TEST_COMMAND(throughput, bbdev_throughput_testsuite); 6728f714a188SAmr Mokhtar REGISTER_TEST_COMMAND(validation, bbdev_validation_testsuite); 6729f714a188SAmr Mokhtar REGISTER_TEST_COMMAND(latency, bbdev_latency_testsuite); 6730864edd69SKamil Chalupnik REGISTER_TEST_COMMAND(offload, bbdev_offload_cost_testsuite); 6731f714a188SAmr Mokhtar REGISTER_TEST_COMMAND(interrupt, bbdev_interrupt_testsuite); 6732