From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pf0-f179.google.com (mail-pf0-f179.google.com [209.85.192.179]) by dpdk.org (Postfix) with ESMTP id 3E1588E92 for ; Thu, 14 Jan 2016 14:29:15 +0100 (CET) Received: by mail-pf0-f179.google.com with SMTP id n128so99905168pfn.3 for ; Thu, 14 Jan 2016 05:29:15 -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=qKEbfSkUlDhtartzT9ITDP8rIFYuDmlwmDkpKqI466Q=; b=d57RmqJzJsUuUCh4Saszlk0eAnWJMdGkubhsFpTbLOJUsP9+xiuUkuwaFHMSZoJ/tK 9L88slVUcQTQM7BVy+S9yeUlz2jh7grjEVY07m10Ne+Zo6oCapdvLypuOAZBS7xcOo4E XlNhpjr0TZu4YEjDPmlUrtVq6xXWNg7gcTSxLm6/sLbfL/9zIsRIZ12YywioWXGtIoCn aDaMBkuxaxqFG1lkwMD7BGt8HttpdYQuoT3lrdf4oMmQRPF+MfGVpS1Nxjj6UC7eqre+ uxYnpn60shfwZv9XTRsySsGTTV0LjHDVl1d2eRUKD1otkQ24lWCYQBMsIuy+vNv/a2pS ihSA== 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=qKEbfSkUlDhtartzT9ITDP8rIFYuDmlwmDkpKqI466Q=; b=awIzU5kFS7WBWMCQBuIoEcWN+Jbj5b0rBKNCz5XcGvKx1zY/6c7i/OzyWB5hoLpYKs 1BY2cxz4Xds8cvmgJ9mFykOVQnd4wNkR7bNUGi8JGgjfn6qZADxW7oZWQ8c3/Xf7n+br RGGhA5ai3VsFlz8d8nwoYh2h0mgNm95JWBbM7+BZRzVgrJj5uXa4xjZ53eQLIVmXm0qv I9jHz/dI93EaARJP59WTE6NS0o8Jyeur6jieAYVmdx6dEFYiT4C01b2mdsrFTqqI6VcA KBWBPYuA1+6D73BdYFZAe4XEmOVFXoq2mPcnX/4ZoAcvDVnYC7ApETAe90jVoY+MGKGE eMJg== X-Gm-Message-State: ALoCoQnmevtX2q0K7jBvRC28XIh4StKuyOhYt4sovkt5MHmRHHOehlIf0ucluZTJwKcVXBF3L7h8kC+jgVwLeXcovSB0XOYLeA== X-Received: by 10.98.79.4 with SMTP id d4mr5853263pfb.46.1452778154651; Thu, 14 Jan 2016 05:29:14 -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.11 (version=TLS1_1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 14 Jan 2016 05:29:13 -0800 (PST) From: Santosh Shukla To: dev@dpdk.org Date: Thu, 14 Jan 2016 18:58:32 +0530 Message-Id: <1452778117-30178-10-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 09/14] virtio: ethdev: check 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:15 -0000 Introducing api to check interface type is vfio or not, if interface is vfio then update struct virtio_vfio_dev {}. Those two apis are: - virtio_chk_for_vfio - virtio_hw_init_by_vfio Signed-off-by: Santosh Shukla --- v3->v4: - Removed RTE_PCI_DRV_NEED_MAPPING drv flag (as per Review comment from Stephen and Suggested by Yuan) - Introducing vfio interface parsing api which will set/unset is_vfio flag at runtime. drivers/net/virtio/virtio_ethdev.c | 112 +++++++++++++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 2 deletions(-) diff --git a/drivers/net/virtio/virtio_ethdev.c b/drivers/net/virtio/virtio_ethdev.c index d928339..8f2260f 100644 --- a/drivers/net/virtio/virtio_ethdev.c +++ b/drivers/net/virtio/virtio_ethdev.c @@ -1202,6 +1202,105 @@ static int virtio_resource_init(struct rte_pci_device *pci_dev) return virtio_resource_init_by_ioports(pci_dev); } +static int virtio_chk_for_vfio(struct rte_pci_device *pci_dev) +{ + /* + * 1. check whether vfio-noiommu mode is enabled + * 2. verify pci device attached to vfio-noiommu driver + * root@arm64:/sys/bus/pci/drivers/vfio-pci/0000:00:01.0/iommu_group# + * > cat name + * > vfio-noiommu + */ + + /* 1. Chk for vfio: noiommu mode set or not in kernel driver */ + struct rte_pci_addr *loc; + FILE *fp; + const char *path = "/sys/module/vfio/parameters/enable_unsafe_noiommu_mode"; + char filename[PATH_MAX] = {0}; + char buf[PATH_MAX] = {0}; + + fp = fopen(path, "r"); + if (fp == NULL) { + PMD_INIT_LOG(ERR, "can't open %s\n", path); + return -1; + } + + if (fread(buf, sizeof(char), 1, fp) != 1) { + PMD_INIT_LOG(ERR, "can't read from file %s\n", path); + fclose(fp); + return -1; + } + + if (strncmp(buf, "Y", 1) != 0) { + PMD_INIT_LOG(ERR, "[%s]: vfio: noiommu mode not set\n", path); + fclose(fp); + return -1; + } + + fclose(fp); + + /* 2. Verify pci device attached to vfio-noiommu driver */ + + /* 2.1 chk whether attached driver is vfio-noiommu or not */ + loc = &pci_dev->addr; + snprintf(filename, sizeof(filename), + SYSFS_PCI_DEVICES "/" PCI_PRI_FMT "/iommu_group/name", + loc->domain, loc->bus, loc->devid, loc->function); + + /* check for vfio-noiommu */ + fp = fopen(filename, "r"); + if (fp == NULL) { + PMD_INIT_LOG(ERR, "can't open %s\n", filename); + return -1; + } + + if (fread(buf, sizeof(char), sizeof("vfio-noiommu"), fp) != + sizeof("vfio-noiommu")) { + PMD_INIT_LOG(ERR, "can't read from file %s\n", filename); + fclose(fp); + return -1; + } + + if (strncmp(buf, "vfio-noiommu", strlen("vfio-noiommu")) != 0) { + PMD_INIT_LOG(ERR, "not a vfio-noiommu driver\n"); + fclose(fp); + return -1; + } + + fclose(fp); + + /* todo: vfio interrupt handling */ + return 0; +} + +/* Init virtio by vfio-way */ +static int virtio_hw_init_by_vfio(struct virtio_hw *hw, + struct rte_pci_device *pci_dev) +{ + struct virtio_vfio_dev *vdev; + + vdev = &hw->dev; + if (virtio_chk_for_vfio(pci_dev) < 0) { + vdev->is_vfio = false; + vdev->pci_dev = NULL; + return -1; + } + + /* .. So attached interface is vfio */ + vdev->is_vfio = true; + vdev->pci_dev = pci_dev; + + /* For debug use only */ + const struct rte_intr_handle *intr_handle; + RTE_SET_USED(intr_handle); /* to keep compilar happy */ + intr_handle = &pci_dev->intr_handle; + PMD_INIT_LOG(DEBUG, "vdev->pci_dev %p intr_handle %p vfio_dev_fd %d\n", + vdev->pci_dev, intr_handle, + intr_handle->vfio_dev_fd); + + return 0; +} + #else static int virtio_has_msix(const struct rte_pci_addr *loc __rte_unused) @@ -1215,6 +1314,13 @@ static int virtio_resource_init(struct rte_pci_device *pci_dev __rte_unused) /* no setup required */ return 0; } + +static int virtio_hw_init_by_vfio(struct virtio_hw *hw __rte_unused, + struct rte_pci_device *pci_dev __rte_unused) +{ + /* NA */ + return 0; +} #endif /* @@ -1287,8 +1393,10 @@ eth_virtio_dev_init(struct rte_eth_dev *eth_dev) pci_dev = eth_dev->pci_dev; - if (virtio_resource_init(pci_dev) < 0) - return -1; + if (virtio_hw_init_by_vfio(hw, pci_dev) < 0) { + if (virtio_resource_init(pci_dev) < 0) + return -1; + } hw->use_msix = virtio_has_msix(&pci_dev->addr); hw->io_base = (uint32_t)(uintptr_t)pci_dev->mem_resource[0].addr; -- 1.7.9.5