Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6a93cea1 authored by Thomas Hellstrom's avatar Thomas Hellstrom
Browse files

drm/vmwgfx: Schedule an fb dirty update after resume



We have had problems displaying fbdev after a resume and as a
workaround we have had to call vmw_fb_refresh(). This has had
a number of unwanted side-effects. The root of the problem was,
however that the coalesced fbdev dirty region was not empty on
the first dirty_mark() after a resume, so a flush was never
scheduled.

Fix this by force scheduling an fbdev flush after resume, and
remove the workaround.

Signed-off-by: default avatarThomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: default avatarBrian Paul <brianp@vmware.com>
Reviewed-by: default avatarDeepak Rawat <drawat@vmware.com>
parent f37230c0
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -1278,8 +1278,6 @@ static void vmw_master_drop(struct drm_device *dev,
	dev_priv->active_master = &dev_priv->fbdev_master;
	ttm_lock_set_kill(&dev_priv->fbdev_master.lock, false, SIGTERM);
	ttm_vt_unlock(&dev_priv->fbdev_master.lock);

	vmw_fb_refresh(dev_priv);
}

/**
@@ -1483,7 +1481,6 @@ static int vmw_pm_freeze(struct device *kdev)
			vmw_kms_resume(dev);
		if (dev_priv->enable_fb)
			vmw_fb_on(dev_priv);
		vmw_fb_refresh(dev_priv);
		return -EBUSY;
	}

@@ -1523,8 +1520,6 @@ static int vmw_pm_restore(struct device *kdev)
	if (dev_priv->enable_fb)
		vmw_fb_on(dev_priv);

	vmw_fb_refresh(dev_priv);

	return 0;
}

+0 −1
Original line number Diff line number Diff line
@@ -910,7 +910,6 @@ int vmw_fb_init(struct vmw_private *vmw_priv);
int vmw_fb_close(struct vmw_private *dev_priv);
int vmw_fb_off(struct vmw_private *vmw_priv);
int vmw_fb_on(struct vmw_private *vmw_priv);
void vmw_fb_refresh(struct vmw_private *vmw_priv);

/**
 * Kernel modesetting - vmwgfx_kms.c
+7 −15
Original line number Diff line number Diff line
@@ -867,20 +867,12 @@ int vmw_fb_on(struct vmw_private *vmw_priv)
	par->dirty.active = true;
	spin_unlock_irqrestore(&par->dirty.lock, flags);

	return 0;
}

/**
 * vmw_fb_refresh - Refresh fb display
 *
 * @vmw_priv: Pointer to device private
 *
 * Call into kms to show the fbdev display(s).
	/*
	 * Need to reschedule a dirty update, because otherwise that's
	 * only done in dirty_mark() if the previous coalesced
	 * dirty region was empty.
	 */
void vmw_fb_refresh(struct vmw_private *vmw_priv)
{
	if (!vmw_priv->fb_info)
		return;
	schedule_delayed_work(&par->local_work, 0);

	vmw_fb_set_par(vmw_priv->fb_info);
	return 0;
}