struct drm_prime_handle prime_arg = {0, };
prime_arg.handle = gem;
+ prime_arg.flags = O_RDWR;
if (drmIoctl(fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &prime_arg)) {
TBM_BACKEND_ERR("fail to DRM_IOCTL_PRIME_HANDLE_TO_FD gem:%d (%m)", gem);
return -1;
}
static void *
-_mmap_gem(int fd, unsigned int gem, unsigned int size)
+_mmap_dmabuf(int dmabuf, unsigned int size)
{
- struct drm_mode_map_dumb map_arg = {0,};
void *map;
- map_arg.handle = gem;
- if (drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &map_arg)) {
- TBM_BACKEND_ERR("fail to DRM_IOCTL_MAP_DUMB gem:%d (%m)", gem);
- return NULL;
- }
-
map = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED,
- fd, map_arg.offset);
+ dmabuf, 0);
if (map == MAP_FAILED) {
- TBM_BACKEND_ERR("Cannot usrptr gem:%d size:%d", gem, size);
+ TBM_BACKEND_ERR("fail to mmap dmabuf:%d size:%d (%m)", dmabuf, size);
return NULL;
}
bo_handle.u32 = (uint32_t)bo_data->gem;
break;
case HAL_TBM_DEVICE_CPU:
+ if (!bo_data->dmabuf) {
+ bo_data->dmabuf = _get_dmabuf(bo_data->fd, bo_data->gem);
+ if (!bo_data->dmabuf) {
+ TBM_BACKEND_ERR("fail to get dmabuf from gem:%d", bo_data->gem);
+ return (hal_tbm_bo_handle) NULL;
+ }
+ }
+
if (!bo_data->pBase) {
- bo_data->pBase = _mmap_gem(bo_data->fd, bo_data->gem, bo_data->size);
+ bo_data->pBase = _mmap_dmabuf(bo_data->dmabuf, bo_data->size);
if (!bo_data->pBase) {
- TBM_BACKEND_ERR("fail to mmap gem:%d", bo_data->gem);
+ TBM_BACKEND_ERR("fail to mmap dmabuf:%d", bo_data->dmabuf);
return (hal_tbm_bo_handle) NULL;
}
}