virtio: run process to send interrupts to input nodes
[vpp.git] / src / vnet / devices / virtio / virtio.h
index acefc38..86660a1 100644 (file)
@@ -57,6 +57,9 @@ typedef enum
 
 #define VIRTIO_RING_FLAG_MASK_INT 1
 
+#define VIRTIO_EVENT_START_TIMER 1
+#define VIRTIO_EVENT_STOP_TIMER 2
+
 typedef struct
 {
   CLIB_CACHE_LINE_ALIGN_MARK (cacheline0);
@@ -66,8 +69,15 @@ typedef struct
   vring_avail_t *avail;
   u16 desc_in_use;
   u16 desc_next;
-  int kick_fd;
-  int call_fd;
+  union
+  {
+    struct
+    {
+      int kick_fd;
+      int call_fd;
+    };
+    u16 queue_notify_offset;
+  };
   u8 buffer_pool_index;
   u16 size;
   u16 queue_id;
@@ -77,6 +87,7 @@ typedef struct
   u16 last_used_idx;
   u16 last_kick_avail_idx;
   u32 call_file_index;
+  vnet_hw_if_rx_mode mode;
   virtio_vring_buffering_t *buffering;
   gro_flow_table_t *flow_table;
 } virtio_vring_t;
@@ -182,6 +193,7 @@ typedef struct
 
 typedef struct
 {
+  u32 interrupt_queues_count;
   /* logging */
   vlib_log_class_t log_default;
 
@@ -191,6 +203,7 @@ typedef struct
 extern virtio_main_t virtio_main;
 extern vnet_device_class_t virtio_device_class;
 extern vlib_node_registration_t virtio_input_node;
+extern vlib_node_registration_t virtio_send_interrupt_node;
 
 clib_error_t *virtio_vring_init (vlib_main_t * vm, virtio_if_t * vif, u16 idx,
                                 u16 sz);
@@ -208,9 +221,11 @@ extern void virtio_show (vlib_main_t * vm, u32 * hw_if_indices, u8 show_descr,
 extern void virtio_set_packet_coalesce (virtio_if_t * vif);
 clib_error_t *virtio_set_packet_buffering (virtio_if_t * vif, u16 size);
 extern void virtio_pci_legacy_notify_queue (vlib_main_t * vm,
-                                           virtio_if_t * vif, u16 queue_id);
+                                           virtio_if_t * vif, u16 queue_id,
+                                           u16 queue_notify_offset);
 extern void virtio_pci_modern_notify_queue (vlib_main_t * vm,
-                                           virtio_if_t * vif, u16 queue_id);
+                                           virtio_if_t * vif, u16 queue_id,
+                                           u16 queue_notify_offset);
 format_function_t format_virtio_device_name;
 format_function_t format_virtio_log_name;
 
@@ -220,9 +235,11 @@ virtio_kick (vlib_main_t * vm, virtio_vring_t * vring, virtio_if_t * vif)
   if (vif->type == VIRTIO_IF_TYPE_PCI)
     {
       if (vif->is_modern)
-       virtio_pci_modern_notify_queue (vm, vif, vring->queue_id);
+       virtio_pci_modern_notify_queue (vm, vif, vring->queue_id,
+                                       vring->queue_notify_offset);
       else
-       virtio_pci_legacy_notify_queue (vm, vif, vring->queue_id);
+       virtio_pci_legacy_notify_queue (vm, vif, vring->queue_id,
+                                       vring->queue_notify_offset);
     }
   else
     {