}
EXPORT_SYMBOL(intelfb_resize);
+static struct drm_mode_set panic_mode;
+
+int intelfb_panic(struct notifier_block *n, unsigned long ununsed,
+ void *panic_str)
+{
+ DRM_ERROR("panic occurred, switching back to text console\n");
+ drm_crtc_helper_set_config(&panic_mode);
+
+ return 0;
+}
+EXPORT_SYMBOL(intelfb_panic);
+
+static struct notifier_block paniced = {
+ .notifier_call = intelfb_panic,
+};
+
int intelfb_create(struct drm_device *dev, uint32_t fb_width, uint32_t fb_height,
uint32_t surface_width, uint32_t surface_height,
struct intel_framebuffer **intel_fb_p)
printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node,
info->fix.id);
+
+ /* Switch back to kernel console on panic */
+ panic_mode = *modeset;
+ atomic_notifier_chain_register(&panic_notifier_list, &paniced);
+ printk(KERN_INFO "registered panic notifier\n");
+
return 0;
}
printk(KERN_INFO "fb%d: %s frame buffer device\n", info->node,
info->fix.id);
+
+ /* Switch back to kernel console on panic */
+ panic_mode = *modeset;
+ atomic_notifier_chain_register(&panic_notifier_list, &paniced);
+ printk(KERN_INFO "registered panic notifier\n");
+
return 0;
}
drm_bo_usage_deref_unlocked(&intel_fb->bo);
framebuffer_release(info);
}
+
+ atomic_notifier_chain_unregister(&panic_notifier_list, &paniced);
+ memset(&panic_mode, 0, sizeof(struct drm_mode_set));
return 0;
}
EXPORT_SYMBOL(intelfb_remove);