On 8/23/26 1:59 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, some SVGA implementations do not implement this register
> and return 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.

I take it this is an x86_64 mac? What version of fusion are you using?
Also what is the hwVersion of your VM?

> 
> Fixes: d5ed8749168a ("drm/vmwgfx: enforce cursor size limits for MOB cursors")
> Signed-off-by: fausten <[email protected]>
> ---
> Changes in v2:
> - Fix author name and email address (v1 was sent with a wrong From).
> 
>  drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.c | 12 ++++++++----
>  1 file changed, 8 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.c 
> b/drivers/gpu/drm/vmwgfx/vmwgfx_cursor_plane.c
> index d1e7df500..fbdd23ecb 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)
> +     /* Some SVGA implementations (e.g. VMware Fusion) report 0 here. */
> +     if (cursor_max_dim &&
> +         (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) {
> +             /* Some SVGA implementations (e.g. VMware Fusion) report 0 
> here. */
> +             if (cursor_max_dim &&
> +                 (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,


-- 
Maaz Mombasawala <[email protected]>

Reply via email to