The vboxvideo driver provides struct drm_framebuffer_funcs.dirty_fb from
its own implementation. Switch over to drm_atomic_helper_dirty_fb() and
handle screen updates in the primary plane's atomic_update function.

With dirty_fb out of the way, we can further replace struct vbox_frammebuffer
with generic code.

Signed-off-by: Thomas Zimmermann <tzimmerm...@suse.de>
---
 drivers/gpu/drm/vboxvideo/vbox_drv.h  |  4 --
 drivers/gpu/drm/vboxvideo/vbox_main.c | 61 +--------------------------
 drivers/gpu/drm/vboxvideo/vbox_mode.c | 34 +++++++++++++++
 3 files changed, 36 insertions(+), 63 deletions(-)

diff --git a/drivers/gpu/drm/vboxvideo/vbox_drv.h 
b/drivers/gpu/drm/vboxvideo/vbox_drv.h
index bb0c39fe7911..9976554b58cb 100644
--- a/drivers/gpu/drm/vboxvideo/vbox_drv.h
+++ b/drivers/gpu/drm/vboxvideo/vbox_drv.h
@@ -143,10 +143,6 @@ void vbox_mode_fini(struct vbox_private *vbox);
 
 void vbox_report_caps(struct vbox_private *vbox);
 
-void vbox_framebuffer_dirty_rectangles(struct drm_framebuffer *fb,
-                                      struct drm_clip_rect *rects,
-                                      unsigned int num_rects);
-
 int vbox_framebuffer_init(struct vbox_private *vbox,
                          struct vbox_framebuffer *vbox_fb,
                          const struct drm_mode_fb_cmd2 *mode_cmd,
diff --git a/drivers/gpu/drm/vboxvideo/vbox_main.c 
b/drivers/gpu/drm/vboxvideo/vbox_main.c
index 02fa8277ff1e..ba24a9293d17 100644
--- a/drivers/gpu/drm/vboxvideo/vbox_main.c
+++ b/drivers/gpu/drm/vboxvideo/vbox_main.c
@@ -11,6 +11,7 @@
 #include <linux/vbox_err.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_damage_helper.h>
 
 #include "vbox_drv.h"
 #include "vboxvideo_guest.h"
@@ -38,67 +39,9 @@ void vbox_report_caps(struct vbox_private *vbox)
        hgsmi_send_caps_info(vbox->guest_pool, caps);
 }
 
-/* Send information about dirty rectangles to VBVA. */
-void vbox_framebuffer_dirty_rectangles(struct drm_framebuffer *fb,
-                                      struct drm_clip_rect *rects,
-                                      unsigned int num_rects)
-{
-       struct vbox_private *vbox = fb->dev->dev_private;
-       struct drm_display_mode *mode;
-       struct drm_crtc *crtc;
-       int crtc_x, crtc_y;
-       unsigned int i;
-
-       mutex_lock(&vbox->hw_mutex);
-       list_for_each_entry(crtc, &fb->dev->mode_config.crtc_list, head) {
-               if (crtc->primary->state->fb != fb)
-                       continue;
-
-               mode = &crtc->state->mode;
-               crtc_x = crtc->primary->state->src_x >> 16;
-               crtc_y = crtc->primary->state->src_y >> 16;
-
-               for (i = 0; i < num_rects; ++i) {
-                       struct vbva_cmd_hdr cmd_hdr;
-                       unsigned int crtc_id = to_vbox_crtc(crtc)->crtc_id;
-
-                       if (rects[i].x1 > crtc_x + mode->hdisplay ||
-                           rects[i].y1 > crtc_y + mode->vdisplay ||
-                           rects[i].x2 < crtc_x ||
-                           rects[i].y2 < crtc_y)
-                               continue;
-
-                       cmd_hdr.x = (s16)rects[i].x1;
-                       cmd_hdr.y = (s16)rects[i].y1;
-                       cmd_hdr.w = (u16)rects[i].x2 - rects[i].x1;
-                       cmd_hdr.h = (u16)rects[i].y2 - rects[i].y1;
-
-                       if (!vbva_buffer_begin_update(&vbox->vbva_info[crtc_id],
-                                                     vbox->guest_pool))
-                               continue;
-
-                       vbva_write(&vbox->vbva_info[crtc_id], vbox->guest_pool,
-                                  &cmd_hdr, sizeof(cmd_hdr));
-                       vbva_buffer_end_update(&vbox->vbva_info[crtc_id]);
-               }
-       }
-       mutex_unlock(&vbox->hw_mutex);
-}
-
-static int vbox_user_framebuffer_dirty(struct drm_framebuffer *fb,
-                                      struct drm_file *file_priv,
-                                      unsigned int flags, unsigned int color,
-                                      struct drm_clip_rect *rects,
-                                      unsigned int num_rects)
-{
-       vbox_framebuffer_dirty_rectangles(fb, rects, num_rects);
-
-       return 0;
-}
-
 static const struct drm_framebuffer_funcs vbox_fb_funcs = {
        .destroy = vbox_user_framebuffer_destroy,
-       .dirty = vbox_user_framebuffer_dirty,
+       .dirty = drm_atomic_helper_dirtyfb,
 };
 
 int vbox_framebuffer_init(struct vbox_private *vbox,
diff --git a/drivers/gpu/drm/vboxvideo/vbox_mode.c 
b/drivers/gpu/drm/vboxvideo/vbox_mode.c
index dd9ad3fdd919..70754e9a087e 100644
--- a/drivers/gpu/drm/vboxvideo/vbox_mode.c
+++ b/drivers/gpu/drm/vboxvideo/vbox_mode.c
@@ -284,10 +284,44 @@ static void vbox_primary_atomic_update(struct drm_plane 
*plane,
 {
        struct drm_crtc *crtc = plane->state->crtc;
        struct drm_framebuffer *fb = plane->state->fb;
+       struct vbox_private *vbox = fb->dev->dev_private;
+       struct drm_mode_rect *clips;
+       uint32_t num_clips, i;
 
        vbox_crtc_set_base_and_mode(crtc, fb,
                                    plane->state->src_x >> 16,
                                    plane->state->src_y >> 16);
+
+       /* Send information about dirty rectangles to VBVA. */
+
+       clips = drm_plane_get_damage_clips(plane->state);
+       num_clips = drm_plane_get_damage_clips_count(plane->state);
+
+       if (!num_clips)
+               return;
+
+       mutex_lock(&vbox->hw_mutex);
+
+       for (i = 0; i < num_clips; ++i, ++clips) {
+
+               struct vbva_cmd_hdr cmd_hdr;
+               unsigned int crtc_id = to_vbox_crtc(crtc)->crtc_id;
+
+               cmd_hdr.x = (s16)clips->x1;
+               cmd_hdr.y = (s16)clips->y1;
+               cmd_hdr.w = (u16)clips->x2 - clips->x1;
+               cmd_hdr.h = (u16)clips->y2 - clips->y1;
+
+               if (!vbva_buffer_begin_update(&vbox->vbva_info[crtc_id],
+                                             vbox->guest_pool))
+                       continue;
+
+               vbva_write(&vbox->vbva_info[crtc_id], vbox->guest_pool,
+                          &cmd_hdr, sizeof(cmd_hdr));
+               vbva_buffer_end_update(&vbox->vbva_info[crtc_id]);
+       }
+
+       mutex_unlock(&vbox->hw_mutex);
 }
 
 static void vbox_primary_atomic_disable(struct drm_plane *plane,
-- 
2.23.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to