vfio: move common code out of PCI file
We make the iommu_types public temporarily here until the depending stuff is refactored. The iommu_types and dma_map functions will be changed to be private inside the eal_vfio module later. Signed-off-by: Jan Viktorin <viktorin@rehivetech.com>
This commit is contained in:
parent
c2b4064dd8
commit
cc8809fe10
@ -66,6 +66,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_xen_memory.c
|
||||
endif
|
||||
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_thread.c
|
||||
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_log.c
|
||||
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_vfio.c
|
||||
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_pci.c
|
||||
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_pci_uio.c
|
||||
SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_pci_vfio.c
|
||||
|
@ -72,68 +72,6 @@ EAL_REGISTER_TAILQ(rte_vfio_tailq)
|
||||
/* per-process VFIO config */
|
||||
static struct vfio_config vfio_cfg;
|
||||
|
||||
/* DMA mapping function prototype.
|
||||
* Takes VFIO container fd as a parameter.
|
||||
* Returns 0 on success, -1 on error.
|
||||
* */
|
||||
typedef int (*vfio_dma_func_t)(int);
|
||||
|
||||
struct vfio_iommu_type {
|
||||
int type_id;
|
||||
const char *name;
|
||||
vfio_dma_func_t dma_map_func;
|
||||
};
|
||||
|
||||
static int vfio_type1_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},
|
||||
/* IOMMU-less mode */
|
||||
{ RTE_VFIO_NOIOMMU, "No-IOMMU", &vfio_noiommu_dma_map},
|
||||
};
|
||||
|
||||
int
|
||||
vfio_type1_dma_map(int vfio_container_fd)
|
||||
{
|
||||
const struct rte_memseg *ms = rte_eal_get_physmem_layout();
|
||||
int i, ret;
|
||||
|
||||
/* 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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
int
|
||||
vfio_noiommu_dma_map(int __rte_unused vfio_container_fd)
|
||||
{
|
||||
/* No-IOMMU mode does not need DMA mapping */
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
pci_vfio_read_config(const struct rte_intr_handle *intr_handle,
|
||||
void *buf, size_t len, off_t offs)
|
||||
|
79
lib/librte_eal/linuxapp/eal/eal_vfio.c
Normal file
79
lib/librte_eal/linuxapp/eal/eal_vfio.c
Normal file
@ -0,0 +1,79 @@
|
||||
/*-
|
||||
* BSD LICENSE
|
||||
*
|
||||
* Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* * Neither the name of Intel Corporation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
#include <rte_log.h>
|
||||
#include <rte_memory.h>
|
||||
|
||||
#include "eal_vfio.h"
|
||||
|
||||
int
|
||||
vfio_type1_dma_map(int vfio_container_fd)
|
||||
{
|
||||
const struct rte_memseg *ms = rte_eal_get_physmem_layout();
|
||||
int i, ret;
|
||||
|
||||
/* 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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
int
|
||||
vfio_noiommu_dma_map(int __rte_unused vfio_container_fd)
|
||||
{
|
||||
/* No-IOMMU mode does not need DMA mapping */
|
||||
return 0;
|
||||
}
|
@ -95,6 +95,29 @@ struct vfio_config {
|
||||
#define VFIO_GET_REGION_ADDR(x) ((uint64_t) x << 40ULL)
|
||||
#define VFIO_GET_REGION_IDX(x) (x >> 40)
|
||||
|
||||
/* DMA mapping function prototype.
|
||||
* Takes VFIO container fd as a parameter.
|
||||
* Returns 0 on success, -1 on error.
|
||||
* */
|
||||
typedef int (*vfio_dma_func_t)(int);
|
||||
|
||||
struct vfio_iommu_type {
|
||||
int type_id;
|
||||
const char *name;
|
||||
vfio_dma_func_t dma_map_func;
|
||||
};
|
||||
|
||||
int vfio_type1_dma_map(int);
|
||||
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},
|
||||
/* IOMMU-less mode */
|
||||
{ RTE_VFIO_NOIOMMU, "No-IOMMU", &vfio_noiommu_dma_map},
|
||||
};
|
||||
|
||||
#define SOCKET_REQ_CONTAINER 0x100
|
||||
#define SOCKET_REQ_GROUP 0x200
|
||||
#define SOCKET_OK 0x0
|
||||
|
Loading…
Reference in New Issue
Block a user