aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2017-04-03 04:33:04 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2017-04-06 04:23:06 -0400
commit7128645d5c647ba3fe1684f2d5710ee403babca2 (patch)
tree992f53b596c646b933fba423bb59631cbe0b37cb
parent941b8caaa88db02d7c287e937182a71de2751cbb (diff)
drm/fb-helper: Extract _legacy kms functions
The goal is to push all the kms locking down into these separate _atomic and _legacy functions, so that we can correctly pass the acquire ctx into all atomic drivers. Instead of playing games with hidden ctx in mode_config.acquire_ctx. All the fbdev state will be protected by a new fbdev private lock that Thierry is working on. This here is just prep by creating a clean split between atomic and legacy paths, which also simplifies the control flow a bit. Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Acked-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20170403083304.9083-16-daniel.vetter@ffwll.ch
-rw-r--r--drivers/gpu/drm/drm_fb_helper.c72
1 files changed, 44 insertions, 28 deletions
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c
index 6dc5381e1c45..a0ea3241c651 100644
--- a/drivers/gpu/drm/drm_fb_helper.c
+++ b/drivers/gpu/drm/drm_fb_helper.c
@@ -418,17 +418,12 @@ backoff:
418 goto retry; 418 goto retry;
419} 419}
420 420
421static int restore_fbdev_mode(struct drm_fb_helper *fb_helper) 421static int restore_fbdev_mode_legacy(struct drm_fb_helper *fb_helper)
422{ 422{
423 struct drm_device *dev = fb_helper->dev; 423 struct drm_device *dev = fb_helper->dev;
424 struct drm_plane *plane; 424 struct drm_plane *plane;
425 int i; 425 int i;
426 426
427 drm_warn_on_modeset_not_all_locked(dev);
428
429 if (drm_drv_uses_atomic_modeset(dev))
430 return restore_fbdev_mode_atomic(fb_helper);
431
432 drm_for_each_plane(plane, dev) { 427 drm_for_each_plane(plane, dev) {
433 if (plane->type != DRM_PLANE_TYPE_PRIMARY) 428 if (plane->type != DRM_PLANE_TYPE_PRIMARY)
434 drm_plane_force_disable(plane); 429 drm_plane_force_disable(plane);
@@ -462,6 +457,18 @@ static int restore_fbdev_mode(struct drm_fb_helper *fb_helper)
462 return 0; 457 return 0;
463} 458}
464 459
460static int restore_fbdev_mode(struct drm_fb_helper *fb_helper)
461{
462 struct drm_device *dev = fb_helper->dev;
463
464 drm_warn_on_modeset_not_all_locked(dev);
465
466 if (drm_drv_uses_atomic_modeset(dev))
467 return restore_fbdev_mode_atomic(fb_helper);
468 else
469 return restore_fbdev_mode_legacy(fb_helper);
470}
471
465/** 472/**
466 * drm_fb_helper_restore_fbdev_mode_unlocked - restore fbdev configuration 473 * drm_fb_helper_restore_fbdev_mode_unlocked - restore fbdev configuration
467 * @fb_helper: fbcon to restore 474 * @fb_helper: fbcon to restore
@@ -1513,34 +1520,14 @@ backoff:
1513 goto retry; 1520 goto retry;
1514} 1521}
1515 1522
1516/** 1523static int pan_display_legacy(struct fb_var_screeninfo *var,
1517 * drm_fb_helper_pan_display - implementation for &fb_ops.fb_pan_display
1518 * @var: updated screen information
1519 * @info: fbdev registered by the helper
1520 */
1521int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
1522 struct fb_info *info) 1524 struct fb_info *info)
1523{ 1525{
1524 struct drm_fb_helper *fb_helper = info->par; 1526 struct drm_fb_helper *fb_helper = info->par;
1525 struct drm_device *dev = fb_helper->dev;
1526 struct drm_mode_set *modeset; 1527 struct drm_mode_set *modeset;
1527 int ret = 0; 1528 int ret = 0;
1528 int i; 1529 int i;
1529 1530
1530 if (oops_in_progress)
1531 return -EBUSY;
1532
1533 drm_modeset_lock_all(dev);
1534 if (!drm_fb_helper_is_bound(fb_helper)) {
1535 drm_modeset_unlock_all(dev);
1536 return -EBUSY;
1537 }
1538
1539 if (drm_drv_uses_atomic_modeset(dev)) {
1540 ret = pan_display_atomic(var, info);
1541 goto unlock;
1542 }
1543
1544 for (i = 0; i < fb_helper->crtc_count; i++) { 1531 for (i = 0; i < fb_helper->crtc_count; i++) {
1545 modeset = &fb_helper->crtc_info[i].mode_set; 1532 modeset = &fb_helper->crtc_info[i].mode_set;
1546 1533
@@ -1555,8 +1542,37 @@ int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
1555 } 1542 }
1556 } 1543 }
1557 } 1544 }
1558unlock: 1545
1546 return ret;
1547}
1548
1549/**
1550 * drm_fb_helper_pan_display - implementation for &fb_ops.fb_pan_display
1551 * @var: updated screen information
1552 * @info: fbdev registered by the helper
1553 */
1554int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
1555 struct fb_info *info)
1556{
1557 struct drm_fb_helper *fb_helper = info->par;
1558 struct drm_device *dev = fb_helper->dev;
1559 int ret;
1560
1561 if (oops_in_progress)
1562 return -EBUSY;
1563
1564 drm_modeset_lock_all(dev);
1565 if (!drm_fb_helper_is_bound(fb_helper)) {
1566 drm_modeset_unlock_all(dev);
1567 return -EBUSY;
1568 }
1569
1570 if (drm_drv_uses_atomic_modeset(dev))
1571 ret = pan_display_atomic(var, info);
1572 else
1573 ret = pan_display_legacy(var, info);
1559 drm_modeset_unlock_all(dev); 1574 drm_modeset_unlock_all(dev);
1575
1560 return ret; 1576 return ret;
1561} 1577}
1562EXPORT_SYMBOL(drm_fb_helper_pan_display); 1578EXPORT_SYMBOL(drm_fb_helper_pan_display);