diff options
author | Marius Gröger <marius.groeger@googlemail.com> | 2010-09-21 15:30:59 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-10-05 21:46:20 -0400 |
commit | 5bccf5e32f010ac4d99e1eafb8669cfb35a0889a (patch) | |
tree | 9d1174cc1b0ff129edab3d380ba03d5cfcd2eed2 /drivers/gpu/drm/radeon | |
parent | d0f8a854c340986359a3b0a97e380c71def7a440 (diff) |
drm/radeon: add properties to configure the width of the underscan borders
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@googlemail.com>
Reviewed-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_connectors.c | 55 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_display.c | 28 | ||||
-rw-r--r-- | 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 ecc1a8fafbfd..64c3ddf02167 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 | |||
326 | } | 326 | } |
327 | } | 327 | } |
328 | 328 | ||
329 | if (property == rdev->mode_info.underscan_hborder_property) { | ||
330 | /* need to find digital encoder on connector */ | ||
331 | encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS); | ||
332 | if (!encoder) | ||
333 | return 0; | ||
334 | |||
335 | radeon_encoder = to_radeon_encoder(encoder); | ||
336 | |||
337 | if (radeon_encoder->underscan_hborder != val) { | ||
338 | radeon_encoder->underscan_hborder = val; | ||
339 | radeon_property_change_mode(&radeon_encoder->base); | ||
340 | } | ||
341 | } | ||
342 | |||
343 | if (property == rdev->mode_info.underscan_vborder_property) { | ||
344 | /* need to find digital encoder on connector */ | ||
345 | encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS); | ||
346 | if (!encoder) | ||
347 | return 0; | ||
348 | |||
349 | radeon_encoder = to_radeon_encoder(encoder); | ||
350 | |||
351 | if (radeon_encoder->underscan_vborder != val) { | ||
352 | radeon_encoder->underscan_vborder = val; | ||
353 | radeon_property_change_mode(&radeon_encoder->base); | ||
354 | } | ||
355 | } | ||
356 | |||
329 | if (property == rdev->mode_info.tv_std_property) { | 357 | if (property == rdev->mode_info.tv_std_property) { |
330 | encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TVDAC); | 358 | encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TVDAC); |
331 | if (!encoder) { | 359 | if (!encoder) { |
@@ -1153,10 +1181,17 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1153 | drm_connector_attach_property(&radeon_connector->base, | 1181 | drm_connector_attach_property(&radeon_connector->base, |
1154 | rdev->mode_info.coherent_mode_property, | 1182 | rdev->mode_info.coherent_mode_property, |
1155 | 1); | 1183 | 1); |
1156 | if (ASIC_IS_AVIVO(rdev)) | 1184 | if (ASIC_IS_AVIVO(rdev)) { |
1157 | drm_connector_attach_property(&radeon_connector->base, | 1185 | drm_connector_attach_property(&radeon_connector->base, |
1158 | rdev->mode_info.underscan_property, | 1186 | rdev->mode_info.underscan_property, |
1159 | UNDERSCAN_AUTO); | 1187 | UNDERSCAN_AUTO); |
1188 | drm_connector_attach_property(&radeon_connector->base, | ||
1189 | rdev->mode_info.underscan_hborder_property, | ||
1190 | 0); | ||
1191 | drm_connector_attach_property(&radeon_connector->base, | ||
1192 | rdev->mode_info.underscan_vborder_property, | ||
1193 | 0); | ||
1194 | } | ||
1160 | if (connector_type == DRM_MODE_CONNECTOR_DVII) { | 1195 | if (connector_type == DRM_MODE_CONNECTOR_DVII) { |
1161 | radeon_connector->dac_load_detect = true; | 1196 | radeon_connector->dac_load_detect = true; |
1162 | drm_connector_attach_property(&radeon_connector->base, | 1197 | drm_connector_attach_property(&radeon_connector->base, |
@@ -1181,10 +1216,17 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1181 | drm_connector_attach_property(&radeon_connector->base, | 1216 | drm_connector_attach_property(&radeon_connector->base, |
1182 | rdev->mode_info.coherent_mode_property, | 1217 | rdev->mode_info.coherent_mode_property, |
1183 | 1); | 1218 | 1); |
1184 | if (ASIC_IS_AVIVO(rdev)) | 1219 | if (ASIC_IS_AVIVO(rdev)) { |
1185 | drm_connector_attach_property(&radeon_connector->base, | 1220 | drm_connector_attach_property(&radeon_connector->base, |
1186 | rdev->mode_info.underscan_property, | 1221 | rdev->mode_info.underscan_property, |
1187 | UNDERSCAN_AUTO); | 1222 | UNDERSCAN_AUTO); |
1223 | drm_connector_attach_property(&radeon_connector->base, | ||
1224 | rdev->mode_info.underscan_hborder_property, | ||
1225 | 0); | ||
1226 | drm_connector_attach_property(&radeon_connector->base, | ||
1227 | rdev->mode_info.underscan_vborder_property, | ||
1228 | 0); | ||
1229 | } | ||
1188 | subpixel_order = SubPixelHorizontalRGB; | 1230 | subpixel_order = SubPixelHorizontalRGB; |
1189 | break; | 1231 | break; |
1190 | case DRM_MODE_CONNECTOR_DisplayPort: | 1232 | case DRM_MODE_CONNECTOR_DisplayPort: |
@@ -1212,10 +1254,17 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
1212 | drm_connector_attach_property(&radeon_connector->base, | 1254 | drm_connector_attach_property(&radeon_connector->base, |
1213 | rdev->mode_info.coherent_mode_property, | 1255 | rdev->mode_info.coherent_mode_property, |
1214 | 1); | 1256 | 1); |
1215 | if (ASIC_IS_AVIVO(rdev)) | 1257 | if (ASIC_IS_AVIVO(rdev)) { |
1216 | drm_connector_attach_property(&radeon_connector->base, | 1258 | drm_connector_attach_property(&radeon_connector->base, |
1217 | rdev->mode_info.underscan_property, | 1259 | rdev->mode_info.underscan_property, |
1218 | UNDERSCAN_AUTO); | 1260 | UNDERSCAN_AUTO); |
1261 | drm_connector_attach_property(&radeon_connector->base, | ||
1262 | rdev->mode_info.underscan_hborder_property, | ||
1263 | 0); | ||
1264 | drm_connector_attach_property(&radeon_connector->base, | ||
1265 | rdev->mode_info.underscan_vborder_property, | ||
1266 | 0); | ||
1267 | } | ||
1219 | break; | 1268 | break; |
1220 | case DRM_MODE_CONNECTOR_SVIDEO: | 1269 | case DRM_MODE_CONNECTOR_SVIDEO: |
1221 | case DRM_MODE_CONNECTOR_Composite: | 1270 | case DRM_MODE_CONNECTOR_Composite: |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index b92d2f2fcbed..902f7ce86bbc 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
@@ -1002,6 +1002,24 @@ static int radeon_modeset_create_props(struct radeon_device *rdev) | |||
1002 | radeon_underscan_enum_list[i].name); | 1002 | radeon_underscan_enum_list[i].name); |
1003 | } | 1003 | } |
1004 | 1004 | ||
1005 | rdev->mode_info.underscan_hborder_property = | ||
1006 | drm_property_create(rdev->ddev, | ||
1007 | DRM_MODE_PROP_RANGE, | ||
1008 | "underscan hborder", 2); | ||
1009 | if (!rdev->mode_info.underscan_hborder_property) | ||
1010 | return -ENOMEM; | ||
1011 | rdev->mode_info.underscan_hborder_property->values[0] = 0; | ||
1012 | rdev->mode_info.underscan_hborder_property->values[1] = 128; | ||
1013 | |||
1014 | rdev->mode_info.underscan_vborder_property = | ||
1015 | drm_property_create(rdev->ddev, | ||
1016 | DRM_MODE_PROP_RANGE, | ||
1017 | "underscan vborder", 2); | ||
1018 | if (!rdev->mode_info.underscan_vborder_property) | ||
1019 | return -ENOMEM; | ||
1020 | rdev->mode_info.underscan_vborder_property->values[0] = 0; | ||
1021 | rdev->mode_info.underscan_vborder_property->values[1] = 128; | ||
1022 | |||
1005 | return 0; | 1023 | return 0; |
1006 | } | 1024 | } |
1007 | 1025 | ||
@@ -1159,8 +1177,14 @@ bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc, | |||
1159 | ((radeon_encoder->underscan_type == UNDERSCAN_AUTO) && | 1177 | ((radeon_encoder->underscan_type == UNDERSCAN_AUTO) && |
1160 | drm_detect_hdmi_monitor(radeon_connector->edid) && | 1178 | drm_detect_hdmi_monitor(radeon_connector->edid) && |
1161 | is_hdtv_mode(mode)))) { | 1179 | is_hdtv_mode(mode)))) { |
1162 | radeon_crtc->h_border = (mode->hdisplay >> 5) + 16; | 1180 | if (radeon_encoder->underscan_hborder != 0) |
1163 | radeon_crtc->v_border = (mode->vdisplay >> 5) + 16; | 1181 | radeon_crtc->h_border = radeon_encoder->underscan_hborder; |
1182 | else | ||
1183 | radeon_crtc->h_border = (mode->hdisplay >> 5) + 16; | ||
1184 | if (radeon_encoder->underscan_vborder != 0) | ||
1185 | radeon_crtc->v_border = radeon_encoder->underscan_vborder; | ||
1186 | else | ||
1187 | radeon_crtc->v_border = (mode->vdisplay >> 5) + 16; | ||
1164 | radeon_crtc->rmx_type = RMX_FULL; | 1188 | radeon_crtc->rmx_type = RMX_FULL; |
1165 | src_v = crtc->mode.vdisplay; | 1189 | src_v = crtc->mode.vdisplay; |
1166 | dst_v = crtc->mode.vdisplay - (radeon_crtc->v_border * 2); | 1190 | 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 17a6602b5885..8e071bf5e250 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -241,6 +241,8 @@ struct radeon_mode_info { | |||
241 | struct drm_property *tmds_pll_property; | 241 | struct drm_property *tmds_pll_property; |
242 | /* underscan */ | 242 | /* underscan */ |
243 | struct drm_property *underscan_property; | 243 | struct drm_property *underscan_property; |
244 | struct drm_property *underscan_hborder_property; | ||
245 | struct drm_property *underscan_vborder_property; | ||
244 | /* hardcoded DFP edid from BIOS */ | 246 | /* hardcoded DFP edid from BIOS */ |
245 | struct edid *bios_hardcoded_edid; | 247 | struct edid *bios_hardcoded_edid; |
246 | 248 | ||
@@ -370,6 +372,8 @@ struct radeon_encoder { | |||
370 | uint32_t pixel_clock; | 372 | uint32_t pixel_clock; |
371 | enum radeon_rmx_type rmx_type; | 373 | enum radeon_rmx_type rmx_type; |
372 | enum radeon_underscan_type underscan_type; | 374 | enum radeon_underscan_type underscan_type; |
375 | uint32_t underscan_hborder; | ||
376 | uint32_t underscan_vborder; | ||
373 | struct drm_display_mode native_mode; | 377 | struct drm_display_mode native_mode; |
374 | void *enc_priv; | 378 | void *enc_priv; |
375 | int audio_polling_active; | 379 | int audio_polling_active; |