30 #include <linux/vfio.h>
31 #include <sys/ioctl.h>
44 #define MEM_BUF_LEN (4 * 1024)
59 mmap(0,
resources->dma_mem.size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
60 if (
resources->dma_mem.mem == MAP_FAILED) {
76 struct vfio_iommu_type1_dma_map dma_map = {0};
77 dma_map.argsz =
sizeof(dma_map);
78 dma_map.vaddr = (uint64_t)
resources->dma_mem.mem;
81 dma_map.flags = VFIO_DMA_MAP_FLAG_READ | VFIO_DMA_MAP_FLAG_WRITE;
82 int status = ioctl(
resources->container_fd, VFIO_IOMMU_MAP_DMA, &dma_map);
84 DOCA_LOG_ERR(
"Failed to VFIO_IOMMU_MAP_DMA. Status=%d, errno=%d", status, errno);
100 struct vfio_iommu_type1_dma_unmap dma_unmap = {0};
101 dma_unmap.argsz =
sizeof(dma_unmap);
102 dma_unmap.iova = iova;
103 dma_unmap.size =
resources->dma_mem.size;
104 int status = ioctl(
resources->container_fd, VFIO_IOMMU_UNMAP_DMA, &dma_unmap);
106 DOCA_LOG_ERR(
"Failed to VFIO_IOMMU_UNMAP_DMA. Status=%d, errno=%d", status, errno);
123 uint64_t iova = 0x1000000;
169 DOCA_LOG_ERR(
"Failed to DMA unmap memory to container");
doca_error_t devemu_pci_device_dma_host(const char *pci_address, int vfio_group, const char *write_data)
static doca_error_t allocate_dma_mem(struct devemu_host_resources *resources, int len)
DOCA_LOG_REGISTER(DEVEMU_PCI_DEVICE_DMA_HOST)
static doca_error_t unmap_dma_mem(struct devemu_host_resources *resources, uint64_t iova)
static doca_error_t map_dma_mem(struct devemu_host_resources *resources, uint64_t iova)
void devemu_host_resources_cleanup(struct devemu_host_resources *resources)
doca_error_t init_vfio_device(struct devemu_host_resources *resources, int vfio_group, const char *pci_address)
struct rdma_resources resources
enum doca_error doca_error_t
DOCA API return codes.
#define DOCA_LOG_ERR(format,...)
Generates an ERROR application log message.
#define DOCA_LOG_INFO(format,...)
Generates an INFO application log message.