Messages in this thread | | | From | CK Hu (胡俊光) <> | Subject | Re: [PATCH v2 1/1] drm/mediatek: Fix errors when reporting rotation capability | Date | Mon, 6 Nov 2023 05:55:02 +0000 |
| |
Hi, Hsiao-chien:
On Mon, 2023-10-30 at 17:03 +0800, Hsiao Chien Sung wrote: > For CRTCs that doesn't support rotation should still return > DRM_MODE_ROTATE_0. Returns hardware capabilities accordingly.
The original code would not call drm_plane_create_rotation_property() to create rotation property if CRTC does not support rotation. I think this behavior is OK because not all drm driver call drm_plane_create_rotation_property() and it works. So ovl adaptor is not necessary to implement supported_rotations() callback function. If some OVL does not support rotation, you could return 0 directly.
Regards, CK
> > Fixes: 84d805753983 ("drm/mediatek: Support reflect-y plane > rotation") > > Reviewed-by: AngeloGioacchino Del Regno < > angelogioacchino.delregno@collabora.com> > Signed-off-by: Hsiao Chien Sung <shawn.sung@mediatek.com> > --- > drivers/gpu/drm/mediatek/mtk_disp_drv.h | 1 + > drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 30 ++++++++++------- > -- > .../gpu/drm/mediatek/mtk_disp_ovl_adaptor.c | 5 ++++ > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 1 + > drivers/gpu/drm/mediatek/mtk_drm_plane.c | 2 +- > 5 files changed, 24 insertions(+), 15 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h > b/drivers/gpu/drm/mediatek/mtk_disp_drv.h > index 4d6e8b667bc3..c5afeb7c5527 100644 > --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h > +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h > @@ -127,6 +127,7 @@ void mtk_ovl_adaptor_register_vblank_cb(struct > device *dev, void (*vblank_cb)(vo > void mtk_ovl_adaptor_unregister_vblank_cb(struct device *dev); > void mtk_ovl_adaptor_enable_vblank(struct device *dev); > void mtk_ovl_adaptor_disable_vblank(struct device *dev); > +unsigned int mtk_ovl_adaptor_supported_rotations(struct device > *dev); > void mtk_ovl_adaptor_start(struct device *dev); > void mtk_ovl_adaptor_stop(struct device *dev); > unsigned int mtk_ovl_adaptor_layer_nr(struct device *dev); > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c > b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c > index ecc38932fd44..bca7b2f4b1d9 100644 > --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c > +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c > @@ -177,6 +177,7 @@ static const u32 mt8195_ovl_crc_ofs[] = { > * @supports_clrfmt_ext: whether the ovl supports clear format (for > alpha blend) > * @crc_ofs: crc offset table > * @crc_cnt: count of crc registers (could be more than one bank) > + * @rotations: supported rotations > */ > struct mtk_disp_ovl_data { > unsigned int addr; > @@ -190,6 +191,7 @@ struct mtk_disp_ovl_data { > bool supports_clrfmt_ext; > const u32 *crc_ofs; > size_t crc_cnt; > + unsigned int rotations; > }; > > /** > @@ -415,35 +417,26 @@ unsigned int mtk_ovl_layer_nr(struct device > *dev) > > unsigned int mtk_ovl_supported_rotations(struct device *dev) > { > - return DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180 | > - DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_Y; > + struct mtk_disp_ovl *ovl = dev_get_drvdata(dev); > + > + return ovl->data->rotations ?: DRM_MODE_ROTATE_0; > } > > int mtk_ovl_layer_check(struct device *dev, unsigned int idx, > struct mtk_plane_state *mtk_state) > { > struct drm_plane_state *state = &mtk_state->base; > - unsigned int rotation = 0; > > - rotation = drm_rotation_simplify(state->rotation, > - DRM_MODE_ROTATE_0 | > - DRM_MODE_REFLECT_X | > - DRM_MODE_REFLECT_Y); > - rotation &= ~DRM_MODE_ROTATE_0; > - > - /* We can only do reflection, not rotation */ > - if ((rotation & DRM_MODE_ROTATE_MASK) != 0) > + if (state->rotation & ~mtk_ovl_supported_rotations(dev)) > return -EINVAL; > > /* > * TODO: Rotating/reflecting YUV buffers is not supported at > this time. > * Only RGB[AX] variants are supported. > */ > - if (state->fb->format->is_yuv && rotation != 0) > + if (state->fb->format->is_yuv && (state->rotation & > ~DRM_MODE_ROTATE_0)) > return -EINVAL; > > - state->rotation = rotation; > - > return 0; > } > > @@ -883,6 +876,15 @@ static const struct mtk_disp_ovl_data > mt8195_ovl_driver_data = { > .supports_clrfmt_ext = true, > .crc_ofs = mt8195_ovl_crc_ofs, > .crc_cnt = ARRAY_SIZE(mt8195_ovl_crc_ofs), > + > + /* > + * although OVL only supports reflections on MT8195, > + * reflect x + reflect y = rotate 180 > + */ > + .rotations = DRM_MODE_ROTATE_0 | > + DRM_MODE_ROTATE_180 | > + DRM_MODE_REFLECT_X | > + DRM_MODE_REFLECT_Y, > }; > > static const struct of_device_id mtk_disp_ovl_driver_dt_match[] = { > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c > b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c > index 4398db9a6276..b0d3ebdba93a 100644 > --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c > +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl_adaptor.c > @@ -383,6 +383,11 @@ void mtk_ovl_adaptor_register_vblank_cb(struct > device *dev, void (*vblank_cb)(vo > vblank_cb, vblank_cb_data); > } > > +unsigned int mtk_ovl_adaptor_supported_rotations(struct device *dev) > +{ > + return DRM_MODE_ROTATE_0; > +} > + > void mtk_ovl_adaptor_unregister_vblank_cb(struct device *dev) > { > struct mtk_disp_ovl_adaptor *ovl_adaptor = > dev_get_drvdata(dev); > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > index ffa4868b1222..206dd6f6f99e 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > +++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c > @@ -422,6 +422,7 @@ static const struct mtk_ddp_comp_funcs > ddp_ovl_adaptor = { > .remove = mtk_ovl_adaptor_remove_comp, > .get_formats = mtk_ovl_adaptor_get_formats, > .get_num_formats = mtk_ovl_adaptor_get_num_formats, > + .supported_rotations = mtk_ovl_adaptor_supported_rotations, > }; > > static const char * const mtk_ddp_comp_stem[MTK_DDP_COMP_TYPE_MAX] = > { > diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.c > b/drivers/gpu/drm/mediatek/mtk_drm_plane.c > index e2ec61b69618..894c39a38a58 100644 > --- a/drivers/gpu/drm/mediatek/mtk_drm_plane.c > +++ b/drivers/gpu/drm/mediatek/mtk_drm_plane.c > @@ -344,7 +344,7 @@ int mtk_plane_init(struct drm_device *dev, struct > drm_plane *plane, > return err; > } > > - if (supported_rotations & ~DRM_MODE_ROTATE_0) { > + if (supported_rotations) { > err = drm_plane_create_rotation_property(plane, > DRM_MODE_ROTAT > E_0, > supported_rota > tions);
| |