static void *
tbm_sprd_bo_import(tbm_bo bo, unsigned int key)
{
- SPRD_RETURN_VAL_IF_FAIL(bo != NULL, 0);
+ SPRD_RETURN_VAL_IF_FAIL(bo != NULL, NULL);
tbm_bufmgr_sprd bufmgr_sprd;
tbm_bo_sprd bo_sprd;
int ret;
bufmgr_sprd = (tbm_bufmgr_sprd)tbm_backend_get_bufmgr_priv(bo);
- SPRD_RETURN_VAL_IF_FAIL(bufmgr_sprd != NULL, 0);
+ SPRD_RETURN_VAL_IF_FAIL(bufmgr_sprd != NULL, NULL);
ret = drmHashLookup(bufmgr_sprd->hashBos, key, (void **)&privGem);
if (ret == 0)
return privGem->bo_priv;
- struct drm_gem_open arg = {0, };
struct drm_sprd_gem_info info = {0, };
+ struct drm_gem_open arg = {0, };
arg.name = key;
if (drmIoctl(bufmgr_sprd->fd, DRM_IOCTL_GEM_OPEN, &arg)) {
TBM_SPRD_LOG("[libtbm-sprd:%d] "
"error %s:%d Cannot open gem name=%d\n",
getpid(), __FUNCTION__, __LINE__, key);
- return 0;
+ return NULL;
}
info.handle = arg.handle;
TBM_SPRD_LOG("[libtbm-sprd:%d] "
"error %s:%d Cannot get gem info=%d\n",
getpid(), __FUNCTION__, __LINE__, key);
- return 0;
+ goto fail_get_gem;
}
bo_sprd = calloc(1, sizeof(struct _tbm_bo_sprd));
TBM_SPRD_LOG("[libtbm-sprd:%d] "
"error %s:%d fail to allocate the bo private\n",
getpid(), __FUNCTION__, __LINE__);
- return 0;
+ goto fail_alloc_bo;
}
bo_sprd->fd = bufmgr_sprd->fd;
if (!_bo_init_cache_state(bufmgr_sprd, bo_sprd, 1)) {
TBM_SPRD_LOG("error fail init cache state(%d)\n", bo_sprd->name);
- free(bo_sprd);
- return 0;
+ goto fail_init_cache;
}
if (!bo_sprd->dmabuf) {
TBM_SPRD_LOG("[libtbm-sprd:%d] "
"error %s:%d Cannot dmabuf=%d\n",
getpid(), __FUNCTION__, __LINE__, bo_sprd->gem);
- free(bo_sprd);
- return 0;
+ goto fail_prime_handle_to_fd;
}
bo_sprd->dmabuf = arg.fd;
}
/* add bo to hash */
privGem = calloc(1, sizeof(PrivGem));
+ if (!privGem) {
+ TBM_SPRD_LOG("[libtbm-sprd:%d] error %s:%d Fail to alloc\n",
+ getpid(), __FUNCTION__, __LINE__);
+ goto fail_alloc_gem_priv;
+ }
+
privGem->ref_count = 1;
privGem->bo_priv = bo_sprd;
if (drmHashInsert(bufmgr_sprd->hashBos, bo_sprd->name, (void *)privGem) < 0) {
bo_sprd->flags_tbm, bo_sprd->flags_sprd);
return (void *)bo_sprd;
+
+fail_alloc_gem_priv:
+ if (bo_sprd->dmabuf)
+ close(bo_sprd->dmabuf);
+fail_prime_handle_to_fd:
+ _bo_destroy_cache_state(bufmgr_sprd, bo_sprd);
+fail_init_cache:
+ free(bo_sprd);
+fail_alloc_bo:
+fail_get_gem:
+ {
+ struct drm_gem_close gem_close_arg = {arg.handle, 0};
+ drmIoctl(bufmgr_sprd->fd, DRM_IOCTL_GEM_CLOSE, &gem_close_arg);
+ }
+ return NULL;
}
static void *
tbm_sprd_bo_import_fd(tbm_bo bo, tbm_fd key)
{
- SPRD_RETURN_VAL_IF_FAIL(bo != NULL, 0);
+ SPRD_RETURN_VAL_IF_FAIL(bo != NULL, NULL);
tbm_bufmgr_sprd bufmgr_sprd;
tbm_bo_sprd bo_sprd;
- PrivGem *privGem = NULL;
- int ret;
unsigned int name;
+ PrivGem *privGem;
bufmgr_sprd = (tbm_bufmgr_sprd)tbm_backend_get_bufmgr_priv(bo);
- SPRD_RETURN_VAL_IF_FAIL(bufmgr_sprd != NULL, 0);
+ SPRD_RETURN_VAL_IF_FAIL(bufmgr_sprd != NULL, NULL);
//getting handle from fd
- unsigned int gem = 0;
struct drm_prime_handle arg = {0, };
+ unsigned int gem;
arg.fd = key;
- arg.flags = 0;
if (drmIoctl(bufmgr_sprd->fd, DRM_IOCTL_PRIME_FD_TO_HANDLE, &arg)) {
TBM_SPRD_LOG("error bo:%p Cannot get gem handle from fd:%d (%s)\n",
bo, arg.fd, strerror(errno));
gem = arg.handle;
name = _get_name(bufmgr_sprd->fd, gem);
+ if (!name) {
+ TBM_SPRD_LOG("error bo:%p Cannot get name from gem:%d, fd:%d (%s)\n",
+ bo, gem, key, strerror(errno));
+ return NULL;
+ }
- ret = drmHashLookup(bufmgr_sprd->hashBos, name, (void **)&privGem);
- if (ret == 0) {
+ if (!drmHashLookup(bufmgr_sprd->hashBos, name, (void **)&privGem)) {
if (gem == privGem->bo_priv->gem)
return privGem->bo_priv;
}
- unsigned int real_size = -1;
+ unsigned int real_size;
struct drm_sprd_gem_info info = {0, };
/* Determine size of bo. The fd-to-handle ioctl really should
sizeof(struct drm_sprd_gem_info))) {
TBM_SPRD_LOG("error bo:%p Cannot get gem info from gem:%d, fd:%d (%s)\n",
bo, gem, key, strerror(errno));
- return 0;
+ return NULL;
}
if (real_size == -1)
bo_sprd = calloc(1, sizeof(struct _tbm_bo_sprd));
if (!bo_sprd) {
TBM_SPRD_LOG("error bo:%p fail to allocate the bo private\n", bo);
- return 0;
+ return NULL;
}
bo_sprd->fd = bufmgr_sprd->fd;
if (!bo_sprd->name) {
TBM_SPRD_LOG("error bo:%p Cannot get name from gem:%d, fd:%d (%s)\n",
bo, gem, key, strerror(errno));
- free(bo_sprd);
- return 0;
+ goto fail_check_name;
}
if (!_bo_init_cache_state(bufmgr_sprd, bo_sprd, 1)) {
TBM_SPRD_LOG("error fail init cache state(%d)\n", bo_sprd->name);
- free(bo_sprd);
- return 0;
+ goto fail_init_cache;
}
/* add bo to hash */
- privGem = NULL;
-
privGem = calloc(1, sizeof(PrivGem));
if (!privGem) {
TBM_SPRD_LOG("[libtbm-sprd:%d] "
"error %s:%d Fail to callocprivGem\n",
getpid(), __FUNCTION__, __LINE__);
- free(bo_sprd);
- return 0;
+ goto fail_alloc_gem_priv;
}
privGem->ref_count = 1;
bo_sprd->size);
return (void *)bo_sprd;
+
+fail_alloc_gem_priv:
+ _bo_destroy_cache_state(bufmgr_sprd, bo_sprd);
+fail_init_cache:
+fail_check_name:
+ free(bo_sprd);
+ return NULL;
}
static unsigned int