Skip to content

Commit 25fa271

Browse files
6by9popcornmix
authored andcommitted
drm/vc4: Correct handling of rotation parameter in fkms
One bit within DRM_MODE_ROTATE_MASK will always be set to determine the base rotation 0/90/180/270, and then REFLECT_X and REFLECT_Y are on top. Correct the handling which was assuming that REFLECT_[X|Y] was instead of ROTATE_x. Signed-off-by: Dave Stevenson <[email protected]>
1 parent 8ffdc01 commit 25fa271

File tree

1 file changed

+14
-23
lines changed

1 file changed

+14
-23
lines changed

drivers/gpu/drm/vc4/vc4_firmware_kms.c

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,6 @@ struct set_plane {
8282
#define TRANSFORM_FLIP_HRIZ BIT(16)
8383
#define TRANSFORM_FLIP_VERT BIT(17)
8484

85-
#define SUPPORTED_ROTATIONS (DRM_MODE_ROTATE_0 | \
86-
DRM_MODE_ROTATE_180 | \
87-
DRM_MODE_REFLECT_X | \
88-
DRM_MODE_REFLECT_Y)
89-
9085
struct mailbox_set_plane {
9186
struct rpi_firmware_property_tag_header tag;
9287
struct set_plane plane;
@@ -525,7 +520,7 @@ static int vc4_plane_to_mb(struct drm_plane *plane,
525520
const struct vc_image_format *vc_fmt =
526521
vc4_get_vc_image_fmt(drm_fmt->format);
527522
int num_planes = fb->format->num_planes;
528-
unsigned int rotation = SUPPORTED_ROTATIONS;
523+
unsigned int rotation;
529524

530525
mb->plane.vc_image_type = vc_fmt->vc_image;
531526
mb->plane.width = fb->width;
@@ -546,23 +541,16 @@ static int vc4_plane_to_mb(struct drm_plane *plane,
546541
mb->plane.is_vu = vc_fmt->is_vu;
547542
mb->plane.planes[0] = bo->paddr + fb->offsets[0];
548543

549-
rotation = drm_rotation_simplify(state->rotation, rotation);
544+
rotation = drm_rotation_simplify(state->rotation,
545+
DRM_MODE_ROTATE_0 |
546+
DRM_MODE_REFLECT_X |
547+
DRM_MODE_REFLECT_Y);
550548

551-
switch (rotation) {
552-
default:
553-
case DRM_MODE_ROTATE_0:
554-
mb->plane.transform = TRANSFORM_NO_ROTATE;
555-
break;
556-
case DRM_MODE_ROTATE_180:
557-
mb->plane.transform = TRANSFORM_ROTATE_180;
558-
break;
559-
case DRM_MODE_REFLECT_X:
560-
mb->plane.transform = TRANSFORM_FLIP_HRIZ;
561-
break;
562-
case DRM_MODE_REFLECT_Y:
563-
mb->plane.transform = TRANSFORM_FLIP_VERT;
564-
break;
565-
}
549+
mb->plane.transform = TRANSFORM_NO_ROTATE;
550+
if (rotation & DRM_MODE_REFLECT_X)
551+
mb->plane.transform |= TRANSFORM_FLIP_HRIZ;
552+
if (rotation & DRM_MODE_REFLECT_Y)
553+
mb->plane.transform |= TRANSFORM_FLIP_VERT;
566554

567555
vc4_fkms_margins_adj(state, &mb->plane);
568556

@@ -803,7 +791,10 @@ static struct drm_plane *vc4_fkms_plane_init(struct drm_device *dev,
803791

804792
drm_plane_create_alpha_property(plane);
805793
drm_plane_create_rotation_property(plane, DRM_MODE_ROTATE_0,
806-
SUPPORTED_ROTATIONS);
794+
DRM_MODE_ROTATE_0 |
795+
DRM_MODE_ROTATE_180 |
796+
DRM_MODE_REFLECT_X |
797+
DRM_MODE_REFLECT_Y);
807798
drm_plane_create_color_properties(plane,
808799
BIT(DRM_COLOR_YCBCR_BT601) |
809800
BIT(DRM_COLOR_YCBCR_BT709) |

0 commit comments

Comments
 (0)