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@xxxxxxx> > --- > 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@xxxxxxx> -- Rodrigo Siqueira https://siqueira.tech