| From 04319d89fbec72dfd60738003c3813b97c1d5f5a Mon Sep 17 00:00:00 2001 |
| From: Sinclair Yeh <syeh@vmware.com> |
| Date: Wed, 29 Jun 2016 12:15:48 -0700 |
| Subject: drm/vmwgfx: Add an option to change assumed FB bpp |
| |
| From: Sinclair Yeh <syeh@vmware.com> |
| |
| commit 04319d89fbec72dfd60738003c3813b97c1d5f5a upstream. |
| |
| Offer an option for advanced users who want larger modes at 16bpp. |
| |
| This becomes necessary after the fix: "Work around mode set |
| failure in 2D VMs." Without this patch, there would be no way |
| for existing advanced users to get to a high res mode, and the |
| regression is they will likely get a black screen after a software |
| update on their current VM. |
| |
| Signed-off-by: Sinclair Yeh <syeh@vmware.com> |
| Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 5 +++++ |
| drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 1 + |
| drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 3 +++ |
| 3 files changed, 9 insertions(+) |
| |
| --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c |
| +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c |
| @@ -227,6 +227,7 @@ static int vmw_force_iommu; |
| static int vmw_restrict_iommu; |
| static int vmw_force_coherent; |
| static int vmw_restrict_dma_mask; |
| +static int vmw_assume_16bpp; |
| |
| static int vmw_probe(struct pci_dev *, const struct pci_device_id *); |
| static void vmw_master_init(struct vmw_master *); |
| @@ -243,6 +244,8 @@ MODULE_PARM_DESC(force_coherent, "Force |
| module_param_named(force_coherent, vmw_force_coherent, int, 0600); |
| MODULE_PARM_DESC(restrict_dma_mask, "Restrict DMA mask to 44 bits with IOMMU"); |
| module_param_named(restrict_dma_mask, vmw_restrict_dma_mask, int, 0600); |
| +MODULE_PARM_DESC(assume_16bpp, "Assume 16-bpp when filtering modes"); |
| +module_param_named(assume_16bpp, vmw_assume_16bpp, int, 0600); |
| |
| |
| static void vmw_print_capabilities(uint32_t capabilities) |
| @@ -652,6 +655,8 @@ static int vmw_driver_load(struct drm_de |
| dev_priv->vram_start = pci_resource_start(dev->pdev, 1); |
| dev_priv->mmio_start = pci_resource_start(dev->pdev, 2); |
| |
| + dev_priv->assume_16bpp = !!vmw_assume_16bpp; |
| + |
| dev_priv->enable_fb = enable_fbdev; |
| |
| vmw_write(dev_priv, SVGA_REG_ID, SVGA_ID_2); |
| --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h |
| +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h |
| @@ -387,6 +387,7 @@ struct vmw_private { |
| spinlock_t hw_lock; |
| spinlock_t cap_lock; |
| bool has_dx; |
| + bool assume_16bpp; |
| |
| /* |
| * VGA registers. |
| --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c |
| +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c |
| @@ -1547,6 +1547,9 @@ int vmw_du_connector_fill_modes(struct d |
| if (dev_priv->active_display_unit == vmw_du_screen_object) |
| assumed_bpp = 4; |
| |
| + if (dev_priv->assume_16bpp) |
| + assumed_bpp = 2; |
| + |
| if (dev_priv->active_display_unit == vmw_du_screen_target) { |
| max_width = min(max_width, dev_priv->stdu_max_width); |
| max_height = min(max_height, dev_priv->stdu_max_height); |