diff mbox series

[v2,5/5] drm/vkms: Map output framebuffer BOs with drm_gem_fb_vmap()

Message ID 20210725174438.24493-6-tzimmermann@suse.de (mailing list archive)
State New, archived
Headers show
Series drm: Provide framebuffer vmap helpers | expand

Commit Message

Thomas Zimmermann July 25, 2021, 5:44 p.m. UTC
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@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(-)

Comments

Sam Ravnborg July 25, 2021, 8:03 p.m. UTC | #1
On Sun, Jul 25, 2021 at 07:44:38PM +0200, 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@suse.de>
Acked-by: Sam Ravnborg <sam@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 | 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
Rodrigo Siqueira Jordao July 26, 2021, 9:26 p.m. UTC | #2
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@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@amd.com>
diff mbox series

Patch

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);
 }