166cb1916SStephen Hemminger /* SPDX-License-Identifier: BSD-3-Clause
266cb1916SStephen Hemminger * Copyright(C) 2019 Marvell International Ltd.
366cb1916SStephen Hemminger */
466cb1916SStephen Hemminger
54ff45798SPavan Nikhilesh #include "l2fwd_common.h"
64ff45798SPavan Nikhilesh
74ff45798SPavan Nikhilesh int
l2fwd_event_init_ports(struct l2fwd_resources * rsrc)84ff45798SPavan Nikhilesh l2fwd_event_init_ports(struct l2fwd_resources *rsrc)
94ff45798SPavan Nikhilesh {
10*4ed89049SDavid Marchand uint16_t nb_rxd = RX_DESC_DEFAULT;
11*4ed89049SDavid Marchand uint16_t nb_txd = TX_DESC_DEFAULT;
124ff45798SPavan Nikhilesh struct rte_eth_conf port_conf = {
134ff45798SPavan Nikhilesh .txmode = {
14295968d1SFerruh Yigit .mq_mode = RTE_ETH_MQ_TX_NONE,
154ff45798SPavan Nikhilesh },
164ff45798SPavan Nikhilesh };
174ff45798SPavan Nikhilesh uint16_t nb_ports_available = 0;
184ff45798SPavan Nikhilesh uint16_t port_id;
194ff45798SPavan Nikhilesh int ret;
204ff45798SPavan Nikhilesh
21080f57bcSPavan Nikhilesh if (rsrc->event_mode) {
22295968d1SFerruh Yigit port_conf.rxmode.mq_mode = RTE_ETH_MQ_RX_RSS;
23080f57bcSPavan Nikhilesh port_conf.rx_adv_conf.rss_conf.rss_key = NULL;
24295968d1SFerruh Yigit port_conf.rx_adv_conf.rss_conf.rss_hf = RTE_ETH_RSS_IP;
25080f57bcSPavan Nikhilesh }
26080f57bcSPavan Nikhilesh
274ff45798SPavan Nikhilesh /* Initialise each port */
284ff45798SPavan Nikhilesh RTE_ETH_FOREACH_DEV(port_id) {
294ff45798SPavan Nikhilesh struct rte_eth_conf local_port_conf = port_conf;
304ff45798SPavan Nikhilesh struct rte_eth_dev_info dev_info;
314ff45798SPavan Nikhilesh struct rte_eth_rxconf rxq_conf;
324ff45798SPavan Nikhilesh struct rte_eth_txconf txq_conf;
334ff45798SPavan Nikhilesh
344ff45798SPavan Nikhilesh /* skip ports that are not enabled */
354ff45798SPavan Nikhilesh if ((rsrc->enabled_port_mask & (1 << port_id)) == 0) {
364ff45798SPavan Nikhilesh printf("Skipping disabled port %u\n", port_id);
374ff45798SPavan Nikhilesh continue;
384ff45798SPavan Nikhilesh }
394ff45798SPavan Nikhilesh nb_ports_available++;
404ff45798SPavan Nikhilesh
414ff45798SPavan Nikhilesh /* init port */
424ff45798SPavan Nikhilesh printf("Initializing port %u... ", port_id);
434ff45798SPavan Nikhilesh fflush(stdout);
448b33aa7eSPavan Nikhilesh
458b33aa7eSPavan Nikhilesh ret = rte_eth_dev_info_get(port_id, &dev_info);
468b33aa7eSPavan Nikhilesh if (ret != 0)
478b33aa7eSPavan Nikhilesh rte_panic("Error during getting device (port %u) info: %s\n",
488b33aa7eSPavan Nikhilesh port_id, strerror(-ret));
49f09d45dbSPavan Nikhilesh local_port_conf.rx_adv_conf.rss_conf.rss_hf &=
50f09d45dbSPavan Nikhilesh dev_info.flow_type_rss_offloads;
51f09d45dbSPavan Nikhilesh if (local_port_conf.rx_adv_conf.rss_conf.rss_hf !=
52f09d45dbSPavan Nikhilesh port_conf.rx_adv_conf.rss_conf.rss_hf) {
53f09d45dbSPavan Nikhilesh printf("Port %u modified RSS hash function based on hardware support,"
54f09d45dbSPavan Nikhilesh "requested:%#"PRIx64" configured:%#"PRIx64"",
55f09d45dbSPavan Nikhilesh port_id,
56f09d45dbSPavan Nikhilesh port_conf.rx_adv_conf.rss_conf.rss_hf,
57f09d45dbSPavan Nikhilesh local_port_conf.rx_adv_conf.rss_conf.rss_hf);
58f09d45dbSPavan Nikhilesh }
59f09d45dbSPavan Nikhilesh
60295968d1SFerruh Yigit if (dev_info.tx_offload_capa & RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE)
614ff45798SPavan Nikhilesh local_port_conf.txmode.offloads |=
62295968d1SFerruh Yigit RTE_ETH_TX_OFFLOAD_MBUF_FAST_FREE;
639a212dc0SConor Fogarty /* Configure RX and TX queue. 8< */
644ff45798SPavan Nikhilesh ret = rte_eth_dev_configure(port_id, 1, 1, &local_port_conf);
654ff45798SPavan Nikhilesh if (ret < 0)
664ff45798SPavan Nikhilesh rte_panic("Cannot configure device: err=%d, port=%u\n",
674ff45798SPavan Nikhilesh ret, port_id);
689a212dc0SConor Fogarty /* >8 End of configuration RX and TX queue. */
694ff45798SPavan Nikhilesh
704ff45798SPavan Nikhilesh ret = rte_eth_dev_adjust_nb_rx_tx_desc(port_id, &nb_rxd,
714ff45798SPavan Nikhilesh &nb_txd);
724ff45798SPavan Nikhilesh if (ret < 0)
734ff45798SPavan Nikhilesh rte_panic("Cannot adjust number of descriptors: err=%d, port=%u\n",
744ff45798SPavan Nikhilesh ret, port_id);
754ff45798SPavan Nikhilesh
764ff45798SPavan Nikhilesh rte_eth_macaddr_get(port_id, &rsrc->eth_addr[port_id]);
774ff45798SPavan Nikhilesh
784ff45798SPavan Nikhilesh /* init one RX queue */
794ff45798SPavan Nikhilesh fflush(stdout);
804ff45798SPavan Nikhilesh rxq_conf = dev_info.default_rxconf;
814ff45798SPavan Nikhilesh rxq_conf.offloads = local_port_conf.rxmode.offloads;
829a212dc0SConor Fogarty /* Using lcore to poll one or several ports. 8< */
834ff45798SPavan Nikhilesh ret = rte_eth_rx_queue_setup(port_id, 0, nb_rxd,
844ff45798SPavan Nikhilesh rte_eth_dev_socket_id(port_id),
854ff45798SPavan Nikhilesh &rxq_conf,
864ff45798SPavan Nikhilesh rsrc->pktmbuf_pool);
874ff45798SPavan Nikhilesh if (ret < 0)
884ff45798SPavan Nikhilesh rte_panic("rte_eth_rx_queue_setup:err=%d, port=%u\n",
894ff45798SPavan Nikhilesh ret, port_id);
904ff45798SPavan Nikhilesh
919a212dc0SConor Fogarty /* >8 End of using lcore to poll one or several ports. */
929a212dc0SConor Fogarty
939a212dc0SConor Fogarty /* Init one TX queue on each port. 8< */
944ff45798SPavan Nikhilesh fflush(stdout);
954ff45798SPavan Nikhilesh txq_conf = dev_info.default_txconf;
964ff45798SPavan Nikhilesh txq_conf.offloads = local_port_conf.txmode.offloads;
974ff45798SPavan Nikhilesh ret = rte_eth_tx_queue_setup(port_id, 0, nb_txd,
984ff45798SPavan Nikhilesh rte_eth_dev_socket_id(port_id),
994ff45798SPavan Nikhilesh &txq_conf);
1004ff45798SPavan Nikhilesh if (ret < 0)
1014ff45798SPavan Nikhilesh rte_panic("rte_eth_tx_queue_setup:err=%d, port=%u\n",
1024ff45798SPavan Nikhilesh ret, port_id);
1039a212dc0SConor Fogarty /* >8 End of init one TX queue on each port. */
1044ff45798SPavan Nikhilesh
1054ff45798SPavan Nikhilesh rte_eth_promiscuous_enable(port_id);
1064ff45798SPavan Nikhilesh
107c2c4f87bSAman Deep Singh printf("Port %u,MAC address: " RTE_ETHER_ADDR_PRT_FMT "\n\n",
1084ff45798SPavan Nikhilesh port_id,
109a7db3afcSAman Deep Singh RTE_ETHER_ADDR_BYTES(&rsrc->eth_addr[port_id]));
1104ff45798SPavan Nikhilesh }
1114ff45798SPavan Nikhilesh
1124ff45798SPavan Nikhilesh return nb_ports_available;
1134ff45798SPavan Nikhilesh }
114622ebb6bSPavan Nikhilesh
115622ebb6bSPavan Nikhilesh static void
l2fwd_event_vector_array_free(struct rte_event events[],uint16_t num)116622ebb6bSPavan Nikhilesh l2fwd_event_vector_array_free(struct rte_event events[], uint16_t num)
117622ebb6bSPavan Nikhilesh {
118622ebb6bSPavan Nikhilesh uint16_t i;
119622ebb6bSPavan Nikhilesh
120622ebb6bSPavan Nikhilesh for (i = 0; i < num; i++) {
1213a304711SPavan Nikhilesh rte_pktmbuf_free_bulk(
1223a304711SPavan Nikhilesh &events[i].vec->mbufs[events[i].vec->elem_offset],
123622ebb6bSPavan Nikhilesh events[i].vec->nb_elem);
124622ebb6bSPavan Nikhilesh rte_mempool_put(rte_mempool_from_obj(events[i].vec),
125622ebb6bSPavan Nikhilesh events[i].vec);
126622ebb6bSPavan Nikhilesh }
127622ebb6bSPavan Nikhilesh }
128622ebb6bSPavan Nikhilesh
129aae4f5e0SPavan Nikhilesh static void
l2fwd_event_port_flush(uint8_t event_d_id __rte_unused,struct rte_event ev,void * args __rte_unused)130aae4f5e0SPavan Nikhilesh l2fwd_event_port_flush(uint8_t event_d_id __rte_unused, struct rte_event ev,
131aae4f5e0SPavan Nikhilesh void *args __rte_unused)
132aae4f5e0SPavan Nikhilesh {
133aae4f5e0SPavan Nikhilesh if (ev.event_type & RTE_EVENT_TYPE_VECTOR)
134aae4f5e0SPavan Nikhilesh l2fwd_event_vector_array_free(&ev, 1);
135aae4f5e0SPavan Nikhilesh else
136aae4f5e0SPavan Nikhilesh rte_pktmbuf_free(ev.mbuf);
137aae4f5e0SPavan Nikhilesh }
138aae4f5e0SPavan Nikhilesh
139622ebb6bSPavan Nikhilesh void
l2fwd_event_worker_cleanup(uint8_t event_d_id,uint8_t port_id,struct rte_event events[],uint16_t nb_enq,uint16_t nb_deq,uint8_t is_vector)140622ebb6bSPavan Nikhilesh l2fwd_event_worker_cleanup(uint8_t event_d_id, uint8_t port_id,
141622ebb6bSPavan Nikhilesh struct rte_event events[], uint16_t nb_enq,
142622ebb6bSPavan Nikhilesh uint16_t nb_deq, uint8_t is_vector)
143622ebb6bSPavan Nikhilesh {
144622ebb6bSPavan Nikhilesh int i;
145622ebb6bSPavan Nikhilesh
146622ebb6bSPavan Nikhilesh if (nb_deq) {
147622ebb6bSPavan Nikhilesh if (is_vector)
148622ebb6bSPavan Nikhilesh l2fwd_event_vector_array_free(events + nb_enq,
149622ebb6bSPavan Nikhilesh nb_deq - nb_enq);
150622ebb6bSPavan Nikhilesh else
151622ebb6bSPavan Nikhilesh for (i = nb_enq; i < nb_deq; i++)
152622ebb6bSPavan Nikhilesh rte_pktmbuf_free(events[i].mbuf);
153622ebb6bSPavan Nikhilesh
154622ebb6bSPavan Nikhilesh for (i = 0; i < nb_deq; i++)
155622ebb6bSPavan Nikhilesh events[i].op = RTE_EVENT_OP_RELEASE;
156622ebb6bSPavan Nikhilesh rte_event_enqueue_burst(event_d_id, port_id, events, nb_deq);
157622ebb6bSPavan Nikhilesh }
158aae4f5e0SPavan Nikhilesh
159aae4f5e0SPavan Nikhilesh rte_event_port_quiesce(event_d_id, port_id, l2fwd_event_port_flush,
160aae4f5e0SPavan Nikhilesh NULL);
161622ebb6bSPavan Nikhilesh }
162