11ffee690SAmr Mokhtar /* SPDX-License-Identifier: BSD-3-Clause 21ffee690SAmr Mokhtar * Copyright(c) 2017 Intel Corporation 31ffee690SAmr Mokhtar */ 41ffee690SAmr Mokhtar 5*08966fe7STyler Retzlaff #include <stdalign.h> 61ffee690SAmr Mokhtar #include <stdio.h> 71ffee690SAmr Mokhtar #include <stdlib.h> 81ffee690SAmr Mokhtar #include <string.h> 91ffee690SAmr Mokhtar #include <stdint.h> 101ffee690SAmr Mokhtar #include <inttypes.h> 111ffee690SAmr Mokhtar #include <sys/types.h> 12960f28b2SThomas Monjalon #include <unistd.h> 131ffee690SAmr Mokhtar #include <sys/queue.h> 141ffee690SAmr Mokhtar #include <stdarg.h> 151ffee690SAmr Mokhtar #include <ctype.h> 161ffee690SAmr Mokhtar #include <errno.h> 171ffee690SAmr Mokhtar #include <math.h> 181ffee690SAmr Mokhtar #include <assert.h> 191ffee690SAmr Mokhtar #include <getopt.h> 201ffee690SAmr Mokhtar #include <signal.h> 211ffee690SAmr Mokhtar 227b0de673SThomas Monjalon #include <rte_common.h> 237b0de673SThomas Monjalon #include <rte_eal.h> 247b0de673SThomas Monjalon #include <rte_cycles.h> 257b0de673SThomas Monjalon #include <rte_ether.h> 267b0de673SThomas Monjalon #include <rte_ethdev.h> 277b0de673SThomas Monjalon #include <rte_ip.h> 287b0de673SThomas Monjalon #include <rte_lcore.h> 297b0de673SThomas Monjalon #include <rte_malloc.h> 307b0de673SThomas Monjalon #include <rte_mbuf.h> 3161bf499dSThomas Monjalon #include <rte_mbuf_dyn.h> 327b0de673SThomas Monjalon #include <rte_memory.h> 337b0de673SThomas Monjalon #include <rte_mempool.h> 347b0de673SThomas Monjalon #include <rte_log.h> 357b0de673SThomas Monjalon #include <rte_bbdev.h> 367b0de673SThomas Monjalon #include <rte_bbdev_op.h> 371ffee690SAmr Mokhtar 381ffee690SAmr Mokhtar /* LLR values - negative value for '1' bit */ 391ffee690SAmr Mokhtar #define LLR_1_BIT 0x81 401ffee690SAmr Mokhtar #define LLR_0_BIT 0x7F 411ffee690SAmr Mokhtar 421ffee690SAmr Mokhtar #define MAX_PKT_BURST 32 431ffee690SAmr Mokhtar #define NB_MBUF 8191 441ffee690SAmr Mokhtar #define MEMPOOL_CACHE_SIZE 256 451ffee690SAmr Mokhtar 461ffee690SAmr Mokhtar /* Hardcoded K value */ 471ffee690SAmr Mokhtar #define K 40 481ffee690SAmr Mokhtar #define NCB (3 * RTE_ALIGN_CEIL(K + 4, 32)) 491ffee690SAmr Mokhtar 501ffee690SAmr Mokhtar #define CRC_24B_LEN 3 511ffee690SAmr Mokhtar 521ffee690SAmr Mokhtar /* Configurable number of RX/TX ring descriptors */ 534ed89049SDavid Marchand #define RX_DESC_DEFAULT 128 544ed89049SDavid Marchand #define TX_DESC_DEFAULT 512 551ffee690SAmr Mokhtar 561ffee690SAmr Mokhtar #define BBDEV_ASSERT(a) do { \ 571ffee690SAmr Mokhtar if (!(a)) { \ 581ffee690SAmr Mokhtar usage(prgname); \ 591ffee690SAmr Mokhtar return -1; \ 601ffee690SAmr Mokhtar } \ 611ffee690SAmr Mokhtar } while (0) 621ffee690SAmr Mokhtar 6361bf499dSThomas Monjalon static int input_dynfield_offset = -1; 6461bf499dSThomas Monjalon 6561bf499dSThomas Monjalon static inline struct rte_mbuf ** 6661bf499dSThomas Monjalon mbuf_input(struct rte_mbuf *mbuf) 6761bf499dSThomas Monjalon { 6861bf499dSThomas Monjalon return RTE_MBUF_DYNFIELD(mbuf, 6961bf499dSThomas Monjalon input_dynfield_offset, struct rte_mbuf **); 7061bf499dSThomas Monjalon } 7161bf499dSThomas Monjalon 721ffee690SAmr Mokhtar static const struct rte_eth_conf port_conf = { 731ffee690SAmr Mokhtar .rxmode = { 74295968d1SFerruh Yigit .mq_mode = RTE_ETH_MQ_RX_NONE, 751ffee690SAmr Mokhtar }, 761ffee690SAmr Mokhtar .txmode = { 77295968d1SFerruh Yigit .mq_mode = RTE_ETH_MQ_TX_NONE, 781ffee690SAmr Mokhtar }, 791ffee690SAmr Mokhtar }; 801ffee690SAmr Mokhtar 811ffee690SAmr Mokhtar struct rte_bbdev_op_turbo_enc def_op_enc = { 821ffee690SAmr Mokhtar /* These values are arbitrarily put, and does not map to the real 831ffee690SAmr Mokhtar * values for the data received from ethdev ports 841ffee690SAmr Mokhtar */ 851ffee690SAmr Mokhtar .rv_index = 0, 861ffee690SAmr Mokhtar .code_block_mode = 1, 871ffee690SAmr Mokhtar .cb_params = { 881ffee690SAmr Mokhtar .k = K, 891ffee690SAmr Mokhtar }, 901ffee690SAmr Mokhtar .op_flags = RTE_BBDEV_TURBO_CRC_24A_ATTACH 911ffee690SAmr Mokhtar }; 921ffee690SAmr Mokhtar 931ffee690SAmr Mokhtar struct rte_bbdev_op_turbo_dec def_op_dec = { 941ffee690SAmr Mokhtar /* These values are arbitrarily put, and does not map to the real 951ffee690SAmr Mokhtar * values for the data received from ethdev ports 961ffee690SAmr Mokhtar */ 971ffee690SAmr Mokhtar .code_block_mode = 1, 981ffee690SAmr Mokhtar .cb_params = { 991ffee690SAmr Mokhtar .k = K, 1001ffee690SAmr Mokhtar }, 1011ffee690SAmr Mokhtar .rv_index = 0, 1021ffee690SAmr Mokhtar .iter_max = 8, 1031ffee690SAmr Mokhtar .iter_min = 4, 1041ffee690SAmr Mokhtar .ext_scale = 15, 1051ffee690SAmr Mokhtar .num_maps = 0, 1061ffee690SAmr Mokhtar .op_flags = RTE_BBDEV_TURBO_NEG_LLR_1_BIT_IN 1071ffee690SAmr Mokhtar }; 1081ffee690SAmr Mokhtar 1091ffee690SAmr Mokhtar struct app_config_params { 1101ffee690SAmr Mokhtar /* Placeholders for app params */ 1111ffee690SAmr Mokhtar uint16_t port_id; 1121ffee690SAmr Mokhtar uint16_t bbdev_id; 1131ffee690SAmr Mokhtar uint64_t enc_core_mask; 1141ffee690SAmr Mokhtar uint64_t dec_core_mask; 1151ffee690SAmr Mokhtar 1161ffee690SAmr Mokhtar /* Values filled during init time */ 1171ffee690SAmr Mokhtar uint16_t enc_queue_ids[RTE_MAX_LCORE]; 1181ffee690SAmr Mokhtar uint16_t dec_queue_ids[RTE_MAX_LCORE]; 1191ffee690SAmr Mokhtar uint16_t num_enc_cores; 1201ffee690SAmr Mokhtar uint16_t num_dec_cores; 1211ffee690SAmr Mokhtar }; 1221ffee690SAmr Mokhtar 1231ffee690SAmr Mokhtar struct lcore_statistics { 1241ffee690SAmr Mokhtar unsigned int enqueued; 1251ffee690SAmr Mokhtar unsigned int dequeued; 1261ffee690SAmr Mokhtar unsigned int rx_lost_packets; 1271ffee690SAmr Mokhtar unsigned int enc_to_dec_lost_packets; 1281ffee690SAmr Mokhtar unsigned int tx_lost_packets; 1291ffee690SAmr Mokhtar } __rte_cache_aligned; 1301ffee690SAmr Mokhtar 1311ffee690SAmr Mokhtar /** each lcore configuration */ 1321ffee690SAmr Mokhtar struct lcore_conf { 1331ffee690SAmr Mokhtar uint64_t core_type; 1341ffee690SAmr Mokhtar 1351ffee690SAmr Mokhtar unsigned int port_id; 1361ffee690SAmr Mokhtar unsigned int rx_queue_id; 1371ffee690SAmr Mokhtar unsigned int tx_queue_id; 1381ffee690SAmr Mokhtar 1391ffee690SAmr Mokhtar unsigned int bbdev_id; 1401ffee690SAmr Mokhtar unsigned int enc_queue_id; 1411ffee690SAmr Mokhtar unsigned int dec_queue_id; 1421ffee690SAmr Mokhtar 1431ffee690SAmr Mokhtar uint8_t llr_temp_buf[NCB]; 1441ffee690SAmr Mokhtar 1451ffee690SAmr Mokhtar struct rte_mempool *bbdev_dec_op_pool; 1461ffee690SAmr Mokhtar struct rte_mempool *bbdev_enc_op_pool; 1471ffee690SAmr Mokhtar struct rte_mempool *enc_out_pool; 1481ffee690SAmr Mokhtar struct rte_ring *enc_to_dec_ring; 1491ffee690SAmr Mokhtar 1501ffee690SAmr Mokhtar struct lcore_statistics *lcore_stats; 1511ffee690SAmr Mokhtar } __rte_cache_aligned; 1521ffee690SAmr Mokhtar 1531ffee690SAmr Mokhtar struct stats_lcore_params { 1541ffee690SAmr Mokhtar struct lcore_conf *lconf; 1551ffee690SAmr Mokhtar struct app_config_params *app_params; 1561ffee690SAmr Mokhtar }; 1571ffee690SAmr Mokhtar 1581ffee690SAmr Mokhtar 1591ffee690SAmr Mokhtar static const struct app_config_params def_app_config = { 1601ffee690SAmr Mokhtar .port_id = 0, 1611ffee690SAmr Mokhtar .bbdev_id = 0, 1621ffee690SAmr Mokhtar .enc_core_mask = 0x2, 1631ffee690SAmr Mokhtar .dec_core_mask = 0x4, 1641ffee690SAmr Mokhtar .num_enc_cores = 1, 1651ffee690SAmr Mokhtar .num_dec_cores = 1, 1661ffee690SAmr Mokhtar }; 1671ffee690SAmr Mokhtar 1685bd3c386SJoyce Kong static uint16_t global_exit_flag; 1691ffee690SAmr Mokhtar 1701ffee690SAmr Mokhtar /* display usage */ 1711ffee690SAmr Mokhtar static inline void 1721ffee690SAmr Mokhtar usage(const char *prgname) 1731ffee690SAmr Mokhtar { 1741ffee690SAmr Mokhtar printf("%s [EAL options] " 1751ffee690SAmr Mokhtar " --\n" 1761ffee690SAmr Mokhtar " --enc_cores - number of encoding cores (default = 0x2)\n" 1771ffee690SAmr Mokhtar " --dec_cores - number of decoding cores (default = 0x4)\n" 1781ffee690SAmr Mokhtar " --port_id - Ethernet port ID (default = 0)\n" 1791ffee690SAmr Mokhtar " --bbdev_id - BBDev ID (default = 0)\n" 1801ffee690SAmr Mokhtar "\n", prgname); 1811ffee690SAmr Mokhtar } 1821ffee690SAmr Mokhtar 1831ffee690SAmr Mokhtar /* parse core mask */ 1841ffee690SAmr Mokhtar static inline 1851ffee690SAmr Mokhtar uint16_t bbdev_parse_mask(const char *mask) 1861ffee690SAmr Mokhtar { 1871ffee690SAmr Mokhtar char *end = NULL; 1881ffee690SAmr Mokhtar unsigned long pm; 1891ffee690SAmr Mokhtar 1901ffee690SAmr Mokhtar /* parse hexadecimal string */ 1911ffee690SAmr Mokhtar pm = strtoul(mask, &end, 16); 1921ffee690SAmr Mokhtar if ((mask[0] == '\0') || (end == NULL) || (*end != '\0')) 1931ffee690SAmr Mokhtar return 0; 1941ffee690SAmr Mokhtar 1951ffee690SAmr Mokhtar return pm; 1961ffee690SAmr Mokhtar } 1971ffee690SAmr Mokhtar 1981ffee690SAmr Mokhtar /* parse core mask */ 1991ffee690SAmr Mokhtar static inline 2001ffee690SAmr Mokhtar uint16_t bbdev_parse_number(const char *mask) 2011ffee690SAmr Mokhtar { 2021ffee690SAmr Mokhtar char *end = NULL; 2031ffee690SAmr Mokhtar unsigned long pm; 2041ffee690SAmr Mokhtar 2051ffee690SAmr Mokhtar /* parse hexadecimal string */ 2061ffee690SAmr Mokhtar pm = strtoul(mask, &end, 10); 2071ffee690SAmr Mokhtar if ((mask[0] == '\0') || (end == NULL) || (*end != '\0')) 2081ffee690SAmr Mokhtar return 0; 2091ffee690SAmr Mokhtar 2101ffee690SAmr Mokhtar return pm; 2111ffee690SAmr Mokhtar } 2121ffee690SAmr Mokhtar 2131ffee690SAmr Mokhtar static int 2141ffee690SAmr Mokhtar bbdev_parse_args(int argc, char **argv, 2151ffee690SAmr Mokhtar struct app_config_params *app_params) 2161ffee690SAmr Mokhtar { 2171ffee690SAmr Mokhtar int optind = 0; 2181ffee690SAmr Mokhtar int opt; 2191ffee690SAmr Mokhtar int opt_indx = 0; 2201ffee690SAmr Mokhtar char *prgname = argv[0]; 2211ffee690SAmr Mokhtar 2221ffee690SAmr Mokhtar static struct option lgopts[] = { 2231ffee690SAmr Mokhtar { "enc_core_mask", required_argument, 0, 'e' }, 2241ffee690SAmr Mokhtar { "dec_core_mask", required_argument, 0, 'd' }, 2251ffee690SAmr Mokhtar { "port_id", required_argument, 0, 'p' }, 2261ffee690SAmr Mokhtar { "bbdev_id", required_argument, 0, 'b' }, 2271ffee690SAmr Mokhtar { NULL, 0, 0, 0 } 2281ffee690SAmr Mokhtar }; 2291ffee690SAmr Mokhtar 2301ffee690SAmr Mokhtar BBDEV_ASSERT(argc != 0); 2311ffee690SAmr Mokhtar BBDEV_ASSERT(argv != NULL); 2321ffee690SAmr Mokhtar BBDEV_ASSERT(app_params != NULL); 2331ffee690SAmr Mokhtar 2341ffee690SAmr Mokhtar while ((opt = getopt_long(argc, argv, "e:d:p:b:", lgopts, &opt_indx)) != 2351ffee690SAmr Mokhtar EOF) { 2361ffee690SAmr Mokhtar switch (opt) { 2371ffee690SAmr Mokhtar case 'e': 2381ffee690SAmr Mokhtar app_params->enc_core_mask = 2391ffee690SAmr Mokhtar bbdev_parse_mask(optarg); 2401ffee690SAmr Mokhtar if (app_params->enc_core_mask == 0) { 2411ffee690SAmr Mokhtar usage(prgname); 2421ffee690SAmr Mokhtar return -1; 2431ffee690SAmr Mokhtar } 2441ffee690SAmr Mokhtar app_params->num_enc_cores = 2453d4e27fdSDavid Marchand rte_popcount32(app_params->enc_core_mask); 2461ffee690SAmr Mokhtar break; 2471ffee690SAmr Mokhtar 2481ffee690SAmr Mokhtar case 'd': 2491ffee690SAmr Mokhtar app_params->dec_core_mask = 2501ffee690SAmr Mokhtar bbdev_parse_mask(optarg); 2511ffee690SAmr Mokhtar if (app_params->dec_core_mask == 0) { 2521ffee690SAmr Mokhtar usage(prgname); 2531ffee690SAmr Mokhtar return -1; 2541ffee690SAmr Mokhtar } 2551ffee690SAmr Mokhtar app_params->num_dec_cores = 2563d4e27fdSDavid Marchand rte_popcount32(app_params->dec_core_mask); 2571ffee690SAmr Mokhtar break; 2581ffee690SAmr Mokhtar 2591ffee690SAmr Mokhtar case 'p': 2601ffee690SAmr Mokhtar app_params->port_id = bbdev_parse_number(optarg); 2611ffee690SAmr Mokhtar break; 2621ffee690SAmr Mokhtar 2631ffee690SAmr Mokhtar case 'b': 2641ffee690SAmr Mokhtar app_params->bbdev_id = bbdev_parse_number(optarg); 2651ffee690SAmr Mokhtar break; 2661ffee690SAmr Mokhtar 2671ffee690SAmr Mokhtar default: 2681ffee690SAmr Mokhtar usage(prgname); 2691ffee690SAmr Mokhtar return -1; 2701ffee690SAmr Mokhtar } 2711ffee690SAmr Mokhtar } 2721ffee690SAmr Mokhtar optind = 0; 2731ffee690SAmr Mokhtar return optind; 2741ffee690SAmr Mokhtar } 2751ffee690SAmr Mokhtar 2761ffee690SAmr Mokhtar static void 2771ffee690SAmr Mokhtar signal_handler(int signum) 2781ffee690SAmr Mokhtar { 2791ffee690SAmr Mokhtar printf("\nSignal %d received\n", signum); 2805bd3c386SJoyce Kong __atomic_store_n(&global_exit_flag, 1, __ATOMIC_RELAXED); 2811ffee690SAmr Mokhtar } 2821ffee690SAmr Mokhtar 2831ffee690SAmr Mokhtar static void 2846d13ea8eSOlivier Matz print_mac(unsigned int portid, struct rte_ether_addr *bbdev_ports_eth_address) 2851ffee690SAmr Mokhtar { 286c2c4f87bSAman Deep Singh printf("Port %u, MAC address: " RTE_ETHER_ADDR_PRT_FMT "\n\n", 2871ffee690SAmr Mokhtar (unsigned int) portid, 288a7db3afcSAman Deep Singh RTE_ETHER_ADDR_BYTES(bbdev_ports_eth_address)); 2891ffee690SAmr Mokhtar } 2901ffee690SAmr Mokhtar 2911ffee690SAmr Mokhtar static inline void 2921ffee690SAmr Mokhtar pktmbuf_free_bulk(struct rte_mbuf **mbufs, unsigned int nb_to_free) 2931ffee690SAmr Mokhtar { 2941ffee690SAmr Mokhtar unsigned int i; 2951ffee690SAmr Mokhtar for (i = 0; i < nb_to_free; ++i) 2961ffee690SAmr Mokhtar rte_pktmbuf_free(mbufs[i]); 2971ffee690SAmr Mokhtar } 2981ffee690SAmr Mokhtar 2991ffee690SAmr Mokhtar static inline void 30061bf499dSThomas Monjalon pktmbuf_input_free_bulk(struct rte_mbuf **mbufs, unsigned int nb_to_free) 3011ffee690SAmr Mokhtar { 3021ffee690SAmr Mokhtar unsigned int i; 3031ffee690SAmr Mokhtar for (i = 0; i < nb_to_free; ++i) { 30461bf499dSThomas Monjalon struct rte_mbuf *rx_pkt = *mbuf_input(mbufs[i]); 3051ffee690SAmr Mokhtar rte_pktmbuf_free(rx_pkt); 3061ffee690SAmr Mokhtar rte_pktmbuf_free(mbufs[i]); 3071ffee690SAmr Mokhtar } 3081ffee690SAmr Mokhtar } 3091ffee690SAmr Mokhtar 3101ffee690SAmr Mokhtar /* Check the link status of all ports in up to 9s, and print them finally */ 3111ffee690SAmr Mokhtar static int 3121ffee690SAmr Mokhtar check_port_link_status(uint16_t port_id) 3131ffee690SAmr Mokhtar { 3141ffee690SAmr Mokhtar #define CHECK_INTERVAL 100 /* 100ms */ 3151ffee690SAmr Mokhtar #define MAX_CHECK_TIME 90 /* 9s (90 * 100ms) in total */ 3161ffee690SAmr Mokhtar uint8_t count; 3171ffee690SAmr Mokhtar struct rte_eth_link link; 31822e5c73bSIgor Romanov int link_get_err = -EINVAL; 3191ffee690SAmr Mokhtar 3201ffee690SAmr Mokhtar printf("\nChecking link status."); 3211ffee690SAmr Mokhtar fflush(stdout); 3221ffee690SAmr Mokhtar 3231ffee690SAmr Mokhtar for (count = 0; count <= MAX_CHECK_TIME && 3245bd3c386SJoyce Kong !__atomic_load_n(&global_exit_flag, __ATOMIC_RELAXED); count++) { 3251ffee690SAmr Mokhtar memset(&link, 0, sizeof(link)); 32622e5c73bSIgor Romanov link_get_err = rte_eth_link_get_nowait(port_id, &link); 3271ffee690SAmr Mokhtar 32822e5c73bSIgor Romanov if (link_get_err >= 0 && link.link_status) { 3291ffee690SAmr Mokhtar const char *dp = (link.link_duplex == 330295968d1SFerruh Yigit RTE_ETH_LINK_FULL_DUPLEX) ? 3311ffee690SAmr Mokhtar "full-duplex" : "half-duplex"; 332db4e8135SIvan Dyukov printf("\nPort %u Link Up - speed %s - %s\n", 333db4e8135SIvan Dyukov port_id, 334db4e8135SIvan Dyukov rte_eth_link_speed_to_str(link.link_speed), 335db4e8135SIvan Dyukov dp); 3361ffee690SAmr Mokhtar return 0; 3371ffee690SAmr Mokhtar } 3381ffee690SAmr Mokhtar printf("."); 3391ffee690SAmr Mokhtar fflush(stdout); 3401ffee690SAmr Mokhtar rte_delay_ms(CHECK_INTERVAL); 3411ffee690SAmr Mokhtar } 3421ffee690SAmr Mokhtar 34322e5c73bSIgor Romanov if (link_get_err >= 0) 3441ffee690SAmr Mokhtar printf("\nPort %d Link Down\n", port_id); 34522e5c73bSIgor Romanov else 34622e5c73bSIgor Romanov printf("\nGet link failed (port %d): %s\n", port_id, 34722e5c73bSIgor Romanov rte_strerror(-link_get_err)); 34822e5c73bSIgor Romanov 3491ffee690SAmr Mokhtar return 0; 3501ffee690SAmr Mokhtar } 3511ffee690SAmr Mokhtar 3521ffee690SAmr Mokhtar static inline void 3531ffee690SAmr Mokhtar add_ether_hdr(struct rte_mbuf *pkt_src, struct rte_mbuf *pkt_dst) 3541ffee690SAmr Mokhtar { 3556d13ea8eSOlivier Matz struct rte_ether_hdr *eth_from; 3566d13ea8eSOlivier Matz struct rte_ether_hdr *eth_to; 3571ffee690SAmr Mokhtar 3586d13ea8eSOlivier Matz eth_from = rte_pktmbuf_mtod(pkt_src, struct rte_ether_hdr *); 3596d13ea8eSOlivier Matz eth_to = rte_pktmbuf_mtod(pkt_dst, struct rte_ether_hdr *); 3601ffee690SAmr Mokhtar 3611ffee690SAmr Mokhtar /* copy header */ 3626d13ea8eSOlivier Matz rte_memcpy(eth_to, eth_from, sizeof(struct rte_ether_hdr)); 3631ffee690SAmr Mokhtar } 3641ffee690SAmr Mokhtar 3651ffee690SAmr Mokhtar static inline void 3661ffee690SAmr Mokhtar add_awgn(struct rte_mbuf **mbufs, uint16_t num_pkts) 3671ffee690SAmr Mokhtar { 3681ffee690SAmr Mokhtar RTE_SET_USED(mbufs); 3691ffee690SAmr Mokhtar RTE_SET_USED(num_pkts); 3701ffee690SAmr Mokhtar } 3711ffee690SAmr Mokhtar 3721ffee690SAmr Mokhtar /* Encoder output to Decoder input adapter. The Decoder accepts only soft input 3731ffee690SAmr Mokhtar * so each bit of the encoder output must be translated into one byte of LLR. If 3741ffee690SAmr Mokhtar * Sub-block Deinterleaver is bypassed, which is the case, the padding bytes 3757be78d02SJosh Soref * must additionally be inserted at the end of each sub-block. 3761ffee690SAmr Mokhtar */ 3771ffee690SAmr Mokhtar static inline void 3781ffee690SAmr Mokhtar transform_enc_out_dec_in(struct rte_mbuf **mbufs, uint8_t *temp_buf, 3791ffee690SAmr Mokhtar uint16_t num_pkts, uint16_t k) 3801ffee690SAmr Mokhtar { 3811ffee690SAmr Mokhtar uint16_t i, l, j; 3821ffee690SAmr Mokhtar uint16_t start_bit_idx; 3831ffee690SAmr Mokhtar uint16_t out_idx; 3841ffee690SAmr Mokhtar uint16_t d = k + 4; 3851ffee690SAmr Mokhtar uint16_t kpi = RTE_ALIGN_CEIL(d, 32); 3861ffee690SAmr Mokhtar uint16_t nd = kpi - d; 3871ffee690SAmr Mokhtar uint16_t ncb = 3 * kpi; 3881ffee690SAmr Mokhtar 3891ffee690SAmr Mokhtar for (i = 0; i < num_pkts; ++i) { 3901ffee690SAmr Mokhtar uint16_t pkt_data_len = rte_pktmbuf_data_len(mbufs[i]) - 3916d13ea8eSOlivier Matz sizeof(struct rte_ether_hdr); 3921ffee690SAmr Mokhtar 3931ffee690SAmr Mokhtar /* Resize the packet if needed */ 3941ffee690SAmr Mokhtar if (pkt_data_len < ncb) { 3951ffee690SAmr Mokhtar char *data = rte_pktmbuf_append(mbufs[i], 3961ffee690SAmr Mokhtar ncb - pkt_data_len); 3971ffee690SAmr Mokhtar if (data == NULL) 3981ffee690SAmr Mokhtar printf( 3991ffee690SAmr Mokhtar "Not enough space in decoder input packet"); 4001ffee690SAmr Mokhtar } 4011ffee690SAmr Mokhtar 4021ffee690SAmr Mokhtar /* Translate each bit into 1 LLR byte. */ 4031ffee690SAmr Mokhtar start_bit_idx = 0; 4041ffee690SAmr Mokhtar out_idx = 0; 4051ffee690SAmr Mokhtar for (j = 0; j < 3; ++j) { 4061ffee690SAmr Mokhtar for (l = start_bit_idx; l < start_bit_idx + d; ++l) { 4071ffee690SAmr Mokhtar uint8_t *data = rte_pktmbuf_mtod_offset( 4081ffee690SAmr Mokhtar mbufs[i], uint8_t *, 4096d13ea8eSOlivier Matz sizeof(struct rte_ether_hdr) + 4106d13ea8eSOlivier Matz (l >> 3)); 4111ffee690SAmr Mokhtar if (*data & (0x80 >> (l & 7))) 4121ffee690SAmr Mokhtar temp_buf[out_idx] = LLR_1_BIT; 4131ffee690SAmr Mokhtar else 4141ffee690SAmr Mokhtar temp_buf[out_idx] = LLR_0_BIT; 4151ffee690SAmr Mokhtar ++out_idx; 4161ffee690SAmr Mokhtar } 4171ffee690SAmr Mokhtar /* Padding bytes should be at the end of the sub-block. 4181ffee690SAmr Mokhtar */ 4191ffee690SAmr Mokhtar memset(&temp_buf[out_idx], 0, nd); 4201ffee690SAmr Mokhtar out_idx += nd; 4211ffee690SAmr Mokhtar start_bit_idx += d; 4221ffee690SAmr Mokhtar } 4231ffee690SAmr Mokhtar 4241ffee690SAmr Mokhtar rte_memcpy(rte_pktmbuf_mtod_offset(mbufs[i], uint8_t *, 4256d13ea8eSOlivier Matz sizeof(struct rte_ether_hdr)), temp_buf, ncb); 4261ffee690SAmr Mokhtar } 4271ffee690SAmr Mokhtar } 4281ffee690SAmr Mokhtar 4291ffee690SAmr Mokhtar static inline void 4301ffee690SAmr Mokhtar verify_data(struct rte_mbuf **mbufs, uint16_t num_pkts) 4311ffee690SAmr Mokhtar { 4321ffee690SAmr Mokhtar uint16_t i; 4331ffee690SAmr Mokhtar for (i = 0; i < num_pkts; ++i) { 4341ffee690SAmr Mokhtar struct rte_mbuf *out = mbufs[i]; 43561bf499dSThomas Monjalon struct rte_mbuf *in = *mbuf_input(out); 4361ffee690SAmr Mokhtar 4371ffee690SAmr Mokhtar if (memcmp(rte_pktmbuf_mtod_offset(in, uint8_t *, 4386d13ea8eSOlivier Matz sizeof(struct rte_ether_hdr)), 4391ffee690SAmr Mokhtar rte_pktmbuf_mtod_offset(out, uint8_t *, 4406d13ea8eSOlivier Matz sizeof(struct rte_ether_hdr)), 4411ffee690SAmr Mokhtar K / 8 - CRC_24B_LEN)) 4421ffee690SAmr Mokhtar printf("Input and output buffers are not equal!\n"); 4431ffee690SAmr Mokhtar } 4441ffee690SAmr Mokhtar } 4451ffee690SAmr Mokhtar 4461ffee690SAmr Mokhtar static int 4471ffee690SAmr Mokhtar initialize_ports(struct app_config_params *app_params, 4481ffee690SAmr Mokhtar struct rte_mempool *ethdev_mbuf_mempool) 4491ffee690SAmr Mokhtar { 4501ffee690SAmr Mokhtar int ret; 4511ffee690SAmr Mokhtar uint16_t port_id = app_params->port_id; 4521ffee690SAmr Mokhtar uint16_t q; 4531ffee690SAmr Mokhtar /* ethernet addresses of ports */ 4546d13ea8eSOlivier Matz struct rte_ether_addr bbdev_port_eth_addr; 4551ffee690SAmr Mokhtar 4561ffee690SAmr Mokhtar /* initialize ports */ 4571ffee690SAmr Mokhtar printf("\nInitializing port %u...\n", app_params->port_id); 4581ffee690SAmr Mokhtar ret = rte_eth_dev_configure(port_id, app_params->num_enc_cores, 4591ffee690SAmr Mokhtar app_params->num_dec_cores, &port_conf); 4601ffee690SAmr Mokhtar 4611ffee690SAmr Mokhtar if (ret < 0) { 4621ffee690SAmr Mokhtar printf("Cannot configure device: err=%d, port=%u\n", 4631ffee690SAmr Mokhtar ret, port_id); 4641ffee690SAmr Mokhtar return -1; 4651ffee690SAmr Mokhtar } 4661ffee690SAmr Mokhtar 4671ffee690SAmr Mokhtar /* initialize RX queues for encoder */ 4681ffee690SAmr Mokhtar for (q = 0; q < app_params->num_enc_cores; q++) { 4691ffee690SAmr Mokhtar ret = rte_eth_rx_queue_setup(port_id, q, 4704ed89049SDavid Marchand RX_DESC_DEFAULT, 4711ffee690SAmr Mokhtar rte_eth_dev_socket_id(port_id), 4721ffee690SAmr Mokhtar NULL, ethdev_mbuf_mempool); 4731ffee690SAmr Mokhtar if (ret < 0) { 4741ffee690SAmr Mokhtar printf("rte_eth_rx_queue_setup: err=%d, queue=%u\n", 4751ffee690SAmr Mokhtar ret, q); 4761ffee690SAmr Mokhtar return -1; 4771ffee690SAmr Mokhtar } 4781ffee690SAmr Mokhtar } 4791ffee690SAmr Mokhtar /* initialize TX queues for decoder */ 4801ffee690SAmr Mokhtar for (q = 0; q < app_params->num_dec_cores; q++) { 4811ffee690SAmr Mokhtar ret = rte_eth_tx_queue_setup(port_id, q, 4824ed89049SDavid Marchand TX_DESC_DEFAULT, 4831ffee690SAmr Mokhtar rte_eth_dev_socket_id(port_id), NULL); 4841ffee690SAmr Mokhtar if (ret < 0) { 4851ffee690SAmr Mokhtar printf("rte_eth_tx_queue_setup: err=%d, queue=%u\n", 4861ffee690SAmr Mokhtar ret, q); 4871ffee690SAmr Mokhtar return -1; 4881ffee690SAmr Mokhtar } 4891ffee690SAmr Mokhtar } 4901ffee690SAmr Mokhtar 491f430bbceSIvan Ilchenko ret = rte_eth_promiscuous_enable(port_id); 492f430bbceSIvan Ilchenko if (ret != 0) { 493f430bbceSIvan Ilchenko printf("Cannot enable promiscuous mode: err=%s, port=%u\n", 494f430bbceSIvan Ilchenko rte_strerror(-ret), port_id); 495f430bbceSIvan Ilchenko return ret; 496f430bbceSIvan Ilchenko } 4971ffee690SAmr Mokhtar 49870febdcfSIgor Romanov ret = rte_eth_macaddr_get(port_id, &bbdev_port_eth_addr); 49970febdcfSIgor Romanov if (ret < 0) { 50070febdcfSIgor Romanov printf("rte_eth_macaddr_get: err=%d, queue=%u\n", 50170febdcfSIgor Romanov ret, q); 50270febdcfSIgor Romanov return -1; 50370febdcfSIgor Romanov } 50470febdcfSIgor Romanov 5051ffee690SAmr Mokhtar print_mac(port_id, &bbdev_port_eth_addr); 5061ffee690SAmr Mokhtar 5071ffee690SAmr Mokhtar return 0; 5081ffee690SAmr Mokhtar } 5091ffee690SAmr Mokhtar 5101ffee690SAmr Mokhtar static void 5111ffee690SAmr Mokhtar lcore_conf_init(struct app_config_params *app_params, 5121ffee690SAmr Mokhtar struct lcore_conf *lcore_conf, 5131ffee690SAmr Mokhtar struct rte_mempool **bbdev_op_pools, 5141ffee690SAmr Mokhtar struct rte_mempool *bbdev_mbuf_mempool, 5151ffee690SAmr Mokhtar struct rte_ring *enc_to_dec_ring, 5161ffee690SAmr Mokhtar struct lcore_statistics *lcore_stats) 5171ffee690SAmr Mokhtar { 5181ffee690SAmr Mokhtar unsigned int lcore_id; 5191ffee690SAmr Mokhtar struct lcore_conf *lconf; 5201ffee690SAmr Mokhtar uint16_t rx_queue_id = 0; 5211ffee690SAmr Mokhtar uint16_t tx_queue_id = 0; 5221ffee690SAmr Mokhtar uint16_t enc_q_id = 0; 5231ffee690SAmr Mokhtar uint16_t dec_q_id = 0; 5241ffee690SAmr Mokhtar 5251ffee690SAmr Mokhtar /* Configure lcores */ 5261ffee690SAmr Mokhtar for (lcore_id = 0; lcore_id < 8 * sizeof(uint64_t); ++lcore_id) { 5271ffee690SAmr Mokhtar lconf = &lcore_conf[lcore_id]; 5281ffee690SAmr Mokhtar lconf->core_type = 0; 5291ffee690SAmr Mokhtar 5301ffee690SAmr Mokhtar if ((1ULL << lcore_id) & app_params->enc_core_mask) { 5311ffee690SAmr Mokhtar lconf->core_type |= (1 << RTE_BBDEV_OP_TURBO_ENC); 5321ffee690SAmr Mokhtar lconf->rx_queue_id = rx_queue_id++; 5331ffee690SAmr Mokhtar lconf->enc_queue_id = 5341ffee690SAmr Mokhtar app_params->enc_queue_ids[enc_q_id++]; 5351ffee690SAmr Mokhtar } 5361ffee690SAmr Mokhtar 5371ffee690SAmr Mokhtar if ((1ULL << lcore_id) & app_params->dec_core_mask) { 5381ffee690SAmr Mokhtar lconf->core_type |= (1 << RTE_BBDEV_OP_TURBO_DEC); 5391ffee690SAmr Mokhtar lconf->tx_queue_id = tx_queue_id++; 5401ffee690SAmr Mokhtar lconf->dec_queue_id = 5411ffee690SAmr Mokhtar app_params->dec_queue_ids[dec_q_id++]; 5421ffee690SAmr Mokhtar } 5431ffee690SAmr Mokhtar 5441ffee690SAmr Mokhtar lconf->bbdev_enc_op_pool = 5451ffee690SAmr Mokhtar bbdev_op_pools[RTE_BBDEV_OP_TURBO_ENC]; 5461ffee690SAmr Mokhtar lconf->bbdev_dec_op_pool = 5471ffee690SAmr Mokhtar bbdev_op_pools[RTE_BBDEV_OP_TURBO_DEC]; 5481ffee690SAmr Mokhtar lconf->bbdev_id = app_params->bbdev_id; 5491ffee690SAmr Mokhtar lconf->port_id = app_params->port_id; 5501ffee690SAmr Mokhtar lconf->enc_out_pool = bbdev_mbuf_mempool; 5511ffee690SAmr Mokhtar lconf->enc_to_dec_ring = enc_to_dec_ring; 5521ffee690SAmr Mokhtar lconf->lcore_stats = &lcore_stats[lcore_id]; 5531ffee690SAmr Mokhtar } 5541ffee690SAmr Mokhtar } 5551ffee690SAmr Mokhtar 5561ffee690SAmr Mokhtar static void 5571ffee690SAmr Mokhtar print_lcore_stats(struct lcore_statistics *lstats, unsigned int lcore_id) 5581ffee690SAmr Mokhtar { 5591ffee690SAmr Mokhtar static const char *stats_border = "_______"; 5601ffee690SAmr Mokhtar 5611ffee690SAmr Mokhtar printf("\nLcore %d: %s enqueued count:\t\t%u\n", 5621ffee690SAmr Mokhtar lcore_id, stats_border, lstats->enqueued); 5631ffee690SAmr Mokhtar printf("Lcore %d: %s dequeued count:\t\t%u\n", 5641ffee690SAmr Mokhtar lcore_id, stats_border, lstats->dequeued); 5651ffee690SAmr Mokhtar printf("Lcore %d: %s RX lost packets count:\t\t%u\n", 5661ffee690SAmr Mokhtar lcore_id, stats_border, lstats->rx_lost_packets); 5671ffee690SAmr Mokhtar printf("Lcore %d: %s encoder-to-decoder lost count:\t%u\n", 5681ffee690SAmr Mokhtar lcore_id, stats_border, 5691ffee690SAmr Mokhtar lstats->enc_to_dec_lost_packets); 5701ffee690SAmr Mokhtar printf("Lcore %d: %s TX lost packets count:\t\t%u\n", 5711ffee690SAmr Mokhtar lcore_id, stats_border, lstats->tx_lost_packets); 5721ffee690SAmr Mokhtar } 5731ffee690SAmr Mokhtar 5741ffee690SAmr Mokhtar static void 5751ffee690SAmr Mokhtar print_stats(struct stats_lcore_params *stats_lcore) 5761ffee690SAmr Mokhtar { 5771ffee690SAmr Mokhtar unsigned int l_id; 5781ffee690SAmr Mokhtar unsigned int bbdev_id = stats_lcore->app_params->bbdev_id; 5791ffee690SAmr Mokhtar unsigned int port_id = stats_lcore->app_params->port_id; 5801ffee690SAmr Mokhtar int len, ret, i; 5811ffee690SAmr Mokhtar 5821ffee690SAmr Mokhtar struct rte_eth_xstat *xstats; 5831ffee690SAmr Mokhtar struct rte_eth_xstat_name *xstats_names; 5841ffee690SAmr Mokhtar struct rte_bbdev_stats bbstats; 5851ffee690SAmr Mokhtar static const char *stats_border = "_______"; 5861ffee690SAmr Mokhtar 5871ffee690SAmr Mokhtar const char clr[] = { 27, '[', '2', 'J', '\0' }; 5881ffee690SAmr Mokhtar const char topLeft[] = { 27, '[', '1', ';', '1', 'H', '\0' }; 5891ffee690SAmr Mokhtar 5901ffee690SAmr Mokhtar /* Clear screen and move to top left */ 5911ffee690SAmr Mokhtar printf("%s%s", clr, topLeft); 5921ffee690SAmr Mokhtar 5931ffee690SAmr Mokhtar printf("PORT STATISTICS:\n================\n"); 5941ffee690SAmr Mokhtar len = rte_eth_xstats_get(port_id, NULL, 0); 5951ffee690SAmr Mokhtar if (len < 0) 5961ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, 5971ffee690SAmr Mokhtar "rte_eth_xstats_get(%u) failed: %d", port_id, 5981ffee690SAmr Mokhtar len); 5991ffee690SAmr Mokhtar 6001ffee690SAmr Mokhtar xstats = calloc(len, sizeof(*xstats)); 6011ffee690SAmr Mokhtar if (xstats == NULL) 6021ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, 6031ffee690SAmr Mokhtar "Failed to calloc memory for xstats"); 6041ffee690SAmr Mokhtar 6051ffee690SAmr Mokhtar ret = rte_eth_xstats_get(port_id, xstats, len); 6062a5aa6e7SAmr Mokhtar if (ret < 0 || ret > len) { 6072a5aa6e7SAmr Mokhtar free(xstats); 6081ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, 6091ffee690SAmr Mokhtar "rte_eth_xstats_get(%u) len%i failed: %d", 6101ffee690SAmr Mokhtar port_id, len, ret); 6112a5aa6e7SAmr Mokhtar } 6121ffee690SAmr Mokhtar 6131ffee690SAmr Mokhtar xstats_names = calloc(len, sizeof(*xstats_names)); 6142a5aa6e7SAmr Mokhtar if (xstats_names == NULL) { 6152a5aa6e7SAmr Mokhtar free(xstats); 6161ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, 6171ffee690SAmr Mokhtar "Failed to calloc memory for xstats_names"); 6182a5aa6e7SAmr Mokhtar } 6191ffee690SAmr Mokhtar 6201ffee690SAmr Mokhtar ret = rte_eth_xstats_get_names(port_id, xstats_names, len); 6212a5aa6e7SAmr Mokhtar if (ret < 0 || ret > len) { 6222a5aa6e7SAmr Mokhtar free(xstats); 6232a5aa6e7SAmr Mokhtar free(xstats_names); 6241ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, 6251ffee690SAmr Mokhtar "rte_eth_xstats_get_names(%u) len%i failed: %d", 6261ffee690SAmr Mokhtar port_id, len, ret); 6272a5aa6e7SAmr Mokhtar } 6281ffee690SAmr Mokhtar 6291ffee690SAmr Mokhtar for (i = 0; i < len; i++) { 6301ffee690SAmr Mokhtar if (xstats[i].value > 0) 6311ffee690SAmr Mokhtar printf("Port %u: %s %s:\t\t%"PRIu64"\n", 6321ffee690SAmr Mokhtar port_id, stats_border, 6331ffee690SAmr Mokhtar xstats_names[i].name, 6341ffee690SAmr Mokhtar xstats[i].value); 6351ffee690SAmr Mokhtar } 6361ffee690SAmr Mokhtar 637200d0e7aSAmr Mokhtar ret = rte_bbdev_stats_get(bbdev_id, &bbstats); 638200d0e7aSAmr Mokhtar if (ret < 0) { 639200d0e7aSAmr Mokhtar free(xstats); 640200d0e7aSAmr Mokhtar free(xstats_names); 641200d0e7aSAmr Mokhtar rte_exit(EXIT_FAILURE, 642200d0e7aSAmr Mokhtar "ERROR(%d): Failure to get BBDEV %u statistics\n", 643200d0e7aSAmr Mokhtar ret, bbdev_id); 644200d0e7aSAmr Mokhtar } 645200d0e7aSAmr Mokhtar 6461ffee690SAmr Mokhtar printf("\nBBDEV STATISTICS:\n=================\n"); 6471ffee690SAmr Mokhtar printf("BBDEV %u: %s enqueue count:\t\t%"PRIu64"\n", 6481ffee690SAmr Mokhtar bbdev_id, stats_border, 6491ffee690SAmr Mokhtar bbstats.enqueued_count); 6501ffee690SAmr Mokhtar printf("BBDEV %u: %s dequeue count:\t\t%"PRIu64"\n", 6511ffee690SAmr Mokhtar bbdev_id, stats_border, 6521ffee690SAmr Mokhtar bbstats.dequeued_count); 6531ffee690SAmr Mokhtar printf("BBDEV %u: %s enqueue error count:\t\t%"PRIu64"\n", 6541ffee690SAmr Mokhtar bbdev_id, stats_border, 6551ffee690SAmr Mokhtar bbstats.enqueue_err_count); 6561ffee690SAmr Mokhtar printf("BBDEV %u: %s dequeue error count:\t\t%"PRIu64"\n\n", 6571ffee690SAmr Mokhtar bbdev_id, stats_border, 6581ffee690SAmr Mokhtar bbstats.dequeue_err_count); 6591ffee690SAmr Mokhtar 6601ffee690SAmr Mokhtar printf("LCORE STATISTICS:\n=================\n"); 6611ffee690SAmr Mokhtar for (l_id = 0; l_id < RTE_MAX_LCORE; ++l_id) { 6621ffee690SAmr Mokhtar if (stats_lcore->lconf[l_id].core_type == 0) 6631ffee690SAmr Mokhtar continue; 6641ffee690SAmr Mokhtar print_lcore_stats(stats_lcore->lconf[l_id].lcore_stats, l_id); 6651ffee690SAmr Mokhtar } 6662a5aa6e7SAmr Mokhtar 6673ee6f706SGeorgiy Levashov fflush(stdout); 6683ee6f706SGeorgiy Levashov 6692a5aa6e7SAmr Mokhtar free(xstats); 6702a5aa6e7SAmr Mokhtar free(xstats_names); 6711ffee690SAmr Mokhtar } 6721ffee690SAmr Mokhtar 6731ffee690SAmr Mokhtar static int 6741ffee690SAmr Mokhtar stats_loop(void *arg) 6751ffee690SAmr Mokhtar { 6761ffee690SAmr Mokhtar struct stats_lcore_params *stats_lcore = arg; 6771ffee690SAmr Mokhtar 6785bd3c386SJoyce Kong while (!__atomic_load_n(&global_exit_flag, __ATOMIC_RELAXED)) { 6791ffee690SAmr Mokhtar print_stats(stats_lcore); 6801ffee690SAmr Mokhtar rte_delay_ms(500); 6811ffee690SAmr Mokhtar } 6821ffee690SAmr Mokhtar 6831ffee690SAmr Mokhtar return 0; 6841ffee690SAmr Mokhtar } 6851ffee690SAmr Mokhtar 6861ffee690SAmr Mokhtar static inline void 6871ffee690SAmr Mokhtar run_encoding(struct lcore_conf *lcore_conf) 6881ffee690SAmr Mokhtar { 6891ffee690SAmr Mokhtar uint16_t i; 6901ffee690SAmr Mokhtar uint16_t port_id, rx_queue_id; 6911ffee690SAmr Mokhtar uint16_t bbdev_id, enc_queue_id; 6921ffee690SAmr Mokhtar uint16_t nb_rx, nb_enq, nb_deq, nb_sent; 6931ffee690SAmr Mokhtar struct rte_mbuf *rx_pkts_burst[MAX_PKT_BURST]; 6941ffee690SAmr Mokhtar struct rte_mbuf *enc_out_pkts[MAX_PKT_BURST]; 6951ffee690SAmr Mokhtar struct rte_bbdev_enc_op *bbdev_ops_burst[MAX_PKT_BURST]; 6961ffee690SAmr Mokhtar struct lcore_statistics *lcore_stats; 6971ffee690SAmr Mokhtar struct rte_mempool *bbdev_op_pool, *enc_out_pool; 6981ffee690SAmr Mokhtar struct rte_ring *enc_to_dec_ring; 6991ffee690SAmr Mokhtar const int in_data_len = (def_op_enc.cb_params.k / 8) - CRC_24B_LEN; 7001ffee690SAmr Mokhtar 7011ffee690SAmr Mokhtar lcore_stats = lcore_conf->lcore_stats; 7021ffee690SAmr Mokhtar port_id = lcore_conf->port_id; 7031ffee690SAmr Mokhtar rx_queue_id = lcore_conf->rx_queue_id; 7041ffee690SAmr Mokhtar bbdev_id = lcore_conf->bbdev_id; 7051ffee690SAmr Mokhtar enc_queue_id = lcore_conf->enc_queue_id; 7061ffee690SAmr Mokhtar bbdev_op_pool = lcore_conf->bbdev_enc_op_pool; 7071ffee690SAmr Mokhtar enc_out_pool = lcore_conf->enc_out_pool; 7081ffee690SAmr Mokhtar enc_to_dec_ring = lcore_conf->enc_to_dec_ring; 7091ffee690SAmr Mokhtar 7101ffee690SAmr Mokhtar /* Read packet from RX queues*/ 7111ffee690SAmr Mokhtar nb_rx = rte_eth_rx_burst(port_id, rx_queue_id, rx_pkts_burst, 7121ffee690SAmr Mokhtar MAX_PKT_BURST); 7131ffee690SAmr Mokhtar if (!nb_rx) 7141ffee690SAmr Mokhtar return; 7151ffee690SAmr Mokhtar 7161ffee690SAmr Mokhtar if (unlikely(rte_mempool_get_bulk(enc_out_pool, (void **)enc_out_pkts, 7171ffee690SAmr Mokhtar nb_rx) != 0)) { 7181ffee690SAmr Mokhtar pktmbuf_free_bulk(rx_pkts_burst, nb_rx); 7191ffee690SAmr Mokhtar lcore_stats->rx_lost_packets += nb_rx; 7201ffee690SAmr Mokhtar return; 7211ffee690SAmr Mokhtar } 7221ffee690SAmr Mokhtar 7231ffee690SAmr Mokhtar if (unlikely(rte_bbdev_enc_op_alloc_bulk(bbdev_op_pool, bbdev_ops_burst, 7241ffee690SAmr Mokhtar nb_rx) != 0)) { 7251ffee690SAmr Mokhtar pktmbuf_free_bulk(enc_out_pkts, nb_rx); 7261ffee690SAmr Mokhtar pktmbuf_free_bulk(rx_pkts_burst, nb_rx); 7271ffee690SAmr Mokhtar lcore_stats->rx_lost_packets += nb_rx; 7281ffee690SAmr Mokhtar return; 7291ffee690SAmr Mokhtar } 7301ffee690SAmr Mokhtar 7311ffee690SAmr Mokhtar for (i = 0; i < nb_rx; i++) { 7321ffee690SAmr Mokhtar char *data; 7331ffee690SAmr Mokhtar const uint16_t pkt_data_len = 7341ffee690SAmr Mokhtar rte_pktmbuf_data_len(rx_pkts_burst[i]) - 7356d13ea8eSOlivier Matz sizeof(struct rte_ether_hdr); 7361ffee690SAmr Mokhtar /* save input mbuf pointer for later comparison */ 73761bf499dSThomas Monjalon *mbuf_input(enc_out_pkts[i]) = rx_pkts_burst[i]; 7381ffee690SAmr Mokhtar 7391ffee690SAmr Mokhtar /* copy ethernet header */ 7401ffee690SAmr Mokhtar rte_pktmbuf_reset(enc_out_pkts[i]); 7411ffee690SAmr Mokhtar data = rte_pktmbuf_append(enc_out_pkts[i], 7426d13ea8eSOlivier Matz sizeof(struct rte_ether_hdr)); 7431ffee690SAmr Mokhtar if (data == NULL) { 7441ffee690SAmr Mokhtar printf( 7451ffee690SAmr Mokhtar "Not enough space for ethernet header in encoder output mbuf\n"); 7461ffee690SAmr Mokhtar continue; 7471ffee690SAmr Mokhtar } 7481ffee690SAmr Mokhtar add_ether_hdr(rx_pkts_burst[i], enc_out_pkts[i]); 7491ffee690SAmr Mokhtar 7501ffee690SAmr Mokhtar /* set op */ 7511ffee690SAmr Mokhtar bbdev_ops_burst[i]->turbo_enc = def_op_enc; 7521ffee690SAmr Mokhtar 7531ffee690SAmr Mokhtar bbdev_ops_burst[i]->turbo_enc.input.data = 7541ffee690SAmr Mokhtar rx_pkts_burst[i]; 7551ffee690SAmr Mokhtar bbdev_ops_burst[i]->turbo_enc.input.offset = 7566d13ea8eSOlivier Matz sizeof(struct rte_ether_hdr); 7571ffee690SAmr Mokhtar /* Encoder will attach the CRC24B, adjust the length */ 7581ffee690SAmr Mokhtar bbdev_ops_burst[i]->turbo_enc.input.length = in_data_len; 7591ffee690SAmr Mokhtar 7601ffee690SAmr Mokhtar if (in_data_len < pkt_data_len) 7611ffee690SAmr Mokhtar rte_pktmbuf_trim(rx_pkts_burst[i], pkt_data_len - 7621ffee690SAmr Mokhtar in_data_len); 7631ffee690SAmr Mokhtar else if (in_data_len > pkt_data_len) { 7641ffee690SAmr Mokhtar data = rte_pktmbuf_append(rx_pkts_burst[i], 7651ffee690SAmr Mokhtar in_data_len - pkt_data_len); 7661ffee690SAmr Mokhtar if (data == NULL) 7671ffee690SAmr Mokhtar printf( 7681ffee690SAmr Mokhtar "Not enough storage in mbuf to perform the encoding\n"); 7691ffee690SAmr Mokhtar } 7701ffee690SAmr Mokhtar 7711ffee690SAmr Mokhtar bbdev_ops_burst[i]->turbo_enc.output.data = 7721ffee690SAmr Mokhtar enc_out_pkts[i]; 7731ffee690SAmr Mokhtar bbdev_ops_burst[i]->turbo_enc.output.offset = 7746d13ea8eSOlivier Matz sizeof(struct rte_ether_hdr); 7751ffee690SAmr Mokhtar } 7761ffee690SAmr Mokhtar 7771ffee690SAmr Mokhtar /* Enqueue packets on BBDevice */ 7781ffee690SAmr Mokhtar nb_enq = rte_bbdev_enqueue_enc_ops(bbdev_id, enc_queue_id, 7791ffee690SAmr Mokhtar bbdev_ops_burst, nb_rx); 7801ffee690SAmr Mokhtar if (unlikely(nb_enq < nb_rx)) { 78161bf499dSThomas Monjalon pktmbuf_input_free_bulk(&enc_out_pkts[nb_enq], 7821ffee690SAmr Mokhtar nb_rx - nb_enq); 7831ffee690SAmr Mokhtar rte_bbdev_enc_op_free_bulk(&bbdev_ops_burst[nb_enq], 7841ffee690SAmr Mokhtar nb_rx - nb_enq); 7851ffee690SAmr Mokhtar lcore_stats->rx_lost_packets += nb_rx - nb_enq; 7861ffee690SAmr Mokhtar 7871ffee690SAmr Mokhtar if (!nb_enq) 7881ffee690SAmr Mokhtar return; 7891ffee690SAmr Mokhtar } 7901ffee690SAmr Mokhtar 7911ffee690SAmr Mokhtar lcore_stats->enqueued += nb_enq; 7921ffee690SAmr Mokhtar 7931ffee690SAmr Mokhtar /* Dequeue packets from bbdev device*/ 7941ffee690SAmr Mokhtar nb_deq = 0; 7951ffee690SAmr Mokhtar do { 7961ffee690SAmr Mokhtar nb_deq += rte_bbdev_dequeue_enc_ops(bbdev_id, enc_queue_id, 7971ffee690SAmr Mokhtar &bbdev_ops_burst[nb_deq], nb_enq - nb_deq); 7981ffee690SAmr Mokhtar } while (unlikely(nb_deq < nb_enq)); 7991ffee690SAmr Mokhtar 8001ffee690SAmr Mokhtar lcore_stats->dequeued += nb_deq; 8011ffee690SAmr Mokhtar 8021ffee690SAmr Mokhtar /* Generate and add AWGN */ 8031ffee690SAmr Mokhtar add_awgn(enc_out_pkts, nb_deq); 8041ffee690SAmr Mokhtar 8051ffee690SAmr Mokhtar rte_bbdev_enc_op_free_bulk(bbdev_ops_burst, nb_deq); 8061ffee690SAmr Mokhtar 8071ffee690SAmr Mokhtar /* Enqueue packets to encoder-to-decoder ring */ 8081ffee690SAmr Mokhtar nb_sent = rte_ring_enqueue_burst(enc_to_dec_ring, (void **)enc_out_pkts, 8091ffee690SAmr Mokhtar nb_deq, NULL); 8101ffee690SAmr Mokhtar if (unlikely(nb_sent < nb_deq)) { 81161bf499dSThomas Monjalon pktmbuf_input_free_bulk(&enc_out_pkts[nb_sent], 8121ffee690SAmr Mokhtar nb_deq - nb_sent); 8131ffee690SAmr Mokhtar lcore_stats->enc_to_dec_lost_packets += nb_deq - nb_sent; 8141ffee690SAmr Mokhtar } 8151ffee690SAmr Mokhtar } 8161ffee690SAmr Mokhtar 8171ffee690SAmr Mokhtar static void 8181ffee690SAmr Mokhtar run_decoding(struct lcore_conf *lcore_conf) 8191ffee690SAmr Mokhtar { 8201ffee690SAmr Mokhtar uint16_t i; 8211ffee690SAmr Mokhtar uint16_t port_id, tx_queue_id; 8221ffee690SAmr Mokhtar uint16_t bbdev_id, bbdev_queue_id; 8231ffee690SAmr Mokhtar uint16_t nb_recv, nb_enq, nb_deq, nb_tx; 8241ffee690SAmr Mokhtar uint8_t *llr_temp_buf; 8251ffee690SAmr Mokhtar struct rte_mbuf *recv_pkts_burst[MAX_PKT_BURST]; 8261ffee690SAmr Mokhtar struct rte_bbdev_dec_op *bbdev_ops_burst[MAX_PKT_BURST]; 8271ffee690SAmr Mokhtar struct lcore_statistics *lcore_stats; 8281ffee690SAmr Mokhtar struct rte_mempool *bbdev_op_pool; 8291ffee690SAmr Mokhtar struct rte_ring *enc_to_dec_ring; 8301ffee690SAmr Mokhtar 8311ffee690SAmr Mokhtar lcore_stats = lcore_conf->lcore_stats; 8321ffee690SAmr Mokhtar port_id = lcore_conf->port_id; 8331ffee690SAmr Mokhtar tx_queue_id = lcore_conf->tx_queue_id; 8341ffee690SAmr Mokhtar bbdev_id = lcore_conf->bbdev_id; 8351ffee690SAmr Mokhtar bbdev_queue_id = lcore_conf->dec_queue_id; 8361ffee690SAmr Mokhtar bbdev_op_pool = lcore_conf->bbdev_dec_op_pool; 8371ffee690SAmr Mokhtar enc_to_dec_ring = lcore_conf->enc_to_dec_ring; 8381ffee690SAmr Mokhtar llr_temp_buf = lcore_conf->llr_temp_buf; 8391ffee690SAmr Mokhtar 8401ffee690SAmr Mokhtar /* Dequeue packets from the ring */ 8411ffee690SAmr Mokhtar nb_recv = rte_ring_dequeue_burst(enc_to_dec_ring, 8421ffee690SAmr Mokhtar (void **)recv_pkts_burst, MAX_PKT_BURST, NULL); 8431ffee690SAmr Mokhtar if (!nb_recv) 8441ffee690SAmr Mokhtar return; 8451ffee690SAmr Mokhtar 8461ffee690SAmr Mokhtar if (unlikely(rte_bbdev_dec_op_alloc_bulk(bbdev_op_pool, bbdev_ops_burst, 8471ffee690SAmr Mokhtar nb_recv) != 0)) { 84861bf499dSThomas Monjalon pktmbuf_input_free_bulk(recv_pkts_burst, nb_recv); 8491ffee690SAmr Mokhtar lcore_stats->rx_lost_packets += nb_recv; 8501ffee690SAmr Mokhtar return; 8511ffee690SAmr Mokhtar } 8521ffee690SAmr Mokhtar 8531ffee690SAmr Mokhtar transform_enc_out_dec_in(recv_pkts_burst, llr_temp_buf, nb_recv, 8541ffee690SAmr Mokhtar def_op_dec.cb_params.k); 8551ffee690SAmr Mokhtar 8561ffee690SAmr Mokhtar for (i = 0; i < nb_recv; i++) { 8571ffee690SAmr Mokhtar /* set op */ 8581ffee690SAmr Mokhtar bbdev_ops_burst[i]->turbo_dec = def_op_dec; 8591ffee690SAmr Mokhtar 8601ffee690SAmr Mokhtar bbdev_ops_burst[i]->turbo_dec.input.data = recv_pkts_burst[i]; 8611ffee690SAmr Mokhtar bbdev_ops_burst[i]->turbo_dec.input.offset = 8626d13ea8eSOlivier Matz sizeof(struct rte_ether_hdr); 8631ffee690SAmr Mokhtar bbdev_ops_burst[i]->turbo_dec.input.length = 8641ffee690SAmr Mokhtar rte_pktmbuf_data_len(recv_pkts_burst[i]) 8656d13ea8eSOlivier Matz - sizeof(struct rte_ether_hdr); 8661ffee690SAmr Mokhtar 8671ffee690SAmr Mokhtar bbdev_ops_burst[i]->turbo_dec.hard_output.data = 8681ffee690SAmr Mokhtar recv_pkts_burst[i]; 8691ffee690SAmr Mokhtar bbdev_ops_burst[i]->turbo_dec.hard_output.offset = 8706d13ea8eSOlivier Matz sizeof(struct rte_ether_hdr); 8711ffee690SAmr Mokhtar } 8721ffee690SAmr Mokhtar 8731ffee690SAmr Mokhtar /* Enqueue packets on BBDevice */ 8741ffee690SAmr Mokhtar nb_enq = rte_bbdev_enqueue_dec_ops(bbdev_id, bbdev_queue_id, 8751ffee690SAmr Mokhtar bbdev_ops_burst, nb_recv); 8761ffee690SAmr Mokhtar if (unlikely(nb_enq < nb_recv)) { 87761bf499dSThomas Monjalon pktmbuf_input_free_bulk(&recv_pkts_burst[nb_enq], 8781ffee690SAmr Mokhtar nb_recv - nb_enq); 8791ffee690SAmr Mokhtar rte_bbdev_dec_op_free_bulk(&bbdev_ops_burst[nb_enq], 8801ffee690SAmr Mokhtar nb_recv - nb_enq); 8811ffee690SAmr Mokhtar lcore_stats->rx_lost_packets += nb_recv - nb_enq; 8821ffee690SAmr Mokhtar 8831ffee690SAmr Mokhtar if (!nb_enq) 8841ffee690SAmr Mokhtar return; 8851ffee690SAmr Mokhtar } 8861ffee690SAmr Mokhtar 8871ffee690SAmr Mokhtar lcore_stats->enqueued += nb_enq; 8881ffee690SAmr Mokhtar 8891ffee690SAmr Mokhtar /* Dequeue packets from BBDevice */ 8901ffee690SAmr Mokhtar nb_deq = 0; 8911ffee690SAmr Mokhtar do { 8921ffee690SAmr Mokhtar nb_deq += rte_bbdev_dequeue_dec_ops(bbdev_id, bbdev_queue_id, 8931ffee690SAmr Mokhtar &bbdev_ops_burst[nb_deq], nb_enq - nb_deq); 8941ffee690SAmr Mokhtar } while (unlikely(nb_deq < nb_enq)); 8951ffee690SAmr Mokhtar 8961ffee690SAmr Mokhtar lcore_stats->dequeued += nb_deq; 8971ffee690SAmr Mokhtar 8981ffee690SAmr Mokhtar rte_bbdev_dec_op_free_bulk(bbdev_ops_burst, nb_deq); 8991ffee690SAmr Mokhtar 9001ffee690SAmr Mokhtar verify_data(recv_pkts_burst, nb_deq); 9011ffee690SAmr Mokhtar 9021ffee690SAmr Mokhtar /* Free the RX mbufs after verification */ 9031ffee690SAmr Mokhtar for (i = 0; i < nb_deq; ++i) 90461bf499dSThomas Monjalon rte_pktmbuf_free(*mbuf_input(recv_pkts_burst[i])); 9051ffee690SAmr Mokhtar 9061ffee690SAmr Mokhtar /* Transmit the packets */ 9071ffee690SAmr Mokhtar nb_tx = rte_eth_tx_burst(port_id, tx_queue_id, recv_pkts_burst, nb_deq); 9081ffee690SAmr Mokhtar if (unlikely(nb_tx < nb_deq)) { 90961bf499dSThomas Monjalon pktmbuf_input_free_bulk(&recv_pkts_burst[nb_tx], 9101ffee690SAmr Mokhtar nb_deq - nb_tx); 9111ffee690SAmr Mokhtar lcore_stats->tx_lost_packets += nb_deq - nb_tx; 9121ffee690SAmr Mokhtar } 9131ffee690SAmr Mokhtar } 9141ffee690SAmr Mokhtar 9151ffee690SAmr Mokhtar static int 9161ffee690SAmr Mokhtar processing_loop(void *arg) 9171ffee690SAmr Mokhtar { 9181ffee690SAmr Mokhtar struct lcore_conf *lcore_conf = arg; 9191ffee690SAmr Mokhtar const bool run_encoder = (lcore_conf->core_type & 9201ffee690SAmr Mokhtar (1 << RTE_BBDEV_OP_TURBO_ENC)); 9211ffee690SAmr Mokhtar const bool run_decoder = (lcore_conf->core_type & 9221ffee690SAmr Mokhtar (1 << RTE_BBDEV_OP_TURBO_DEC)); 9231ffee690SAmr Mokhtar 9245bd3c386SJoyce Kong while (!__atomic_load_n(&global_exit_flag, __ATOMIC_RELAXED)) { 9251ffee690SAmr Mokhtar if (run_encoder) 9261ffee690SAmr Mokhtar run_encoding(lcore_conf); 9271ffee690SAmr Mokhtar if (run_decoder) 9281ffee690SAmr Mokhtar run_decoding(lcore_conf); 9291ffee690SAmr Mokhtar } 9301ffee690SAmr Mokhtar 9311ffee690SAmr Mokhtar return 0; 9321ffee690SAmr Mokhtar } 9331ffee690SAmr Mokhtar 9341ffee690SAmr Mokhtar static int 9351ffee690SAmr Mokhtar prepare_bbdev_device(unsigned int dev_id, struct rte_bbdev_info *info, 9361ffee690SAmr Mokhtar struct app_config_params *app_params) 9371ffee690SAmr Mokhtar { 9381ffee690SAmr Mokhtar int ret; 9391ffee690SAmr Mokhtar unsigned int q_id, dec_q_id, enc_q_id; 9401ffee690SAmr Mokhtar struct rte_bbdev_queue_conf qconf = {0}; 9411ffee690SAmr Mokhtar uint16_t dec_qs_nb = app_params->num_dec_cores; 9421ffee690SAmr Mokhtar uint16_t enc_qs_nb = app_params->num_enc_cores; 9431ffee690SAmr Mokhtar uint16_t tot_qs = dec_qs_nb + enc_qs_nb; 9441ffee690SAmr Mokhtar 9451ffee690SAmr Mokhtar ret = rte_bbdev_setup_queues(dev_id, tot_qs, info->socket_id); 9461ffee690SAmr Mokhtar if (ret < 0) 9471ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, 9481ffee690SAmr Mokhtar "ERROR(%d): BBDEV %u not configured properly\n", 9491ffee690SAmr Mokhtar ret, dev_id); 9501ffee690SAmr Mokhtar 9511ffee690SAmr Mokhtar /* setup device DEC queues */ 9521ffee690SAmr Mokhtar qconf.socket = info->socket_id; 9531ffee690SAmr Mokhtar qconf.queue_size = info->drv.queue_size_lim; 9541ffee690SAmr Mokhtar qconf.op_type = RTE_BBDEV_OP_TURBO_DEC; 9551ffee690SAmr Mokhtar 9561ffee690SAmr Mokhtar for (q_id = 0, dec_q_id = 0; q_id < dec_qs_nb; q_id++) { 9571ffee690SAmr Mokhtar ret = rte_bbdev_queue_configure(dev_id, q_id, &qconf); 9581ffee690SAmr Mokhtar if (ret < 0) 9591ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, 9601ffee690SAmr Mokhtar "ERROR(%d): BBDEV %u DEC queue %u not configured properly\n", 9611ffee690SAmr Mokhtar ret, dev_id, q_id); 9621ffee690SAmr Mokhtar app_params->dec_queue_ids[dec_q_id++] = q_id; 9631ffee690SAmr Mokhtar } 9641ffee690SAmr Mokhtar 9651ffee690SAmr Mokhtar /* setup device ENC queues */ 9661ffee690SAmr Mokhtar qconf.op_type = RTE_BBDEV_OP_TURBO_ENC; 9671ffee690SAmr Mokhtar 9681ffee690SAmr Mokhtar for (q_id = dec_qs_nb, enc_q_id = 0; q_id < tot_qs; q_id++) { 9691ffee690SAmr Mokhtar ret = rte_bbdev_queue_configure(dev_id, q_id, &qconf); 9701ffee690SAmr Mokhtar if (ret < 0) 9711ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, 9721ffee690SAmr Mokhtar "ERROR(%d): BBDEV %u ENC queue %u not configured properly\n", 9731ffee690SAmr Mokhtar ret, dev_id, q_id); 9741ffee690SAmr Mokhtar app_params->enc_queue_ids[enc_q_id++] = q_id; 9751ffee690SAmr Mokhtar } 9761ffee690SAmr Mokhtar 9771ffee690SAmr Mokhtar ret = rte_bbdev_start(dev_id); 9781ffee690SAmr Mokhtar 9791ffee690SAmr Mokhtar if (ret != 0) 9801ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, "ERROR(%d): BBDEV %u not started\n", 9811ffee690SAmr Mokhtar ret, dev_id); 9821ffee690SAmr Mokhtar 9831ffee690SAmr Mokhtar printf("BBdev %u started\n", dev_id); 9841ffee690SAmr Mokhtar 9851ffee690SAmr Mokhtar return 0; 9861ffee690SAmr Mokhtar } 9871ffee690SAmr Mokhtar 9881ffee690SAmr Mokhtar static inline bool 9891ffee690SAmr Mokhtar check_matching_capabilities(uint64_t mask, uint64_t required_mask) 9901ffee690SAmr Mokhtar { 9911ffee690SAmr Mokhtar return (mask & required_mask) == required_mask; 9921ffee690SAmr Mokhtar } 9931ffee690SAmr Mokhtar 9941ffee690SAmr Mokhtar static void 9951ffee690SAmr Mokhtar enable_bbdev(struct app_config_params *app_params) 9961ffee690SAmr Mokhtar { 9971ffee690SAmr Mokhtar struct rte_bbdev_info dev_info; 9981ffee690SAmr Mokhtar const struct rte_bbdev_op_cap *op_cap; 9991ffee690SAmr Mokhtar uint16_t bbdev_id = app_params->bbdev_id; 10001ffee690SAmr Mokhtar bool encoder_capable = false; 10011ffee690SAmr Mokhtar bool decoder_capable = false; 10021ffee690SAmr Mokhtar 10031ffee690SAmr Mokhtar rte_bbdev_info_get(bbdev_id, &dev_info); 10041ffee690SAmr Mokhtar op_cap = dev_info.drv.capabilities; 10051ffee690SAmr Mokhtar 10061ffee690SAmr Mokhtar while (op_cap->type != RTE_BBDEV_OP_NONE) { 10071ffee690SAmr Mokhtar if (op_cap->type == RTE_BBDEV_OP_TURBO_ENC) { 10081ffee690SAmr Mokhtar if (check_matching_capabilities( 10091ffee690SAmr Mokhtar op_cap->cap.turbo_enc.capability_flags, 10101ffee690SAmr Mokhtar def_op_enc.op_flags)) 10111ffee690SAmr Mokhtar encoder_capable = true; 10121ffee690SAmr Mokhtar } 10131ffee690SAmr Mokhtar 10141ffee690SAmr Mokhtar if (op_cap->type == RTE_BBDEV_OP_TURBO_DEC) { 10151ffee690SAmr Mokhtar if (check_matching_capabilities( 10161ffee690SAmr Mokhtar op_cap->cap.turbo_dec.capability_flags, 10171ffee690SAmr Mokhtar def_op_dec.op_flags)) 10181ffee690SAmr Mokhtar decoder_capable = true; 10191ffee690SAmr Mokhtar } 10201ffee690SAmr Mokhtar 10211ffee690SAmr Mokhtar op_cap++; 10221ffee690SAmr Mokhtar } 10231ffee690SAmr Mokhtar 10241ffee690SAmr Mokhtar if (encoder_capable == false) 10251ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, 10261ffee690SAmr Mokhtar "The specified BBDev %u doesn't have required encoder capabilities!\n", 10271ffee690SAmr Mokhtar bbdev_id); 10281ffee690SAmr Mokhtar if (decoder_capable == false) 10291ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, 10301ffee690SAmr Mokhtar "The specified BBDev %u doesn't have required decoder capabilities!\n", 10311ffee690SAmr Mokhtar bbdev_id); 10321ffee690SAmr Mokhtar 10331ffee690SAmr Mokhtar prepare_bbdev_device(bbdev_id, &dev_info, app_params); 10341ffee690SAmr Mokhtar } 10351ffee690SAmr Mokhtar 10361ffee690SAmr Mokhtar int 10371ffee690SAmr Mokhtar main(int argc, char **argv) 10381ffee690SAmr Mokhtar { 10391ffee690SAmr Mokhtar int ret; 1040a9dbe180SThomas Monjalon unsigned int nb_bbdevs, flags, lcore_id; 10411ffee690SAmr Mokhtar void *sigret; 10421ffee690SAmr Mokhtar struct app_config_params app_params = def_app_config; 10431ffee690SAmr Mokhtar struct rte_mempool *ethdev_mbuf_mempool, *bbdev_mbuf_mempool; 1044e70212ccSNicolas Chautru struct rte_mempool *bbdev_op_pools[RTE_BBDEV_OP_TYPE_SIZE_MAX]; 10451ffee690SAmr Mokhtar struct lcore_conf lcore_conf[RTE_MAX_LCORE] = { {0} }; 10461ffee690SAmr Mokhtar struct lcore_statistics lcore_stats[RTE_MAX_LCORE] = { {0} }; 10471ffee690SAmr Mokhtar struct stats_lcore_params stats_lcore; 10481ffee690SAmr Mokhtar struct rte_ring *enc_to_dec_ring; 10491ffee690SAmr Mokhtar bool stats_thread_started = false; 1050cb056611SStephen Hemminger unsigned int main_lcore_id = rte_get_main_lcore(); 10511ffee690SAmr Mokhtar 105261bf499dSThomas Monjalon static const struct rte_mbuf_dynfield input_dynfield_desc = { 105361bf499dSThomas Monjalon .name = "example_bbdev_dynfield_input", 105461bf499dSThomas Monjalon .size = sizeof(struct rte_mbuf *), 1055*08966fe7STyler Retzlaff .align = alignof(struct rte_mbuf *), 105661bf499dSThomas Monjalon }; 105761bf499dSThomas Monjalon 10585bd3c386SJoyce Kong __atomic_store_n(&global_exit_flag, 0, __ATOMIC_RELAXED); 10591ffee690SAmr Mokhtar 10601ffee690SAmr Mokhtar sigret = signal(SIGTERM, signal_handler); 10611ffee690SAmr Mokhtar if (sigret == SIG_ERR) 10621ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, "signal(%d, ...) failed", SIGTERM); 10631ffee690SAmr Mokhtar 10641ffee690SAmr Mokhtar sigret = signal(SIGINT, signal_handler); 10651ffee690SAmr Mokhtar if (sigret == SIG_ERR) 10661ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, "signal(%d, ...) failed", SIGINT); 10671ffee690SAmr Mokhtar 10681ffee690SAmr Mokhtar ret = rte_eal_init(argc, argv); 10691ffee690SAmr Mokhtar if (ret < 0) 10701ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, "Invalid EAL arguments\n"); 10711ffee690SAmr Mokhtar 10721ffee690SAmr Mokhtar argc -= ret; 10731ffee690SAmr Mokhtar argv += ret; 10741ffee690SAmr Mokhtar 10751ffee690SAmr Mokhtar /* parse application arguments (after the EAL ones) */ 10761ffee690SAmr Mokhtar ret = bbdev_parse_args(argc, argv, &app_params); 10771ffee690SAmr Mokhtar if (ret < 0) 10781ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, "Invalid BBDEV arguments\n"); 10791ffee690SAmr Mokhtar 10801ffee690SAmr Mokhtar /*create bbdev op pools*/ 10811ffee690SAmr Mokhtar bbdev_op_pools[RTE_BBDEV_OP_TURBO_DEC] = 10821ffee690SAmr Mokhtar rte_bbdev_op_pool_create("bbdev_op_pool_dec", 10831ffee690SAmr Mokhtar RTE_BBDEV_OP_TURBO_DEC, NB_MBUF, 128, rte_socket_id()); 10841ffee690SAmr Mokhtar bbdev_op_pools[RTE_BBDEV_OP_TURBO_ENC] = 10851ffee690SAmr Mokhtar rte_bbdev_op_pool_create("bbdev_op_pool_enc", 10861ffee690SAmr Mokhtar RTE_BBDEV_OP_TURBO_ENC, NB_MBUF, 128, rte_socket_id()); 10871ffee690SAmr Mokhtar 10881ffee690SAmr Mokhtar if ((bbdev_op_pools[RTE_BBDEV_OP_TURBO_DEC] == NULL) || 10891ffee690SAmr Mokhtar (bbdev_op_pools[RTE_BBDEV_OP_TURBO_ENC] == NULL)) 10901ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, "Cannot create bbdev op pools\n"); 10911ffee690SAmr Mokhtar 10921ffee690SAmr Mokhtar /* Create encoder to decoder ring */ 10931ffee690SAmr Mokhtar flags = (app_params.num_enc_cores == 1) ? RING_F_SP_ENQ : 0; 10941ffee690SAmr Mokhtar if (app_params.num_dec_cores == 1) 10951ffee690SAmr Mokhtar flags |= RING_F_SC_DEQ; 10961ffee690SAmr Mokhtar 10971ffee690SAmr Mokhtar enc_to_dec_ring = rte_ring_create("enc_to_dec_ring", 10981ffee690SAmr Mokhtar rte_align32pow2(NB_MBUF), rte_socket_id(), flags); 10991ffee690SAmr Mokhtar 11001ffee690SAmr Mokhtar /* Get the number of available bbdev devices */ 11011ffee690SAmr Mokhtar nb_bbdevs = rte_bbdev_count(); 11021ffee690SAmr Mokhtar if (nb_bbdevs <= app_params.bbdev_id) 11031ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, 11041ffee690SAmr Mokhtar "%u BBDevs detected, cannot use BBDev with ID %u!\n", 11051ffee690SAmr Mokhtar nb_bbdevs, app_params.bbdev_id); 11061ffee690SAmr Mokhtar printf("Number of bbdevs detected: %d\n", nb_bbdevs); 11071ffee690SAmr Mokhtar 1108a9dbe180SThomas Monjalon if (!rte_eth_dev_is_valid_port(app_params.port_id)) 11091ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, 1110a9dbe180SThomas Monjalon "cannot use port with ID %u!\n", 1111a9dbe180SThomas Monjalon app_params.port_id); 11121ffee690SAmr Mokhtar 11131ffee690SAmr Mokhtar /* create the mbuf mempool for ethdev pkts */ 11141ffee690SAmr Mokhtar ethdev_mbuf_mempool = rte_pktmbuf_pool_create("ethdev_mbuf_pool", 11151ffee690SAmr Mokhtar NB_MBUF, MEMPOOL_CACHE_SIZE, 0, 11161ffee690SAmr Mokhtar RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id()); 11171ffee690SAmr Mokhtar if (ethdev_mbuf_mempool == NULL) 11181ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, "Cannot create ethdev mbuf mempool\n"); 11191ffee690SAmr Mokhtar 11201ffee690SAmr Mokhtar /* create the mbuf mempool for encoder output */ 11211ffee690SAmr Mokhtar bbdev_mbuf_mempool = rte_pktmbuf_pool_create("bbdev_mbuf_pool", 11221ffee690SAmr Mokhtar NB_MBUF, MEMPOOL_CACHE_SIZE, 0, 11231ffee690SAmr Mokhtar RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id()); 11241ffee690SAmr Mokhtar if (bbdev_mbuf_mempool == NULL) 11251ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, "Cannot create ethdev mbuf mempool\n"); 11261ffee690SAmr Mokhtar 112761bf499dSThomas Monjalon /* register mbuf field to store input pointer */ 112861bf499dSThomas Monjalon input_dynfield_offset = 112961bf499dSThomas Monjalon rte_mbuf_dynfield_register(&input_dynfield_desc); 113061bf499dSThomas Monjalon if (input_dynfield_offset < 0) 113161bf499dSThomas Monjalon rte_exit(EXIT_FAILURE, "Cannot register mbuf field\n"); 113261bf499dSThomas Monjalon 11331ffee690SAmr Mokhtar /* initialize ports */ 11341ffee690SAmr Mokhtar ret = initialize_ports(&app_params, ethdev_mbuf_mempool); 11351ffee690SAmr Mokhtar 11361ffee690SAmr Mokhtar /* Check if all requested lcores are available */ 11371ffee690SAmr Mokhtar for (lcore_id = 0; lcore_id < 8 * sizeof(uint64_t); ++lcore_id) 11381ffee690SAmr Mokhtar if (((1ULL << lcore_id) & app_params.enc_core_mask) || 11391ffee690SAmr Mokhtar ((1ULL << lcore_id) & app_params.dec_core_mask)) 11401ffee690SAmr Mokhtar if (!rte_lcore_is_enabled(lcore_id)) 11411ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, 11421ffee690SAmr Mokhtar "Requested lcore_id %u is not enabled!\n", 11431ffee690SAmr Mokhtar lcore_id); 11441ffee690SAmr Mokhtar 11451ffee690SAmr Mokhtar /* Start ethernet port */ 11461ffee690SAmr Mokhtar ret = rte_eth_dev_start(app_params.port_id); 11471ffee690SAmr Mokhtar if (ret < 0) 11481ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, "rte_eth_dev_start:err=%d, port=%u\n", 11491ffee690SAmr Mokhtar ret, app_params.port_id); 11501ffee690SAmr Mokhtar 11511ffee690SAmr Mokhtar ret = check_port_link_status(app_params.port_id); 11521ffee690SAmr Mokhtar if (ret < 0) 11531ffee690SAmr Mokhtar exit(EXIT_FAILURE); 11541ffee690SAmr Mokhtar 11551ffee690SAmr Mokhtar /* start BBDevice and save BBDev queue IDs */ 11561ffee690SAmr Mokhtar enable_bbdev(&app_params); 11571ffee690SAmr Mokhtar 11581ffee690SAmr Mokhtar /* Initialize the port/queue configuration of each logical core */ 11591ffee690SAmr Mokhtar lcore_conf_init(&app_params, lcore_conf, bbdev_op_pools, 11601ffee690SAmr Mokhtar bbdev_mbuf_mempool, enc_to_dec_ring, lcore_stats); 11611ffee690SAmr Mokhtar 11621ffee690SAmr Mokhtar stats_lcore.app_params = &app_params; 11631ffee690SAmr Mokhtar stats_lcore.lconf = lcore_conf; 11641ffee690SAmr Mokhtar 1165cb056611SStephen Hemminger RTE_LCORE_FOREACH_WORKER(lcore_id) { 11661ffee690SAmr Mokhtar if (lcore_conf[lcore_id].core_type != 0) 1167cb056611SStephen Hemminger /* launch per-lcore processing loop on worker lcores */ 11681ffee690SAmr Mokhtar rte_eal_remote_launch(processing_loop, 11691ffee690SAmr Mokhtar &lcore_conf[lcore_id], lcore_id); 11701ffee690SAmr Mokhtar else if (!stats_thread_started) { 11711ffee690SAmr Mokhtar /* launch statistics printing loop */ 11721ffee690SAmr Mokhtar rte_eal_remote_launch(stats_loop, &stats_lcore, 11731ffee690SAmr Mokhtar lcore_id); 11741ffee690SAmr Mokhtar stats_thread_started = true; 11751ffee690SAmr Mokhtar } 11761ffee690SAmr Mokhtar } 11771ffee690SAmr Mokhtar 11781ffee690SAmr Mokhtar if (!stats_thread_started && 1179cb056611SStephen Hemminger lcore_conf[main_lcore_id].core_type != 0) 11801ffee690SAmr Mokhtar rte_exit(EXIT_FAILURE, 11811ffee690SAmr Mokhtar "Not enough lcores to run the statistics printing loop!"); 1182cb056611SStephen Hemminger else if (lcore_conf[main_lcore_id].core_type != 0) 1183cb056611SStephen Hemminger processing_loop(&lcore_conf[main_lcore_id]); 11841ffee690SAmr Mokhtar else if (!stats_thread_started) 11851ffee690SAmr Mokhtar stats_loop(&stats_lcore); 11861ffee690SAmr Mokhtar 1187cb056611SStephen Hemminger RTE_LCORE_FOREACH_WORKER(lcore_id) { 11881ffee690SAmr Mokhtar ret |= rte_eal_wait_lcore(lcore_id); 11891ffee690SAmr Mokhtar } 11901ffee690SAmr Mokhtar 119110aa3757SChengchang Tang /* clean up the EAL */ 119210aa3757SChengchang Tang rte_eal_cleanup(); 119310aa3757SChengchang Tang 11941ffee690SAmr Mokhtar return ret; 11951ffee690SAmr Mokhtar } 1196