Skip to content

Commit 50fff20

Browse files
author
Thomas Zimmermann
committed
drm/vkms: Map output framebuffer BOs with drm_gem_fb_vmap()
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 <[email protected]> Reviewed-by: Rodrigo Siqueira <[email protected]> Acked-by: Sam Ravnborg <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 0029d31 commit 50fff20

File tree

3 files changed

+22
-14
lines changed

3 files changed

+22
-14
lines changed

drivers/gpu/drm/vkms/vkms_composer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ void vkms_composer_worker(struct work_struct *work)
257257
return;
258258

259259
if (wb_pending)
260-
vaddr_out = crtc_state->active_writeback;
260+
vaddr_out = crtc_state->active_writeback->map[0].vaddr;
261261

262262
ret = compose_active_planes(&vaddr_out, primary_composer,
263263
crtc_state);

drivers/gpu/drm/vkms/vkms_drv.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
#define XRES_MAX 8192
2121
#define YRES_MAX 8192
2222

23+
struct vkms_writeback_job {
24+
struct dma_buf_map map[DRM_FORMAT_MAX_PLANES];
25+
};
26+
2327
struct vkms_composer {
2428
struct drm_framebuffer fb;
2529
struct drm_rect src, dst;
@@ -57,7 +61,7 @@ struct vkms_crtc_state {
5761
int num_active_planes;
5862
/* stack of active planes for crc computation, should be in z order */
5963
struct vkms_plane_state **active_planes;
60-
void *active_writeback;
64+
struct vkms_writeback_job *active_writeback;
6165

6266
/* below four are protected by vkms_output.composer_lock */
6367
bool crc_pending;

drivers/gpu/drm/vkms/vkms_writeback.c

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -65,41 +65,45 @@ static int vkms_wb_connector_get_modes(struct drm_connector *connector)
6565
static int vkms_wb_prepare_job(struct drm_writeback_connector *wb_connector,
6666
struct drm_writeback_job *job)
6767
{
68-
struct drm_gem_object *gem_obj;
69-
struct dma_buf_map map;
68+
struct vkms_writeback_job *vkmsjob;
7069
int ret;
7170

7271
if (!job->fb)
7372
return 0;
7473

75-
gem_obj = drm_gem_fb_get_obj(job->fb, 0);
76-
ret = drm_gem_shmem_vmap(gem_obj, &map);
74+
vkmsjob = kzalloc(sizeof(*vkmsjob), GFP_KERNEL);
75+
if (!vkmsjob)
76+
return -ENOMEM;
77+
78+
ret = drm_gem_fb_vmap(job->fb, vkmsjob->map);
7779
if (ret) {
7880
DRM_ERROR("vmap failed: %d\n", ret);
79-
return ret;
81+
goto err_kfree;
8082
}
8183

82-
job->priv = map.vaddr;
84+
job->priv = vkmsjob;
8385

8486
return 0;
87+
88+
err_kfree:
89+
kfree(vkmsjob);
90+
return ret;
8591
}
8692

8793
static void vkms_wb_cleanup_job(struct drm_writeback_connector *connector,
8894
struct drm_writeback_job *job)
8995
{
90-
struct drm_gem_object *gem_obj;
96+
struct vkms_writeback_job *vkmsjob = job->priv;
9197
struct vkms_device *vkmsdev;
92-
struct dma_buf_map map;
9398

9499
if (!job->fb)
95100
return;
96101

97-
gem_obj = drm_gem_fb_get_obj(job->fb, 0);
98-
dma_buf_map_set_vaddr(&map, job->priv);
99-
drm_gem_shmem_vunmap(gem_obj, &map);
102+
drm_gem_fb_vunmap(job->fb, vkmsjob->map);
100103

101-
vkmsdev = drm_device_to_vkms_device(gem_obj->dev);
104+
vkmsdev = drm_device_to_vkms_device(job->fb->dev);
102105
vkms_set_composer(&vkmsdev->output, false);
106+
kfree(vkmsjob);
103107
}
104108

105109
static void vkms_wb_atomic_commit(struct drm_connector *conn,

0 commit comments

Comments
 (0)