{
        struct drm_connector *connector;
        struct vc4_hdmi_connector *hdmi_connector;
+       int ret;
 
        hdmi_connector = devm_kzalloc(dev->dev, sizeof(*hdmi_connector),
                                      GFP_KERNEL);
                           DRM_MODE_CONNECTOR_HDMIA);
        drm_connector_helper_add(connector, &vc4_hdmi_connector_helper_funcs);
 
+       /* Create and attach TV margin props to this connector. */
+       ret = drm_mode_create_tv_margin_properties(dev);
+       if (ret)
+               return ERR_PTR(ret);
+
+       drm_connector_attach_tv_margin_properties(connector);
+
        connector->polled = (DRM_CONNECTOR_POLL_CONNECT |
                             DRM_CONNECTOR_POLL_DISCONNECT);
 
 static void vc4_hdmi_set_avi_infoframe(struct drm_encoder *encoder)
 {
        struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder);
+       struct vc4_dev *vc4 = encoder->dev->dev_private;
+       struct vc4_hdmi *hdmi = vc4->hdmi;
+       struct drm_connector_state *cstate = hdmi->connector->state;
        struct drm_crtc *crtc = encoder->crtc;
        const struct drm_display_mode *mode = &crtc->state->adjusted_mode;
        union hdmi_infoframe frame;
                                           vc4_encoder->rgb_range_selectable,
                                           false);
 
+       frame.avi.right_bar = cstate->tv.margins.right;
+       frame.avi.left_bar = cstate->tv.margins.left;
+       frame.avi.top_bar = cstate->tv.margins.top;
+       frame.avi.bottom_bar = cstate->tv.margins.bottom;
+
        vc4_hdmi_write_infoframe(encoder, &frame);
 }