examples/ipsec-secgw: support internal ports for events
[dpdk.git] / examples / l3fwd / l3fwd_event.c
index f9491ec..43c47ea 100644 (file)
@@ -188,10 +188,43 @@ l3fwd_event_capability_setup(void)
                l3fwd_event_set_internal_port_ops(&evt_rsrc->ops);
 }
 
+int
+l3fwd_get_free_event_port(struct l3fwd_event_resources *evt_rsrc)
+{
+       static int index;
+       int port_id;
+
+       rte_spinlock_lock(&evt_rsrc->evp.lock);
+       if (index >= evt_rsrc->evp.nb_ports) {
+               printf("No free event port is available\n");
+               return -1;
+       }
+
+       port_id = evt_rsrc->evp.event_p_id[index];
+       index++;
+       rte_spinlock_unlock(&evt_rsrc->evp.lock);
+
+       return port_id;
+}
+
 void
 l3fwd_event_resource_setup(struct rte_eth_conf *port_conf)
 {
        struct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();
+       const event_loop_cb lpm_event_loop[2][2] = {
+               [0][0] = lpm_event_main_loop_tx_d,
+               [0][1] = lpm_event_main_loop_tx_d_burst,
+               [1][0] = lpm_event_main_loop_tx_q,
+               [1][1] = lpm_event_main_loop_tx_q_burst,
+       };
+       const event_loop_cb em_event_loop[2][2] = {
+               [0][0] = em_event_main_loop_tx_d,
+               [0][1] = em_event_main_loop_tx_d_burst,
+               [1][0] = em_event_main_loop_tx_q,
+               [1][1] = em_event_main_loop_tx_q_burst,
+       };
+       uint32_t event_queue_cfg;
+       int ret;
 
        if (!evt_rsrc->enabled)
                return;
@@ -206,5 +239,25 @@ l3fwd_event_resource_setup(struct rte_eth_conf *port_conf)
        l3fwd_eth_dev_port_setup(port_conf);
 
        /* Event device configuration */
-       evt_rsrc->ops.event_device_setup();
+       event_queue_cfg = evt_rsrc->ops.event_device_setup();
+
+       /* Event queue configuration */
+       evt_rsrc->ops.event_queue_setup(event_queue_cfg);
+
+       /* Event port configuration */
+       evt_rsrc->ops.event_port_setup();
+
+       /* Rx/Tx adapters configuration */
+       evt_rsrc->ops.adapter_setup();
+
+       /* Start event device */
+       ret = rte_event_dev_start(evt_rsrc->event_d_id);
+       if (ret < 0)
+               rte_exit(EXIT_FAILURE, "Error in starting eventdev");
+
+       evt_rsrc->ops.lpm_event_loop = lpm_event_loop[evt_rsrc->tx_mode_q]
+                                                      [evt_rsrc->has_burst];
+
+       evt_rsrc->ops.em_event_loop = em_event_loop[evt_rsrc->tx_mode_q]
+                                                      [evt_rsrc->has_burst];
 }