{
int ret = 0;
struct drm_viv_gem_create *args = (struct drm_viv_gem_create*)data;
- struct drm_gem_object *gem_obj;
- struct viv_gem_object *viv_obj;
+ struct drm_gem_object *gem_obj = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
gcsHAL_INTERFACE iface;
gckGALDEVICE gal_dev;
struct drm_file *file)
{
struct drm_viv_gem_lock *args = (struct drm_viv_gem_lock*)data;
- struct drm_gem_object *gem_obj;
- struct viv_gem_object *viv_obj;
+ struct drm_gem_object *gem_obj = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
gcsHAL_INTERFACE iface;
gceSTATUS status = gcvSTATUS_OK;
args->logical = iface.u.LockVideoMemory.memory;
OnError:
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+ }
return gcmIS_ERROR(status) ? -ENOTTY : 0;
}
struct drm_file *file)
{
struct drm_viv_gem_unlock *args = (struct drm_viv_gem_unlock*)data;
- struct drm_gem_object *gem_obj;
- struct viv_gem_object *viv_obj;
+ struct drm_gem_object *gem_obj = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
gcsHAL_INTERFACE iface;
gceSTATUS status = gcvSTATUS_OK;
{
gcmkONERROR(gcvSTATUS_NOT_FOUND);
}
- drm_gem_object_unreference_unlocked(gem_obj);
viv_obj = container_of(gem_obj, struct viv_gem_object, base);
gckOS_ZeroMemory(&iface, sizeof(iface));
- iface.command = gcvHAL_UNLOCK_VIDEO_MEMORY;
+ iface.command = gcvHAL_BOTTOM_HALF_UNLOCK_VIDEO_MEMORY;
iface.hardwareType = gal_dev->device->defaultHwType;
- iface.u.UnlockVideoMemory.node = (gctUINT64)viv_obj->node_handle;
- iface.u.UnlockVideoMemory.type = gcvSURF_TYPE_UNKNOWN;
+ iface.u.BottomHalfUnlockVideoMemory.node = (gctUINT64)viv_obj->node_handle;
+ iface.u.BottomHalfUnlockVideoMemory.type = gcvSURF_TYPE_UNKNOWN;
gcmkONERROR(gckDEVICE_Dispatch(gal_dev->device, &iface));
- /*
- * decrease obj->refcount one more time because we has already
- * increased it at viv_ioctl_gem_lock().
- */
- drm_gem_object_unreference_unlocked(gem_obj);
-
OnError:
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+ }
return gcmIS_ERROR(status) ? -ENOTTY : 0;
}
struct drm_file *file)
{
struct drm_viv_gem_cache *args = (struct drm_viv_gem_cache*)data;
- struct drm_gem_object *gem_obj;
- struct viv_gem_object *viv_obj;
+ struct drm_gem_object *gem_obj = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
gcsHAL_INTERFACE iface;
gceSTATUS status = gcvSTATUS_OK;
{
gcmkONERROR(gcvSTATUS_NOT_FOUND);
}
- drm_gem_object_unreference_unlocked(gem_obj);
viv_obj = container_of(gem_obj, struct viv_gem_object, base);
switch (args->op)
gcmkONERROR(gckDEVICE_Dispatch(gal_dev->device, &iface));
OnError:
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+ }
return gcmIS_ERROR(status) ? -ENOTTY : 0;
}
struct drm_file *file)
{
struct drm_viv_gem_query *args = (struct drm_viv_gem_query*)data;
- struct drm_gem_object *gem_obj;
- struct viv_gem_object *viv_obj;
+ struct drm_gem_object *gem_obj = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
gceSTATUS status = gcvSTATUS_OK;
gckGALDEVICE gal_dev = gcvNULL;
{
gcmkONERROR(gcvSTATUS_NOT_FOUND);
}
- drm_gem_object_unreference_unlocked(gem_obj);
viv_obj = container_of(gem_obj, struct viv_gem_object, base);
switch (args->param)
}
OnError:
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+ }
return gcmIS_ERROR(status) ? -ENOTTY : 0;
}
struct drm_file *file)
{
struct drm_viv_gem_timestamp *args = (struct drm_viv_gem_timestamp *)data;
- struct drm_gem_object *gem_obj;
- struct viv_gem_object *viv_obj;
+ struct drm_gem_object *gem_obj = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
gceSTATUS status = gcvSTATUS_OK;
gckGALDEVICE gal_dev = gcvNULL;
viv_obj->node_object->timeStamp += args->inc;
args->timestamp = viv_obj->node_object->timeStamp;
- drm_gem_object_unreference_unlocked(gem_obj);
OnError:
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+ }
return gcmIS_ERROR(status) ? -ENOTTY : 0;
}
struct drm_file *file)
{
struct drm_viv_gem_set_tiling *args = (struct drm_viv_gem_set_tiling*)data;
- struct drm_gem_object *gem_obj;
- struct viv_gem_object *viv_obj;
+ struct drm_gem_object *gem_obj = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
gceSTATUS status = gcvSTATUS_OK;
gckGALDEVICE gal_dev = gcvNULL;
{
gcmkONERROR(gcvSTATUS_NOT_FOUND);
}
- drm_gem_object_unreference_unlocked(gem_obj);
viv_obj = container_of(gem_obj, struct viv_gem_object, base);
viv_obj->node_object->tilingMode = args->tiling_mode;
viv_obj->node_object->clearValue = args->clear_value;
OnError:
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+ }
return gcmIS_ERROR(status) ? -ENOTTY : 0;
}
struct drm_file *file)
{
struct drm_viv_gem_get_tiling *args = (struct drm_viv_gem_get_tiling*)data;
- struct drm_gem_object *gem_obj;
- struct viv_gem_object *viv_obj;
+ struct drm_gem_object *gem_obj = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
gceSTATUS status = gcvSTATUS_OK;
gckGALDEVICE gal_dev = gcvNULL;
{
gcmkONERROR(gcvSTATUS_NOT_FOUND);
}
- drm_gem_object_unreference_unlocked(gem_obj);
viv_obj = container_of(gem_obj, struct viv_gem_object, base);
args->tiling_mode = viv_obj->node_object->tilingMode;
args->clear_value = viv_obj->node_object->clearValue;
OnError:
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+ }
return gcmIS_ERROR(status) ? -ENOTTY : 0;
}
struct drm_file *file)
{
struct drm_viv_gem_attach_aux *args = (struct drm_viv_gem_attach_aux*)data;
- struct drm_gem_object *gem_obj;
- struct viv_gem_object *viv_obj;
+ struct drm_gem_object *gem_obj = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
+ struct drm_gem_object *gem_ts_obj = gcvNULL;
gceSTATUS status = gcvSTATUS_OK;
gckGALDEVICE gal_dev = gcvNULL;
{
gcmkONERROR(gcvSTATUS_NOT_FOUND);
}
- drm_gem_object_unreference_unlocked(gem_obj);
viv_obj = container_of(gem_obj, struct viv_gem_object, base);
nodeObj = viv_obj->node_object;
if (args->ts_handle)
{
- struct drm_gem_object *gem_ts_obj;
struct viv_gem_object *viv_ts_obj;
gckKERNEL kernel = gal_dev->device->map[gal_dev->device->defaultHwType].kernels[0];
{
gcmkONERROR(gcvSTATUS_NOT_FOUND);
}
- drm_gem_object_unreference_unlocked(gem_ts_obj);
viv_ts_obj = container_of(gem_ts_obj, struct viv_gem_object, base);
gcmkONERROR(gckVIDMEM_NODE_Reference(kernel, viv_ts_obj->node_object));
}
OnError:
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+
+ if (gem_ts_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_ts_obj);
+ }
+ }
return gcmIS_ERROR(status) ? -ENOTTY : 0;
}
struct drm_file *file)
{
struct drm_viv_gem_ref_node *args = (struct drm_viv_gem_ref_node*)data;
- struct drm_gem_object *gem_obj;
- struct viv_gem_object *viv_obj;
+ struct drm_gem_object *gem_obj = gcvNULL;
+ struct viv_gem_object *viv_obj = gcvNULL;
gceSTATUS status = gcvSTATUS_OK;
gckGALDEVICE gal_dev = gcvNULL;
{
gcmkONERROR(gcvSTATUS_NOT_FOUND);
}
- drm_gem_object_unreference_unlocked(gem_obj);
viv_obj = container_of(gem_obj, struct viv_gem_object, base);
nodeObj = viv_obj->node_object;
ret = -ENOTTY;
}
+ if (gem_obj)
+ {
+ drm_gem_object_unreference_unlocked(gem_obj);
+ }
+
return ret;
}