[PATCH] Add drm properties to configure the width of the underscan borders
Alex Deucher
alexdeucher at gmail.com
Sat Sep 25 22:24:52 PDT 2010
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
>
More information about the dri-devel
mailing list