vmwgfx: Print error diagnostics if depth doesn't match the host expectation
authorMichel Dänzer <daenzer@vmware.com>
Wed, 31 Aug 2011 07:42:50 +0000 (07:42 +0000)
committerDave Airlie <airlied@redhat.com>
Thu, 1 Sep 2011 08:37:49 +0000 (09:37 +0100)
Signed-off-by: Michel Dänzer <daenzer@vmware.com>
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c

index 0c24347..fc33f3f 100644 (file)
@@ -503,9 +503,9 @@ void vmw_kms_cursor_snoop(struct vmw_surface *srf,
                          struct ttm_object_file *tfile,
                          struct ttm_buffer_object *bo,
                          SVGA3dCmdHeader *header);
-void vmw_kms_write_svga(struct vmw_private *vmw_priv,
-                       unsigned width, unsigned height, unsigned pitch,
-                       unsigned bpp, unsigned depth);
+int vmw_kms_write_svga(struct vmw_private *vmw_priv,
+                      unsigned width, unsigned height, unsigned pitch,
+                      unsigned bpp, unsigned depth);
 int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data,
                                struct drm_file *file_priv);
 void vmw_kms_idle_workqueues(struct vmw_master *vmaster);
index 5fb80b1..b1888e8 100644 (file)
@@ -158,10 +158,14 @@ static int vmw_fb_set_par(struct fb_info *info)
 {
        struct vmw_fb_par *par = info->par;
        struct vmw_private *vmw_priv = par->vmw_priv;
+       int ret;
+
+       ret = vmw_kms_write_svga(vmw_priv, info->var.xres, info->var.yres,
+                                info->fix.line_length,
+                                par->bpp, par->depth);
+       if (ret)
+               return ret;
 
-       vmw_kms_write_svga(vmw_priv, info->var.xres, info->var.yres,
-                          info->fix.line_length,
-                          par->bpp, par->depth);
        if (vmw_priv->capabilities & SVGA_CAP_DISPLAY_TOPOLOGY) {
                /* TODO check if pitch and offset changes */
                vmw_write(vmw_priv, SVGA_REG_NUM_GUEST_DISPLAYS, 1);
index be8163b..9ea2f05 100644 (file)
@@ -990,7 +990,7 @@ out:
        return ret;
 }
 
-void vmw_kms_write_svga(struct vmw_private *vmw_priv,
+int vmw_kms_write_svga(struct vmw_private *vmw_priv,
                        unsigned width, unsigned height, unsigned pitch,
                        unsigned bpp, unsigned depth)
 {
@@ -1001,6 +1001,14 @@ void vmw_kms_write_svga(struct vmw_private *vmw_priv,
        vmw_write(vmw_priv, SVGA_REG_WIDTH, width);
        vmw_write(vmw_priv, SVGA_REG_HEIGHT, height);
        vmw_write(vmw_priv, SVGA_REG_BITS_PER_PIXEL, bpp);
+
+       if (vmw_read(vmw_priv, SVGA_REG_DEPTH) != depth) {
+               DRM_ERROR("Invalid depth %u for %u bpp, host expects %u\n",
+                         depth, bpp, vmw_read(vmw_priv, SVGA_REG_DEPTH));
+               return -EINVAL;
+       }
+
+       return 0;
 }
 
 int vmw_kms_save_vga(struct vmw_private *vmw_priv)
index c6d09a6..7e1901c 100644 (file)
@@ -123,10 +123,8 @@ static int vmw_ldu_commit_list(struct vmw_private *dev_priv)
                        return 0;
                fb = entry->base.crtc.fb;
 
-               vmw_kms_write_svga(dev_priv, w, h, fb->pitch,
-                                  fb->bits_per_pixel, fb->depth);
-
-               return 0;
+               return vmw_kms_write_svga(dev_priv, w, h, fb->pitch,
+                                         fb->bits_per_pixel, fb->depth);
        }
 
        if (!list_empty(&lds->active)) {
@@ -274,9 +272,7 @@ static int vmw_ldu_crtc_set_config(struct drm_mode_set *set)
 
                vmw_ldu_del_active(dev_priv, ldu);
 
-               vmw_ldu_commit_list(dev_priv);
-
-               return 0;
+               return vmw_ldu_commit_list(dev_priv);
        }
 
 
@@ -301,9 +297,7 @@ static int vmw_ldu_crtc_set_config(struct drm_mode_set *set)
 
        vmw_ldu_add_active(dev_priv, ldu, vfb);
 
-       vmw_ldu_commit_list(dev_priv);
-
-       return 0;
+       return vmw_ldu_commit_list(dev_priv);
 }
 
 static struct drm_crtc_funcs vmw_legacy_crtc_funcs = {