]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/vmwgfx: Restore Guest-Backed only cursor plane support
authorIan Forbes <ian.forbes@broadcom.com>
Mon, 3 Nov 2025 20:19:20 +0000 (14:19 -0600)
committerZack Rusin <zack.rusin@broadcom.com>
Fri, 7 Nov 2025 05:01:15 +0000 (00:01 -0500)
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 <ian.forbes@broadcom.com>
Signed-off-by: Zack Rusin <zack.rusin@broadcom.com>
Link: https://patch.msgid.link/20251103201920.381503-1-ian.forbes@broadcom.com
drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.c
drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.h

index 718832b08d96e82beba1d5046a77fd61ad67b50a..c46f17ba7236dedfa900dc0f5eae1f6173a2cd68 100644 (file)
@@ -100,8 +100,10 @@ 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;
        }
-
+       drm_warn_once(&vmw->drm, "Unknown Cursor Type!\n");
        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) {
@@ -737,6 +741,7 @@ void
 vmw_cursor_plane_atomic_update(struct drm_plane *plane,
                               struct drm_atomic_state *state)
 {
+       struct vmw_bo *bo;
        struct drm_plane_state *new_state =
                drm_atomic_get_new_plane_state(state, plane);
        struct drm_plane_state *old_state =
@@ -762,6 +767,15 @@ 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:
+               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;
index 40694925a70e6abbe271def0ba0596eb1c75775a..0c2cc0699b0d93cae6daba578d93d28a2d46c9fd 100644 (file)
@@ -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,
 };