Abstract the framebuffer details by mappings its BOs with a call
to drm_gem_fb_vmap(). Unmap with drm_gem_fb_vunamp().

Before, the output address with stored as raw pointer in the priv
field of struct drm_writeback_job. Introduce the new type
struct vkms_writeback_job, which holds the output mappings addresses
while the writeback job is active.

The patchset also cleans up some internal casting an setup of the
output addresses. No functional changes.

v3:
        * free instances of struct vkms_writeback_job on cleanup
          or errors

Signed-off-by: Thomas Zimmermann <tzimmerm...@suse.de>
Reviewed-by: Rodrigo Siqueira <rodrigo.sique...@amd.com>
Acked-by: Sam Ravnborg <s...@ravnborg.org>
---
 drivers/gpu/drm/vkms/vkms_composer.c  |  2 +-
 drivers/gpu/drm/vkms/vkms_drv.h       |  6 +++++-
 drivers/gpu/drm/vkms/vkms_writeback.c | 28 +++++++++++++++------------
 3 files changed, 22 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/vkms/vkms_composer.c 
b/drivers/gpu/drm/vkms/vkms_composer.c
index ead8fff81f30..49f109c3a2b3 100644
--- a/drivers/gpu/drm/vkms/vkms_composer.c
+++ b/drivers/gpu/drm/vkms/vkms_composer.c
@@ -257,7 +257,7 @@ void vkms_composer_worker(struct work_struct *work)
                return;
 
        if (wb_pending)
-               vaddr_out = crtc_state->active_writeback;
+               vaddr_out = crtc_state->active_writeback->map[0].vaddr;
 
        ret = compose_active_planes(&vaddr_out, primary_composer,
                                    crtc_state);
diff --git a/drivers/gpu/drm/vkms/vkms_drv.h b/drivers/gpu/drm/vkms/vkms_drv.h
index 8c731b6dcba7..8bc9e3f52e1f 100644
--- a/drivers/gpu/drm/vkms/vkms_drv.h
+++ b/drivers/gpu/drm/vkms/vkms_drv.h
@@ -20,6 +20,10 @@
 #define XRES_MAX  8192
 #define YRES_MAX  8192
 
+struct vkms_writeback_job {
+       struct dma_buf_map map[DRM_FORMAT_MAX_PLANES];
+};
+
 struct vkms_composer {
        struct drm_framebuffer fb;
        struct drm_rect src, dst;
@@ -57,7 +61,7 @@ struct vkms_crtc_state {
        int num_active_planes;
        /* stack of active planes for crc computation, should be in z order */
        struct vkms_plane_state **active_planes;
-       void *active_writeback;
+       struct vkms_writeback_job *active_writeback;
 
        /* below four are protected by vkms_output.composer_lock */
        bool crc_pending;
diff --git a/drivers/gpu/drm/vkms/vkms_writeback.c 
b/drivers/gpu/drm/vkms/vkms_writeback.c
index 0935686475a0..425b6c6b8cad 100644
--- a/drivers/gpu/drm/vkms/vkms_writeback.c
+++ b/drivers/gpu/drm/vkms/vkms_writeback.c
@@ -65,41 +65,45 @@ static int vkms_wb_connector_get_modes(struct drm_connector 
*connector)
 static int vkms_wb_prepare_job(struct drm_writeback_connector *wb_connector,
                               struct drm_writeback_job *job)
 {
-       struct drm_gem_object *gem_obj;
-       struct dma_buf_map map;
+       struct vkms_writeback_job *vkmsjob;
        int ret;
 
        if (!job->fb)
                return 0;
 
-       gem_obj = drm_gem_fb_get_obj(job->fb, 0);
-       ret = drm_gem_shmem_vmap(gem_obj, &map);
+       vkmsjob = kzalloc(sizeof(*vkmsjob), GFP_KERNEL);
+       if (!vkmsjob)
+               return -ENOMEM;
+
+       ret = drm_gem_fb_vmap(job->fb, vkmsjob->map);
        if (ret) {
                DRM_ERROR("vmap failed: %d\n", ret);
-               return ret;
+               goto err_kfree;
        }
 
-       job->priv = map.vaddr;
+       job->priv = vkmsjob;
 
        return 0;
+
+err_kfree:
+       kfree(vkmsjob);
+       return ret;
 }
 
 static void vkms_wb_cleanup_job(struct drm_writeback_connector *connector,
                                struct drm_writeback_job *job)
 {
-       struct drm_gem_object *gem_obj;
+       struct vkms_writeback_job *vkmsjob = job->priv;
        struct vkms_device *vkmsdev;
-       struct dma_buf_map map;
 
        if (!job->fb)
                return;
 
-       gem_obj = drm_gem_fb_get_obj(job->fb, 0);
-       dma_buf_map_set_vaddr(&map, job->priv);
-       drm_gem_shmem_vunmap(gem_obj, &map);
+       drm_gem_fb_vunmap(job->fb, vkmsjob->map);
 
-       vkmsdev = drm_device_to_vkms_device(gem_obj->dev);
+       vkmsdev = drm_device_to_vkms_device(job->fb->dev);
        vkms_set_composer(&vkmsdev->output, false);
+       kfree(vkmsjob);
 }
 
 static void vkms_wb_atomic_commit(struct drm_connector *conn,
-- 
2.32.0

Reply via email to