aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Hellstrom <thellstrom@vmware.com>2018-05-23 10:14:54 -0400
committerThomas Hellstrom <thellstrom@vmware.com>2018-05-23 10:52:55 -0400
commit6a93cea15ed38e2dba4a0552483d28b7a87a03bd (patch)
tree7b9b63367aa8a37d097ebff652b7ed01f5e0697e
parentf37230c0ad481091bc136788ff8b37dc86300c6d (diff)
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: Thomas Hellstrom <thellstrom@vmware.com> Reviewed-by: Brian Paul <brianp@vmware.com> Reviewed-by: Deepak Rawat <drawat@vmware.com>
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.c5
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.h1
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_fb.c22
3 files changed, 7 insertions, 21 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 70e1a8820a7c..8b770a8e02cd 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -1278,8 +1278,6 @@ static void vmw_master_drop(struct drm_device *dev,
1278 dev_priv->active_master = &dev_priv->fbdev_master; 1278 dev_priv->active_master = &dev_priv->fbdev_master;
1279 ttm_lock_set_kill(&dev_priv->fbdev_master.lock, false, SIGTERM); 1279 ttm_lock_set_kill(&dev_priv->fbdev_master.lock, false, SIGTERM);
1280 ttm_vt_unlock(&dev_priv->fbdev_master.lock); 1280 ttm_vt_unlock(&dev_priv->fbdev_master.lock);
1281
1282 vmw_fb_refresh(dev_priv);
1283} 1281}
1284 1282
1285/** 1283/**
@@ -1483,7 +1481,6 @@ static int vmw_pm_freeze(struct device *kdev)
1483 vmw_kms_resume(dev); 1481 vmw_kms_resume(dev);
1484 if (dev_priv->enable_fb) 1482 if (dev_priv->enable_fb)
1485 vmw_fb_on(dev_priv); 1483 vmw_fb_on(dev_priv);
1486 vmw_fb_refresh(dev_priv);
1487 return -EBUSY; 1484 return -EBUSY;
1488 } 1485 }
1489 1486
@@ -1523,8 +1520,6 @@ static int vmw_pm_restore(struct device *kdev)
1523 if (dev_priv->enable_fb) 1520 if (dev_priv->enable_fb)
1524 vmw_fb_on(dev_priv); 1521 vmw_fb_on(dev_priv);
1525 1522
1526 vmw_fb_refresh(dev_priv);
1527
1528 return 0; 1523 return 0;
1529} 1524}
1530 1525
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
index f34f368c1a2e..5fcbe1620d50 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
@@ -910,7 +910,6 @@ int vmw_fb_init(struct vmw_private *vmw_priv);
910int vmw_fb_close(struct vmw_private *dev_priv); 910int vmw_fb_close(struct vmw_private *dev_priv);
911int vmw_fb_off(struct vmw_private *vmw_priv); 911int vmw_fb_off(struct vmw_private *vmw_priv);
912int vmw_fb_on(struct vmw_private *vmw_priv); 912int vmw_fb_on(struct vmw_private *vmw_priv);
913void vmw_fb_refresh(struct vmw_private *vmw_priv);
914 913
915/** 914/**
916 * Kernel modesetting - vmwgfx_kms.c 915 * Kernel modesetting - vmwgfx_kms.c
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
index ba0cdb743c3e..54e300365a5c 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
@@ -866,21 +866,13 @@ int vmw_fb_on(struct vmw_private *vmw_priv)
866 spin_lock_irqsave(&par->dirty.lock, flags); 866 spin_lock_irqsave(&par->dirty.lock, flags);
867 par->dirty.active = true; 867 par->dirty.active = true;
868 spin_unlock_irqrestore(&par->dirty.lock, flags); 868 spin_unlock_irqrestore(&par->dirty.lock, flags);
869
870 return 0;
871}
872 869
873/** 870 /*
874 * vmw_fb_refresh - Refresh fb display 871 * Need to reschedule a dirty update, because otherwise that's
875 * 872 * only done in dirty_mark() if the previous coalesced
876 * @vmw_priv: Pointer to device private 873 * dirty region was empty.
877 * 874 */
878 * Call into kms to show the fbdev display(s). 875 schedule_delayed_work(&par->local_work, 0);
879 */
880void vmw_fb_refresh(struct vmw_private *vmw_priv)
881{
882 if (!vmw_priv->fb_info)
883 return;
884 876
885 vmw_fb_set_par(vmw_priv->fb_info); 877 return 0;
886} 878}