Skip to content

Commit a37a512

Browse files
Martin Krastevzackr
authored andcommitted
drm/vmwgfx: Fix Legacy Display Unit atomic drm support
Legacy Display Unit (LDU) fb dirty support used a custom fb dirty callback. Latter handled only the DIRTYFB IOCTL presentation path but not the ADDFB2/PAGE_FLIP/RMFB IOCTL path, common for Wayland compositors. Get rid of the custom callback in favor of drm_atomic_helper_dirtyfb and unify the handling of the presentation paths inside of vmw_ldu_primary_plane_atomic_update. This also homogenizes the fb dirty callbacks across all DUs: LDU, SOU and STDU. Signed-off-by: Martin Krastev <[email protected]> Reviewed-by: Maaz Mombasawala <[email protected]> Fixes: 2f5544f ("drm/vmwgfx: Use atomic helper function for dirty fb IOCTL") Cc: <[email protected]> # v5.0+ Signed-off-by: Zack Rusin <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 35d86fb commit a37a512

File tree

3 files changed

+38
-74
lines changed

3 files changed

+38
-74
lines changed

drivers/gpu/drm/vmwgfx/vmwgfx_kms.c

Lines changed: 1 addition & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1396,70 +1396,10 @@ static void vmw_framebuffer_bo_destroy(struct drm_framebuffer *framebuffer)
13961396
kfree(vfbd);
13971397
}
13981398

1399-
static int vmw_framebuffer_bo_dirty(struct drm_framebuffer *framebuffer,
1400-
struct drm_file *file_priv,
1401-
unsigned int flags, unsigned int color,
1402-
struct drm_clip_rect *clips,
1403-
unsigned int num_clips)
1404-
{
1405-
struct vmw_private *dev_priv = vmw_priv(framebuffer->dev);
1406-
struct vmw_framebuffer_bo *vfbd =
1407-
vmw_framebuffer_to_vfbd(framebuffer);
1408-
struct drm_clip_rect norect;
1409-
int ret, increment = 1;
1410-
1411-
drm_modeset_lock_all(&dev_priv->drm);
1412-
1413-
if (!num_clips) {
1414-
num_clips = 1;
1415-
clips = &norect;
1416-
norect.x1 = norect.y1 = 0;
1417-
norect.x2 = framebuffer->width;
1418-
norect.y2 = framebuffer->height;
1419-
} else if (flags & DRM_MODE_FB_DIRTY_ANNOTATE_COPY) {
1420-
num_clips /= 2;
1421-
increment = 2;
1422-
}
1423-
1424-
switch (dev_priv->active_display_unit) {
1425-
case vmw_du_legacy:
1426-
ret = vmw_kms_ldu_do_bo_dirty(dev_priv, &vfbd->base, 0, 0,
1427-
clips, num_clips, increment);
1428-
break;
1429-
default:
1430-
ret = -EINVAL;
1431-
WARN_ONCE(true, "Dirty called with invalid display system.\n");
1432-
break;
1433-
}
1434-
1435-
vmw_cmd_flush(dev_priv, false);
1436-
1437-
drm_modeset_unlock_all(&dev_priv->drm);
1438-
1439-
return ret;
1440-
}
1441-
1442-
static int vmw_framebuffer_bo_dirty_ext(struct drm_framebuffer *framebuffer,
1443-
struct drm_file *file_priv,
1444-
unsigned int flags, unsigned int color,
1445-
struct drm_clip_rect *clips,
1446-
unsigned int num_clips)
1447-
{
1448-
struct vmw_private *dev_priv = vmw_priv(framebuffer->dev);
1449-
1450-
if (dev_priv->active_display_unit == vmw_du_legacy &&
1451-
vmw_cmd_supported(dev_priv))
1452-
return vmw_framebuffer_bo_dirty(framebuffer, file_priv, flags,
1453-
color, clips, num_clips);
1454-
1455-
return drm_atomic_helper_dirtyfb(framebuffer, file_priv, flags, color,
1456-
clips, num_clips);
1457-
}
1458-
14591399
static const struct drm_framebuffer_funcs vmw_framebuffer_bo_funcs = {
14601400
.create_handle = vmw_framebuffer_bo_create_handle,
14611401
.destroy = vmw_framebuffer_bo_destroy,
1462-
.dirty = vmw_framebuffer_bo_dirty_ext,
1402+
.dirty = drm_atomic_helper_dirtyfb,
14631403
};
14641404

14651405
/**

drivers/gpu/drm/vmwgfx/vmwgfx_kms.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -507,11 +507,6 @@ void vmw_du_connector_destroy_state(struct drm_connector *connector,
507507
*/
508508
int vmw_kms_ldu_init_display(struct vmw_private *dev_priv);
509509
int vmw_kms_ldu_close_display(struct vmw_private *dev_priv);
510-
int vmw_kms_ldu_do_bo_dirty(struct vmw_private *dev_priv,
511-
struct vmw_framebuffer *framebuffer,
512-
unsigned int flags, unsigned int color,
513-
struct drm_clip_rect *clips,
514-
unsigned int num_clips, int increment);
515510
int vmw_kms_update_proxy(struct vmw_resource *res,
516511
const struct drm_clip_rect *clips,
517512
unsigned num_clips,

drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ static const struct drm_crtc_funcs vmw_legacy_crtc_funcs = {
275275
.atomic_duplicate_state = vmw_du_crtc_duplicate_state,
276276
.atomic_destroy_state = vmw_du_crtc_destroy_state,
277277
.set_config = drm_atomic_helper_set_config,
278+
.page_flip = drm_atomic_helper_page_flip,
278279
};
279280

280281

@@ -314,6 +315,12 @@ static const struct
314315
drm_connector_helper_funcs vmw_ldu_connector_helper_funcs = {
315316
};
316317

318+
static int vmw_kms_ldu_do_bo_dirty(struct vmw_private *dev_priv,
319+
struct vmw_framebuffer *framebuffer,
320+
unsigned int flags, unsigned int color,
321+
struct drm_mode_rect *clips,
322+
unsigned int num_clips);
323+
317324
/*
318325
* Legacy Display Plane Functions
319326
*/
@@ -332,7 +339,6 @@ vmw_ldu_primary_plane_atomic_update(struct drm_plane *plane,
332339
struct drm_framebuffer *fb;
333340
struct drm_crtc *crtc = new_state->crtc ?: old_state->crtc;
334341

335-
336342
ldu = vmw_crtc_to_ldu(crtc);
337343
dev_priv = vmw_priv(plane->dev);
338344
fb = new_state->fb;
@@ -345,8 +351,31 @@ vmw_ldu_primary_plane_atomic_update(struct drm_plane *plane,
345351
vmw_ldu_del_active(dev_priv, ldu);
346352

347353
vmw_ldu_commit_list(dev_priv);
348-
}
349354

355+
if (vfb && vmw_cmd_supported(dev_priv)) {
356+
struct drm_mode_rect fb_rect = {
357+
.x1 = 0,
358+
.y1 = 0,
359+
.x2 = vfb->base.width,
360+
.y2 = vfb->base.height
361+
};
362+
struct drm_mode_rect *damage_rects = drm_plane_get_damage_clips(new_state);
363+
u32 rect_count = drm_plane_get_damage_clips_count(new_state);
364+
int ret;
365+
366+
if (!damage_rects) {
367+
damage_rects = &fb_rect;
368+
rect_count = 1;
369+
}
370+
371+
ret = vmw_kms_ldu_do_bo_dirty(dev_priv, vfb, 0, 0, damage_rects, rect_count);
372+
373+
drm_WARN_ONCE(plane->dev, ret,
374+
"vmw_kms_ldu_do_bo_dirty failed with: ret=%d\n", ret);
375+
376+
vmw_cmd_flush(dev_priv, false);
377+
}
378+
}
350379

351380
static const struct drm_plane_funcs vmw_ldu_plane_funcs = {
352381
.update_plane = drm_atomic_helper_update_plane,
@@ -577,11 +606,11 @@ int vmw_kms_ldu_close_display(struct vmw_private *dev_priv)
577606
}
578607

579608

580-
int vmw_kms_ldu_do_bo_dirty(struct vmw_private *dev_priv,
581-
struct vmw_framebuffer *framebuffer,
582-
unsigned int flags, unsigned int color,
583-
struct drm_clip_rect *clips,
584-
unsigned int num_clips, int increment)
609+
static int vmw_kms_ldu_do_bo_dirty(struct vmw_private *dev_priv,
610+
struct vmw_framebuffer *framebuffer,
611+
unsigned int flags, unsigned int color,
612+
struct drm_mode_rect *clips,
613+
unsigned int num_clips)
585614
{
586615
size_t fifo_size;
587616
int i;
@@ -597,7 +626,7 @@ int vmw_kms_ldu_do_bo_dirty(struct vmw_private *dev_priv,
597626
return -ENOMEM;
598627

599628
memset(cmd, 0, fifo_size);
600-
for (i = 0; i < num_clips; i++, clips += increment) {
629+
for (i = 0; i < num_clips; i++, clips++) {
601630
cmd[i].header = SVGA_CMD_UPDATE;
602631
cmd[i].body.x = clips->x1;
603632
cmd[i].body.y = clips->y1;

0 commit comments

Comments
 (0)