diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_display.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_display.c | 73 |
1 files changed, 69 insertions, 4 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index acebbc76c2f9..d26dabf878d9 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
| @@ -68,7 +68,7 @@ static void avivo_crtc_load_lut(struct drm_crtc *crtc) | |||
| 68 | WREG32(AVIVO_D1GRPH_LUT_SEL + radeon_crtc->crtc_offset, radeon_crtc->crtc_id); | 68 | WREG32(AVIVO_D1GRPH_LUT_SEL + radeon_crtc->crtc_offset, radeon_crtc->crtc_id); |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | static void evergreen_crtc_load_lut(struct drm_crtc *crtc) | 71 | static void dce4_crtc_load_lut(struct drm_crtc *crtc) |
| 72 | { | 72 | { |
| 73 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | 73 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); |
| 74 | struct drm_device *dev = crtc->dev; | 74 | struct drm_device *dev = crtc->dev; |
| @@ -98,6 +98,66 @@ static void evergreen_crtc_load_lut(struct drm_crtc *crtc) | |||
| 98 | } | 98 | } |
| 99 | } | 99 | } |
| 100 | 100 | ||
| 101 | static void dce5_crtc_load_lut(struct drm_crtc *crtc) | ||
| 102 | { | ||
| 103 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | ||
| 104 | struct drm_device *dev = crtc->dev; | ||
| 105 | struct radeon_device *rdev = dev->dev_private; | ||
| 106 | int i; | ||
| 107 | |||
| 108 | DRM_DEBUG_KMS("%d\n", radeon_crtc->crtc_id); | ||
| 109 | |||
| 110 | WREG32(NI_INPUT_CSC_CONTROL + radeon_crtc->crtc_offset, | ||
| 111 | (NI_INPUT_CSC_GRPH_MODE(NI_INPUT_CSC_BYPASS) | | ||
| 112 | NI_INPUT_CSC_OVL_MODE(NI_INPUT_CSC_BYPASS))); | ||
| 113 | WREG32(NI_PRESCALE_GRPH_CONTROL + radeon_crtc->crtc_offset, | ||
| 114 | NI_GRPH_PRESCALE_BYPASS); | ||
| 115 | WREG32(NI_PRESCALE_OVL_CONTROL + radeon_crtc->crtc_offset, | ||
| 116 | NI_OVL_PRESCALE_BYPASS); | ||
| 117 | WREG32(NI_INPUT_GAMMA_CONTROL + radeon_crtc->crtc_offset, | ||
| 118 | (NI_GRPH_INPUT_GAMMA_MODE(NI_INPUT_GAMMA_USE_LUT) | | ||
| 119 | NI_OVL_INPUT_GAMMA_MODE(NI_INPUT_GAMMA_USE_LUT))); | ||
| 120 | |||
| 121 | WREG32(EVERGREEN_DC_LUT_CONTROL + radeon_crtc->crtc_offset, 0); | ||
| 122 | |||
| 123 | WREG32(EVERGREEN_DC_LUT_BLACK_OFFSET_BLUE + radeon_crtc->crtc_offset, 0); | ||
| 124 | WREG32(EVERGREEN_DC_LUT_BLACK_OFFSET_GREEN + radeon_crtc->crtc_offset, 0); | ||
| 125 | WREG32(EVERGREEN_DC_LUT_BLACK_OFFSET_RED + radeon_crtc->crtc_offset, 0); | ||
| 126 | |||
| 127 | WREG32(EVERGREEN_DC_LUT_WHITE_OFFSET_BLUE + radeon_crtc->crtc_offset, 0xffff); | ||
| 128 | WREG32(EVERGREEN_DC_LUT_WHITE_OFFSET_GREEN + radeon_crtc->crtc_offset, 0xffff); | ||
| 129 | WREG32(EVERGREEN_DC_LUT_WHITE_OFFSET_RED + radeon_crtc->crtc_offset, 0xffff); | ||
| 130 | |||
| 131 | WREG32(EVERGREEN_DC_LUT_RW_MODE + radeon_crtc->crtc_offset, 0); | ||
| 132 | WREG32(EVERGREEN_DC_LUT_WRITE_EN_MASK + radeon_crtc->crtc_offset, 0x00000007); | ||
| 133 | |||
| 134 | WREG32(EVERGREEN_DC_LUT_RW_INDEX + radeon_crtc->crtc_offset, 0); | ||
| 135 | for (i = 0; i < 256; i++) { | ||
| 136 | WREG32(EVERGREEN_DC_LUT_30_COLOR + radeon_crtc->crtc_offset, | ||
| 137 | (radeon_crtc->lut_r[i] << 20) | | ||
| 138 | (radeon_crtc->lut_g[i] << 10) | | ||
| 139 | (radeon_crtc->lut_b[i] << 0)); | ||
| 140 | } | ||
| 141 | |||
| 142 | WREG32(NI_DEGAMMA_CONTROL + radeon_crtc->crtc_offset, | ||
| 143 | (NI_GRPH_DEGAMMA_MODE(NI_DEGAMMA_BYPASS) | | ||
| 144 | NI_OVL_DEGAMMA_MODE(NI_DEGAMMA_BYPASS) | | ||
| 145 | NI_ICON_DEGAMMA_MODE(NI_DEGAMMA_BYPASS) | | ||
| 146 | NI_CURSOR_DEGAMMA_MODE(NI_DEGAMMA_BYPASS))); | ||
| 147 | WREG32(NI_GAMUT_REMAP_CONTROL + radeon_crtc->crtc_offset, | ||
| 148 | (NI_GRPH_GAMUT_REMAP_MODE(NI_GAMUT_REMAP_BYPASS) | | ||
| 149 | NI_OVL_GAMUT_REMAP_MODE(NI_GAMUT_REMAP_BYPASS))); | ||
| 150 | WREG32(NI_REGAMMA_CONTROL + radeon_crtc->crtc_offset, | ||
| 151 | (NI_GRPH_REGAMMA_MODE(NI_REGAMMA_BYPASS) | | ||
| 152 | NI_OVL_REGAMMA_MODE(NI_REGAMMA_BYPASS))); | ||
| 153 | WREG32(NI_OUTPUT_CSC_CONTROL + radeon_crtc->crtc_offset, | ||
| 154 | (NI_OUTPUT_CSC_GRPH_MODE(NI_OUTPUT_CSC_BYPASS) | | ||
| 155 | NI_OUTPUT_CSC_OVL_MODE(NI_OUTPUT_CSC_BYPASS))); | ||
| 156 | /* XXX match this to the depth of the crtc fmt block, move to modeset? */ | ||
| 157 | WREG32(0x6940 + radeon_crtc->crtc_offset, 0); | ||
| 158 | |||
| 159 | } | ||
| 160 | |||
| 101 | static void legacy_crtc_load_lut(struct drm_crtc *crtc) | 161 | static void legacy_crtc_load_lut(struct drm_crtc *crtc) |
| 102 | { | 162 | { |
| 103 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | 163 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); |
| @@ -130,8 +190,10 @@ void radeon_crtc_load_lut(struct drm_crtc *crtc) | |||
| 130 | if (!crtc->enabled) | 190 | if (!crtc->enabled) |
| 131 | return; | 191 | return; |
| 132 | 192 | ||
| 133 | if (ASIC_IS_DCE4(rdev)) | 193 | if (ASIC_IS_DCE5(rdev)) |
| 134 | evergreen_crtc_load_lut(crtc); | 194 | dce5_crtc_load_lut(crtc); |
| 195 | else if (ASIC_IS_DCE4(rdev)) | ||
| 196 | dce4_crtc_load_lut(crtc); | ||
| 135 | else if (ASIC_IS_AVIVO(rdev)) | 197 | else if (ASIC_IS_AVIVO(rdev)) |
| 136 | avivo_crtc_load_lut(crtc); | 198 | avivo_crtc_load_lut(crtc); |
| 137 | else | 199 | else |
| @@ -1119,7 +1181,10 @@ int radeon_modeset_init(struct radeon_device *rdev) | |||
| 1119 | 1181 | ||
| 1120 | rdev->ddev->mode_config.funcs = (void *)&radeon_mode_funcs; | 1182 | rdev->ddev->mode_config.funcs = (void *)&radeon_mode_funcs; |
| 1121 | 1183 | ||
| 1122 | if (ASIC_IS_AVIVO(rdev)) { | 1184 | if (ASIC_IS_DCE5(rdev)) { |
| 1185 | rdev->ddev->mode_config.max_width = 16384; | ||
| 1186 | rdev->ddev->mode_config.max_height = 16384; | ||
| 1187 | } else if (ASIC_IS_AVIVO(rdev)) { | ||
| 1123 | rdev->ddev->mode_config.max_width = 8192; | 1188 | rdev->ddev->mode_config.max_width = 8192; |
| 1124 | rdev->ddev->mode_config.max_height = 8192; | 1189 | rdev->ddev->mode_config.max_height = 8192; |
| 1125 | } else { | 1190 | } else { |
