aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon
diff options
context:
space:
mode:
authorMarius Gröger <marius.groeger@googlemail.com>2010-09-21 15:30:59 -0400
committerDave Airlie <airlied@redhat.com>2010-10-05 21:46:20 -0400
commit5bccf5e32f010ac4d99e1eafb8669cfb35a0889a (patch)
tree9d1174cc1b0ff129edab3d380ba03d5cfcd2eed2 /drivers/gpu/drm/radeon
parentd0f8a854c340986359a3b0a97e380c71def7a440 (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.c55
-rw-r--r--drivers/gpu/drm/radeon/radeon_display.c28
-rw-r--r--drivers/gpu/drm/radeon/radeon_mode.h4
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;