From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pf0-f169.google.com (mail-pf0-f169.google.com [209.85.192.169]) by dpdk.org (Postfix) with ESMTP id 472ED91AA for ; Thu, 14 Jan 2016 14:29:12 +0100 (CET) Received: by mail-pf0-f169.google.com with SMTP id q63so102921878pfb.1 for ; Thu, 14 Jan 2016 05:29:12 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mvista-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=jTlsrXGUmGQFykZJIMVlEjnmQpMoPw5Kxa68ipEk1pM=; b=QCorTrtlEDMc/ZipDE9jI8nWy+SiemBngxbkUQ0tw9OJk/zhzDkr1+UQhZ9sHjXYmI Y1hHo/qDUOTtlRIN5J0A4zZG0cGpSzKYDu1XZ+X+tuljILVRT5H+joeANGr28H8VAuKa gCx48XMQUdWIg8okTXlGN5YOc5irVXFr3XBItffPU1xX7cqFj680uk22Qk7xkuUa5M5b GdgFdfo5/HcEBRFxmXAD8yo59rMHNQnn0wciNkzid1uGEH7QcxaEiKNBTQnMJYghhrH3 6Xjvu6mWSkPce/olUUNquwSul7gRfzmxriWl/0jfJHB2qhqxhP5XGEABhNl+XwZ0u1h/ Y1tA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=jTlsrXGUmGQFykZJIMVlEjnmQpMoPw5Kxa68ipEk1pM=; b=ZtIvySamdEl1jVbDPWo/EKAyVZ6p3xcERJShqLiovVbEESqi8S2GE0aYKs/AbMD3eT ntUsEv7B5SPLoxC8bje6pnYmGXkedn9is+dhERbdaIKMrx+I4TDxm9famIB9JjEYx3x6 SOtMoJiZ1lovAW/hX4WLPSjsbdP6tVp7Cg1MTal0oCEbUM8uqbErMl+6dHpYf30dwpap 0h/swTG8cewiheSi/q5QsYPllFeG6oZm/WJtm3fijc0CWp5S9PQ1vcG3Us89k3Kn2FEr MKkQ7xUYx0poAkVy23p7AOC6l55APkowZdNzrDl8zrfoa03dhoPA4uz2Y3BGiyUQVz54 Z7bw== X-Gm-Message-State: ALoCoQmj6meuvbg+T7kl4c5fbNq7fp0Pp9kauhAJB7RGBb8I70WZDOrHm4YQLwunJ5MnZqzXywy4bzSCgxAfKzfY/eYhJP3Lgg== X-Received: by 10.98.13.195 with SMTP id 64mr5906389pfn.164.1452778151675; Thu, 14 Jan 2016 05:29:11 -0800 (PST) Received: from santosh-Latitude-E5530-non-vPro.mvista.com ([111.93.218.67]) by smtp.gmail.com with ESMTPSA id v71sm9438472pfi.91.2016.01.14.05.29.08 (version=TLS1_1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 14 Jan 2016 05:29:10 -0800 (PST) From: Santosh Shukla To: dev@dpdk.org Date: Thu, 14 Jan 2016 18:58:31 +0530 Message-Id: <1452778117-30178-9-git-send-email-sshukla@mvista.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1452778117-30178-1-git-send-email-sshukla@mvista.com> References: <1452778117-30178-1-git-send-email-sshukla@mvista.com> Subject: [dpdk-dev] [PATCH v4 08/14] virtio: pci: extend virtio pci rw api for vfio interface X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 14 Jan 2016 13:29:12 -0000 So far virtio handle rw access for uio / ioport interface, This patch to extend the support for vfio interface. For that introducing private struct virtio_vfio_dev{ - is_vfio - pci_dev }; Signed-off-by: Santosh Shukla --- v3->v4: - Removed #indef RTE_EAL_VFIO and made it arch agnostic such now virtio_pci rd/wr api to handle both vfio and ig_uio/ioport interfaces, depending upon is_vfio flags set or unset. - Tested for x86 for igb_uio and vfio interface, also tested for arm64 for vfio interface. drivers/net/virtio/virtio_pci.h | 84 ++++++++++++++++++++++++++++++++------- 1 file changed, 70 insertions(+), 14 deletions(-) diff --git a/drivers/net/virtio/virtio_pci.h b/drivers/net/virtio/virtio_pci.h index 8b5b031..8526c07 100644 --- a/drivers/net/virtio/virtio_pci.h +++ b/drivers/net/virtio/virtio_pci.h @@ -46,6 +46,8 @@ #endif #include +#include +#include "virtio_vfio_rw.h" struct virtqueue; @@ -165,6 +167,14 @@ struct virtqueue; */ #define VIRTIO_MAX_VIRTQUEUES 8 +/* For vfio only */ +struct virtio_vfio_dev { + bool is_vfio; /* True: vfio i/f, + * False: not a vfio i/f + */ + struct rte_pci_device *pci_dev; /* vfio dev */ +}; + struct virtio_hw { struct virtqueue *cvq; uint32_t io_base; @@ -176,6 +186,7 @@ struct virtio_hw { uint8_t use_msix; uint8_t started; uint8_t mac_addr[ETHER_ADDR_LEN]; + struct virtio_vfio_dev dev; }; /* @@ -231,20 +242,65 @@ outl_p(unsigned int data, unsigned int port) #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)))) - -#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_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_1(hw, reg) \ +({ \ + uint8_t ret; \ + struct virtio_vfio_dev *vdev; \ + (vdev) = (&(hw)->dev); \ + (((vdev)->is_vfio) ? \ + (ioport_inb(((vdev)->pci_dev), reg, &ret)) : \ + ((ret) = (inb((VIRTIO_PCI_REG_ADDR((hw), (reg))))))); \ + ret; \ +}) + +#define VIRTIO_WRITE_REG_1(hw, reg, value) \ +({ \ + struct virtio_vfio_dev *vdev; \ + (vdev) = (&(hw)->dev); \ + (((vdev)->is_vfio) ? \ + (ioport_outb_p(((vdev)->pci_dev), reg, (uint8_t)(value))) : \ + (outb_p((unsigned char)(value), (VIRTIO_PCI_REG_ADDR((hw), (reg)))))); \ +}) + +#define VIRTIO_READ_REG_2(hw, reg) \ +({ \ + uint16_t ret; \ + struct virtio_vfio_dev *vdev; \ + (vdev) = (&(hw)->dev); \ + (((vdev)->is_vfio) ? \ + (ioport_inw(((vdev)->pci_dev), reg, &ret)) : \ + ((ret) = (inw((VIRTIO_PCI_REG_ADDR((hw), (reg))))))); \ + ret; \ +}) + +#define VIRTIO_WRITE_REG_2(hw, reg, value) \ +({ \ + struct virtio_vfio_dev *vdev; \ + (vdev) = (&(hw)->dev); \ + (((vdev)->is_vfio) ? \ + (ioport_outw_p(((vdev)->pci_dev), reg, (uint16_t)(value))) : \ + (outw_p((unsigned short)(value), (VIRTIO_PCI_REG_ADDR((hw), (reg)))))); \ +}) + +#define VIRTIO_READ_REG_4(hw, reg) \ +({ \ + uint32_t ret; \ + struct virtio_vfio_dev *vdev; \ + (vdev) = (&(hw)->dev); \ + (((vdev)->is_vfio) ? \ + (ioport_inl(((vdev)->pci_dev), reg, &ret)) : \ + ((ret) = (inl((VIRTIO_PCI_REG_ADDR((hw), (reg))))))); \ + ret; \ +}) + +#define VIRTIO_WRITE_REG_4(hw, reg, value) \ +({ \ + struct virtio_vfio_dev *vdev; \ + (vdev) = (&(hw)->dev); \ + (((vdev)->is_vfio) ? \ + (ioport_outl_p(((vdev)->pci_dev), reg, (uint32_t)(value))) : \ + (outl_p((unsigned int)(value), (VIRTIO_PCI_REG_ADDR((hw), (reg)))))); \ +}) static inline int vtpci_with_feature(struct virtio_hw *hw, uint32_t bit) -- 1.7.9.5