The referenced fixes commit broke the cursor plane for configurations
which have Guest-Backed surfaces but no cursor MOB support.

Fixes: 965544150d1c ("drm/vmwgfx: Refactor cursor handling")
Signed-off-by: Ian Forbes <[email protected]>
---
 drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.c | 14 ++++++++++++++
 drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.h |  1 +
 2 files changed, 15 insertions(+)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.c
index 718832b08d96..87f0f61e470c 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.c
@@ -100,6 +100,8 @@ vmw_cursor_update_type(struct vmw_private *vmw, struct 
vmw_plane_state *vps)
        if (vmw->has_mob) {
                if ((vmw->capabilities2 & SVGA_CAP2_CURSOR_MOB) != 0)
                        return VMW_CURSOR_UPDATE_MOB;
+               else
+                       return VMW_CURSOR_UPDATE_GB_ONLY;
        }
 
        return VMW_CURSOR_UPDATE_NONE;
@@ -139,6 +141,7 @@ static u32 vmw_cursor_mob_size(enum vmw_cursor_update_type 
update_type,
 {
        switch (update_type) {
        case VMW_CURSOR_UPDATE_LEGACY:
+       case VMW_CURSOR_UPDATE_GB_ONLY:
        case VMW_CURSOR_UPDATE_NONE:
                return 0;
        case VMW_CURSOR_UPDATE_MOB:
@@ -623,6 +626,7 @@ int vmw_cursor_plane_prepare_fb(struct drm_plane *plane,
                if (!surface || vps->cursor.legacy.id == surface->snooper.id)
                        vps->cursor.update_type = VMW_CURSOR_UPDATE_NONE;
                break;
+       case VMW_CURSOR_UPDATE_GB_ONLY:
        case VMW_CURSOR_UPDATE_MOB: {
                bo = vmw_user_object_buffer(&vps->uo);
                if (bo) {
@@ -762,6 +766,16 @@ vmw_cursor_plane_atomic_update(struct drm_plane *plane,
        case VMW_CURSOR_UPDATE_MOB:
                vmw_cursor_update_mob(dev_priv, vps);
                break;
+       case VMW_CURSOR_UPDATE_GB_ONLY:
+               struct vmw_bo *bo = vmw_user_object_buffer(&vps->uo);
+
+               if (bo)
+                       vmw_send_define_cursor_cmd(dev_priv, bo->map.virtual,
+                                                  vps->base.crtc_w,
+                                                  vps->base.crtc_h,
+                                                  vps->base.hotspot_x,
+                                                  vps->base.hotspot_y);
+               break;
        case VMW_CURSOR_UPDATE_NONE:
                /* do nothing */
                break;
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.h 
b/drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.h
index 40694925a70e..0c2cc0699b0d 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.h
@@ -33,6 +33,7 @@ static const u32 __maybe_unused vmw_cursor_plane_formats[] = {
 enum vmw_cursor_update_type {
        VMW_CURSOR_UPDATE_NONE = 0,
        VMW_CURSOR_UPDATE_LEGACY,
+       VMW_CURSOR_UPDATE_GB_ONLY,
        VMW_CURSOR_UPDATE_MOB,
 };
 
-- 
2.51.0

Reply via email to