Record and restore the kernel framebuffer for all crtc on panic
and lastclose.

Signed-off-by: Kristian Høgsberg <k...@redhat.com>
---
 drivers/gpu/drm/i915/intel_fb.c |   19 ++++++++++++++-----
 1 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c
index afd1217..0fd76d4 100644
--- a/drivers/gpu/drm/i915/intel_fb.c
+++ b/drivers/gpu/drm/i915/intel_fb.c
@@ -412,7 +412,8 @@ int intelfb_resize(struct drm_device *dev, struct drm_crtc 
*crtc)
 }
 EXPORT_SYMBOL(intelfb_resize);
 
-static struct drm_mode_set kernelfb_mode;
+static struct drm_mode_set *kernelfb_mode[2];
+static int kernelfb_crtc_count;
 
 static int intelfb_panic(struct notifier_block *n, unsigned long ununsed,
                         void *panic_str)
@@ -688,7 +689,8 @@ static int intelfb_multi_fb_probe_crtc(struct drm_device 
*dev, struct drm_crtc *
               info->fix.id);
 
        /* Switch back to kernel console on panic */
-       kernelfb_mode = *modeset;
+       BUG_ON(kernelfb_crtc_count >= ARRAY_SIZE(kernelfb_mode));
+       kernelfb_mode[kernelfb_crtc_count++] = modeset;
        atomic_notifier_chain_register(&panic_notifier_list, &paniced);
        printk(KERN_INFO "registered panic notifier\n");
 
@@ -701,6 +703,7 @@ static int intelfb_multi_fb_probe(struct drm_device *dev)
        struct drm_crtc *crtc;
        int ret = 0;
 
+       kernelfb_crtc_count = 0;
        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
                ret = intelfb_multi_fb_probe_crtc(dev, crtc);
                if (ret)
@@ -797,6 +800,7 @@ static int intelfb_single_fb_probe(struct drm_device *dev)
         * For each CRTC, set up the connector list for the CRTC's mode
         * set configuration.
         */
+       kernelfb_crtc_count = 0;
        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
                struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 
@@ -824,6 +828,9 @@ static int intelfb_single_fb_probe(struct drm_device *dev)
                modeset->num_connectors = conn_count;
                if (modeset->mode != modeset->crtc->desired_mode)
                        modeset->mode = modeset->crtc->desired_mode;
+
+               BUG_ON(kernelfb_crtc_count >= ARRAY_SIZE(kernelfb_mode));
+               kernelfb_mode[kernelfb_crtc_count++] = modeset;
        }
        par->crtc_count = crtc_count;
 
@@ -838,7 +845,6 @@ static int intelfb_single_fb_probe(struct drm_device *dev)
               info->fix.id);
 
        /* Switch back to kernel console on panic */
-       kernelfb_mode = *modeset;
        atomic_notifier_chain_register(&panic_notifier_list, &paniced);
        printk(KERN_INFO "registered panic notifier\n");
 
@@ -852,7 +858,10 @@ static int intelfb_single_fb_probe(struct drm_device *dev)
  */
 void intelfb_restore(void)
 {
-       drm_crtc_helper_set_config(&kernelfb_mode);
+       int i;
+
+       for (i = 0; i < kernelfb_crtc_count; i++)
+               drm_crtc_helper_set_config(kernelfb_mode[i]);
 }
 
 static void intelfb_sysrq(int dummy1, struct tty_struct *dummy3)
@@ -918,7 +927,7 @@ int intelfb_remove(struct drm_device *dev, struct 
drm_framebuffer *fb)
        }
 
        atomic_notifier_chain_unregister(&panic_notifier_list, &paniced);
-       memset(&kernelfb_mode, 0, sizeof(struct drm_mode_set));
+       kernelfb_crtc_count = 0;
        return 0;
 }
 EXPORT_SYMBOL(intelfb_remove);
-- 
1.6.1


------------------------------------------------------------------------------
Create and Deploy Rich Internet Apps outside the browser with Adobe(R)AIR(TM)
software. With Adobe AIR, Ajax developers can use existing skills and code to
build responsive, highly engaging applications that combine the power of local
resources and data with the reach of the web. Download the Adobe AIR SDK and
Ajax docs to start building applications today-http://p.sf.net/sfu/adobe-com
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to