net/virtio: invoke method directly for setting IRQ config
[dpdk.git] / drivers / net / virtio / virtio_pci.h
index dd7693f..588d41f 100644 (file)
@@ -44,8 +44,8 @@ struct virtnet_ctl;
 
 /* VirtIO PCI vendor/device ID. */
 #define VIRTIO_PCI_VENDORID     0x1AF4
-#define VIRTIO_PCI_DEVICEID_MIN 0x1000
-#define VIRTIO_PCI_DEVICEID_MAX 0x103F
+#define VIRTIO_PCI_LEGACY_DEVICEID_NET 0x1000
+#define VIRTIO_PCI_MODERN_DEVICEID_NET 0x1041
 
 /* VirtIO ABI version, this must match exactly. */
 #define VIRTIO_PCI_ABI_VERSION 0
@@ -138,6 +138,7 @@ struct virtnet_ctl;
 #define VIRTIO_RING_F_INDIRECT_DESC    28
 
 #define VIRTIO_F_VERSION_1             32
+#define VIRTIO_F_IOMMU_PLATFORM        33
 
 /*
  * Some VirtIO feature bits (currently bits 28 through 31) are
@@ -145,7 +146,7 @@ struct virtnet_ctl;
  * rest are per-device feature bits.
  */
 #define VIRTIO_TRANSPORT_F_START 28
-#define VIRTIO_TRANSPORT_F_END   32
+#define VIRTIO_TRANSPORT_F_END   34
 
 /* 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. */
@@ -244,26 +245,43 @@ struct virtio_net_config;
 
 struct virtio_hw {
        struct virtnet_ctl *cvq;
-       struct rte_pci_ioport io;
+       uint64_t    req_guest_features;
        uint64_t    guest_features;
-       uint32_t    max_tx_queues;
-       uint32_t    max_rx_queues;
+       uint32_t    max_queue_pairs;
        uint16_t    vtnet_hdr_size;
        uint8_t     vlan_strip;
        uint8_t     use_msix;
-       uint8_t     started;
        uint8_t     modern;
+       uint8_t     use_simple_rxtx;
+       uint8_t     port_id;
        uint8_t     mac_addr[ETHER_ADDR_LEN];
        uint32_t    notify_off_multiplier;
        uint8_t     *isr;
        uint16_t    *notify_base;
-       struct rte_pci_device *dev;
        struct virtio_pci_common_cfg *common_cfg;
        struct virtio_net_config *dev_cfg;
-       const struct virtio_pci_ops *vtpci_ops;
        void        *virtio_user_dev;
+
+       struct virtqueue **vqs;
 };
 
+
+/*
+ * While virtio_hw is stored in shared memory, this structure stores
+ * some infos that may vary in the multiple process model locally.
+ * For example, the vtpci_ops pointer.
+ */
+struct virtio_hw_internal {
+       const struct virtio_pci_ops *vtpci_ops;
+       struct rte_pci_ioport io;
+};
+
+#define VTPCI_OPS(hw)  (virtio_hw_internal[(hw)->port_id].vtpci_ops)
+#define VTPCI_IO(hw)   (&virtio_hw_internal[(hw)->port_id].io)
+
+extern struct virtio_hw_internal virtio_hw_internal[RTE_MAX_ETHPORTS];
+
+
 /*
  * This structure is just a reference to read
  * net device specific config space; it just a chodu structure
@@ -312,6 +330,8 @@ void vtpci_read_dev_config(struct virtio_hw *, size_t, void *, int);
 
 uint8_t vtpci_isr(struct virtio_hw *);
 
-uint16_t vtpci_irq_config(struct virtio_hw *, uint16_t);
+extern const struct virtio_pci_ops legacy_ops;
+extern const struct virtio_pci_ops modern_ops;
+extern const struct virtio_pci_ops virtio_user_ops;
 
 #endif /* _VIRTIO_PCI_H_ */