2 * Copyright 2007-8 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21 * OTHER DEALINGS IN THE SOFTWARE.
23 * Authors: Dave Airlie
27 #include "drm_crtc_helper.h"
28 #include "radeon_drm.h"
29 #include "radeon_drv.h"
31 extern int atom_debug;
33 void radeon_rmx_mode_fixup(struct drm_encoder *encoder,
34 struct drm_display_mode *mode,
35 struct drm_display_mode *adjusted_mode)
37 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
38 if (mode->hdisplay < radeon_encoder->panel_xres ||
39 mode->vdisplay < radeon_encoder->panel_yres) {
40 radeon_encoder->flags |= RADEON_USE_RMX;
41 adjusted_mode->hdisplay = radeon_encoder->panel_xres;
42 adjusted_mode->vdisplay = radeon_encoder->panel_yres;
43 adjusted_mode->htotal = radeon_encoder->panel_xres + radeon_encoder->hblank;
44 adjusted_mode->hsync_start = radeon_encoder->panel_xres + radeon_encoder->hoverplus;
45 adjusted_mode->hsync_end = adjusted_mode->hsync_start + radeon_encoder->hsync_width;
46 adjusted_mode->vtotal = radeon_encoder->panel_yres + radeon_encoder->vblank;
47 adjusted_mode->vsync_start = radeon_encoder->panel_yres + radeon_encoder->voverplus;
48 adjusted_mode->vsync_end = adjusted_mode->vsync_start + radeon_encoder->vsync_width;
49 /* update crtc values */
50 drm_mode_set_crtcinfo(adjusted_mode, CRTC_INTERLACE_HALVE_V);
51 /* adjust crtc values */
52 adjusted_mode->crtc_hdisplay = radeon_encoder->panel_xres;
53 adjusted_mode->crtc_vdisplay = radeon_encoder->panel_yres;
54 adjusted_mode->crtc_htotal = adjusted_mode->crtc_hdisplay + radeon_encoder->hblank;
55 adjusted_mode->crtc_hsync_start = adjusted_mode->crtc_hdisplay + radeon_encoder->hoverplus;
56 adjusted_mode->crtc_hsync_end = adjusted_mode->crtc_hsync_start + radeon_encoder->hsync_width;
57 adjusted_mode->crtc_vtotal = adjusted_mode->crtc_vdisplay + radeon_encoder->vblank;
58 adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + radeon_encoder->voverplus;
59 adjusted_mode->crtc_vsync_end = adjusted_mode->crtc_vsync_start + radeon_encoder->vsync_width;
61 adjusted_mode->htotal = radeon_encoder->panel_xres + radeon_encoder->hblank;
62 adjusted_mode->hsync_start = radeon_encoder->panel_xres + radeon_encoder->hoverplus;
63 adjusted_mode->hsync_end = adjusted_mode->hsync_start + radeon_encoder->hsync_width;
64 adjusted_mode->vtotal = radeon_encoder->panel_yres + radeon_encoder->vblank;
65 adjusted_mode->vsync_start = radeon_encoder->panel_yres + radeon_encoder->voverplus;
66 adjusted_mode->vsync_end = adjusted_mode->vsync_start + radeon_encoder->vsync_width;
67 /* update crtc values */
68 drm_mode_set_crtcinfo(adjusted_mode, CRTC_INTERLACE_HALVE_V);
69 /* adjust crtc values */
70 adjusted_mode->crtc_htotal = adjusted_mode->crtc_hdisplay + radeon_encoder->hblank;
71 adjusted_mode->crtc_hsync_start = adjusted_mode->crtc_hdisplay + radeon_encoder->hoverplus;
72 adjusted_mode->crtc_hsync_end = adjusted_mode->crtc_hsync_start + radeon_encoder->hsync_width;
73 adjusted_mode->crtc_vtotal = adjusted_mode->crtc_vdisplay + radeon_encoder->vblank;
74 adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + radeon_encoder->voverplus;
75 adjusted_mode->crtc_vsync_end = adjusted_mode->crtc_vsync_start + radeon_encoder->vsync_width;
77 adjusted_mode->clock = radeon_encoder->dotclock;
78 adjusted_mode->flags = radeon_encoder->flags;
82 static int atom_dac_find_atom_type(struct radeon_encoder *radeon_encoder, struct drm_connector *connector)
84 struct drm_device *dev = radeon_encoder->base.dev;
85 struct drm_connector *connector_find;
89 list_for_each_entry(connector_find, &dev->mode_config.connector_list, head) {
90 if (connector_find->encoder == &radeon_encoder->base)
91 connector = connector_find;
95 /* look for the encoder in the connector list -
96 check if we the DAC is enabled on a VGA or STV/CTV or CV connector */
97 /* work out the ATOM_DEVICE bits */
98 switch (connector->connector_type) {
100 case CONNECTOR_DVI_I:
101 case CONNECTOR_DVI_A:
102 if (radeon_encoder->atom_device & ATOM_DEVICE_CRT1_SUPPORT)
103 atom_type = ATOM_DEVICE_CRT1_INDEX;
104 else if (radeon_encoder->atom_device & ATOM_DEVICE_CRT2_SUPPORT)
105 atom_type = ATOM_DEVICE_CRT2_INDEX;
109 if (radeon_encoder->atom_device & ATOM_DEVICE_TV1_SUPPORT)
110 atom_type = ATOM_DEVICE_TV1_INDEX;
113 if (radeon_encoder->atom_device & ATOM_DEVICE_TV1_SUPPORT)
114 atom_type = ATOM_DEVICE_TV1_INDEX;
115 if (radeon_encoder->atom_device & ATOM_DEVICE_CV_SUPPORT)
116 atom_type = ATOM_DEVICE_CV_INDEX;
124 /* LVTMA encoder for LVDS usage */
125 static void atombios_display_device_control(struct drm_encoder *encoder, int index, uint8_t state)
127 struct drm_device *dev = encoder->dev;
128 struct drm_radeon_private *dev_priv = dev->dev_private;
129 DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION args;
131 memset(&args, 0, sizeof(args));
132 args.ucAction = state;
134 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
137 static void atombios_scaler_setup(struct drm_encoder *encoder, struct drm_display_mode *mode)
139 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
140 struct drm_device *dev = encoder->dev;
141 struct drm_radeon_private *dev_priv = dev->dev_private;
142 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
143 ENABLE_SCALER_PS_ALLOCATION args;
144 int index = GetIndexIntoMasterTable(COMMAND, EnableScaler);
146 memset(&args, 0, sizeof(args));
147 args.ucScaler = radeon_crtc->crtc_id;
149 if (radeon_encoder->flags & RADEON_USE_RMX) {
150 if (radeon_encoder->rmx_type == RMX_FULL)
151 args.ucEnable = ATOM_SCALER_EXPANSION;
152 else if (radeon_encoder->rmx_type == RMX_CENTER)
153 args.ucEnable = ATOM_SCALER_CENTER;
155 args.ucEnable = ATOM_SCALER_DISABLE;
157 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
160 void atombios_set_crtc_source(struct drm_encoder *encoder, int source)
162 int index = GetIndexIntoMasterTable(COMMAND, SelectCRTC_Source);
163 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
164 struct drm_radeon_private *dev_priv = encoder->dev->dev_private;
166 SELECT_CRTC_SOURCE_PS_ALLOCATION crtc_src_param;
167 SELECT_CRTC_SOURCE_PARAMETERS_V2 crtc_src_param2;
168 uint32_t *param = NULL;
170 atom_parse_cmd_header(dev_priv->mode_info.atom_context, index, &frev, &crev);
177 memset(&crtc_src_param, 0, sizeof(crtc_src_param));
178 crtc_src_param.ucCRTC = radeon_crtc->crtc_id;
179 crtc_src_param.ucDevice = source;
180 param = (uint32_t *)&crtc_src_param;
183 memset(&crtc_src_param2, 0, sizeof(crtc_src_param2));
184 crtc_src_param2.ucCRTC = radeon_crtc->crtc_id;
185 crtc_src_param2.ucEncoderID = source;
187 case ATOM_DEVICE_CRT1_INDEX:
188 case ATOM_DEVICE_CRT2_INDEX:
189 crtc_src_param2.ucEncodeMode = ATOM_ENCODER_MODE_CRT;
191 case ATOM_DEVICE_DFP1_INDEX:
192 case ATOM_DEVICE_DFP2_INDEX:
193 case ATOM_DEVICE_DFP3_INDEX:
194 crtc_src_param2.ucEncodeMode = ATOM_ENCODER_MODE_DVI;
197 case ATOM_DEVICE_LCD1_INDEX:
198 crtc_src_param2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS;
200 case ATOM_DEVICE_TV1_INDEX:
201 crtc_src_param2.ucEncodeMode = ATOM_ENCODER_MODE_TV;
203 case ATOM_DEVICE_CV_INDEX:
204 crtc_src_param2.ucEncodeMode = ATOM_ENCODER_MODE_CV;
207 param = (uint32_t *)&crtc_src_param2;
216 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)param);
220 static void radeon_dfp_disable_dither(struct drm_encoder *encoder, int device)
222 struct drm_device *dev = encoder->dev;
223 struct drm_radeon_private *dev_priv = dev->dev_private;
226 case ATOM_DEVICE_DFP1_INDEX:
227 RADEON_WRITE(AVIVO_TMDSA_BIT_DEPTH_CONTROL, 0); /* TMDSA */
229 case ATOM_DEVICE_DFP2_INDEX:
230 if ((dev_priv->chip_family == CHIP_RS600) ||
231 (dev_priv->chip_family == CHIP_RS690) ||
232 (dev_priv->chip_family == CHIP_RS740))
233 RADEON_WRITE(AVIVO_DDIA_BIT_DEPTH_CONTROL, 0); /* DDIA */
235 RADEON_WRITE(AVIVO_DVOA_BIT_DEPTH_CONTROL, 0); /* DVO */
237 /*case ATOM_DEVICE_LCD1_INDEX:*/ /* LVDS panels need dither enabled */
238 case ATOM_DEVICE_DFP3_INDEX:
239 RADEON_WRITE(AVIVO_LVTMA_BIT_DEPTH_CONTROL, 0); /* LVTMA */
247 static void radeon_lvtma_mode_set(struct drm_encoder *encoder,
248 struct drm_display_mode *mode,
249 struct drm_display_mode *adjusted_mode)
251 struct drm_device *dev = encoder->dev;
252 struct drm_radeon_private *dev_priv = dev->dev_private;
253 LVDS_ENCODER_CONTROL_PS_ALLOCATION args;
254 int index = GetIndexIntoMasterTable(COMMAND, LVDSEncoderControl);
256 memset(&args, 0, sizeof(args));
257 atombios_scaler_setup(encoder, mode);
258 atombios_set_crtc_source(encoder, ATOM_DEVICE_LCD1_INDEX);
261 if (adjusted_mode->clock > 165000)
265 args.usPixelClock = cpu_to_le16(adjusted_mode->clock / 10);
267 printk("executing set LVDS encoder\n");
268 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
272 static void radeon_lvtma_dpms(struct drm_encoder *encoder, int mode)
274 struct drm_device *dev = encoder->dev;
275 struct drm_radeon_private *dev_priv = dev->dev_private;
276 struct radeon_crtc *radeon_crtc;
277 int index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl);
278 uint32_t bios_2_scratch, bios_3_scratch;
282 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
283 crtc_id = radeon_crtc->crtc_id;
286 if (dev_priv->chip_family >= CHIP_R600) {
287 bios_2_scratch = RADEON_READ(R600_BIOS_2_SCRATCH);
288 bios_3_scratch = RADEON_READ(R600_BIOS_3_SCRATCH);
290 bios_2_scratch = RADEON_READ(RADEON_BIOS_2_SCRATCH);
291 bios_3_scratch = RADEON_READ(RADEON_BIOS_3_SCRATCH);
294 bios_2_scratch &= ~ATOM_S3_LCD1_CRTC_ACTIVE;
295 bios_3_scratch |= (crtc_id << 17);
298 case DRM_MODE_DPMS_ON:
299 atombios_display_device_control(encoder, index, ATOM_ENABLE);
300 bios_2_scratch &= ~ATOM_S2_LCD1_DPMS_STATE;
301 bios_3_scratch |= ATOM_S3_LCD1_ACTIVE;
303 case DRM_MODE_DPMS_STANDBY:
304 case DRM_MODE_DPMS_SUSPEND:
305 case DRM_MODE_DPMS_OFF:
306 atombios_display_device_control(encoder, index, ATOM_DISABLE);
307 bios_2_scratch |= ATOM_S2_LCD1_DPMS_STATE;
308 bios_3_scratch &= ~ATOM_S3_LCD1_ACTIVE;
312 if (dev_priv->chip_family >= CHIP_R600) {
313 RADEON_WRITE(R600_BIOS_2_SCRATCH, bios_2_scratch);
314 RADEON_WRITE(R600_BIOS_3_SCRATCH, bios_3_scratch);
316 RADEON_WRITE(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
317 RADEON_WRITE(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
321 static bool radeon_lvtma_mode_fixup(struct drm_encoder *encoder,
322 struct drm_display_mode *mode,
323 struct drm_display_mode *adjusted_mode)
325 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
327 radeon_encoder->flags &= ~RADEON_USE_RMX;
329 if (radeon_encoder->rmx_type != RMX_OFF)
330 radeon_rmx_mode_fixup(encoder, mode, adjusted_mode);
335 static void radeon_lvtma_prepare(struct drm_encoder *encoder)
337 radeon_atom_output_lock(encoder, true);
338 radeon_lvtma_dpms(encoder, DRM_MODE_DPMS_OFF);
341 static void radeon_lvtma_commit(struct drm_encoder *encoder)
343 radeon_lvtma_dpms(encoder, DRM_MODE_DPMS_ON);
344 radeon_atom_output_lock(encoder, false);
347 static const struct drm_encoder_helper_funcs radeon_atom_lvtma_helper_funcs = {
348 .dpms = radeon_lvtma_dpms,
349 .mode_fixup = radeon_lvtma_mode_fixup,
350 .prepare = radeon_lvtma_prepare,
351 .mode_set = radeon_lvtma_mode_set,
352 .commit = radeon_lvtma_commit,
355 void radeon_enc_destroy(struct drm_encoder *encoder)
357 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
358 drm_encoder_cleanup(encoder);
359 kfree(radeon_encoder);
362 static const struct drm_encoder_funcs radeon_atom_lvtma_enc_funcs = {
363 .destroy = radeon_enc_destroy,
366 struct drm_encoder *radeon_encoder_lvtma_add(struct drm_device *dev, int bios_index)
368 struct drm_radeon_private *dev_priv = dev->dev_private;
369 struct radeon_mode_info *mode_info = &dev_priv->mode_info;
370 struct radeon_encoder *radeon_encoder;
371 struct drm_encoder *encoder;
372 radeon_encoder = kzalloc(sizeof(struct radeon_encoder), GFP_KERNEL);
373 if (!radeon_encoder) {
377 encoder = &radeon_encoder->base;
379 /* Set LVTMA to only use crtc 0 */
380 encoder->possible_crtcs = 0x1;
381 encoder->possible_clones = 0;
382 drm_encoder_init(dev, encoder, &radeon_atom_lvtma_enc_funcs,
383 DRM_MODE_ENCODER_LVDS);
385 drm_encoder_helper_add(encoder, &radeon_atom_lvtma_helper_funcs);
386 radeon_encoder->atom_device = mode_info->bios_connector[bios_index].devices;
388 /* TODO get the LVDS info from the BIOS for panel size etc. */
389 /* get the lvds info from the bios */
390 radeon_atombios_get_lvds_info(radeon_encoder);
392 /* LVDS gets default RMX full scaling */
393 radeon_encoder->rmx_type = RMX_FULL;
398 static void radeon_atom_dac_dpms(struct drm_encoder *encoder, int mode)
400 struct drm_device *dev = encoder->dev;
401 struct drm_radeon_private *dev_priv = dev->dev_private;
402 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
403 struct radeon_crtc *radeon_crtc;
406 uint32_t bios_2_scratch, bios_3_scratch;
410 radeon_crtc = to_radeon_crtc(encoder->crtc);
411 crtc_id = radeon_crtc->crtc_id;
414 atom_type = atom_dac_find_atom_type(radeon_encoder, NULL);
418 if (dev_priv->chip_family >= CHIP_R600) {
419 bios_2_scratch = RADEON_READ(R600_BIOS_2_SCRATCH);
420 bios_3_scratch = RADEON_READ(R600_BIOS_3_SCRATCH);
422 bios_2_scratch = RADEON_READ(RADEON_BIOS_2_SCRATCH);
423 bios_3_scratch = RADEON_READ(RADEON_BIOS_3_SCRATCH);
427 case ATOM_DEVICE_CRT1_INDEX:
428 index = GetIndexIntoMasterTable(COMMAND, DAC1OutputControl);
429 bios_2_scratch &= ~ATOM_S3_CRT1_CRTC_ACTIVE;
430 bios_3_scratch |= (crtc_id << 16);
432 case DRM_MODE_DPMS_ON:
433 bios_2_scratch &= ~ATOM_S2_CRT1_DPMS_STATE;
434 bios_3_scratch |= ATOM_S3_CRT1_ACTIVE;
436 case DRM_MODE_DPMS_STANDBY:
437 case DRM_MODE_DPMS_SUSPEND:
438 case DRM_MODE_DPMS_OFF:
439 bios_2_scratch |= ATOM_S2_CRT1_DPMS_STATE;
440 bios_3_scratch &= ~ATOM_S3_CRT1_ACTIVE;
444 case ATOM_DEVICE_CRT2_INDEX:
445 index = GetIndexIntoMasterTable(COMMAND, DAC2OutputControl);
446 bios_2_scratch &= ~ATOM_S3_CRT2_CRTC_ACTIVE;
447 bios_3_scratch |= (crtc_id << 20);
449 case DRM_MODE_DPMS_ON:
450 bios_2_scratch &= ~ATOM_S2_CRT2_DPMS_STATE;
451 bios_3_scratch |= ATOM_S3_CRT2_ACTIVE;
453 case DRM_MODE_DPMS_STANDBY:
454 case DRM_MODE_DPMS_SUSPEND:
455 case DRM_MODE_DPMS_OFF:
456 bios_2_scratch |= ATOM_S2_CRT2_DPMS_STATE;
457 bios_3_scratch &= ~ATOM_S3_CRT2_ACTIVE;
461 case ATOM_DEVICE_TV1_INDEX:
462 index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl);
463 bios_3_scratch &= ~ATOM_S3_TV1_CRTC_ACTIVE;
464 bios_3_scratch |= (crtc_id << 18);
466 case DRM_MODE_DPMS_ON:
467 bios_2_scratch &= ~ATOM_S2_TV1_DPMS_STATE;
468 bios_3_scratch |= ATOM_S3_TV1_ACTIVE;
470 case DRM_MODE_DPMS_STANDBY:
471 case DRM_MODE_DPMS_SUSPEND:
472 case DRM_MODE_DPMS_OFF:
473 bios_2_scratch |= ATOM_S2_TV1_DPMS_STATE;
474 bios_3_scratch &= ~ATOM_S3_TV1_ACTIVE;
478 case ATOM_DEVICE_CV_INDEX:
479 index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl);
480 bios_2_scratch &= ~ATOM_S3_CV_CRTC_ACTIVE;
481 bios_3_scratch |= (crtc_id << 24);
483 case DRM_MODE_DPMS_ON:
484 bios_2_scratch &= ~ATOM_S2_CV_DPMS_STATE;
485 bios_3_scratch |= ATOM_S3_CV_ACTIVE;
487 case DRM_MODE_DPMS_STANDBY:
488 case DRM_MODE_DPMS_SUSPEND:
489 case DRM_MODE_DPMS_OFF:
490 bios_2_scratch |= ATOM_S2_CV_DPMS_STATE;
491 bios_3_scratch &= ~ATOM_S3_CV_ACTIVE;
500 case DRM_MODE_DPMS_ON:
501 atombios_display_device_control(encoder, index, ATOM_ENABLE);
503 case DRM_MODE_DPMS_STANDBY:
504 case DRM_MODE_DPMS_SUSPEND:
505 case DRM_MODE_DPMS_OFF:
506 atombios_display_device_control(encoder, index, ATOM_DISABLE);
510 if (dev_priv->chip_family >= CHIP_R600) {
511 RADEON_WRITE(R600_BIOS_2_SCRATCH, bios_2_scratch);
512 RADEON_WRITE(R600_BIOS_3_SCRATCH, bios_3_scratch);
514 RADEON_WRITE(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
515 RADEON_WRITE(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
519 static bool radeon_atom_dac_mode_fixup(struct drm_encoder *encoder,
520 struct drm_display_mode *mode,
521 struct drm_display_mode *adjusted_mode)
526 static void radeon_atom_dac_prepare(struct drm_encoder *encoder)
528 radeon_atom_output_lock(encoder, true);
529 radeon_atom_dac_dpms(encoder, DRM_MODE_DPMS_OFF);
532 static void radeon_atom_dac_commit(struct drm_encoder *encoder)
534 radeon_atom_dac_dpms(encoder, DRM_MODE_DPMS_ON);
535 radeon_atom_output_lock(encoder, false);
538 static int atombios_dac_setup(struct drm_encoder *encoder,
539 struct drm_display_mode *mode,
542 struct drm_device *dev = encoder->dev;
543 struct drm_radeon_private *dev_priv = dev->dev_private;
544 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
545 DAC_ENCODER_CONTROL_PS_ALLOCATION args;
546 int id = (radeon_encoder->type.dac == DAC_TVDAC);
549 memset(&args, 0, sizeof(args));
551 index = GetIndexIntoMasterTable(COMMAND, DAC1EncoderControl);
553 index = GetIndexIntoMasterTable(COMMAND, DAC2EncoderControl);
556 args.usPixelClock = cpu_to_le16(mode->clock / 10);
557 if ((atom_type == ATOM_DEVICE_CRT1_INDEX) ||
558 (atom_type == ATOM_DEVICE_CRT2_INDEX))
559 args.ucDacStandard = id ? ATOM_DAC2_PS2 : ATOM_DAC1_PS2;
560 else if (atom_type == ATOM_DEVICE_CV_INDEX)
561 args.ucDacStandard = id ? ATOM_DAC2_CV : ATOM_DAC1_CV;
562 else if (atom_type == ATOM_DEVICE_TV1_INDEX)
563 args.ucDacStandard = id ? ATOM_DAC2_NTSC : ATOM_DAC1_NTSC;
565 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
570 static int atombios_tv1_setup(struct drm_encoder *encoder,
571 struct drm_display_mode *mode,
574 struct drm_device *dev = encoder->dev;
575 struct drm_radeon_private *dev_priv = dev->dev_private;
576 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
577 TV_ENCODER_CONTROL_PS_ALLOCATION args;
578 int index = GetIndexIntoMasterTable(COMMAND, TVEncoderControl);
580 memset(&args, 0, sizeof(args));
581 args.sTVEncoder.ucAction = 1;
582 if (atom_type == ATOM_DEVICE_CV_INDEX)
583 args.sTVEncoder.ucTvStandard = ATOM_TV_CV;
586 args.sTVEncoder.ucTvStandard = ATOM_TV_NTSC;
589 args.sTVEncoder.usPixelClock = cpu_to_le16(mode->clock / 10);
591 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
595 static void radeon_atom_dac_mode_set(struct drm_encoder *encoder,
596 struct drm_display_mode *mode,
597 struct drm_display_mode *adjusted_mode)
599 struct drm_device *dev = encoder->dev;
600 struct drm_radeon_private *dev_priv = dev->dev_private;
601 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
604 atom_type = atom_dac_find_atom_type(radeon_encoder, NULL);
608 atombios_scaler_setup(encoder, mode);
609 atombios_set_crtc_source(encoder, atom_type);
611 atombios_dac_setup(encoder, adjusted_mode, atom_type);
612 if ((atom_type == ATOM_DEVICE_TV1_INDEX) ||
613 (atom_type == ATOM_DEVICE_CV_INDEX))
614 atombios_tv1_setup(encoder, adjusted_mode, atom_type);
618 static bool atom_dac_load_detect(struct drm_encoder *encoder, int atom_devices)
620 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
621 struct drm_device *dev = encoder->dev;
622 struct drm_radeon_private *dev_priv = dev->dev_private;
623 DAC_LOAD_DETECTION_PS_ALLOCATION args;
624 int index = GetIndexIntoMasterTable(COMMAND, DAC_LoadDetection);
626 memset(&args, 0, sizeof(args));
627 args.sDacload.ucMisc = 0;
628 args.sDacload.ucDacType = (radeon_encoder->type.dac == DAC_PRIMARY) ? ATOM_DAC_A : ATOM_DAC_B;
630 if (atom_devices & ATOM_DEVICE_CRT1_SUPPORT)
631 args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CRT1_SUPPORT);
632 else if (atom_devices & ATOM_DEVICE_CRT2_SUPPORT)
633 args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CRT2_SUPPORT);
634 else if (atom_devices & ATOM_DEVICE_CV_SUPPORT) {
635 args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CV_SUPPORT);
636 if (radeon_is_dce3(dev_priv))
637 args.sDacload.ucMisc = 1;
638 } else if (atom_devices & ATOM_DEVICE_TV1_SUPPORT) {
639 args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_TV1_SUPPORT);
640 if (radeon_is_dce3(dev_priv))
641 args.sDacload.ucMisc = 1;
645 DRM_DEBUG("writing %x %x\n", args.sDacload.usDeviceID, args.sDacload.ucDacType);
646 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
650 static enum drm_connector_status radeon_atom_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector)
652 struct drm_device *dev = encoder->dev;
653 struct drm_radeon_private *dev_priv = dev->dev_private;
654 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
656 uint32_t bios_0_scratch;
658 atom_type = atom_dac_find_atom_type(radeon_encoder, connector);
659 if (atom_type == -1) {
660 DRM_DEBUG("exit after find \n");
661 return connector_status_unknown;
664 if(!atom_dac_load_detect(encoder, (1 << atom_type))) {
665 DRM_DEBUG("detect returned false \n");
666 return connector_status_unknown;
670 if (dev_priv->chip_family >= CHIP_R600)
671 bios_0_scratch = RADEON_READ(R600_BIOS_0_SCRATCH);
673 bios_0_scratch = RADEON_READ(RADEON_BIOS_0_SCRATCH);
675 DRM_DEBUG("Bios 0 scratch %x\n", bios_0_scratch);
676 if (radeon_encoder->atom_device & ATOM_DEVICE_CRT1_SUPPORT) {
677 if (bios_0_scratch & ATOM_S0_CRT1_MASK)
678 return connector_status_connected;
679 } else if (radeon_encoder->atom_device & ATOM_DEVICE_CRT2_SUPPORT) {
680 if (bios_0_scratch & ATOM_S0_CRT2_MASK)
681 return connector_status_connected;
682 } else if (radeon_encoder->atom_device & ATOM_DEVICE_CV_SUPPORT) {
683 if (bios_0_scratch & (ATOM_S0_CV_MASK|ATOM_S0_CV_MASK_A))
684 return connector_status_connected;
685 } else if (radeon_encoder->atom_device & ATOM_DEVICE_TV1_SUPPORT) {
686 if (bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A))
687 return connector_status_connected; // CTV
688 else if (bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A))
689 return connector_status_connected; // STV
691 return connector_status_disconnected;
694 static const struct drm_encoder_helper_funcs radeon_atom_dac_helper_funcs = {
695 .dpms = radeon_atom_dac_dpms,
696 .mode_fixup = radeon_atom_dac_mode_fixup,
697 .prepare = radeon_atom_dac_prepare,
698 .mode_set = radeon_atom_dac_mode_set,
699 .commit = radeon_atom_dac_commit,
700 .detect = radeon_atom_dac_detect,
703 static const struct drm_encoder_funcs radeon_atom_dac_enc_funcs = {
704 . destroy = radeon_enc_destroy,
708 static void atombios_tmds1_setup(struct drm_encoder *encoder,
709 struct drm_display_mode *mode)
711 struct drm_device *dev = encoder->dev;
712 struct drm_radeon_private *dev_priv = dev->dev_private;
713 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
714 TMDS1_ENCODER_CONTROL_PS_ALLOCATION args;
715 int index = GetIndexIntoMasterTable(COMMAND, TMDS1EncoderControl);
717 memset(&args, 0, sizeof(args));
719 if (mode->clock > 165000)
724 args.usPixelClock = cpu_to_le16(mode->clock / 10);
726 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
729 static void atombios_tmds2_setup(struct drm_encoder *encoder,
730 struct drm_display_mode *mode)
732 struct drm_device *dev = encoder->dev;
733 struct drm_radeon_private *dev_priv = dev->dev_private;
734 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
735 TMDS2_ENCODER_CONTROL_PS_ALLOCATION args;
736 int index = GetIndexIntoMasterTable(COMMAND, TMDS2EncoderControl);
738 memset(&args, 0, sizeof(args));
740 if (mode->clock > 165000)
745 args.usPixelClock = cpu_to_le16(mode->clock / 10);
747 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
751 static void atombios_ext_tmds_setup(struct drm_encoder *encoder,
752 struct drm_display_mode *mode)
754 struct drm_device *dev = encoder->dev;
755 struct drm_radeon_private *dev_priv = dev->dev_private;
756 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
757 ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION args;
758 int index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl);
760 memset(&args, 0, sizeof(args));
761 args.sXTmdsEncoder.ucEnable = 1;
763 if (mode->clock > 165000)
764 args.sXTmdsEncoder.ucMisc = 1;
766 args.sXTmdsEncoder.ucMisc = 0;
769 // args.usPixelClock = cpu_to_le16(mode->clock / 10);
771 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
774 static void atombios_dig1_setup(struct drm_encoder *encoder,
775 struct drm_display_mode *mode)
777 struct drm_device *dev = encoder->dev;
778 struct drm_radeon_private *dev_priv = dev->dev_private;
779 DIG_ENCODER_CONTROL_PS_ALLOCATION args;
780 int index = GetIndexIntoMasterTable(COMMAND, DIG1EncoderControl);
783 args.usPixelClock = mode->clock / 10;
784 args.ucConfig = ATOM_ENCODER_CONFIG_TRANSMITTER1;
786 // TODO coherent mode
787 // if (encoder->coherent_mode)
788 // args.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT;
790 if (mode->clock > 165000) {
791 args.ucConfig |= ATOM_ENCODER_CONFIG_LINKA_B;
794 args.ucConfig |= ATOM_ENCODER_CONFIG_LINKA;
799 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
802 static void atombios_ddia_setup(struct drm_encoder *encoder,
803 struct drm_display_mode *mode)
805 struct drm_device *dev = encoder->dev;
806 struct drm_radeon_private *dev_priv = dev->dev_private;
807 DVO_ENCODER_CONTROL_PS_ALLOCATION args;
808 int index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl);
810 args.sDVOEncoder.ucAction = ATOM_ENABLE;
811 args.sDVOEncoder.usPixelClock = mode->clock / 10;
813 if (mode->clock > 165000)
814 args.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute = PANEL_ENCODER_MISC_DUAL;
816 args.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute = 0;
818 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
821 struct drm_encoder *radeon_encoder_atom_dac_add(struct drm_device *dev, int bios_index, int dac_type, int with_tv)
823 struct drm_radeon_private *dev_priv = dev->dev_private;
824 struct radeon_mode_info *mode_info = &dev_priv->mode_info;
825 struct radeon_encoder *radeon_encoder = NULL;
826 struct drm_encoder *encoder;
827 int type = with_tv ? DRM_MODE_ENCODER_TVDAC : DRM_MODE_ENCODER_DAC;
829 int digital_enc_mask = ~(ATOM_DEVICE_DFP1_SUPPORT | ATOM_DEVICE_DFP2_SUPPORT | ATOM_DEVICE_DFP3_SUPPORT |
830 ATOM_DEVICE_LCD1_SUPPORT);
831 /* we may already have added this encoder */
832 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
833 if (encoder->encoder_type != DRM_MODE_ENCODER_DAC ||
834 encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
837 radeon_encoder = to_radeon_encoder(encoder);
838 if (radeon_encoder->type.dac == dac_type) {
845 /* upgrade to a TV controlling DAC */
846 if (type == DRM_MODE_ENCODER_TVDAC)
847 encoder->encoder_type = type;
848 radeon_encoder->atom_device |= mode_info->bios_connector[bios_index].devices;
849 radeon_encoder->atom_device &= digital_enc_mask;
853 radeon_encoder = kzalloc(sizeof(struct radeon_encoder), GFP_KERNEL);
854 if (!radeon_encoder) {
858 encoder = &radeon_encoder->base;
860 encoder->possible_crtcs = 0x3;
861 encoder->possible_clones = 0;
862 drm_encoder_init(dev, encoder, &radeon_atom_dac_enc_funcs,
865 drm_encoder_helper_add(encoder, &radeon_atom_dac_helper_funcs);
866 radeon_encoder->type.dac = dac_type;
867 radeon_encoder->atom_device = mode_info->bios_connector[bios_index].devices;
869 /* mask off any digital encoders */
870 radeon_encoder->atom_device &= digital_enc_mask;
874 static void radeon_atom_tmds_dpms(struct drm_encoder *encoder, int mode)
876 struct drm_device *dev = encoder->dev;
877 struct drm_radeon_private *dev_priv = dev->dev_private;
878 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
879 struct radeon_crtc *radeon_crtc = NULL;
883 uint32_t bios_2_scratch, bios_3_scratch;
886 radeon_crtc = to_radeon_crtc(encoder->crtc);
887 crtc_id = radeon_crtc->crtc_id;
888 } else if (mode == DRM_MODE_DPMS_ON)
891 if (radeon_encoder->atom_device & ATOM_DEVICE_DFP1_SUPPORT)
892 atom_type = ATOM_DEVICE_DFP1_INDEX;
893 if (radeon_encoder->atom_device & ATOM_DEVICE_DFP2_SUPPORT)
894 atom_type = ATOM_DEVICE_DFP2_INDEX;
895 if (radeon_encoder->atom_device & ATOM_DEVICE_DFP3_SUPPORT)
896 atom_type = ATOM_DEVICE_DFP3_INDEX;
901 if (dev_priv->chip_family >= CHIP_R600) {
902 bios_2_scratch = RADEON_READ(R600_BIOS_2_SCRATCH);
903 bios_3_scratch = RADEON_READ(R600_BIOS_3_SCRATCH);
905 bios_2_scratch = RADEON_READ(RADEON_BIOS_2_SCRATCH);
906 bios_3_scratch = RADEON_READ(RADEON_BIOS_3_SCRATCH);
910 case ATOM_DEVICE_DFP1_INDEX:
911 index = GetIndexIntoMasterTable(COMMAND, TMDSAOutputControl);
912 bios_2_scratch &= ~ATOM_S3_DFP1_CRTC_ACTIVE;
913 bios_3_scratch |= (crtc_id << 19);
915 case DRM_MODE_DPMS_ON:
916 bios_2_scratch &= ~ATOM_S2_DFP1_DPMS_STATE;
917 bios_3_scratch |= ATOM_S3_DFP1_ACTIVE;
919 case DRM_MODE_DPMS_STANDBY:
920 case DRM_MODE_DPMS_SUSPEND:
921 case DRM_MODE_DPMS_OFF:
922 bios_2_scratch |= ATOM_S2_DFP1_DPMS_STATE;
923 bios_3_scratch &= ~ATOM_S3_DFP1_ACTIVE;
927 case ATOM_DEVICE_DFP2_INDEX:
928 index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl);
929 bios_2_scratch &= ~ATOM_S3_DFP2_CRTC_ACTIVE;
930 bios_3_scratch |= (crtc_id << 23);
932 case DRM_MODE_DPMS_ON:
933 bios_2_scratch &= ~ATOM_S2_DFP2_DPMS_STATE;
934 bios_3_scratch |= ATOM_S3_DFP2_ACTIVE;
936 case DRM_MODE_DPMS_STANDBY:
937 case DRM_MODE_DPMS_SUSPEND:
938 case DRM_MODE_DPMS_OFF:
939 bios_2_scratch |= ATOM_S2_DFP2_DPMS_STATE;
940 bios_3_scratch &= ~ATOM_S3_DFP2_ACTIVE;
944 case ATOM_DEVICE_DFP3_INDEX:
945 index = GetIndexIntoMasterTable(COMMAND, LVTMAOutputControl);
946 bios_2_scratch &= ~ATOM_S3_DFP3_CRTC_ACTIVE;
947 bios_3_scratch |= (crtc_id << 25);
949 case DRM_MODE_DPMS_ON:
950 bios_2_scratch &= ~ATOM_S2_DFP3_DPMS_STATE;
951 bios_3_scratch |= ATOM_S3_DFP3_ACTIVE;
953 case DRM_MODE_DPMS_STANDBY:
954 case DRM_MODE_DPMS_SUSPEND:
955 case DRM_MODE_DPMS_OFF:
956 bios_2_scratch |= ATOM_S2_DFP3_DPMS_STATE;
957 bios_3_scratch &= ~ATOM_S3_DFP3_ACTIVE;
967 case DRM_MODE_DPMS_ON:
968 atombios_display_device_control(encoder, index, ATOM_ENABLE);
970 case DRM_MODE_DPMS_STANDBY:
971 case DRM_MODE_DPMS_SUSPEND:
972 case DRM_MODE_DPMS_OFF:
973 atombios_display_device_control(encoder, index, ATOM_DISABLE);
977 if (dev_priv->chip_family >= CHIP_R600) {
978 RADEON_WRITE(R600_BIOS_2_SCRATCH, bios_2_scratch);
979 RADEON_WRITE(R600_BIOS_3_SCRATCH, bios_3_scratch);
981 RADEON_WRITE(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
982 RADEON_WRITE(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
986 static bool radeon_atom_tmds_mode_fixup(struct drm_encoder *encoder,
987 struct drm_display_mode *mode,
988 struct drm_display_mode *adjusted_mode)
993 static void radeon_atom_tmds_mode_set(struct drm_encoder *encoder,
994 struct drm_display_mode *mode,
995 struct drm_display_mode *adjusted_mode)
997 struct drm_device *dev = encoder->dev;
998 struct drm_radeon_private *dev_priv = dev->dev_private;
999 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1002 if (radeon_encoder->atom_device & ATOM_DEVICE_DFP1_SUPPORT)
1003 atom_type = ATOM_DEVICE_DFP1_INDEX;
1004 if (radeon_encoder->atom_device & ATOM_DEVICE_DFP2_SUPPORT)
1005 atom_type = ATOM_DEVICE_DFP2_INDEX;
1006 if (radeon_encoder->atom_device & ATOM_DEVICE_DFP3_SUPPORT)
1007 atom_type = ATOM_DEVICE_DFP3_INDEX;
1009 atombios_scaler_setup(encoder, mode);
1010 atombios_set_crtc_source(encoder, atom_type);
1012 if (atom_type == ATOM_DEVICE_DFP1_INDEX)
1013 atombios_tmds1_setup(encoder, adjusted_mode);
1014 if (atom_type == ATOM_DEVICE_DFP2_INDEX) {
1015 if ((dev_priv->chip_family == CHIP_RS600) ||
1016 (dev_priv->chip_family == CHIP_RS690) ||
1017 (dev_priv->chip_family == CHIP_RS740))
1018 atombios_ddia_setup(encoder, adjusted_mode);
1020 atombios_ext_tmds_setup(encoder, adjusted_mode);
1022 if (atom_type == ATOM_DEVICE_DFP3_INDEX)
1023 atombios_tmds2_setup(encoder, adjusted_mode);
1024 radeon_dfp_disable_dither(encoder, atom_type);
1029 static void radeon_atom_tmds_prepare(struct drm_encoder *encoder)
1031 radeon_atom_output_lock(encoder, true);
1032 radeon_atom_tmds_dpms(encoder, DRM_MODE_DPMS_OFF);
1035 static void radeon_atom_tmds_commit(struct drm_encoder *encoder)
1037 radeon_atom_tmds_dpms(encoder, DRM_MODE_DPMS_ON);
1038 radeon_atom_output_lock(encoder, false);
1041 static const struct drm_encoder_helper_funcs radeon_atom_tmds_helper_funcs = {
1042 .dpms = radeon_atom_tmds_dpms,
1043 .mode_fixup = radeon_atom_tmds_mode_fixup,
1044 .prepare = radeon_atom_tmds_prepare,
1045 .mode_set = radeon_atom_tmds_mode_set,
1046 .commit = radeon_atom_tmds_commit,
1047 /* no detect for TMDS */
1050 static const struct drm_encoder_funcs radeon_atom_tmds_enc_funcs = {
1051 . destroy = radeon_enc_destroy,
1054 struct drm_encoder *radeon_encoder_atom_tmds_add(struct drm_device *dev, int bios_index, int tmds_type)
1056 struct drm_radeon_private *dev_priv = dev->dev_private;
1057 struct radeon_mode_info *mode_info = &dev_priv->mode_info;
1058 struct radeon_encoder *radeon_encoder = NULL;
1059 struct drm_encoder *encoder;
1060 int analog_enc_mask = ~(ATOM_DEVICE_CRT1_SUPPORT | ATOM_DEVICE_CRT2_SUPPORT);
1062 radeon_encoder = kzalloc(sizeof(struct radeon_encoder), GFP_KERNEL);
1063 if (!radeon_encoder) {
1067 encoder = &radeon_encoder->base;
1069 encoder->possible_crtcs = 0x3;
1070 encoder->possible_clones = 0;
1071 drm_encoder_init(dev, encoder, &radeon_atom_tmds_enc_funcs,
1072 DRM_MODE_ENCODER_TMDS);
1074 drm_encoder_helper_add(encoder, &radeon_atom_tmds_helper_funcs);
1076 radeon_encoder->atom_device = mode_info->bios_connector[bios_index].devices;
1078 /* mask off any analog encoders */
1079 radeon_encoder->atom_device &= analog_enc_mask;