|
@@ -241,6 +241,80 @@ static int drm_fb_helper_parse_command_line(struct drm_fb_helper *fb_helper)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+int drm_fb_helper_debug_enter(struct fb_info *info)
|
|
|
+{
|
|
|
+ struct drm_fb_helper *helper = info->par;
|
|
|
+ struct drm_crtc_helper_funcs *funcs;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ if (list_empty(&kernel_fb_helper_list))
|
|
|
+ return false;
|
|
|
+
|
|
|
+ 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;
|
|
|
+
|
|
|
+ if (!mode_set->crtc->enabled)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ funcs = mode_set->crtc->helper_private;
|
|
|
+ funcs->mode_set_base_atomic(mode_set->crtc,
|
|
|
+ mode_set->fb,
|
|
|
+ mode_set->x,
|
|
|
+ mode_set->y);
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(drm_fb_helper_debug_enter);
|
|
|
+
|
|
|
+/* Find the real fb for a given fb helper CRTC */
|
|
|
+static struct drm_framebuffer *drm_mode_config_fb(struct drm_crtc *crtc)
|
|
|
+{
|
|
|
+ struct drm_device *dev = crtc->dev;
|
|
|
+ struct drm_crtc *c;
|
|
|
+
|
|
|
+ list_for_each_entry(c, &dev->mode_config.crtc_list, head) {
|
|
|
+ if (crtc->base.id == c->base.id)
|
|
|
+ return c->fb;
|
|
|
+ }
|
|
|
+
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
+int drm_fb_helper_debug_leave(struct fb_info *info)
|
|
|
+{
|
|
|
+ struct drm_fb_helper *helper = info->par;
|
|
|
+ struct drm_crtc *crtc;
|
|
|
+ struct drm_crtc_helper_funcs *funcs;
|
|
|
+ struct drm_framebuffer *fb;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < helper->crtc_count; i++) {
|
|
|
+ struct drm_mode_set *mode_set = &helper->crtc_info[i].mode_set;
|
|
|
+ crtc = mode_set->crtc;
|
|
|
+ funcs = crtc->helper_private;
|
|
|
+ fb = drm_mode_config_fb(crtc);
|
|
|
+
|
|
|
+ if (!crtc->enabled)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (!fb) {
|
|
|
+ DRM_ERROR("no fb to restore??\n");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ funcs->mode_set_base_atomic(mode_set->crtc, fb, crtc->x,
|
|
|
+ crtc->y);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(drm_fb_helper_debug_leave);
|
|
|
+
|
|
|
bool drm_fb_helper_force_kernel_mode(void)
|
|
|
{
|
|
|
int i = 0;
|