drm/vmwgfx: Add and connect atomic state object check/commit
authorSinclair Yeh <syeh@vmware.com>
Thu, 23 Mar 2017 21:24:53 +0000 (14:24 -0700)
committerSinclair Yeh <syeh@vmware.com>
Fri, 31 Mar 2017 22:21:02 +0000 (15:21 -0700)
This connects the main state object check and commit function.

v2
* Use drm_atomic_helper_commit() rather than a vmwgfx-specific one

Signed-off-by: Sinclair Yeh <syeh@vmware.com>
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
Acked-by: Daniel Vetter <daniel@ffwll.ch>
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c

index 0644b71..1071e10 100644 (file)
@@ -1579,8 +1579,56 @@ err_out:
        return &vfb->base;
 }
 
+
+
+/**
+ * vmw_kms_atomic_check_modeset- validate state object for modeset changes
+ *
+ * @dev: DRM device
+ * @state: the driver state object
+ *
+ * This is a simple wrapper around drm_atomic_helper_check_modeset() for
+ * us to assign a value to mode->crtc_clock so that
+ * drm_calc_timestamping_constants() won't throw an error message
+ *
+ * RETURNS
+ * Zero for success or -errno
+ */
+int
+vmw_kms_atomic_check_modeset(struct drm_device *dev,
+                            struct drm_atomic_state *state)
+{
+       struct drm_crtc_state *crtc_state;
+       struct drm_crtc *crtc;
+       struct vmw_private *dev_priv = vmw_priv(dev);
+       int i;
+
+
+       for_each_crtc_in_state(state, crtc, crtc_state, i) {
+               unsigned long requested_bb_mem = 0;
+
+               if (dev_priv->active_display_unit == vmw_du_screen_target) {
+                       if (crtc->primary->fb) {
+                               int cpp = crtc->primary->fb->pitches[0] /
+                                         crtc->primary->fb->width;
+
+                               requested_bb_mem += crtc->mode.hdisplay * cpp *
+                                                   crtc->mode.vdisplay;
+                       }
+
+                       if (requested_bb_mem > dev_priv->prim_bb_mem)
+                               return -EINVAL;
+               }
+       }
+
+       return drm_atomic_helper_check(dev, state);
+}
+
+
 static const struct drm_mode_config_funcs vmw_kms_funcs = {
        .fb_create = vmw_kms_fb_create,
+       .atomic_check = vmw_kms_atomic_check_modeset,
+       .atomic_commit = drm_atomic_helper_commit,
 };
 
 static int vmw_kms_generic_present(struct vmw_private *dev_priv,