2 * Copyright 2004 ATI Technologies Inc., Markham, Ontario
3 * Copyright 2007-8 Advanced Micro Devices, Inc.
4 * Copyright 2008 Red Hat Inc.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
24 * Authors: Dave Airlie
28 #include "radeon_drm.h"
29 #include "radeon_drv.h"
31 /* old legacy ATI BIOS routines */
33 /* COMBIOS table offsets */
34 enum radeon_combios_table_offset
36 /* absolute offset tables */
37 COMBIOS_ASIC_INIT_1_TABLE,
38 COMBIOS_BIOS_SUPPORT_TABLE,
39 COMBIOS_DAC_PROGRAMMING_TABLE,
40 COMBIOS_MAX_COLOR_DEPTH_TABLE,
41 COMBIOS_CRTC_INFO_TABLE,
42 COMBIOS_PLL_INFO_TABLE,
43 COMBIOS_TV_INFO_TABLE,
44 COMBIOS_DFP_INFO_TABLE,
45 COMBIOS_HW_CONFIG_INFO_TABLE,
46 COMBIOS_MULTIMEDIA_INFO_TABLE,
47 COMBIOS_TV_STD_PATCH_TABLE,
48 COMBIOS_LCD_INFO_TABLE,
49 COMBIOS_MOBILE_INFO_TABLE,
50 COMBIOS_PLL_INIT_TABLE,
51 COMBIOS_MEM_CONFIG_TABLE,
52 COMBIOS_SAVE_MASK_TABLE,
53 COMBIOS_HARDCODED_EDID_TABLE,
54 COMBIOS_ASIC_INIT_2_TABLE,
55 COMBIOS_CONNECTOR_INFO_TABLE,
56 COMBIOS_DYN_CLK_1_TABLE,
57 COMBIOS_RESERVED_MEM_TABLE,
58 COMBIOS_EXT_TMDS_INFO_TABLE,
59 COMBIOS_MEM_CLK_INFO_TABLE,
60 COMBIOS_EXT_DAC_INFO_TABLE,
61 COMBIOS_MISC_INFO_TABLE,
62 COMBIOS_CRT_INFO_TABLE,
63 COMBIOS_INTEGRATED_SYSTEM_INFO_TABLE,
64 COMBIOS_COMPONENT_VIDEO_INFO_TABLE,
65 COMBIOS_FAN_SPEED_INFO_TABLE,
66 COMBIOS_OVERDRIVE_INFO_TABLE,
67 COMBIOS_OEM_INFO_TABLE,
68 COMBIOS_DYN_CLK_2_TABLE,
69 COMBIOS_POWER_CONNECTOR_INFO_TABLE,
70 COMBIOS_I2C_INFO_TABLE,
71 /* relative offset tables */
72 COMBIOS_ASIC_INIT_3_TABLE, /* offset from misc info */
73 COMBIOS_ASIC_INIT_4_TABLE, /* offset from misc info */
74 COMBIOS_ASIC_INIT_5_TABLE, /* offset from misc info */
75 COMBIOS_RAM_RESET_TABLE, /* offset from mem config */
76 COMBIOS_POWERPLAY_INFO_TABLE, /* offset from mobile info */
77 COMBIOS_GPIO_INFO_TABLE, /* offset from mobile info */
78 COMBIOS_LCD_DDC_INFO_TABLE, /* offset from mobile info */
79 COMBIOS_TMDS_POWER_TABLE, /* offset from mobile info */
80 COMBIOS_TMDS_POWER_ON_TABLE, /* offset from tmds power */
81 COMBIOS_TMDS_POWER_OFF_TABLE, /* offset from tmds power */
84 enum radeon_combios_ddc
95 enum radeon_combios_connector
97 CONNECTOR_NONE_LEGACY,
98 CONNECTOR_PROPRIETARY_LEGACY,
100 CONNECTOR_DVI_I_LEGACY,
101 CONNECTOR_DVI_D_LEGACY,
102 CONNECTOR_CTV_LEGACY,
103 CONNECTOR_STV_LEGACY,
104 CONNECTOR_UNSUPPORTED_LEGACY
107 static uint16_t combios_get_table_offset(struct drm_device *dev, enum radeon_combios_table_offset table)
109 struct drm_radeon_private *dev_priv = dev->dev_private;
111 uint16_t offset = 0, check_offset;
114 /* absolute offset tables */
115 case COMBIOS_ASIC_INIT_1_TABLE:
116 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0xc);
118 offset = check_offset;
120 case COMBIOS_BIOS_SUPPORT_TABLE:
121 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x14);
123 offset = check_offset;
125 case COMBIOS_DAC_PROGRAMMING_TABLE:
126 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x2a);
128 offset = check_offset;
130 case COMBIOS_MAX_COLOR_DEPTH_TABLE:
131 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x2c);
133 offset = check_offset;
135 case COMBIOS_CRTC_INFO_TABLE:
136 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x2e);
138 offset = check_offset;
140 case COMBIOS_PLL_INFO_TABLE:
141 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x30);
143 offset = check_offset;
145 case COMBIOS_TV_INFO_TABLE:
146 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x32);
148 offset = check_offset;
150 case COMBIOS_DFP_INFO_TABLE:
151 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x34);
153 offset = check_offset;
155 case COMBIOS_HW_CONFIG_INFO_TABLE:
156 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x36);
158 offset = check_offset;
160 case COMBIOS_MULTIMEDIA_INFO_TABLE:
161 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x38);
163 offset = check_offset;
165 case COMBIOS_TV_STD_PATCH_TABLE:
166 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x3e);
168 offset = check_offset;
170 case COMBIOS_LCD_INFO_TABLE:
171 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x40);
173 offset = check_offset;
175 case COMBIOS_MOBILE_INFO_TABLE:
176 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x42);
178 offset = check_offset;
180 case COMBIOS_PLL_INIT_TABLE:
181 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x46);
183 offset = check_offset;
185 case COMBIOS_MEM_CONFIG_TABLE:
186 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x48);
188 offset = check_offset;
190 case COMBIOS_SAVE_MASK_TABLE:
191 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x4a);
193 offset = check_offset;
195 case COMBIOS_HARDCODED_EDID_TABLE:
196 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x4c);
198 offset = check_offset;
200 case COMBIOS_ASIC_INIT_2_TABLE:
201 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x4e);
203 offset = check_offset;
205 case COMBIOS_CONNECTOR_INFO_TABLE:
206 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x50);
208 offset = check_offset;
210 case COMBIOS_DYN_CLK_1_TABLE:
211 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x52);
213 offset = check_offset;
215 case COMBIOS_RESERVED_MEM_TABLE:
216 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x54);
218 offset = check_offset;
220 case COMBIOS_EXT_TMDS_INFO_TABLE:
221 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x58);
223 offset = check_offset;
225 case COMBIOS_MEM_CLK_INFO_TABLE:
226 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x5a);
228 offset = check_offset;
230 case COMBIOS_EXT_DAC_INFO_TABLE:
231 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x5c);
233 offset = check_offset;
235 case COMBIOS_MISC_INFO_TABLE:
236 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x5e);
238 offset = check_offset;
240 case COMBIOS_CRT_INFO_TABLE:
241 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x60);
243 offset = check_offset;
245 case COMBIOS_INTEGRATED_SYSTEM_INFO_TABLE:
246 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x62);
248 offset = check_offset;
250 case COMBIOS_COMPONENT_VIDEO_INFO_TABLE:
251 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x64);
253 offset = check_offset;
255 case COMBIOS_FAN_SPEED_INFO_TABLE:
256 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x66);
258 offset = check_offset;
260 case COMBIOS_OVERDRIVE_INFO_TABLE:
261 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x68);
263 offset = check_offset;
265 case COMBIOS_OEM_INFO_TABLE:
266 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x6a);
268 offset = check_offset;
270 case COMBIOS_DYN_CLK_2_TABLE:
271 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x6c);
273 offset = check_offset;
275 case COMBIOS_POWER_CONNECTOR_INFO_TABLE:
276 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x6e);
278 offset = check_offset;
280 case COMBIOS_I2C_INFO_TABLE:
281 check_offset = radeon_bios16(dev_priv, dev_priv->bios_header_start + 0x70);
283 offset = check_offset;
285 /* relative offset tables */
286 case COMBIOS_ASIC_INIT_3_TABLE: /* offset from misc info */
287 check_offset = combios_get_table_offset(dev, COMBIOS_MISC_INFO_TABLE);
289 rev = radeon_bios8(dev_priv, check_offset);
291 check_offset = radeon_bios16(dev_priv, check_offset + 0x3);
293 offset = check_offset;
297 case COMBIOS_ASIC_INIT_4_TABLE: /* offset from misc info */
298 check_offset = combios_get_table_offset(dev, COMBIOS_MISC_INFO_TABLE);
300 rev = radeon_bios8(dev_priv, check_offset);
302 check_offset = radeon_bios16(dev_priv, check_offset + 0x5);
304 offset = check_offset;
308 case COMBIOS_ASIC_INIT_5_TABLE: /* offset from misc info */
309 check_offset = combios_get_table_offset(dev, COMBIOS_MISC_INFO_TABLE);
311 rev = radeon_bios8(dev_priv, check_offset);
313 check_offset = radeon_bios16(dev_priv, check_offset + 0x9);
315 offset = check_offset;
319 case COMBIOS_RAM_RESET_TABLE: /* offset from mem config */
320 check_offset = combios_get_table_offset(dev, COMBIOS_MEM_CONFIG_TABLE);
322 while (radeon_bios8(dev_priv, check_offset++));
325 offset = check_offset;
328 case COMBIOS_POWERPLAY_INFO_TABLE: /* offset from mobile info */
329 check_offset = combios_get_table_offset(dev, COMBIOS_MOBILE_INFO_TABLE);
331 check_offset = radeon_bios16(dev_priv, check_offset + 0x11);
333 offset = check_offset;
336 case COMBIOS_GPIO_INFO_TABLE: /* offset from mobile info */
337 check_offset = combios_get_table_offset(dev, COMBIOS_MOBILE_INFO_TABLE);
339 check_offset = radeon_bios16(dev_priv, check_offset + 0x13);
341 offset = check_offset;
344 case COMBIOS_LCD_DDC_INFO_TABLE: /* offset from mobile info */
345 check_offset = combios_get_table_offset(dev, COMBIOS_MOBILE_INFO_TABLE);
347 check_offset = radeon_bios16(dev_priv, check_offset + 0x15);
349 offset = check_offset;
352 case COMBIOS_TMDS_POWER_TABLE: /* offset from mobile info */
353 check_offset = combios_get_table_offset(dev, COMBIOS_MOBILE_INFO_TABLE);
355 check_offset = radeon_bios16(dev_priv, check_offset + 0x17);
357 offset = check_offset;
360 case COMBIOS_TMDS_POWER_ON_TABLE: /* offset from tmds power */
361 check_offset = combios_get_table_offset(dev, COMBIOS_TMDS_POWER_TABLE);
363 check_offset = radeon_bios16(dev_priv, check_offset + 0x2);
365 offset = check_offset;
368 case COMBIOS_TMDS_POWER_OFF_TABLE: /* offset from tmds power */
369 check_offset = combios_get_table_offset(dev, COMBIOS_TMDS_POWER_TABLE);
371 check_offset = radeon_bios16(dev_priv, check_offset + 0x4);
373 offset = check_offset;
384 struct radeon_i2c_bus_rec combios_setup_i2c_bus(int ddc_line)
386 struct radeon_i2c_bus_rec i2c;
388 i2c.mask_clk_mask = RADEON_GPIO_EN_1;
389 i2c.mask_data_mask = RADEON_GPIO_EN_0;
390 i2c.a_clk_mask = RADEON_GPIO_A_1;
391 i2c.a_data_mask = RADEON_GPIO_A_0;
392 i2c.put_clk_mask = RADEON_GPIO_EN_1;
393 i2c.put_data_mask = RADEON_GPIO_EN_0;
394 i2c.get_clk_mask = RADEON_GPIO_Y_1;
395 i2c.get_data_mask = RADEON_GPIO_Y_0;
396 if ((ddc_line == RADEON_LCD_GPIO_MASK) ||
397 (ddc_line == RADEON_MDGPIO_EN_REG)) {
398 i2c.mask_clk_reg = ddc_line;
399 i2c.mask_data_reg = ddc_line;
400 i2c.a_clk_reg = ddc_line;
401 i2c.a_data_reg = ddc_line;
402 i2c.put_clk_reg = ddc_line;
403 i2c.put_data_reg = ddc_line;
404 i2c.get_clk_reg = ddc_line + 4;
405 i2c.get_data_reg = ddc_line + 4;
407 i2c.mask_clk_reg = ddc_line;
408 i2c.mask_data_reg = ddc_line;
409 i2c.a_clk_reg = ddc_line;
410 i2c.a_data_reg = ddc_line;
411 i2c.put_clk_reg = ddc_line;
412 i2c.put_data_reg = ddc_line;
413 i2c.get_clk_reg = ddc_line;
414 i2c.get_data_reg = ddc_line;
425 bool radeon_combios_get_clock_info(struct drm_device *dev)
427 struct drm_radeon_private *dev_priv = dev->dev_private;
428 struct radeon_mode_info *mode_info = &dev_priv->mode_info;
430 struct radeon_pll *p1pll = &mode_info->p1pll;
431 struct radeon_pll *p2pll = &mode_info->p2pll;
432 struct radeon_pll *spll = &mode_info->spll;
433 struct radeon_pll *mpll = &mode_info->mpll;
437 pll_info = combios_get_table_offset(dev, COMBIOS_PLL_INFO_TABLE);
439 rev = radeon_bios8(dev_priv, pll_info);
442 p1pll->reference_freq = radeon_bios16(dev_priv, pll_info + 0xe);
443 p1pll->reference_div = radeon_bios16(dev_priv, pll_info + 0x10);
444 p1pll->pll_out_min = radeon_bios32(dev_priv, pll_info + 0x12);
445 p1pll->pll_out_max = radeon_bios32(dev_priv, pll_info + 0x16);
448 p1pll->pll_in_min = radeon_bios32(dev_priv, pll_info + 0x36);
449 p1pll->pll_in_max = radeon_bios32(dev_priv, pll_info + 0x3a);
451 p1pll->pll_in_min = 40;
452 p1pll->pll_in_max = 500;
457 spll->reference_freq = radeon_bios16(dev_priv, pll_info + 0x1a);
458 spll->reference_div = radeon_bios16(dev_priv, pll_info + 0x1c);
459 spll->pll_out_min = radeon_bios32(dev_priv, pll_info + 0x1e);
460 spll->pll_out_max = radeon_bios32(dev_priv, pll_info + 0x22);
463 spll->pll_in_min = radeon_bios32(dev_priv, pll_info + 0x48);
464 spll->pll_in_max = radeon_bios32(dev_priv, pll_info + 0x4c);
467 spll->pll_in_min = 40;
468 spll->pll_in_max = 500;
472 mpll->reference_freq = radeon_bios16(dev_priv, pll_info + 0x26);
473 mpll->reference_div = radeon_bios16(dev_priv, pll_info + 0x28);
474 mpll->pll_out_min = radeon_bios32(dev_priv, pll_info + 0x2a);
475 mpll->pll_out_max = radeon_bios32(dev_priv, pll_info + 0x2e);
478 mpll->pll_in_min = radeon_bios32(dev_priv, pll_info + 0x5a);
479 mpll->pll_in_max = radeon_bios32(dev_priv, pll_info + 0x5e);
482 mpll->pll_in_min = 40;
483 mpll->pll_in_max = 500;
486 /* default sclk/mclk */
487 sclk = radeon_bios16(dev_priv, pll_info + 0x8);
488 mclk = radeon_bios16(dev_priv, pll_info + 0xa);
494 mode_info->sclk = sclk;
495 mode_info->mclk = mclk;
502 bool radeon_combios_get_primary_dac_info(struct radeon_encoder *encoder)
504 struct drm_device *dev = encoder->base.dev;
505 struct drm_radeon_private *dev_priv = dev->dev_private;
507 uint8_t rev, bg, dac;
509 /* check CRT table */
510 dac_info = combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE);
512 rev = radeon_bios8(dev_priv, dac_info) & 0x3;
514 bg = radeon_bios8(dev_priv, dac_info + 0x2) & 0xf;
515 dac = (radeon_bios8(dev_priv, dac_info + 0x2) >> 4) & 0xf;
516 encoder->ps2_pdac_adj = (bg << 8) | (dac);
520 bg = radeon_bios8(dev_priv, dac_info + 0x2) & 0xf;
521 dac = radeon_bios8(dev_priv, dac_info + 0x3) & 0xf;
522 encoder->ps2_pdac_adj = (bg << 8) | (dac);
532 bool radeon_combios_get_tv_dac_info(struct radeon_encoder *encoder)
534 struct drm_device *dev = encoder->base.dev;
535 struct drm_radeon_private *dev_priv = dev->dev_private;
537 uint8_t rev, bg, dac;
539 /* first check TV table */
540 dac_info = combios_get_table_offset(dev, COMBIOS_TV_INFO_TABLE);
542 rev = radeon_bios8(dev_priv, dac_info + 0x3);
544 bg = radeon_bios8(dev_priv, dac_info + 0xc) & 0xf;
545 dac = radeon_bios8(dev_priv, dac_info + 0xd) & 0xf;
546 encoder->ps2_tvdac_adj = (bg << 16) | (dac << 20);
548 bg = radeon_bios8(dev_priv, dac_info + 0xe) & 0xf;
549 dac = radeon_bios8(dev_priv, dac_info + 0xf) & 0xf;
550 encoder->pal_tvdac_adj = (bg << 16) | (dac << 20);
552 bg = radeon_bios8(dev_priv, dac_info + 0x10) & 0xf;
553 dac = radeon_bios8(dev_priv, dac_info + 0x11) & 0xf;
554 encoder->ntsc_tvdac_adj = (bg << 16) | (dac << 20);
557 } else if (rev > 1) {
558 bg = radeon_bios8(dev_priv, dac_info + 0xc) & 0xf;
559 dac = (radeon_bios8(dev_priv, dac_info + 0xc) >> 4) & 0xf;
560 encoder->ps2_tvdac_adj = (bg << 16) | (dac << 20);
562 bg = radeon_bios8(dev_priv, dac_info + 0xd) & 0xf;
563 dac = (radeon_bios8(dev_priv, dac_info + 0xd) >> 4) & 0xf;
564 encoder->pal_tvdac_adj = (bg << 16) | (dac << 20);
566 bg = radeon_bios8(dev_priv, dac_info + 0xe) & 0xf;
567 dac = (radeon_bios8(dev_priv, dac_info + 0xe) >> 4) & 0xf;
568 encoder->ntsc_tvdac_adj = (bg << 16) | (dac << 20);
574 /* then check CRT table */
575 dac_info = combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE);
577 rev = radeon_bios8(dev_priv, dac_info) & 0x3;
579 bg = radeon_bios8(dev_priv, dac_info + 0x3) & 0xf;
580 dac = (radeon_bios8(dev_priv, dac_info + 0x3) >> 4) & 0xf;
581 encoder->ps2_tvdac_adj = (bg << 16) | (dac << 20);
582 encoder->pal_tvdac_adj = encoder->ps2_tvdac_adj;
583 encoder->ntsc_tvdac_adj = encoder->ps2_tvdac_adj;
587 bg = radeon_bios8(dev_priv, dac_info + 0x4) & 0xf;
588 dac = radeon_bios8(dev_priv, dac_info + 0x5) & 0xf;
589 encoder->ps2_tvdac_adj = (bg << 16) | (dac << 20);
590 encoder->pal_tvdac_adj = encoder->ps2_tvdac_adj;
591 encoder->ntsc_tvdac_adj = encoder->ps2_tvdac_adj;
601 bool radeon_combios_get_tv_info(struct radeon_encoder *encoder)
603 struct drm_device *dev = encoder->base.dev;
604 struct drm_radeon_private *dev_priv = dev->dev_private;
607 tv_info = combios_get_table_offset(dev, COMBIOS_TV_INFO_TABLE);
609 if (radeon_bios8(dev_priv, tv_info + 6) == 'T') {
610 switch (radeon_bios8(dev_priv, tv_info + 7) & 0xf) {
612 encoder->tv_std = TV_STD_NTSC;
613 DRM_INFO("Default TV standard: NTSC\n");
616 encoder->tv_std = TV_STD_PAL;
617 DRM_INFO("Default TV standard: PAL\n");
620 encoder->tv_std = TV_STD_PAL_M;
621 DRM_INFO("Default TV standard: PAL-M\n");
624 encoder->tv_std = TV_STD_PAL_60;
625 DRM_INFO("Default TV standard: PAL-60\n");
628 encoder->tv_std = TV_STD_NTSC_J;
629 DRM_INFO("Default TV standard: NTSC-J\n");
632 encoder->tv_std = TV_STD_SCART_PAL;
633 DRM_INFO("Default TV standard: SCART-PAL\n");
636 encoder->tv_std = TV_STD_NTSC;
637 DRM_INFO("Unknown TV standard; defaulting to NTSC\n");
641 switch ((radeon_bios8(dev_priv, tv_info + 9) >> 2) & 0x3) {
643 DRM_INFO("29.498928713 MHz TV ref clk\n");
646 DRM_INFO("28.636360000 MHz TV ref clk\n");
649 DRM_INFO("14.318180000 MHz TV ref clk\n");
652 DRM_INFO("27.000000000 MHz TV ref clk\n");
663 bool radeon_combios_get_lvds_info(struct radeon_encoder *encoder)
665 struct drm_device *dev = encoder->base.dev;
666 struct drm_radeon_private *dev_priv = dev->dev_private;
668 uint32_t panel_setup;
672 lcd_info = combios_get_table_offset(dev, COMBIOS_LCD_INFO_TABLE);
675 for (i = 0; i < 24; i++)
676 stmp[i] = radeon_bios8(dev_priv, lcd_info + i + 1);
679 DRM_INFO("Panel ID String: %s\n", stmp);
681 encoder->panel_xres = radeon_bios16(dev_priv, lcd_info + 25);
682 encoder->panel_yres = radeon_bios16(dev_priv, lcd_info + 27);
684 DRM_INFO("Panel Size %dx%d\n", encoder->panel_xres, encoder->panel_yres);
686 encoder->panel_vcc_delay = radeon_bios16(dev_priv, lcd_info + 44);
687 if (encoder->panel_vcc_delay > 2000 || encoder->panel_vcc_delay < 0)
688 encoder->panel_vcc_delay = 2000;
690 encoder->panel_pwr_delay = radeon_bios16(dev_priv, lcd_info + 0x24);
691 encoder->panel_digon_delay = radeon_bios16(dev_priv, lcd_info + 0x38) & 0xf;
692 encoder->panel_blon_delay = (radeon_bios16(dev_priv, lcd_info + 0x38) >> 4) & 0xf;
694 encoder->panel_ref_divider = radeon_bios16(dev_priv, lcd_info + 46);
695 encoder->panel_post_divider = radeon_bios8(dev_priv, lcd_info + 48);
696 encoder->panel_fb_divider = radeon_bios16(dev_priv, lcd_info + 49);
697 if ((encoder->panel_ref_divider != 0) &&
698 (encoder->panel_fb_divider > 3))
699 encoder->use_bios_dividers = true;
701 panel_setup = radeon_bios32(dev_priv, lcd_info + 0x39);
702 encoder->lvds_gen_cntl = 0xff00;
703 if (panel_setup & 0x1)
704 encoder->lvds_gen_cntl |= RADEON_LVDS_PANEL_FORMAT;
706 if ((panel_setup >> 4) & 0x1)
707 encoder->lvds_gen_cntl |= RADEON_LVDS_PANEL_TYPE;
709 switch ((panel_setup >> 8) & 0x7) {
711 encoder->lvds_gen_cntl |= RADEON_LVDS_NO_FM;
714 encoder->lvds_gen_cntl |= RADEON_LVDS_2_GREY;
717 encoder->lvds_gen_cntl |= RADEON_LVDS_4_GREY;
723 if ((panel_setup >> 16) & 0x1)
724 encoder->lvds_gen_cntl |= RADEON_LVDS_FP_POL_LOW;
726 if ((panel_setup >> 17) & 0x1)
727 encoder->lvds_gen_cntl |= RADEON_LVDS_LP_POL_LOW;
729 if ((panel_setup >> 18) & 0x1)
730 encoder->lvds_gen_cntl |= RADEON_LVDS_DTM_POL_LOW;
732 if ((panel_setup >> 23) & 0x1)
733 encoder->lvds_gen_cntl |= RADEON_LVDS_BL_CLK_SEL;
735 encoder->lvds_gen_cntl |= (panel_setup & 0xf0000000);
738 for (i = 0; i < 32; i++) {
739 tmp = radeon_bios16(dev_priv, lcd_info + 64 + i * 2);
742 if ((radeon_bios16(dev_priv, tmp) == encoder->panel_xres) &&
743 (radeon_bios16(dev_priv, tmp + 2) == encoder->panel_yres)) {
744 encoder->hblank = (radeon_bios16(dev_priv, tmp + 17) -
745 radeon_bios16(dev_priv, tmp + 19)) * 8;
746 encoder->hoverplus = (radeon_bios16(dev_priv, tmp + 21) -
747 radeon_bios16(dev_priv, tmp + 19) - 1) * 8;
748 encoder->hsync_width = radeon_bios8(dev_priv, tmp + 23) * 8;
750 encoder->vblank = (radeon_bios16(dev_priv, tmp + 24) -
751 radeon_bios16(dev_priv, tmp + 26));
752 encoder->voverplus = ((radeon_bios16(dev_priv, tmp + 28) & 0x7ff) -
753 radeon_bios16(dev_priv, tmp + 26));
754 encoder->vsync_width = ((radeon_bios16(dev_priv, tmp + 28) & 0xf800) >> 11);
755 encoder->dotclock = radeon_bios16(dev_priv, tmp + 9) * 10;
761 DRM_INFO("No panel info found in BIOS\n");
766 bool radeon_combios_get_tmds_info(struct radeon_encoder *encoder)
768 struct drm_device *dev = encoder->base.dev;
769 struct drm_radeon_private *dev_priv = dev->dev_private;
774 tmds_info = combios_get_table_offset(dev, COMBIOS_DFP_INFO_TABLE);
777 ver = radeon_bios8(dev_priv, tmds_info);
778 DRM_INFO("DFP table revision: %d\n", ver);
780 n = radeon_bios8(dev_priv, tmds_info + 5) + 1;
783 for (i = 0; i < n; i++) {
784 encoder->tmds_pll[i].value = radeon_bios32(dev_priv, tmds_info + i * 10 + 0x08);
785 encoder->tmds_pll[i].freq = radeon_bios16(dev_priv, tmds_info + i * 10 + 0x10);
788 } else if (ver == 4) {
790 n = radeon_bios8(dev_priv, tmds_info + 5) + 1;
793 for (i = 0; i < n; i++) {
794 encoder->tmds_pll[i].value = radeon_bios32(dev_priv, tmds_info + stride + 0x08);
795 encoder->tmds_pll[i].freq = radeon_bios16(dev_priv, tmds_info + stride + 0x10);
805 DRM_INFO("No TMDS info found in BIOS\n");
809 void radeon_combios_get_ext_tmds_info(struct radeon_encoder *encoder)
811 struct drm_device *dev = encoder->base.dev;
812 struct drm_radeon_private *dev_priv = dev->dev_private;
813 uint16_t ext_tmds_info;
816 ext_tmds_info = combios_get_table_offset(dev, COMBIOS_EXT_TMDS_INFO_TABLE);
818 ver = radeon_bios8(dev_priv, ext_tmds_info);
819 DRM_INFO("External TMDS Table revision: %d\n", ver);
824 static void radeon_apply_legacy_quirks(struct drm_device *dev, int bios_index)
826 struct drm_radeon_private *dev_priv = dev->dev_private;
827 struct radeon_mode_info *mode_info = &dev_priv->mode_info;
829 /* XPRESS DDC quirks */
830 if ((dev_priv->chip_family == CHIP_RS400 ||
831 dev_priv->chip_family == CHIP_RS480) &&
832 mode_info->bios_connector[bios_index].ddc_i2c.mask_clk_reg == RADEON_GPIO_CRT2_DDC) {
833 mode_info->bios_connector[bios_index].ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_MONID);
834 } else if ((dev_priv->chip_family == CHIP_RS400 ||
835 dev_priv->chip_family == CHIP_RS480) &&
836 mode_info->bios_connector[bios_index].ddc_i2c.mask_clk_reg == RADEON_GPIO_MONID) {
837 mode_info->bios_connector[bios_index].ddc_i2c.valid = true;
838 mode_info->bios_connector[bios_index].ddc_i2c.mask_clk_mask = (0x20 << 8);
839 mode_info->bios_connector[bios_index].ddc_i2c.mask_data_mask = 0x80;
840 mode_info->bios_connector[bios_index].ddc_i2c.a_clk_mask = (0x20 << 8);
841 mode_info->bios_connector[bios_index].ddc_i2c.a_data_mask = 0x80;
842 mode_info->bios_connector[bios_index].ddc_i2c.put_clk_mask = (0x20 << 8);
843 mode_info->bios_connector[bios_index].ddc_i2c.put_data_mask = 0x80;
844 mode_info->bios_connector[bios_index].ddc_i2c.get_clk_mask = (0x20 << 8);
845 mode_info->bios_connector[bios_index].ddc_i2c.get_data_mask = 0x80;
846 mode_info->bios_connector[bios_index].ddc_i2c.mask_clk_reg = RADEON_GPIOPAD_MASK;
847 mode_info->bios_connector[bios_index].ddc_i2c.mask_data_reg = RADEON_GPIOPAD_MASK;
848 mode_info->bios_connector[bios_index].ddc_i2c.a_clk_reg = RADEON_GPIOPAD_A;
849 mode_info->bios_connector[bios_index].ddc_i2c.a_data_reg = RADEON_GPIOPAD_A;
850 mode_info->bios_connector[bios_index].ddc_i2c.put_clk_reg = RADEON_GPIOPAD_EN;
851 mode_info->bios_connector[bios_index].ddc_i2c.put_data_reg = RADEON_GPIOPAD_EN;
852 mode_info->bios_connector[bios_index].ddc_i2c.get_clk_reg = RADEON_LCD_GPIO_Y_REG;
853 mode_info->bios_connector[bios_index].ddc_i2c.get_data_reg = RADEON_LCD_GPIO_Y_REG;
856 /* Certain IBM chipset RN50s have a BIOS reporting two VGAs,
857 one with VGA DDC and one with CRT2 DDC. - kill the CRT2 DDC one */
858 if (dev->pdev->device == 0x515e &&
859 dev->pdev->subsystem_vendor == 0x1014) {
860 if (mode_info->bios_connector[bios_index].connector_type == CONNECTOR_VGA &&
861 mode_info->bios_connector[bios_index].ddc_i2c.mask_clk_reg == RADEON_GPIO_CRT2_DDC) {
862 mode_info->bios_connector[bios_index].valid = false;
866 /* Some RV100 cards with 2 VGA ports show up with DVI+VGA */
867 if (dev->pdev->device == 0x5159 &&
868 dev->pdev->subsystem_vendor == 0x1002 &&
869 dev->pdev->subsystem_device == 0x013a) {
870 if (mode_info->bios_connector[bios_index].connector_type == CONNECTOR_DVI_I)
871 mode_info->bios_connector[bios_index].connector_type = CONNECTOR_VGA;
875 /* X300 card with extra non-existent DVI port */
876 if (dev->pdev->device == 0x5B60 &&
877 dev->pdev->subsystem_vendor == 0x17af &&
878 dev->pdev->subsystem_device == 0x201e &&
880 if (mode_info->bios_connector[bios_index].connector_type == CONNECTOR_DVI_I)
881 mode_info->bios_connector[bios_index].valid = false;
886 bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
888 struct drm_radeon_private *dev_priv = dev->dev_private;
889 struct radeon_mode_info *mode_info = &dev_priv->mode_info;
890 uint32_t conn_info, entry;
892 enum radeon_combios_ddc ddc_type;
893 enum radeon_combios_connector connector_type;
897 conn_info = combios_get_table_offset(dev, COMBIOS_CONNECTOR_INFO_TABLE);
899 for (i = 0; i < 4; i++) {
900 entry = conn_info + 2 + i * 2;
902 if (!radeon_bios16(dev_priv, entry))
905 mode_info->bios_connector[i].valid = true;
907 tmp = radeon_bios16(dev_priv, entry);
909 connector_type = (tmp >> 12) & 0xf;
910 mode_info->bios_connector[i].connector_type = connector_type;
912 switch(connector_type) {
913 case CONNECTOR_PROPRIETARY_LEGACY:
914 mode_info->bios_connector[i].connector_type = CONNECTOR_DVI_D;
916 case CONNECTOR_CRT_LEGACY:
917 mode_info->bios_connector[i].connector_type = CONNECTOR_VGA;
919 case CONNECTOR_DVI_I_LEGACY:
920 mode_info->bios_connector[i].connector_type = CONNECTOR_DVI_I;
922 case CONNECTOR_DVI_D_LEGACY:
923 mode_info->bios_connector[i].connector_type = CONNECTOR_DVI_D;
925 case CONNECTOR_CTV_LEGACY:
926 mode_info->bios_connector[i].connector_type = CONNECTOR_CTV;
928 case CONNECTOR_STV_LEGACY:
929 mode_info->bios_connector[i].connector_type = CONNECTOR_STV;
932 DRM_ERROR("Unknown connector type: %d\n", connector_type);
933 mode_info->bios_connector[i].valid = false;
937 mode_info->bios_connector[i].ddc_i2c.valid = false;
939 ddc_type = (tmp >> 8) & 0xf;
942 mode_info->bios_connector[i].ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_MONID);
945 mode_info->bios_connector[i].ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC);
948 mode_info->bios_connector[i].ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC);
951 mode_info->bios_connector[i].ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_CRT2_DDC);
958 mode_info->bios_connector[i].dac_type = DAC_TVDAC;
960 mode_info->bios_connector[i].dac_type = DAC_PRIMARY;
962 if ((dev_priv->chip_family == CHIP_RS300) ||
963 (dev_priv->chip_family == CHIP_RS400) ||
964 (dev_priv->chip_family == CHIP_RS480))
965 mode_info->bios_connector[i].dac_type = DAC_TVDAC;
967 if ((tmp >> 4) & 0x1)
968 mode_info->bios_connector[i].tmds_type = TMDS_EXT;
970 mode_info->bios_connector[i].tmds_type = TMDS_INT;
972 radeon_apply_legacy_quirks(dev, i);
975 uint16_t tmds_info = combios_get_table_offset(dev, COMBIOS_DFP_INFO_TABLE);
977 DRM_DEBUG("Found DFP table, assuming DVI connector\n");
979 mode_info->bios_connector[0].valid = true;
980 mode_info->bios_connector[0].connector_type = CONNECTOR_DVI_I;
981 mode_info->bios_connector[0].dac_type = DAC_PRIMARY;
982 mode_info->bios_connector[0].tmds_type = TMDS_INT;
983 mode_info->bios_connector[0].ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC);
985 DRM_DEBUG("No connector info found\n");
990 if (dev_priv->flags & RADEON_IS_MOBILITY ||
991 dev_priv->chip_family == CHIP_RS400 ||
992 dev_priv->chip_family == CHIP_RS480) {
993 uint16_t lcd_info = combios_get_table_offset(dev, COMBIOS_LCD_INFO_TABLE);
995 uint16_t lcd_ddc_info = combios_get_table_offset(dev, COMBIOS_LCD_DDC_INFO_TABLE);
997 mode_info->bios_connector[4].valid = true;
998 mode_info->bios_connector[4].connector_type = CONNECTOR_LVDS;
999 mode_info->bios_connector[4].dac_type = DAC_NONE;
1000 mode_info->bios_connector[4].tmds_type = TMDS_NONE;
1001 mode_info->bios_connector[4].ddc_i2c.valid = false;
1004 ddc_type = radeon_bios8(dev_priv, lcd_ddc_info + 2);
1007 mode_info->bios_connector[4].ddc_i2c =
1008 combios_setup_i2c_bus(RADEON_GPIO_MONID);
1011 mode_info->bios_connector[4].ddc_i2c =
1012 combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC);
1015 mode_info->bios_connector[4].ddc_i2c =
1016 combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC);
1019 mode_info->bios_connector[4].ddc_i2c =
1020 combios_setup_i2c_bus(RADEON_GPIO_CRT2_DDC);
1023 mode_info->bios_connector[4].ddc_i2c =
1024 combios_setup_i2c_bus(RADEON_LCD_GPIO_MASK);
1025 mode_info->bios_connector[4].ddc_i2c.mask_clk_mask =
1026 radeon_bios32(dev_priv, lcd_ddc_info + 3);
1027 mode_info->bios_connector[4].ddc_i2c.mask_data_mask =
1028 radeon_bios32(dev_priv, lcd_ddc_info + 7);
1029 mode_info->bios_connector[4].ddc_i2c.a_clk_mask =
1030 radeon_bios32(dev_priv, lcd_ddc_info + 3);
1031 mode_info->bios_connector[4].ddc_i2c.a_data_mask =
1032 radeon_bios32(dev_priv, lcd_ddc_info + 7);
1033 mode_info->bios_connector[4].ddc_i2c.put_clk_mask =
1034 radeon_bios32(dev_priv, lcd_ddc_info + 3);
1035 mode_info->bios_connector[4].ddc_i2c.put_data_mask =
1036 radeon_bios32(dev_priv, lcd_ddc_info + 7);
1037 mode_info->bios_connector[4].ddc_i2c.get_clk_mask =
1038 radeon_bios32(dev_priv, lcd_ddc_info + 3);
1039 mode_info->bios_connector[4].ddc_i2c.get_data_mask =
1040 radeon_bios32(dev_priv, lcd_ddc_info + 7);
1043 mode_info->bios_connector[4].ddc_i2c =
1044 combios_setup_i2c_bus(RADEON_MDGPIO_EN_REG);
1045 mode_info->bios_connector[4].ddc_i2c.mask_clk_mask =
1046 radeon_bios32(dev_priv, lcd_ddc_info + 3);
1047 mode_info->bios_connector[4].ddc_i2c.mask_data_mask =
1048 radeon_bios32(dev_priv, lcd_ddc_info + 7);
1049 mode_info->bios_connector[4].ddc_i2c.a_clk_mask =
1050 radeon_bios32(dev_priv, lcd_ddc_info + 3);
1051 mode_info->bios_connector[4].ddc_i2c.a_data_mask =
1052 radeon_bios32(dev_priv, lcd_ddc_info + 7);
1053 mode_info->bios_connector[4].ddc_i2c.put_clk_mask =
1054 radeon_bios32(dev_priv, lcd_ddc_info + 3);
1055 mode_info->bios_connector[4].ddc_i2c.put_data_mask =
1056 radeon_bios32(dev_priv, lcd_ddc_info + 7);
1057 mode_info->bios_connector[4].ddc_i2c.get_clk_mask =
1058 radeon_bios32(dev_priv, lcd_ddc_info + 3);
1059 mode_info->bios_connector[4].ddc_i2c.get_data_mask =
1060 radeon_bios32(dev_priv, lcd_ddc_info + 7);
1065 DRM_DEBUG("LCD DDC Info Table found!\n");
1068 mode_info->bios_connector[4].ddc_i2c.valid = false;
1071 /* check TV table */
1072 if (dev_priv->chip_family != CHIP_R100 &&
1073 dev_priv->chip_family != CHIP_R200) {
1074 uint32_t tv_info = combios_get_table_offset(dev, COMBIOS_TV_INFO_TABLE);
1076 if (radeon_bios8(dev_priv, tv_info + 6) == 'T') {
1077 mode_info->bios_connector[5].valid = true;
1078 mode_info->bios_connector[5].connector_type = CONNECTOR_DIN;
1079 mode_info->bios_connector[5].dac_type = DAC_TVDAC;
1080 mode_info->bios_connector[5].tmds_type = TMDS_NONE;
1081 mode_info->bios_connector[5].ddc_i2c.valid = false;
1087 DRM_DEBUG("BIOS Connector table\n");
1088 for (i = 0; i < ATOM_MAX_SUPPORTED_DEVICE; i++) {
1089 if (!mode_info->bios_connector[i].valid)
1092 DRM_DEBUG("Port %d: ddc_type 0x%x, dac_type %d, tmds_type %d, connector type %d, hpd_mask %d\n",
1093 i, mode_info->bios_connector[i].ddc_i2c.mask_clk_reg,
1094 mode_info->bios_connector[i].dac_type,
1095 mode_info->bios_connector[i].tmds_type,
1096 mode_info->bios_connector[i].connector_type,
1097 mode_info->bios_connector[i].hpd_mask);
1103 static void combios_parse_mmio_table(struct drm_device *dev, uint16_t offset)
1105 struct drm_radeon_private *dev_priv = dev->dev_private;
1108 while (radeon_bios16(dev_priv, offset)) {
1109 uint16_t cmd = ((radeon_bios16(dev_priv, offset) & 0xe000) >> 13);
1110 uint32_t addr = (radeon_bios16(dev_priv, offset) & 0x1fff);
1111 uint32_t val, and_mask, or_mask;
1117 val = radeon_bios32(dev_priv, offset);
1119 RADEON_WRITE(addr, val);
1122 val = radeon_bios32(dev_priv, offset);
1124 RADEON_WRITE(addr, val);
1127 and_mask = radeon_bios32(dev_priv, offset);
1129 or_mask = radeon_bios32(dev_priv, offset);
1131 tmp = RADEON_READ(addr);
1134 RADEON_WRITE(addr, tmp);
1137 and_mask = radeon_bios32(dev_priv, offset);
1139 or_mask = radeon_bios32(dev_priv, offset);
1141 tmp = RADEON_READ(addr);
1144 RADEON_WRITE(addr, tmp);
1147 val = radeon_bios16(dev_priv, offset);
1152 val = radeon_bios16(dev_priv, offset);
1157 if (!(RADEON_READ_PLL(dev_priv, RADEON_CLK_PWRMGT_CNTL) &
1164 if ((RADEON_READ(RADEON_MC_STATUS) &
1180 static void combios_parse_pll_table(struct drm_device *dev, uint16_t offset)
1182 struct drm_radeon_private *dev_priv = dev->dev_private;
1185 while (radeon_bios8(dev_priv, offset)) {
1186 uint8_t cmd = ((radeon_bios8(dev_priv, offset) & 0xc0) >> 6);
1187 uint8_t addr = (radeon_bios8(dev_priv, offset) & 0x3f);
1188 uint32_t val, shift, tmp;
1189 uint32_t and_mask, or_mask;
1194 val = radeon_bios32(dev_priv, offset);
1196 RADEON_WRITE_PLL(dev_priv, addr, val);
1199 shift = radeon_bios8(dev_priv, offset) * 8;
1201 and_mask = radeon_bios8(dev_priv, offset) << shift;
1202 and_mask |= ~(0xff << shift);
1204 or_mask = radeon_bios8(dev_priv, offset) << shift;
1206 tmp = RADEON_READ_PLL(dev_priv, addr);
1209 RADEON_WRITE_PLL(dev_priv, addr, tmp);
1223 if (!(RADEON_READ_PLL(dev_priv, RADEON_CLK_PWRMGT_CNTL) &
1230 if (RADEON_READ_PLL(dev_priv, RADEON_CLK_PWRMGT_CNTL) &
1236 tmp = RADEON_READ_PLL(dev_priv, RADEON_CLK_PWRMGT_CNTL);
1237 if (tmp & RADEON_CG_NO1_DEBUG_0) {
1239 uint32_t mclk_cntl = RADEON_READ_PLL(RADEON_MCLK_CNTL);
1240 mclk_cntl &= 0xffff0000;
1241 //mclk_cntl |= 0x00001111; /* ??? */
1242 RADEON_WRITE_PLL(dev_priv, RADEON_MCLK_CNTL, mclk_cntl);
1245 RADEON_WRITE_PLL(dev_priv, RADEON_CLK_PWRMGT_CNTL,
1246 tmp & ~RADEON_CG_NO1_DEBUG_0);
1261 static void combios_parse_ram_reset_table(struct drm_device *dev, uint16_t offset)
1263 struct drm_radeon_private *dev_priv = dev->dev_private;
1267 uint8_t val = radeon_bios8(dev_priv, offset);
1268 while (val != 0xff) {
1272 uint32_t channel_complete_mask;
1274 if (radeon_is_r300(dev_priv))
1275 channel_complete_mask = R300_MEM_PWRUP_COMPLETE;
1277 channel_complete_mask = RADEON_MEM_PWRUP_COMPLETE;
1280 if ((RADEON_READ(RADEON_MEM_STR_CNTL) &
1281 channel_complete_mask) ==
1282 channel_complete_mask)
1286 uint32_t or_mask = radeon_bios16(dev_priv, offset);
1289 tmp = RADEON_READ(RADEON_MEM_SDRAM_MODE_REG);
1290 tmp &= RADEON_SDRAM_MODE_MASK;
1292 RADEON_WRITE(RADEON_MEM_SDRAM_MODE_REG, tmp);
1294 or_mask = val << 24;
1295 tmp = RADEON_READ(RADEON_MEM_SDRAM_MODE_REG);
1296 tmp &= RADEON_B3MEM_RESET_MASK;
1298 RADEON_WRITE(RADEON_MEM_SDRAM_MODE_REG, tmp);
1300 val = radeon_bios8(dev_priv, offset);
1305 void radeon_combios_dyn_clk_setup(struct drm_device *dev, int enable)
1307 uint16_t dyn_clk_info = combios_get_table_offset(dev, COMBIOS_DYN_CLK_1_TABLE);
1310 combios_parse_pll_table(dev, dyn_clk_info);
1313 void radeon_combios_asic_init(struct drm_device *dev)
1318 table = combios_get_table_offset(dev, COMBIOS_ASIC_INIT_1_TABLE);
1320 combios_parse_mmio_table(dev, table);
1323 table = combios_get_table_offset(dev, COMBIOS_PLL_INIT_TABLE);
1325 combios_parse_pll_table(dev, table);
1328 table = combios_get_table_offset(dev, COMBIOS_ASIC_INIT_2_TABLE);
1330 combios_parse_mmio_table(dev, table);
1333 table = combios_get_table_offset(dev, COMBIOS_ASIC_INIT_4_TABLE);
1335 combios_parse_mmio_table(dev, table);
1338 table = combios_get_table_offset(dev, COMBIOS_RAM_RESET_TABLE);
1340 combios_parse_ram_reset_table(dev, table);
1343 table = combios_get_table_offset(dev, COMBIOS_ASIC_INIT_3_TABLE);
1345 combios_parse_mmio_table(dev, table);
1348 table = combios_get_table_offset(dev, COMBIOS_DYN_CLK_1_TABLE);
1350 combios_parse_pll_table(dev, table);
1353 table = combios_get_table_offset(dev, COMBIOS_ASIC_INIT_5_TABLE);
1355 combios_parse_mmio_table(dev, table);
1359 void radeon_combios_initialize_bios_scratch_regs(struct drm_device *dev)
1361 struct drm_radeon_private *dev_priv = dev->dev_private;
1362 uint32_t bios_0_scratch, bios_6_scratch, bios_7_scratch;
1364 bios_0_scratch = RADEON_READ(RADEON_BIOS_0_SCRATCH);
1365 bios_6_scratch = RADEON_READ(RADEON_BIOS_6_SCRATCH);
1366 //bios_7_scratch = RADEON_READ(RADEON_BIOS_7_SCRATCH);
1368 /* let the bios control the backlight */
1369 bios_0_scratch &= ~RADEON_DRIVER_BRIGHTNESS_EN;
1371 /* tell the bios not to handle mode switching */
1372 bios_6_scratch |= (RADEON_DISPLAY_SWITCHING_DIS |
1373 RADEON_ACC_MODE_CHANGE);
1375 /* tell the bios a driver is loaded */
1376 //bios_7_scratch |= RADEON_DRV_LOADED;
1378 RADEON_WRITE(RADEON_BIOS_0_SCRATCH, bios_0_scratch);
1379 RADEON_WRITE(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
1380 //RADEON_WRITE(RADEON_BIOS_7_SCRATCH, bios_7_scratch);
1384 radeon_combios_output_lock(struct drm_encoder *encoder, bool lock)
1386 struct drm_device *dev = encoder->dev;
1387 struct drm_radeon_private *dev_priv = dev->dev_private;
1388 uint32_t bios_6_scratch;
1390 bios_6_scratch = RADEON_READ(RADEON_BIOS_6_SCRATCH);
1393 bios_6_scratch |= RADEON_DRIVER_CRITICAL;
1395 bios_6_scratch &= ~RADEON_DRIVER_CRITICAL;
1397 RADEON_WRITE(RADEON_BIOS_6_SCRATCH, bios_6_scratch);