aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-12-19 11:08:43 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-12-20 15:09:55 -0500
commitc0c36b941b6f0be6ac74f340040cbb29d6a0b06c (patch)
tree68e8846f56be510e48f91d3896c768011248608d
parent1c45140d3da0c98fa7eda2cd10f9805232a5e9ac (diff)
drm/i915: Return the real error code from intel_set_mode()
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>
-rw-r--r--drivers/gpu/drm/i915/intel_display.c56
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c7
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h5
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c7
-rw-r--r--drivers/gpu/drm/i915/intel_lvds.c3
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c7
-rw-r--r--drivers/gpu/drm/i915/intel_tv.c3
7 files changed, 39 insertions, 49 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index f7f4ef17cbe4..1464e472ce44 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -6313,7 +6313,7 @@ bool intel_get_load_detect_pipe(struct drm_connector *connector,
6313 return false; 6313 return false;
6314 } 6314 }
6315 6315
6316 if (!intel_set_mode(crtc, mode, 0, 0, fb)) { 6316 if (intel_set_mode(crtc, mode, 0, 0, fb)) {
6317 DRM_DEBUG_KMS("failed to set mode on load-detect pipe\n"); 6317 DRM_DEBUG_KMS("failed to set mode on load-detect pipe\n");
6318 if (old->release_fb) 6318 if (old->release_fb)
6319 old->release_fb->funcs->destroy(old->release_fb); 6319 old->release_fb->funcs->destroy(old->release_fb);
@@ -7426,22 +7426,20 @@ intel_modeset_check_state(struct drm_device *dev)
7426 } 7426 }
7427} 7427}
7428 7428
7429bool intel_set_mode(struct drm_crtc *crtc, 7429int intel_set_mode(struct drm_crtc *crtc,
7430 struct drm_display_mode *mode, 7430 struct drm_display_mode *mode,
7431 int x, int y, struct drm_framebuffer *fb) 7431 int x, int y, struct drm_framebuffer *fb)
7432{ 7432{
7433 struct drm_device *dev = crtc->dev; 7433 struct drm_device *dev = crtc->dev;
7434 drm_i915_private_t *dev_priv = dev->dev_private; 7434 drm_i915_private_t *dev_priv = dev->dev_private;
7435 struct drm_display_mode *adjusted_mode, *saved_mode, *saved_hwmode; 7435 struct drm_display_mode *adjusted_mode, *saved_mode, *saved_hwmode;
7436 struct intel_crtc *intel_crtc; 7436 struct intel_crtc *intel_crtc;
7437 unsigned disable_pipes, prepare_pipes, modeset_pipes; 7437 unsigned disable_pipes, prepare_pipes, modeset_pipes;
7438 bool ret = true; 7438 int ret = 0;
7439 7439
7440 saved_mode = kmalloc(2 * sizeof(*saved_mode), GFP_KERNEL); 7440 saved_mode = kmalloc(2 * sizeof(*saved_mode), GFP_KERNEL);
7441 if (!saved_mode) { 7441 if (!saved_mode)
7442 DRM_ERROR("i915: Could not allocate saved display mode.\n"); 7442 return -ENOMEM;
7443 return false;
7444 }
7445 saved_hwmode = saved_mode + 1; 7443 saved_hwmode = saved_mode + 1;
7446 7444
7447 intel_modeset_affected_pipes(crtc, &modeset_pipes, 7445 intel_modeset_affected_pipes(crtc, &modeset_pipes,
@@ -7465,7 +7463,7 @@ bool intel_set_mode(struct drm_crtc *crtc,
7465 if (modeset_pipes) { 7463 if (modeset_pipes) {
7466 adjusted_mode = intel_modeset_adjusted_mode(crtc, mode); 7464 adjusted_mode = intel_modeset_adjusted_mode(crtc, mode);
7467 if (IS_ERR(adjusted_mode)) { 7465 if (IS_ERR(adjusted_mode)) {
7468 ret = false; 7466 ret = PTR_ERR(adjusted_mode);
7469 goto out; 7467 goto out;
7470 } 7468 }
7471 } 7469 }
@@ -7492,11 +7490,11 @@ bool intel_set_mode(struct drm_crtc *crtc,
7492 * on the DPLL. 7490 * on the DPLL.
7493 */ 7491 */
7494 for_each_intel_crtc_masked(dev, modeset_pipes, intel_crtc) { 7492 for_each_intel_crtc_masked(dev, modeset_pipes, intel_crtc) {
7495 ret = !intel_crtc_mode_set(&intel_crtc->base, 7493 ret = intel_crtc_mode_set(&intel_crtc->base,
7496 mode, adjusted_mode, 7494 mode, adjusted_mode,
7497 x, y, fb); 7495 x, y, fb);
7498 if (!ret) 7496 if (ret)
7499 goto done; 7497 goto done;
7500 } 7498 }
7501 7499
7502 /* Now enable the clocks, plane, pipe, and connectors that we set up. */ 7500 /* Now enable the clocks, plane, pipe, and connectors that we set up. */
@@ -7517,7 +7515,7 @@ bool intel_set_mode(struct drm_crtc *crtc,
7517 /* FIXME: add subpixel order */ 7515 /* FIXME: add subpixel order */
7518done: 7516done:
7519 drm_mode_destroy(dev, adjusted_mode); 7517 drm_mode_destroy(dev, adjusted_mode);
7520 if (!ret && crtc->enabled) { 7518 if (ret && crtc->enabled) {
7521 crtc->hwmode = *saved_hwmode; 7519 crtc->hwmode = *saved_hwmode;
7522 crtc->mode = *saved_mode; 7520 crtc->mode = *saved_mode;
7523 } else { 7521 } else {
@@ -7529,6 +7527,11 @@ out:
7529 return ret; 7527 return ret;
7530} 7528}
7531 7529
7530void intel_crtc_restore_mode(struct drm_crtc *crtc)
7531{
7532 intel_set_mode(crtc, &crtc->mode, crtc->x, crtc->y, crtc->fb);
7533}
7534
7532#undef for_each_intel_crtc_masked 7535#undef for_each_intel_crtc_masked
7533 7536
7534static void intel_set_config_free(struct intel_set_config *config) 7537static 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)
7798 drm_mode_debug_printmodeline(set->mode); 7801 drm_mode_debug_printmodeline(set->mode);
7799 } 7802 }
7800 7803
7801 if (!intel_set_mode(set->crtc, set->mode, 7804 ret = intel_set_mode(set->crtc, set->mode,
7802 set->x, set->y, set->fb)) { 7805 set->x, set->y, set->fb);
7803 DRM_ERROR("failed to set mode on [CRTC:%d]\n", 7806 if (ret) {
7804 set->crtc->base.id); 7807 DRM_ERROR("failed to set mode on [CRTC:%d], err = %d\n",
7805 ret = -EINVAL; 7808 set->crtc->base.id, ret);
7806 goto fail; 7809 goto fail;
7807 } 7810 }
7808 } else if (config->fb_changed) { 7811 } else if (config->fb_changed) {
@@ -7819,8 +7822,8 @@ fail:
7819 7822
7820 /* Try to restore the config */ 7823 /* Try to restore the config */
7821 if (config->mode_changed && 7824 if (config->mode_changed &&
7822 !intel_set_mode(save_set.crtc, save_set.mode, 7825 intel_set_mode(save_set.crtc, save_set.mode,
7823 save_set.x, save_set.y, save_set.fb)) 7826 save_set.x, save_set.y, save_set.fb))
7824 DRM_ERROR("failed to restore config after modeset failure\n"); 7827 DRM_ERROR("failed to restore config after modeset failure\n");
7825 7828
7826out_config: 7829out_config:
@@ -8804,11 +8807,8 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,
8804 } 8807 }
8805 8808
8806 if (force_restore) { 8809 if (force_restore) {
8807 for_each_pipe(pipe) { 8810 for_each_pipe(pipe)
8808 crtc = to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]); 8811 intel_crtc_restore_mode(dev_priv->pipe_to_crtc_mapping[pipe]);
8809 intel_set_mode(&crtc->base, &crtc->base.mode,
8810 crtc->base.x, crtc->base.y, crtc->base.fb);
8811 }
8812 } else { 8812 } else {
8813 intel_modeset_update_staged_output_state(dev); 8813 intel_modeset_update_staged_output_state(dev);
8814 } 8814 }
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 2d3b26832397..1dd89d5fe511 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -2483,11 +2483,8 @@ intel_dp_set_property(struct drm_connector *connector,
2483 return -EINVAL; 2483 return -EINVAL;
2484 2484
2485done: 2485done:
2486 if (intel_encoder->base.crtc) { 2486 if (intel_encoder->base.crtc)
2487 struct drm_crtc *crtc = intel_encoder->base.crtc; 2487 intel_crtc_restore_mode(intel_encoder->base.crtc);
2488 intel_set_mode(crtc, &crtc->mode,
2489 crtc->x, crtc->y, crtc->fb);
2490 }
2491 2488
2492 return 0; 2489 return 0;
2493} 2490}
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 53d4c8fec2a0..116580b623dd 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -501,9 +501,10 @@ struct intel_set_config {
501 bool mode_changed; 501 bool mode_changed;
502}; 502};
503 503
504extern bool intel_set_mode(struct drm_crtc *crtc, struct drm_display_mode *mode, 504extern int intel_set_mode(struct drm_crtc *crtc, struct drm_display_mode *mode,
505 int x, int y, struct drm_framebuffer *old_fb); 505 int x, int y, struct drm_framebuffer *old_fb);
506extern void intel_modeset_disable(struct drm_device *dev); 506extern void intel_modeset_disable(struct drm_device *dev);
507extern void intel_crtc_restore_mode(struct drm_crtc *crtc);
507extern void intel_crtc_load_lut(struct drm_crtc *crtc); 508extern void intel_crtc_load_lut(struct drm_crtc *crtc);
508extern void intel_crtc_update_dpms(struct drm_crtc *crtc); 509extern void intel_crtc_update_dpms(struct drm_crtc *crtc);
509extern void intel_encoder_noop(struct drm_encoder *encoder); 510extern void intel_encoder_noop(struct drm_encoder *encoder);
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index 9f834d324cfd..6387f9b0df99 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -917,11 +917,8 @@ intel_hdmi_set_property(struct drm_connector *connector,
917 return -EINVAL; 917 return -EINVAL;
918 918
919done: 919done:
920 if (intel_dig_port->base.base.crtc) { 920 if (intel_dig_port->base.base.crtc)
921 struct drm_crtc *crtc = intel_dig_port->base.base.crtc; 921 intel_crtc_restore_mode(intel_dig_port->base.base.crtc);
922 intel_set_mode(crtc, &crtc->mode,
923 crtc->x, crtc->y, crtc->fb);
924 }
925 922
926 return 0; 923 return 0;
927} 924}
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
index 778106961e80..8c61876dbe95 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -646,8 +646,7 @@ static int intel_lvds_set_property(struct drm_connector *connector,
646 * If the CRTC is enabled, the display will be changed 646 * If the CRTC is enabled, the display will be changed
647 * according to the new panel fitting mode. 647 * according to the new panel fitting mode.
648 */ 648 */
649 intel_set_mode(crtc, &crtc->mode, 649 intel_crtc_restore_mode(crtc);
650 crtc->x, crtc->y, crtc->fb);
651 } 650 }
652 } 651 }
653 652
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index 0e03985b0fe4..ea2e79f63d2b 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -1997,11 +1997,8 @@ set_value:
1997 1997
1998 1998
1999done: 1999done:
2000 if (intel_sdvo->base.base.crtc) { 2000 if (intel_sdvo->base.base.crtc)
2001 struct drm_crtc *crtc = intel_sdvo->base.base.crtc; 2001 intel_crtc_restore_mode(intel_sdvo->base.base.crtc);
2002 intel_set_mode(crtc, &crtc->mode,
2003 crtc->x, crtc->y, crtc->fb);
2004 }
2005 2002
2006 return 0; 2003 return 0;
2007#undef CHECK_PROPERTY 2004#undef CHECK_PROPERTY
diff --git a/drivers/gpu/drm/i915/intel_tv.c b/drivers/gpu/drm/i915/intel_tv.c
index ea93520c1278..984a113c5d13 100644
--- a/drivers/gpu/drm/i915/intel_tv.c
+++ b/drivers/gpu/drm/i915/intel_tv.c
@@ -1479,8 +1479,7 @@ intel_tv_set_property(struct drm_connector *connector, struct drm_property *prop
1479 } 1479 }
1480 1480
1481 if (changed && crtc) 1481 if (changed && crtc)
1482 intel_set_mode(crtc, &crtc->mode, 1482 intel_crtc_restore_mode(crtc);
1483 crtc->x, crtc->y, crtc->fb);
1484out: 1483out:
1485 return ret; 1484 return ret;
1486} 1485}