|
15 | 15 |
|
16 | 16 | #include <drm/drm_atomic.h> |
17 | 17 | #include <drm/drm_atomic_helper.h> |
| 18 | +#include <drm/drm_blend.h> |
18 | 19 | #include <drm/drm_drv.h> |
19 | 20 | #include <drm/drm_edid.h> |
20 | 21 | #include <drm/drm_fb_dma_helper.h> |
@@ -259,10 +260,22 @@ static int vc4_txp_connector_atomic_check(struct drm_connector *conn, |
259 | 260 | crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc); |
260 | 261 |
|
261 | 262 | fb = conn_state->writeback_job->fb; |
262 | | - if (fb->width != crtc_state->mode.hdisplay || |
263 | | - fb->height != crtc_state->mode.vdisplay) { |
264 | | - DRM_DEBUG_KMS("Invalid framebuffer size %ux%u\n", |
265 | | - fb->width, fb->height); |
| 263 | + if ((conn_state->rotation == DRM_MODE_ROTATE_0 && |
| 264 | + fb->width != crtc_state->mode.hdisplay && |
| 265 | + fb->height != crtc_state->mode.vdisplay) || |
| 266 | + (conn_state->rotation == (DRM_MODE_ROTATE_0 | DRM_MODE_TRANSPOSE) && |
| 267 | + fb->width != crtc_state->mode.vdisplay && |
| 268 | + fb->height != crtc_state->mode.hdisplay)) { |
| 269 | + DRM_DEBUG_KMS("Invalid framebuffer size %ux%u vs mode %ux%u\n", |
| 270 | + fb->width, fb->height, |
| 271 | + crtc_state->mode.hdisplay, crtc_state->mode.vdisplay); |
| 272 | + return -EINVAL; |
| 273 | + } |
| 274 | + |
| 275 | + if (conn_state->rotation & DRM_MODE_TRANSPOSE && |
| 276 | + (fb->format->format == DRM_FORMAT_RGB888 || |
| 277 | + fb->format->format == DRM_FORMAT_BGR888)) { |
| 278 | + DRM_DEBUG_KMS("24bpp formats not supported when transposing\n"); |
266 | 279 | return -EINVAL; |
267 | 280 | } |
268 | 281 |
|
@@ -330,6 +343,9 @@ static void vc4_txp_connector_atomic_commit(struct drm_connector *conn, |
330 | 343 | */ |
331 | 344 | ctrl |= TXP_ALPHA_INVERT; |
332 | 345 |
|
| 346 | + if (conn_state->rotation & DRM_MODE_TRANSPOSE) |
| 347 | + ctrl |= TXP_TRANSPOSE; |
| 348 | + |
333 | 349 | if (!drm_dev_enter(drm, &idx)) |
334 | 350 | return; |
335 | 351 |
|
@@ -608,6 +624,10 @@ static int vc4_txp_bind(struct device *dev, struct device *master, void *data) |
608 | 624 | if (ret) |
609 | 625 | return ret; |
610 | 626 |
|
| 627 | + drm_connector_create_rotation_property(&txp->connector.base, DRM_MODE_ROTATE_0, |
| 628 | + DRM_MODE_ROTATE_0 | |
| 629 | + DRM_MODE_TRANSPOSE); |
| 630 | + |
611 | 631 | ret = devm_request_irq(dev, irq, vc4_txp_interrupt, 0, |
612 | 632 | dev_name(dev), txp); |
613 | 633 | if (ret) |
|
0 commit comments