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

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
...@@ -1278,8 +1278,6 @@ static void vmw_master_drop(struct drm_device *dev, ...@@ -1278,8 +1278,6 @@ static void vmw_master_drop(struct drm_device *dev,
dev_priv->active_master = &dev_priv->fbdev_master; dev_priv->active_master = &dev_priv->fbdev_master;
ttm_lock_set_kill(&dev_priv->fbdev_master.lock, false, SIGTERM); ttm_lock_set_kill(&dev_priv->fbdev_master.lock, false, SIGTERM);
ttm_vt_unlock(&dev_priv->fbdev_master.lock); 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) ...@@ -1483,7 +1481,6 @@ static int vmw_pm_freeze(struct device *kdev)
vmw_kms_resume(dev); vmw_kms_resume(dev);
if (dev_priv->enable_fb) if (dev_priv->enable_fb)
vmw_fb_on(dev_priv); vmw_fb_on(dev_priv);
vmw_fb_refresh(dev_priv);
return -EBUSY; return -EBUSY;
} }
...@@ -1523,8 +1520,6 @@ static int vmw_pm_restore(struct device *kdev) ...@@ -1523,8 +1520,6 @@ static int vmw_pm_restore(struct device *kdev)
if (dev_priv->enable_fb) if (dev_priv->enable_fb)
vmw_fb_on(dev_priv); vmw_fb_on(dev_priv);
vmw_fb_refresh(dev_priv);
return 0; return 0;
} }
......
...@@ -910,7 +910,6 @@ int vmw_fb_init(struct vmw_private *vmw_priv); ...@@ -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_close(struct vmw_private *dev_priv);
int vmw_fb_off(struct vmw_private *vmw_priv); int vmw_fb_off(struct vmw_private *vmw_priv);
int vmw_fb_on(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 * Kernel modesetting - vmwgfx_kms.c
......
...@@ -866,21 +866,13 @@ int vmw_fb_on(struct vmw_private *vmw_priv) ...@@ -866,21 +866,13 @@ int vmw_fb_on(struct vmw_private *vmw_priv)
spin_lock_irqsave(&par->dirty.lock, flags); spin_lock_irqsave(&par->dirty.lock, flags);
par->dirty.active = true; par->dirty.active = true;
spin_unlock_irqrestore(&par->dirty.lock, flags); spin_unlock_irqrestore(&par->dirty.lock, flags);
return 0;
}
/** /*
* vmw_fb_refresh - Refresh fb display * Need to reschedule a dirty update, because otherwise that's
* * only done in dirty_mark() if the previous coalesced
* @vmw_priv: Pointer to device private * dirty region was empty.
* */
* Call into kms to show the fbdev display(s). schedule_delayed_work(&par->local_work, 0);
*/
void vmw_fb_refresh(struct vmw_private *vmw_priv)
{
if (!vmw_priv->fb_info)
return;
vmw_fb_set_par(vmw_priv->fb_info); return 0;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment