diff options
author | Jesse Barnes <jbarnes@virtuousgeek.org> | 2010-08-05 10:22:31 -0400 |
---|---|---|
committer | Jason Wessel <jason.wessel@windriver.com> | 2010-08-05 10:22:31 -0400 |
commit | 1a7aba7f4e45014c5a4741164b1ecb4ffe616fb7 (patch) | |
tree | f6884f1f17cf8715b6c3d21fc821847cebc3f7ad /drivers/gpu/drm | |
parent | d219adc1228a3887486b58a430e736b0831f192c (diff) |
drm: add KGDB/KDB support
Implement the callbacks for KDB entry/exit via the drm helpers.
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r-- | drivers/gpu/drm/drm_fb_helper.c | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 719662034bbf..6245add3768a 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; |