So far virtio handle rw access for uio / ioport interface,
This patch to extend the support for vfio.

Signed-off-by: Santosh Shukla <sshukla at mvista.com>
---
 drivers/net/virtio/virtio_io.h  |    2 +-
 drivers/net/virtio/virtio_pci.c |  110 ++++++++++++++++++++++++++++++++++-----
 2 files changed, 98 insertions(+), 14 deletions(-)

diff --git a/drivers/net/virtio/virtio_io.h b/drivers/net/virtio/virtio_io.h
index bfa1341..ce59e3f 100644
--- a/drivers/net/virtio/virtio_io.h
+++ b/drivers/net/virtio/virtio_io.h
@@ -35,7 +35,7 @@
 #define _VIRTIO_IO_H_

 #include <rte_common.h>
-#include "virtio_logs.h"
+#include "virtio_vfio_io.h"

 #if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686)

diff --git a/drivers/net/virtio/virtio_pci.c b/drivers/net/virtio/virtio_pci.c
index 064f234..71d4a07 100644
--- a/drivers/net/virtio/virtio_pci.c
+++ b/drivers/net/virtio/virtio_pci.c
@@ -37,10 +37,10 @@
  #include <fcntl.h>
 #endif

-#include "virtio_io.h"
 #include "virtio_pci.h"
 #include "virtio_logs.h"
 #include "virtqueue.h"
+#include "virtio_io.h"

 /*
  * Following macros are derieved from linux/pci_regs.h, however,
@@ -54,20 +54,104 @@
 #define VIRTIO_PCI_REG_ADDR(hw, reg) \
        (unsigned short)((hw)->io_base + (reg))

-#define VIRTIO_READ_REG_1(hw, reg) \
-       inb((VIRTIO_PCI_REG_ADDR((hw), (reg))))
-#define VIRTIO_WRITE_REG_1(hw, reg, value) \
-       outb_p((unsigned char)(value), (VIRTIO_PCI_REG_ADDR((hw), (reg))))
+static inline uint8_t
+virtio_read_reg_1(struct virtio_hw *hw, uint64_t reg_offset)
+{
+       uint8_t ret;
+       struct rte_pci_device *dev;
+
+       dev = hw->dev;
+       if (dev->kdrv == RTE_KDRV_VFIO)
+               vfio_inb(dev, reg_offset, &ret);
+       else
+               ret = inb(VIRTIO_PCI_REG_ADDR(hw, reg_offset));
+
+       return ret;
+}
+
+static inline uint16_t
+virtio_read_reg_2(struct virtio_hw *hw, uint64_t reg_offset)
+{
+       uint16_t ret;
+       struct rte_pci_device *dev;
+
+       dev = hw->dev;
+       if (dev->kdrv == RTE_KDRV_VFIO)
+               vfio_inw(dev, reg_offset, &ret);
+       else
+               ret = inw(VIRTIO_PCI_REG_ADDR(hw, reg_offset));
+
+       return ret;
+}
+
+static inline uint32_t
+virtio_read_reg_4(struct virtio_hw *hw, uint64_t reg_offset)
+{
+       uint32_t ret;
+       struct rte_pci_device *dev;
+
+       dev = hw->dev;
+       if (dev->kdrv == RTE_KDRV_VFIO)
+               vfio_inl(dev, reg_offset, &ret);
+       else
+               ret = inl(VIRTIO_PCI_REG_ADDR(hw, reg_offset));
+
+       return ret;
+}
+
+static inline void
+virtio_write_reg_1(struct virtio_hw *hw, uint64_t reg_offset, uint8_t value)
+{
+       struct rte_pci_device *dev;
+
+       dev = hw->dev;
+       if (dev->kdrv == RTE_KDRV_VFIO)
+               vfio_outb_p(dev, reg_offset, value);
+       else
+               outb_p((unsigned char)value,
+                      VIRTIO_PCI_REG_ADDR(hw, reg_offset));
+}
+
+static inline void
+virtio_write_reg_2(struct virtio_hw *hw, uint64_t reg_offset, uint16_t value)
+{
+       struct rte_pci_device *dev;
+
+       dev = hw->dev;
+       if (dev->kdrv == RTE_KDRV_VFIO)
+               vfio_outw_p(dev, reg_offset, value);
+       else
+               outw_p((unsigned short)value,
+                      VIRTIO_PCI_REG_ADDR(hw, reg_offset));
+}
+
+static inline void
+virtio_write_reg_4(struct virtio_hw *hw, uint64_t reg_offset, uint32_t value)
+{
+       struct rte_pci_device *dev;
+
+       dev = hw->dev;
+       if (dev->kdrv == RTE_KDRV_VFIO)
+               vfio_outl_p(dev, reg_offset, value);
+       else
+               outl_p((unsigned int)value,
+                      VIRTIO_PCI_REG_ADDR(hw, reg_offset));
+}
+
+#define VIRTIO_READ_REG_1(hw, reg)                                     \
+       virtio_read_reg_1((hw), (reg))
+#define VIRTIO_WRITE_REG_1(hw, reg, value)                             \
+       virtio_write_reg_1((hw), (reg), (value))

-#define VIRTIO_READ_REG_2(hw, reg) \
-       inw((VIRTIO_PCI_REG_ADDR((hw), (reg))))
-#define VIRTIO_WRITE_REG_2(hw, reg, value) \
-       outw_p((unsigned short)(value), (VIRTIO_PCI_REG_ADDR((hw), (reg))))
+#define VIRTIO_READ_REG_2(hw, reg)                                     \
+       virtio_read_reg_2((hw), (reg))
+#define VIRTIO_WRITE_REG_2(hw, reg, value)                             \
+       virtio_write_reg_2((hw), (reg), (value))

-#define VIRTIO_READ_REG_4(hw, reg) \
-       inl((VIRTIO_PCI_REG_ADDR((hw), (reg))))
-#define VIRTIO_WRITE_REG_4(hw, reg, value) \
-       outl_p((unsigned int)(value), (VIRTIO_PCI_REG_ADDR((hw), (reg))))
+#define VIRTIO_READ_REG_4(hw, reg)                                     \
+       virtio_read_reg_4((hw), (reg))
+#define VIRTIO_WRITE_REG_4(hw, reg, value)                             \
+       virtio_write_reg_4((hw), (reg), (value))

 static void
 legacy_read_dev_config(struct virtio_hw *hw, uint64_t offset,
-- 
1.7.9.5

Reply via email to