All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yuanhan Liu <yuanhan.liu@linux.intel.com>
To: dev@dpdk.org
Subject: [PATCH v6 8/9] virtio: add 1.0 support
Date: Thu, 28 Jan 2016 15:54:56 +0800	[thread overview]
Message-ID: <1453967697-3757-9-git-send-email-yuanhan.liu@linux.intel.com> (raw)
In-Reply-To: <1453967697-3757-1-git-send-email-yuanhan.liu@linux.intel.com>

Modern (v1.0) virtio pci device defines several pci capabilities.
Each cap has a configure structure corresponding to it, and the
cap.bar and cap.offset fields tell us where to find it.

Firstly, we map the pci resources by rte_eal_pci_map_device().
We then could easily locate a cfg structure by:

    cfg_addr = dev->mem_resources[cap.bar].addr + cap.offset;

Therefore, the entrance of enabling modern (v1.0) pci device support
is to iterate the pci capability lists, and to locate some configs
we care; and they are:

- common cfg

  For generic virtio and virtqueue configuration, such as setting/getting
  features, enabling a specific queue, and so on.

- nofity cfg

  Combining with `queue_notify_off' from common cfg, we could use it to
  notify a specific virt queue.

- device cfg

  Where virtio_net_config structure is located.

- isr cfg

  Where to read isr (interrupt status).

If any of above cap is not found, we fallback to the legacy virtio
handling.

If succeed, hw->vtpci_ops is assigned to modern_ops, where all
operations are implemented by reading/writing a (or few) specific
configuration space from above 4 cfg structures. And that's basically
how this patch works.

Besides those changes, virtio 1.0 introduces a new status field:
FEATURES_OK, which is set after features negotiation is done.

Last, set the VIRTIO_F_VERSION_1 feature flag.

Signed-off-by: Yuanhan Liu <yuanhan.liu@linux.intel.com>
Tested-by: Qian Xu <qian.q.xu@intel.com>
Reviewed-by: Tetsuya Mukawa <mukawa@igel.co.jp>
Tested-by: Tetsuya Mukawa <mukawa@igel.co.jp>
Acked-by: Huawei Xie <huawei.xie@intel.com>
---

v6: - unfold DEF_IO_READ/WRITE macros

v5: - rename MODERN_READ/WRITE_DEF macro name to IO_READ/WRITE_DEF

    - check offset + length overflow
---
 doc/guides/rel_notes/release_2_3.rst |   3 +
 drivers/net/virtio/virtio_ethdev.c   |  25 ++-
 drivers/net/virtio/virtio_ethdev.h   |   3 +-
 drivers/net/virtio/virtio_pci.c      | 355 ++++++++++++++++++++++++++++++++++-
 drivers/net/virtio/virtio_pci.h      |  67 +++++++
 drivers/net/virtio/virtqueue.h       |   2 +
 6 files changed, 450 insertions(+), 5 deletions(-)

diff --git a/doc/guides/rel_notes/release_2_3.rst b/doc/guides/rel_notes/release_2_3.rst
index 99de186..c390d97 100644
--- a/doc/guides/rel_notes/release_2_3.rst
+++ b/doc/guides/rel_notes/release_2_3.rst
@@ -4,6 +4,9 @@ DPDK Release 2.3
 New Features
 ------------
 
+* **Virtio 1.0 support.**
+
+  Enabled virtio 1.0 support for virtio pmd driver.
 
 Resolved Issues
 ---------------
diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c
index 94e0c4a..deb0382 100644
--- a/drivers/net/virtio/virtio_ethdev.c
+++ b/drivers/net/virtio/virtio_ethdev.c
@@ -927,7 +927,7 @@ virtio_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
 	return virtio_send_command(hw->cvq, &ctrl, &len, 1);
 }
 
-static void
+static int
 virtio_negotiate_features(struct virtio_hw *hw)
 {
 	uint64_t host_features;
@@ -949,6 +949,22 @@ virtio_negotiate_features(struct virtio_hw *hw)
 	hw->guest_features = vtpci_negotiate_features(hw, host_features);
 	PMD_INIT_LOG(DEBUG, "features after negotiate = %"PRIx64,
 		hw->guest_features);
+
+	if (hw->modern) {
+		if (!vtpci_with_feature(hw, VIRTIO_F_VERSION_1)) {
+			PMD_INIT_LOG(ERR,
+				"VIRTIO_F_VERSION_1 features is not enabled.");
+			return -1;
+		}
+		vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_FEATURES_OK);
+		if (!(vtpci_get_status(hw) & VIRTIO_CONFIG_STATUS_FEATURES_OK)) {
+			PMD_INIT_LOG(ERR,
+				"failed to set FEATURES_OK status!");
+			return -1;
+		}
+	}
+
+	return 0;
 }
 
 /*
@@ -1032,7 +1048,8 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
 
 	/* Tell the host we've known how to drive the device. */
 	vtpci_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER);
-	virtio_negotiate_features(hw);
+	if (virtio_negotiate_features(hw) < 0)
+		return -1;
 
 	/* If host does not support status then disable LSC */
 	if (!vtpci_with_feature(hw, VIRTIO_NET_F_STATUS))
@@ -1043,7 +1060,8 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev)
 	rx_func_get(eth_dev);
 
 	/* Setting up rx_header size for the device */
-	if (vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF))
+	if (vtpci_with_feature(hw, VIRTIO_NET_F_MRG_RXBUF) ||
+	    vtpci_with_feature(hw, VIRTIO_F_VERSION_1))
 		hw->vtnet_hdr_size = sizeof(struct virtio_net_hdr_mrg_rxbuf);
 	else
 		hw->vtnet_hdr_size = sizeof(struct virtio_net_hdr);
@@ -1159,6 +1177,7 @@ eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
 		rte_intr_callback_unregister(&pci_dev->intr_handle,
 						virtio_interrupt_handler,
 						eth_dev);
+	rte_eal_pci_unmap_device(pci_dev);
 
 	PMD_INIT_LOG(DEBUG, "dev_uninit completed");
 
diff --git a/drivers/net/virtio/virtio_ethdev.h b/drivers/net/virtio/virtio_ethdev.h
index ae2d47d..fed9571 100644
--- a/drivers/net/virtio/virtio_ethdev.h
+++ b/drivers/net/virtio/virtio_ethdev.h
@@ -64,7 +64,8 @@
 	 1u << VIRTIO_NET_F_CTRL_VQ	  |	\
 	 1u << VIRTIO_NET_F_CTRL_RX	  |	\
 	 1u << VIRTIO_NET_F_CTRL_VLAN	  |	\
-	 1u << VIRTIO_NET_F_MRG_RXBUF)
+	 1u << VIRTIO_NET_F_MRG_RXBUF	  |	\
+	 1ULL << VIRTIO_F_VERSION_1)
 
 /*
  * CQ function prototype
diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c
index 5e1c55f..2d3143b 100644
--- a/drivers/net/virtio/virtio_pci.c
+++ b/drivers/net/virtio/virtio_pci.c
@@ -41,6 +41,14 @@
 #include "virtio_logs.h"
 #include "virtqueue.h"
 
+/*
+ * Following macros are derieved from linux/pci_regs.h, however,
+ * we can't simply include that header here, as there is no such
+ * file for non-Linux platform.
+ */
+#define PCI_CAPABILITY_LIST	0x34
+#define PCI_CAP_ID_VNDR		0x09
+
 static void
 legacy_read_dev_config(struct virtio_hw *hw, size_t offset,
 		       void *dst, int length)
@@ -442,6 +450,218 @@ static const struct virtio_pci_ops legacy_ops = {
 };
 
 
+
+static inline uint8_t
+io_read8(uint8_t *addr)
+{
+	return *(volatile uint8_t *)addr;
+}
+
+static inline void
+io_write8(uint8_t val, uint8_t *addr)
+{
+	*(volatile uint8_t *)addr = val;
+}
+
+static inline uint16_t
+io_read16(uint16_t *addr)
+{
+	return *(volatile uint16_t *)addr;
+}
+
+static inline void
+io_write16(uint16_t val, uint16_t *addr)
+{
+	*(volatile uint16_t *)addr = val;
+}
+
+static inline uint32_t
+io_read32(uint32_t *addr)
+{
+	return *(volatile uint32_t *)addr;
+}
+
+static inline void
+io_write32(uint32_t val, uint32_t *addr)
+{
+	*(volatile uint32_t *)addr = val;
+}
+
+static inline void
+io_write64_twopart(uint64_t val, uint32_t *lo, uint32_t *hi)
+{
+	io_write32(val & ((1ULL << 32) - 1), lo);
+	io_write32(val >> 32,		     hi);
+}
+
+static void
+modern_read_dev_config(struct virtio_hw *hw, size_t offset,
+		       void *dst, int length)
+{
+	int i;
+	uint8_t *p;
+	uint8_t old_gen, new_gen;
+
+	do {
+		old_gen = io_read8(&hw->common_cfg->config_generation);
+
+		p = dst;
+		for (i = 0;  i < length; i++)
+			*p++ = io_read8((uint8_t *)hw->dev_cfg + offset + i);
+
+		new_gen = io_read8(&hw->common_cfg->config_generation);
+	} while (old_gen != new_gen);
+}
+
+static void
+modern_write_dev_config(struct virtio_hw *hw, size_t offset,
+			const void *src, int length)
+{
+	int i;
+	const uint8_t *p = src;
+
+	for (i = 0;  i < length; i++)
+		io_write8(*p++, (uint8_t *)hw->dev_cfg + offset + i);
+}
+
+static uint64_t
+modern_get_features(struct virtio_hw *hw)
+{
+	uint32_t features_lo, features_hi;
+
+	io_write32(0, &hw->common_cfg->device_feature_select);
+	features_lo = io_read32(&hw->common_cfg->device_feature);
+
+	io_write32(1, &hw->common_cfg->device_feature_select);
+	features_hi = io_read32(&hw->common_cfg->device_feature);
+
+	return ((uint64_t)features_hi << 32) | features_lo;
+}
+
+static void
+modern_set_features(struct virtio_hw *hw, uint64_t features)
+{
+	io_write32(0, &hw->common_cfg->guest_feature_select);
+	io_write32(features & ((1ULL << 32) - 1),
+		&hw->common_cfg->guest_feature);
+
+	io_write32(1, &hw->common_cfg->guest_feature_select);
+	io_write32(features >> 32,
+		&hw->common_cfg->guest_feature);
+}
+
+static uint8_t
+modern_get_status(struct virtio_hw *hw)
+{
+	return io_read8(&hw->common_cfg->device_status);
+}
+
+static void
+modern_set_status(struct virtio_hw *hw, uint8_t status)
+{
+	io_write8(status, &hw->common_cfg->device_status);
+}
+
+static void
+modern_reset(struct virtio_hw *hw)
+{
+	modern_set_status(hw, VIRTIO_CONFIG_STATUS_RESET);
+	modern_get_status(hw);
+}
+
+static uint8_t
+modern_get_isr(struct virtio_hw *hw)
+{
+	return io_read8(hw->isr);
+}
+
+static uint16_t
+modern_set_config_irq(struct virtio_hw *hw, uint16_t vec)
+{
+	io_write16(vec, &hw->common_cfg->msix_config);
+	return io_read16(&hw->common_cfg->msix_config);
+}
+
+static uint16_t
+modern_get_queue_num(struct virtio_hw *hw, uint16_t queue_id)
+{
+	io_write16(queue_id, &hw->common_cfg->queue_select);
+	return io_read16(&hw->common_cfg->queue_size);
+}
+
+static void
+modern_setup_queue(struct virtio_hw *hw, struct virtqueue *vq)
+{
+	uint64_t desc_addr, avail_addr, used_addr;
+	uint16_t notify_off;
+
+	desc_addr = vq->mz->phys_addr;
+	avail_addr = desc_addr + vq->vq_nentries * sizeof(struct vring_desc);
+	used_addr = RTE_ALIGN_CEIL(avail_addr + offsetof(struct vring_avail,
+							 ring[vq->vq_nentries]),
+				   VIRTIO_PCI_VRING_ALIGN);
+
+	io_write16(vq->vq_queue_index, &hw->common_cfg->queue_select);
+
+	io_write64_twopart(desc_addr, &hw->common_cfg->queue_desc_lo,
+				      &hw->common_cfg->queue_desc_hi);
+	io_write64_twopart(avail_addr, &hw->common_cfg->queue_avail_lo,
+				       &hw->common_cfg->queue_avail_hi);
+	io_write64_twopart(used_addr, &hw->common_cfg->queue_used_lo,
+				      &hw->common_cfg->queue_used_hi);
+
+	notify_off = io_read16(&hw->common_cfg->queue_notify_off);
+	vq->notify_addr = (void *)((uint8_t *)hw->notify_base +
+				notify_off * hw->notify_off_multiplier);
+
+	io_write16(1, &hw->common_cfg->queue_enable);
+
+	PMD_INIT_LOG(DEBUG, "queue %u addresses:", vq->vq_queue_index);
+	PMD_INIT_LOG(DEBUG, "\t desc_addr: %"PRIx64, desc_addr);
+	PMD_INIT_LOG(DEBUG, "\t aval_addr: %"PRIx64, avail_addr);
+	PMD_INIT_LOG(DEBUG, "\t used_addr: %"PRIx64, used_addr);
+	PMD_INIT_LOG(DEBUG, "\t notify addr: %p (notify offset: %u)",
+		vq->notify_addr, notify_off);
+}
+
+static void
+modern_del_queue(struct virtio_hw *hw, struct virtqueue *vq)
+{
+	io_write16(vq->vq_queue_index, &hw->common_cfg->queue_select);
+
+	io_write64_twopart(0, &hw->common_cfg->queue_desc_lo,
+				  &hw->common_cfg->queue_desc_hi);
+	io_write64_twopart(0, &hw->common_cfg->queue_avail_lo,
+				  &hw->common_cfg->queue_avail_hi);
+	io_write64_twopart(0, &hw->common_cfg->queue_used_lo,
+				  &hw->common_cfg->queue_used_hi);
+
+	io_write16(0, &hw->common_cfg->queue_enable);
+}
+
+static void
+modern_notify_queue(struct virtio_hw *hw __rte_unused, struct virtqueue *vq)
+{
+	io_write16(1, vq->notify_addr);
+}
+
+static const struct virtio_pci_ops modern_ops = {
+	.read_dev_cfg	= modern_read_dev_config,
+	.write_dev_cfg	= modern_write_dev_config,
+	.reset		= modern_reset,
+	.get_status	= modern_get_status,
+	.set_status	= modern_set_status,
+	.get_features	= modern_get_features,
+	.set_features	= modern_set_features,
+	.get_isr	= modern_get_isr,
+	.set_config_irq	= modern_set_config_irq,
+	.get_queue_num	= modern_get_queue_num,
+	.setup_queue	= modern_setup_queue,
+	.del_queue	= modern_del_queue,
+	.notify_queue	= modern_notify_queue,
+};
+
+
 void
 vtpci_read_dev_config(struct virtio_hw *hw, size_t offset,
 		      void *dst, int length)
@@ -495,6 +715,12 @@ vtpci_set_status(struct virtio_hw *hw, uint8_t status)
 }
 
 uint8_t
+vtpci_get_status(struct virtio_hw *hw)
+{
+	return hw->vtpci_ops->get_status(hw);
+}
+
+uint8_t
 vtpci_isr(struct virtio_hw *hw)
 {
 	return hw->vtpci_ops->get_isr(hw);
@@ -508,15 +734,142 @@ vtpci_irq_config(struct virtio_hw *hw, uint16_t vec)
 	return hw->vtpci_ops->set_config_irq(hw, vec);
 }
 
+static void *
+get_cfg_addr(struct rte_pci_device *dev, struct virtio_pci_cap *cap)
+{
+	uint8_t  bar    = cap->bar;
+	uint32_t length = cap->length;
+	uint32_t offset = cap->offset;
+	uint8_t *base;
+
+	if (bar > 5) {
+		PMD_INIT_LOG(ERR, "invalid bar: %u", bar);
+		return NULL;
+	}
+
+	if (offset + length < offset) {
+		PMD_INIT_LOG(ERR, "offset(%u) + lenght(%u) overflows",
+			offset, length);
+		return NULL;
+	}
+
+	if (offset + length > dev->mem_resource[bar].len) {
+		PMD_INIT_LOG(ERR,
+			"invalid cap: overflows bar space: %u > %"PRIu64,
+			offset + length, dev->mem_resource[bar].len);
+		return NULL;
+	}
+
+	base = dev->mem_resource[bar].addr;
+	if (base == NULL) {
+		PMD_INIT_LOG(ERR, "bar %u base addr is NULL", bar);
+		return NULL;
+	}
+
+	return base + offset;
+}
+
+static int
+virtio_read_caps(struct rte_pci_device *dev, struct virtio_hw *hw)
+{
+	uint8_t pos;
+	struct virtio_pci_cap cap;
+	int ret;
+
+	if (rte_eal_pci_map_device(dev) < 0) {
+		PMD_INIT_LOG(DEBUG, "failed to map pci device!");
+		return -1;
+	}
+
+	ret = rte_eal_pci_read_config(dev, &pos, 1, PCI_CAPABILITY_LIST);
+	if (ret < 0) {
+		PMD_INIT_LOG(DEBUG, "failed to read pci capability list");
+		return -1;
+	}
+
+	while (pos) {
+		ret = rte_eal_pci_read_config(dev, &cap, sizeof(cap), pos);
+		if (ret < 0) {
+			PMD_INIT_LOG(ERR,
+				"failed to read pci cap at pos: %x", pos);
+			break;
+		}
+
+		if (cap.cap_vndr != PCI_CAP_ID_VNDR) {
+			PMD_INIT_LOG(DEBUG,
+				"[%2x] skipping non VNDR cap id: %02x",
+				pos, cap.cap_vndr);
+			goto next;
+		}
+
+		PMD_INIT_LOG(DEBUG,
+			"[%2x] cfg type: %u, bar: %u, offset: %04x, len: %u",
+			pos, cap.cfg_type, cap.bar, cap.offset, cap.length);
+
+		switch (cap.cfg_type) {
+		case VIRTIO_PCI_CAP_COMMON_CFG:
+			hw->common_cfg = get_cfg_addr(dev, &cap);
+			break;
+		case VIRTIO_PCI_CAP_NOTIFY_CFG:
+			rte_eal_pci_read_config(dev, &hw->notify_off_multiplier,
+						4, pos + sizeof(cap));
+			hw->notify_base = get_cfg_addr(dev, &cap);
+			break;
+		case VIRTIO_PCI_CAP_DEVICE_CFG:
+			hw->dev_cfg = get_cfg_addr(dev, &cap);
+			break;
+		case VIRTIO_PCI_CAP_ISR_CFG:
+			hw->isr = get_cfg_addr(dev, &cap);
+			break;
+		}
+
+	next:
+		pos = cap.cap_next;
+	}
+
+	if (hw->common_cfg == NULL || hw->notify_base == NULL ||
+	    hw->dev_cfg == NULL    || hw->isr == NULL) {
+		PMD_INIT_LOG(INFO, "no modern virtio pci device found.");
+		return -1;
+	}
+
+	PMD_INIT_LOG(INFO, "found modern virtio pci device.");
+
+	PMD_INIT_LOG(DEBUG, "common cfg mapped at: %p", hw->common_cfg);
+	PMD_INIT_LOG(DEBUG, "device cfg mapped at: %p", hw->dev_cfg);
+	PMD_INIT_LOG(DEBUG, "isr cfg mapped at: %p", hw->isr);
+	PMD_INIT_LOG(DEBUG, "notify base: %p, notify off multiplier: %u",
+		hw->notify_base, hw->notify_off_multiplier);
+
+	return 0;
+}
+
 int
 vtpci_init(struct rte_pci_device *dev, struct virtio_hw *hw)
 {
-	hw->vtpci_ops = &legacy_ops;
+	hw->dev = dev;
 
+	/*
+	 * Try if we can succeed reading virtio pci caps, which exists
+	 * only on modern pci device. If failed, we fallback to legacy
+	 * virtio handling.
+	 */
+	if (virtio_read_caps(dev, hw) == 0) {
+		PMD_INIT_LOG(INFO, "modern virtio pci detected.");
+		hw->vtpci_ops = &modern_ops;
+		hw->modern    = 1;
+		dev->driver->drv_flags |= RTE_PCI_DRV_INTR_LSC;
+		return 0;
+	}
+
+	PMD_INIT_LOG(INFO, "trying with legacy virtio pci.");
 	if (legacy_virtio_resource_init(dev) < 0)
 		return -1;
+
+	hw->vtpci_ops = &legacy_ops;
 	hw->use_msix = legacy_virtio_has_msix(&dev->addr);
 	hw->io_base  = (uint32_t)(uintptr_t)dev->mem_resource[0].addr;
+	hw->modern   = 0;
 
 	return 0;
 }
diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h
index d7bc6bb..fcac660 100644
--- a/drivers/net/virtio/virtio_pci.h
+++ b/drivers/net/virtio/virtio_pci.h
@@ -93,6 +93,7 @@ struct virtqueue;
 #define VIRTIO_CONFIG_STATUS_ACK       0x01
 #define VIRTIO_CONFIG_STATUS_DRIVER    0x02
 #define VIRTIO_CONFIG_STATUS_DRIVER_OK 0x04
+#define VIRTIO_CONFIG_STATUS_FEATURES_OK 0x08
 #define VIRTIO_CONFIG_STATUS_FAILED    0x80
 
 /*
@@ -141,6 +142,8 @@ struct virtqueue;
 /* We support indirect buffer descriptors */
 #define VIRTIO_RING_F_INDIRECT_DESC	28
 
+#define VIRTIO_F_VERSION_1		32
+
 /*
  * Some VirtIO feature bits (currently bits 28 through 31) are
  * reserved for the transport being used (eg. virtio_ring), the
@@ -163,6 +166,60 @@ struct virtqueue;
  */
 #define VIRTIO_MAX_VIRTQUEUES 8
 
+/* Common configuration */
+#define VIRTIO_PCI_CAP_COMMON_CFG	1
+/* Notifications */
+#define VIRTIO_PCI_CAP_NOTIFY_CFG	2
+/* ISR Status */
+#define VIRTIO_PCI_CAP_ISR_CFG		3
+/* Device specific configuration */
+#define VIRTIO_PCI_CAP_DEVICE_CFG	4
+/* PCI configuration access */
+#define VIRTIO_PCI_CAP_PCI_CFG		5
+
+/* This is the PCI capability header: */
+struct virtio_pci_cap {
+	uint8_t cap_vndr;		/* Generic PCI field: PCI_CAP_ID_VNDR */
+	uint8_t cap_next;		/* Generic PCI field: next ptr. */
+	uint8_t cap_len;		/* Generic PCI field: capability length */
+	uint8_t cfg_type;		/* Identifies the structure. */
+	uint8_t bar;			/* Where to find it. */
+	uint8_t padding[3];		/* Pad to full dword. */
+	uint32_t offset;		/* Offset within bar. */
+	uint32_t length;		/* Length of the structure, in bytes. */
+};
+
+struct virtio_pci_notify_cap {
+	struct virtio_pci_cap cap;
+	uint32_t notify_off_multiplier;	/* Multiplier for queue_notify_off. */
+};
+
+/* Fields in VIRTIO_PCI_CAP_COMMON_CFG: */
+struct virtio_pci_common_cfg {
+	/* About the whole device. */
+	uint32_t device_feature_select;	/* read-write */
+	uint32_t device_feature;	/* read-only */
+	uint32_t guest_feature_select;	/* read-write */
+	uint32_t guest_feature;		/* read-write */
+	uint16_t msix_config;		/* read-write */
+	uint16_t num_queues;		/* read-only */
+	uint8_t device_status;		/* read-write */
+	uint8_t config_generation;	/* read-only */
+
+	/* About a specific virtqueue. */
+	uint16_t queue_select;		/* read-write */
+	uint16_t queue_size;		/* read-write, power of 2. */
+	uint16_t queue_msix_vector;	/* read-write */
+	uint16_t queue_enable;		/* read-write */
+	uint16_t queue_notify_off;	/* read-only */
+	uint32_t queue_desc_lo;		/* read-write */
+	uint32_t queue_desc_hi;		/* read-write */
+	uint32_t queue_avail_lo;	/* read-write */
+	uint32_t queue_avail_hi;	/* read-write */
+	uint32_t queue_used_lo;		/* read-write */
+	uint32_t queue_used_hi;		/* read-write */
+};
+
 struct virtio_hw;
 
 struct virtio_pci_ops {
@@ -188,6 +245,8 @@ struct virtio_pci_ops {
 	void (*notify_queue)(struct virtio_hw *hw, struct virtqueue *vq);
 };
 
+struct virtio_net_config;
+
 struct virtio_hw {
 	struct virtqueue *cvq;
 	uint32_t    io_base;
@@ -198,7 +257,14 @@ struct virtio_hw {
 	uint8_t	    vlan_strip;
 	uint8_t	    use_msix;
 	uint8_t     started;
+	uint8_t     modern;
 	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;
 };
 
@@ -284,6 +350,7 @@ void vtpci_reset(struct virtio_hw *);
 
 void vtpci_reinit_complete(struct virtio_hw *);
 
+uint8_t vtpci_get_status(struct virtio_hw *);
 void vtpci_set_status(struct virtio_hw *, uint8_t);
 
 uint64_t vtpci_negotiate_features(struct virtio_hw *, uint64_t);
diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h
index d7fb450..99d4fa9 100644
--- a/drivers/net/virtio/virtqueue.h
+++ b/drivers/net/virtio/virtqueue.h
@@ -202,6 +202,8 @@ struct virtqueue {
 	/* Size bins in array as RFC 2819, undersized [0], 64 [1], etc */
 	uint64_t	size_bins[8];
 
+	uint16_t	*notify_addr;
+
 	struct vq_desc_extra {
 		void              *cookie;
 		uint16_t          ndescs;
-- 
1.9.0

  parent reply	other threads:[~2016-01-28  7:54 UTC|newest]

Thread overview: 122+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-10  3:54 [PATCH 0/6 for 2.3] initial virtio 1.0 enabling Yuanhan Liu
2015-12-10  3:54 ` [PATCH 1/6] virtio: don't set vring address again at queue startup Yuanhan Liu
2015-12-10  3:54 ` [PATCH 2/6] virtio: introduce struct virtio_pci_ops Yuanhan Liu
2015-12-29 11:31   ` Tan, Jianfeng
2015-12-30  3:45     ` Yuanhan Liu
2015-12-10  3:54 ` [PATCH 3/6] virtio: move left pci stuff to virtio_pci.c Yuanhan Liu
2015-12-10  3:54 ` [PATCH 4/6] viritio: switch to 64 bit features Yuanhan Liu
2015-12-10  3:54 ` [PATCH 5/6] virtio: set RTE_PCI_DRV_NEED_MAPPING flag Yuanhan Liu
2015-12-10  3:54 ` [PATCH 6/6] virtio: add virtio v1.0 support Yuanhan Liu
2015-12-29 11:39   ` Tan, Jianfeng
2015-12-30  3:40     ` Yuanhan Liu
2015-12-10  3:58 ` [PATCH 0/6 for 2.3] initial virtio 1.0 enabling Yuanhan Liu
2015-12-29 11:19 ` Tan, Jianfeng
2015-12-30  3:53   ` Yuanhan Liu
2016-01-04  3:55   ` Xu, Qian Q
2016-01-04  4:16     ` Yuanhan Liu
2016-01-12  6:58 ` [PATCH v2 0/7] virtio 1.0 enabling for virtio pmd driver Yuanhan Liu
2016-01-12  6:58   ` [PATCH v2 1/7] virtio: don't set vring address again at queue startup Yuanhan Liu
2016-01-12  6:58   ` [PATCH v2 2/7] virtio: introduce struct virtio_pci_ops Yuanhan Liu
2016-01-12  6:59   ` [PATCH v2 3/7] virtio: move left pci stuff to virtio_pci.c Yuanhan Liu
2016-01-12  6:59   ` [PATCH v2 4/7] viritio: switch to 64 bit features Yuanhan Liu
2016-01-12  6:59   ` [PATCH v2 5/7] virtio: retrieve hdr_size from hw->vtnet_hdr_size Yuanhan Liu
2016-01-12  6:59   ` [PATCH v2 6/7] eal: pci: export pci_map_device Yuanhan Liu
2016-01-12  8:31     ` David Marchand
2016-01-12  8:40       ` Yuanhan Liu
2016-01-12  9:05         ` Yuanhan Liu
2016-01-13 14:44           ` Santosh Shukla
2016-01-12  6:59   ` [PATCH v2 7/7] virtio: add 1.0 support Yuanhan Liu
2016-01-13  3:31     ` Tetsuya Mukawa
2016-01-13  9:38       ` Yuanhan Liu
2016-01-14  7:47     ` Xie, Huawei
2016-01-14  7:50       ` Yuanhan Liu
2016-01-14  7:51         ` Xie, Huawei
2016-01-14  7:58           ` Yuanhan Liu
2016-01-14  8:08             ` Xie, Huawei
2016-01-14  8:22               ` Yuanhan Liu
2016-01-14  8:28                 ` Xie, Huawei
2016-01-14  7:50     ` Xie, Huawei
2016-01-14  8:38       ` Yuanhan Liu
2016-01-12  7:07   ` [PATCH v2 0/7] virtio 1.0 enabling for virtio pmd driver Yuanhan Liu
2016-01-14  4:27   ` Tetsuya Mukawa
2016-01-14  5:59     ` Yuanhan Liu
2016-01-14  6:09     ` Tan, Jianfeng
2016-01-14  6:41       ` Tetsuya Mukawa
2016-01-18  9:04         ` Tetsuya Mukawa
2016-01-14  6:45       ` Yuanhan Liu
2016-01-14  7:42   ` [PATCH v3 0/8] " Yuanhan Liu
2016-01-14  7:42     ` [PATCH v3 1/8] virtio: don't set vring address again at queue startup Yuanhan Liu
2016-01-14  7:42     ` [PATCH v3 2/8] virtio: introduce struct virtio_pci_ops Yuanhan Liu
2016-01-14  7:42     ` [PATCH v3 3/8] virtio: move left pci stuff to virtio_pci.c Yuanhan Liu
2016-01-14  7:42     ` [PATCH v3 4/8] viritio: switch to 64 bit features Yuanhan Liu
2016-01-14  7:42     ` [PATCH v3 5/8] virtio: retrieve hdr_size from hw->vtnet_hdr_size Yuanhan Liu
2016-01-14  7:42     ` [PATCH v3 6/8] eal: pci: export pci_[un]map_device Yuanhan Liu
2016-01-14  7:45       ` Yuanhan Liu
2016-01-14  7:42     ` [PATCH v3 7/8] virtio: add 1.0 support Yuanhan Liu
2016-01-14  7:42     ` [PATCH v3 8/8] virtio: move VIRTIO_READ/WRITE_REG_X into virtio_pci.c Yuanhan Liu
2016-01-16 10:08       ` Santosh Shukla
2016-01-17 14:07         ` Santosh Shukla
2016-01-15  4:36   ` [PATCH v4 0/8] virtio 1.0 enabling for virtio pmd driver Yuanhan Liu
2016-01-15  4:36     ` [PATCH v4 1/8] virtio: don't set vring address again at queue startup Yuanhan Liu
2016-01-15  4:36     ` [PATCH v4 2/8] virtio: introduce struct virtio_pci_ops Yuanhan Liu
2016-01-18 17:21       ` Xie, Huawei
2016-01-15  4:36     ` [PATCH v4 3/8] virtio: move left pci stuff to virtio_pci.c Yuanhan Liu
2016-01-15  4:36     ` [PATCH v4 4/8] viritio: switch to 64 bit features Yuanhan Liu
2016-01-15  4:36     ` [PATCH v4 5/8] virtio: retrieve hdr_size from hw->vtnet_hdr_size Yuanhan Liu
2016-01-15  4:36     ` [PATCH v4 6/8] eal: pci: export pci_[un]map_device Yuanhan Liu
2016-01-15  4:36     ` [PATCH v4 7/8] virtio: add 1.0 support Yuanhan Liu
2016-01-18 16:38       ` Xie, Huawei
2016-01-18 16:50       ` Xie, Huawei
2016-01-19  5:55         ` Yuanhan Liu
2016-01-19  7:44           ` Xie, Huawei
2016-01-19  7:54             ` Yuanhan Liu
2016-01-19  8:02             ` Xie, Huawei
2016-01-18 17:07       ` Xie, Huawei
2016-01-19  1:36         ` Yuanhan Liu
2016-01-19  1:51           ` Xie, Huawei
2016-01-19  2:46             ` Yuanhan Liu
2016-01-19  2:48               ` Xie, Huawei
2016-01-19  5:54                 ` Yuanhan Liu
2016-01-15  4:36     ` [PATCH v4 8/8] virtio: move VIRTIO_READ/WRITE_REG_X into virtio_pci.c Yuanhan Liu
2016-01-15  8:57       ` Xu, Qian Q
2016-01-18  8:04     ` [PATCH v4 0/8] virtio 1.0 enabling for virtio pmd driver Tetsuya Mukawa
2016-01-19  8:11     ` [PATCH v5 0/9] " Yuanhan Liu
2016-01-19  8:11       ` [PATCH v5 1/9] virtio: don't set vring address again at queue startup Yuanhan Liu
2016-01-19  8:11       ` [PATCH v5 2/9] virtio: define offset as size_t type Yuanhan Liu
2016-01-19  8:11       ` [PATCH v5 3/9] virtio: introduce struct virtio_pci_ops Yuanhan Liu
2016-01-19  8:12       ` [PATCH v5 4/9] virtio: move left pci stuff to virtio_pci.c Yuanhan Liu
2016-01-19  8:12       ` [PATCH v5 5/9] viritio: switch to 64 bit features Yuanhan Liu
2016-01-19  8:12       ` [PATCH v5 6/9] virtio: retrieve hdr_size from hw->vtnet_hdr_size Yuanhan Liu
2016-01-19  8:12       ` [PATCH v5 7/9] eal: pci: export pci_[un]map_device Yuanhan Liu
2016-01-19  8:17         ` David Marchand
2016-01-19  8:12       ` [PATCH v5 8/9] virtio: add 1.0 support Yuanhan Liu
2016-01-21 11:37         ` Thomas Monjalon
2016-01-27  3:49           ` Yuanhan Liu
2016-01-21 11:49         ` Thomas Monjalon
2016-01-27  3:46           ` Yuanhan Liu
2016-01-27  8:11             ` Thomas Monjalon
2016-01-19  8:12       ` [PATCH v5 9/9] virtio: move VIRTIO_READ/WRITE_REG_X into virtio_pci.c Yuanhan Liu
2016-01-19  8:55       ` [PATCH v5 0/9] virtio 1.0 enabling for virtio pmd driver Xie, Huawei
2016-01-28  7:54       ` [PATCH v6 " Yuanhan Liu
2016-01-28  7:54         ` [PATCH v6 1/9] virtio: don't set vring address again at queue startup Yuanhan Liu
2016-01-28  7:54         ` [PATCH v6 2/9] virtio: define offset as size_t type Yuanhan Liu
2016-01-28  7:54         ` [PATCH v6 3/9] virtio: introduce struct virtio_pci_ops Yuanhan Liu
2016-01-28  7:54         ` [PATCH v6 4/9] virtio: move left pci stuff to virtio_pci.c Yuanhan Liu
2016-01-28  7:54         ` [PATCH v6 5/9] viritio: switch to 64 bit features Yuanhan Liu
2016-01-28  7:54         ` [PATCH v6 6/9] virtio: retrieve hdr_size from hw->vtnet_hdr_size Yuanhan Liu
2016-01-28  7:54         ` [PATCH v6 7/9] eal: pci: export pci_[un]map_device Yuanhan Liu
2016-01-28  7:54         ` Yuanhan Liu [this message]
2016-01-28  7:54         ` [PATCH v6 9/9] virtio: move VIRTIO_READ/WRITE_REG_X into virtio_pci.c Yuanhan Liu
2016-02-02 10:46         ` [PATCH v6 0/9] virtio 1.0 enabling for virtio pmd driver Thomas Monjalon
2016-02-02 13:00           ` Yuanhan Liu
2016-02-02 13:48         ` [PATCH v7 " Yuanhan Liu
2016-02-02 13:48           ` [PATCH v7 1/9] virtio: don't set vring address again at queue startup Yuanhan Liu
2016-02-02 13:48           ` [PATCH v7 2/9] virtio: define offset as size_t type Yuanhan Liu
2016-02-02 13:48           ` [PATCH v7 3/9] virtio: introduce struct virtio_pci_ops Yuanhan Liu
2016-02-02 13:48           ` [PATCH v7 4/9] virtio: move left pci stuff to virtio_pci.c Yuanhan Liu
2016-02-02 13:48           ` [PATCH v7 5/9] viritio: switch to 64 bit features Yuanhan Liu
2016-02-02 13:48           ` [PATCH v7 6/9] virtio: retrieve hdr_size from hw->vtnet_hdr_size Yuanhan Liu
2016-02-02 13:48           ` [PATCH v7 7/9] eal: pci: export pci_[un]map_device Yuanhan Liu
2016-02-02 13:48           ` [PATCH v7 8/9] virtio: add 1.0 support Yuanhan Liu
2016-02-02 13:48           ` [PATCH v7 9/9] virtio: move VIRTIO_READ/WRITE_REG_X into virtio_pci.c Yuanhan Liu
2016-02-03 15:09           ` [PATCH v7 0/9] virtio 1.0 enabling for virtio pmd driver Thomas Monjalon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1453967697-3757-9-git-send-email-yuanhan.liu@linux.intel.com \
    --to=yuanhan.liu@linux.intel.com \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.