xref: /dpdk/examples/l2fwd-event/l2fwd_common.c (revision 8d54b1ec4a8be40975ae6978535bcc1431caad02)
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