virtio: remove kernel virtio header dependencies
[vpp.git] / src / vnet / devices / virtio / pci.h
index b1e2916..ab5c6f1 100644 (file)
 /* VirtIO ABI version, this must match exactly. */
 #define VIRTIO_PCI_ABI_VERSION 0
 
-/*
- * VirtIO Header, located in BAR 0.
- */
-#define VIRTIO_PCI_HOST_FEATURES  0    /* host's supported features (32bit, RO) */
-#define VIRTIO_PCI_GUEST_FEATURES 4    /* guest's supported features (32, RW) */
-#define VIRTIO_PCI_QUEUE_PFN      8    /* physical address of VQ (32, RW) */
-#define VIRTIO_PCI_QUEUE_NUM      12   /* number of ring entries (16, RO) */
-#define VIRTIO_PCI_QUEUE_SEL      14   /* current VQ selection (16, RW) */
-#define VIRTIO_PCI_QUEUE_NOTIFY   16   /* notify host regarding VQ (16, RW) */
-#define VIRTIO_PCI_STATUS         18   /* device status register (8, RW) */
-#define VIRTIO_PCI_ISR            19   /* interrupt status register, reading
-                                        * also clears the register (8, RO) */
-/* Only if MSIX is enabled: */
-#define VIRTIO_MSI_CONFIG_VECTOR  20   /* configuration change vector (16, RW) */
-#define VIRTIO_MSI_QUEUE_VECTOR   22   /* vector for selected VQ notifications
-                                          (16, RW) */
+/* VirtIO device IDs. */
+#define VIRTIO_ID_NETWORK  0x01
 
 /*
  * Vector value used to disable MSI for queue.
  * define in include/linux/virtio_pci.h
- * #define VIRTIO_MSI_NO_VECTOR 0xFFFF
  */
+#define VIRTIO_MSI_NO_VECTOR 0xFFFF
 
 /* The bit of the ISR which indicates a device has an interrupt. */
 #define VIRTIO_PCI_ISR_INTR   0x1
 /* The bit of the ISR which indicates a device configuration change. */
 #define VIRTIO_PCI_ISR_CONFIG 0x2
 
-/* VirtIO device IDs. */
-#define VIRTIO_ID_NETWORK  0x01
-
 /* Status byte for guest to report progress. */
 #define foreach_virtio_config_status_flags     \
   _ (VIRTIO_CONFIG_STATUS_RESET, 0x00)         \
@@ -67,45 +50,19 @@ typedef enum
 #undef _
 } virtio_config_status_flags_t;
 
-#define foreach_virtio_net_feature_flags      \
-  _ (VIRTIO_NET_F_CSUM, 0)      /* Host handles pkts w/ partial csum */ \
-  _ (VIRTIO_NET_F_GUEST_CSUM, 1) /* Guest handles pkts w/ partial csum */ \
-  _ (VIRTIO_NET_F_CTRL_GUEST_OFFLOADS, 2) /* Dynamic offload configuration. */ \
-  _ (VIRTIO_NET_F_MTU, 3)       /* Initial MTU advice. */ \
-  _ (VIRTIO_NET_F_MAC, 5)       /* Host has given MAC address. */ \
-  _ (VIRTIO_NET_F_GSO, 6)       /* Host handles pkts w/ any GSO. */ \
-  _ (VIRTIO_NET_F_GUEST_TSO4, 7)        /* Guest can handle TSOv4 in. */ \
-  _ (VIRTIO_NET_F_GUEST_TSO6, 8)        /* Guest can handle TSOv6 in. */ \
-  _ (VIRTIO_NET_F_GUEST_ECN, 9) /* Guest can handle TSO[6] w/ ECN in. */ \
-  _ (VIRTIO_NET_F_GUEST_UFO, 10)        /* Guest can handle UFO in. */ \
-  _ (VIRTIO_NET_F_HOST_TSO4, 11)        /* Host can handle TSOv4 in. */ \
-  _ (VIRTIO_NET_F_HOST_TSO6, 12)        /* Host can handle TSOv6 in. */ \
-  _ (VIRTIO_NET_F_HOST_ECN, 13) /* Host can handle TSO[6] w/ ECN in. */ \
-  _ (VIRTIO_NET_F_HOST_UFO, 14) /* Host can handle UFO in. */ \
-  _ (VIRTIO_NET_F_MRG_RXBUF, 15)        /* Host can merge receive buffers. */ \
-  _ (VIRTIO_NET_F_STATUS, 16)   /* virtio_net_config.status available */ \
-  _ (VIRTIO_NET_F_CTRL_VQ, 17)  /* Control channel available */ \
-  _ (VIRTIO_NET_F_CTRL_RX, 18)  /* Control channel RX mode support */ \
-  _ (VIRTIO_NET_F_CTRL_VLAN, 19)        /* Control channel VLAN filtering */ \
-  _ (VIRTIO_NET_F_CTRL_RX_EXTRA, 20)    /* Extra RX mode control support */ \
-  _ (VIRTIO_NET_F_GUEST_ANNOUNCE, 21)   /* Guest can announce device on the network */ \
-  _ (VIRTIO_NET_F_MQ, 22)               /* Device supports Receive Flow Steering */ \
-  _ (VIRTIO_NET_F_CTRL_MAC_ADDR, 23)    /* Set MAC address */ \
-  _ (VIRTIO_F_NOTIFY_ON_EMPTY, 24) \
-  _ (VHOST_F_LOG_ALL, 26)      /* Log all write descriptors */ \
-  _ (VIRTIO_F_ANY_LAYOUT, 27)  /* Can the device handle any descripor layout */ \
-  _ (VIRTIO_RING_F_INDIRECT_DESC, 28)   /* Support indirect buffer descriptors */ \
-  _ (VIRTIO_RING_F_EVENT_IDX, 29)       /* The Guest publishes the used index for which it expects an interrupt \
- * at the end of the avail ring. Host should ignore the avail->flags field. */ \
-/* The Host publishes the avail index for which it expects a kick \
- * at the end of the used ring. Guest should ignore the used->flags field. */ \
-  _ (VHOST_USER_F_PROTOCOL_FEATURES, 30)
-
-#define VIRTIO_NET_F_CTRL_GUEST_OFFLOADS 2
-#define VIRTIO_NET_F_MTU 3
+
 #define VIRTIO_NET_S_LINK_UP    1      /* Link is up */
 #define VIRTIO_NET_S_ANNOUNCE   2      /* Announcement is needed */
 
+#define VIRTIO_NET_OK     0
+#define VIRTIO_NET_ERR    1
+
+/* If multiqueue is provided by host, then we support it. */
+#define VIRTIO_NET_CTRL_MQ   4
+#define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET        0
+#define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN        1
+#define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX        0x8000
+
 /*
  * Control network offloads
  * Reconfigures the network offloads that Guest can handle.
@@ -132,27 +89,6 @@ typedef enum
 
 #define VIRTIO_PCI_VRING_ALIGN 4096
 
-#define virtio_log_debug(vim, vif, f, ...)                     \
-{                                                              \
-  vlib_log(VLIB_LOG_LEVEL_DEBUG, vim->log_default, "%U: " f,   \
-           format_vlib_pci_addr, &vif->pci_addr,               \
-           ##__VA_ARGS__);                                     \
-};
-
-#define virtio_log_warning(vim, vif, f, ...)                   \
-{                                                              \
-  vlib_log(VLIB_LOG_LEVEL_WARNING, vim->log_default, "%U: " f, \
-           format_vlib_pci_addr, &vif->pci_addr,               \
-           ##__VA_ARGS__);                                     \
-};
-
-#define virtio_log_error(vim, vif, f, ...)                     \
-{                                                              \
-  vlib_log(VLIB_LOG_LEVEL_ERR, vim->log_default, "%U: " f,     \
-           format_vlib_pci_addr, &vif->pci_addr,               \
-           ##__VA_ARGS__);                                     \
-};
-
 typedef enum
 {
   VIRTIO_MSIX_NONE = 0,
@@ -175,7 +111,7 @@ typedef struct
 
 typedef struct
 {
-  struct virtio_pci_cap cap;
+  virtio_pci_cap_t cap;
   u32 notify_off_multiplier;   /* Multiplier for queue_notify_off. */
 } virtio_pci_notify_cap_t;
 
@@ -185,8 +121,8 @@ typedef struct
   /* About the whole device. */
   u32 device_feature_select;   /* read-write */
   u32 device_feature;          /* read-only */
-  u32 guest_feature_select;    /* read-write */
-  u32 guest_feature;           /* read-write */
+  u32 driver_feature_select;   /* read-write */
+  u32 driver_feature;          /* read-write */
   u16 msix_config;             /* read-write */
   u16 num_queues;              /* read-only */
   u8 device_status;            /* read-write */
@@ -198,43 +134,94 @@ typedef struct
   u16 queue_msix_vector;       /* read-write */
   u16 queue_enable;            /* read-write */
   u16 queue_notify_off;                /* read-only */
-  u32 queue_desc_lo;           /* read-write */
-  u32 queue_desc_hi;           /* read-write */
-  u32 queue_avail_lo;          /* read-write */
-  u32 queue_avail_hi;          /* read-write */
-  u32 queue_used_lo;           /* read-write */
-  u32 queue_used_hi;           /* read-write */
+  u64 queue_desc;              /* read-write */
+  u64 queue_driver;            /* read-write */
+  u64 queue_device;            /* read-write */
 } virtio_pci_common_cfg_t;
 
 typedef struct
 {
-  u64 addr;
-  u32 len;
-  u16 flags;
-  u16 next;
-} vring_desc_t;
+  u8 mac[6];
+  u16 status;
+  u16 max_virtqueue_pairs;
+  u16 mtu;
+} virtio_net_config_t;
 
-typedef struct
+/*
+ * Control virtqueue data structures
+ *
+ * The control virtqueue expects a header in the first sg entry
+ * and an ack/status response in the last entry.  Data for the
+ * command goes in between.
+ */
+/* *INDENT-OFF* */
+typedef CLIB_PACKED (struct
 {
-  u16 flags;
-  u16 idx;
-  u16 ring[0];
-  /*  u16 used_event; */
-} vring_avail_t;
+  u8 class;
+  u8 cmd;
+}) virtio_net_ctrl_hdr_t;
+/* *INDENT-ON* */
+
+typedef u8 virtio_net_ctrl_ack_t;
 
 typedef struct
 {
-  u32 id;
-  u32 len;
-} vring_used_elem_t;
+  virtio_net_ctrl_hdr_t ctrl;
+  virtio_net_ctrl_ack_t status;
+  u8 data[1024];
+} virtio_ctrl_msg_t;
 
-typedef struct
+typedef struct _virtio_pci_func
 {
-  u16 flags;
-  u16 idx;
-  vring_used_elem_t ring[0];
-  /* u16 avail_event; */
-} vring_used_t;
+  void (*read_config) (vlib_main_t * vm, virtio_if_t * vif, void *dst,
+                      int len, u32 addr);
+  void (*write_config) (vlib_main_t * vm, virtio_if_t * vif, void *src,
+                       int len, u32 addr);
+
+    u64 (*get_device_features) (vlib_main_t * vm, virtio_if_t * vif);
+    u64 (*get_driver_features) (vlib_main_t * vm, virtio_if_t * vif);
+  void (*set_driver_features) (vlib_main_t * vm, virtio_if_t * vif,
+                              u64 features);
+
+    u8 (*get_status) (vlib_main_t * vm, virtio_if_t * vif);
+  void (*set_status) (vlib_main_t * vm, virtio_if_t * vif, u8 status);
+    u8 (*device_reset) (vlib_main_t * vm, virtio_if_t * vif);
+
+    u8 (*get_isr) (vlib_main_t * vm, virtio_if_t * vif);
+
+    u16 (*get_queue_size) (vlib_main_t * vm, virtio_if_t * vif, u16 queue_id);
+  void (*set_queue_size) (vlib_main_t * vm, virtio_if_t * vif, u16 queue_id,
+                         u16 queue_size);
+    u8 (*setup_queue) (vlib_main_t * vm, virtio_if_t * vif, u16 queue_id,
+                      void *p);
+  void (*del_queue) (vlib_main_t * vm, virtio_if_t * vif, u16 queue_id);
+  void (*notify_queue) (vlib_main_t * vm, virtio_if_t * vif, u16 queue_id);
+
+    u16 (*set_config_irq) (vlib_main_t * vm, virtio_if_t * vif, u16 vec);
+    u16 (*set_queue_irq) (vlib_main_t * vm, virtio_if_t * vif, u16 vec,
+                         u16 queue_id);
+
+  void (*get_mac) (vlib_main_t * vm, virtio_if_t * vif);
+  void (*set_mac) (vlib_main_t * vm, virtio_if_t * vif);
+    u16 (*get_device_status) (vlib_main_t * vm, virtio_if_t * vif);
+    u16 (*get_max_queue_pairs) (vlib_main_t * vm, virtio_if_t * vif);
+    u16 (*get_mtu) (vlib_main_t * vm, virtio_if_t * vif);
+  void (*device_debug_config_space) (vlib_main_t * vm, virtio_if_t * vif);
+} virtio_pci_func_t;
+
+#define foreach_virtio_flags  \
+  _ (GSO, 0)                  \
+  _ (CSUM_OFFLOAD, 1)         \
+  _ (GRO_COALESCE, 2)         \
+  _ (PACKED, 3)               \
+  _ (IN_ORDER, 4)
+
+typedef enum
+{
+#define _(a, b) VIRTIO_FLAG_##a = (1 << b),
+  foreach_virtio_flags
+#undef _
+} virtio_flag_t;
 
 typedef struct
 {
@@ -246,15 +233,22 @@ typedef struct
   u8 mac_addr[6];
   u64 features;
   u8 gso_enabled;
+  u8 checksum_offload_enabled;
+  u32 virtio_flags;
   clib_error_t *error;
 } virtio_pci_create_if_args_t;
 
-extern void debug_device_config_space (vlib_main_t * vm, virtio_if_t * vif);
+extern const virtio_pci_func_t virtio_pci_legacy_func;
+extern const virtio_pci_func_t virtio_pci_modern_func;
+
 extern void device_status (vlib_main_t * vm, virtio_if_t * vif);
 void virtio_pci_create_if (vlib_main_t * vm,
                           virtio_pci_create_if_args_t * args);
 int virtio_pci_delete_if (vlib_main_t * vm, virtio_if_t * ad);
-
+int virtio_pci_enable_disable_offloads (vlib_main_t * vm, virtio_if_t * vif,
+                                       int gso_enabled,
+                                       int checksum_offload_enabled,
+                                       int offloads_disabled);
 #endif /* __included_virtio_pci_h__ */
 /*
  * fd.io coding-style-patch-verification: ON