drm/i915: Return the real error code from intel_set_mode()
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 19 Dec 2012 16:08:43 +0000 (16:08 +0000)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 20 Dec 2012 20:09:55 +0000 (21:09 +0100)
Note: This patch also adds a little helper intel_crtc_restore_mode for
the common case where we do a full modeset but with the same
parameters, e.g. to undo bios damage or update a property.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>
[danvet: Added note.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_drv.h
drivers/gpu/drm/i915/intel_hdmi.c
drivers/gpu/drm/i915/intel_lvds.c
drivers/gpu/drm/i915/intel_sdvo.c
drivers/gpu/drm/i915/intel_tv.c

index f7f4ef17cbe40c65b0d2c83a66aec2e23fe65d0f..1464e472ce44ed28d32694a16d661d29c705c5e7 100644 (file)
@@ -6313,7 +6313,7 @@ bool intel_get_load_detect_pipe(struct drm_connector *connector,
                return false;
        }
 
-       if (!intel_set_mode(crtc, mode, 0, 0, fb)) {
+       if (intel_set_mode(crtc, mode, 0, 0, fb)) {
                DRM_DEBUG_KMS("failed to set mode on load-detect pipe\n");
                if (old->release_fb)
                        old->release_fb->funcs->destroy(old->release_fb);
@@ -7426,22 +7426,20 @@ intel_modeset_check_state(struct drm_device *dev)
        }
 }
 
-bool intel_set_mode(struct drm_crtc *crtc,
-                   struct drm_display_mode *mode,
-                   int x, int y, struct drm_framebuffer *fb)
+int intel_set_mode(struct drm_crtc *crtc,
+                  struct drm_display_mode *mode,
+                  int x, int y, struct drm_framebuffer *fb)
 {
        struct drm_device *dev = crtc->dev;
        drm_i915_private_t *dev_priv = dev->dev_private;
        struct drm_display_mode *adjusted_mode, *saved_mode, *saved_hwmode;
        struct intel_crtc *intel_crtc;
        unsigned disable_pipes, prepare_pipes, modeset_pipes;
-       bool ret = true;
+       int ret = 0;
 
        saved_mode = kmalloc(2 * sizeof(*saved_mode), GFP_KERNEL);
-       if (!saved_mode) {
-               DRM_ERROR("i915: Could not allocate saved display mode.\n");
-               return false;
-       }
+       if (!saved_mode)
+               return -ENOMEM;
        saved_hwmode = saved_mode + 1;
 
        intel_modeset_affected_pipes(crtc, &modeset_pipes,
@@ -7465,7 +7463,7 @@ bool intel_set_mode(struct drm_crtc *crtc,
        if (modeset_pipes) {
                adjusted_mode = intel_modeset_adjusted_mode(crtc, mode);
                if (IS_ERR(adjusted_mode)) {
-                       ret = false;
+                       ret = PTR_ERR(adjusted_mode);
                        goto out;
                }
        }
@@ -7492,11 +7490,11 @@ bool intel_set_mode(struct drm_crtc *crtc,
         * on the DPLL.
         */
        for_each_intel_crtc_masked(dev, modeset_pipes, intel_crtc) {
-               ret = !intel_crtc_mode_set(&intel_crtc->base,
-                                          mode, adjusted_mode,
-                                          x, y, fb);
-               if (!ret)
-                   goto done;
+               ret = intel_crtc_mode_set(&intel_crtc->base,
+                                         mode, adjusted_mode,
+                                         x, y, fb);
+               if (ret)
+                       goto done;
        }
 
        /* Now enable the clocks, plane, pipe, and connectors that we set up. */
@@ -7517,7 +7515,7 @@ bool intel_set_mode(struct drm_crtc *crtc,
        /* FIXME: add subpixel order */
 done:
        drm_mode_destroy(dev, adjusted_mode);
-       if (!ret && crtc->enabled) {
+       if (ret && crtc->enabled) {
                crtc->hwmode = *saved_hwmode;
                crtc->mode = *saved_mode;
        } else {
@@ -7529,6 +7527,11 @@ out:
        return ret;
 }
 
+void intel_crtc_restore_mode(struct drm_crtc *crtc)
+{
+       intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y, crtc->fb);
+}
+
 #undef for_each_intel_crtc_masked
 
 static void intel_set_config_free(struct intel_set_config *config)
@@ -7798,11 +7801,11 @@ static int intel_crtc_set_config(struct drm_mode_set *set)
                        drm_mode_debug_printmodeline(set->mode);
                }
 
-               if (!intel_set_mode(set->crtc, set->mode,
-                                   set->x, set->y, set->fb)) {
-                       DRM_ERROR("failed to set mode on [CRTC:%d]\n",
-                                 set->crtc->base.id);
-                       ret = -EINVAL;
+               ret = intel_set_mode(set->crtc, set->mode,
+                                    set->x, set->y, set->fb);
+               if (ret) {
+                       DRM_ERROR("failed to set mode on [CRTC:%d], err = %d\n",
+                                 set->crtc->base.id, ret);
                        goto fail;
                }
        } else if (config->fb_changed) {
@@ -7819,8 +7822,8 @@ fail:
 
        /* Try to restore the config */
        if (config->mode_changed &&
-           !intel_set_mode(save_set.crtc, save_set.mode,
-                           save_set.x, save_set.y, save_set.fb))
+           intel_set_mode(save_set.crtc, save_set.mode,
+                          save_set.x, save_set.y, save_set.fb))
                DRM_ERROR("failed to restore config after modeset failure\n");
 
 out_config:
@@ -8804,11 +8807,8 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,
        }
 
        if (force_restore) {
-               for_each_pipe(pipe) {
-                       crtc = to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
-                       intel_set_mode(&crtc->base, &crtc->base.mode,
-                                      crtc->base.x, crtc->base.y, crtc->base.fb);
-               }
+               for_each_pipe(pipe)
+                       intel_crtc_restore_mode(dev_priv->pipe_to_crtc_mapping[pipe]);
        } else {
                intel_modeset_update_staged_output_state(dev);
        }
index 2d3b2683239751877705048d20c39b355575bff1..1dd89d5fe51115a6ba2715ed153d323621852ab6 100644 (file)
@@ -2483,11 +2483,8 @@ intel_dp_set_property(struct drm_connector *connector,
        return -EINVAL;
 
 done:
-       if (intel_encoder->base.crtc) {
-               struct drm_crtc *crtc = intel_encoder->base.crtc;
-               intel_set_mode(crtc, &crtc->mode,
-                              crtc->x, crtc->y, crtc->fb);
-       }
+       if (intel_encoder->base.crtc)
+               intel_crtc_restore_mode(intel_encoder->base.crtc);
 
        return 0;
 }
index 53d4c8fec2a0b7eb467ab1b129c4709b1c6d7b87..116580b623dd232a5c6a6c27b5f5a88c97d3c1e6 100644 (file)
@@ -501,9 +501,10 @@ struct intel_set_config {
        bool mode_changed;
 };
 
-extern bool intel_set_mode(struct drm_crtc *crtc, struct drm_display_mode *mode,
-                          int x, int y, struct drm_framebuffer *old_fb);
+extern int intel_set_mode(struct drm_crtc *crtc, struct drm_display_mode *mode,
+                         int x, int y, struct drm_framebuffer *old_fb);
 extern void intel_modeset_disable(struct drm_device *dev);
+extern void intel_crtc_restore_mode(struct drm_crtc *crtc);
 extern void intel_crtc_load_lut(struct drm_crtc *crtc);
 extern void intel_crtc_update_dpms(struct drm_crtc *crtc);
 extern void intel_encoder_noop(struct drm_encoder *encoder);
index 9f834d324cfdbfa5713b9c447484155c9a0028fe..6387f9b0df994fa9ea8306f1dd3f906ad3b75018 100644 (file)
@@ -917,11 +917,8 @@ intel_hdmi_set_property(struct drm_connector *connector,
        return -EINVAL;
 
 done:
-       if (intel_dig_port->base.base.crtc) {
-               struct drm_crtc *crtc = intel_dig_port->base.base.crtc;
-               intel_set_mode(crtc, &crtc->mode,
-                              crtc->x, crtc->y, crtc->fb);
-       }
+       if (intel_dig_port->base.base.crtc)
+               intel_crtc_restore_mode(intel_dig_port->base.base.crtc);
 
        return 0;
 }
index 778106961e804ba4f2d1e2615e12457d0556f89e..8c61876dbe95fd1eef82bc5bd583df10d703a62a 100644 (file)
@@ -646,8 +646,7 @@ static int intel_lvds_set_property(struct drm_connector *connector,
                         * If the CRTC is enabled, the display will be changed
                         * according to the new panel fitting mode.
                         */
-                       intel_set_mode(crtc, &crtc->mode,
-                                      crtc->x, crtc->y, crtc->fb);
+                       intel_crtc_restore_mode(crtc);
                }
        }
 
index 0e03985b0fe4c8638170409e2ecfd2a10268f270..ea2e79f63d2b757fd8fe03dc3d96f9973df9b6b3 100644 (file)
@@ -1997,11 +1997,8 @@ set_value:
 
 
 done:
-       if (intel_sdvo->base.base.crtc) {
-               struct drm_crtc *crtc = intel_sdvo->base.base.crtc;
-               intel_set_mode(crtc, &crtc->mode,
-                              crtc->x, crtc->y, crtc->fb);
-       }
+       if (intel_sdvo->base.base.crtc)
+               intel_crtc_restore_mode(intel_sdvo->base.base.crtc);
 
        return 0;
 #undef CHECK_PROPERTY
index ea93520c127820fc701a3dcddd173cc8d6598bf1..984a113c5d136770d340a84f0398f7c2b10e1b74 100644 (file)
@@ -1479,8 +1479,7 @@ intel_tv_set_property(struct drm_connector *connector, struct drm_property *prop
        }
 
        if (changed && crtc)
-               intel_set_mode(crtc, &crtc->mode,
-                              crtc->x, crtc->y, crtc->fb);
+               intel_crtc_restore_mode(crtc);
 out:
        return ret;
 }