Lines Matching full:device

27 static void vfio_pci_irq_set(struct vfio_pci_device *device,  in vfio_pci_irq_set()  argument
47 ioctl_assert(device->fd, VFIO_DEVICE_SET_IRQS, irq); in vfio_pci_irq_set()
50 void vfio_pci_irq_trigger(struct vfio_pci_device *device, u32 index, u32 vector) in vfio_pci_irq_trigger() argument
60 ioctl_assert(device->fd, VFIO_DEVICE_SET_IRQS, &irq); in vfio_pci_irq_trigger()
71 void vfio_pci_irq_enable(struct vfio_pci_device *device, u32 index, u32 vector, in vfio_pci_irq_enable() argument
79 VFIO_ASSERT_LT(device->msi_eventfds[i], 0); in vfio_pci_irq_enable()
80 device->msi_eventfds[i] = eventfd(0, 0); in vfio_pci_irq_enable()
81 VFIO_ASSERT_GE(device->msi_eventfds[i], 0); in vfio_pci_irq_enable()
84 vfio_pci_irq_set(device, index, vector, count, device->msi_eventfds + vector); in vfio_pci_irq_enable()
87 void vfio_pci_irq_disable(struct vfio_pci_device *device, u32 index) in vfio_pci_irq_disable() argument
93 for (i = 0; i < ARRAY_SIZE(device->msi_eventfds); i++) { in vfio_pci_irq_disable()
94 if (device->msi_eventfds[i] < 0) in vfio_pci_irq_disable()
97 VFIO_ASSERT_EQ(close(device->msi_eventfds[i]), 0); in vfio_pci_irq_disable()
98 device->msi_eventfds[i] = -1; in vfio_pci_irq_disable()
101 vfio_pci_irq_set(device, index, 0, 0, NULL); in vfio_pci_irq_disable()
104 static void vfio_pci_irq_get(struct vfio_pci_device *device, u32 index, in vfio_pci_irq_get() argument
110 ioctl_assert(device->fd, VFIO_DEVICE_GET_IRQ_INFO, irq_info); in vfio_pci_irq_get()
113 static void vfio_pci_region_get(struct vfio_pci_device *device, int index, in vfio_pci_region_get() argument
121 ioctl_assert(device->fd, VFIO_DEVICE_GET_REGION_INFO, info); in vfio_pci_region_get()
124 static void vfio_pci_bar_map(struct vfio_pci_device *device, int index) in vfio_pci_bar_map() argument
126 struct vfio_pci_bar *bar = &device->bars[index]; in vfio_pci_bar_map()
139 device->fd, bar->info.offset); in vfio_pci_bar_map()
143 static void vfio_pci_bar_unmap(struct vfio_pci_device *device, int index) in vfio_pci_bar_unmap() argument
145 struct vfio_pci_bar *bar = &device->bars[index]; in vfio_pci_bar_unmap()
154 static void vfio_pci_bar_unmap_all(struct vfio_pci_device *device) in vfio_pci_bar_unmap_all() argument
159 if (device->bars[i].vaddr) in vfio_pci_bar_unmap_all()
160 vfio_pci_bar_unmap(device, i); in vfio_pci_bar_unmap_all()
164 void vfio_pci_config_access(struct vfio_pci_device *device, bool write, in vfio_pci_config_access() argument
167 struct vfio_region_info *config_space = &device->config_space; in vfio_pci_config_access()
171 ret = pwrite(device->fd, data, size, config_space->offset + config); in vfio_pci_config_access()
173 ret = pread(device->fd, data, size, config_space->offset + config); in vfio_pci_config_access()
179 void vfio_pci_device_reset(struct vfio_pci_device *device) in vfio_pci_device_reset() argument
181 ioctl_assert(device->fd, VFIO_DEVICE_RESET, NULL); in vfio_pci_device_reset()
194 VFIO_ASSERT_NE(ret, -1, "Failed to get the IOMMU group for device: %s\n", bdf); in vfio_pci_get_group_from_dev()
197 VFIO_ASSERT_EQ(ret, 1, "Failed to get the IOMMU group for device: %s\n", bdf); in vfio_pci_get_group_from_dev()
202 static void vfio_pci_group_setup(struct vfio_pci_device *device, const char *bdf) in vfio_pci_group_setup() argument
213 device->group_fd = open(group_path, O_RDWR); in vfio_pci_group_setup()
214 VFIO_ASSERT_GE(device->group_fd, 0, "open(%s) failed\n", group_path); in vfio_pci_group_setup()
216 ioctl_assert(device->group_fd, VFIO_GROUP_GET_STATUS, &group_status); in vfio_pci_group_setup()
219 ioctl_assert(device->group_fd, VFIO_GROUP_SET_CONTAINER, &device->iommu->container_fd); in vfio_pci_group_setup()
222 static void vfio_pci_container_setup(struct vfio_pci_device *device, const char *bdf) in vfio_pci_container_setup() argument
224 struct iommu *iommu = device->iommu; in vfio_pci_container_setup()
228 vfio_pci_group_setup(device, bdf); in vfio_pci_container_setup()
240 device->fd = ioctl(device->group_fd, VFIO_GROUP_GET_DEVICE_FD, bdf); in vfio_pci_container_setup()
241 VFIO_ASSERT_GE(device->fd, 0); in vfio_pci_container_setup()
244 static void vfio_pci_device_setup(struct vfio_pci_device *device) in vfio_pci_device_setup() argument
248 device->info.argsz = sizeof(device->info); in vfio_pci_device_setup()
249 ioctl_assert(device->fd, VFIO_DEVICE_GET_INFO, &device->info); in vfio_pci_device_setup()
251 vfio_pci_region_get(device, VFIO_PCI_CONFIG_REGION_INDEX, &device->config_space); in vfio_pci_device_setup()
254 VFIO_ASSERT_TRUE(!(device->config_space.flags & VFIO_REGION_INFO_FLAG_MMAP), in vfio_pci_device_setup()
258 struct vfio_pci_bar *bar = device->bars + i; in vfio_pci_device_setup()
260 vfio_pci_region_get(device, i, &bar->info); in vfio_pci_device_setup()
262 vfio_pci_bar_map(device, i); in vfio_pci_device_setup()
265 vfio_pci_irq_get(device, VFIO_PCI_MSI_IRQ_INDEX, &device->msi_info); in vfio_pci_device_setup()
266 vfio_pci_irq_get(device, VFIO_PCI_MSIX_IRQ_INDEX, &device->msix_info); in vfio_pci_device_setup()
268 for (i = 0; i < ARRAY_SIZE(device->msi_eventfds); i++) in vfio_pci_device_setup()
269 device->msi_eventfds[i] = -1; in vfio_pci_device_setup()
322 static void vfio_pci_iommufd_setup(struct vfio_pci_device *device, const char *bdf) in vfio_pci_iommufd_setup() argument
326 device->fd = open(cdev_path, O_RDWR); in vfio_pci_iommufd_setup()
327 VFIO_ASSERT_GE(device->fd, 0); in vfio_pci_iommufd_setup()
330 vfio_device_bind_iommufd(device->fd, device->iommu->iommufd); in vfio_pci_iommufd_setup()
331 vfio_device_attach_iommufd_pt(device->fd, device->iommu->ioas_id); in vfio_pci_iommufd_setup()
336 struct vfio_pci_device *device; in vfio_pci_device_init() local
338 device = calloc(1, sizeof(*device)); in vfio_pci_device_init()
339 VFIO_ASSERT_NOT_NULL(device); in vfio_pci_device_init()
342 device->iommu = iommu; in vfio_pci_device_init()
343 device->bdf = bdf; in vfio_pci_device_init()
346 vfio_pci_container_setup(device, bdf); in vfio_pci_device_init()
348 vfio_pci_iommufd_setup(device, bdf); in vfio_pci_device_init()
350 vfio_pci_device_setup(device); in vfio_pci_device_init()
351 vfio_pci_driver_probe(device); in vfio_pci_device_init()
353 return device; in vfio_pci_device_init()
356 void vfio_pci_device_cleanup(struct vfio_pci_device *device) in vfio_pci_device_cleanup() argument
360 if (device->driver.initialized) in vfio_pci_device_cleanup()
361 vfio_pci_driver_remove(device); in vfio_pci_device_cleanup()
363 vfio_pci_bar_unmap_all(device); in vfio_pci_device_cleanup()
365 VFIO_ASSERT_EQ(close(device->fd), 0); in vfio_pci_device_cleanup()
367 for (i = 0; i < ARRAY_SIZE(device->msi_eventfds); i++) { in vfio_pci_device_cleanup()
368 if (device->msi_eventfds[i] < 0) in vfio_pci_device_cleanup()
371 VFIO_ASSERT_EQ(close(device->msi_eventfds[i]), 0); in vfio_pci_device_cleanup()
374 if (device->group_fd) in vfio_pci_device_cleanup()
375 VFIO_ASSERT_EQ(close(device->group_fd), 0); in vfio_pci_device_cleanup()
377 free(device); in vfio_pci_device_cleanup()