diff options
author | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2015-05-28 13:26:58 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2015-05-29 04:18:32 -0400 |
commit | d9a946b52350bb070fe70f92c3ddd13355c0ca08 (patch) | |
tree | 4348e50734b2ddf8d46a0da8c9894968f9ed8dbd /drivers/gpu/drm/i915/intel_fbdev.c | |
parent | 2d847d45b2c988038194140fa3def4ac1342cb67 (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.c | 28 |
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 | ||
99 | static 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 | |||
99 | static struct fb_ops intelfb_ops = { | 125 | static 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, |