summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsyeh <sinclair.yeh@icloud.com>2014-09-29 17:21:34 -0700
committersyeh <sinclair.yeh@icloud.com>2014-09-29 17:21:34 -0700
commitc3881e1411900ddd8ecfa62b748ea9780f096c0a (patch)
treeb56d32d0eff888f9c79750d7362a33d3f2c51e82
parent760e8d737c5bc0b90e636c43934b8719a06a5bb3 (diff)
drm/vmwgfx: Filter out modes those cannot be supported by the current VRAM size.
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>
-rw-r--r--vmwgfx_drv.c6
-rw-r--r--vmwgfx_kms.c16
2 files changed, 18 insertions, 4 deletions
diff --git a/vmwgfx_drv.c b/vmwgfx_drv.c
index 7021372..7128be9 100644
--- a/vmwgfx_drv.c
+++ b/vmwgfx_drv.c
@@ -671,7 +671,11 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
} else
dev_priv->prim_bb_mem = dev_priv->vram_size;
- 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);
diff --git a/vmwgfx_kms.c b/vmwgfx_kms.c
index c59665e..62673a0 100644
--- a/vmwgfx_kms.c
+++ b/vmwgfx_kms.c
@@ -1899,6 +1899,14 @@ int vmw_du_connector_fill_modes(struct drm_connector *connector,
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 */
{
@@ -1909,8 +1917,9 @@ int vmw_du_connector_fill_modes(struct drm_connector *connector,
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);
@@ -1932,7 +1941,8 @@ int vmw_du_connector_fill_modes(struct drm_connector *connector,
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;