Commit ef87d3e2 authored by Sean Paul's avatar Sean Paul Committed by CK Hu

drm/mediatek: Plumb supported rotation values from components to plane init

This patch adds the ability for components to expose supported rotations
which will be exposed to userspace via a plane rotation property.

No functional changes in this patch.
Signed-off-by: default avatarSean Paul <seanpaul@chromium.org>
Signed-off-by: default avatarCK Hu <ck.hu@mediatek.com>
parent f7c710d1
...@@ -600,13 +600,15 @@ static int mtk_drm_crtc_init_comp_planes(struct drm_device *drm_dev, ...@@ -600,13 +600,15 @@ static int mtk_drm_crtc_init_comp_planes(struct drm_device *drm_dev,
int comp_idx, int pipe) int comp_idx, int pipe)
{ {
int num_planes = mtk_drm_crtc_num_comp_planes(mtk_crtc, comp_idx); int num_planes = mtk_drm_crtc_num_comp_planes(mtk_crtc, comp_idx);
struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[comp_idx];
int i, ret; int i, ret;
for (i = 0; i < num_planes; i++) { for (i = 0; i < num_planes; i++) {
ret = mtk_plane_init(drm_dev, ret = mtk_plane_init(drm_dev,
&mtk_crtc->planes[mtk_crtc->layer_nr], &mtk_crtc->planes[mtk_crtc->layer_nr],
BIT(pipe), BIT(pipe),
mtk_drm_crtc_plane_type(mtk_crtc->layer_nr)); mtk_drm_crtc_plane_type(mtk_crtc->layer_nr),
mtk_ddp_comp_supported_rotations(comp));
if (ret) if (ret)
return ret; return ret;
......
...@@ -77,6 +77,7 @@ struct mtk_ddp_comp_funcs { ...@@ -77,6 +77,7 @@ struct mtk_ddp_comp_funcs {
void (*stop)(struct mtk_ddp_comp *comp); void (*stop)(struct mtk_ddp_comp *comp);
void (*enable_vblank)(struct mtk_ddp_comp *comp, struct drm_crtc *crtc); void (*enable_vblank)(struct mtk_ddp_comp *comp, struct drm_crtc *crtc);
void (*disable_vblank)(struct mtk_ddp_comp *comp); void (*disable_vblank)(struct mtk_ddp_comp *comp);
unsigned int (*supported_rotations)(struct mtk_ddp_comp *comp);
unsigned int (*layer_nr)(struct mtk_ddp_comp *comp); unsigned int (*layer_nr)(struct mtk_ddp_comp *comp);
void (*layer_on)(struct mtk_ddp_comp *comp, unsigned int idx); void (*layer_on)(struct mtk_ddp_comp *comp, unsigned int idx);
void (*layer_off)(struct mtk_ddp_comp *comp, unsigned int idx); void (*layer_off)(struct mtk_ddp_comp *comp, unsigned int idx);
...@@ -133,6 +134,15 @@ static inline void mtk_ddp_comp_disable_vblank(struct mtk_ddp_comp *comp) ...@@ -133,6 +134,15 @@ static inline void mtk_ddp_comp_disable_vblank(struct mtk_ddp_comp *comp)
comp->funcs->disable_vblank(comp); comp->funcs->disable_vblank(comp);
} }
static inline
unsigned int mtk_ddp_comp_supported_rotations(struct mtk_ddp_comp *comp)
{
if (comp->funcs && comp->funcs->supported_rotations)
return comp->funcs->supported_rotations(comp);
return 0;
}
static inline unsigned int mtk_ddp_comp_layer_nr(struct mtk_ddp_comp *comp) static inline unsigned int mtk_ddp_comp_layer_nr(struct mtk_ddp_comp *comp)
{ {
if (comp->funcs && comp->funcs->layer_nr) if (comp->funcs && comp->funcs->layer_nr)
......
...@@ -144,6 +144,7 @@ static void mtk_plane_atomic_update(struct drm_plane *plane, ...@@ -144,6 +144,7 @@ static void mtk_plane_atomic_update(struct drm_plane *plane,
state->pending.y = plane->state->dst.y1; state->pending.y = plane->state->dst.y1;
state->pending.width = drm_rect_width(&plane->state->dst); state->pending.width = drm_rect_width(&plane->state->dst);
state->pending.height = drm_rect_height(&plane->state->dst); state->pending.height = drm_rect_height(&plane->state->dst);
state->pending.rotation = plane->state->rotation;
wmb(); /* Make sure the above parameters are set before update */ wmb(); /* Make sure the above parameters are set before update */
state->pending.dirty = true; state->pending.dirty = true;
} }
...@@ -166,7 +167,8 @@ static const struct drm_plane_helper_funcs mtk_plane_helper_funcs = { ...@@ -166,7 +167,8 @@ static const struct drm_plane_helper_funcs mtk_plane_helper_funcs = {
}; };
int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane, int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
unsigned long possible_crtcs, enum drm_plane_type type) unsigned long possible_crtcs, enum drm_plane_type type,
unsigned int supported_rotations)
{ {
int err; int err;
...@@ -178,6 +180,14 @@ int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane, ...@@ -178,6 +180,14 @@ int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
return err; return err;
} }
if (supported_rotations & ~DRM_MODE_ROTATE_0) {
err = drm_plane_create_rotation_property(plane,
DRM_MODE_ROTATE_0,
supported_rotations);
if (err)
DRM_INFO("Create rotation property failed\n");
}
drm_plane_helper_add(plane, &mtk_plane_helper_funcs); drm_plane_helper_add(plane, &mtk_plane_helper_funcs);
return 0; return 0;
......
...@@ -20,6 +20,7 @@ struct mtk_plane_pending_state { ...@@ -20,6 +20,7 @@ struct mtk_plane_pending_state {
unsigned int y; unsigned int y;
unsigned int width; unsigned int width;
unsigned int height; unsigned int height;
unsigned int rotation;
bool dirty; bool dirty;
}; };
...@@ -35,6 +36,7 @@ to_mtk_plane_state(struct drm_plane_state *state) ...@@ -35,6 +36,7 @@ to_mtk_plane_state(struct drm_plane_state *state)
} }
int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane, int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
unsigned long possible_crtcs, enum drm_plane_type type); unsigned long possible_crtcs, enum drm_plane_type type,
unsigned int supported_rotations);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment