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 = to_radeon_crtc(encoder->crtc);
277 int index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl);
278 uint32_t bios_2_scratch, bios_3_scratch;
280 if (dev_priv->chip_family >= CHIP_R600) {
281 bios_2_scratch = RADEON_READ(R600_BIOS_2_SCRATCH);
282 bios_3_scratch = RADEON_READ(R600_BIOS_3_SCRATCH);
284 bios_2_scratch = RADEON_READ(RADEON_BIOS_2_SCRATCH);
285 bios_3_scratch = RADEON_READ(RADEON_BIOS_3_SCRATCH);
288 bios_2_scratch &= ~ATOM_S3_LCD1_CRTC_ACTIVE;
289 bios_3_scratch |= (radeon_crtc->crtc_id << 17);
292 case DRM_MODE_DPMS_ON:
293 atombios_display_device_control(encoder, index, ATOM_ENABLE);
294 bios_2_scratch &= ~ATOM_S2_LCD1_DPMS_STATE;
295 bios_3_scratch |= ATOM_S3_LCD1_ACTIVE;
297 case DRM_MODE_DPMS_STANDBY:
298 case DRM_MODE_DPMS_SUSPEND:
299 case DRM_MODE_DPMS_OFF:
300 atombios_display_device_control(encoder, index, ATOM_DISABLE);
301 bios_2_scratch |= ATOM_S2_LCD1_DPMS_STATE;
302 bios_3_scratch &= ~ATOM_S3_LCD1_ACTIVE;
306 if (dev_priv->chip_family >= CHIP_R600) {
307 RADEON_WRITE(R600_BIOS_2_SCRATCH, bios_2_scratch);
308 RADEON_WRITE(R600_BIOS_3_SCRATCH, bios_3_scratch);
310 RADEON_WRITE(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
311 RADEON_WRITE(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
315 static bool radeon_lvtma_mode_fixup(struct drm_encoder *encoder,
316 struct drm_display_mode *mode,
317 struct drm_display_mode *adjusted_mode)
319 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
321 radeon_encoder->flags &= ~RADEON_USE_RMX;
323 if (radeon_encoder->rmx_type != RMX_OFF)
324 radeon_rmx_mode_fixup(encoder, mode, adjusted_mode);
329 static void radeon_lvtma_prepare(struct drm_encoder *encoder)
331 radeon_atom_output_lock(encoder, true);
332 radeon_lvtma_dpms(encoder, DRM_MODE_DPMS_OFF);
335 static void radeon_lvtma_commit(struct drm_encoder *encoder)
337 radeon_lvtma_dpms(encoder, DRM_MODE_DPMS_ON);
338 radeon_atom_output_lock(encoder, false);
341 static const struct drm_encoder_helper_funcs radeon_atom_lvtma_helper_funcs = {
342 .dpms = radeon_lvtma_dpms,
343 .mode_fixup = radeon_lvtma_mode_fixup,
344 .prepare = radeon_lvtma_prepare,
345 .mode_set = radeon_lvtma_mode_set,
346 .commit = radeon_lvtma_commit,
349 void radeon_enc_destroy(struct drm_encoder *encoder)
351 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
352 drm_encoder_cleanup(encoder);
353 kfree(radeon_encoder);
356 static const struct drm_encoder_funcs radeon_atom_lvtma_enc_funcs = {
357 .destroy = radeon_enc_destroy,
360 struct drm_encoder *radeon_encoder_lvtma_add(struct drm_device *dev, int bios_index)
362 struct drm_radeon_private *dev_priv = dev->dev_private;
363 struct radeon_mode_info *mode_info = &dev_priv->mode_info;
364 struct radeon_encoder *radeon_encoder;
365 struct drm_encoder *encoder;
366 radeon_encoder = kzalloc(sizeof(struct radeon_encoder), GFP_KERNEL);
367 if (!radeon_encoder) {
371 encoder = &radeon_encoder->base;
373 encoder->possible_crtcs = 0x3;
374 encoder->possible_clones = 0;
375 drm_encoder_init(dev, encoder, &radeon_atom_lvtma_enc_funcs,
376 DRM_MODE_ENCODER_LVDS);
378 drm_encoder_helper_add(encoder, &radeon_atom_lvtma_helper_funcs);
379 radeon_encoder->atom_device = mode_info->bios_connector[bios_index].devices;
381 /* TODO get the LVDS info from the BIOS for panel size etc. */
382 /* get the lvds info from the bios */
383 radeon_get_lvds_info(radeon_encoder);
385 /* LVDS gets default RMX full scaling */
386 radeon_encoder->rmx_type = RMX_FULL;
391 static void radeon_atom_dac_dpms(struct drm_encoder *encoder, int mode)
393 struct drm_device *dev = encoder->dev;
394 struct drm_radeon_private *dev_priv = dev->dev_private;
395 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
396 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
399 uint32_t bios_2_scratch, bios_3_scratch;
401 atom_type = atom_dac_find_atom_type(radeon_encoder, NULL);
405 if (dev_priv->chip_family >= CHIP_R600) {
406 bios_2_scratch = RADEON_READ(R600_BIOS_2_SCRATCH);
407 bios_3_scratch = RADEON_READ(R600_BIOS_3_SCRATCH);
409 bios_2_scratch = RADEON_READ(RADEON_BIOS_2_SCRATCH);
410 bios_3_scratch = RADEON_READ(RADEON_BIOS_3_SCRATCH);
414 case ATOM_DEVICE_CRT1_INDEX:
415 index = GetIndexIntoMasterTable(COMMAND, DAC1OutputControl);
416 bios_2_scratch &= ~ATOM_S3_CRT1_CRTC_ACTIVE;
417 bios_3_scratch |= (radeon_crtc->crtc_id << 16);
419 case DRM_MODE_DPMS_ON:
420 bios_2_scratch &= ~ATOM_S2_CRT1_DPMS_STATE;
421 bios_3_scratch |= ATOM_S3_CRT1_ACTIVE;
423 case DRM_MODE_DPMS_STANDBY:
424 case DRM_MODE_DPMS_SUSPEND:
425 case DRM_MODE_DPMS_OFF:
426 bios_2_scratch |= ATOM_S2_CRT1_DPMS_STATE;
427 bios_3_scratch &= ~ATOM_S3_CRT1_ACTIVE;
431 case ATOM_DEVICE_CRT2_INDEX:
432 index = GetIndexIntoMasterTable(COMMAND, DAC2OutputControl);
433 bios_2_scratch &= ~ATOM_S3_CRT2_CRTC_ACTIVE;
434 bios_3_scratch |= (radeon_crtc->crtc_id << 20);
436 case DRM_MODE_DPMS_ON:
437 bios_2_scratch &= ~ATOM_S2_CRT2_DPMS_STATE;
438 bios_3_scratch |= ATOM_S3_CRT2_ACTIVE;
440 case DRM_MODE_DPMS_STANDBY:
441 case DRM_MODE_DPMS_SUSPEND:
442 case DRM_MODE_DPMS_OFF:
443 bios_2_scratch |= ATOM_S2_CRT2_DPMS_STATE;
444 bios_3_scratch &= ~ATOM_S3_CRT2_ACTIVE;
448 case ATOM_DEVICE_TV1_INDEX:
449 index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl);
450 bios_3_scratch &= ~ATOM_S3_TV1_CRTC_ACTIVE;
451 bios_3_scratch |= (radeon_crtc->crtc_id << 18);
453 case DRM_MODE_DPMS_ON:
454 bios_2_scratch &= ~ATOM_S2_TV1_DPMS_STATE;
455 bios_3_scratch |= ATOM_S3_TV1_ACTIVE;
457 case DRM_MODE_DPMS_STANDBY:
458 case DRM_MODE_DPMS_SUSPEND:
459 case DRM_MODE_DPMS_OFF:
460 bios_2_scratch |= ATOM_S2_TV1_DPMS_STATE;
461 bios_3_scratch &= ~ATOM_S3_TV1_ACTIVE;
465 case ATOM_DEVICE_CV_INDEX:
466 index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl);
467 bios_2_scratch &= ~ATOM_S3_CV_CRTC_ACTIVE;
468 bios_3_scratch |= (radeon_crtc->crtc_id << 24);
470 case DRM_MODE_DPMS_ON:
471 bios_2_scratch &= ~ATOM_S2_CV_DPMS_STATE;
472 bios_3_scratch |= ATOM_S3_CV_ACTIVE;
474 case DRM_MODE_DPMS_STANDBY:
475 case DRM_MODE_DPMS_SUSPEND:
476 case DRM_MODE_DPMS_OFF:
477 bios_2_scratch |= ATOM_S2_CV_DPMS_STATE;
478 bios_3_scratch &= ~ATOM_S3_CV_ACTIVE;
487 case DRM_MODE_DPMS_ON:
488 atombios_display_device_control(encoder, index, ATOM_ENABLE);
490 case DRM_MODE_DPMS_STANDBY:
491 case DRM_MODE_DPMS_SUSPEND:
492 case DRM_MODE_DPMS_OFF:
493 atombios_display_device_control(encoder, index, ATOM_DISABLE);
497 if (dev_priv->chip_family >= CHIP_R600) {
498 RADEON_WRITE(R600_BIOS_2_SCRATCH, bios_2_scratch);
499 RADEON_WRITE(R600_BIOS_3_SCRATCH, bios_3_scratch);
501 RADEON_WRITE(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
502 RADEON_WRITE(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
506 static bool radeon_atom_dac_mode_fixup(struct drm_encoder *encoder,
507 struct drm_display_mode *mode,
508 struct drm_display_mode *adjusted_mode)
513 static void radeon_atom_dac_prepare(struct drm_encoder *encoder)
515 radeon_atom_output_lock(encoder, true);
516 radeon_atom_dac_dpms(encoder, DRM_MODE_DPMS_OFF);
519 static void radeon_atom_dac_commit(struct drm_encoder *encoder)
521 radeon_atom_dac_dpms(encoder, DRM_MODE_DPMS_ON);
522 radeon_atom_output_lock(encoder, false);
525 static int atombios_dac_setup(struct drm_encoder *encoder,
526 struct drm_display_mode *mode,
529 struct drm_device *dev = encoder->dev;
530 struct drm_radeon_private *dev_priv = dev->dev_private;
531 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
532 DAC_ENCODER_CONTROL_PS_ALLOCATION args;
533 int id = (radeon_encoder->type.dac == DAC_TVDAC);
536 memset(&args, 0, sizeof(args));
538 index = GetIndexIntoMasterTable(COMMAND, DAC1EncoderControl);
540 index = GetIndexIntoMasterTable(COMMAND, DAC2EncoderControl);
543 args.usPixelClock = cpu_to_le16(mode->clock / 10);
544 if ((atom_type == ATOM_DEVICE_CRT1_INDEX) ||
545 (atom_type == ATOM_DEVICE_CRT2_INDEX))
546 args.ucDacStandard = id ? ATOM_DAC2_PS2 : ATOM_DAC1_PS2;
547 else if (atom_type == ATOM_DEVICE_CV_INDEX)
548 args.ucDacStandard = id ? ATOM_DAC2_CV : ATOM_DAC1_CV;
549 else if (atom_type == ATOM_DEVICE_TV1_INDEX)
550 args.ucDacStandard = id ? ATOM_DAC2_NTSC : ATOM_DAC1_NTSC;
552 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
557 static int atombios_tv1_setup(struct drm_encoder *encoder,
558 struct drm_display_mode *mode,
561 struct drm_device *dev = encoder->dev;
562 struct drm_radeon_private *dev_priv = dev->dev_private;
563 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
564 TV_ENCODER_CONTROL_PS_ALLOCATION args;
565 int index = GetIndexIntoMasterTable(COMMAND, TVEncoderControl);
567 memset(&args, 0, sizeof(args));
568 args.sTVEncoder.ucAction = 1;
569 if (atom_type == ATOM_DEVICE_CV_INDEX)
570 args.sTVEncoder.ucTvStandard = ATOM_TV_CV;
573 args.sTVEncoder.ucTvStandard = ATOM_TV_NTSC;
576 args.sTVEncoder.usPixelClock = cpu_to_le16(mode->clock / 10);
578 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
582 static void radeon_atom_dac_mode_set(struct drm_encoder *encoder,
583 struct drm_display_mode *mode,
584 struct drm_display_mode *adjusted_mode)
586 struct drm_device *dev = encoder->dev;
587 struct drm_radeon_private *dev_priv = dev->dev_private;
588 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
591 atom_type = atom_dac_find_atom_type(radeon_encoder, NULL);
595 atombios_scaler_setup(encoder, mode);
596 atombios_set_crtc_source(encoder, atom_type);
598 atombios_dac_setup(encoder, adjusted_mode, atom_type);
599 if ((atom_type == ATOM_DEVICE_TV1_INDEX) ||
600 (atom_type == ATOM_DEVICE_CV_INDEX))
601 atombios_tv1_setup(encoder, adjusted_mode, atom_type);
605 static bool atom_dac_load_detect(struct drm_encoder *encoder, int atom_devices)
607 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
608 struct drm_device *dev = encoder->dev;
609 struct drm_radeon_private *dev_priv = dev->dev_private;
610 DAC_LOAD_DETECTION_PS_ALLOCATION args;
611 int index = GetIndexIntoMasterTable(COMMAND, DAC_LoadDetection);
613 memset(&args, 0, sizeof(args));
614 args.sDacload.ucMisc = 0;
615 args.sDacload.ucDacType = (radeon_encoder->type.dac == DAC_PRIMARY) ? ATOM_DAC_A : ATOM_DAC_B;
617 if (atom_devices & ATOM_DEVICE_CRT1_SUPPORT)
618 args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CRT1_SUPPORT);
619 else if (atom_devices & ATOM_DEVICE_CRT2_SUPPORT)
620 args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CRT2_SUPPORT);
621 else if (atom_devices & ATOM_DEVICE_CV_SUPPORT) {
622 args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_CV_SUPPORT);
623 if (radeon_is_dce3(dev_priv))
624 args.sDacload.ucMisc = 1;
625 } else if (atom_devices & ATOM_DEVICE_TV1_SUPPORT) {
626 args.sDacload.usDeviceID = cpu_to_le16(ATOM_DEVICE_TV1_SUPPORT);
627 if (radeon_is_dce3(dev_priv))
628 args.sDacload.ucMisc = 1;
632 DRM_DEBUG("writing %x %x\n", args.sDacload.usDeviceID, args.sDacload.ucDacType);
633 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
637 static enum drm_connector_status radeon_atom_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector)
639 struct drm_device *dev = encoder->dev;
640 struct drm_radeon_private *dev_priv = dev->dev_private;
641 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
643 uint32_t bios_0_scratch;
645 atom_type = atom_dac_find_atom_type(radeon_encoder, connector);
646 if (atom_type == -1) {
647 DRM_DEBUG("exit after find \n");
648 return connector_status_unknown;
651 if(!atom_dac_load_detect(encoder, (1 << atom_type))) {
652 DRM_DEBUG("detect returned false \n");
653 return connector_status_unknown;
657 if (dev_priv->chip_family >= CHIP_R600)
658 bios_0_scratch = RADEON_READ(R600_BIOS_0_SCRATCH);
660 bios_0_scratch = RADEON_READ(RADEON_BIOS_0_SCRATCH);
662 DRM_DEBUG("Bios 0 scratch %x\n", bios_0_scratch);
663 if (radeon_encoder->atom_device & ATOM_DEVICE_CRT1_SUPPORT) {
664 if (bios_0_scratch & ATOM_S0_CRT1_MASK)
665 return connector_status_connected;
666 } else if (radeon_encoder->atom_device & ATOM_DEVICE_CRT2_SUPPORT) {
667 if (bios_0_scratch & ATOM_S0_CRT2_MASK)
668 return connector_status_connected;
669 } else if (radeon_encoder->atom_device & ATOM_DEVICE_CV_SUPPORT) {
670 if (bios_0_scratch & (ATOM_S0_CV_MASK|ATOM_S0_CV_MASK_A))
671 return connector_status_connected;
672 } else if (radeon_encoder->atom_device & ATOM_DEVICE_TV1_SUPPORT) {
673 if (bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A))
674 return connector_status_connected; // CTV
675 else if (bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A))
676 return connector_status_connected; // STV
678 return connector_status_disconnected;
681 static const struct drm_encoder_helper_funcs radeon_atom_dac_helper_funcs = {
682 .dpms = radeon_atom_dac_dpms,
683 .mode_fixup = radeon_atom_dac_mode_fixup,
684 .prepare = radeon_atom_dac_prepare,
685 .mode_set = radeon_atom_dac_mode_set,
686 .commit = radeon_atom_dac_commit,
687 .detect = radeon_atom_dac_detect,
690 static const struct drm_encoder_funcs radeon_atom_dac_enc_funcs = {
691 . destroy = radeon_enc_destroy,
695 static void atombios_tmds1_setup(struct drm_encoder *encoder,
696 struct drm_display_mode *mode)
698 struct drm_device *dev = encoder->dev;
699 struct drm_radeon_private *dev_priv = dev->dev_private;
700 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
701 TMDS1_ENCODER_CONTROL_PS_ALLOCATION args;
702 int index = GetIndexIntoMasterTable(COMMAND, TMDS1EncoderControl);
704 memset(&args, 0, sizeof(args));
706 if (mode->clock > 165000)
711 args.usPixelClock = cpu_to_le16(mode->clock / 10);
713 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
716 static void atombios_tmds2_setup(struct drm_encoder *encoder,
717 struct drm_display_mode *mode)
719 struct drm_device *dev = encoder->dev;
720 struct drm_radeon_private *dev_priv = dev->dev_private;
721 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
722 TMDS2_ENCODER_CONTROL_PS_ALLOCATION args;
723 int index = GetIndexIntoMasterTable(COMMAND, TMDS2EncoderControl);
725 memset(&args, 0, sizeof(args));
727 if (mode->clock > 165000)
732 args.usPixelClock = cpu_to_le16(mode->clock / 10);
734 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
738 static void atombios_ext_tmds_setup(struct drm_encoder *encoder,
739 struct drm_display_mode *mode)
741 struct drm_device *dev = encoder->dev;
742 struct drm_radeon_private *dev_priv = dev->dev_private;
743 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
744 ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION args;
745 int index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl);
747 memset(&args, 0, sizeof(args));
748 args.sXTmdsEncoder.ucEnable = 1;
750 if (mode->clock > 165000)
751 args.sXTmdsEncoder.ucMisc = 1;
753 args.sXTmdsEncoder.ucMisc = 0;
756 // args.usPixelClock = cpu_to_le16(mode->clock / 10);
758 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
761 static void atombios_dig1_setup(struct drm_encoder *encoder,
762 struct drm_display_mode *mode)
764 struct drm_device *dev = encoder->dev;
765 struct drm_radeon_private *dev_priv = dev->dev_private;
766 DIG_ENCODER_CONTROL_PS_ALLOCATION args;
767 int index = GetIndexIntoMasterTable(COMMAND, DIG1EncoderControl);
770 args.usPixelClock = mode->clock / 10;
771 args.ucConfig = ATOM_ENCODER_CONFIG_TRANSMITTER1;
773 // TODO coherent mode
774 // if (encoder->coherent_mode)
775 // args.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT;
777 if (mode->clock > 165000) {
778 args.ucConfig |= ATOM_ENCODER_CONFIG_LINKA_B;
781 args.ucConfig |= ATOM_ENCODER_CONFIG_LINKA;
786 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
789 static void atombios_ddia_setup(struct drm_encoder *encoder,
790 struct drm_display_mode *mode)
792 struct drm_device *dev = encoder->dev;
793 struct drm_radeon_private *dev_priv = dev->dev_private;
794 DVO_ENCODER_CONTROL_PS_ALLOCATION args;
795 int index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl);
797 args.sDVOEncoder.ucAction = ATOM_ENABLE;
798 args.sDVOEncoder.usPixelClock = mode->clock / 10;
800 if (mode->clock > 165000)
801 args.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute = PANEL_ENCODER_MISC_DUAL;
803 args.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute = 0;
805 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
808 struct drm_encoder *radeon_encoder_atom_dac_add(struct drm_device *dev, int bios_index, int dac_type, int with_tv)
810 struct drm_radeon_private *dev_priv = dev->dev_private;
811 struct radeon_mode_info *mode_info = &dev_priv->mode_info;
812 struct radeon_encoder *radeon_encoder = NULL;
813 struct drm_encoder *encoder;
814 int type = with_tv ? DRM_MODE_ENCODER_TVDAC : DRM_MODE_ENCODER_DAC;
816 int digital_enc_mask = ~(ATOM_DEVICE_DFP1_SUPPORT | ATOM_DEVICE_DFP2_SUPPORT | ATOM_DEVICE_DFP3_SUPPORT |
817 ATOM_DEVICE_LCD1_SUPPORT);
818 /* we may already have added this encoder */
819 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
820 if (encoder->encoder_type != DRM_MODE_ENCODER_DAC ||
821 encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
824 radeon_encoder = to_radeon_encoder(encoder);
825 if (radeon_encoder->type.dac == dac_type) {
832 /* upgrade to a TV controlling DAC */
833 if (type == DRM_MODE_ENCODER_TVDAC)
834 encoder->encoder_type = type;
835 radeon_encoder->atom_device |= mode_info->bios_connector[bios_index].devices;
836 radeon_encoder->atom_device &= digital_enc_mask;
840 radeon_encoder = kzalloc(sizeof(struct radeon_encoder), GFP_KERNEL);
841 if (!radeon_encoder) {
845 encoder = &radeon_encoder->base;
847 encoder->possible_crtcs = 0x3;
848 encoder->possible_clones = 0;
849 drm_encoder_init(dev, encoder, &radeon_atom_dac_enc_funcs,
852 drm_encoder_helper_add(encoder, &radeon_atom_dac_helper_funcs);
853 radeon_encoder->type.dac = dac_type;
854 radeon_encoder->atom_device = mode_info->bios_connector[bios_index].devices;
856 /* mask off any digital encoders */
857 radeon_encoder->atom_device &= digital_enc_mask;
861 static void radeon_atom_tmds_dpms(struct drm_encoder *encoder, int mode)
863 struct drm_device *dev = encoder->dev;
864 struct drm_radeon_private *dev_priv = dev->dev_private;
865 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
866 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc);
869 uint32_t bios_2_scratch, bios_3_scratch;
871 if (radeon_encoder->atom_device & ATOM_DEVICE_DFP1_SUPPORT)
872 atom_type = ATOM_DEVICE_DFP1_INDEX;
873 if (radeon_encoder->atom_device & ATOM_DEVICE_DFP2_SUPPORT)
874 atom_type = ATOM_DEVICE_DFP2_INDEX;
875 if (radeon_encoder->atom_device & ATOM_DEVICE_DFP3_SUPPORT)
876 atom_type = ATOM_DEVICE_DFP3_INDEX;
881 if (dev_priv->chip_family >= CHIP_R600) {
882 bios_2_scratch = RADEON_READ(R600_BIOS_2_SCRATCH);
883 bios_3_scratch = RADEON_READ(R600_BIOS_3_SCRATCH);
885 bios_2_scratch = RADEON_READ(RADEON_BIOS_2_SCRATCH);
886 bios_3_scratch = RADEON_READ(RADEON_BIOS_3_SCRATCH);
890 case ATOM_DEVICE_DFP1_INDEX:
891 index = GetIndexIntoMasterTable(COMMAND, TMDSAOutputControl);
892 bios_2_scratch &= ~ATOM_S3_DFP1_CRTC_ACTIVE;
893 bios_3_scratch |= (radeon_crtc->crtc_id << 19);
895 case DRM_MODE_DPMS_ON:
896 bios_2_scratch &= ~ATOM_S2_DFP1_DPMS_STATE;
897 bios_3_scratch |= ATOM_S3_DFP1_ACTIVE;
899 case DRM_MODE_DPMS_STANDBY:
900 case DRM_MODE_DPMS_SUSPEND:
901 case DRM_MODE_DPMS_OFF:
902 bios_2_scratch |= ATOM_S2_DFP1_DPMS_STATE;
903 bios_3_scratch &= ~ATOM_S3_DFP1_ACTIVE;
907 case ATOM_DEVICE_DFP2_INDEX:
908 index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl);
909 bios_2_scratch &= ~ATOM_S3_DFP2_CRTC_ACTIVE;
910 bios_3_scratch |= (radeon_crtc->crtc_id << 23);
912 case DRM_MODE_DPMS_ON:
913 bios_2_scratch &= ~ATOM_S2_DFP2_DPMS_STATE;
914 bios_3_scratch |= ATOM_S3_DFP2_ACTIVE;
916 case DRM_MODE_DPMS_STANDBY:
917 case DRM_MODE_DPMS_SUSPEND:
918 case DRM_MODE_DPMS_OFF:
919 bios_2_scratch |= ATOM_S2_DFP2_DPMS_STATE;
920 bios_3_scratch &= ~ATOM_S3_DFP2_ACTIVE;
924 case ATOM_DEVICE_DFP3_INDEX:
925 index = GetIndexIntoMasterTable(COMMAND, LVTMAOutputControl);
926 bios_2_scratch &= ~ATOM_S3_DFP3_CRTC_ACTIVE;
927 bios_3_scratch |= (radeon_crtc->crtc_id << 25);
929 case DRM_MODE_DPMS_ON:
930 bios_2_scratch &= ~ATOM_S2_DFP3_DPMS_STATE;
931 bios_3_scratch |= ATOM_S3_DFP3_ACTIVE;
933 case DRM_MODE_DPMS_STANDBY:
934 case DRM_MODE_DPMS_SUSPEND:
935 case DRM_MODE_DPMS_OFF:
936 bios_2_scratch |= ATOM_S2_DFP3_DPMS_STATE;
937 bios_3_scratch &= ~ATOM_S3_DFP3_ACTIVE;
947 case DRM_MODE_DPMS_ON:
948 atombios_display_device_control(encoder, index, ATOM_ENABLE);
950 case DRM_MODE_DPMS_STANDBY:
951 case DRM_MODE_DPMS_SUSPEND:
952 case DRM_MODE_DPMS_OFF:
953 atombios_display_device_control(encoder, index, ATOM_DISABLE);
957 if (dev_priv->chip_family >= CHIP_R600) {
958 RADEON_WRITE(R600_BIOS_2_SCRATCH, bios_2_scratch);
959 RADEON_WRITE(R600_BIOS_3_SCRATCH, bios_3_scratch);
961 RADEON_WRITE(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
962 RADEON_WRITE(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
966 static bool radeon_atom_tmds_mode_fixup(struct drm_encoder *encoder,
967 struct drm_display_mode *mode,
968 struct drm_display_mode *adjusted_mode)
973 static void radeon_atom_tmds_mode_set(struct drm_encoder *encoder,
974 struct drm_display_mode *mode,
975 struct drm_display_mode *adjusted_mode)
977 struct drm_device *dev = encoder->dev;
978 struct drm_radeon_private *dev_priv = dev->dev_private;
979 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
982 if (radeon_encoder->atom_device & ATOM_DEVICE_DFP1_SUPPORT)
983 atom_type = ATOM_DEVICE_DFP1_INDEX;
984 if (radeon_encoder->atom_device & ATOM_DEVICE_DFP2_SUPPORT)
985 atom_type = ATOM_DEVICE_DFP2_INDEX;
986 if (radeon_encoder->atom_device & ATOM_DEVICE_DFP3_SUPPORT)
987 atom_type = ATOM_DEVICE_DFP3_INDEX;
989 atombios_scaler_setup(encoder, mode);
990 atombios_set_crtc_source(encoder, atom_type);
992 if (atom_type == ATOM_DEVICE_DFP1_INDEX)
993 atombios_tmds1_setup(encoder, adjusted_mode);
994 if (atom_type == ATOM_DEVICE_DFP2_INDEX) {
995 if ((dev_priv->chip_family == CHIP_RS600) ||
996 (dev_priv->chip_family == CHIP_RS690) ||
997 (dev_priv->chip_family == CHIP_RS740))
998 atombios_ddia_setup(encoder, adjusted_mode);
1000 atombios_ext_tmds_setup(encoder, adjusted_mode);
1002 if (atom_type == ATOM_DEVICE_DFP3_INDEX)
1003 atombios_tmds2_setup(encoder, adjusted_mode);
1004 radeon_dfp_disable_dither(encoder, atom_type);
1009 static void radeon_atom_tmds_prepare(struct drm_encoder *encoder)
1011 radeon_atom_output_lock(encoder, true);
1012 radeon_atom_tmds_dpms(encoder, DRM_MODE_DPMS_OFF);
1015 static void radeon_atom_tmds_commit(struct drm_encoder *encoder)
1017 radeon_atom_tmds_dpms(encoder, DRM_MODE_DPMS_ON);
1018 radeon_atom_output_lock(encoder, false);
1021 static const struct drm_encoder_helper_funcs radeon_atom_tmds_helper_funcs = {
1022 .dpms = radeon_atom_tmds_dpms,
1023 .mode_fixup = radeon_atom_tmds_mode_fixup,
1024 .prepare = radeon_atom_tmds_prepare,
1025 .mode_set = radeon_atom_tmds_mode_set,
1026 .commit = radeon_atom_tmds_commit,
1027 /* no detect for TMDS */
1030 static const struct drm_encoder_funcs radeon_atom_tmds_enc_funcs = {
1031 . destroy = radeon_enc_destroy,
1034 struct drm_encoder *radeon_encoder_atom_tmds_add(struct drm_device *dev, int bios_index, int tmds_type)
1036 struct drm_radeon_private *dev_priv = dev->dev_private;
1037 struct radeon_mode_info *mode_info = &dev_priv->mode_info;
1038 struct radeon_encoder *radeon_encoder = NULL;
1039 struct drm_encoder *encoder;
1040 int analog_enc_mask = ~(ATOM_DEVICE_CRT1_SUPPORT | ATOM_DEVICE_CRT2_SUPPORT);
1042 radeon_encoder = kzalloc(sizeof(struct radeon_encoder), GFP_KERNEL);
1043 if (!radeon_encoder) {
1047 encoder = &radeon_encoder->base;
1049 encoder->possible_crtcs = 0x3;
1050 encoder->possible_clones = 0;
1051 drm_encoder_init(dev, encoder, &radeon_atom_tmds_enc_funcs,
1052 DRM_MODE_ENCODER_TMDS);
1054 drm_encoder_helper_add(encoder, &radeon_atom_tmds_helper_funcs);
1056 radeon_encoder->atom_device = mode_info->bios_connector[bios_index].devices;
1058 /* mask off any analog encoders */
1059 radeon_encoder->atom_device &= analog_enc_mask;