static struct drm_framebuffer * exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd) { struct exynos_drm_gem *exynos_gem[MAX_FB_BUFFER]; struct drm_gem_object *obj; struct drm_framebuffer *fb; int i; int ret; for (i = 0; i < drm_format_num_planes(mode_cmd->pixel_format); i++) { obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[i]); if (!obj) { DRM_ERROR("failed to lookup gem object\n"); ret = -ENOENT; goto err; } exynos_gem[i] = to_exynos_gem(obj); } fb = exynos_drm_framebuffer_init(dev, mode_cmd, exynos_gem, i); if (IS_ERR(fb)) { ret = PTR_ERR(fb); goto err; } return fb; err: while (i--) drm_gem_object_unreference_unlocked(&exynos_gem[i]->base); return ERR_PTR(ret); }
static struct drm_framebuffer * exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd) { const struct drm_format_info *info = drm_get_format_info(dev, mode_cmd); struct exynos_drm_gem *exynos_gem[MAX_FB_BUFFER]; struct drm_gem_object *obj; struct drm_framebuffer *fb; int i; int ret; for (i = 0; i < info->num_planes; i++) { unsigned int height = (i == 0) ? mode_cmd->height : DIV_ROUND_UP(mode_cmd->height, info->vsub); unsigned long size = height * mode_cmd->pitches[i] + mode_cmd->offsets[i]; obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[i]); if (!obj) { DRM_ERROR("failed to lookup gem object\n"); ret = -ENOENT; goto err; } exynos_gem[i] = to_exynos_gem(obj); if (size > exynos_gem[i]->size) { i++; ret = -EINVAL; goto err; } } fb = exynos_drm_framebuffer_init(dev, mode_cmd, exynos_gem, i); if (IS_ERR(fb)) { ret = PTR_ERR(fb); goto err; } return fb; err: while (i--) drm_gem_object_unreference_unlocked(&exynos_gem[i]->base); return ERR_PTR(ret); }
static struct drm_framebuffer * exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd) { struct drm_gem_object *obj; struct drm_framebuffer *fb; struct exynos_drm_fb *exynos_fb; int nr; int i; DRM_DEBUG_KMS("%s\n", __FILE__); obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]); if (!obj) { DRM_ERROR("failed to lookup gem object\n"); return ERR_PTR(-ENOENT); } drm_gem_object_unreference_unlocked(obj); fb = exynos_drm_framebuffer_init(dev, mode_cmd, obj); if (IS_ERR(fb)) return fb; exynos_fb = to_exynos_fb(fb); nr = exynos_drm_format_num_buffers(fb->pixel_format); for (i = 1; i < nr; i++) { obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[i]); if (!obj) { DRM_ERROR("failed to lookup gem object\n"); exynos_drm_fb_destroy(fb); return ERR_PTR(-ENOENT); } drm_gem_object_unreference_unlocked(obj); exynos_fb->exynos_gem_obj[i] = to_exynos_gem_obj(obj); } return fb; }