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