aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_fbdev.c
diff options
context:
space:
mode:
authorRodrigo Vivi <rodrigo.vivi@intel.com>2015-05-28 13:26:58 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-05-29 04:18:32 -0400
commitd9a946b52350bb070fe70f92c3ddd13355c0ca08 (patch)
tree4348e50734b2ddf8d46a0da8c9894968f9ed8dbd /drivers/gpu/drm/i915/intel_fbdev.c
parent2d847d45b2c988038194140fa3def4ac1342cb67 (diff)
drm/i915: Another fbdev hack to avoid PSR on fbcon.
With unified modeset and flip paths introduced recently when switching to fbcon PSR was being disabled on fb_set_par path but re-enabled on fb_pan_display one, causing missed screen updates and un unusable console. Regression introduced with: commit bb54662350662815b4bfc2ff4464330a2dbd7041 Author: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com> Date: Tue Apr 21 17:13:13 2015 +0300 drm/i915: Unify modeset and flip paths of intel_crtc_set_config() Cc: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_fbdev.c')
-rw-r--r--drivers/gpu/drm/i915/intel_fbdev.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
index 4e7e7da2e03b..6372cfc7d053 100644
--- a/drivers/gpu/drm/i915/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/intel_fbdev.c
@@ -96,6 +96,32 @@ static int intel_fbdev_blank(int blank, struct fb_info *info)
96 return ret; 96 return ret;
97} 97}
98 98
99static int intel_fbdev_pan_display(struct fb_var_screeninfo *var,
100 struct fb_info *info)
101{
102 struct drm_fb_helper *fb_helper = info->par;
103 struct intel_fbdev *ifbdev =
104 container_of(fb_helper, struct intel_fbdev, helper);
105
106 int ret;
107 ret = drm_fb_helper_pan_display(var, info);
108
109 if (ret == 0) {
110 /*
111 * FIXME: fbdev presumes that all callbacks also work from
112 * atomic contexts and relies on that for emergency oops
113 * printing. KMS totally doesn't do that and the locking here is
114 * by far not the only place this goes wrong. Ignore this for
115 * now until we solve this for real.
116 */
117 mutex_lock(&fb_helper->dev->struct_mutex);
118 intel_fb_obj_invalidate(ifbdev->fb->obj, NULL, ORIGIN_GTT);
119 mutex_unlock(&fb_helper->dev->struct_mutex);
120 }
121
122 return ret;
123}
124
99static struct fb_ops intelfb_ops = { 125static struct fb_ops intelfb_ops = {
100 .owner = THIS_MODULE, 126 .owner = THIS_MODULE,
101 .fb_check_var = drm_fb_helper_check_var, 127 .fb_check_var = drm_fb_helper_check_var,
@@ -103,7 +129,7 @@ static struct fb_ops intelfb_ops = {
103 .fb_fillrect = cfb_fillrect, 129 .fb_fillrect = cfb_fillrect,
104 .fb_copyarea = cfb_copyarea, 130 .fb_copyarea = cfb_copyarea,
105 .fb_imageblit = cfb_imageblit, 131 .fb_imageblit = cfb_imageblit,
106 .fb_pan_display = drm_fb_helper_pan_display, 132 .fb_pan_display = intel_fbdev_pan_display,
107 .fb_blank = intel_fbdev_blank, 133 .fb_blank = intel_fbdev_blank,
108 .fb_setcmap = drm_fb_helper_setcmap, 134 .fb_setcmap = drm_fb_helper_setcmap,
109 .fb_debug_enter = drm_fb_helper_debug_enter, 135 .fb_debug_enter = drm_fb_helper_debug_enter,