diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2012-12-19 11:08:43 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-12-20 15:09:55 -0500 |
commit | c0c36b941b6f0be6ac74f340040cbb29d6a0b06c (patch) | |
tree | 68e8846f56be510e48f91d3896c768011248608d | |
parent | 1c45140d3da0c98fa7eda2cd10f9805232a5e9ac (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.c | 56 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_hdmi.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_tv.c | 3 |
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 | ||
7429 | bool intel_set_mode(struct drm_crtc *crtc, | 7429 | int 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 */ |
7518 | done: | 7516 | done: |
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 | ||
7530 | void 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 | ||
7534 | static void intel_set_config_free(struct intel_set_config *config) | 7537 | 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) | |||
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 | ||
7826 | out_config: | 7829 | out_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 | ||
2485 | done: | 2485 | done: |
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 | ||
504 | extern bool intel_set_mode(struct drm_crtc *crtc, struct drm_display_mode *mode, | 504 | extern 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); |
506 | extern void intel_modeset_disable(struct drm_device *dev); | 506 | extern void intel_modeset_disable(struct drm_device *dev); |
507 | extern void intel_crtc_restore_mode(struct drm_crtc *crtc); | ||
507 | extern void intel_crtc_load_lut(struct drm_crtc *crtc); | 508 | extern void intel_crtc_load_lut(struct drm_crtc *crtc); |
508 | extern void intel_crtc_update_dpms(struct drm_crtc *crtc); | 509 | extern void intel_crtc_update_dpms(struct drm_crtc *crtc); |
509 | extern void intel_encoder_noop(struct drm_encoder *encoder); | 510 | extern 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 | ||
919 | done: | 919 | done: |
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 | ||
1999 | done: | 1999 | done: |
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); | ||
1484 | out: | 1483 | out: |
1485 | return ret; | 1484 | return ret; |
1486 | } | 1485 | } |