static void exynos_drm_fb_destroy(struct drm_framebuffer *fb) { struct exynos_drm_fb *exynos_fb = to_exynos_fb(fb); unsigned int i; DRM_DEBUG_KMS("%s\n", __FILE__); /* make sure that overlay data are updated before relesing fb. */ exynos_drm_encoder_complete_scanout(fb); drm_framebuffer_cleanup(fb); for (i = 0; i < ARRAY_SIZE(exynos_fb->exynos_gem_obj); i++) { struct drm_gem_object *obj; if (exynos_fb->exynos_gem_obj[i] == NULL) continue; obj = &exynos_fb->exynos_gem_obj[i]->base; drm_gem_object_unreference_unlocked(obj); } kfree(exynos_fb); exynos_fb = NULL; }
unsigned int exynos_drm_fb_get_buf_cnt(struct drm_framebuffer *fb) { struct exynos_drm_fb *exynos_fb; exynos_fb = to_exynos_fb(fb); return exynos_fb->buf_cnt; }
void exynos_drm_fb_set_buf_cnt(struct drm_framebuffer *fb, unsigned int cnt) { struct exynos_drm_fb *exynos_fb; exynos_fb = to_exynos_fb(fb); exynos_fb->buf_cnt = cnt; }
static int exynos_drm_fb_create_handle(struct drm_framebuffer *fb, struct drm_file *file_priv, unsigned int *handle) { struct exynos_drm_fb *exynos_fb = to_exynos_fb(fb); return drm_gem_handle_create(file_priv, &exynos_fb->exynos_gem[0]->base, handle); }
dma_addr_t exynos_drm_fb_dma_addr(struct drm_framebuffer *fb, int index) { struct exynos_drm_fb *exynos_fb = to_exynos_fb(fb); if (WARN_ON_ONCE(index >= MAX_FB_BUFFER)) return 0; return exynos_fb->dma_addr[index]; }
dma_addr_t exynos_drm_fb_dma_addr(struct drm_framebuffer *fb, int index) { struct exynos_drm_fb *exynos_fb = to_exynos_fb(fb); if (index >= MAX_FB_BUFFER) return DMA_ERROR_CODE; return exynos_fb->dma_addr[index]; }
static int exynos_drm_fb_create_handle(struct drm_framebuffer *fb, struct drm_file *file_priv, unsigned int *handle) { struct exynos_drm_fb *exynos_fb = to_exynos_fb(fb); DRM_DEBUG_KMS("%s\n", __FILE__); return drm_gem_handle_create(file_priv, &exynos_fb->exynos_gem_obj[0]->base, handle); }
static void exynos_drm_fb_destroy(struct drm_framebuffer *fb) { struct exynos_drm_fb *exynos_fb = to_exynos_fb(fb); DRM_DEBUG_KMS("%s\n", __FILE__); drm_framebuffer_cleanup(fb); kfree(exynos_fb); exynos_fb = NULL; }
static int exynos_drm_fb_create_handle(struct drm_framebuffer *fb, struct drm_file *file_priv, unsigned int *handle) { struct exynos_drm_fb *exynos_fb = to_exynos_fb(fb); /* This fb should have only one gem object. */ if (WARN_ON(exynos_fb->buf_cnt != 1)) return -EINVAL; return drm_gem_handle_create(file_priv, &exynos_fb->exynos_gem_obj[0]->base, handle); }
struct exynos_drm_gem_buf *exynos_drm_fb_buffer(struct drm_framebuffer *fb, int index) { struct exynos_drm_fb *exynos_fb = to_exynos_fb(fb); struct exynos_drm_gem_buf *buffer; if (index >= MAX_FB_BUFFER) return NULL; buffer = exynos_fb->exynos_gem_obj[index]->buffer; if (!buffer) return NULL; DRM_DEBUG_KMS("dma_addr = 0x%lx\n", (unsigned long)buffer->dma_addr); return buffer; }
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; }
static void exynos_drm_fb_destroy(struct drm_framebuffer *fb) { struct exynos_drm_fb *exynos_fb = to_exynos_fb(fb); unsigned int i; drm_framebuffer_cleanup(fb); for (i = 0; i < ARRAY_SIZE(exynos_fb->exynos_gem); i++) { struct drm_gem_object *obj; if (exynos_fb->exynos_gem[i] == NULL) continue; obj = &exynos_fb->exynos_gem[i]->base; drm_gem_object_unreference_unlocked(obj); } kfree(exynos_fb); exynos_fb = NULL; }