ret = -ENOMEM;
goto err_kds;
}
- if (kds_callback_init(&private->kds_cb_rm_fb, 0,
- exynos_drm_kds_callback_rm_fb) < 0) {
- DRM_ERROR("kds alloc queue failed.\n");
- ret = -ENOMEM;
- goto err_kds_rm_fb;
- }
#endif
DRM_INIT_WAITQUEUE(&private->wait_vsync_queue);
err_crtc:
drm_mode_config_cleanup(dev);
#ifdef CONFIG_DMA_SHARED_BUFFER_USES_KDS
- kds_callback_term(&private->kds_cb_rm_fb);
-err_kds_rm_fb:
kds_callback_term(&private->kds_cb);
err_kds:
#endif
/* TODO: Add wait for vsync for HDMI*/
}
-#ifdef CONFIG_DMA_SHARED_BUFFER_USES_KDS
-void exynos_drm_kds_callback_rm_fb(void *callback_parameter,
- void *callback_extra_parameter)
-{
- struct drm_framebuffer *fb = callback_parameter;
- struct exynos_drm_fb *exynos_fb = to_exynos_fb(fb);
- int i, nr;
-
- kds_resource_set_release(&exynos_fb->kds_res_set_rm_fb);
-
- dma_buf_put(exynos_fb->dma_buf);
-
- if (exynos_drm_fb_unmap(fb))
- DRM_ERROR("Couldn't unmap buffer\n");
-
- nr = exynos_drm_format_num_buffers(fb->pixel_format);
-
- for (i = 0; i < nr; i++) {
- struct drm_gem_object *obj;
-
- obj = &exynos_fb->exynos_gem_obj[i]->base;
- drm_gem_object_unreference_unlocked(obj);
- }
-
- kfree(exynos_fb);
-}
-#endif
-
void exynos_drm_fb_release(struct kref *kref)
{
struct exynos_drm_fb *exynos_fb;
drm_framebuffer_cleanup(fb);
-#ifdef CONFIG_DMA_SHARED_BUFFER_USES_KDS
- if (exynos_fb->dma_buf) {
- struct dma_buf *buf = exynos_fb->dma_buf;
- unsigned long shared = ~0UL;
- struct kds_resource *res_list = get_dma_buf_kds_resource(buf);
-
- /* Waiting for the KDS resource*/
- kds_async_waitall(&exynos_fb->kds_res_set_rm_fb,
- KDS_FLAG_LOCKED_WAIT, &dev_priv->kds_cb_rm_fb,
- fb, NULL, 1, &shared, &res_list);
-
- return;
- }
-#endif
-
/*
* We need to wait for non-kds buffers (i.e. some mode-set cases).
* Otherwise, we risk umapping a buffer that is being scanned-out.
* a fimd vblank (so is wrong for hdmi).
* TODO(msb) fix this.
*/
- exynos_drm_wait_for_vsync(fb->dev);
+#ifdef CONFIG_DMA_SHARED_BUFFER_USES_KDS
+ if (!exynos_fb->dma_buf)
+#endif
+ exynos_drm_wait_for_vsync(fb->dev);
if (exynos_drm_fb_unmap(fb))
DRM_ERROR("Couldn't unmap buffer\n");