Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/radeon: implement output csc property for DCE5+

Implement the property for DCE5+ asics. Older asics
require a slightly more complex process.

bug:
https://bugs.freedesktop.org/show_bug.cgi?id=83226

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

+61 -1
+6
drivers/gpu/drm/radeon/atombios_crtc.c
··· 2069 2069 radeon_crtc->connector = NULL; 2070 2070 return false; 2071 2071 } 2072 + if (radeon_crtc->encoder) { 2073 + struct radeon_encoder *radeon_encoder = 2074 + to_radeon_encoder(radeon_crtc->encoder); 2075 + 2076 + radeon_crtc->output_csc = radeon_encoder->output_csc; 2077 + } 2072 2078 if (!radeon_crtc_scaling_mode_fixup(crtc, mode, adjusted_mode)) 2073 2079 return false; 2074 2080 if (!atombios_crtc_prepare_pll(crtc, adjusted_mode))
+52
drivers/gpu/drm/radeon/radeon_connectors.c
··· 725 725 radeon_property_change_mode(&radeon_encoder->base); 726 726 } 727 727 728 + if (property == rdev->mode_info.output_csc_property) { 729 + if (connector->encoder) 730 + radeon_encoder = to_radeon_encoder(connector->encoder); 731 + else { 732 + struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; 733 + radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector)); 734 + } 735 + 736 + if (radeon_encoder->output_csc == val) 737 + return 0; 738 + 739 + radeon_encoder->output_csc = val; 740 + 741 + if (connector->encoder->crtc) { 742 + struct drm_crtc *crtc = connector->encoder->crtc; 743 + struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; 744 + struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); 745 + 746 + radeon_crtc->output_csc = radeon_encoder->output_csc; 747 + 748 + (*crtc_funcs->load_lut)(crtc); 749 + } 750 + } 751 + 728 752 return 0; 729 753 } 730 754 ··· 1896 1872 drm_object_attach_property(&radeon_connector->base.base, 1897 1873 dev->mode_config.scaling_mode_property, 1898 1874 DRM_MODE_SCALE_NONE); 1875 + if (ASIC_IS_DCE5(rdev)) 1876 + drm_object_attach_property(&radeon_connector->base.base, 1877 + rdev->mode_info.output_csc_property, 1878 + RADEON_OUTPUT_CSC_BYPASS); 1899 1879 break; 1900 1880 case DRM_MODE_CONNECTOR_DVII: 1901 1881 case DRM_MODE_CONNECTOR_DVID: ··· 1932 1904 drm_object_attach_property(&radeon_connector->base.base, 1933 1905 rdev->mode_info.audio_property, 1934 1906 RADEON_AUDIO_AUTO); 1907 + if (ASIC_IS_DCE5(rdev)) 1908 + drm_object_attach_property(&radeon_connector->base.base, 1909 + rdev->mode_info.output_csc_property, 1910 + RADEON_OUTPUT_CSC_BYPASS); 1935 1911 1936 1912 subpixel_order = SubPixelHorizontalRGB; 1937 1913 connector->interlace_allowed = true; ··· 1982 1950 drm_object_attach_property(&radeon_connector->base.base, 1983 1951 dev->mode_config.scaling_mode_property, 1984 1952 DRM_MODE_SCALE_NONE); 1953 + if (ASIC_IS_DCE5(rdev)) 1954 + drm_object_attach_property(&radeon_connector->base.base, 1955 + rdev->mode_info.output_csc_property, 1956 + RADEON_OUTPUT_CSC_BYPASS); 1985 1957 /* no HPD on analog connectors */ 1986 1958 radeon_connector->hpd.hpd = RADEON_HPD_NONE; 1987 1959 connector->polled = DRM_CONNECTOR_POLL_CONNECT; ··· 2008 1972 drm_object_attach_property(&radeon_connector->base.base, 2009 1973 dev->mode_config.scaling_mode_property, 2010 1974 DRM_MODE_SCALE_NONE); 1975 + if (ASIC_IS_DCE5(rdev)) 1976 + drm_object_attach_property(&radeon_connector->base.base, 1977 + rdev->mode_info.output_csc_property, 1978 + RADEON_OUTPUT_CSC_BYPASS); 2011 1979 /* no HPD on analog connectors */ 2012 1980 radeon_connector->hpd.hpd = RADEON_HPD_NONE; 2013 1981 connector->interlace_allowed = true; ··· 2063 2023 rdev->mode_info.load_detect_property, 2064 2024 1); 2065 2025 } 2026 + if (ASIC_IS_DCE5(rdev)) 2027 + drm_object_attach_property(&radeon_connector->base.base, 2028 + rdev->mode_info.output_csc_property, 2029 + RADEON_OUTPUT_CSC_BYPASS); 2066 2030 connector->interlace_allowed = true; 2067 2031 if (connector_type == DRM_MODE_CONNECTOR_DVII) 2068 2032 connector->doublescan_allowed = true; ··· 2112 2068 rdev->mode_info.audio_property, 2113 2069 RADEON_AUDIO_AUTO); 2114 2070 } 2071 + if (ASIC_IS_DCE5(rdev)) 2072 + drm_object_attach_property(&radeon_connector->base.base, 2073 + rdev->mode_info.output_csc_property, 2074 + RADEON_OUTPUT_CSC_BYPASS); 2115 2075 subpixel_order = SubPixelHorizontalRGB; 2116 2076 connector->interlace_allowed = true; 2117 2077 if (connector_type == DRM_MODE_CONNECTOR_HDMIB) ··· 2164 2116 rdev->mode_info.audio_property, 2165 2117 RADEON_AUDIO_AUTO); 2166 2118 } 2119 + if (ASIC_IS_DCE5(rdev)) 2120 + drm_object_attach_property(&radeon_connector->base.base, 2121 + rdev->mode_info.output_csc_property, 2122 + RADEON_OUTPUT_CSC_BYPASS); 2167 2123 connector->interlace_allowed = true; 2168 2124 /* in theory with a DP to VGA converter... */ 2169 2125 connector->doublescan_allowed = false;
+1 -1
drivers/gpu/drm/radeon/radeon_display.c
··· 154 154 (NI_GRPH_REGAMMA_MODE(NI_REGAMMA_BYPASS) | 155 155 NI_OVL_REGAMMA_MODE(NI_REGAMMA_BYPASS))); 156 156 WREG32(NI_OUTPUT_CSC_CONTROL + radeon_crtc->crtc_offset, 157 - (NI_OUTPUT_CSC_GRPH_MODE(NI_OUTPUT_CSC_BYPASS) | 157 + (NI_OUTPUT_CSC_GRPH_MODE(radeon_crtc->output_csc) | 158 158 NI_OUTPUT_CSC_OVL_MODE(NI_OUTPUT_CSC_BYPASS))); 159 159 /* XXX match this to the depth of the crtc fmt block, move to modeset? */ 160 160 WREG32(0x6940 + radeon_crtc->crtc_offset, 0);
+2
drivers/gpu/drm/radeon/radeon_mode.h
··· 366 366 u32 wm_low; 367 367 u32 wm_high; 368 368 struct drm_display_mode hw_mode; 369 + enum radeon_output_csc output_csc; 369 370 }; 370 371 371 372 struct radeon_encoder_primary_dac { ··· 460 459 bool is_ext_encoder; 461 460 u16 caps; 462 461 struct radeon_audio_funcs *audio; 462 + enum radeon_output_csc output_csc; 463 463 }; 464 464 465 465 struct radeon_connector_atom_dig {