aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_connectors.c
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2014-07-09 13:21:59 -0400
committerAlex Deucher <alexander.deucher@amd.com>2014-08-05 08:53:25 -0400
commitda9976206c15178eeae1b4445c9266125bf35b0a (patch)
tree69f2d9b88b864220b2f32d1185a4a5f0514b52de /drivers/gpu/drm/radeon/radeon_connectors.c
parent9c2448780faf013af4333b9476dcaefc94f98c93 (diff)
drm/radeon: enable display scaling on all connectors (v2)
This enables the display scaler on all connectors for r5xx and newer asics. Previously we only enabled the scaler for fixed mode displays (eDP or LVDS) since they have to use the scaler to support non-native modes. Most other displays are multi-sync or have a built in scaler to support non-native modes. The default scaling mode for non-fixed displays is none which will use the scaler in the monitor. Note that we do not populate any fake modes like we do for fixed displays so it will only use the modes in the edid. For other modes, you'll need to populate them manually. bug: https://bugs.freedesktop.org/show_bug.cgi?id=80868 v2: properly handle scaling with no modes defined Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_connectors.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_connectors.c106
1 files changed, 90 insertions, 16 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
index c667c43f1c1f..92fbe6ec9081 100644
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
@@ -271,6 +271,27 @@ static struct drm_encoder *radeon_best_single_encoder(struct drm_connector *conn
271 return NULL; 271 return NULL;
272} 272}
273 273
274static void radeon_get_native_mode(struct drm_connector *connector)
275{
276 struct drm_encoder *encoder = radeon_best_single_encoder(connector);
277 struct radeon_encoder *radeon_encoder;
278
279 if (encoder == NULL)
280 return;
281
282 radeon_encoder = to_radeon_encoder(encoder);
283
284 if (!list_empty(&connector->probed_modes)) {
285 struct drm_display_mode *preferred_mode =
286 list_first_entry(&connector->probed_modes,
287 struct drm_display_mode, head);
288
289 radeon_encoder->native_mode = *preferred_mode;
290 } else {
291 radeon_encoder->native_mode.clock = 0;
292 }
293}
294
274/* 295/*
275 * radeon_connector_analog_encoder_conflict_solve 296 * radeon_connector_analog_encoder_conflict_solve
276 * - search for other connectors sharing this encoder 297 * - search for other connectors sharing this encoder
@@ -571,6 +592,35 @@ static int radeon_connector_set_property(struct drm_connector *connector, struct
571 radeon_property_change_mode(&radeon_encoder->base); 592 radeon_property_change_mode(&radeon_encoder->base);
572 } 593 }
573 594
595 if (property == dev->mode_config.scaling_mode_property) {
596 enum radeon_rmx_type rmx_type;
597
598 if (connector->encoder)
599 radeon_encoder = to_radeon_encoder(connector->encoder);
600 else {
601 struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
602 radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));
603 }
604
605 switch (val) {
606 default:
607 case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break;
608 case DRM_MODE_SCALE_CENTER: rmx_type = RMX_CENTER; break;
609 case DRM_MODE_SCALE_ASPECT: rmx_type = RMX_ASPECT; break;
610 case DRM_MODE_SCALE_FULLSCREEN: rmx_type = RMX_FULL; break;
611 }
612 if (radeon_encoder->rmx_type == rmx_type)
613 return 0;
614
615 if ((rmx_type != DRM_MODE_SCALE_NONE) &&
616 (radeon_encoder->native_mode.clock == 0))
617 return 0;
618
619 radeon_encoder->rmx_type = rmx_type;
620
621 radeon_property_change_mode(&radeon_encoder->base);
622 }
623
574 return 0; 624 return 0;
575} 625}
576 626
@@ -788,6 +838,8 @@ static int radeon_vga_get_modes(struct drm_connector *connector)
788 838
789 ret = radeon_ddc_get_modes(radeon_connector); 839 ret = radeon_ddc_get_modes(radeon_connector);
790 840
841 radeon_get_native_mode(connector);
842
791 return ret; 843 return ret;
792} 844}
793 845
@@ -991,6 +1043,9 @@ static int radeon_dvi_get_modes(struct drm_connector *connector)
991 int ret; 1043 int ret;
992 1044
993 ret = radeon_ddc_get_modes(radeon_connector); 1045 ret = radeon_ddc_get_modes(radeon_connector);
1046
1047 radeon_get_native_mode(connector);
1048
994 return ret; 1049 return ret;
995} 1050}
996 1051
@@ -1358,6 +1413,8 @@ static int radeon_dp_get_modes(struct drm_connector *connector)
1358 radeon_atom_ext_encoder_setup_ddc(encoder); 1413 radeon_atom_ext_encoder_setup_ddc(encoder);
1359 } 1414 }
1360 ret = radeon_ddc_get_modes(radeon_connector); 1415 ret = radeon_ddc_get_modes(radeon_connector);
1416
1417 radeon_get_native_mode(connector);
1361 } 1418 }
1362 1419
1363 return ret; 1420 return ret;
@@ -1717,6 +1774,9 @@ radeon_add_atom_connector(struct drm_device *dev,
1717 drm_object_attach_property(&radeon_connector->base.base, 1774 drm_object_attach_property(&radeon_connector->base.base,
1718 rdev->mode_info.load_detect_property, 1775 rdev->mode_info.load_detect_property,
1719 1); 1776 1);
1777 drm_object_attach_property(&radeon_connector->base.base,
1778 dev->mode_config.scaling_mode_property,
1779 DRM_MODE_SCALE_NONE);
1720 break; 1780 break;
1721 case DRM_MODE_CONNECTOR_DVII: 1781 case DRM_MODE_CONNECTOR_DVII:
1722 case DRM_MODE_CONNECTOR_DVID: 1782 case DRM_MODE_CONNECTOR_DVID:
@@ -1738,6 +1798,10 @@ radeon_add_atom_connector(struct drm_device *dev,
1738 0); 1798 0);
1739 1799
1740 drm_object_attach_property(&radeon_connector->base.base, 1800 drm_object_attach_property(&radeon_connector->base.base,
1801 dev->mode_config.scaling_mode_property,
1802 DRM_MODE_SCALE_NONE);
1803
1804 drm_object_attach_property(&radeon_connector->base.base,
1741 rdev->mode_info.dither_property, 1805 rdev->mode_info.dither_property,
1742 RADEON_FMT_DITHER_DISABLE); 1806 RADEON_FMT_DITHER_DISABLE);
1743 1807
@@ -1787,6 +1851,10 @@ radeon_add_atom_connector(struct drm_device *dev,
1787 drm_object_attach_property(&radeon_connector->base.base, 1851 drm_object_attach_property(&radeon_connector->base.base,
1788 rdev->mode_info.load_detect_property, 1852 rdev->mode_info.load_detect_property,
1789 1); 1853 1);
1854 if (ASIC_IS_AVIVO(rdev))
1855 drm_object_attach_property(&radeon_connector->base.base,
1856 dev->mode_config.scaling_mode_property,
1857 DRM_MODE_SCALE_NONE);
1790 /* no HPD on analog connectors */ 1858 /* no HPD on analog connectors */
1791 radeon_connector->hpd.hpd = RADEON_HPD_NONE; 1859 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1792 connector->polled = DRM_CONNECTOR_POLL_CONNECT; 1860 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
@@ -1805,6 +1873,10 @@ radeon_add_atom_connector(struct drm_device *dev,
1805 drm_object_attach_property(&radeon_connector->base.base, 1873 drm_object_attach_property(&radeon_connector->base.base,
1806 rdev->mode_info.load_detect_property, 1874 rdev->mode_info.load_detect_property,
1807 1); 1875 1);
1876 if (ASIC_IS_AVIVO(rdev))
1877 drm_object_attach_property(&radeon_connector->base.base,
1878 dev->mode_config.scaling_mode_property,
1879 DRM_MODE_SCALE_NONE);
1808 /* no HPD on analog connectors */ 1880 /* no HPD on analog connectors */
1809 radeon_connector->hpd.hpd = RADEON_HPD_NONE; 1881 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1810 connector->interlace_allowed = true; 1882 connector->interlace_allowed = true;
@@ -1838,17 +1910,18 @@ radeon_add_atom_connector(struct drm_device *dev,
1838 drm_object_attach_property(&radeon_connector->base.base, 1910 drm_object_attach_property(&radeon_connector->base.base,
1839 rdev->mode_info.underscan_vborder_property, 1911 rdev->mode_info.underscan_vborder_property,
1840 0); 1912 0);
1913 drm_object_attach_property(&radeon_connector->base.base,
1914 rdev->mode_info.dither_property,
1915 RADEON_FMT_DITHER_DISABLE);
1916 drm_object_attach_property(&radeon_connector->base.base,
1917 dev->mode_config.scaling_mode_property,
1918 DRM_MODE_SCALE_NONE);
1841 } 1919 }
1842 if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { 1920 if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) {
1843 drm_object_attach_property(&radeon_connector->base.base, 1921 drm_object_attach_property(&radeon_connector->base.base,
1844 rdev->mode_info.audio_property, 1922 rdev->mode_info.audio_property,
1845 RADEON_AUDIO_AUTO); 1923 RADEON_AUDIO_AUTO);
1846 } 1924 }
1847 if (ASIC_IS_AVIVO(rdev)) {
1848 drm_object_attach_property(&radeon_connector->base.base,
1849 rdev->mode_info.dither_property,
1850 RADEON_FMT_DITHER_DISABLE);
1851 }
1852 if (connector_type == DRM_MODE_CONNECTOR_DVII) { 1925 if (connector_type == DRM_MODE_CONNECTOR_DVII) {
1853 radeon_connector->dac_load_detect = true; 1926 radeon_connector->dac_load_detect = true;
1854 drm_object_attach_property(&radeon_connector->base.base, 1927 drm_object_attach_property(&radeon_connector->base.base,
@@ -1888,17 +1961,18 @@ radeon_add_atom_connector(struct drm_device *dev,
1888 drm_object_attach_property(&radeon_connector->base.base, 1961 drm_object_attach_property(&radeon_connector->base.base,
1889 rdev->mode_info.underscan_vborder_property, 1962 rdev->mode_info.underscan_vborder_property,
1890 0); 1963 0);
1964 drm_object_attach_property(&radeon_connector->base.base,
1965 rdev->mode_info.dither_property,
1966 RADEON_FMT_DITHER_DISABLE);
1967 drm_object_attach_property(&radeon_connector->base.base,
1968 dev->mode_config.scaling_mode_property,
1969 DRM_MODE_SCALE_NONE);
1891 } 1970 }
1892 if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { 1971 if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) {
1893 drm_object_attach_property(&radeon_connector->base.base, 1972 drm_object_attach_property(&radeon_connector->base.base,
1894 rdev->mode_info.audio_property, 1973 rdev->mode_info.audio_property,
1895 RADEON_AUDIO_AUTO); 1974 RADEON_AUDIO_AUTO);
1896 } 1975 }
1897 if (ASIC_IS_AVIVO(rdev)) {
1898 drm_object_attach_property(&radeon_connector->base.base,
1899 rdev->mode_info.dither_property,
1900 RADEON_FMT_DITHER_DISABLE);
1901 }
1902 subpixel_order = SubPixelHorizontalRGB; 1976 subpixel_order = SubPixelHorizontalRGB;
1903 connector->interlace_allowed = true; 1977 connector->interlace_allowed = true;
1904 if (connector_type == DRM_MODE_CONNECTOR_HDMIB) 1978 if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
@@ -1935,18 +2009,18 @@ radeon_add_atom_connector(struct drm_device *dev,
1935 drm_object_attach_property(&radeon_connector->base.base, 2009 drm_object_attach_property(&radeon_connector->base.base,
1936 rdev->mode_info.underscan_vborder_property, 2010 rdev->mode_info.underscan_vborder_property,
1937 0); 2011 0);
2012 drm_object_attach_property(&radeon_connector->base.base,
2013 rdev->mode_info.dither_property,
2014 RADEON_FMT_DITHER_DISABLE);
2015 drm_object_attach_property(&radeon_connector->base.base,
2016 dev->mode_config.scaling_mode_property,
2017 DRM_MODE_SCALE_NONE);
1938 } 2018 }
1939 if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { 2019 if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) {
1940 drm_object_attach_property(&radeon_connector->base.base, 2020 drm_object_attach_property(&radeon_connector->base.base,
1941 rdev->mode_info.audio_property, 2021 rdev->mode_info.audio_property,
1942 RADEON_AUDIO_AUTO); 2022 RADEON_AUDIO_AUTO);
1943 } 2023 }
1944 if (ASIC_IS_AVIVO(rdev)) {
1945 drm_object_attach_property(&radeon_connector->base.base,
1946 rdev->mode_info.dither_property,
1947 RADEON_FMT_DITHER_DISABLE);
1948
1949 }
1950 connector->interlace_allowed = true; 2024 connector->interlace_allowed = true;
1951 /* in theory with a DP to VGA converter... */ 2025 /* in theory with a DP to VGA converter... */
1952 connector->doublescan_allowed = false; 2026 connector->doublescan_allowed = false;