diff options
author | Thomas Hellstrom <thellstrom@vmware.com> | 2018-05-23 10:14:54 -0400 |
---|---|---|
committer | Thomas Hellstrom <thellstrom@vmware.com> | 2018-05-23 10:52:55 -0400 |
commit | 6a93cea15ed38e2dba4a0552483d28b7a87a03bd (patch) | |
tree | 7b9b63367aa8a37d097ebff652b7ed01f5e0697e | |
parent | f37230c0ad481091bc136788ff8b37dc86300c6d (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.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_fb.c | 22 |
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); | |||
910 | int vmw_fb_close(struct vmw_private *dev_priv); | 910 | int vmw_fb_close(struct vmw_private *dev_priv); |
911 | int vmw_fb_off(struct vmw_private *vmw_priv); | 911 | int vmw_fb_off(struct vmw_private *vmw_priv); |
912 | int vmw_fb_on(struct vmw_private *vmw_priv); | 912 | int vmw_fb_on(struct vmw_private *vmw_priv); |
913 | void 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 | */ | ||
880 | void 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 | } |