Skip to content

Commit 2ac16f5

Browse files
committed
drm/rockchip: dw_hdmi_qp: expose "overscan" property
Expose the "overscan" connector property as recognized by KWin and the likes to compensate for TV overscan cropping. The CRTC will use the margin values derived from this overscan percentage in its post-composition scaler to add appropriate blank margins on all sides of the output image so that the TV doesn't eat up visible content. Signed-off-by: Alexey Charkov <alchark@flipper.net>
1 parent 8f5adfa commit 2ac16f5

1 file changed

Lines changed: 16 additions & 0 deletions

File tree

drivers/gpu/drm/rockchip/dw_hdmi_qp-rockchip.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,13 +158,21 @@ dw_hdmi_qp_rockchip_encoder_atomic_check(struct drm_encoder *encoder,
158158
struct drm_connector_state *conn_state)
159159
{
160160
const struct drm_display_info *info = &conn_state->connector->display_info;
161+
const struct drm_display_mode *adj_mode = &crtc_state->adjusted_mode;
161162
struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc_state);
162163
struct rockchip_hdmi_qp *hdmi = to_rockchip_hdmi_qp(encoder);
163164
struct dw_hdmi_qp_link_cfg *lcfg = &hdmi->link_cfg;
164165
union phy_configure_opts phy_cfg = {};
166+
unsigned int overscan;
165167
enum phy_hdmi_mode mode;
166168
int ret;
167169

170+
overscan = min(conn_state->tv.overscan, 100u);
171+
s->tv_margins.left = adj_mode->hdisplay * overscan / 200;
172+
s->tv_margins.right = s->tv_margins.left;
173+
s->tv_margins.top = adj_mode->vdisplay * overscan / 200;
174+
s->tv_margins.bottom = s->tv_margins.top;
175+
168176
if (lcfg->tmds_char_rate == conn_state->hdmi.tmds_char_rate &&
169177
s->output_bpc == conn_state->hdmi.output_bpc)
170178
return 0;
@@ -768,6 +776,14 @@ static int dw_hdmi_qp_rockchip_bind(struct device *dev, struct device *master,
768776
return dev_err_probe(dev, PTR_ERR(hdmi->connector),
769777
"Failed to init bridge connector\n");
770778

779+
ret = drm_mode_create_tv_properties_legacy(drm, 0, NULL);
780+
if (ret)
781+
return dev_err_probe(dev, ret,
782+
"Failed to create TV connector properties\n");
783+
784+
drm_object_attach_property(&hdmi->connector->base,
785+
drm->mode_config.tv_overscan_property, 0);
786+
771787
ret = drm_connector_attach_encoder(hdmi->connector, encoder);
772788
if (ret)
773789
return dev_err_probe(dev, ret, "Failed to attach connector\n");

0 commit comments

Comments
 (0)