2010/9/21 Marius Gr?ger <marius.groeger at googlemail.com>: > This allows for a more exact fitting on the physical > display. The new properties default to zero which corresponds to the > previous underscan border width[height] formula: > (display_width[display_width] >> 5) + 16. > > Example to set a horizontal border width of 30 and a vertikal border > height of 22: > > ? xrandr --output HDMI-0 --set underscan on --set "underscan hborder" 30 > --set "underscan vborder" 22 > > Signed-off-by: Marius Gr?ger <marius.groeger at googlemail.com>
Looks good. Reviewed-by: Alex Deucher <alexdeucher at gmail.com> > --- > ?drivers/gpu/drm/radeon/radeon_connectors.c | ? 55 > ++++++++++++++++++++++++++-- > ?drivers/gpu/drm/radeon/radeon_display.c ? ?| ? 28 +++++++++++++- > ?drivers/gpu/drm/radeon/radeon_mode.h ? ? ? | ? ?4 ++ > ?3 files changed, 82 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c > b/drivers/gpu/drm/radeon/radeon_connectors.c > index 1a5ee39..12ec609 100644 > --- a/drivers/gpu/drm/radeon/radeon_connectors.c > +++ b/drivers/gpu/drm/radeon/radeon_connectors.c > @@ -326,6 +326,34 @@ int radeon_connector_set_property(struct drm_connector > *connector, struct drm_pr > ? ? ? ? ? ? ? ?} > ? ? ? ?} > > + ? ? ? if (property == rdev->mode_info.underscan_hborder_property) { > + ? ? ? ? ? ? ? /* need to find digital encoder on connector */ > + ? ? ? ? ? ? ? encoder = radeon_find_encoder(connector, > DRM_MODE_ENCODER_TMDS); > + ? ? ? ? ? ? ? if (!encoder) > + ? ? ? ? ? ? ? ? ? ? ? return 0; > + > + ? ? ? ? ? ? ? radeon_encoder = to_radeon_encoder(encoder); > + > + ? ? ? ? ? ? ? if (radeon_encoder->underscan_hborder != val) { > + ? ? ? ? ? ? ? ? ? ? ? radeon_encoder->underscan_hborder = val; > + ? ? ? ? ? ? ? ? ? ? ? radeon_property_change_mode(&radeon_encoder->base); > + ? ? ? ? ? ? ? } > + ? ? ? } > + > + ? ? ? if (property == rdev->mode_info.underscan_vborder_property) { > + ? ? ? ? ? ? ? /* need to find digital encoder on connector */ > + ? ? ? ? ? ? ? encoder = radeon_find_encoder(connector, > DRM_MODE_ENCODER_TMDS); > + ? ? ? ? ? ? ? if (!encoder) > + ? ? ? ? ? ? ? ? ? ? ? return 0; > + > + ? ? ? ? ? ? ? radeon_encoder = to_radeon_encoder(encoder); > + > + ? ? ? ? ? ? ? if (radeon_encoder->underscan_vborder != val) { > + ? ? ? ? ? ? ? ? ? ? ? radeon_encoder->underscan_vborder = val; > + ? ? ? ? ? ? ? ? ? ? ? radeon_property_change_mode(&radeon_encoder->base); > + ? ? ? ? ? ? ? } > + ? ? ? } > + > ? ? ? ?if (property == rdev->mode_info.tv_std_property) { > ? ? ? ? ? ? ? ?encoder = radeon_find_encoder(connector, > DRM_MODE_ENCODER_TVDAC); > ? ? ? ? ? ? ? ?if (!encoder) { > @@ -1142,10 +1170,17 @@ radeon_add_atom_connector(struct drm_device *dev, > ? ? ? ? ? ? ? ?drm_connector_attach_property(&radeon_connector->base, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? > ?rdev->mode_info.coherent_mode_property, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1); > - ? ? ? ? ? ? ? if (ASIC_IS_AVIVO(rdev)) > + ? ? ? ? ? ? ? if (ASIC_IS_AVIVO(rdev)) { > ? ? ? ? ? ? ? ? ? ? ? ?drm_connector_attach_property(&radeon_connector->base, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? > ?rdev->mode_info.underscan_property, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?UNDERSCAN_AUTO); > + ? ? ? ? ? ? ? ? ? ? ? drm_connector_attach_property(&radeon_connector->base, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? > rdev->mode_info.underscan_hborder_property, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0); > + ? ? ? ? ? ? ? ? ? ? ? drm_connector_attach_property(&radeon_connector->base, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? > rdev->mode_info.underscan_vborder_property, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0); > + ? ? ? ? ? ? ? } > ? ? ? ? ? ? ? ?if (connector_type == DRM_MODE_CONNECTOR_DVII) { > ? ? ? ? ? ? ? ? ? ? ? ?radeon_connector->dac_load_detect = true; > ? ? ? ? ? ? ? ? ? ? ? ?drm_connector_attach_property(&radeon_connector->base, > @@ -1170,10 +1205,17 @@ radeon_add_atom_connector(struct drm_device *dev, > ? ? ? ? ? ? ? ?drm_connector_attach_property(&radeon_connector->base, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? > ?rdev->mode_info.coherent_mode_property, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1); > - ? ? ? ? ? ? ? if (ASIC_IS_AVIVO(rdev)) > + ? ? ? ? ? ? ? if (ASIC_IS_AVIVO(rdev)) { > ? ? ? ? ? ? ? ? ? ? ? ?drm_connector_attach_property(&radeon_connector->base, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? > ?rdev->mode_info.underscan_property, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?UNDERSCAN_AUTO); > + ? ? ? ? ? ? ? ? ? ? ? drm_connector_attach_property(&radeon_connector->base, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? > rdev->mode_info.underscan_hborder_property, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0); > + ? ? ? ? ? ? ? ? ? ? ? drm_connector_attach_property(&radeon_connector->base, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? > rdev->mode_info.underscan_vborder_property, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0); > + ? ? ? ? ? ? ? } > ? ? ? ? ? ? ? ?subpixel_order = SubPixelHorizontalRGB; > ? ? ? ? ? ? ? ?break; > ? ? ? ?case DRM_MODE_CONNECTOR_DisplayPort: > @@ -1201,10 +1243,17 @@ radeon_add_atom_connector(struct drm_device *dev, > ? ? ? ? ? ? ? ?drm_connector_attach_property(&radeon_connector->base, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? > ?rdev->mode_info.coherent_mode_property, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1); > - ? ? ? ? ? ? ? if (ASIC_IS_AVIVO(rdev)) > + ? ? ? ? ? ? ? if (ASIC_IS_AVIVO(rdev)) { > ? ? ? ? ? ? ? ? ? ? ? ?drm_connector_attach_property(&radeon_connector->base, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? > ?rdev->mode_info.underscan_property, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?UNDERSCAN_AUTO); > + ? ? ? ? ? ? ? ? ? ? ? drm_connector_attach_property(&radeon_connector->base, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? > rdev->mode_info.underscan_hborder_property, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0); > + ? ? ? ? ? ? ? ? ? ? ? drm_connector_attach_property(&radeon_connector->base, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? > rdev->mode_info.underscan_vborder_property, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 0); > + ? ? ? ? ? ? ? } > ? ? ? ? ? ? ? ?break; > ? ? ? ?case DRM_MODE_CONNECTOR_SVIDEO: > ? ? ? ?case DRM_MODE_CONNECTOR_Composite: > diff --git a/drivers/gpu/drm/radeon/radeon_display.c > b/drivers/gpu/drm/radeon/radeon_display.c > index 6dd434a..c465955 100644 > --- a/drivers/gpu/drm/radeon/radeon_display.c > +++ b/drivers/gpu/drm/radeon/radeon_display.c > @@ -999,6 +999,24 @@ static int radeon_modeset_create_props(struct > radeon_device *rdev) > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?radeon_underscan_enum_list[i].name); > ? ? ? ?} > > + ? ? ? rdev->mode_info.underscan_hborder_property = > + ? ? ? ? ? ? ? drm_property_create(rdev->ddev, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? DRM_MODE_PROP_RANGE, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "underscan hborder", 2); > + ? ? ? if (!rdev->mode_info.underscan_hborder_property) > + ? ? ? ? ? ? ? return -ENOMEM; > + ? ? ? rdev->mode_info.underscan_hborder_property->values[0] = 0; > + ? ? ? rdev->mode_info.underscan_hborder_property->values[1] = 128; > + > + ? ? ? rdev->mode_info.underscan_vborder_property = > + ? ? ? ? ? ? ? drm_property_create(rdev->ddev, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? DRM_MODE_PROP_RANGE, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "underscan vborder", 2); > + ? ? ? if (!rdev->mode_info.underscan_vborder_property) > + ? ? ? ? ? ? ? return -ENOMEM; > + ? ? ? rdev->mode_info.underscan_vborder_property->values[0] = 0; > + ? ? ? rdev->mode_info.underscan_vborder_property->values[1] = 128; > + > ? ? ? ?return 0; > ?} > > @@ -1155,8 +1173,14 @@ bool radeon_crtc_scaling_mode_fixup(struct drm_crtc > *crtc, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ((radeon_encoder->underscan_type == > UNDERSCAN_AUTO) && > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?drm_detect_hdmi_monitor(radeon_connector->edid) > && > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?is_hdtv_mode(mode)))) { > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? radeon_crtc->h_border = (mode->hdisplay >> 5) > + 16; > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? radeon_crtc->v_border = (mode->vdisplay >> 5) > + 16; > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (radeon_encoder->underscan_hborder != 0) > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? radeon_crtc->h_border = > radeon_encoder->underscan_hborder; > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? radeon_crtc->h_border = > (mode->hdisplay >> 5) + 16; > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if (radeon_encoder->underscan_vborder != 0) > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? radeon_crtc->v_border = > radeon_encoder->underscan_vborder; > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? else > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? radeon_crtc->v_border = > (mode->vdisplay >> 5) + 16; > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?radeon_crtc->rmx_type = RMX_FULL; > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?src_v = crtc->mode.vdisplay; > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?dst_v = crtc->mode.vdisplay - > (radeon_crtc->v_border * 2); > diff --git a/drivers/gpu/drm/radeon/radeon_mode.h > b/drivers/gpu/drm/radeon/radeon_mode.h > index 8f93e2b..6f2d22c 100644 > --- a/drivers/gpu/drm/radeon/radeon_mode.h > +++ b/drivers/gpu/drm/radeon/radeon_mode.h > @@ -240,6 +240,8 @@ struct radeon_mode_info { > ? ? ? ?struct drm_property *tmds_pll_property; > ? ? ? ?/* underscan */ > ? ? ? ?struct drm_property *underscan_property; > + ? ? ? struct drm_property *underscan_hborder_property; > + ? ? ? struct drm_property *underscan_vborder_property; > ? ? ? ?/* hardcoded DFP edid from BIOS */ > ? ? ? ?struct edid *bios_hardcoded_edid; > > @@ -369,6 +371,8 @@ struct radeon_encoder { > ? ? ? ?uint32_t pixel_clock; > ? ? ? ?enum radeon_rmx_type rmx_type; > ? ? ? ?enum radeon_underscan_type underscan_type; > + ? ? ? uint32_t underscan_hborder; > + ? ? ? uint32_t underscan_vborder; > ? ? ? ?struct drm_display_mode native_mode; > ? ? ? ?void *enc_priv; > ? ? ? ?int audio_polling_active; > -- > 1.7.0.4 > > _______________________________________________ > dri-devel mailing list > dri-devel at lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/dri-devel >