drm/radeon/kms: try to detect tv vs monitor for underscan
When enabling underscan for hdmi monitors, attempt to detect whether we are driving a TV or a monitor. The should hopefully prevent underscan from being enabled on monitors attached via hdmi that do not overscan the image. Only enable underscan if the mode is a common hdtv mode (480p, 720p, etc.). Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
4b80d954a7
commit
039ed2d9a2
1 changed files with 14 additions and 1 deletions
|
@ -1094,6 +1094,18 @@ void radeon_modeset_fini(struct radeon_device *rdev)
|
||||||
radeon_i2c_fini(rdev);
|
radeon_i2c_fini(rdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool is_hdtv_mode(struct drm_display_mode *mode)
|
||||||
|
{
|
||||||
|
/* try and guess if this is a tv or a monitor */
|
||||||
|
if ((mode->vdisplay == 480 && mode->hdisplay == 720) || /* 480p */
|
||||||
|
(mode->vdisplay == 576) || /* 576p */
|
||||||
|
(mode->vdisplay == 720) || /* 720p */
|
||||||
|
(mode->vdisplay == 1080)) /* 1080p */
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc,
|
bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc,
|
||||||
struct drm_display_mode *mode,
|
struct drm_display_mode *mode,
|
||||||
struct drm_display_mode *adjusted_mode)
|
struct drm_display_mode *adjusted_mode)
|
||||||
|
@ -1141,7 +1153,8 @@ bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc,
|
||||||
if (ASIC_IS_AVIVO(rdev) &&
|
if (ASIC_IS_AVIVO(rdev) &&
|
||||||
((radeon_encoder->underscan_type == UNDERSCAN_ON) ||
|
((radeon_encoder->underscan_type == UNDERSCAN_ON) ||
|
||||||
((radeon_encoder->underscan_type == UNDERSCAN_AUTO) &&
|
((radeon_encoder->underscan_type == UNDERSCAN_AUTO) &&
|
||||||
drm_detect_hdmi_monitor(radeon_connector->edid)))) {
|
drm_detect_hdmi_monitor(radeon_connector->edid) &&
|
||||||
|
is_hdtv_mode(mode)))) {
|
||||||
radeon_crtc->h_border = (mode->hdisplay >> 5) + 16;
|
radeon_crtc->h_border = (mode->hdisplay >> 5) + 16;
|
||||||
radeon_crtc->v_border = (mode->vdisplay >> 5) + 16;
|
radeon_crtc->v_border = (mode->vdisplay >> 5) + 16;
|
||||||
radeon_crtc->rmx_type = RMX_FULL;
|
radeon_crtc->rmx_type = RMX_FULL;
|
||||||
|
|
Loading…
Add table
Reference in a new issue