diff options
author | Patrik Jakobsson <patrik.r.jakobsson@gmail.com> | 2013-06-05 08:24:01 -0400 |
---|---|---|
committer | Patrik Jakobsson <patrik.r.jakobsson@gmail.com> | 2013-06-09 12:02:02 -0400 |
commit | 820de86a90089ee607d7864538c98a23b503c846 (patch) | |
tree | 41cee1ce7c7673efe68ca47189d5dadea5f82bfb | |
parent | 61bb3fea44b71dd9935227920b036fdb96936f4d (diff) |
drm/gma500/psb: Unpin framebuffer on crtc disable
The framebuffer needs to be unpinned in the crtc->disable callback
because of previous pinning in psb_intel_pipe_set_base(). This will fix
a memory leak where the framebuffer was released but not unpinned
properly. This patch only affects Poulsbo.
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=889511
Bugzilla: https://bugzilla.novell.com/show_bug.cgi?id=812113
Cc: stable@vger.kernel.org
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
-rw-r--r-- | drivers/gpu/drm/gma500/psb_intel_display.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/gpu/drm/gma500/psb_intel_display.c b/drivers/gpu/drm/gma500/psb_intel_display.c index 6e8f42b61ff6..12d129ef21a9 100644 --- a/drivers/gpu/drm/gma500/psb_intel_display.c +++ b/drivers/gpu/drm/gma500/psb_intel_display.c | |||
@@ -1150,6 +1150,19 @@ static void psb_intel_crtc_destroy(struct drm_crtc *crtc) | |||
1150 | kfree(psb_intel_crtc); | 1150 | kfree(psb_intel_crtc); |
1151 | } | 1151 | } |
1152 | 1152 | ||
1153 | static void psb_intel_crtc_disable(struct drm_crtc *crtc) | ||
1154 | { | ||
1155 | struct gtt_range *gt; | ||
1156 | struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; | ||
1157 | |||
1158 | crtc_funcs->dpms(crtc, DRM_MODE_DPMS_OFF); | ||
1159 | |||
1160 | if (crtc->fb) { | ||
1161 | gt = to_psb_fb(crtc->fb)->gtt; | ||
1162 | psb_gtt_unpin(gt); | ||
1163 | } | ||
1164 | } | ||
1165 | |||
1153 | const struct drm_crtc_helper_funcs psb_intel_helper_funcs = { | 1166 | const struct drm_crtc_helper_funcs psb_intel_helper_funcs = { |
1154 | .dpms = psb_intel_crtc_dpms, | 1167 | .dpms = psb_intel_crtc_dpms, |
1155 | .mode_fixup = psb_intel_crtc_mode_fixup, | 1168 | .mode_fixup = psb_intel_crtc_mode_fixup, |
@@ -1157,6 +1170,7 @@ const struct drm_crtc_helper_funcs psb_intel_helper_funcs = { | |||
1157 | .mode_set_base = psb_intel_pipe_set_base, | 1170 | .mode_set_base = psb_intel_pipe_set_base, |
1158 | .prepare = psb_intel_crtc_prepare, | 1171 | .prepare = psb_intel_crtc_prepare, |
1159 | .commit = psb_intel_crtc_commit, | 1172 | .commit = psb_intel_crtc_commit, |
1173 | .disable = psb_intel_crtc_disable, | ||
1160 | }; | 1174 | }; |
1161 | 1175 | ||
1162 | const struct drm_crtc_funcs psb_intel_crtc_funcs = { | 1176 | const struct drm_crtc_funcs psb_intel_crtc_funcs = { |