diff options
Diffstat (limited to 'drivers/gpu/drm/drm_fb_helper.c')
-rw-r--r-- | drivers/gpu/drm/drm_fb_helper.c | 76 |
1 files changed, 75 insertions, 1 deletions
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 719662034bbf..de82e201d682 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
@@ -241,6 +241,80 @@ static int drm_fb_helper_parse_command_line(struct drm_fb_helper *fb_helper) | |||
241 | return 0; | 241 | return 0; |
242 | } | 242 | } |
243 | 243 | ||
244 | int drm_fb_helper_debug_enter(struct fb_info *info) | ||
245 | { | ||
246 | struct drm_fb_helper *helper = info->par; | ||
247 | struct drm_crtc_helper_funcs *funcs; | ||
248 | int i; | ||
249 | |||
250 | if (list_empty(&kernel_fb_helper_list)) | ||
251 | return false; | ||
252 | |||
253 | list_for_each_entry(helper, &kernel_fb_helper_list, kernel_fb_list) { | ||
254 | for (i = 0; i < helper->crtc_count; i++) { | ||
255 | struct drm_mode_set *mode_set = | ||
256 | &helper->crtc_info[i].mode_set; | ||
257 | |||
258 | if (!mode_set->crtc->enabled) | ||
259 | continue; | ||
260 | |||
261 | funcs = mode_set->crtc->helper_private; | ||
262 | funcs->mode_set_base_atomic(mode_set->crtc, | ||
263 | mode_set->fb, | ||
264 | mode_set->x, | ||
265 | mode_set->y); | ||
266 | |||
267 | } | ||
268 | } | ||
269 | |||
270 | return 0; | ||
271 | } | ||
272 | EXPORT_SYMBOL(drm_fb_helper_debug_enter); | ||
273 | |||
274 | /* Find the real fb for a given fb helper CRTC */ | ||
275 | static struct drm_framebuffer *drm_mode_config_fb(struct drm_crtc *crtc) | ||
276 | { | ||
277 | struct drm_device *dev = crtc->dev; | ||
278 | struct drm_crtc *c; | ||
279 | |||
280 | list_for_each_entry(c, &dev->mode_config.crtc_list, head) { | ||
281 | if (crtc->base.id == c->base.id) | ||
282 | return c->fb; | ||
283 | } | ||
284 | |||
285 | return NULL; | ||
286 | } | ||
287 | |||
288 | int drm_fb_helper_debug_leave(struct fb_info *info) | ||
289 | { | ||
290 | struct drm_fb_helper *helper = info->par; | ||
291 | struct drm_crtc *crtc; | ||
292 | struct drm_crtc_helper_funcs *funcs; | ||
293 | struct drm_framebuffer *fb; | ||
294 | int i; | ||
295 | |||
296 | for (i = 0; i < helper->crtc_count; i++) { | ||
297 | struct drm_mode_set *mode_set = &helper->crtc_info[i].mode_set; | ||
298 | crtc = mode_set->crtc; | ||
299 | funcs = crtc->helper_private; | ||
300 | fb = drm_mode_config_fb(crtc); | ||
301 | |||
302 | if (!crtc->enabled) | ||
303 | continue; | ||
304 | |||
305 | if (!fb) { | ||
306 | DRM_ERROR("no fb to restore??\n"); | ||
307 | continue; | ||
308 | } | ||
309 | |||
310 | funcs->mode_set_base_atomic(mode_set->crtc, fb, crtc->x, | ||
311 | crtc->y); | ||
312 | } | ||
313 | |||
314 | return 0; | ||
315 | } | ||
316 | EXPORT_SYMBOL(drm_fb_helper_debug_leave); | ||
317 | |||
244 | bool drm_fb_helper_force_kernel_mode(void) | 318 | bool drm_fb_helper_force_kernel_mode(void) |
245 | { | 319 | { |
246 | int i = 0; | 320 | int i = 0; |
@@ -611,7 +685,7 @@ int drm_fb_helper_check_var(struct fb_var_screeninfo *var, | |||
611 | struct drm_framebuffer *fb = fb_helper->fb; | 685 | struct drm_framebuffer *fb = fb_helper->fb; |
612 | int depth; | 686 | int depth; |
613 | 687 | ||
614 | if (var->pixclock != 0) | 688 | if (var->pixclock != 0 || in_dbg_master()) |
615 | return -EINVAL; | 689 | return -EINVAL; |
616 | 690 | ||
617 | /* Need to resize the fb object !!! */ | 691 | /* Need to resize the fb object !!! */ |