Re: [PATCH v4] drm/vmwgfx: Treat zero SVGA_REG_CURSOR_MAX_DIMENSION as unset
From: Maaz Mombasawala
Date: Wed Sep 02 2026 - 16:45:22 EST
On 8/30/26 8:16 AM, fausten wrote:
> The cursor plane code validates cursor dimensions against
> SVGA_REG_CURSOR_MAX_DIMENSION before every cursor update, and
> rejects the update with -EINVAL if the cursor is larger than the
> reported maximum.
>
> However, this register is only available on hardware versions 18
> and above, which introduced cursor MOBs. Older hardware (e.g. a
> VMware Fusion guest with SVGA version 2) returns 0 for it.
> In that case every cursor update is rejected,
> and the log is spammed with:
>
> [drm] Cursor dimensions (64, 64) exceed device max 0
>
> The visible symptom is that the hardware cursor never appears at
> all on VMware Fusion guests (SVGA version 2), making the mouse
> pointer invisible even though the input devices work fine.
>
> Treat a reported maximum of 0 as "not implemented" and skip the
> dimension check in that case, restoring the pre-existing behaviour
> of accepting the cursor.
>
> Tested on VMware Fusion with an SVGA version 2 device where the
> cursor previously did not show up.
>
> Fixes: d5ed8749168a ("drm/vmwgfx: enforce cursor size limits for MOB cursors")
> Signed-off-by: Yunfeng Li <yunfeng.li.nb@xxxxxxxxx>
> ---
> drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.c | 12 ++++++++----
> 1 file changed, 8 insertions(+), 4 deletions(-)
>
> ---
> Changes in v3:
> - Use an explicit cursor_max_dim > 0 comparison (Maaz).
> - Fix the comments: the register requires cursor MOBs which exist
> only on hw version 18 and above; it is not Fusion-specific
> (Maaz).
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.c b/drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.c
> index d1e7df500..3d4660684 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.c
> @@ -237,8 +237,10 @@ static int vmw_cursor_mob_get(struct vmw_cursor_plane *vcp,
> mob_max_size = vmw_read(dev_priv, SVGA_REG_MOB_MAX_SIZE);
> cursor_max_dim = vmw_read(dev_priv, SVGA_REG_CURSOR_MAX_DIMENSION);
>
> - if (size > mob_max_size || vps->base.crtc_w > cursor_max_dim ||
> - vps->base.crtc_h > cursor_max_dim)
> + /* Cursor MOBs, and thus this register, exist only on hw version 18+. */
> + if (cursor_max_dim > 0 &&
> + (size > mob_max_size || vps->base.crtc_w > cursor_max_dim ||
> + vps->base.crtc_h > cursor_max_dim))
> return -EINVAL;
>
> if (vps->cursor.mob) {
> @@ -748,8 +750,10 @@ int vmw_cursor_plane_atomic_check(struct drm_plane *plane,
> u32 cursor_max_dim =
> vmw_read(vmw, SVGA_REG_CURSOR_MAX_DIMENSION);
>
> - if (new_state->crtc_w > cursor_max_dim ||
> - new_state->crtc_h > cursor_max_dim) {
> + /* Cursor MOBs, and thus this register, exist only on hw version 18+. */
> + if (cursor_max_dim > 0 &&
> + (new_state->crtc_w > cursor_max_dim ||
> + new_state->crtc_h > cursor_max_dim)) {
> drm_warn(&vmw->drm,
> "Cursor dimensions (%d, %d) exceed device max %u\n",
> new_state->crtc_w, new_state->crtc_h,
This patch bricked my testing VM, investigating..
--
Maaz Mombasawala <maaz.mombasawala@xxxxxxxxxxxx>