1 1.1 riastrad /* $NetBSD: radeon_atombios_encoders.c,v 1.2 2021/12/18 23:45:43 riastradh Exp $ */ 2 1.1 riastrad 3 1.1 riastrad /* 4 1.1 riastrad * Copyright 2007-11 Advanced Micro Devices, Inc. 5 1.1 riastrad * Copyright 2008 Red Hat Inc. 6 1.1 riastrad * 7 1.1 riastrad * Permission is hereby granted, free of charge, to any person obtaining a 8 1.1 riastrad * copy of this software and associated documentation files (the "Software"), 9 1.1 riastrad * to deal in the Software without restriction, including without limitation 10 1.1 riastrad * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 1.1 riastrad * and/or sell copies of the Software, and to permit persons to whom the 12 1.1 riastrad * Software is furnished to do so, subject to the following conditions: 13 1.1 riastrad * 14 1.1 riastrad * The above copyright notice and this permission notice shall be included in 15 1.1 riastrad * all copies or substantial portions of the Software. 16 1.1 riastrad * 17 1.1 riastrad * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 1.1 riastrad * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 1.1 riastrad * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 1.1 riastrad * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 21 1.1 riastrad * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22 1.1 riastrad * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 1.1 riastrad * OTHER DEALINGS IN THE SOFTWARE. 24 1.1 riastrad * 25 1.1 riastrad * Authors: Dave Airlie 26 1.1 riastrad * Alex Deucher 27 1.1 riastrad */ 28 1.2 riastrad 29 1.1 riastrad #include <sys/cdefs.h> 30 1.1 riastrad __KERNEL_RCSID(0, "$NetBSD: radeon_atombios_encoders.c,v 1.2 2021/12/18 23:45:43 riastradh Exp $"); 31 1.1 riastrad 32 1.2 riastrad #include <linux/backlight.h> 33 1.2 riastrad #include <linux/dmi.h> 34 1.2 riastrad #include <linux/pci.h> 35 1.2 riastrad 36 1.1 riastrad #include <drm/drm_crtc_helper.h> 37 1.2 riastrad #include <drm/drm_file.h> 38 1.1 riastrad #include <drm/radeon_drm.h> 39 1.2 riastrad 40 1.2 riastrad #include "atom.h" 41 1.1 riastrad #include "radeon.h" 42 1.1 riastrad #include "radeon_asic.h" 43 1.1 riastrad #include "radeon_audio.h" 44 1.1 riastrad 45 1.1 riastrad extern int atom_debug; 46 1.1 riastrad 47 1.1 riastrad static u8 48 1.1 riastrad radeon_atom_get_backlight_level_from_reg(struct radeon_device *rdev) 49 1.1 riastrad { 50 1.1 riastrad u8 backlight_level; 51 1.1 riastrad u32 bios_2_scratch; 52 1.1 riastrad 53 1.1 riastrad if (rdev->family >= CHIP_R600) 54 1.1 riastrad bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH); 55 1.1 riastrad else 56 1.1 riastrad bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH); 57 1.1 riastrad 58 1.1 riastrad backlight_level = ((bios_2_scratch & ATOM_S2_CURRENT_BL_LEVEL_MASK) >> 59 1.1 riastrad ATOM_S2_CURRENT_BL_LEVEL_SHIFT); 60 1.1 riastrad 61 1.1 riastrad return backlight_level; 62 1.1 riastrad } 63 1.1 riastrad 64 1.1 riastrad static void 65 1.1 riastrad radeon_atom_set_backlight_level_to_reg(struct radeon_device *rdev, 66 1.1 riastrad u8 backlight_level) 67 1.1 riastrad { 68 1.1 riastrad u32 bios_2_scratch; 69 1.1 riastrad 70 1.1 riastrad if (rdev->family >= CHIP_R600) 71 1.1 riastrad bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH); 72 1.1 riastrad else 73 1.1 riastrad bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH); 74 1.1 riastrad 75 1.1 riastrad bios_2_scratch &= ~ATOM_S2_CURRENT_BL_LEVEL_MASK; 76 1.1 riastrad bios_2_scratch |= ((backlight_level << ATOM_S2_CURRENT_BL_LEVEL_SHIFT) & 77 1.1 riastrad ATOM_S2_CURRENT_BL_LEVEL_MASK); 78 1.1 riastrad 79 1.1 riastrad if (rdev->family >= CHIP_R600) 80 1.1 riastrad WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch); 81 1.1 riastrad else 82 1.1 riastrad WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch); 83 1.1 riastrad } 84 1.1 riastrad 85 1.1 riastrad u8 86 1.1 riastrad atombios_get_backlight_level(struct radeon_encoder *radeon_encoder) 87 1.1 riastrad { 88 1.1 riastrad struct drm_device *dev = radeon_encoder->base.dev; 89 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 90 1.1 riastrad 91 1.1 riastrad if (!(rdev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU)) 92 1.1 riastrad return 0; 93 1.1 riastrad 94 1.1 riastrad return radeon_atom_get_backlight_level_from_reg(rdev); 95 1.1 riastrad } 96 1.1 riastrad 97 1.1 riastrad void 98 1.1 riastrad atombios_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level) 99 1.1 riastrad { 100 1.1 riastrad struct drm_encoder *encoder = &radeon_encoder->base; 101 1.1 riastrad struct drm_device *dev = radeon_encoder->base.dev; 102 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 103 1.1 riastrad struct radeon_encoder_atom_dig *dig; 104 1.1 riastrad DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION args; 105 1.1 riastrad int index; 106 1.1 riastrad 107 1.1 riastrad if (!(rdev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU)) 108 1.1 riastrad return; 109 1.1 riastrad 110 1.1 riastrad if ((radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) && 111 1.1 riastrad radeon_encoder->enc_priv) { 112 1.1 riastrad dig = radeon_encoder->enc_priv; 113 1.1 riastrad dig->backlight_level = level; 114 1.1 riastrad radeon_atom_set_backlight_level_to_reg(rdev, dig->backlight_level); 115 1.1 riastrad 116 1.1 riastrad switch (radeon_encoder->encoder_id) { 117 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_LVDS: 118 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_LVTM1: 119 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl); 120 1.1 riastrad if (dig->backlight_level == 0) { 121 1.1 riastrad args.ucAction = ATOM_LCD_BLOFF; 122 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 123 1.1 riastrad } else { 124 1.1 riastrad args.ucAction = ATOM_LCD_BL_BRIGHTNESS_CONTROL; 125 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 126 1.1 riastrad args.ucAction = ATOM_LCD_BLON; 127 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 128 1.1 riastrad } 129 1.1 riastrad break; 130 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 131 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: 132 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 133 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 134 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: 135 1.1 riastrad if (dig->backlight_level == 0) 136 1.1 riastrad atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0); 137 1.1 riastrad else { 138 1.1 riastrad atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_BL_BRIGHTNESS_CONTROL, 0, 0); 139 1.1 riastrad atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_LCD_BLON, 0, 0); 140 1.1 riastrad } 141 1.1 riastrad break; 142 1.1 riastrad default: 143 1.1 riastrad break; 144 1.1 riastrad } 145 1.1 riastrad } 146 1.1 riastrad } 147 1.1 riastrad 148 1.1 riastrad #if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE) || IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) 149 1.1 riastrad 150 1.1 riastrad static u8 radeon_atom_bl_level(struct backlight_device *bd) 151 1.1 riastrad { 152 1.1 riastrad u8 level; 153 1.1 riastrad 154 1.1 riastrad /* Convert brightness to hardware level */ 155 1.1 riastrad if (bd->props.brightness < 0) 156 1.1 riastrad level = 0; 157 1.1 riastrad else if (bd->props.brightness > RADEON_MAX_BL_LEVEL) 158 1.1 riastrad level = RADEON_MAX_BL_LEVEL; 159 1.1 riastrad else 160 1.1 riastrad level = bd->props.brightness; 161 1.1 riastrad 162 1.1 riastrad return level; 163 1.1 riastrad } 164 1.1 riastrad 165 1.1 riastrad static int radeon_atom_backlight_update_status(struct backlight_device *bd) 166 1.1 riastrad { 167 1.1 riastrad struct radeon_backlight_privdata *pdata = bl_get_data(bd); 168 1.1 riastrad struct radeon_encoder *radeon_encoder = pdata->encoder; 169 1.1 riastrad 170 1.1 riastrad atombios_set_backlight_level(radeon_encoder, radeon_atom_bl_level(bd)); 171 1.1 riastrad 172 1.1 riastrad return 0; 173 1.1 riastrad } 174 1.1 riastrad 175 1.1 riastrad static int radeon_atom_backlight_get_brightness(struct backlight_device *bd) 176 1.1 riastrad { 177 1.1 riastrad struct radeon_backlight_privdata *pdata = bl_get_data(bd); 178 1.1 riastrad struct radeon_encoder *radeon_encoder = pdata->encoder; 179 1.1 riastrad struct drm_device *dev = radeon_encoder->base.dev; 180 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 181 1.1 riastrad 182 1.1 riastrad return radeon_atom_get_backlight_level_from_reg(rdev); 183 1.1 riastrad } 184 1.1 riastrad 185 1.1 riastrad static const struct backlight_ops radeon_atom_backlight_ops = { 186 1.1 riastrad .get_brightness = radeon_atom_backlight_get_brightness, 187 1.1 riastrad .update_status = radeon_atom_backlight_update_status, 188 1.1 riastrad }; 189 1.1 riastrad 190 1.1 riastrad void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder, 191 1.1 riastrad struct drm_connector *drm_connector) 192 1.1 riastrad { 193 1.1 riastrad struct drm_device *dev = radeon_encoder->base.dev; 194 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 195 1.1 riastrad struct backlight_device *bd; 196 1.1 riastrad struct backlight_properties props; 197 1.1 riastrad struct radeon_backlight_privdata *pdata; 198 1.1 riastrad struct radeon_encoder_atom_dig *dig; 199 1.1 riastrad char bl_name[16]; 200 1.1 riastrad 201 1.1 riastrad /* Mac laptops with multiple GPUs use the gmux driver for backlight 202 1.1 riastrad * so don't register a backlight device 203 1.1 riastrad */ 204 1.1 riastrad if ((rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) && 205 1.1 riastrad (rdev->pdev->device == 0x6741)) 206 1.1 riastrad return; 207 1.1 riastrad 208 1.1 riastrad if (!radeon_encoder->enc_priv) 209 1.1 riastrad return; 210 1.1 riastrad 211 1.1 riastrad if (!rdev->is_atom_bios) 212 1.1 riastrad return; 213 1.1 riastrad 214 1.1 riastrad if (!(rdev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU)) 215 1.1 riastrad return; 216 1.1 riastrad 217 1.1 riastrad pdata = kmalloc(sizeof(struct radeon_backlight_privdata), GFP_KERNEL); 218 1.1 riastrad if (!pdata) { 219 1.1 riastrad DRM_ERROR("Memory allocation failed\n"); 220 1.1 riastrad goto error; 221 1.1 riastrad } 222 1.1 riastrad 223 1.1 riastrad memset(&props, 0, sizeof(props)); 224 1.1 riastrad props.max_brightness = RADEON_MAX_BL_LEVEL; 225 1.1 riastrad props.type = BACKLIGHT_RAW; 226 1.1 riastrad snprintf(bl_name, sizeof(bl_name), 227 1.1 riastrad "radeon_bl%d", dev->primary->index); 228 1.1 riastrad bd = backlight_device_register(bl_name, drm_connector->kdev, 229 1.1 riastrad pdata, &radeon_atom_backlight_ops, &props); 230 1.1 riastrad if (IS_ERR(bd)) { 231 1.1 riastrad DRM_ERROR("Backlight registration failed\n"); 232 1.1 riastrad goto error; 233 1.1 riastrad } 234 1.1 riastrad 235 1.1 riastrad pdata->encoder = radeon_encoder; 236 1.1 riastrad 237 1.1 riastrad dig = radeon_encoder->enc_priv; 238 1.1 riastrad dig->bl_dev = bd; 239 1.1 riastrad 240 1.1 riastrad bd->props.brightness = radeon_atom_backlight_get_brightness(bd); 241 1.1 riastrad /* Set a reasonable default here if the level is 0 otherwise 242 1.1 riastrad * fbdev will attempt to turn the backlight on after console 243 1.1 riastrad * unblanking and it will try and restore 0 which turns the backlight 244 1.1 riastrad * off again. 245 1.1 riastrad */ 246 1.1 riastrad if (bd->props.brightness == 0) 247 1.1 riastrad bd->props.brightness = RADEON_MAX_BL_LEVEL; 248 1.1 riastrad bd->props.power = FB_BLANK_UNBLANK; 249 1.1 riastrad backlight_update_status(bd); 250 1.1 riastrad 251 1.1 riastrad DRM_INFO("radeon atom DIG backlight initialized\n"); 252 1.1 riastrad rdev->mode_info.bl_encoder = radeon_encoder; 253 1.1 riastrad 254 1.1 riastrad return; 255 1.1 riastrad 256 1.1 riastrad error: 257 1.1 riastrad kfree(pdata); 258 1.1 riastrad return; 259 1.1 riastrad } 260 1.1 riastrad 261 1.1 riastrad static void radeon_atom_backlight_exit(struct radeon_encoder *radeon_encoder) 262 1.1 riastrad { 263 1.1 riastrad struct drm_device *dev = radeon_encoder->base.dev; 264 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 265 1.1 riastrad struct backlight_device *bd = NULL; 266 1.1 riastrad struct radeon_encoder_atom_dig *dig; 267 1.1 riastrad 268 1.1 riastrad if (!radeon_encoder->enc_priv) 269 1.1 riastrad return; 270 1.1 riastrad 271 1.1 riastrad if (!rdev->is_atom_bios) 272 1.1 riastrad return; 273 1.1 riastrad 274 1.1 riastrad if (!(rdev->mode_info.firmware_flags & ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU)) 275 1.1 riastrad return; 276 1.1 riastrad 277 1.1 riastrad dig = radeon_encoder->enc_priv; 278 1.1 riastrad bd = dig->bl_dev; 279 1.1 riastrad dig->bl_dev = NULL; 280 1.1 riastrad 281 1.1 riastrad if (bd) { 282 1.1 riastrad struct radeon_legacy_backlight_privdata *pdata; 283 1.1 riastrad 284 1.1 riastrad pdata = bl_get_data(bd); 285 1.1 riastrad backlight_device_unregister(bd); 286 1.1 riastrad kfree(pdata); 287 1.1 riastrad 288 1.1 riastrad DRM_INFO("radeon atom LVDS backlight unloaded\n"); 289 1.1 riastrad } 290 1.1 riastrad } 291 1.1 riastrad 292 1.1 riastrad #else /* !CONFIG_BACKLIGHT_CLASS_DEVICE */ 293 1.1 riastrad 294 1.1 riastrad void radeon_atom_backlight_init(struct radeon_encoder *encoder) 295 1.1 riastrad { 296 1.1 riastrad } 297 1.1 riastrad 298 1.1 riastrad static void radeon_atom_backlight_exit(struct radeon_encoder *encoder) 299 1.1 riastrad { 300 1.1 riastrad } 301 1.1 riastrad 302 1.1 riastrad #endif 303 1.1 riastrad 304 1.1 riastrad /* evil but including atombios.h is much worse */ 305 1.1 riastrad bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index, 306 1.1 riastrad struct drm_display_mode *mode); 307 1.1 riastrad 308 1.1 riastrad static bool radeon_atom_mode_fixup(struct drm_encoder *encoder, 309 1.1 riastrad const struct drm_display_mode *mode, 310 1.1 riastrad struct drm_display_mode *adjusted_mode) 311 1.1 riastrad { 312 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 313 1.1 riastrad struct drm_device *dev = encoder->dev; 314 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 315 1.1 riastrad 316 1.1 riastrad /* set the active encoder to connector routing */ 317 1.1 riastrad radeon_encoder_set_active_device(encoder); 318 1.1 riastrad drm_mode_set_crtcinfo(adjusted_mode, 0); 319 1.1 riastrad 320 1.1 riastrad /* hw bug */ 321 1.1 riastrad if ((mode->flags & DRM_MODE_FLAG_INTERLACE) 322 1.1 riastrad && (mode->crtc_vsync_start < (mode->crtc_vdisplay + 2))) 323 1.1 riastrad adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + 2; 324 1.1 riastrad 325 1.1 riastrad /* vertical FP must be at least 1 */ 326 1.1 riastrad if (mode->crtc_vsync_start == mode->crtc_vdisplay) 327 1.1 riastrad adjusted_mode->crtc_vsync_start++; 328 1.1 riastrad 329 1.1 riastrad /* get the native mode for scaling */ 330 1.1 riastrad if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) { 331 1.1 riastrad radeon_panel_mode_fixup(encoder, adjusted_mode); 332 1.1 riastrad } else if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) { 333 1.1 riastrad struct radeon_encoder_atom_dac *tv_dac = radeon_encoder->enc_priv; 334 1.1 riastrad if (tv_dac) { 335 1.1 riastrad if (tv_dac->tv_std == TV_STD_NTSC || 336 1.1 riastrad tv_dac->tv_std == TV_STD_NTSC_J || 337 1.1 riastrad tv_dac->tv_std == TV_STD_PAL_M) 338 1.1 riastrad radeon_atom_get_tv_timings(rdev, 0, adjusted_mode); 339 1.1 riastrad else 340 1.1 riastrad radeon_atom_get_tv_timings(rdev, 1, adjusted_mode); 341 1.1 riastrad } 342 1.1 riastrad } else if (radeon_encoder->rmx_type != RMX_OFF) { 343 1.1 riastrad radeon_panel_mode_fixup(encoder, adjusted_mode); 344 1.1 riastrad } 345 1.1 riastrad 346 1.1 riastrad if (ASIC_IS_DCE3(rdev) && 347 1.1 riastrad ((radeon_encoder->active_device & (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) || 348 1.1 riastrad (radeon_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE))) { 349 1.1 riastrad struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); 350 1.1 riastrad radeon_dp_set_link_config(connector, adjusted_mode); 351 1.1 riastrad } 352 1.1 riastrad 353 1.1 riastrad return true; 354 1.1 riastrad } 355 1.1 riastrad 356 1.1 riastrad static void 357 1.1 riastrad atombios_dac_setup(struct drm_encoder *encoder, int action) 358 1.1 riastrad { 359 1.1 riastrad struct drm_device *dev = encoder->dev; 360 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 361 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 362 1.1 riastrad DAC_ENCODER_CONTROL_PS_ALLOCATION args; 363 1.1 riastrad int index = 0; 364 1.1 riastrad struct radeon_encoder_atom_dac *dac_info = radeon_encoder->enc_priv; 365 1.1 riastrad 366 1.1 riastrad memset(&args, 0, sizeof(args)); 367 1.1 riastrad 368 1.1 riastrad switch (radeon_encoder->encoder_id) { 369 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DAC1: 370 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: 371 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, DAC1EncoderControl); 372 1.1 riastrad break; 373 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DAC2: 374 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: 375 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, DAC2EncoderControl); 376 1.1 riastrad break; 377 1.1 riastrad } 378 1.1 riastrad 379 1.1 riastrad args.ucAction = action; 380 1.1 riastrad 381 1.1 riastrad if (radeon_encoder->active_device & (ATOM_DEVICE_CRT_SUPPORT)) 382 1.1 riastrad args.ucDacStandard = ATOM_DAC1_PS2; 383 1.1 riastrad else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT)) 384 1.1 riastrad args.ucDacStandard = ATOM_DAC1_CV; 385 1.1 riastrad else { 386 1.1 riastrad switch (dac_info->tv_std) { 387 1.1 riastrad case TV_STD_PAL: 388 1.1 riastrad case TV_STD_PAL_M: 389 1.1 riastrad case TV_STD_SCART_PAL: 390 1.1 riastrad case TV_STD_SECAM: 391 1.1 riastrad case TV_STD_PAL_CN: 392 1.1 riastrad args.ucDacStandard = ATOM_DAC1_PAL; 393 1.1 riastrad break; 394 1.1 riastrad case TV_STD_NTSC: 395 1.1 riastrad case TV_STD_NTSC_J: 396 1.1 riastrad case TV_STD_PAL_60: 397 1.1 riastrad default: 398 1.1 riastrad args.ucDacStandard = ATOM_DAC1_NTSC; 399 1.1 riastrad break; 400 1.1 riastrad } 401 1.1 riastrad } 402 1.1 riastrad args.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 403 1.1 riastrad 404 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 405 1.1 riastrad 406 1.1 riastrad } 407 1.1 riastrad 408 1.1 riastrad static void 409 1.1 riastrad atombios_tv_setup(struct drm_encoder *encoder, int action) 410 1.1 riastrad { 411 1.1 riastrad struct drm_device *dev = encoder->dev; 412 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 413 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 414 1.1 riastrad TV_ENCODER_CONTROL_PS_ALLOCATION args; 415 1.1 riastrad int index = 0; 416 1.1 riastrad struct radeon_encoder_atom_dac *dac_info = radeon_encoder->enc_priv; 417 1.1 riastrad 418 1.1 riastrad memset(&args, 0, sizeof(args)); 419 1.1 riastrad 420 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, TVEncoderControl); 421 1.1 riastrad 422 1.1 riastrad args.sTVEncoder.ucAction = action; 423 1.1 riastrad 424 1.1 riastrad if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT)) 425 1.1 riastrad args.sTVEncoder.ucTvStandard = ATOM_TV_CV; 426 1.1 riastrad else { 427 1.1 riastrad switch (dac_info->tv_std) { 428 1.1 riastrad case TV_STD_NTSC: 429 1.1 riastrad args.sTVEncoder.ucTvStandard = ATOM_TV_NTSC; 430 1.1 riastrad break; 431 1.1 riastrad case TV_STD_PAL: 432 1.1 riastrad args.sTVEncoder.ucTvStandard = ATOM_TV_PAL; 433 1.1 riastrad break; 434 1.1 riastrad case TV_STD_PAL_M: 435 1.1 riastrad args.sTVEncoder.ucTvStandard = ATOM_TV_PALM; 436 1.1 riastrad break; 437 1.1 riastrad case TV_STD_PAL_60: 438 1.1 riastrad args.sTVEncoder.ucTvStandard = ATOM_TV_PAL60; 439 1.1 riastrad break; 440 1.1 riastrad case TV_STD_NTSC_J: 441 1.1 riastrad args.sTVEncoder.ucTvStandard = ATOM_TV_NTSCJ; 442 1.1 riastrad break; 443 1.1 riastrad case TV_STD_SCART_PAL: 444 1.1 riastrad args.sTVEncoder.ucTvStandard = ATOM_TV_PAL; /* ??? */ 445 1.1 riastrad break; 446 1.1 riastrad case TV_STD_SECAM: 447 1.1 riastrad args.sTVEncoder.ucTvStandard = ATOM_TV_SECAM; 448 1.1 riastrad break; 449 1.1 riastrad case TV_STD_PAL_CN: 450 1.1 riastrad args.sTVEncoder.ucTvStandard = ATOM_TV_PALCN; 451 1.1 riastrad break; 452 1.1 riastrad default: 453 1.1 riastrad args.sTVEncoder.ucTvStandard = ATOM_TV_NTSC; 454 1.1 riastrad break; 455 1.1 riastrad } 456 1.1 riastrad } 457 1.1 riastrad 458 1.1 riastrad args.sTVEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 459 1.1 riastrad 460 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 461 1.1 riastrad 462 1.1 riastrad } 463 1.1 riastrad 464 1.1 riastrad static u8 radeon_atom_get_bpc(struct drm_encoder *encoder) 465 1.1 riastrad { 466 1.1 riastrad int bpc = 8; 467 1.1 riastrad 468 1.1 riastrad if (encoder->crtc) { 469 1.1 riastrad struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); 470 1.1 riastrad bpc = radeon_crtc->bpc; 471 1.1 riastrad } 472 1.1 riastrad 473 1.1 riastrad switch (bpc) { 474 1.1 riastrad case 0: 475 1.1 riastrad return PANEL_BPC_UNDEFINE; 476 1.1 riastrad case 6: 477 1.1 riastrad return PANEL_6BIT_PER_COLOR; 478 1.1 riastrad case 8: 479 1.1 riastrad default: 480 1.1 riastrad return PANEL_8BIT_PER_COLOR; 481 1.1 riastrad case 10: 482 1.1 riastrad return PANEL_10BIT_PER_COLOR; 483 1.1 riastrad case 12: 484 1.1 riastrad return PANEL_12BIT_PER_COLOR; 485 1.1 riastrad case 16: 486 1.1 riastrad return PANEL_16BIT_PER_COLOR; 487 1.1 riastrad } 488 1.1 riastrad } 489 1.1 riastrad 490 1.1 riastrad union dvo_encoder_control { 491 1.1 riastrad ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION ext_tmds; 492 1.1 riastrad DVO_ENCODER_CONTROL_PS_ALLOCATION dvo; 493 1.1 riastrad DVO_ENCODER_CONTROL_PS_ALLOCATION_V3 dvo_v3; 494 1.1 riastrad DVO_ENCODER_CONTROL_PS_ALLOCATION_V1_4 dvo_v4; 495 1.1 riastrad }; 496 1.1 riastrad 497 1.1 riastrad void 498 1.1 riastrad atombios_dvo_setup(struct drm_encoder *encoder, int action) 499 1.1 riastrad { 500 1.1 riastrad struct drm_device *dev = encoder->dev; 501 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 502 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 503 1.1 riastrad union dvo_encoder_control args; 504 1.1 riastrad int index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl); 505 1.1 riastrad uint8_t frev, crev; 506 1.1 riastrad 507 1.1 riastrad memset(&args, 0, sizeof(args)); 508 1.1 riastrad 509 1.1 riastrad if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) 510 1.1 riastrad return; 511 1.1 riastrad 512 1.1 riastrad /* some R4xx chips have the wrong frev */ 513 1.1 riastrad if (rdev->family <= CHIP_RV410) 514 1.1 riastrad frev = 1; 515 1.1 riastrad 516 1.1 riastrad switch (frev) { 517 1.1 riastrad case 1: 518 1.1 riastrad switch (crev) { 519 1.1 riastrad case 1: 520 1.1 riastrad /* R4xx, R5xx */ 521 1.1 riastrad args.ext_tmds.sXTmdsEncoder.ucEnable = action; 522 1.1 riastrad 523 1.1 riastrad if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 524 1.1 riastrad args.ext_tmds.sXTmdsEncoder.ucMisc |= PANEL_ENCODER_MISC_DUAL; 525 1.1 riastrad 526 1.1 riastrad args.ext_tmds.sXTmdsEncoder.ucMisc |= ATOM_PANEL_MISC_888RGB; 527 1.1 riastrad break; 528 1.1 riastrad case 2: 529 1.1 riastrad /* RS600/690/740 */ 530 1.1 riastrad args.dvo.sDVOEncoder.ucAction = action; 531 1.1 riastrad args.dvo.sDVOEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 532 1.1 riastrad /* DFP1, CRT1, TV1 depending on the type of port */ 533 1.1 riastrad args.dvo.sDVOEncoder.ucDeviceType = ATOM_DEVICE_DFP1_INDEX; 534 1.1 riastrad 535 1.1 riastrad if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 536 1.1 riastrad args.dvo.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute |= PANEL_ENCODER_MISC_DUAL; 537 1.1 riastrad break; 538 1.1 riastrad case 3: 539 1.1 riastrad /* R6xx */ 540 1.1 riastrad args.dvo_v3.ucAction = action; 541 1.1 riastrad args.dvo_v3.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 542 1.1 riastrad args.dvo_v3.ucDVOConfig = 0; /* XXX */ 543 1.1 riastrad break; 544 1.1 riastrad case 4: 545 1.1 riastrad /* DCE8 */ 546 1.1 riastrad args.dvo_v4.ucAction = action; 547 1.1 riastrad args.dvo_v4.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 548 1.1 riastrad args.dvo_v4.ucDVOConfig = 0; /* XXX */ 549 1.1 riastrad args.dvo_v4.ucBitPerColor = radeon_atom_get_bpc(encoder); 550 1.1 riastrad break; 551 1.1 riastrad default: 552 1.1 riastrad DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 553 1.1 riastrad break; 554 1.1 riastrad } 555 1.1 riastrad break; 556 1.1 riastrad default: 557 1.1 riastrad DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 558 1.1 riastrad break; 559 1.1 riastrad } 560 1.1 riastrad 561 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 562 1.1 riastrad } 563 1.1 riastrad 564 1.1 riastrad union lvds_encoder_control { 565 1.1 riastrad LVDS_ENCODER_CONTROL_PS_ALLOCATION v1; 566 1.1 riastrad LVDS_ENCODER_CONTROL_PS_ALLOCATION_V2 v2; 567 1.1 riastrad }; 568 1.1 riastrad 569 1.1 riastrad void 570 1.1 riastrad atombios_digital_setup(struct drm_encoder *encoder, int action) 571 1.1 riastrad { 572 1.1 riastrad struct drm_device *dev = encoder->dev; 573 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 574 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 575 1.1 riastrad struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 576 1.1 riastrad union lvds_encoder_control args; 577 1.1 riastrad int index = 0; 578 1.1 riastrad int hdmi_detected = 0; 579 1.1 riastrad uint8_t frev, crev; 580 1.1 riastrad 581 1.1 riastrad if (!dig) 582 1.1 riastrad return; 583 1.1 riastrad 584 1.1 riastrad if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) 585 1.1 riastrad hdmi_detected = 1; 586 1.1 riastrad 587 1.1 riastrad memset(&args, 0, sizeof(args)); 588 1.1 riastrad 589 1.1 riastrad switch (radeon_encoder->encoder_id) { 590 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_LVDS: 591 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, LVDSEncoderControl); 592 1.1 riastrad break; 593 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_TMDS1: 594 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: 595 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, TMDS1EncoderControl); 596 1.1 riastrad break; 597 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_LVTM1: 598 1.1 riastrad if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) 599 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, LVDSEncoderControl); 600 1.1 riastrad else 601 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, TMDS2EncoderControl); 602 1.1 riastrad break; 603 1.1 riastrad } 604 1.1 riastrad 605 1.1 riastrad if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) 606 1.1 riastrad return; 607 1.1 riastrad 608 1.1 riastrad switch (frev) { 609 1.1 riastrad case 1: 610 1.1 riastrad case 2: 611 1.1 riastrad switch (crev) { 612 1.1 riastrad case 1: 613 1.1 riastrad args.v1.ucMisc = 0; 614 1.1 riastrad args.v1.ucAction = action; 615 1.1 riastrad if (hdmi_detected) 616 1.1 riastrad args.v1.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE; 617 1.1 riastrad args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 618 1.1 riastrad if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { 619 1.1 riastrad if (dig->lcd_misc & ATOM_PANEL_MISC_DUAL) 620 1.1 riastrad args.v1.ucMisc |= PANEL_ENCODER_MISC_DUAL; 621 1.1 riastrad if (dig->lcd_misc & ATOM_PANEL_MISC_888RGB) 622 1.1 riastrad args.v1.ucMisc |= ATOM_PANEL_MISC_888RGB; 623 1.1 riastrad } else { 624 1.1 riastrad if (dig->linkb) 625 1.1 riastrad args.v1.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB; 626 1.1 riastrad if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 627 1.1 riastrad args.v1.ucMisc |= PANEL_ENCODER_MISC_DUAL; 628 1.1 riastrad /*if (pScrn->rgbBits == 8) */ 629 1.1 riastrad args.v1.ucMisc |= ATOM_PANEL_MISC_888RGB; 630 1.1 riastrad } 631 1.1 riastrad break; 632 1.1 riastrad case 2: 633 1.1 riastrad case 3: 634 1.1 riastrad args.v2.ucMisc = 0; 635 1.1 riastrad args.v2.ucAction = action; 636 1.1 riastrad if (crev == 3) { 637 1.1 riastrad if (dig->coherent_mode) 638 1.1 riastrad args.v2.ucMisc |= PANEL_ENCODER_MISC_COHERENT; 639 1.1 riastrad } 640 1.1 riastrad if (hdmi_detected) 641 1.1 riastrad args.v2.ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE; 642 1.1 riastrad args.v2.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 643 1.1 riastrad args.v2.ucTruncate = 0; 644 1.1 riastrad args.v2.ucSpatial = 0; 645 1.1 riastrad args.v2.ucTemporal = 0; 646 1.1 riastrad args.v2.ucFRC = 0; 647 1.1 riastrad if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { 648 1.1 riastrad if (dig->lcd_misc & ATOM_PANEL_MISC_DUAL) 649 1.1 riastrad args.v2.ucMisc |= PANEL_ENCODER_MISC_DUAL; 650 1.1 riastrad if (dig->lcd_misc & ATOM_PANEL_MISC_SPATIAL) { 651 1.1 riastrad args.v2.ucSpatial = PANEL_ENCODER_SPATIAL_DITHER_EN; 652 1.1 riastrad if (dig->lcd_misc & ATOM_PANEL_MISC_888RGB) 653 1.1 riastrad args.v2.ucSpatial |= PANEL_ENCODER_SPATIAL_DITHER_DEPTH; 654 1.1 riastrad } 655 1.1 riastrad if (dig->lcd_misc & ATOM_PANEL_MISC_TEMPORAL) { 656 1.1 riastrad args.v2.ucTemporal = PANEL_ENCODER_TEMPORAL_DITHER_EN; 657 1.1 riastrad if (dig->lcd_misc & ATOM_PANEL_MISC_888RGB) 658 1.1 riastrad args.v2.ucTemporal |= PANEL_ENCODER_TEMPORAL_DITHER_DEPTH; 659 1.1 riastrad if (((dig->lcd_misc >> ATOM_PANEL_MISC_GREY_LEVEL_SHIFT) & 0x3) == 2) 660 1.1 riastrad args.v2.ucTemporal |= PANEL_ENCODER_TEMPORAL_LEVEL_4; 661 1.1 riastrad } 662 1.1 riastrad } else { 663 1.1 riastrad if (dig->linkb) 664 1.1 riastrad args.v2.ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB; 665 1.1 riastrad if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 666 1.1 riastrad args.v2.ucMisc |= PANEL_ENCODER_MISC_DUAL; 667 1.1 riastrad } 668 1.1 riastrad break; 669 1.1 riastrad default: 670 1.1 riastrad DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 671 1.1 riastrad break; 672 1.1 riastrad } 673 1.1 riastrad break; 674 1.1 riastrad default: 675 1.1 riastrad DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 676 1.1 riastrad break; 677 1.1 riastrad } 678 1.1 riastrad 679 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 680 1.1 riastrad } 681 1.1 riastrad 682 1.1 riastrad int 683 1.1 riastrad atombios_get_encoder_mode(struct drm_encoder *encoder) 684 1.1 riastrad { 685 1.1 riastrad struct drm_device *dev = encoder->dev; 686 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 687 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 688 1.1 riastrad struct drm_connector *connector; 689 1.1 riastrad struct radeon_connector *radeon_connector; 690 1.1 riastrad struct radeon_connector_atom_dig *dig_connector; 691 1.1 riastrad struct radeon_encoder_atom_dig *dig_enc; 692 1.1 riastrad 693 1.1 riastrad if (radeon_encoder_is_digital(encoder)) { 694 1.1 riastrad dig_enc = radeon_encoder->enc_priv; 695 1.1 riastrad if (dig_enc->active_mst_links) 696 1.1 riastrad return ATOM_ENCODER_MODE_DP_MST; 697 1.1 riastrad } 698 1.1 riastrad if (radeon_encoder->is_mst_encoder || radeon_encoder->offset) 699 1.1 riastrad return ATOM_ENCODER_MODE_DP_MST; 700 1.1 riastrad /* dp bridges are always DP */ 701 1.1 riastrad if (radeon_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE) 702 1.1 riastrad return ATOM_ENCODER_MODE_DP; 703 1.1 riastrad 704 1.1 riastrad /* DVO is always DVO */ 705 1.1 riastrad if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DVO1) || 706 1.1 riastrad (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1)) 707 1.1 riastrad return ATOM_ENCODER_MODE_DVO; 708 1.1 riastrad 709 1.1 riastrad connector = radeon_get_connector_for_encoder(encoder); 710 1.1 riastrad /* if we don't have an active device yet, just use one of 711 1.1 riastrad * the connectors tied to the encoder. 712 1.1 riastrad */ 713 1.1 riastrad if (!connector) 714 1.1 riastrad connector = radeon_get_connector_for_encoder_init(encoder); 715 1.1 riastrad radeon_connector = to_radeon_connector(connector); 716 1.1 riastrad 717 1.1 riastrad switch (connector->connector_type) { 718 1.1 riastrad case DRM_MODE_CONNECTOR_DVII: 719 1.1 riastrad case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */ 720 1.1 riastrad if (radeon_audio != 0) { 721 1.1 riastrad if (radeon_connector->use_digital && 722 1.1 riastrad (radeon_connector->audio == RADEON_AUDIO_ENABLE)) 723 1.1 riastrad return ATOM_ENCODER_MODE_HDMI; 724 1.1 riastrad else if (drm_detect_hdmi_monitor(radeon_connector_edid(connector)) && 725 1.1 riastrad (radeon_connector->audio == RADEON_AUDIO_AUTO)) 726 1.1 riastrad return ATOM_ENCODER_MODE_HDMI; 727 1.1 riastrad else if (radeon_connector->use_digital) 728 1.1 riastrad return ATOM_ENCODER_MODE_DVI; 729 1.1 riastrad else 730 1.1 riastrad return ATOM_ENCODER_MODE_CRT; 731 1.1 riastrad } else if (radeon_connector->use_digital) { 732 1.1 riastrad return ATOM_ENCODER_MODE_DVI; 733 1.1 riastrad } else { 734 1.1 riastrad return ATOM_ENCODER_MODE_CRT; 735 1.1 riastrad } 736 1.1 riastrad break; 737 1.1 riastrad case DRM_MODE_CONNECTOR_DVID: 738 1.1 riastrad case DRM_MODE_CONNECTOR_HDMIA: 739 1.1 riastrad default: 740 1.1 riastrad if (radeon_audio != 0) { 741 1.1 riastrad if (radeon_connector->audio == RADEON_AUDIO_ENABLE) 742 1.1 riastrad return ATOM_ENCODER_MODE_HDMI; 743 1.1 riastrad else if (drm_detect_hdmi_monitor(radeon_connector_edid(connector)) && 744 1.1 riastrad (radeon_connector->audio == RADEON_AUDIO_AUTO)) 745 1.1 riastrad return ATOM_ENCODER_MODE_HDMI; 746 1.1 riastrad else 747 1.1 riastrad return ATOM_ENCODER_MODE_DVI; 748 1.1 riastrad } else { 749 1.1 riastrad return ATOM_ENCODER_MODE_DVI; 750 1.1 riastrad } 751 1.1 riastrad break; 752 1.1 riastrad case DRM_MODE_CONNECTOR_LVDS: 753 1.1 riastrad return ATOM_ENCODER_MODE_LVDS; 754 1.1 riastrad break; 755 1.1 riastrad case DRM_MODE_CONNECTOR_DisplayPort: 756 1.1 riastrad dig_connector = radeon_connector->con_priv; 757 1.1 riastrad if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || 758 1.1 riastrad (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) { 759 1.1 riastrad if (radeon_audio != 0 && 760 1.1 riastrad drm_detect_monitor_audio(radeon_connector_edid(connector)) && 761 1.1 riastrad ASIC_IS_DCE4(rdev) && !ASIC_IS_DCE5(rdev)) 762 1.1 riastrad return ATOM_ENCODER_MODE_DP_AUDIO; 763 1.1 riastrad return ATOM_ENCODER_MODE_DP; 764 1.1 riastrad } else if (radeon_audio != 0) { 765 1.1 riastrad if (radeon_connector->audio == RADEON_AUDIO_ENABLE) 766 1.1 riastrad return ATOM_ENCODER_MODE_HDMI; 767 1.1 riastrad else if (drm_detect_hdmi_monitor(radeon_connector_edid(connector)) && 768 1.1 riastrad (radeon_connector->audio == RADEON_AUDIO_AUTO)) 769 1.1 riastrad return ATOM_ENCODER_MODE_HDMI; 770 1.1 riastrad else 771 1.1 riastrad return ATOM_ENCODER_MODE_DVI; 772 1.1 riastrad } else { 773 1.1 riastrad return ATOM_ENCODER_MODE_DVI; 774 1.1 riastrad } 775 1.1 riastrad break; 776 1.1 riastrad case DRM_MODE_CONNECTOR_eDP: 777 1.1 riastrad if (radeon_audio != 0 && 778 1.1 riastrad drm_detect_monitor_audio(radeon_connector_edid(connector)) && 779 1.1 riastrad ASIC_IS_DCE4(rdev) && !ASIC_IS_DCE5(rdev)) 780 1.1 riastrad return ATOM_ENCODER_MODE_DP_AUDIO; 781 1.1 riastrad return ATOM_ENCODER_MODE_DP; 782 1.1 riastrad case DRM_MODE_CONNECTOR_DVIA: 783 1.1 riastrad case DRM_MODE_CONNECTOR_VGA: 784 1.1 riastrad return ATOM_ENCODER_MODE_CRT; 785 1.1 riastrad break; 786 1.1 riastrad case DRM_MODE_CONNECTOR_Composite: 787 1.1 riastrad case DRM_MODE_CONNECTOR_SVIDEO: 788 1.1 riastrad case DRM_MODE_CONNECTOR_9PinDIN: 789 1.1 riastrad /* fix me */ 790 1.1 riastrad return ATOM_ENCODER_MODE_TV; 791 1.1 riastrad /*return ATOM_ENCODER_MODE_CV;*/ 792 1.1 riastrad break; 793 1.1 riastrad } 794 1.1 riastrad } 795 1.1 riastrad 796 1.1 riastrad /* 797 1.1 riastrad * DIG Encoder/Transmitter Setup 798 1.1 riastrad * 799 1.1 riastrad * DCE 3.0/3.1 800 1.1 riastrad * - 2 DIG transmitter blocks. UNIPHY (links A and B) and LVTMA. 801 1.1 riastrad * Supports up to 3 digital outputs 802 1.1 riastrad * - 2 DIG encoder blocks. 803 1.1 riastrad * DIG1 can drive UNIPHY link A or link B 804 1.1 riastrad * DIG2 can drive UNIPHY link B or LVTMA 805 1.1 riastrad * 806 1.1 riastrad * DCE 3.2 807 1.1 riastrad * - 3 DIG transmitter blocks. UNIPHY0/1/2 (links A and B). 808 1.1 riastrad * Supports up to 5 digital outputs 809 1.1 riastrad * - 2 DIG encoder blocks. 810 1.1 riastrad * DIG1/2 can drive UNIPHY0/1/2 link A or link B 811 1.1 riastrad * 812 1.1 riastrad * DCE 4.0/5.0/6.0 813 1.1 riastrad * - 3 DIG transmitter blocks UNIPHY0/1/2 (links A and B). 814 1.1 riastrad * Supports up to 6 digital outputs 815 1.1 riastrad * - 6 DIG encoder blocks. 816 1.1 riastrad * - DIG to PHY mapping is hardcoded 817 1.1 riastrad * DIG1 drives UNIPHY0 link A, A+B 818 1.1 riastrad * DIG2 drives UNIPHY0 link B 819 1.1 riastrad * DIG3 drives UNIPHY1 link A, A+B 820 1.1 riastrad * DIG4 drives UNIPHY1 link B 821 1.1 riastrad * DIG5 drives UNIPHY2 link A, A+B 822 1.1 riastrad * DIG6 drives UNIPHY2 link B 823 1.1 riastrad * 824 1.1 riastrad * DCE 4.1 825 1.1 riastrad * - 3 DIG transmitter blocks UNIPHY0/1/2 (links A and B). 826 1.1 riastrad * Supports up to 6 digital outputs 827 1.1 riastrad * - 2 DIG encoder blocks. 828 1.1 riastrad * llano 829 1.1 riastrad * DIG1/2 can drive UNIPHY0/1/2 link A or link B 830 1.1 riastrad * ontario 831 1.1 riastrad * DIG1 drives UNIPHY0/1/2 link A 832 1.1 riastrad * DIG2 drives UNIPHY0/1/2 link B 833 1.1 riastrad * 834 1.1 riastrad * Routing 835 1.1 riastrad * crtc -> dig encoder -> UNIPHY/LVTMA (1 or 2 links) 836 1.1 riastrad * Examples: 837 1.1 riastrad * crtc0 -> dig2 -> LVTMA links A+B -> TMDS/HDMI 838 1.1 riastrad * crtc1 -> dig1 -> UNIPHY0 link B -> DP 839 1.1 riastrad * crtc0 -> dig1 -> UNIPHY2 link A -> LVDS 840 1.1 riastrad * crtc1 -> dig2 -> UNIPHY1 link B+A -> TMDS/HDMI 841 1.1 riastrad */ 842 1.1 riastrad 843 1.1 riastrad union dig_encoder_control { 844 1.1 riastrad DIG_ENCODER_CONTROL_PS_ALLOCATION v1; 845 1.1 riastrad DIG_ENCODER_CONTROL_PARAMETERS_V2 v2; 846 1.1 riastrad DIG_ENCODER_CONTROL_PARAMETERS_V3 v3; 847 1.1 riastrad DIG_ENCODER_CONTROL_PARAMETERS_V4 v4; 848 1.1 riastrad }; 849 1.1 riastrad 850 1.1 riastrad void 851 1.1 riastrad atombios_dig_encoder_setup2(struct drm_encoder *encoder, int action, int panel_mode, int enc_override) 852 1.1 riastrad { 853 1.1 riastrad struct drm_device *dev = encoder->dev; 854 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 855 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 856 1.1 riastrad struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 857 1.1 riastrad struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); 858 1.1 riastrad union dig_encoder_control args; 859 1.1 riastrad int index = 0; 860 1.1 riastrad uint8_t frev, crev; 861 1.1 riastrad int dp_clock = 0; 862 1.1 riastrad int dp_lane_count = 0; 863 1.1 riastrad int hpd_id = RADEON_HPD_NONE; 864 1.1 riastrad 865 1.1 riastrad if (connector) { 866 1.1 riastrad struct radeon_connector *radeon_connector = to_radeon_connector(connector); 867 1.1 riastrad struct radeon_connector_atom_dig *dig_connector = 868 1.1 riastrad radeon_connector->con_priv; 869 1.1 riastrad 870 1.1 riastrad dp_clock = dig_connector->dp_clock; 871 1.1 riastrad dp_lane_count = dig_connector->dp_lane_count; 872 1.1 riastrad hpd_id = radeon_connector->hpd.hpd; 873 1.1 riastrad } 874 1.1 riastrad 875 1.1 riastrad /* no dig encoder assigned */ 876 1.1 riastrad if (dig->dig_encoder == -1) 877 1.1 riastrad return; 878 1.1 riastrad 879 1.1 riastrad memset(&args, 0, sizeof(args)); 880 1.1 riastrad 881 1.1 riastrad if (ASIC_IS_DCE4(rdev)) 882 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, DIGxEncoderControl); 883 1.1 riastrad else { 884 1.1 riastrad if (dig->dig_encoder) 885 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, DIG2EncoderControl); 886 1.1 riastrad else 887 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, DIG1EncoderControl); 888 1.1 riastrad } 889 1.1 riastrad 890 1.1 riastrad if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) 891 1.1 riastrad return; 892 1.1 riastrad 893 1.1 riastrad switch (frev) { 894 1.1 riastrad case 1: 895 1.1 riastrad switch (crev) { 896 1.1 riastrad case 1: 897 1.1 riastrad args.v1.ucAction = action; 898 1.1 riastrad args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 899 1.1 riastrad if (action == ATOM_ENCODER_CMD_SETUP_PANEL_MODE) 900 1.1 riastrad args.v3.ucPanelMode = panel_mode; 901 1.1 riastrad else 902 1.1 riastrad args.v1.ucEncoderMode = atombios_get_encoder_mode(encoder); 903 1.1 riastrad 904 1.1 riastrad if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode)) 905 1.1 riastrad args.v1.ucLaneNum = dp_lane_count; 906 1.1 riastrad else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 907 1.1 riastrad args.v1.ucLaneNum = 8; 908 1.1 riastrad else 909 1.1 riastrad args.v1.ucLaneNum = 4; 910 1.1 riastrad 911 1.1 riastrad switch (radeon_encoder->encoder_id) { 912 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 913 1.1 riastrad args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER1; 914 1.1 riastrad break; 915 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 916 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: 917 1.1 riastrad args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER2; 918 1.1 riastrad break; 919 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 920 1.1 riastrad args.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER3; 921 1.1 riastrad break; 922 1.1 riastrad } 923 1.1 riastrad if (dig->linkb) 924 1.1 riastrad args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKB; 925 1.1 riastrad else 926 1.1 riastrad args.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKA; 927 1.1 riastrad 928 1.1 riastrad if (ENCODER_MODE_IS_DP(args.v1.ucEncoderMode) && (dp_clock == 270000)) 929 1.1 riastrad args.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ; 930 1.1 riastrad 931 1.1 riastrad break; 932 1.1 riastrad case 2: 933 1.1 riastrad case 3: 934 1.1 riastrad args.v3.ucAction = action; 935 1.1 riastrad args.v3.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 936 1.1 riastrad if (action == ATOM_ENCODER_CMD_SETUP_PANEL_MODE) 937 1.1 riastrad args.v3.ucPanelMode = panel_mode; 938 1.1 riastrad else 939 1.1 riastrad args.v3.ucEncoderMode = atombios_get_encoder_mode(encoder); 940 1.1 riastrad 941 1.1 riastrad if (ENCODER_MODE_IS_DP(args.v3.ucEncoderMode)) 942 1.1 riastrad args.v3.ucLaneNum = dp_lane_count; 943 1.1 riastrad else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 944 1.1 riastrad args.v3.ucLaneNum = 8; 945 1.1 riastrad else 946 1.1 riastrad args.v3.ucLaneNum = 4; 947 1.1 riastrad 948 1.1 riastrad if (ENCODER_MODE_IS_DP(args.v3.ucEncoderMode) && (dp_clock == 270000)) 949 1.1 riastrad args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ; 950 1.1 riastrad if (enc_override != -1) 951 1.1 riastrad args.v3.acConfig.ucDigSel = enc_override; 952 1.1 riastrad else 953 1.1 riastrad args.v3.acConfig.ucDigSel = dig->dig_encoder; 954 1.1 riastrad args.v3.ucBitPerColor = radeon_atom_get_bpc(encoder); 955 1.1 riastrad break; 956 1.1 riastrad case 4: 957 1.1 riastrad args.v4.ucAction = action; 958 1.1 riastrad args.v4.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 959 1.1 riastrad if (action == ATOM_ENCODER_CMD_SETUP_PANEL_MODE) 960 1.1 riastrad args.v4.ucPanelMode = panel_mode; 961 1.1 riastrad else 962 1.1 riastrad args.v4.ucEncoderMode = atombios_get_encoder_mode(encoder); 963 1.1 riastrad 964 1.1 riastrad if (ENCODER_MODE_IS_DP(args.v4.ucEncoderMode)) 965 1.1 riastrad args.v4.ucLaneNum = dp_lane_count; 966 1.1 riastrad else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 967 1.1 riastrad args.v4.ucLaneNum = 8; 968 1.1 riastrad else 969 1.1 riastrad args.v4.ucLaneNum = 4; 970 1.1 riastrad 971 1.1 riastrad if (ENCODER_MODE_IS_DP(args.v4.ucEncoderMode)) { 972 1.1 riastrad if (dp_clock == 540000) 973 1.1 riastrad args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_5_40GHZ; 974 1.1 riastrad else if (dp_clock == 324000) 975 1.1 riastrad args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_3_24GHZ; 976 1.1 riastrad else if (dp_clock == 270000) 977 1.1 riastrad args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_2_70GHZ; 978 1.1 riastrad else 979 1.1 riastrad args.v1.ucConfig |= ATOM_ENCODER_CONFIG_V4_DPLINKRATE_1_62GHZ; 980 1.1 riastrad } 981 1.1 riastrad 982 1.1 riastrad if (enc_override != -1) 983 1.1 riastrad args.v4.acConfig.ucDigSel = enc_override; 984 1.1 riastrad else 985 1.1 riastrad args.v4.acConfig.ucDigSel = dig->dig_encoder; 986 1.1 riastrad args.v4.ucBitPerColor = radeon_atom_get_bpc(encoder); 987 1.1 riastrad if (hpd_id == RADEON_HPD_NONE) 988 1.1 riastrad args.v4.ucHPD_ID = 0; 989 1.1 riastrad else 990 1.1 riastrad args.v4.ucHPD_ID = hpd_id + 1; 991 1.1 riastrad break; 992 1.1 riastrad default: 993 1.1 riastrad DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 994 1.1 riastrad break; 995 1.1 riastrad } 996 1.1 riastrad break; 997 1.1 riastrad default: 998 1.1 riastrad DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 999 1.1 riastrad break; 1000 1.1 riastrad } 1001 1.1 riastrad 1002 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 1003 1.1 riastrad 1004 1.1 riastrad } 1005 1.1 riastrad 1006 1.1 riastrad void 1007 1.1 riastrad atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mode) 1008 1.1 riastrad { 1009 1.1 riastrad atombios_dig_encoder_setup2(encoder, action, panel_mode, -1); 1010 1.1 riastrad } 1011 1.1 riastrad 1012 1.1 riastrad union dig_transmitter_control { 1013 1.1 riastrad DIG_TRANSMITTER_CONTROL_PS_ALLOCATION v1; 1014 1.1 riastrad DIG_TRANSMITTER_CONTROL_PARAMETERS_V2 v2; 1015 1.1 riastrad DIG_TRANSMITTER_CONTROL_PARAMETERS_V3 v3; 1016 1.1 riastrad DIG_TRANSMITTER_CONTROL_PARAMETERS_V4 v4; 1017 1.1 riastrad DIG_TRANSMITTER_CONTROL_PARAMETERS_V1_5 v5; 1018 1.1 riastrad }; 1019 1.1 riastrad 1020 1.1 riastrad void 1021 1.1 riastrad atombios_dig_transmitter_setup2(struct drm_encoder *encoder, int action, uint8_t lane_num, uint8_t lane_set, int fe) 1022 1.1 riastrad { 1023 1.1 riastrad struct drm_device *dev = encoder->dev; 1024 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 1025 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 1026 1.1 riastrad struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 1027 1.1 riastrad struct drm_connector *connector; 1028 1.1 riastrad union dig_transmitter_control args; 1029 1.1 riastrad int index = 0; 1030 1.1 riastrad uint8_t frev, crev; 1031 1.1 riastrad bool is_dp = false; 1032 1.1 riastrad int pll_id = 0; 1033 1.1 riastrad int dp_clock = 0; 1034 1.1 riastrad int dp_lane_count = 0; 1035 1.1 riastrad int connector_object_id = 0; 1036 1.1 riastrad int igp_lane_info = 0; 1037 1.1 riastrad int dig_encoder = dig->dig_encoder; 1038 1.1 riastrad int hpd_id = RADEON_HPD_NONE; 1039 1.1 riastrad 1040 1.1 riastrad if (action == ATOM_TRANSMITTER_ACTION_INIT) { 1041 1.1 riastrad connector = radeon_get_connector_for_encoder_init(encoder); 1042 1.1 riastrad /* just needed to avoid bailing in the encoder check. the encoder 1043 1.1 riastrad * isn't used for init 1044 1.1 riastrad */ 1045 1.1 riastrad dig_encoder = 0; 1046 1.1 riastrad } else 1047 1.1 riastrad connector = radeon_get_connector_for_encoder(encoder); 1048 1.1 riastrad 1049 1.1 riastrad if (connector) { 1050 1.1 riastrad struct radeon_connector *radeon_connector = to_radeon_connector(connector); 1051 1.1 riastrad struct radeon_connector_atom_dig *dig_connector = 1052 1.1 riastrad radeon_connector->con_priv; 1053 1.1 riastrad 1054 1.1 riastrad hpd_id = radeon_connector->hpd.hpd; 1055 1.1 riastrad dp_clock = dig_connector->dp_clock; 1056 1.1 riastrad dp_lane_count = dig_connector->dp_lane_count; 1057 1.1 riastrad connector_object_id = 1058 1.1 riastrad (radeon_connector->connector_object_id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; 1059 1.1 riastrad igp_lane_info = dig_connector->igp_lane_info; 1060 1.1 riastrad } 1061 1.1 riastrad 1062 1.1 riastrad if (encoder->crtc) { 1063 1.1 riastrad struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); 1064 1.1 riastrad pll_id = radeon_crtc->pll_id; 1065 1.1 riastrad } 1066 1.1 riastrad 1067 1.1 riastrad /* no dig encoder assigned */ 1068 1.1 riastrad if (dig_encoder == -1) 1069 1.1 riastrad return; 1070 1.1 riastrad 1071 1.1 riastrad if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder))) 1072 1.1 riastrad is_dp = true; 1073 1.1 riastrad 1074 1.1 riastrad memset(&args, 0, sizeof(args)); 1075 1.1 riastrad 1076 1.1 riastrad switch (radeon_encoder->encoder_id) { 1077 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: 1078 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl); 1079 1.1 riastrad break; 1080 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 1081 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 1082 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 1083 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: 1084 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, UNIPHYTransmitterControl); 1085 1.1 riastrad break; 1086 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: 1087 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, LVTMATransmitterControl); 1088 1.1 riastrad break; 1089 1.1 riastrad } 1090 1.1 riastrad 1091 1.1 riastrad if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) 1092 1.1 riastrad return; 1093 1.1 riastrad 1094 1.1 riastrad switch (frev) { 1095 1.1 riastrad case 1: 1096 1.1 riastrad switch (crev) { 1097 1.1 riastrad case 1: 1098 1.1 riastrad args.v1.ucAction = action; 1099 1.1 riastrad if (action == ATOM_TRANSMITTER_ACTION_INIT) { 1100 1.1 riastrad args.v1.usInitInfo = cpu_to_le16(connector_object_id); 1101 1.1 riastrad } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) { 1102 1.1 riastrad args.v1.asMode.ucLaneSel = lane_num; 1103 1.1 riastrad args.v1.asMode.ucLaneSet = lane_set; 1104 1.1 riastrad } else { 1105 1.1 riastrad if (is_dp) 1106 1.1 riastrad args.v1.usPixelClock = cpu_to_le16(dp_clock / 10); 1107 1.1 riastrad else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 1108 1.1 riastrad args.v1.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10); 1109 1.1 riastrad else 1110 1.1 riastrad args.v1.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 1111 1.1 riastrad } 1112 1.1 riastrad 1113 1.1 riastrad args.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL; 1114 1.1 riastrad 1115 1.1 riastrad if (dig_encoder) 1116 1.1 riastrad args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER; 1117 1.1 riastrad else 1118 1.1 riastrad args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER; 1119 1.1 riastrad 1120 1.1 riastrad if ((rdev->flags & RADEON_IS_IGP) && 1121 1.1 riastrad (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_UNIPHY)) { 1122 1.1 riastrad if (is_dp || 1123 1.1 riastrad !radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) { 1124 1.1 riastrad if (igp_lane_info & 0x1) 1125 1.1 riastrad args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_0_3; 1126 1.1 riastrad else if (igp_lane_info & 0x2) 1127 1.1 riastrad args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_4_7; 1128 1.1 riastrad else if (igp_lane_info & 0x4) 1129 1.1 riastrad args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_8_11; 1130 1.1 riastrad else if (igp_lane_info & 0x8) 1131 1.1 riastrad args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_12_15; 1132 1.1 riastrad } else { 1133 1.1 riastrad if (igp_lane_info & 0x3) 1134 1.1 riastrad args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_0_7; 1135 1.1 riastrad else if (igp_lane_info & 0xc) 1136 1.1 riastrad args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_8_15; 1137 1.1 riastrad } 1138 1.1 riastrad } 1139 1.1 riastrad 1140 1.1 riastrad if (dig->linkb) 1141 1.1 riastrad args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKB; 1142 1.1 riastrad else 1143 1.1 riastrad args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKA; 1144 1.1 riastrad 1145 1.1 riastrad if (is_dp) 1146 1.1 riastrad args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT; 1147 1.1 riastrad else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { 1148 1.1 riastrad if (dig->coherent_mode) 1149 1.1 riastrad args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT; 1150 1.1 riastrad if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 1151 1.1 riastrad args.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_8LANE_LINK; 1152 1.1 riastrad } 1153 1.1 riastrad break; 1154 1.1 riastrad case 2: 1155 1.1 riastrad args.v2.ucAction = action; 1156 1.1 riastrad if (action == ATOM_TRANSMITTER_ACTION_INIT) { 1157 1.1 riastrad args.v2.usInitInfo = cpu_to_le16(connector_object_id); 1158 1.1 riastrad } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) { 1159 1.1 riastrad args.v2.asMode.ucLaneSel = lane_num; 1160 1.1 riastrad args.v2.asMode.ucLaneSet = lane_set; 1161 1.1 riastrad } else { 1162 1.1 riastrad if (is_dp) 1163 1.1 riastrad args.v2.usPixelClock = cpu_to_le16(dp_clock / 10); 1164 1.1 riastrad else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 1165 1.1 riastrad args.v2.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10); 1166 1.1 riastrad else 1167 1.1 riastrad args.v2.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 1168 1.1 riastrad } 1169 1.1 riastrad 1170 1.1 riastrad args.v2.acConfig.ucEncoderSel = dig_encoder; 1171 1.1 riastrad if (dig->linkb) 1172 1.1 riastrad args.v2.acConfig.ucLinkSel = 1; 1173 1.1 riastrad 1174 1.1 riastrad switch (radeon_encoder->encoder_id) { 1175 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 1176 1.1 riastrad args.v2.acConfig.ucTransmitterSel = 0; 1177 1.1 riastrad break; 1178 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 1179 1.1 riastrad args.v2.acConfig.ucTransmitterSel = 1; 1180 1.1 riastrad break; 1181 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 1182 1.1 riastrad args.v2.acConfig.ucTransmitterSel = 2; 1183 1.1 riastrad break; 1184 1.1 riastrad } 1185 1.1 riastrad 1186 1.1 riastrad if (is_dp) { 1187 1.1 riastrad args.v2.acConfig.fCoherentMode = 1; 1188 1.1 riastrad args.v2.acConfig.fDPConnector = 1; 1189 1.1 riastrad } else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { 1190 1.1 riastrad if (dig->coherent_mode) 1191 1.1 riastrad args.v2.acConfig.fCoherentMode = 1; 1192 1.1 riastrad if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 1193 1.1 riastrad args.v2.acConfig.fDualLinkConnector = 1; 1194 1.1 riastrad } 1195 1.1 riastrad break; 1196 1.1 riastrad case 3: 1197 1.1 riastrad args.v3.ucAction = action; 1198 1.1 riastrad if (action == ATOM_TRANSMITTER_ACTION_INIT) { 1199 1.1 riastrad args.v3.usInitInfo = cpu_to_le16(connector_object_id); 1200 1.1 riastrad } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) { 1201 1.1 riastrad args.v3.asMode.ucLaneSel = lane_num; 1202 1.1 riastrad args.v3.asMode.ucLaneSet = lane_set; 1203 1.1 riastrad } else { 1204 1.1 riastrad if (is_dp) 1205 1.1 riastrad args.v3.usPixelClock = cpu_to_le16(dp_clock / 10); 1206 1.1 riastrad else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 1207 1.1 riastrad args.v3.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10); 1208 1.1 riastrad else 1209 1.1 riastrad args.v3.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 1210 1.1 riastrad } 1211 1.1 riastrad 1212 1.1 riastrad if (is_dp) 1213 1.1 riastrad args.v3.ucLaneNum = dp_lane_count; 1214 1.1 riastrad else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 1215 1.1 riastrad args.v3.ucLaneNum = 8; 1216 1.1 riastrad else 1217 1.1 riastrad args.v3.ucLaneNum = 4; 1218 1.1 riastrad 1219 1.1 riastrad if (dig->linkb) 1220 1.1 riastrad args.v3.acConfig.ucLinkSel = 1; 1221 1.1 riastrad if (dig_encoder & 1) 1222 1.1 riastrad args.v3.acConfig.ucEncoderSel = 1; 1223 1.1 riastrad 1224 1.1 riastrad /* Select the PLL for the PHY 1225 1.1 riastrad * DP PHY should be clocked from external src if there is 1226 1.1 riastrad * one. 1227 1.1 riastrad */ 1228 1.1 riastrad /* On DCE4, if there is an external clock, it generates the DP ref clock */ 1229 1.1 riastrad if (is_dp && rdev->clock.dp_extclk) 1230 1.1 riastrad args.v3.acConfig.ucRefClkSource = 2; /* external src */ 1231 1.1 riastrad else 1232 1.1 riastrad args.v3.acConfig.ucRefClkSource = pll_id; 1233 1.1 riastrad 1234 1.1 riastrad switch (radeon_encoder->encoder_id) { 1235 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 1236 1.1 riastrad args.v3.acConfig.ucTransmitterSel = 0; 1237 1.1 riastrad break; 1238 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 1239 1.1 riastrad args.v3.acConfig.ucTransmitterSel = 1; 1240 1.1 riastrad break; 1241 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 1242 1.1 riastrad args.v3.acConfig.ucTransmitterSel = 2; 1243 1.1 riastrad break; 1244 1.1 riastrad } 1245 1.1 riastrad 1246 1.1 riastrad if (is_dp) 1247 1.1 riastrad args.v3.acConfig.fCoherentMode = 1; /* DP requires coherent */ 1248 1.1 riastrad else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { 1249 1.1 riastrad if (dig->coherent_mode) 1250 1.1 riastrad args.v3.acConfig.fCoherentMode = 1; 1251 1.1 riastrad if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 1252 1.1 riastrad args.v3.acConfig.fDualLinkConnector = 1; 1253 1.1 riastrad } 1254 1.1 riastrad break; 1255 1.1 riastrad case 4: 1256 1.1 riastrad args.v4.ucAction = action; 1257 1.1 riastrad if (action == ATOM_TRANSMITTER_ACTION_INIT) { 1258 1.1 riastrad args.v4.usInitInfo = cpu_to_le16(connector_object_id); 1259 1.1 riastrad } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) { 1260 1.1 riastrad args.v4.asMode.ucLaneSel = lane_num; 1261 1.1 riastrad args.v4.asMode.ucLaneSet = lane_set; 1262 1.1 riastrad } else { 1263 1.1 riastrad if (is_dp) 1264 1.1 riastrad args.v4.usPixelClock = cpu_to_le16(dp_clock / 10); 1265 1.1 riastrad else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 1266 1.1 riastrad args.v4.usPixelClock = cpu_to_le16((radeon_encoder->pixel_clock / 2) / 10); 1267 1.1 riastrad else 1268 1.1 riastrad args.v4.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 1269 1.1 riastrad } 1270 1.1 riastrad 1271 1.1 riastrad if (is_dp) 1272 1.1 riastrad args.v4.ucLaneNum = dp_lane_count; 1273 1.1 riastrad else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 1274 1.1 riastrad args.v4.ucLaneNum = 8; 1275 1.1 riastrad else 1276 1.1 riastrad args.v4.ucLaneNum = 4; 1277 1.1 riastrad 1278 1.1 riastrad if (dig->linkb) 1279 1.1 riastrad args.v4.acConfig.ucLinkSel = 1; 1280 1.1 riastrad if (dig_encoder & 1) 1281 1.1 riastrad args.v4.acConfig.ucEncoderSel = 1; 1282 1.1 riastrad 1283 1.1 riastrad /* Select the PLL for the PHY 1284 1.1 riastrad * DP PHY should be clocked from external src if there is 1285 1.1 riastrad * one. 1286 1.1 riastrad */ 1287 1.1 riastrad /* On DCE5 DCPLL usually generates the DP ref clock */ 1288 1.1 riastrad if (is_dp) { 1289 1.1 riastrad if (rdev->clock.dp_extclk) 1290 1.1 riastrad args.v4.acConfig.ucRefClkSource = ENCODER_REFCLK_SRC_EXTCLK; 1291 1.1 riastrad else 1292 1.1 riastrad args.v4.acConfig.ucRefClkSource = ENCODER_REFCLK_SRC_DCPLL; 1293 1.1 riastrad } else 1294 1.1 riastrad args.v4.acConfig.ucRefClkSource = pll_id; 1295 1.1 riastrad 1296 1.1 riastrad switch (radeon_encoder->encoder_id) { 1297 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 1298 1.1 riastrad args.v4.acConfig.ucTransmitterSel = 0; 1299 1.1 riastrad break; 1300 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 1301 1.1 riastrad args.v4.acConfig.ucTransmitterSel = 1; 1302 1.1 riastrad break; 1303 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 1304 1.1 riastrad args.v4.acConfig.ucTransmitterSel = 2; 1305 1.1 riastrad break; 1306 1.1 riastrad } 1307 1.1 riastrad 1308 1.1 riastrad if (is_dp) 1309 1.1 riastrad args.v4.acConfig.fCoherentMode = 1; /* DP requires coherent */ 1310 1.1 riastrad else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { 1311 1.1 riastrad if (dig->coherent_mode) 1312 1.1 riastrad args.v4.acConfig.fCoherentMode = 1; 1313 1.1 riastrad if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 1314 1.1 riastrad args.v4.acConfig.fDualLinkConnector = 1; 1315 1.1 riastrad } 1316 1.1 riastrad break; 1317 1.1 riastrad case 5: 1318 1.1 riastrad args.v5.ucAction = action; 1319 1.1 riastrad if (is_dp) 1320 1.1 riastrad args.v5.usSymClock = cpu_to_le16(dp_clock / 10); 1321 1.1 riastrad else 1322 1.1 riastrad args.v5.usSymClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 1323 1.1 riastrad 1324 1.1 riastrad switch (radeon_encoder->encoder_id) { 1325 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 1326 1.1 riastrad if (dig->linkb) 1327 1.1 riastrad args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYB; 1328 1.1 riastrad else 1329 1.1 riastrad args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYA; 1330 1.1 riastrad break; 1331 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 1332 1.1 riastrad if (dig->linkb) 1333 1.1 riastrad args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYD; 1334 1.1 riastrad else 1335 1.1 riastrad args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYC; 1336 1.1 riastrad break; 1337 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 1338 1.1 riastrad if (dig->linkb) 1339 1.1 riastrad args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYF; 1340 1.1 riastrad else 1341 1.1 riastrad args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYE; 1342 1.1 riastrad break; 1343 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: 1344 1.1 riastrad args.v5.ucPhyId = ATOM_PHY_ID_UNIPHYG; 1345 1.1 riastrad break; 1346 1.1 riastrad } 1347 1.1 riastrad if (is_dp) 1348 1.1 riastrad args.v5.ucLaneNum = dp_lane_count; 1349 1.1 riastrad else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 1350 1.1 riastrad args.v5.ucLaneNum = 8; 1351 1.1 riastrad else 1352 1.1 riastrad args.v5.ucLaneNum = 4; 1353 1.1 riastrad args.v5.ucConnObjId = connector_object_id; 1354 1.1 riastrad args.v5.ucDigMode = atombios_get_encoder_mode(encoder); 1355 1.1 riastrad 1356 1.1 riastrad if (is_dp && rdev->clock.dp_extclk) 1357 1.1 riastrad args.v5.asConfig.ucPhyClkSrcId = ENCODER_REFCLK_SRC_EXTCLK; 1358 1.1 riastrad else 1359 1.1 riastrad args.v5.asConfig.ucPhyClkSrcId = pll_id; 1360 1.1 riastrad 1361 1.1 riastrad if (is_dp) 1362 1.1 riastrad args.v5.asConfig.ucCoherentMode = 1; /* DP requires coherent */ 1363 1.1 riastrad else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) { 1364 1.1 riastrad if (dig->coherent_mode) 1365 1.1 riastrad args.v5.asConfig.ucCoherentMode = 1; 1366 1.1 riastrad } 1367 1.1 riastrad if (hpd_id == RADEON_HPD_NONE) 1368 1.1 riastrad args.v5.asConfig.ucHPDSel = 0; 1369 1.1 riastrad else 1370 1.1 riastrad args.v5.asConfig.ucHPDSel = hpd_id + 1; 1371 1.1 riastrad args.v5.ucDigEncoderSel = (fe != -1) ? (1 << fe) : (1 << dig_encoder); 1372 1.1 riastrad args.v5.ucDPLaneSet = lane_set; 1373 1.1 riastrad break; 1374 1.1 riastrad default: 1375 1.1 riastrad DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 1376 1.1 riastrad break; 1377 1.1 riastrad } 1378 1.1 riastrad break; 1379 1.1 riastrad default: 1380 1.1 riastrad DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 1381 1.1 riastrad break; 1382 1.1 riastrad } 1383 1.1 riastrad 1384 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 1385 1.1 riastrad } 1386 1.1 riastrad 1387 1.1 riastrad void 1388 1.1 riastrad atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t lane_num, uint8_t lane_set) 1389 1.1 riastrad { 1390 1.1 riastrad atombios_dig_transmitter_setup2(encoder, action, lane_num, lane_set, -1); 1391 1.1 riastrad } 1392 1.1 riastrad 1393 1.1 riastrad bool 1394 1.1 riastrad atombios_set_edp_panel_power(struct drm_connector *connector, int action) 1395 1.1 riastrad { 1396 1.1 riastrad struct radeon_connector *radeon_connector = to_radeon_connector(connector); 1397 1.1 riastrad struct drm_device *dev = radeon_connector->base.dev; 1398 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 1399 1.1 riastrad union dig_transmitter_control args; 1400 1.1 riastrad int index = GetIndexIntoMasterTable(COMMAND, UNIPHYTransmitterControl); 1401 1.1 riastrad uint8_t frev, crev; 1402 1.1 riastrad 1403 1.1 riastrad if (connector->connector_type != DRM_MODE_CONNECTOR_eDP) 1404 1.1 riastrad goto done; 1405 1.1 riastrad 1406 1.1 riastrad if (!ASIC_IS_DCE4(rdev)) 1407 1.1 riastrad goto done; 1408 1.1 riastrad 1409 1.1 riastrad if ((action != ATOM_TRANSMITTER_ACTION_POWER_ON) && 1410 1.1 riastrad (action != ATOM_TRANSMITTER_ACTION_POWER_OFF)) 1411 1.1 riastrad goto done; 1412 1.1 riastrad 1413 1.1 riastrad if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) 1414 1.1 riastrad goto done; 1415 1.1 riastrad 1416 1.1 riastrad memset(&args, 0, sizeof(args)); 1417 1.1 riastrad 1418 1.1 riastrad args.v1.ucAction = action; 1419 1.1 riastrad 1420 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 1421 1.1 riastrad 1422 1.1 riastrad /* wait for the panel to power up */ 1423 1.1 riastrad if (action == ATOM_TRANSMITTER_ACTION_POWER_ON) { 1424 1.1 riastrad int i; 1425 1.1 riastrad 1426 1.1 riastrad for (i = 0; i < 300; i++) { 1427 1.1 riastrad if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) 1428 1.1 riastrad return true; 1429 1.1 riastrad mdelay(1); 1430 1.1 riastrad } 1431 1.1 riastrad return false; 1432 1.1 riastrad } 1433 1.1 riastrad done: 1434 1.1 riastrad return true; 1435 1.1 riastrad } 1436 1.1 riastrad 1437 1.1 riastrad union external_encoder_control { 1438 1.1 riastrad EXTERNAL_ENCODER_CONTROL_PS_ALLOCATION v1; 1439 1.1 riastrad EXTERNAL_ENCODER_CONTROL_PS_ALLOCATION_V3 v3; 1440 1.1 riastrad }; 1441 1.1 riastrad 1442 1.1 riastrad static void 1443 1.1 riastrad atombios_external_encoder_setup(struct drm_encoder *encoder, 1444 1.1 riastrad struct drm_encoder *ext_encoder, 1445 1.1 riastrad int action) 1446 1.1 riastrad { 1447 1.1 riastrad struct drm_device *dev = encoder->dev; 1448 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 1449 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 1450 1.1 riastrad struct radeon_encoder *ext_radeon_encoder = to_radeon_encoder(ext_encoder); 1451 1.1 riastrad union external_encoder_control args; 1452 1.1 riastrad struct drm_connector *connector; 1453 1.1 riastrad int index = GetIndexIntoMasterTable(COMMAND, ExternalEncoderControl); 1454 1.1 riastrad u8 frev, crev; 1455 1.1 riastrad int dp_clock = 0; 1456 1.1 riastrad int dp_lane_count = 0; 1457 1.1 riastrad int connector_object_id = 0; 1458 1.1 riastrad u32 ext_enum = (ext_radeon_encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT; 1459 1.1 riastrad 1460 1.1 riastrad if (action == EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT) 1461 1.1 riastrad connector = radeon_get_connector_for_encoder_init(encoder); 1462 1.1 riastrad else 1463 1.1 riastrad connector = radeon_get_connector_for_encoder(encoder); 1464 1.1 riastrad 1465 1.1 riastrad if (connector) { 1466 1.1 riastrad struct radeon_connector *radeon_connector = to_radeon_connector(connector); 1467 1.1 riastrad struct radeon_connector_atom_dig *dig_connector = 1468 1.1 riastrad radeon_connector->con_priv; 1469 1.1 riastrad 1470 1.1 riastrad dp_clock = dig_connector->dp_clock; 1471 1.1 riastrad dp_lane_count = dig_connector->dp_lane_count; 1472 1.1 riastrad connector_object_id = 1473 1.1 riastrad (radeon_connector->connector_object_id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; 1474 1.1 riastrad } 1475 1.1 riastrad 1476 1.1 riastrad memset(&args, 0, sizeof(args)); 1477 1.1 riastrad 1478 1.1 riastrad if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) 1479 1.1 riastrad return; 1480 1.1 riastrad 1481 1.1 riastrad switch (frev) { 1482 1.1 riastrad case 1: 1483 1.1 riastrad /* no params on frev 1 */ 1484 1.1 riastrad break; 1485 1.1 riastrad case 2: 1486 1.1 riastrad switch (crev) { 1487 1.1 riastrad case 1: 1488 1.1 riastrad case 2: 1489 1.1 riastrad args.v1.sDigEncoder.ucAction = action; 1490 1.1 riastrad args.v1.sDigEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 1491 1.1 riastrad args.v1.sDigEncoder.ucEncoderMode = atombios_get_encoder_mode(encoder); 1492 1.1 riastrad 1493 1.1 riastrad if (ENCODER_MODE_IS_DP(args.v1.sDigEncoder.ucEncoderMode)) { 1494 1.1 riastrad if (dp_clock == 270000) 1495 1.1 riastrad args.v1.sDigEncoder.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ; 1496 1.1 riastrad args.v1.sDigEncoder.ucLaneNum = dp_lane_count; 1497 1.1 riastrad } else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 1498 1.1 riastrad args.v1.sDigEncoder.ucLaneNum = 8; 1499 1.1 riastrad else 1500 1.1 riastrad args.v1.sDigEncoder.ucLaneNum = 4; 1501 1.1 riastrad break; 1502 1.1 riastrad case 3: 1503 1.1 riastrad args.v3.sExtEncoder.ucAction = action; 1504 1.1 riastrad if (action == EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT) 1505 1.1 riastrad args.v3.sExtEncoder.usConnectorId = cpu_to_le16(connector_object_id); 1506 1.1 riastrad else 1507 1.1 riastrad args.v3.sExtEncoder.usPixelClock = cpu_to_le16(radeon_encoder->pixel_clock / 10); 1508 1.1 riastrad args.v3.sExtEncoder.ucEncoderMode = atombios_get_encoder_mode(encoder); 1509 1.1 riastrad 1510 1.1 riastrad if (ENCODER_MODE_IS_DP(args.v3.sExtEncoder.ucEncoderMode)) { 1511 1.1 riastrad if (dp_clock == 270000) 1512 1.1 riastrad args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ; 1513 1.1 riastrad else if (dp_clock == 540000) 1514 1.1 riastrad args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_DPLINKRATE_5_40GHZ; 1515 1.1 riastrad args.v3.sExtEncoder.ucLaneNum = dp_lane_count; 1516 1.1 riastrad } else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) 1517 1.1 riastrad args.v3.sExtEncoder.ucLaneNum = 8; 1518 1.1 riastrad else 1519 1.1 riastrad args.v3.sExtEncoder.ucLaneNum = 4; 1520 1.1 riastrad switch (ext_enum) { 1521 1.1 riastrad case GRAPH_OBJECT_ENUM_ID1: 1522 1.1 riastrad args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER1; 1523 1.1 riastrad break; 1524 1.1 riastrad case GRAPH_OBJECT_ENUM_ID2: 1525 1.1 riastrad args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER2; 1526 1.1 riastrad break; 1527 1.1 riastrad case GRAPH_OBJECT_ENUM_ID3: 1528 1.1 riastrad args.v3.sExtEncoder.ucConfig |= EXTERNAL_ENCODER_CONFIG_V3_ENCODER3; 1529 1.1 riastrad break; 1530 1.1 riastrad } 1531 1.1 riastrad args.v3.sExtEncoder.ucBitPerColor = radeon_atom_get_bpc(encoder); 1532 1.1 riastrad break; 1533 1.1 riastrad default: 1534 1.1 riastrad DRM_ERROR("Unknown table version: %d, %d\n", frev, crev); 1535 1.1 riastrad return; 1536 1.1 riastrad } 1537 1.1 riastrad break; 1538 1.1 riastrad default: 1539 1.1 riastrad DRM_ERROR("Unknown table version: %d, %d\n", frev, crev); 1540 1.1 riastrad return; 1541 1.1 riastrad } 1542 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 1543 1.1 riastrad } 1544 1.1 riastrad 1545 1.1 riastrad static void 1546 1.1 riastrad atombios_yuv_setup(struct drm_encoder *encoder, bool enable) 1547 1.1 riastrad { 1548 1.1 riastrad struct drm_device *dev = encoder->dev; 1549 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 1550 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 1551 1.1 riastrad struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); 1552 1.1 riastrad ENABLE_YUV_PS_ALLOCATION args; 1553 1.1 riastrad int index = GetIndexIntoMasterTable(COMMAND, EnableYUV); 1554 1.1 riastrad uint32_t temp, reg; 1555 1.1 riastrad 1556 1.1 riastrad memset(&args, 0, sizeof(args)); 1557 1.1 riastrad 1558 1.1 riastrad if (rdev->family >= CHIP_R600) 1559 1.1 riastrad reg = R600_BIOS_3_SCRATCH; 1560 1.1 riastrad else 1561 1.1 riastrad reg = RADEON_BIOS_3_SCRATCH; 1562 1.1 riastrad 1563 1.1 riastrad /* XXX: fix up scratch reg handling */ 1564 1.1 riastrad temp = RREG32(reg); 1565 1.1 riastrad if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) 1566 1.1 riastrad WREG32(reg, (ATOM_S3_TV1_ACTIVE | 1567 1.1 riastrad (radeon_crtc->crtc_id << 18))); 1568 1.1 riastrad else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT)) 1569 1.1 riastrad WREG32(reg, (ATOM_S3_CV_ACTIVE | (radeon_crtc->crtc_id << 24))); 1570 1.1 riastrad else 1571 1.1 riastrad WREG32(reg, 0); 1572 1.1 riastrad 1573 1.1 riastrad if (enable) 1574 1.1 riastrad args.ucEnable = ATOM_ENABLE; 1575 1.1 riastrad args.ucCRTC = radeon_crtc->crtc_id; 1576 1.1 riastrad 1577 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 1578 1.1 riastrad 1579 1.1 riastrad WREG32(reg, temp); 1580 1.1 riastrad } 1581 1.1 riastrad 1582 1.1 riastrad static void 1583 1.1 riastrad radeon_atom_encoder_dpms_avivo(struct drm_encoder *encoder, int mode) 1584 1.1 riastrad { 1585 1.1 riastrad struct drm_device *dev = encoder->dev; 1586 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 1587 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 1588 1.1 riastrad DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION args; 1589 1.1 riastrad int index = 0; 1590 1.1 riastrad 1591 1.1 riastrad memset(&args, 0, sizeof(args)); 1592 1.1 riastrad 1593 1.1 riastrad switch (radeon_encoder->encoder_id) { 1594 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_TMDS1: 1595 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: 1596 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, TMDSAOutputControl); 1597 1.1 riastrad break; 1598 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DVO1: 1599 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DDI: 1600 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: 1601 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl); 1602 1.1 riastrad break; 1603 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_LVDS: 1604 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl); 1605 1.1 riastrad break; 1606 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_LVTM1: 1607 1.1 riastrad if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) 1608 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl); 1609 1.1 riastrad else 1610 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, LVTMAOutputControl); 1611 1.1 riastrad break; 1612 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DAC1: 1613 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: 1614 1.1 riastrad if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) 1615 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl); 1616 1.1 riastrad else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT)) 1617 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl); 1618 1.1 riastrad else 1619 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, DAC1OutputControl); 1620 1.1 riastrad break; 1621 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DAC2: 1622 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: 1623 1.1 riastrad if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) 1624 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl); 1625 1.1 riastrad else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT)) 1626 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl); 1627 1.1 riastrad else 1628 1.1 riastrad index = GetIndexIntoMasterTable(COMMAND, DAC2OutputControl); 1629 1.1 riastrad break; 1630 1.1 riastrad default: 1631 1.1 riastrad return; 1632 1.1 riastrad } 1633 1.1 riastrad 1634 1.1 riastrad switch (mode) { 1635 1.1 riastrad case DRM_MODE_DPMS_ON: 1636 1.1 riastrad args.ucAction = ATOM_ENABLE; 1637 1.1 riastrad /* workaround for DVOOutputControl on some RS690 systems */ 1638 1.1 riastrad if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DDI) { 1639 1.1 riastrad u32 reg = RREG32(RADEON_BIOS_3_SCRATCH); 1640 1.1 riastrad WREG32(RADEON_BIOS_3_SCRATCH, reg & ~ATOM_S3_DFP2I_ACTIVE); 1641 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 1642 1.1 riastrad WREG32(RADEON_BIOS_3_SCRATCH, reg); 1643 1.1 riastrad } else 1644 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 1645 1.1 riastrad if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { 1646 1.1 riastrad if (rdev->mode_info.bl_encoder) { 1647 1.1 riastrad struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 1648 1.1 riastrad 1649 1.1 riastrad atombios_set_backlight_level(radeon_encoder, dig->backlight_level); 1650 1.1 riastrad } else { 1651 1.1 riastrad args.ucAction = ATOM_LCD_BLON; 1652 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 1653 1.1 riastrad } 1654 1.1 riastrad } 1655 1.1 riastrad break; 1656 1.1 riastrad case DRM_MODE_DPMS_STANDBY: 1657 1.1 riastrad case DRM_MODE_DPMS_SUSPEND: 1658 1.1 riastrad case DRM_MODE_DPMS_OFF: 1659 1.1 riastrad args.ucAction = ATOM_DISABLE; 1660 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 1661 1.1 riastrad if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { 1662 1.1 riastrad args.ucAction = ATOM_LCD_BLOFF; 1663 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 1664 1.1 riastrad } 1665 1.1 riastrad break; 1666 1.1 riastrad } 1667 1.1 riastrad } 1668 1.1 riastrad 1669 1.1 riastrad static void 1670 1.1 riastrad radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) 1671 1.1 riastrad { 1672 1.1 riastrad struct drm_device *dev = encoder->dev; 1673 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 1674 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 1675 1.1 riastrad struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder); 1676 1.1 riastrad struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 1677 1.1 riastrad struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); 1678 1.1 riastrad struct radeon_connector *radeon_connector = NULL; 1679 1.1 riastrad struct radeon_connector_atom_dig *radeon_dig_connector = NULL; 1680 1.1 riastrad bool travis_quirk = false; 1681 1.1 riastrad 1682 1.1 riastrad if (connector) { 1683 1.1 riastrad radeon_connector = to_radeon_connector(connector); 1684 1.1 riastrad radeon_dig_connector = radeon_connector->con_priv; 1685 1.1 riastrad if ((radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == 1686 1.1 riastrad ENCODER_OBJECT_ID_TRAVIS) && 1687 1.1 riastrad (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) && 1688 1.1 riastrad !ASIC_IS_DCE5(rdev)) 1689 1.1 riastrad travis_quirk = true; 1690 1.1 riastrad } 1691 1.1 riastrad 1692 1.1 riastrad switch (mode) { 1693 1.1 riastrad case DRM_MODE_DPMS_ON: 1694 1.1 riastrad if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { 1695 1.1 riastrad if (!connector) 1696 1.1 riastrad dig->panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; 1697 1.1 riastrad else 1698 1.1 riastrad dig->panel_mode = radeon_dp_get_panel_mode(encoder, connector); 1699 1.1 riastrad 1700 1.1 riastrad /* setup and enable the encoder */ 1701 1.1 riastrad atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); 1702 1.1 riastrad atombios_dig_encoder_setup(encoder, 1703 1.1 riastrad ATOM_ENCODER_CMD_SETUP_PANEL_MODE, 1704 1.1 riastrad dig->panel_mode); 1705 1.1 riastrad if (ext_encoder) { 1706 1.1 riastrad if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE61(rdev)) 1707 1.1 riastrad atombios_external_encoder_setup(encoder, ext_encoder, 1708 1.1 riastrad EXTERNAL_ENCODER_ACTION_V3_ENCODER_SETUP); 1709 1.1 riastrad } 1710 1.1 riastrad } else if (ASIC_IS_DCE4(rdev)) { 1711 1.1 riastrad /* setup and enable the encoder */ 1712 1.1 riastrad atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); 1713 1.1 riastrad } else { 1714 1.1 riastrad /* setup and enable the encoder and transmitter */ 1715 1.1 riastrad atombios_dig_encoder_setup(encoder, ATOM_ENABLE, 0); 1716 1.1 riastrad atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_SETUP, 0, 0); 1717 1.1 riastrad } 1718 1.1 riastrad if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { 1719 1.1 riastrad if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { 1720 1.1 riastrad atombios_set_edp_panel_power(connector, 1721 1.1 riastrad ATOM_TRANSMITTER_ACTION_POWER_ON); 1722 1.1 riastrad radeon_dig_connector->edp_on = true; 1723 1.1 riastrad } 1724 1.1 riastrad } 1725 1.1 riastrad /* enable the transmitter */ 1726 1.1 riastrad atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); 1727 1.1 riastrad if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { 1728 1.1 riastrad /* DP_SET_POWER_D0 is set in radeon_dp_link_train */ 1729 1.1 riastrad radeon_dp_link_train(encoder, connector); 1730 1.1 riastrad if (ASIC_IS_DCE4(rdev)) 1731 1.1 riastrad atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0); 1732 1.1 riastrad } 1733 1.1 riastrad if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { 1734 1.1 riastrad if (rdev->mode_info.bl_encoder) 1735 1.1 riastrad atombios_set_backlight_level(radeon_encoder, dig->backlight_level); 1736 1.1 riastrad else 1737 1.1 riastrad atombios_dig_transmitter_setup(encoder, 1738 1.1 riastrad ATOM_TRANSMITTER_ACTION_LCD_BLON, 0, 0); 1739 1.1 riastrad } 1740 1.1 riastrad if (ext_encoder) 1741 1.1 riastrad atombios_external_encoder_setup(encoder, ext_encoder, ATOM_ENABLE); 1742 1.1 riastrad break; 1743 1.1 riastrad case DRM_MODE_DPMS_STANDBY: 1744 1.1 riastrad case DRM_MODE_DPMS_SUSPEND: 1745 1.1 riastrad case DRM_MODE_DPMS_OFF: 1746 1.1 riastrad 1747 1.1 riastrad /* don't power off encoders with active MST links */ 1748 1.1 riastrad if (dig->active_mst_links) 1749 1.1 riastrad return; 1750 1.1 riastrad 1751 1.1 riastrad if (ASIC_IS_DCE4(rdev)) { 1752 1.1 riastrad if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) 1753 1.1 riastrad atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0); 1754 1.1 riastrad } 1755 1.1 riastrad if (ext_encoder) 1756 1.1 riastrad atombios_external_encoder_setup(encoder, ext_encoder, ATOM_DISABLE); 1757 1.1 riastrad if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) 1758 1.1 riastrad atombios_dig_transmitter_setup(encoder, 1759 1.1 riastrad ATOM_TRANSMITTER_ACTION_LCD_BLOFF, 0, 0); 1760 1.1 riastrad 1761 1.1 riastrad if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && 1762 1.1 riastrad connector && !travis_quirk) 1763 1.1 riastrad radeon_dp_set_rx_power_state(connector, DP_SET_POWER_D3); 1764 1.1 riastrad if (ASIC_IS_DCE4(rdev)) { 1765 1.1 riastrad /* disable the transmitter */ 1766 1.1 riastrad atombios_dig_transmitter_setup(encoder, 1767 1.1 riastrad ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); 1768 1.1 riastrad } else { 1769 1.1 riastrad /* disable the encoder and transmitter */ 1770 1.1 riastrad atombios_dig_transmitter_setup(encoder, 1771 1.1 riastrad ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); 1772 1.1 riastrad atombios_dig_encoder_setup(encoder, ATOM_DISABLE, 0); 1773 1.1 riastrad } 1774 1.1 riastrad if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { 1775 1.1 riastrad if (travis_quirk) 1776 1.1 riastrad radeon_dp_set_rx_power_state(connector, DP_SET_POWER_D3); 1777 1.1 riastrad if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { 1778 1.1 riastrad atombios_set_edp_panel_power(connector, 1779 1.1 riastrad ATOM_TRANSMITTER_ACTION_POWER_OFF); 1780 1.1 riastrad radeon_dig_connector->edp_on = false; 1781 1.1 riastrad } 1782 1.1 riastrad } 1783 1.1 riastrad break; 1784 1.1 riastrad } 1785 1.1 riastrad } 1786 1.1 riastrad 1787 1.1 riastrad static void 1788 1.1 riastrad radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode) 1789 1.1 riastrad { 1790 1.1 riastrad struct drm_device *dev = encoder->dev; 1791 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 1792 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 1793 1.1 riastrad int encoder_mode = atombios_get_encoder_mode(encoder); 1794 1.1 riastrad 1795 1.1 riastrad DRM_DEBUG_KMS("encoder dpms %d to mode %d, devices %08x, active_devices %08x\n", 1796 1.1 riastrad radeon_encoder->encoder_id, mode, radeon_encoder->devices, 1797 1.1 riastrad radeon_encoder->active_device); 1798 1.1 riastrad 1799 1.1 riastrad if ((radeon_audio != 0) && 1800 1.1 riastrad ((encoder_mode == ATOM_ENCODER_MODE_HDMI) || 1801 1.1 riastrad ENCODER_MODE_IS_DP(encoder_mode))) 1802 1.1 riastrad radeon_audio_dpms(encoder, mode); 1803 1.1 riastrad 1804 1.1 riastrad switch (radeon_encoder->encoder_id) { 1805 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_TMDS1: 1806 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: 1807 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_LVDS: 1808 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_LVTM1: 1809 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DVO1: 1810 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DDI: 1811 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DAC2: 1812 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: 1813 1.1 riastrad radeon_atom_encoder_dpms_avivo(encoder, mode); 1814 1.1 riastrad break; 1815 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 1816 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 1817 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 1818 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: 1819 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: 1820 1.1 riastrad radeon_atom_encoder_dpms_dig(encoder, mode); 1821 1.1 riastrad break; 1822 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: 1823 1.1 riastrad if (ASIC_IS_DCE5(rdev)) { 1824 1.1 riastrad switch (mode) { 1825 1.1 riastrad case DRM_MODE_DPMS_ON: 1826 1.1 riastrad atombios_dvo_setup(encoder, ATOM_ENABLE); 1827 1.1 riastrad break; 1828 1.1 riastrad case DRM_MODE_DPMS_STANDBY: 1829 1.1 riastrad case DRM_MODE_DPMS_SUSPEND: 1830 1.1 riastrad case DRM_MODE_DPMS_OFF: 1831 1.1 riastrad atombios_dvo_setup(encoder, ATOM_DISABLE); 1832 1.1 riastrad break; 1833 1.1 riastrad } 1834 1.1 riastrad } else if (ASIC_IS_DCE3(rdev)) 1835 1.1 riastrad radeon_atom_encoder_dpms_dig(encoder, mode); 1836 1.1 riastrad else 1837 1.1 riastrad radeon_atom_encoder_dpms_avivo(encoder, mode); 1838 1.1 riastrad break; 1839 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DAC1: 1840 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: 1841 1.1 riastrad if (ASIC_IS_DCE5(rdev)) { 1842 1.1 riastrad switch (mode) { 1843 1.1 riastrad case DRM_MODE_DPMS_ON: 1844 1.1 riastrad atombios_dac_setup(encoder, ATOM_ENABLE); 1845 1.1 riastrad break; 1846 1.1 riastrad case DRM_MODE_DPMS_STANDBY: 1847 1.1 riastrad case DRM_MODE_DPMS_SUSPEND: 1848 1.1 riastrad case DRM_MODE_DPMS_OFF: 1849 1.1 riastrad atombios_dac_setup(encoder, ATOM_DISABLE); 1850 1.1 riastrad break; 1851 1.1 riastrad } 1852 1.1 riastrad } else 1853 1.1 riastrad radeon_atom_encoder_dpms_avivo(encoder, mode); 1854 1.1 riastrad break; 1855 1.1 riastrad default: 1856 1.1 riastrad return; 1857 1.1 riastrad } 1858 1.1 riastrad 1859 1.1 riastrad radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false); 1860 1.1 riastrad 1861 1.1 riastrad } 1862 1.1 riastrad 1863 1.1 riastrad union crtc_source_param { 1864 1.1 riastrad SELECT_CRTC_SOURCE_PS_ALLOCATION v1; 1865 1.1 riastrad SELECT_CRTC_SOURCE_PARAMETERS_V2 v2; 1866 1.1 riastrad }; 1867 1.1 riastrad 1868 1.1 riastrad static void 1869 1.1 riastrad atombios_set_encoder_crtc_source(struct drm_encoder *encoder) 1870 1.1 riastrad { 1871 1.1 riastrad struct drm_device *dev = encoder->dev; 1872 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 1873 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 1874 1.1 riastrad struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); 1875 1.1 riastrad union crtc_source_param args; 1876 1.1 riastrad int index = GetIndexIntoMasterTable(COMMAND, SelectCRTC_Source); 1877 1.1 riastrad uint8_t frev, crev; 1878 1.1 riastrad struct radeon_encoder_atom_dig *dig; 1879 1.1 riastrad 1880 1.1 riastrad memset(&args, 0, sizeof(args)); 1881 1.1 riastrad 1882 1.1 riastrad if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) 1883 1.1 riastrad return; 1884 1.1 riastrad 1885 1.1 riastrad switch (frev) { 1886 1.1 riastrad case 1: 1887 1.1 riastrad switch (crev) { 1888 1.1 riastrad case 1: 1889 1.1 riastrad default: 1890 1.1 riastrad if (ASIC_IS_AVIVO(rdev)) 1891 1.1 riastrad args.v1.ucCRTC = radeon_crtc->crtc_id; 1892 1.1 riastrad else { 1893 1.2 riastrad if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DAC1) 1894 1.1 riastrad args.v1.ucCRTC = radeon_crtc->crtc_id; 1895 1.2 riastrad else 1896 1.1 riastrad args.v1.ucCRTC = radeon_crtc->crtc_id << 2; 1897 1.1 riastrad } 1898 1.1 riastrad switch (radeon_encoder->encoder_id) { 1899 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_TMDS1: 1900 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: 1901 1.1 riastrad args.v1.ucDevice = ATOM_DEVICE_DFP1_INDEX; 1902 1.1 riastrad break; 1903 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_LVDS: 1904 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_LVTM1: 1905 1.1 riastrad if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) 1906 1.1 riastrad args.v1.ucDevice = ATOM_DEVICE_LCD1_INDEX; 1907 1.1 riastrad else 1908 1.1 riastrad args.v1.ucDevice = ATOM_DEVICE_DFP3_INDEX; 1909 1.1 riastrad break; 1910 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DVO1: 1911 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DDI: 1912 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: 1913 1.1 riastrad args.v1.ucDevice = ATOM_DEVICE_DFP2_INDEX; 1914 1.1 riastrad break; 1915 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DAC1: 1916 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: 1917 1.1 riastrad if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) 1918 1.1 riastrad args.v1.ucDevice = ATOM_DEVICE_TV1_INDEX; 1919 1.1 riastrad else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT)) 1920 1.1 riastrad args.v1.ucDevice = ATOM_DEVICE_CV_INDEX; 1921 1.1 riastrad else 1922 1.1 riastrad args.v1.ucDevice = ATOM_DEVICE_CRT1_INDEX; 1923 1.1 riastrad break; 1924 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DAC2: 1925 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: 1926 1.1 riastrad if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) 1927 1.1 riastrad args.v1.ucDevice = ATOM_DEVICE_TV1_INDEX; 1928 1.1 riastrad else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT)) 1929 1.1 riastrad args.v1.ucDevice = ATOM_DEVICE_CV_INDEX; 1930 1.1 riastrad else 1931 1.1 riastrad args.v1.ucDevice = ATOM_DEVICE_CRT2_INDEX; 1932 1.1 riastrad break; 1933 1.1 riastrad } 1934 1.1 riastrad break; 1935 1.1 riastrad case 2: 1936 1.1 riastrad args.v2.ucCRTC = radeon_crtc->crtc_id; 1937 1.1 riastrad if (radeon_encoder_get_dp_bridge_encoder_id(encoder) != ENCODER_OBJECT_ID_NONE) { 1938 1.1 riastrad struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); 1939 1.1 riastrad 1940 1.1 riastrad if (connector->connector_type == DRM_MODE_CONNECTOR_LVDS) 1941 1.1 riastrad args.v2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS; 1942 1.1 riastrad else if (connector->connector_type == DRM_MODE_CONNECTOR_VGA) 1943 1.1 riastrad args.v2.ucEncodeMode = ATOM_ENCODER_MODE_CRT; 1944 1.1 riastrad else 1945 1.1 riastrad args.v2.ucEncodeMode = atombios_get_encoder_mode(encoder); 1946 1.1 riastrad } else if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { 1947 1.1 riastrad args.v2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS; 1948 1.1 riastrad } else { 1949 1.1 riastrad args.v2.ucEncodeMode = atombios_get_encoder_mode(encoder); 1950 1.1 riastrad } 1951 1.1 riastrad switch (radeon_encoder->encoder_id) { 1952 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 1953 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 1954 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 1955 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: 1956 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: 1957 1.1 riastrad dig = radeon_encoder->enc_priv; 1958 1.1 riastrad switch (dig->dig_encoder) { 1959 1.1 riastrad case 0: 1960 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID; 1961 1.1 riastrad break; 1962 1.1 riastrad case 1: 1963 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID; 1964 1.1 riastrad break; 1965 1.1 riastrad case 2: 1966 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_DIG3_ENCODER_ID; 1967 1.1 riastrad break; 1968 1.1 riastrad case 3: 1969 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_DIG4_ENCODER_ID; 1970 1.1 riastrad break; 1971 1.1 riastrad case 4: 1972 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_DIG5_ENCODER_ID; 1973 1.1 riastrad break; 1974 1.1 riastrad case 5: 1975 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_DIG6_ENCODER_ID; 1976 1.1 riastrad break; 1977 1.1 riastrad case 6: 1978 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_DIG7_ENCODER_ID; 1979 1.1 riastrad break; 1980 1.1 riastrad } 1981 1.1 riastrad break; 1982 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: 1983 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_DVO_ENCODER_ID; 1984 1.1 riastrad break; 1985 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: 1986 1.1 riastrad if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) 1987 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID; 1988 1.1 riastrad else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT)) 1989 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID; 1990 1.1 riastrad else 1991 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_DAC1_ENCODER_ID; 1992 1.1 riastrad break; 1993 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: 1994 1.1 riastrad if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) 1995 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID; 1996 1.1 riastrad else if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT)) 1997 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID; 1998 1.1 riastrad else 1999 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_DAC2_ENCODER_ID; 2000 1.1 riastrad break; 2001 1.1 riastrad } 2002 1.1 riastrad break; 2003 1.1 riastrad } 2004 1.1 riastrad break; 2005 1.1 riastrad default: 2006 1.1 riastrad DRM_ERROR("Unknown table version: %d, %d\n", frev, crev); 2007 1.1 riastrad return; 2008 1.1 riastrad } 2009 1.1 riastrad 2010 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 2011 1.1 riastrad 2012 1.1 riastrad /* update scratch regs with new routing */ 2013 1.1 riastrad radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id); 2014 1.1 riastrad } 2015 1.1 riastrad 2016 1.1 riastrad void 2017 1.1 riastrad atombios_set_mst_encoder_crtc_source(struct drm_encoder *encoder, int fe) 2018 1.1 riastrad { 2019 1.1 riastrad struct drm_device *dev = encoder->dev; 2020 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 2021 1.1 riastrad struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); 2022 1.1 riastrad int index = GetIndexIntoMasterTable(COMMAND, SelectCRTC_Source); 2023 1.1 riastrad uint8_t frev, crev; 2024 1.1 riastrad union crtc_source_param args; 2025 1.1 riastrad 2026 1.1 riastrad memset(&args, 0, sizeof(args)); 2027 1.1 riastrad 2028 1.1 riastrad if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) 2029 1.1 riastrad return; 2030 1.1 riastrad 2031 1.1 riastrad if (frev != 1 && crev != 2) 2032 1.1 riastrad DRM_ERROR("Unknown table for MST %d, %d\n", frev, crev); 2033 1.1 riastrad 2034 1.1 riastrad args.v2.ucCRTC = radeon_crtc->crtc_id; 2035 1.1 riastrad args.v2.ucEncodeMode = ATOM_ENCODER_MODE_DP_MST; 2036 1.1 riastrad 2037 1.1 riastrad switch (fe) { 2038 1.1 riastrad case 0: 2039 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID; 2040 1.1 riastrad break; 2041 1.1 riastrad case 1: 2042 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID; 2043 1.1 riastrad break; 2044 1.1 riastrad case 2: 2045 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_DIG3_ENCODER_ID; 2046 1.1 riastrad break; 2047 1.1 riastrad case 3: 2048 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_DIG4_ENCODER_ID; 2049 1.1 riastrad break; 2050 1.1 riastrad case 4: 2051 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_DIG5_ENCODER_ID; 2052 1.1 riastrad break; 2053 1.1 riastrad case 5: 2054 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_DIG6_ENCODER_ID; 2055 1.1 riastrad break; 2056 1.1 riastrad case 6: 2057 1.1 riastrad args.v2.ucEncoderID = ASIC_INT_DIG7_ENCODER_ID; 2058 1.1 riastrad break; 2059 1.1 riastrad } 2060 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 2061 1.1 riastrad } 2062 1.1 riastrad 2063 1.1 riastrad static void 2064 1.1 riastrad atombios_apply_encoder_quirks(struct drm_encoder *encoder, 2065 1.1 riastrad struct drm_display_mode *mode) 2066 1.1 riastrad { 2067 1.1 riastrad struct drm_device *dev = encoder->dev; 2068 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 2069 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 2070 1.1 riastrad struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); 2071 1.1 riastrad 2072 1.1 riastrad /* Funky macbooks */ 2073 1.1 riastrad if ((dev->pdev->device == 0x71C5) && 2074 1.1 riastrad (dev->pdev->subsystem_vendor == 0x106b) && 2075 1.1 riastrad (dev->pdev->subsystem_device == 0x0080)) { 2076 1.1 riastrad if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) { 2077 1.1 riastrad uint32_t lvtma_bit_depth_control = RREG32(AVIVO_LVTMA_BIT_DEPTH_CONTROL); 2078 1.1 riastrad 2079 1.1 riastrad lvtma_bit_depth_control &= ~AVIVO_LVTMA_BIT_DEPTH_CONTROL_TRUNCATE_EN; 2080 1.1 riastrad lvtma_bit_depth_control &= ~AVIVO_LVTMA_BIT_DEPTH_CONTROL_SPATIAL_DITHER_EN; 2081 1.1 riastrad 2082 1.1 riastrad WREG32(AVIVO_LVTMA_BIT_DEPTH_CONTROL, lvtma_bit_depth_control); 2083 1.1 riastrad } 2084 1.1 riastrad } 2085 1.1 riastrad 2086 1.1 riastrad /* set scaler clears this on some chips */ 2087 1.1 riastrad if (ASIC_IS_AVIVO(rdev) && 2088 1.1 riastrad (!(radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)))) { 2089 1.1 riastrad if (ASIC_IS_DCE8(rdev)) { 2090 1.1 riastrad if (mode->flags & DRM_MODE_FLAG_INTERLACE) 2091 1.1 riastrad WREG32(CIK_LB_DATA_FORMAT + radeon_crtc->crtc_offset, 2092 1.1 riastrad CIK_INTERLEAVE_EN); 2093 1.1 riastrad else 2094 1.1 riastrad WREG32(CIK_LB_DATA_FORMAT + radeon_crtc->crtc_offset, 0); 2095 1.1 riastrad } else if (ASIC_IS_DCE4(rdev)) { 2096 1.1 riastrad if (mode->flags & DRM_MODE_FLAG_INTERLACE) 2097 1.1 riastrad WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset, 2098 1.1 riastrad EVERGREEN_INTERLEAVE_EN); 2099 1.1 riastrad else 2100 1.1 riastrad WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset, 0); 2101 1.1 riastrad } else { 2102 1.1 riastrad if (mode->flags & DRM_MODE_FLAG_INTERLACE) 2103 1.1 riastrad WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, 2104 1.1 riastrad AVIVO_D1MODE_INTERLEAVE_EN); 2105 1.1 riastrad else 2106 1.1 riastrad WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, 0); 2107 1.1 riastrad } 2108 1.1 riastrad } 2109 1.1 riastrad } 2110 1.1 riastrad 2111 1.1 riastrad void radeon_atom_release_dig_encoder(struct radeon_device *rdev, int enc_idx) 2112 1.1 riastrad { 2113 1.1 riastrad if (enc_idx < 0) 2114 1.1 riastrad return; 2115 1.1 riastrad rdev->mode_info.active_encoders &= ~(1 << enc_idx); 2116 1.1 riastrad } 2117 1.1 riastrad 2118 1.1 riastrad int radeon_atom_pick_dig_encoder(struct drm_encoder *encoder, int fe_idx) 2119 1.1 riastrad { 2120 1.1 riastrad struct drm_device *dev = encoder->dev; 2121 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 2122 1.1 riastrad struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); 2123 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 2124 1.1 riastrad struct drm_encoder *test_encoder; 2125 1.1 riastrad struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 2126 1.1 riastrad uint32_t dig_enc_in_use = 0; 2127 1.1 riastrad int enc_idx = -1; 2128 1.1 riastrad 2129 1.1 riastrad if (fe_idx >= 0) { 2130 1.1 riastrad enc_idx = fe_idx; 2131 1.1 riastrad goto assigned; 2132 1.1 riastrad } 2133 1.1 riastrad if (ASIC_IS_DCE6(rdev)) { 2134 1.1 riastrad /* DCE6 */ 2135 1.1 riastrad switch (radeon_encoder->encoder_id) { 2136 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 2137 1.1 riastrad if (dig->linkb) 2138 1.1 riastrad enc_idx = 1; 2139 1.1 riastrad else 2140 1.1 riastrad enc_idx = 0; 2141 1.1 riastrad break; 2142 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 2143 1.1 riastrad if (dig->linkb) 2144 1.1 riastrad enc_idx = 3; 2145 1.1 riastrad else 2146 1.1 riastrad enc_idx = 2; 2147 1.1 riastrad break; 2148 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 2149 1.1 riastrad if (dig->linkb) 2150 1.1 riastrad enc_idx = 5; 2151 1.1 riastrad else 2152 1.1 riastrad enc_idx = 4; 2153 1.1 riastrad break; 2154 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: 2155 1.1 riastrad enc_idx = 6; 2156 1.1 riastrad break; 2157 1.1 riastrad } 2158 1.1 riastrad goto assigned; 2159 1.1 riastrad } else if (ASIC_IS_DCE4(rdev)) { 2160 1.1 riastrad /* DCE4/5 */ 2161 1.1 riastrad if (ASIC_IS_DCE41(rdev) && !ASIC_IS_DCE61(rdev)) { 2162 1.1 riastrad /* ontario follows DCE4 */ 2163 1.1 riastrad if (rdev->family == CHIP_PALM) { 2164 1.1 riastrad if (dig->linkb) 2165 1.1 riastrad enc_idx = 1; 2166 1.1 riastrad else 2167 1.1 riastrad enc_idx = 0; 2168 1.1 riastrad } else 2169 1.1 riastrad /* llano follows DCE3.2 */ 2170 1.1 riastrad enc_idx = radeon_crtc->crtc_id; 2171 1.1 riastrad } else { 2172 1.1 riastrad switch (radeon_encoder->encoder_id) { 2173 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 2174 1.1 riastrad if (dig->linkb) 2175 1.1 riastrad enc_idx = 1; 2176 1.1 riastrad else 2177 1.1 riastrad enc_idx = 0; 2178 1.1 riastrad break; 2179 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 2180 1.1 riastrad if (dig->linkb) 2181 1.1 riastrad enc_idx = 3; 2182 1.1 riastrad else 2183 1.1 riastrad enc_idx = 2; 2184 1.1 riastrad break; 2185 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 2186 1.1 riastrad if (dig->linkb) 2187 1.1 riastrad enc_idx = 5; 2188 1.1 riastrad else 2189 1.1 riastrad enc_idx = 4; 2190 1.1 riastrad break; 2191 1.1 riastrad } 2192 1.1 riastrad } 2193 1.1 riastrad goto assigned; 2194 1.1 riastrad } 2195 1.1 riastrad 2196 1.1 riastrad /* 2197 1.1 riastrad * On DCE32 any encoder can drive any block so usually just use crtc id, 2198 1.1 riastrad * but Apple thinks different at least on iMac10,1, so there use linkb, 2199 1.1 riastrad * otherwise the internal eDP panel will stay dark. 2200 1.1 riastrad */ 2201 1.1 riastrad if (ASIC_IS_DCE32(rdev)) { 2202 1.1 riastrad if (dmi_match(DMI_PRODUCT_NAME, "iMac10,1")) 2203 1.1 riastrad enc_idx = (dig->linkb) ? 1 : 0; 2204 1.1 riastrad else 2205 1.1 riastrad enc_idx = radeon_crtc->crtc_id; 2206 1.1 riastrad 2207 1.1 riastrad goto assigned; 2208 1.1 riastrad } 2209 1.1 riastrad 2210 1.1 riastrad /* on DCE3 - LVTMA can only be driven by DIGB */ 2211 1.1 riastrad list_for_each_entry(test_encoder, &dev->mode_config.encoder_list, head) { 2212 1.1 riastrad struct radeon_encoder *radeon_test_encoder; 2213 1.1 riastrad 2214 1.1 riastrad if (encoder == test_encoder) 2215 1.1 riastrad continue; 2216 1.1 riastrad 2217 1.1 riastrad if (!radeon_encoder_is_digital(test_encoder)) 2218 1.1 riastrad continue; 2219 1.1 riastrad 2220 1.1 riastrad radeon_test_encoder = to_radeon_encoder(test_encoder); 2221 1.1 riastrad dig = radeon_test_encoder->enc_priv; 2222 1.1 riastrad 2223 1.1 riastrad if (dig->dig_encoder >= 0) 2224 1.1 riastrad dig_enc_in_use |= (1 << dig->dig_encoder); 2225 1.1 riastrad } 2226 1.1 riastrad 2227 1.1 riastrad if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA) { 2228 1.1 riastrad if (dig_enc_in_use & 0x2) 2229 1.1 riastrad DRM_ERROR("LVDS required digital encoder 2 but it was in use - stealing\n"); 2230 1.1 riastrad return 1; 2231 1.1 riastrad } 2232 1.1 riastrad if (!(dig_enc_in_use & 1)) 2233 1.1 riastrad return 0; 2234 1.1 riastrad return 1; 2235 1.1 riastrad 2236 1.1 riastrad assigned: 2237 1.1 riastrad if (enc_idx == -1) { 2238 1.1 riastrad DRM_ERROR("Got encoder index incorrect - returning 0\n"); 2239 1.1 riastrad return 0; 2240 1.1 riastrad } 2241 1.2 riastrad if (rdev->mode_info.active_encoders & (1 << enc_idx)) 2242 1.1 riastrad DRM_ERROR("chosen encoder in use %d\n", enc_idx); 2243 1.2 riastrad 2244 1.1 riastrad rdev->mode_info.active_encoders |= (1 << enc_idx); 2245 1.1 riastrad return enc_idx; 2246 1.1 riastrad } 2247 1.1 riastrad 2248 1.1 riastrad /* This only needs to be called once at startup */ 2249 1.1 riastrad void 2250 1.1 riastrad radeon_atom_encoder_init(struct radeon_device *rdev) 2251 1.1 riastrad { 2252 1.1 riastrad struct drm_device *dev = rdev->ddev; 2253 1.1 riastrad struct drm_encoder *encoder; 2254 1.1 riastrad 2255 1.1 riastrad list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 2256 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 2257 1.1 riastrad struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder); 2258 1.1 riastrad 2259 1.1 riastrad switch (radeon_encoder->encoder_id) { 2260 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 2261 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 2262 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 2263 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: 2264 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: 2265 1.1 riastrad atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_INIT, 0, 0); 2266 1.1 riastrad break; 2267 1.1 riastrad default: 2268 1.1 riastrad break; 2269 1.1 riastrad } 2270 1.1 riastrad 2271 1.1 riastrad if (ext_encoder && (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE61(rdev))) 2272 1.1 riastrad atombios_external_encoder_setup(encoder, ext_encoder, 2273 1.1 riastrad EXTERNAL_ENCODER_ACTION_V3_ENCODER_INIT); 2274 1.1 riastrad } 2275 1.1 riastrad } 2276 1.1 riastrad 2277 1.1 riastrad static void 2278 1.1 riastrad radeon_atom_encoder_mode_set(struct drm_encoder *encoder, 2279 1.1 riastrad struct drm_display_mode *mode, 2280 1.1 riastrad struct drm_display_mode *adjusted_mode) 2281 1.1 riastrad { 2282 1.1 riastrad struct drm_device *dev = encoder->dev; 2283 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 2284 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 2285 1.1 riastrad struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); 2286 1.1 riastrad int encoder_mode; 2287 1.1 riastrad 2288 1.1 riastrad radeon_encoder->pixel_clock = adjusted_mode->clock; 2289 1.1 riastrad 2290 1.1 riastrad /* need to call this here rather than in prepare() since we need some crtc info */ 2291 1.1 riastrad radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF); 2292 1.1 riastrad 2293 1.1 riastrad if (ASIC_IS_AVIVO(rdev) && !ASIC_IS_DCE4(rdev)) { 2294 1.1 riastrad if (radeon_encoder->active_device & (ATOM_DEVICE_CV_SUPPORT | ATOM_DEVICE_TV_SUPPORT)) 2295 1.1 riastrad atombios_yuv_setup(encoder, true); 2296 1.1 riastrad else 2297 1.1 riastrad atombios_yuv_setup(encoder, false); 2298 1.1 riastrad } 2299 1.1 riastrad 2300 1.1 riastrad switch (radeon_encoder->encoder_id) { 2301 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_TMDS1: 2302 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: 2303 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_LVDS: 2304 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_LVTM1: 2305 1.1 riastrad atombios_digital_setup(encoder, PANEL_ENCODER_ACTION_ENABLE); 2306 1.1 riastrad break; 2307 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 2308 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 2309 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 2310 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: 2311 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: 2312 1.1 riastrad /* handled in dpms */ 2313 1.1 riastrad break; 2314 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DDI: 2315 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DVO1: 2316 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: 2317 1.1 riastrad atombios_dvo_setup(encoder, ATOM_ENABLE); 2318 1.1 riastrad break; 2319 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DAC1: 2320 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: 2321 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DAC2: 2322 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: 2323 1.1 riastrad atombios_dac_setup(encoder, ATOM_ENABLE); 2324 1.1 riastrad if (radeon_encoder->devices & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) { 2325 1.1 riastrad if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) 2326 1.1 riastrad atombios_tv_setup(encoder, ATOM_ENABLE); 2327 1.1 riastrad else 2328 1.1 riastrad atombios_tv_setup(encoder, ATOM_DISABLE); 2329 1.1 riastrad } 2330 1.1 riastrad break; 2331 1.1 riastrad } 2332 1.1 riastrad 2333 1.1 riastrad atombios_apply_encoder_quirks(encoder, adjusted_mode); 2334 1.1 riastrad 2335 1.1 riastrad encoder_mode = atombios_get_encoder_mode(encoder); 2336 1.1 riastrad if (connector && (radeon_audio != 0) && 2337 1.1 riastrad ((encoder_mode == ATOM_ENCODER_MODE_HDMI) || 2338 1.1 riastrad ENCODER_MODE_IS_DP(encoder_mode))) 2339 1.1 riastrad radeon_audio_mode_set(encoder, adjusted_mode); 2340 1.1 riastrad } 2341 1.1 riastrad 2342 1.1 riastrad static bool 2343 1.1 riastrad atombios_dac_load_detect(struct drm_encoder *encoder, struct drm_connector *connector) 2344 1.1 riastrad { 2345 1.1 riastrad struct drm_device *dev = encoder->dev; 2346 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 2347 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 2348 1.1 riastrad struct radeon_connector *radeon_connector = to_radeon_connector(connector); 2349 1.1 riastrad 2350 1.1 riastrad if (radeon_encoder->devices & (ATOM_DEVICE_TV_SUPPORT | 2351 1.1 riastrad ATOM_DEVICE_CV_SUPPORT | 2352 1.1 riastrad ATOM_DEVICE_CRT_SUPPORT)) { 2353 1.1 riastrad DAC_LOAD_DETECTION_PS_ALLOCATION args; 2354 1.1 riastrad int index = GetIndexIntoMasterTable(COMMAND, DAC_LoadDetection); 2355 1.1 riastrad uint8_t frev, crev; 2356 1.1 riastrad 2357 1.1 riastrad memset(&args, 0, sizeof(args)); 2358 1.1 riastrad 2359 1.1 riastrad if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) 2360 1.1 riastrad return false; 2361 1.1 riastrad 2362 1.1 riastrad args.sDacload.ucMisc = 0; 2363 1.1 riastrad 2364 1.1 riastrad if ((radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DAC1) || 2365 1.1 riastrad (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1)) 2366 1.1 riastrad args.sDacload.ucDacType = ATOM_DAC_A; 2367 1.1 riastrad else 2368 1.1 riastrad args.sDacload.ucDacType = ATOM_DAC_B; 2369 1.1 riastrad 2370 1.1 riastrad if (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT) 2371 1.1 riastrad args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CRT1_SUPPORT); 2372 1.1 riastrad else if (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT) 2373 1.1 riastrad args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CRT2_SUPPORT); 2374 1.1 riastrad else if (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT) { 2375 1.1 riastrad args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CV_SUPPORT); 2376 1.1 riastrad if (crev >= 3) 2377 1.1 riastrad args.sDacload.ucMisc = DAC_LOAD_MISC_YPrPb; 2378 1.1 riastrad } else if (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT) { 2379 1.1 riastrad args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_TV1_SUPPORT); 2380 1.1 riastrad if (crev >= 3) 2381 1.1 riastrad args.sDacload.ucMisc = DAC_LOAD_MISC_YPrPb; 2382 1.1 riastrad } 2383 1.1 riastrad 2384 1.1 riastrad atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 2385 1.1 riastrad 2386 1.1 riastrad return true; 2387 1.1 riastrad } else 2388 1.1 riastrad return false; 2389 1.1 riastrad } 2390 1.1 riastrad 2391 1.1 riastrad static enum drm_connector_status 2392 1.1 riastrad radeon_atom_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector) 2393 1.1 riastrad { 2394 1.1 riastrad struct drm_device *dev = encoder->dev; 2395 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 2396 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 2397 1.1 riastrad struct radeon_connector *radeon_connector = to_radeon_connector(connector); 2398 1.1 riastrad uint32_t bios_0_scratch; 2399 1.1 riastrad 2400 1.1 riastrad if (!atombios_dac_load_detect(encoder, connector)) { 2401 1.1 riastrad DRM_DEBUG_KMS("detect returned false \n"); 2402 1.1 riastrad return connector_status_unknown; 2403 1.1 riastrad } 2404 1.1 riastrad 2405 1.1 riastrad if (rdev->family >= CHIP_R600) 2406 1.1 riastrad bios_0_scratch = RREG32(R600_BIOS_0_SCRATCH); 2407 1.1 riastrad else 2408 1.1 riastrad bios_0_scratch = RREG32(RADEON_BIOS_0_SCRATCH); 2409 1.1 riastrad 2410 1.1 riastrad DRM_DEBUG_KMS("Bios 0 scratch %x %08x\n", bios_0_scratch, radeon_encoder->devices); 2411 1.1 riastrad if (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT) { 2412 1.1 riastrad if (bios_0_scratch & ATOM_S0_CRT1_MASK) 2413 1.1 riastrad return connector_status_connected; 2414 1.1 riastrad } 2415 1.1 riastrad if (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT) { 2416 1.1 riastrad if (bios_0_scratch & ATOM_S0_CRT2_MASK) 2417 1.1 riastrad return connector_status_connected; 2418 1.1 riastrad } 2419 1.1 riastrad if (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT) { 2420 1.1 riastrad if (bios_0_scratch & (ATOM_S0_CV_MASK|ATOM_S0_CV_MASK_A)) 2421 1.1 riastrad return connector_status_connected; 2422 1.1 riastrad } 2423 1.1 riastrad if (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT) { 2424 1.1 riastrad if (bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A)) 2425 1.1 riastrad return connector_status_connected; /* CTV */ 2426 1.1 riastrad else if (bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A)) 2427 1.1 riastrad return connector_status_connected; /* STV */ 2428 1.1 riastrad } 2429 1.1 riastrad return connector_status_disconnected; 2430 1.1 riastrad } 2431 1.1 riastrad 2432 1.1 riastrad static enum drm_connector_status 2433 1.1 riastrad radeon_atom_dig_detect(struct drm_encoder *encoder, struct drm_connector *connector) 2434 1.1 riastrad { 2435 1.1 riastrad struct drm_device *dev = encoder->dev; 2436 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 2437 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 2438 1.1 riastrad struct radeon_connector *radeon_connector = to_radeon_connector(connector); 2439 1.1 riastrad struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder); 2440 1.1 riastrad u32 bios_0_scratch; 2441 1.1 riastrad 2442 1.1 riastrad if (!ASIC_IS_DCE4(rdev)) 2443 1.1 riastrad return connector_status_unknown; 2444 1.1 riastrad 2445 1.1 riastrad if (!ext_encoder) 2446 1.1 riastrad return connector_status_unknown; 2447 1.1 riastrad 2448 1.1 riastrad if ((radeon_connector->devices & ATOM_DEVICE_CRT_SUPPORT) == 0) 2449 1.1 riastrad return connector_status_unknown; 2450 1.1 riastrad 2451 1.1 riastrad /* load detect on the dp bridge */ 2452 1.1 riastrad atombios_external_encoder_setup(encoder, ext_encoder, 2453 1.1 riastrad EXTERNAL_ENCODER_ACTION_V3_DACLOAD_DETECTION); 2454 1.1 riastrad 2455 1.1 riastrad bios_0_scratch = RREG32(R600_BIOS_0_SCRATCH); 2456 1.1 riastrad 2457 1.1 riastrad DRM_DEBUG_KMS("Bios 0 scratch %x %08x\n", bios_0_scratch, radeon_encoder->devices); 2458 1.1 riastrad if (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT) { 2459 1.1 riastrad if (bios_0_scratch & ATOM_S0_CRT1_MASK) 2460 1.1 riastrad return connector_status_connected; 2461 1.1 riastrad } 2462 1.1 riastrad if (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT) { 2463 1.1 riastrad if (bios_0_scratch & ATOM_S0_CRT2_MASK) 2464 1.1 riastrad return connector_status_connected; 2465 1.1 riastrad } 2466 1.1 riastrad if (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT) { 2467 1.1 riastrad if (bios_0_scratch & (ATOM_S0_CV_MASK|ATOM_S0_CV_MASK_A)) 2468 1.1 riastrad return connector_status_connected; 2469 1.1 riastrad } 2470 1.1 riastrad if (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT) { 2471 1.1 riastrad if (bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A)) 2472 1.1 riastrad return connector_status_connected; /* CTV */ 2473 1.1 riastrad else if (bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A)) 2474 1.1 riastrad return connector_status_connected; /* STV */ 2475 1.1 riastrad } 2476 1.1 riastrad return connector_status_disconnected; 2477 1.1 riastrad } 2478 1.1 riastrad 2479 1.1 riastrad void 2480 1.1 riastrad radeon_atom_ext_encoder_setup_ddc(struct drm_encoder *encoder) 2481 1.1 riastrad { 2482 1.1 riastrad struct drm_encoder *ext_encoder = radeon_get_external_encoder(encoder); 2483 1.1 riastrad 2484 1.1 riastrad if (ext_encoder) 2485 1.1 riastrad /* ddc_setup on the dp bridge */ 2486 1.1 riastrad atombios_external_encoder_setup(encoder, ext_encoder, 2487 1.1 riastrad EXTERNAL_ENCODER_ACTION_V3_DDC_SETUP); 2488 1.1 riastrad 2489 1.1 riastrad } 2490 1.1 riastrad 2491 1.1 riastrad static void radeon_atom_encoder_prepare(struct drm_encoder *encoder) 2492 1.1 riastrad { 2493 1.1 riastrad struct radeon_device *rdev = encoder->dev->dev_private; 2494 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 2495 1.1 riastrad struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); 2496 1.1 riastrad 2497 1.1 riastrad if ((radeon_encoder->active_device & 2498 1.1 riastrad (ATOM_DEVICE_DFP_SUPPORT | ATOM_DEVICE_LCD_SUPPORT)) || 2499 1.1 riastrad (radeon_encoder_get_dp_bridge_encoder_id(encoder) != 2500 1.1 riastrad ENCODER_OBJECT_ID_NONE)) { 2501 1.1 riastrad struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; 2502 1.1 riastrad if (dig) { 2503 1.1 riastrad if (dig->dig_encoder >= 0) 2504 1.1 riastrad radeon_atom_release_dig_encoder(rdev, dig->dig_encoder); 2505 1.1 riastrad dig->dig_encoder = radeon_atom_pick_dig_encoder(encoder, -1); 2506 1.1 riastrad if (radeon_encoder->active_device & ATOM_DEVICE_DFP_SUPPORT) { 2507 1.1 riastrad if (rdev->family >= CHIP_R600) 2508 1.1 riastrad dig->afmt = rdev->mode_info.afmt[dig->dig_encoder]; 2509 1.1 riastrad else 2510 1.1 riastrad /* RS600/690/740 have only 1 afmt block */ 2511 1.1 riastrad dig->afmt = rdev->mode_info.afmt[0]; 2512 1.1 riastrad } 2513 1.1 riastrad } 2514 1.1 riastrad } 2515 1.1 riastrad 2516 1.1 riastrad radeon_atom_output_lock(encoder, true); 2517 1.1 riastrad 2518 1.1 riastrad if (connector) { 2519 1.1 riastrad struct radeon_connector *radeon_connector = to_radeon_connector(connector); 2520 1.1 riastrad 2521 1.1 riastrad /* select the clock/data port if it uses a router */ 2522 1.1 riastrad if (radeon_connector->router.cd_valid) 2523 1.1 riastrad radeon_router_select_cd_port(radeon_connector); 2524 1.1 riastrad 2525 1.1 riastrad /* turn eDP panel on for mode set */ 2526 1.1 riastrad if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) 2527 1.1 riastrad atombios_set_edp_panel_power(connector, 2528 1.1 riastrad ATOM_TRANSMITTER_ACTION_POWER_ON); 2529 1.1 riastrad } 2530 1.1 riastrad 2531 1.1 riastrad /* this is needed for the pll/ss setup to work correctly in some cases */ 2532 1.1 riastrad atombios_set_encoder_crtc_source(encoder); 2533 1.1 riastrad /* set up the FMT blocks */ 2534 1.1 riastrad if (ASIC_IS_DCE8(rdev)) 2535 1.1 riastrad dce8_program_fmt(encoder); 2536 1.1 riastrad else if (ASIC_IS_DCE4(rdev)) 2537 1.1 riastrad dce4_program_fmt(encoder); 2538 1.1 riastrad else if (ASIC_IS_DCE3(rdev)) 2539 1.1 riastrad dce3_program_fmt(encoder); 2540 1.1 riastrad else if (ASIC_IS_AVIVO(rdev)) 2541 1.1 riastrad avivo_program_fmt(encoder); 2542 1.1 riastrad } 2543 1.1 riastrad 2544 1.1 riastrad static void radeon_atom_encoder_commit(struct drm_encoder *encoder) 2545 1.1 riastrad { 2546 1.1 riastrad /* need to call this here as we need the crtc set up */ 2547 1.1 riastrad radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_ON); 2548 1.1 riastrad radeon_atom_output_lock(encoder, false); 2549 1.1 riastrad } 2550 1.1 riastrad 2551 1.1 riastrad static void radeon_atom_encoder_disable(struct drm_encoder *encoder) 2552 1.1 riastrad { 2553 1.1 riastrad struct drm_device *dev = encoder->dev; 2554 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 2555 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 2556 1.1 riastrad struct radeon_encoder_atom_dig *dig; 2557 1.1 riastrad 2558 1.1 riastrad /* check for pre-DCE3 cards with shared encoders; 2559 1.1 riastrad * can't really use the links individually, so don't disable 2560 1.1 riastrad * the encoder if it's in use by another connector 2561 1.1 riastrad */ 2562 1.1 riastrad if (!ASIC_IS_DCE3(rdev)) { 2563 1.1 riastrad struct drm_encoder *other_encoder; 2564 1.1 riastrad struct radeon_encoder *other_radeon_encoder; 2565 1.1 riastrad 2566 1.1 riastrad list_for_each_entry(other_encoder, &dev->mode_config.encoder_list, head) { 2567 1.1 riastrad other_radeon_encoder = to_radeon_encoder(other_encoder); 2568 1.1 riastrad if ((radeon_encoder->encoder_id == other_radeon_encoder->encoder_id) && 2569 1.1 riastrad drm_helper_encoder_in_use(other_encoder)) 2570 1.1 riastrad goto disable_done; 2571 1.1 riastrad } 2572 1.1 riastrad } 2573 1.1 riastrad 2574 1.1 riastrad radeon_atom_encoder_dpms(encoder, DRM_MODE_DPMS_OFF); 2575 1.1 riastrad 2576 1.1 riastrad switch (radeon_encoder->encoder_id) { 2577 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_TMDS1: 2578 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: 2579 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_LVDS: 2580 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_LVTM1: 2581 1.1 riastrad atombios_digital_setup(encoder, PANEL_ENCODER_ACTION_DISABLE); 2582 1.1 riastrad break; 2583 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 2584 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 2585 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 2586 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: 2587 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: 2588 1.1 riastrad /* handled in dpms */ 2589 1.1 riastrad break; 2590 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DDI: 2591 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DVO1: 2592 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: 2593 1.1 riastrad atombios_dvo_setup(encoder, ATOM_DISABLE); 2594 1.1 riastrad break; 2595 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DAC1: 2596 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: 2597 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DAC2: 2598 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: 2599 1.1 riastrad atombios_dac_setup(encoder, ATOM_DISABLE); 2600 1.1 riastrad if (radeon_encoder->devices & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) 2601 1.1 riastrad atombios_tv_setup(encoder, ATOM_DISABLE); 2602 1.1 riastrad break; 2603 1.1 riastrad } 2604 1.1 riastrad 2605 1.1 riastrad disable_done: 2606 1.1 riastrad if (radeon_encoder_is_digital(encoder)) { 2607 1.1 riastrad if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) { 2608 1.1 riastrad if (rdev->asic->display.hdmi_enable) 2609 1.1 riastrad radeon_hdmi_enable(rdev, encoder, false); 2610 1.1 riastrad } 2611 1.1 riastrad if (atombios_get_encoder_mode(encoder) != ATOM_ENCODER_MODE_DP_MST) { 2612 1.1 riastrad dig = radeon_encoder->enc_priv; 2613 1.1 riastrad radeon_atom_release_dig_encoder(rdev, dig->dig_encoder); 2614 1.1 riastrad dig->dig_encoder = -1; 2615 1.1 riastrad radeon_encoder->active_device = 0; 2616 1.1 riastrad } 2617 1.1 riastrad } else 2618 1.1 riastrad radeon_encoder->active_device = 0; 2619 1.1 riastrad } 2620 1.1 riastrad 2621 1.1 riastrad /* these are handled by the primary encoders */ 2622 1.1 riastrad static void radeon_atom_ext_prepare(struct drm_encoder *encoder) 2623 1.1 riastrad { 2624 1.1 riastrad 2625 1.1 riastrad } 2626 1.1 riastrad 2627 1.1 riastrad static void radeon_atom_ext_commit(struct drm_encoder *encoder) 2628 1.1 riastrad { 2629 1.1 riastrad 2630 1.1 riastrad } 2631 1.1 riastrad 2632 1.1 riastrad static void 2633 1.1 riastrad radeon_atom_ext_mode_set(struct drm_encoder *encoder, 2634 1.1 riastrad struct drm_display_mode *mode, 2635 1.1 riastrad struct drm_display_mode *adjusted_mode) 2636 1.1 riastrad { 2637 1.1 riastrad 2638 1.1 riastrad } 2639 1.1 riastrad 2640 1.1 riastrad static void radeon_atom_ext_disable(struct drm_encoder *encoder) 2641 1.1 riastrad { 2642 1.1 riastrad 2643 1.1 riastrad } 2644 1.1 riastrad 2645 1.1 riastrad static void 2646 1.1 riastrad radeon_atom_ext_dpms(struct drm_encoder *encoder, int mode) 2647 1.1 riastrad { 2648 1.1 riastrad 2649 1.1 riastrad } 2650 1.1 riastrad 2651 1.1 riastrad static const struct drm_encoder_helper_funcs radeon_atom_ext_helper_funcs = { 2652 1.1 riastrad .dpms = radeon_atom_ext_dpms, 2653 1.1 riastrad .prepare = radeon_atom_ext_prepare, 2654 1.1 riastrad .mode_set = radeon_atom_ext_mode_set, 2655 1.1 riastrad .commit = radeon_atom_ext_commit, 2656 1.1 riastrad .disable = radeon_atom_ext_disable, 2657 1.1 riastrad /* no detect for TMDS/LVDS yet */ 2658 1.1 riastrad }; 2659 1.1 riastrad 2660 1.1 riastrad static const struct drm_encoder_helper_funcs radeon_atom_dig_helper_funcs = { 2661 1.1 riastrad .dpms = radeon_atom_encoder_dpms, 2662 1.1 riastrad .mode_fixup = radeon_atom_mode_fixup, 2663 1.1 riastrad .prepare = radeon_atom_encoder_prepare, 2664 1.1 riastrad .mode_set = radeon_atom_encoder_mode_set, 2665 1.1 riastrad .commit = radeon_atom_encoder_commit, 2666 1.1 riastrad .disable = radeon_atom_encoder_disable, 2667 1.1 riastrad .detect = radeon_atom_dig_detect, 2668 1.1 riastrad }; 2669 1.1 riastrad 2670 1.1 riastrad static const struct drm_encoder_helper_funcs radeon_atom_dac_helper_funcs = { 2671 1.1 riastrad .dpms = radeon_atom_encoder_dpms, 2672 1.1 riastrad .mode_fixup = radeon_atom_mode_fixup, 2673 1.1 riastrad .prepare = radeon_atom_encoder_prepare, 2674 1.1 riastrad .mode_set = radeon_atom_encoder_mode_set, 2675 1.1 riastrad .commit = radeon_atom_encoder_commit, 2676 1.1 riastrad .detect = radeon_atom_dac_detect, 2677 1.1 riastrad }; 2678 1.1 riastrad 2679 1.1 riastrad void radeon_enc_destroy(struct drm_encoder *encoder) 2680 1.1 riastrad { 2681 1.1 riastrad struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 2682 1.1 riastrad if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) 2683 1.1 riastrad radeon_atom_backlight_exit(radeon_encoder); 2684 1.1 riastrad kfree(radeon_encoder->enc_priv); 2685 1.1 riastrad drm_encoder_cleanup(encoder); 2686 1.1 riastrad kfree(radeon_encoder); 2687 1.1 riastrad } 2688 1.1 riastrad 2689 1.1 riastrad static const struct drm_encoder_funcs radeon_atom_enc_funcs = { 2690 1.1 riastrad .destroy = radeon_enc_destroy, 2691 1.1 riastrad }; 2692 1.1 riastrad 2693 1.1 riastrad static struct radeon_encoder_atom_dac * 2694 1.1 riastrad radeon_atombios_set_dac_info(struct radeon_encoder *radeon_encoder) 2695 1.1 riastrad { 2696 1.1 riastrad struct drm_device *dev = radeon_encoder->base.dev; 2697 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 2698 1.1 riastrad struct radeon_encoder_atom_dac *dac = kzalloc(sizeof(struct radeon_encoder_atom_dac), GFP_KERNEL); 2699 1.1 riastrad 2700 1.1 riastrad if (!dac) 2701 1.1 riastrad return NULL; 2702 1.1 riastrad 2703 1.1 riastrad dac->tv_std = radeon_atombios_get_tv_info(rdev); 2704 1.1 riastrad return dac; 2705 1.1 riastrad } 2706 1.1 riastrad 2707 1.1 riastrad static struct radeon_encoder_atom_dig * 2708 1.1 riastrad radeon_atombios_set_dig_info(struct radeon_encoder *radeon_encoder) 2709 1.1 riastrad { 2710 1.1 riastrad int encoder_enum = (radeon_encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT; 2711 1.1 riastrad struct radeon_encoder_atom_dig *dig = kzalloc(sizeof(struct radeon_encoder_atom_dig), GFP_KERNEL); 2712 1.1 riastrad 2713 1.1 riastrad if (!dig) 2714 1.1 riastrad return NULL; 2715 1.1 riastrad 2716 1.1 riastrad /* coherent mode by default */ 2717 1.1 riastrad dig->coherent_mode = true; 2718 1.1 riastrad dig->dig_encoder = -1; 2719 1.1 riastrad 2720 1.1 riastrad if (encoder_enum == 2) 2721 1.1 riastrad dig->linkb = true; 2722 1.1 riastrad else 2723 1.1 riastrad dig->linkb = false; 2724 1.1 riastrad 2725 1.1 riastrad return dig; 2726 1.1 riastrad } 2727 1.1 riastrad 2728 1.1 riastrad void 2729 1.1 riastrad radeon_add_atom_encoder(struct drm_device *dev, 2730 1.1 riastrad uint32_t encoder_enum, 2731 1.1 riastrad uint32_t supported_device, 2732 1.1 riastrad u16 caps) 2733 1.1 riastrad { 2734 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 2735 1.1 riastrad struct drm_encoder *encoder; 2736 1.1 riastrad struct radeon_encoder *radeon_encoder; 2737 1.1 riastrad 2738 1.1 riastrad /* see if we already added it */ 2739 1.1 riastrad list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 2740 1.1 riastrad radeon_encoder = to_radeon_encoder(encoder); 2741 1.1 riastrad if (radeon_encoder->encoder_enum == encoder_enum) { 2742 1.1 riastrad radeon_encoder->devices |= supported_device; 2743 1.1 riastrad return; 2744 1.1 riastrad } 2745 1.1 riastrad 2746 1.1 riastrad } 2747 1.1 riastrad 2748 1.1 riastrad /* add a new one */ 2749 1.1 riastrad radeon_encoder = kzalloc(sizeof(struct radeon_encoder), GFP_KERNEL); 2750 1.1 riastrad if (!radeon_encoder) 2751 1.1 riastrad return; 2752 1.1 riastrad 2753 1.1 riastrad encoder = &radeon_encoder->base; 2754 1.1 riastrad switch (rdev->num_crtc) { 2755 1.1 riastrad case 1: 2756 1.1 riastrad encoder->possible_crtcs = 0x1; 2757 1.1 riastrad break; 2758 1.1 riastrad case 2: 2759 1.1 riastrad default: 2760 1.1 riastrad encoder->possible_crtcs = 0x3; 2761 1.1 riastrad break; 2762 1.1 riastrad case 4: 2763 1.1 riastrad encoder->possible_crtcs = 0xf; 2764 1.1 riastrad break; 2765 1.1 riastrad case 6: 2766 1.1 riastrad encoder->possible_crtcs = 0x3f; 2767 1.1 riastrad break; 2768 1.1 riastrad } 2769 1.1 riastrad 2770 1.1 riastrad radeon_encoder->enc_priv = NULL; 2771 1.1 riastrad 2772 1.1 riastrad radeon_encoder->encoder_enum = encoder_enum; 2773 1.1 riastrad radeon_encoder->encoder_id = (encoder_enum & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; 2774 1.1 riastrad radeon_encoder->devices = supported_device; 2775 1.1 riastrad radeon_encoder->rmx_type = RMX_OFF; 2776 1.1 riastrad radeon_encoder->underscan_type = UNDERSCAN_OFF; 2777 1.1 riastrad radeon_encoder->is_ext_encoder = false; 2778 1.1 riastrad radeon_encoder->caps = caps; 2779 1.1 riastrad 2780 1.1 riastrad switch (radeon_encoder->encoder_id) { 2781 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_LVDS: 2782 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_TMDS1: 2783 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: 2784 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_LVTM1: 2785 1.1 riastrad if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { 2786 1.1 riastrad radeon_encoder->rmx_type = RMX_FULL; 2787 1.2 riastrad drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, 2788 1.2 riastrad DRM_MODE_ENCODER_LVDS, NULL); 2789 1.1 riastrad radeon_encoder->enc_priv = radeon_atombios_get_lvds_info(radeon_encoder); 2790 1.1 riastrad } else { 2791 1.2 riastrad drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, 2792 1.2 riastrad DRM_MODE_ENCODER_TMDS, NULL); 2793 1.1 riastrad radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder); 2794 1.1 riastrad } 2795 1.1 riastrad drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs); 2796 1.1 riastrad break; 2797 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DAC1: 2798 1.2 riastrad drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, 2799 1.2 riastrad DRM_MODE_ENCODER_DAC, NULL); 2800 1.1 riastrad radeon_encoder->enc_priv = radeon_atombios_set_dac_info(radeon_encoder); 2801 1.1 riastrad drm_encoder_helper_add(encoder, &radeon_atom_dac_helper_funcs); 2802 1.1 riastrad break; 2803 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DAC2: 2804 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: 2805 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: 2806 1.2 riastrad drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, 2807 1.2 riastrad DRM_MODE_ENCODER_TVDAC, NULL); 2808 1.1 riastrad radeon_encoder->enc_priv = radeon_atombios_set_dac_info(radeon_encoder); 2809 1.1 riastrad drm_encoder_helper_add(encoder, &radeon_atom_dac_helper_funcs); 2810 1.1 riastrad break; 2811 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DVO1: 2812 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: 2813 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_DDI: 2814 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: 2815 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: 2816 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: 2817 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: 2818 1.1 riastrad case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: 2819 1.1 riastrad if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { 2820 1.1 riastrad radeon_encoder->rmx_type = RMX_FULL; 2821 1.2 riastrad drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, 2822 1.2 riastrad DRM_MODE_ENCODER_LVDS, NULL); 2823 1.1 riastrad radeon_encoder->enc_priv = radeon_atombios_get_lvds_info(radeon_encoder); 2824 1.1 riastrad } else if (radeon_encoder->devices & (ATOM_DEVICE_CRT_SUPPORT)) { 2825 1.2 riastrad drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, 2826 1.2 riastrad DRM_MODE_ENCODER_DAC, NULL); 2827 1.1 riastrad radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder); 2828 1.1 riastrad } else { 2829 1.2 riastrad drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, 2830 1.2 riastrad DRM_MODE_ENCODER_TMDS, NULL); 2831 1.1 riastrad radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder); 2832 1.1 riastrad } 2833 1.1 riastrad drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs); 2834 1.1 riastrad break; 2835 1.1 riastrad case ENCODER_OBJECT_ID_SI170B: 2836 1.1 riastrad case ENCODER_OBJECT_ID_CH7303: 2837 1.1 riastrad case ENCODER_OBJECT_ID_EXTERNAL_SDVOA: 2838 1.1 riastrad case ENCODER_OBJECT_ID_EXTERNAL_SDVOB: 2839 1.1 riastrad case ENCODER_OBJECT_ID_TITFP513: 2840 1.1 riastrad case ENCODER_OBJECT_ID_VT1623: 2841 1.1 riastrad case ENCODER_OBJECT_ID_HDMI_SI1930: 2842 1.1 riastrad case ENCODER_OBJECT_ID_TRAVIS: 2843 1.1 riastrad case ENCODER_OBJECT_ID_NUTMEG: 2844 1.1 riastrad /* these are handled by the primary encoders */ 2845 1.1 riastrad radeon_encoder->is_ext_encoder = true; 2846 1.1 riastrad if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) 2847 1.2 riastrad drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, 2848 1.2 riastrad DRM_MODE_ENCODER_LVDS, NULL); 2849 1.1 riastrad else if (radeon_encoder->devices & (ATOM_DEVICE_CRT_SUPPORT)) 2850 1.2 riastrad drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, 2851 1.2 riastrad DRM_MODE_ENCODER_DAC, NULL); 2852 1.1 riastrad else 2853 1.2 riastrad drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, 2854 1.2 riastrad DRM_MODE_ENCODER_TMDS, NULL); 2855 1.1 riastrad drm_encoder_helper_add(encoder, &radeon_atom_ext_helper_funcs); 2856 1.1 riastrad break; 2857 1.1 riastrad } 2858 1.1 riastrad } 2859