| 15 | |
| 16 | #ifdef VFIO_PRESENT |
| 17 | static int |
| 18 | vfio_map_dev_obj(const char *path, const char *dev_obj, |
| 19 | uint32_t *size, void **addr, int *dev_fd) |
| 20 | { |
| 21 | int32_t ret; |
| 22 | struct vfio_group_status status = { .argsz = sizeof(status) }; |
| 23 | |
| 24 | struct vfio_device_info d_info = { .argsz = sizeof(d_info) }; |
| 25 | struct vfio_region_info reg_info = { .argsz = sizeof(reg_info) }; |
| 26 | |
| 27 | ret = rte_vfio_setup_device(path, dev_obj, dev_fd, &d_info); |
| 28 | if (ret) { |
| 29 | BCMFS_LOG(ERR, "VFIO Setting for device failed"); |
| 30 | return ret; |
| 31 | } |
| 32 | |
| 33 | /* getting device region info*/ |
| 34 | ret = ioctl(*dev_fd, VFIO_DEVICE_GET_REGION_INFO, ®_info); |
| 35 | if (ret < 0) { |
| 36 | BCMFS_LOG(ERR, "Error in VFIO getting REGION_INFO"); |
| 37 | goto map_failed; |
| 38 | } |
| 39 | |
| 40 | *addr = mmap(NULL, reg_info.size, |
| 41 | PROT_WRITE | PROT_READ, MAP_SHARED, |
| 42 | *dev_fd, reg_info.offset); |
| 43 | if (*addr == MAP_FAILED) { |
| 44 | BCMFS_LOG(ERR, "Error mapping region (errno = %d)", errno); |
| 45 | ret = errno; |
| 46 | goto map_failed; |
| 47 | } |
| 48 | *size = reg_info.size; |
| 49 | |
| 50 | return 0; |
| 51 | |
| 52 | map_failed: |
| 53 | rte_vfio_release_device(path, dev_obj, *dev_fd); |
| 54 | |
| 55 | return ret; |
| 56 | } |
| 57 | |
| 58 | int |
| 59 | bcmfs_attach_vfio(struct bcmfs_device *dev) |
no test coverage detected