diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2017-04-03 04:33:04 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2017-04-06 04:23:06 -0400 |
commit | 7128645d5c647ba3fe1684f2d5710ee403babca2 (patch) | |
tree | 992f53b596c646b933fba423bb59631cbe0b37cb | |
parent | 941b8caaa88db02d7c287e937182a71de2751cbb (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.c | 72 |
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 | ||
421 | static int restore_fbdev_mode(struct drm_fb_helper *fb_helper) | 421 | static 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 | ||
460 | static 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 | /** | 1523 | static 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 | */ | ||
1521 | int 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 | } |
1558 | unlock: | 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 | */ | ||
1554 | int 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 | } |
1562 | EXPORT_SYMBOL(drm_fb_helper_pan_display); | 1578 | EXPORT_SYMBOL(drm_fb_helper_pan_display); |