| From 9a72384d86b26cb8a2b25106677e1197f606668f Mon Sep 17 00:00:00 2001 |
| From: Sinclair Yeh <syeh@vmware.com> |
| Date: Fri, 31 Oct 2014 09:58:06 +0100 |
| Subject: drm/vmwgfx: Filter out modes those cannot be supported by the current VRAM size. |
| |
| From: Sinclair Yeh <syeh@vmware.com> |
| |
| commit 9a72384d86b26cb8a2b25106677e1197f606668f upstream. |
| |
| When screen objects are enabled, the bpp is assumed to be 32, otherwise |
| it is set to 16. |
| |
| v2: |
| * Use u32 instead of u64 for assumed_bpp. |
| * Fixed mechanism to check for screen objects |
| * Limit the back buffer size to VRAM. |
| |
| 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 | 6 +++++- |
| drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 16 +++++++++++++--- |
| 2 files changed, 18 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c |
| +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c |
| @@ -688,7 +688,11 @@ static int vmw_driver_load(struct drm_de |
| goto out_err0; |
| } |
| |
| - if (unlikely(dev_priv->prim_bb_mem < dev_priv->vram_size)) |
| + /* |
| + * Limit back buffer size to VRAM size. Remove this once |
| + * screen targets are implemented. |
| + */ |
| + if (dev_priv->prim_bb_mem > dev_priv->vram_size) |
| dev_priv->prim_bb_mem = dev_priv->vram_size; |
| |
| mutex_unlock(&dev_priv->hw_mutex); |
| --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c |
| +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c |
| @@ -1950,6 +1950,14 @@ int vmw_du_connector_fill_modes(struct d |
| DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) |
| }; |
| int i; |
| + u32 assumed_bpp = 2; |
| + |
| + /* |
| + * If using screen objects, then assume 32-bpp because that's what the |
| + * SVGA device is assuming |
| + */ |
| + if (dev_priv->sou_priv) |
| + assumed_bpp = 4; |
| |
| /* Add preferred mode */ |
| { |
| @@ -1960,8 +1968,9 @@ int vmw_du_connector_fill_modes(struct d |
| mode->vdisplay = du->pref_height; |
| vmw_guess_mode_timing(mode); |
| |
| - if (vmw_kms_validate_mode_vram(dev_priv, mode->hdisplay * 2, |
| - mode->vdisplay)) { |
| + if (vmw_kms_validate_mode_vram(dev_priv, |
| + mode->hdisplay * assumed_bpp, |
| + mode->vdisplay)) { |
| drm_mode_probed_add(connector, mode); |
| } else { |
| drm_mode_destroy(dev, mode); |
| @@ -1983,7 +1992,8 @@ int vmw_du_connector_fill_modes(struct d |
| bmode->vdisplay > max_height) |
| continue; |
| |
| - if (!vmw_kms_validate_mode_vram(dev_priv, bmode->hdisplay * 2, |
| + if (!vmw_kms_validate_mode_vram(dev_priv, |
| + bmode->hdisplay * assumed_bpp, |
| bmode->vdisplay)) |
| continue; |
| |