From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr0-f193.google.com (mail-wr0-f193.google.com [209.85.128.193]) by dpdk.org (Postfix) with ESMTP id 8E49A1B343 for ; Sun, 11 Feb 2018 13:49:28 +0100 (CET) Received: by mail-wr0-f193.google.com with SMTP id w50so12562198wrc.2 for ; Sun, 11 Feb 2018 04:49:28 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=6Xedch5OC8BW9kmd7V8CoKNjvCONMMb83pnz/4qMFCQ=; b=iTrZmP8G2IA4npy6qYXJA5E7XZxL7uVY4U3DsVbauKYr2RIwlkvArCTgqk0C3wDBrq 2AQClch/ufKo/BY6yOVBnLkJoZtol/QUehD5qlV37YqW2pcNV7H9svR2QjdPxAI9yRHx Qd7eNrKApD+h1GwFYSQxfJIqYhJE4KScI/R2Id0ZOBbZsR33D9Fel24NJMZhyEMtPRXk loxuqIbV4onDP7oBpMsTOS9LpIzhGshu1BeB6h9sWedYz37yzuXb4iiGsFp4/vTOp6nf CA9zr53iYu/jqj+sTFOliPlwHrzSX1J1EFqHQ8QHD4M0xIlpbCsgrswfJ/FKupxW/PSc 2B+Q== X-Gm-Message-State: APf1xPBm8n0WjWjH5IFoEAtvZ1f7fI/7b8hUC0Iy3AwfVAfBz2RaIxIk LPFbsUVkYQCzQIIfBre8mR0= X-Google-Smtp-Source: AH8x2273m+ECxYDTbisbd34m9BodGmpLyV0M1lYsxh655QYrGb9cV4V6MUr6x5SzrFNeD7zyimhBpA== X-Received: by 10.223.166.119 with SMTP id k110mr7039159wrc.24.1518353368238; Sun, 11 Feb 2018 04:49:28 -0800 (PST) Received: from localhost ([2a00:23c5:bef3:400:9531:588b:44ae:bec4]) by smtp.gmail.com with ESMTPSA id o82sm2846235wmo.30.2018.02.11.04.49.27 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 11 Feb 2018 04:49:27 -0800 (PST) From: Luca Boccassi To: Gowrishankar Muthukrishnan Cc: Anatoly Burakov , Chao Zhu , dpdk stable Date: Sun, 11 Feb 2018 12:49:08 +0000 Message-Id: <20180211124911.14557-1-bluca@debian.org> X-Mailer: git-send-email 2.14.2 In-Reply-To: <20180209104031.23195-2-bluca@debian.org> References: <20180209104031.23195-2-bluca@debian.org> Subject: [dpdk-stable] patch 'eal/ppc: support sPAPR IOMMU for vfio-pci' has been queued to LTS release 16.11.5 X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 11 Feb 2018 12:49:28 -0000 Hi, FYI, your patch has been queued to LTS release 16.11.5 Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet. It will be pushed if I get no objections before 02/13/18. So please shout if anyone has objections. Thanks. Luca Boccassi --- >>From d9ceb5272b33254683435b11771a90089fc721be Mon Sep 17 00:00:00 2001 From: Gowrishankar Muthukrishnan Date: Mon, 6 Mar 2017 20:34:15 +0530 Subject: [PATCH] eal/ppc: support sPAPR IOMMU for vfio-pci [ backported from upstream commit 0fe9830b53452a6747cae9ff1a6bfc737b839a9d ] Below changes adds pci probing support for vfio-pci devices in power8. Signed-off-by: Gowrishankar Muthukrishnan Acked-by: Anatoly Burakov Acked-by: Chao Zhu --- lib/librte_eal/linuxapp/eal/eal_vfio.c | 90 ++++++++++++++++++++++++++++++++++ lib/librte_eal/linuxapp/eal/eal_vfio.h | 25 ++++++++++ 2 files changed, 115 insertions(+) diff --git a/lib/librte_eal/linuxapp/eal/eal_vfio.c b/lib/librte_eal/linuxapp/eal/eal_vfio.c index 7ea20f3e2..dd451071d 100644 --- a/lib/librte_eal/linuxapp/eal/eal_vfio.c +++ b/lib/librte_eal/linuxapp/eal/eal_vfio.c @@ -50,12 +50,15 @@ static struct vfio_config vfio_cfg; static int vfio_type1_dma_map(int); +static int vfio_spapr_dma_map(int); static int vfio_noiommu_dma_map(int); /* IOMMU types we support */ static const struct vfio_iommu_type iommu_types[] = { /* x86 IOMMU, otherwise known as type 1 */ { RTE_VFIO_TYPE1, "Type 1", &vfio_type1_dma_map}, + /* ppc64 IOMMU, otherwise known as spapr */ + { RTE_VFIO_SPAPR, "sPAPR", &vfio_spapr_dma_map}, /* IOMMU-less mode */ { RTE_VFIO_NOIOMMU, "No-IOMMU", &vfio_noiommu_dma_map}, }; @@ -539,6 +542,93 @@ vfio_type1_dma_map(int vfio_container_fd) return 0; } +static int +vfio_spapr_dma_map(int vfio_container_fd) +{ + const struct rte_memseg *ms = rte_eal_get_physmem_layout(); + int i, ret; + + struct vfio_iommu_spapr_register_memory reg = { + .argsz = sizeof(reg), + .flags = 0 + }; + struct vfio_iommu_spapr_tce_info info = { + .argsz = sizeof(info), + }; + struct vfio_iommu_spapr_tce_create create = { + .argsz = sizeof(create), + }; + struct vfio_iommu_spapr_tce_remove remove = { + .argsz = sizeof(remove), + }; + + /* query spapr iommu info */ + ret = ioctl(vfio_container_fd, VFIO_IOMMU_SPAPR_TCE_GET_INFO, &info); + if (ret) { + RTE_LOG(ERR, EAL, " cannot get iommu info, " + "error %i (%s)\n", errno, strerror(errno)); + return -1; + } + + /* remove default DMA of 32 bit window */ + remove.start_addr = info.dma32_window_start; + ret = ioctl(vfio_container_fd, VFIO_IOMMU_SPAPR_TCE_REMOVE, &remove); + if (ret) { + RTE_LOG(ERR, EAL, " cannot remove default DMA window, " + "error %i (%s)\n", errno, strerror(errno)); + return -1; + } + + /* calculate window size based on number of hugepages configured */ + create.window_size = rte_eal_get_physmem_size(); + create.page_shift = __builtin_ctzll(ms->hugepage_sz); + create.levels = 2; + + ret = ioctl(vfio_container_fd, VFIO_IOMMU_SPAPR_TCE_CREATE, &create); + if (ret) { + RTE_LOG(ERR, EAL, " cannot create new DMA window, " + "error %i (%s)\n", errno, strerror(errno)); + return -1; + } + + /* map all DPDK segments for DMA. use 1:1 PA to IOVA mapping */ + for (i = 0; i < RTE_MAX_MEMSEG; i++) { + struct vfio_iommu_type1_dma_map dma_map; + + if (ms[i].addr == NULL) + break; + + reg.vaddr = (uintptr_t) ms[i].addr; + reg.size = ms[i].len; + ret = ioctl(vfio_container_fd, + VFIO_IOMMU_SPAPR_REGISTER_MEMORY, ®); + if (ret) { + RTE_LOG(ERR, EAL, " cannot register vaddr for IOMMU, " + "error %i (%s)\n", errno, strerror(errno)); + return -1; + } + + memset(&dma_map, 0, sizeof(dma_map)); + dma_map.argsz = sizeof(struct vfio_iommu_type1_dma_map); + dma_map.vaddr = ms[i].addr_64; + dma_map.size = ms[i].len; + dma_map.iova = ms[i].phys_addr; + dma_map.flags = VFIO_DMA_MAP_FLAG_READ | + VFIO_DMA_MAP_FLAG_WRITE; + + ret = ioctl(vfio_container_fd, VFIO_IOMMU_MAP_DMA, &dma_map); + + if (ret) { + RTE_LOG(ERR, EAL, " cannot set up DMA remapping, " + "error %i (%s)\n", errno, strerror(errno)); + return -1; + } + + } + + return 0; +} + static int vfio_noiommu_dma_map(int __rte_unused vfio_container_fd) { diff --git a/lib/librte_eal/linuxapp/eal/eal_vfio.h b/lib/librte_eal/linuxapp/eal/eal_vfio.h index 29f7f3eca..ac31a4fc1 100644 --- a/lib/librte_eal/linuxapp/eal/eal_vfio.h +++ b/lib/librte_eal/linuxapp/eal/eal_vfio.h @@ -54,6 +54,31 @@ #define RTE_VFIO_TYPE1 VFIO_TYPE1_IOMMU +#ifndef VFIO_SPAPR_TCE_v2_IOMMU +#define RTE_VFIO_SPAPR 7 +#define VFIO_IOMMU_SPAPR_REGISTER_MEMORY _IO(VFIO_TYPE, VFIO_BASE + 17) +#define VFIO_IOMMU_SPAPR_TCE_CREATE _IO(VFIO_TYPE, VFIO_BASE + 19) +#define VFIO_IOMMU_SPAPR_TCE_REMOVE _IO(VFIO_TYPE, VFIO_BASE + 20) +struct vfio_iommu_spapr_register_memory { + uint32_t argsz; + uint32_t flags; + uint64_t vaddr; + uint64_t size; +}; +struct vfio_iommu_spapr_tce_create { + uint32_t argsz; + uint32_t page_shift; + uint64_t window_size; + uint32_t levels; +}; +struct vfio_iommu_spapr_tce_remove { + uint32_t argsz; + uint64_t start_addr; +}; +#else +#define RTE_VFIO_SPAPR VFIO_SPAPR_TCE_v2_IOMMU +#endif + #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0) #define RTE_VFIO_NOIOMMU 8 #else -- 2.14.2