mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-02 07:04:24 +00:00
drm/vboxvideo: Switch to drm_atomic_helper_dirty_fb()
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 <tzimmermann@suse.de> Acked-by: Sam Ravnborg <sam@ravnborg.org> Link: https://patchwork.freedesktop.org/patch/msgid/20191011134808.3955-3-tzimmermann@suse.de
This commit is contained in:
parent
2695eae1f6
commit
1a74ccfac5
3 changed files with 35 additions and 63 deletions
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -284,10 +284,43 @@ 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,
|
||||
|
|
Loading…
Reference in a new issue