Commit eef295a8 authored by Ian Forbes's avatar Ian Forbes Committed by Zack Rusin
Browse files

drm/vmwgfx: Restore Guest-Backed only cursor plane support



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

Fixes: 96554415 ("drm/vmwgfx: Refactor cursor handling")
Signed-off-by: default avatarIan Forbes <ian.forbes@broadcom.com>
Signed-off-by: default avatarZack Rusin <zack.rusin@broadcom.com>
Link: https://patch.msgid.link/20251103201920.381503-1-ian.forbes@broadcom.com
parent c1962742
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -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;
+1 −0
Original line number Diff line number Diff line
@@ -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,
};