Skip to content

Commit

Permalink
drm/vmwgfx: Treat out-of-range initial width and height as host errors
Browse files Browse the repository at this point in the history
And assign the initial width and height to the minimum in that case.
Strange values (-1) from these registers have been reported by users.

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
  • Loading branch information
Thomas Hellstrom authored and Dave Airlie committed Feb 13, 2012
1 parent eb4f923 commit 67d4a87
Showing 1 changed file with 14 additions and 4 deletions.
18 changes: 14 additions & 4 deletions drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,9 @@ void vmw_3d_resource_dec(struct vmw_private *dev_priv,
* Sets the initial_[width|height] fields on the given vmw_private.
*
* It does so by reading SVGA_REG_[WIDTH|HEIGHT] regs and then
* capping the value to fb_max_[width|height] fields and the
* clamping the value to fb_max_[width|height] fields and the
* VMW_MIN_INITIAL_[WIDTH|HEIGHT].
* If the values appear to be invalid, set them to
* VMW_MIN_INITIAL_[WIDTH|HEIGHT].
*/
static void vmw_get_initial_size(struct vmw_private *dev_priv)
Expand All @@ -407,10 +409,18 @@ static void vmw_get_initial_size(struct vmw_private *dev_priv)
height = vmw_read(dev_priv, SVGA_REG_HEIGHT);

width = max_t(uint32_t, width, VMW_MIN_INITIAL_WIDTH);
width = min_t(uint32_t, width, dev_priv->fb_max_width);

height = max_t(uint32_t, height, VMW_MIN_INITIAL_HEIGHT);
height = min_t(uint32_t, height, dev_priv->fb_max_height);

if (width > dev_priv->fb_max_width ||
height > dev_priv->fb_max_height) {

/*
* This is a host error and shouldn't occur.
*/

width = VMW_MIN_INITIAL_WIDTH;
height = VMW_MIN_INITIAL_HEIGHT;
}

dev_priv->initial_width = width;
dev_priv->initial_height = height;
Expand Down

0 comments on commit 67d4a87

Please sign in to comment.