diff options
Diffstat (limited to 'drivers/gpu/drm/drm_atomic_helper.c')
-rw-r--r-- | drivers/gpu/drm/drm_atomic_helper.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index 0c6f62168776..e5aec45bf985 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c | |||
@@ -210,6 +210,14 @@ update_connector_routing(struct drm_atomic_state *state, int conn_idx) | |||
210 | return -EINVAL; | 210 | return -EINVAL; |
211 | } | 211 | } |
212 | 212 | ||
213 | if (!drm_encoder_crtc_ok(new_encoder, connector_state->crtc)) { | ||
214 | DRM_DEBUG_ATOMIC("[ENCODER:%d:%s] incompatible with [CRTC:%d]\n", | ||
215 | new_encoder->base.id, | ||
216 | new_encoder->name, | ||
217 | connector_state->crtc->base.id); | ||
218 | return -EINVAL; | ||
219 | } | ||
220 | |||
213 | if (new_encoder == connector_state->best_encoder) { | 221 | if (new_encoder == connector_state->best_encoder) { |
214 | DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] keeps [ENCODER:%d:%s], now on [CRTC:%d]\n", | 222 | DRM_DEBUG_ATOMIC("[CONNECTOR:%d:%s] keeps [ENCODER:%d:%s], now on [CRTC:%d]\n", |
215 | connector->base.id, | 223 | connector->base.id, |
@@ -1553,6 +1561,9 @@ retry: | |||
1553 | goto fail; | 1561 | goto fail; |
1554 | } | 1562 | } |
1555 | 1563 | ||
1564 | if (plane_state->crtc && (plane == plane->crtc->cursor)) | ||
1565 | plane_state->state->legacy_cursor_update = true; | ||
1566 | |||
1556 | ret = __drm_atomic_helper_disable_plane(plane, plane_state); | 1567 | ret = __drm_atomic_helper_disable_plane(plane, plane_state); |
1557 | if (ret != 0) | 1568 | if (ret != 0) |
1558 | goto fail; | 1569 | goto fail; |
@@ -1605,9 +1616,6 @@ int __drm_atomic_helper_disable_plane(struct drm_plane *plane, | |||
1605 | plane_state->src_h = 0; | 1616 | plane_state->src_h = 0; |
1606 | plane_state->src_w = 0; | 1617 | plane_state->src_w = 0; |
1607 | 1618 | ||
1608 | if (plane->crtc && (plane == plane->crtc->cursor)) | ||
1609 | plane_state->state->legacy_cursor_update = true; | ||
1610 | |||
1611 | return 0; | 1619 | return 0; |
1612 | } | 1620 | } |
1613 | 1621 | ||
@@ -1741,6 +1749,7 @@ int __drm_atomic_helper_set_config(struct drm_mode_set *set, | |||
1741 | struct drm_crtc_state *crtc_state; | 1749 | struct drm_crtc_state *crtc_state; |
1742 | struct drm_plane_state *primary_state; | 1750 | struct drm_plane_state *primary_state; |
1743 | struct drm_crtc *crtc = set->crtc; | 1751 | struct drm_crtc *crtc = set->crtc; |
1752 | int hdisplay, vdisplay; | ||
1744 | int ret; | 1753 | int ret; |
1745 | 1754 | ||
1746 | crtc_state = drm_atomic_get_crtc_state(state, crtc); | 1755 | crtc_state = drm_atomic_get_crtc_state(state, crtc); |
@@ -1783,19 +1792,21 @@ int __drm_atomic_helper_set_config(struct drm_mode_set *set, | |||
1783 | if (ret != 0) | 1792 | if (ret != 0) |
1784 | return ret; | 1793 | return ret; |
1785 | 1794 | ||
1795 | drm_crtc_get_hv_timing(set->mode, &hdisplay, &vdisplay); | ||
1796 | |||
1786 | drm_atomic_set_fb_for_plane(primary_state, set->fb); | 1797 | drm_atomic_set_fb_for_plane(primary_state, set->fb); |
1787 | primary_state->crtc_x = 0; | 1798 | primary_state->crtc_x = 0; |
1788 | primary_state->crtc_y = 0; | 1799 | primary_state->crtc_y = 0; |
1789 | primary_state->crtc_h = set->mode->vdisplay; | 1800 | primary_state->crtc_h = vdisplay; |
1790 | primary_state->crtc_w = set->mode->hdisplay; | 1801 | primary_state->crtc_w = hdisplay; |
1791 | primary_state->src_x = set->x << 16; | 1802 | primary_state->src_x = set->x << 16; |
1792 | primary_state->src_y = set->y << 16; | 1803 | primary_state->src_y = set->y << 16; |
1793 | if (primary_state->rotation & (BIT(DRM_ROTATE_90) | BIT(DRM_ROTATE_270))) { | 1804 | if (primary_state->rotation & (BIT(DRM_ROTATE_90) | BIT(DRM_ROTATE_270))) { |
1794 | primary_state->src_h = set->mode->hdisplay << 16; | 1805 | primary_state->src_h = hdisplay << 16; |
1795 | primary_state->src_w = set->mode->vdisplay << 16; | 1806 | primary_state->src_w = vdisplay << 16; |
1796 | } else { | 1807 | } else { |
1797 | primary_state->src_h = set->mode->vdisplay << 16; | 1808 | primary_state->src_h = vdisplay << 16; |
1798 | primary_state->src_w = set->mode->hdisplay << 16; | 1809 | primary_state->src_w = hdisplay << 16; |
1799 | } | 1810 | } |
1800 | 1811 | ||
1801 | commit: | 1812 | commit: |