| #include "gem_msm.h" |
| #include "drm-uapi/msm_drm.h" |
| |
| #include "drm.h" |
| |
| static int gem_msm_mmap(void **ptr, int drm_fd, uint32_t gem_handle, size_t size) |
| { |
| struct drm_msm_gem_cpu_prep gem_prep = { |
| .handle = gem_handle, |
| .op = MSM_PREP_READ, |
| .timeout = { .tv_sec = 1, .tv_nsec = 0 } |
| }; |
| |
| if (drmIoctl(drm_fd, DRM_IOCTL_MSM_GEM_CPU_PREP, &gem_prep)) |
| { |
| return -1; |
| } |
| |
| struct drm_msm_gem_info gem_info = { |
| .handle = gem_handle, |
| .flags = 0, |
| .offset = 0 |
| }; |
| |
| if (drmIoctl(drm_fd, DRM_IOCTL_MSM_GEM_INFO, &gem_info)) |
| { |
| return -1; |
| } |
| |
| void *const k_addr = 0; |
| const int k_prot = PROT_READ | PROT_WRITE; |
| const int k_flags = MAP_SHARED; |
| |
| void *ret = mmap(k_addr, size, k_prot, k_flags, drm_fd, gem_info.offset); |
| |
| if (ret == MAP_FAILED) |
| { |
| return -1; |
| } |
| |
| *ptr = ret; |
| |
| return 0; |
| } |
| |
| static int gem_msm_munmap(int drm_fd, uint32_t gem_handle, void *ptr, size_t size) |
| { |
| if (munmap(ptr, size)) |
| { |
| return -1; |
| } |
| |
| struct drm_msm_gem_cpu_fini gem_fini = { |
| .handle = gem_handle |
| }; |
| |
| if (drmIoctl(drm_fd, DRM_IOCTL_MSM_GEM_CPU_FINI, &gem_fini)) |
| { |
| return -1; |
| } |
| |
| return 0; |
| } |
| |
| struct gem_driver gem_msm_driver = { |
| .mmap = gem_msm_mmap, |
| .munmap = gem_msm_munmap |
| }; |