drm/vmwgfx: Explicityly track screen target width and height
authorSinclair Yeh <syeh@vmware.com>
Thu, 23 Mar 2017 21:40:04 +0000 (14:40 -0700)
committerSinclair Yeh <syeh@vmware.com>
Fri, 31 Mar 2017 22:21:14 +0000 (15:21 -0700)
We can no longer make the assumption that vmw_stdu_update_st() will
be called when there's a valid display surface attached.  So
instead of using display_srf for width and height, make a record of
these paremeters when the screen target is first defined.

Signed-off-by: Sinclair Yeh <syeh@vmware.com>
Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c

index e5a38f4ddb62fab8ce6445f36bbd9dafce6295b8..2757cda391bbf2f852b49ef381d5b29e6ae9f6ae 100644 (file)
@@ -106,6 +106,7 @@ struct vmw_screen_target_display_unit {
        struct vmw_display_unit base;
        const struct vmw_surface *display_srf;
        enum stdu_content_type content_fb_type;
+       s32 display_width, display_height;
 
        bool defined;
 };
@@ -184,6 +185,8 @@ static int vmw_stdu_define_st(struct vmw_private *dev_priv,
        vmw_fifo_commit(dev_priv, sizeof(*cmd));
 
        stdu->defined = true;
+       stdu->display_width  = mode->hdisplay;
+       stdu->display_height = mode->vdisplay;
 
        return 0;
 }
@@ -281,7 +284,6 @@ static int vmw_stdu_update_st(struct vmw_private *dev_priv,
                              struct vmw_screen_target_display_unit *stdu)
 {
        struct vmw_stdu_update *cmd;
-       struct drm_crtc *crtc = &stdu->base.crtc;
 
        if (!stdu->defined) {
                DRM_ERROR("No screen target defined");
@@ -295,8 +297,9 @@ static int vmw_stdu_update_st(struct vmw_private *dev_priv,
                return -ENOMEM;
        }
 
-       vmw_stdu_populate_update(cmd, stdu->base.unit, 0, crtc->mode.hdisplay,
-                                0, crtc->mode.vdisplay);
+       vmw_stdu_populate_update(cmd, stdu->base.unit,
+                                0, stdu->display_width,
+                                0, stdu->display_height);
 
        vmw_fifo_commit(dev_priv, sizeof(*cmd));
 
@@ -346,6 +349,8 @@ static int vmw_stdu_destroy_st(struct vmw_private *dev_priv,
                DRM_ERROR("Failed to sync with HW");
 
        stdu->defined = false;
+       stdu->display_width  = 0;
+       stdu->display_height = 0;
 
        return ret;
 }