From 989c9ca52b2b1479f344eb3b013dd0812ed04f3b Mon Sep 17 00:00:00 2001 From: Tim Gardner Date: Fri, 7 Dec 2012 07:54:26 -0700 Subject: [PATCH] --- yaml --- r: 357911 b: refs/heads/master c: 3ac18232946aacf0a9807c3143f8449ed4aa68f4 h: refs/heads/master i: 357909: bb30606507d75a54007aa3e3aa20dd5e90e11500 357907: 0f6481cd14df51a6018218b87e0e7e454139e0a4 357903: 0fc44dd8b2e1303294e46c2a7aa239103ca60492 v: v3 --- [refs] | 2 +- trunk/drivers/gpu/drm/i915/intel_display.c | 22 ++++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index 181c7282110c..12a4e51d6ff3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 378a6a77ae59d3312627b996ded94e23166d9e63 +refs/heads/master: 3ac18232946aacf0a9807c3143f8449ed4aa68f4 diff --git a/trunk/drivers/gpu/drm/i915/intel_display.c b/trunk/drivers/gpu/drm/i915/intel_display.c index 34832bc04931..115bf626037c 100644 --- a/trunk/drivers/gpu/drm/i915/intel_display.c +++ b/trunk/drivers/gpu/drm/i915/intel_display.c @@ -7398,11 +7398,18 @@ bool intel_set_mode(struct drm_crtc *crtc, { 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 drm_display_mode *adjusted_mode, *saved_mode, *saved_hwmode; struct intel_crtc *intel_crtc; unsigned disable_pipes, prepare_pipes, modeset_pipes; bool ret = true; + saved_mode = kmalloc(2 * sizeof(*saved_mode), GFP_KERNEL); + if (!saved_mode) { + DRM_ERROR("i915: Could not allocate saved display mode.\n"); + return false; + } + saved_hwmode = saved_mode + 1; + intel_modeset_affected_pipes(crtc, &modeset_pipes, &prepare_pipes, &disable_pipes); @@ -7412,8 +7419,8 @@ bool intel_set_mode(struct drm_crtc *crtc, for_each_intel_crtc_masked(dev, disable_pipes, intel_crtc) intel_crtc_disable(&intel_crtc->base); - saved_hwmode = crtc->hwmode; - saved_mode = crtc->mode; + *saved_hwmode = crtc->hwmode; + *saved_mode = crtc->mode; /* Hack: Because we don't (yet) support global modeset on multiple * crtcs, we don't keep track of the new mode for more than one crtc. @@ -7424,7 +7431,8 @@ bool intel_set_mode(struct drm_crtc *crtc, if (modeset_pipes) { adjusted_mode = intel_modeset_adjusted_mode(crtc, mode); if (IS_ERR(adjusted_mode)) { - return false; + ret = false; + goto out; } } @@ -7476,12 +7484,14 @@ bool intel_set_mode(struct drm_crtc *crtc, done: drm_mode_destroy(dev, adjusted_mode); if (!ret && crtc->enabled) { - crtc->hwmode = saved_hwmode; - crtc->mode = saved_mode; + crtc->hwmode = *saved_hwmode; + crtc->mode = *saved_mode; } else { intel_modeset_check_state(dev); } +out: + kfree(saved_mode); return ret; }