From: Dave Airlie <airl...@redhat.com>

We need to call these before we transfer the damaged areas to the device
not before/after we setup the long lived vmaps.

Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 drivers/gpu/drm/udl/udl_fb.c  |   22 ++++++++++++++++++++--
 drivers/gpu/drm/udl/udl_gem.c |    7 -------
 2 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
index ce9a611..b8c00ed 100644
--- a/drivers/gpu/drm/udl/udl_fb.c
+++ b/drivers/gpu/drm/udl/udl_fb.c
@@ -13,6 +13,7 @@
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/fb.h>
+#include <linux/dma-buf.h>

 #include "drmP.h"
 #include "drm.h"
@@ -377,16 +378,33 @@ static int udl_user_framebuffer_dirty(struct 
drm_framebuffer *fb,
 {
        struct udl_framebuffer *ufb = to_udl_fb(fb);
        int i;
+       int ret = 0;

        if (!ufb->active_16)
                return 0;

+       if (ufb->obj->base.import_attach) {
+               ret = 
dma_buf_begin_cpu_access(ufb->obj->base.import_attach->dmabuf,
+                                              0, ufb->obj->base.size,
+                                              DMA_FROM_DEVICE);
+               if (ret)
+                       return ret;
+       }
+
        for (i = 0; i < num_clips; i++) {
-               udl_handle_damage(ufb, clips[i].x1, clips[i].y1,
+               ret = udl_handle_damage(ufb, clips[i].x1, clips[i].y1,
                                  clips[i].x2 - clips[i].x1,
                                  clips[i].y2 - clips[i].y1);
+               if (ret)
+                       break;
        }
-       return 0;
+
+       if (ufb->obj->base.import_attach) {
+               dma_buf_end_cpu_access(ufb->obj->base.import_attach->dmabuf,
+                                      0, ufb->obj->base.size,
+                                      DMA_FROM_DEVICE);
+       }
+       return ret;
 }

 static void udl_user_framebuffer_destroy(struct drm_framebuffer *fb)
diff --git a/drivers/gpu/drm/udl/udl_gem.c b/drivers/gpu/drm/udl/udl_gem.c
index 7bd65bd..2a49678 100644
--- a/drivers/gpu/drm/udl/udl_gem.c
+++ b/drivers/gpu/drm/udl/udl_gem.c
@@ -181,11 +181,6 @@ int udl_gem_vmap(struct udl_gem_object *obj)
        int ret;

        if (obj->base.import_attach) {
-               ret = dma_buf_begin_cpu_access(obj->base.import_attach->dmabuf,
-                                              0, obj->base.size, 
DMA_BIDIRECTIONAL);
-               if (ret)
-                       return -EINVAL;
-
                obj->vmapping = dma_buf_vmap(obj->base.import_attach->dmabuf);
                if (!obj->vmapping)
                        return -ENOMEM;
@@ -206,8 +201,6 @@ void udl_gem_vunmap(struct udl_gem_object *obj)
 {
        if (obj->base.import_attach) {
                dma_buf_vunmap(obj->base.import_attach->dmabuf, obj->vmapping);
-               dma_buf_end_cpu_access(obj->base.import_attach->dmabuf, 0,
-                                      obj->base.size, DMA_BIDIRECTIONAL);
                return;
        }

-- 
1.7.10.2

Reply via email to