[PATCH v2 5/5] drm/vkms: Map output framebuffer BOs with drm_gem_fb_vmap()
Rodrigo Siqueira
Rodrigo.Siqueira at amd.com
Mon Jul 26 21:26:36 UTC 2021
On 07/25, Thomas Zimmermann wrote:
> 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.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann at suse.de>
> ---
> drivers/gpu/drm/vkms/vkms_composer.c | 2 +-
> drivers/gpu/drm/vkms/vkms_drv.h | 6 +++++-
> drivers/gpu/drm/vkms/vkms_writeback.c | 21 ++++++++++-----------
> 3 files changed, 16 insertions(+), 13 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..765bb85ba76c 100644
> --- a/drivers/gpu/drm/vkms/vkms_writeback.c
> +++ b/drivers/gpu/drm/vkms/vkms_writeback.c
> @@ -65,21 +65,23 @@ 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;
> }
>
> - job->priv = map.vaddr;
> + job->priv = vkmsjob;
>
> return 0;
> }
> @@ -87,18 +89,15 @@ static int vkms_wb_prepare_job(struct drm_writeback_connector *wb_connector,
> 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);
> }
>
> --
> 2.32.0
>
Reviewed-by: Rodrigo Siqueira <Rodrigo.Siqueira at amd.com>
--
Rodrigo Siqueira
https://siqueira.tech
More information about the dri-devel
mailing list