Needed for panic and kdb, since we need to avoid taking the mode_config
mutex.  This patch gets us back to where we used to be, i.e. when a
panic occurs we'll switch to the fbcon buffer.  I'm still working on
the VT layer to add better support for printing any outstanding
messages and/or switching to the VT with all the good stuff on it.

Signed-off-by: Jesse Barnes <jbar...@virtuousgeek.org>
---
 drivers/gpu/drm/drm_fb_helper.c |   42 +++++++++++++++++++++++++++++++++-----
 1 files changed, 36 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 6929f5b..962eadb 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -242,18 +242,22 @@ static int drm_fb_helper_parse_command_line(struct 
drm_fb_helper *fb_helper)
        return 0;
 }
 
-bool drm_fb_helper_force_kernel_mode(void)
+bool drm_fb_helper_force_kernel_mode_locked(void)
 {
        int i = 0;
        bool ret, error = false;
        struct drm_fb_helper *helper;
-
-       if (list_empty(&kernel_fb_helper_list))
-               return false;
+       struct drm_mode_set *mode_set;
+       struct drm_crtc *crtc;
 
        list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) {
                for (i = 0; i < helper->crtc_count; i++) {
-                       struct drm_mode_set *mode_set = 
&helper->crtc_info[i].mode_set;
+                       mode_set = &helper->crtc_info[i].mode_set;
+                       crtc = helper->crtc_info[i].mode_set.crtc;
+
+                       if (!crtc->enabled)
+                               continue;
+
                        ret = drm_crtc_helper_set_config(mode_set);
                        if (ret)
                                error = true;
@@ -262,11 +266,37 @@ bool drm_fb_helper_force_kernel_mode(void)
        return error;
 }
 
+bool drm_fb_helper_force_kernel_mode(void)
+{
+       bool ret;
+       struct drm_device *dev;
+       struct drm_fb_helper *helper;
+       struct drm_mode_set *mode_set;
+
+       if (list_empty(&kernel_fb_helper_list)) {
+               DRM_DEBUG_KMS("no fb helper list??\n");
+               return false;
+       }
+
+       /* Get the DRM device */
+       helper = list_first_entry(&kernel_fb_helper_list,
+                                 struct drm_fb_helper,
+                                 kernel_fb_list);
+       mode_set = &helper->crtc_info[0].mode_set;
+       dev = mode_set->crtc->dev;
+
+       mutex_lock(&dev->mode_config.mutex);
+       ret = drm_fb_helper_force_kernel_mode_locked();
+       mutex_unlock(&dev->mode_config.mutex);
+
+       return ret;
+}
+
 int drm_fb_helper_panic(struct notifier_block *n, unsigned long ununsed,
                        void *panic_str)
 {
        DRM_ERROR("panic occurred, switching back to text console\n");
-       return drm_fb_helper_force_kernel_mode();
+       drm_fb_helper_force_kernel_mode_locked();
        return 0;
 }
 EXPORT_SYMBOL(drm_fb_helper_panic);
-- 
1.6.6.1


------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to