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_TDMS_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_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_TDMS_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_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 *pll = &mode_info->pll;
433 pll_info = combios_get_table_offset(dev, COMBIOS_PLL_INFO_TABLE);
435 rev = radeon_bios8(dev_priv, pll_info);
437 pll->reference_freq = radeon_bios16(dev_priv, pll_info + 0xe);
438 pll->reference_div = radeon_bios16(dev_priv, pll_info + 0x10);
439 pll->pll_out_min = radeon_bios32(dev_priv, pll_info + 0x12);
440 pll->pll_out_max = radeon_bios32(dev_priv, pll_info + 0x16);
443 pll->pll_in_min = radeon_bios32(dev_priv, pll_info + 0x36);
444 pll->pll_in_max = radeon_bios32(dev_priv, pll_info + 0x3a);
446 pll->pll_in_min = 40;
447 pll->pll_in_max = 500;
450 pll->xclk = radeon_bios16(dev_priv, pll_info + 0x08);
452 // sclk/mclk use fixed point
453 //sclk = radeon_bios16(pll_info + 8) / 100.0;
454 //mclk = radeon_bios16(pll_info + 10) / 100.0;
455 //if (sclk == 0) sclk = 200;
456 //if (mclk == 0) mclk = 200;
463 bool radeon_combios_get_primary_dac_info(struct radeon_encoder *encoder)
465 struct drm_device *dev = encoder->base.dev;
466 struct drm_radeon_private *dev_priv = dev->dev_private;
468 uint8_t rev, bg, dac;
470 /* check CRT table */
471 dac_info = combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE);
473 rev = radeon_bios8(dev_priv, dac_info) & 0x3;
475 bg = radeon_bios8(dev_priv, dac_info + 0x2) & 0xf;
476 dac = (radeon_bios8(dev_priv, dac_info + 0x2) >> 4) & 0xf;
477 encoder->ps2_pdac_adj = (bg << 8) | (dac);
481 bg = radeon_bios8(dev_priv, dac_info + 0x2) & 0xf;
482 dac = radeon_bios8(dev_priv, dac_info + 0x3) & 0xf;
483 encoder->ps2_pdac_adj = (bg << 8) | (dac);
493 bool radeon_combios_get_tv_dac_info(struct radeon_encoder *encoder)
495 struct drm_device *dev = encoder->base.dev;
496 struct drm_radeon_private *dev_priv = dev->dev_private;
498 uint8_t rev, bg, dac;
500 /* first check TV table */
501 dac_info = combios_get_table_offset(dev, COMBIOS_TV_INFO_TABLE);
503 rev = radeon_bios8(dev_priv, dac_info + 0x3);
505 bg = radeon_bios8(dev_priv, dac_info + 0xc) & 0xf;
506 dac = radeon_bios8(dev_priv, dac_info + 0xd) & 0xf;
507 encoder->ps2_tvdac_adj = (bg << 16) | (dac << 20);
509 bg = radeon_bios8(dev_priv, dac_info + 0xe) & 0xf;
510 dac = radeon_bios8(dev_priv, dac_info + 0xf) & 0xf;
511 encoder->pal_tvdac_adj = (bg << 16) | (dac << 20);
513 bg = radeon_bios8(dev_priv, dac_info + 0x10) & 0xf;
514 dac = radeon_bios8(dev_priv, dac_info + 0x11) & 0xf;
515 encoder->ntsc_tvdac_adj = (bg << 16) | (dac << 20);
518 } else if (rev > 1) {
519 bg = radeon_bios8(dev_priv, dac_info + 0xc) & 0xf;
520 dac = (radeon_bios8(dev_priv, dac_info + 0xc) >> 4) & 0xf;
521 encoder->ps2_tvdac_adj = (bg << 16) | (dac << 20);
523 bg = radeon_bios8(dev_priv, dac_info + 0xd) & 0xf;
524 dac = (radeon_bios8(dev_priv, dac_info + 0xd) >> 4) & 0xf;
525 encoder->pal_tvdac_adj = (bg << 16) | (dac << 20);
527 bg = radeon_bios8(dev_priv, dac_info + 0xe) & 0xf;
528 dac = (radeon_bios8(dev_priv, dac_info + 0xe) >> 4) & 0xf;
529 encoder->ntsc_tvdac_adj = (bg << 16) | (dac << 20);
535 /* then check CRT table */
536 dac_info = combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE);
538 rev = radeon_bios8(dev_priv, dac_info) & 0x3;
540 bg = radeon_bios8(dev_priv, dac_info + 0x3) & 0xf;
541 dac = (radeon_bios8(dev_priv, dac_info + 0x3) >> 4) & 0xf;
542 encoder->ps2_tvdac_adj = (bg << 16) | (dac << 20);
543 encoder->pal_tvdac_adj = encoder->ps2_tvdac_adj;
544 encoder->ntsc_tvdac_adj = encoder->ps2_tvdac_adj;
548 bg = radeon_bios8(dev_priv, dac_info + 0x4) & 0xf;
549 dac = radeon_bios8(dev_priv, dac_info + 0x5) & 0xf;
550 encoder->ps2_tvdac_adj = (bg << 16) | (dac << 20);
551 encoder->pal_tvdac_adj = encoder->ps2_tvdac_adj;
552 encoder->ntsc_tvdac_adj = encoder->ps2_tvdac_adj;
562 bool radeon_combios_get_tv_info(struct radeon_encoder *encoder)
564 struct drm_device *dev = encoder->base.dev;
565 struct drm_radeon_private *dev_priv = dev->dev_private;
568 tv_info = combios_get_table_offset(dev, COMBIOS_TV_INFO_TABLE);
570 if (radeon_bios8(dev_priv, tv_info + 6) == 'T') {
571 switch (radeon_bios8(dev_priv, tv_info + 7) & 0xf) {
573 encoder->tv_std = TV_STD_NTSC;
574 DRM_INFO("Default TV standard: NTSC\n");
577 encoder->tv_std = TV_STD_PAL;
578 DRM_INFO("Default TV standard: PAL\n");
581 encoder->tv_std = TV_STD_PAL_M;
582 DRM_INFO("Default TV standard: PAL-M\n");
585 encoder->tv_std = TV_STD_PAL_60;
586 DRM_INFO("Default TV standard: PAL-60\n");
589 encoder->tv_std = TV_STD_NTSC_J;
590 DRM_INFO("Default TV standard: NTSC-J\n");
593 encoder->tv_std = TV_STD_SCART_PAL;
594 DRM_INFO("Default TV standard: SCART-PAL\n");
597 encoder->tv_std = TV_STD_NTSC;
598 DRM_INFO("Unknown TV standard; defaulting to NTSC\n");
602 switch ((radeon_bios8(dev_priv, tv_info + 9) >> 2) & 0x3) {
604 DRM_INFO("29.498928713 MHz TV ref clk\n");
607 DRM_INFO("28.636360000 MHz TV ref clk\n");
610 DRM_INFO("14.318180000 MHz TV ref clk\n");
613 DRM_INFO("27.000000000 MHz TV ref clk\n");
624 bool radeon_combios_get_lvds_info(struct radeon_encoder *encoder)
626 struct drm_device *dev = encoder->base.dev;
627 struct drm_radeon_private *dev_priv = dev->dev_private;
629 uint32_t panel_setup;
633 lcd_info = combios_get_table_offset(dev, COMBIOS_LCD_INFO_TABLE);
636 for (i = 0; i < 24; i++)
637 stmp[i] = radeon_bios8(dev_priv, lcd_info + i + 1);
640 DRM_INFO("Panel ID String: %s\n", stmp);
642 encoder->panel_xres = radeon_bios16(dev_priv, lcd_info + 25);
643 encoder->panel_yres = radeon_bios16(dev_priv, lcd_info + 27);
645 DRM_INFO("Panel Size %dx%d\n", encoder->panel_xres, encoder->panel_yres);
647 encoder->panel_vcc_delay = radeon_bios16(dev_priv, lcd_info + 44);
648 if (encoder->panel_vcc_delay > 2000 || encoder->panel_vcc_delay < 0)
649 encoder->panel_vcc_delay = 2000;
651 encoder->panel_pwr_delay = radeon_bios16(dev_priv, lcd_info + 0x24);
652 encoder->panel_digon_delay = radeon_bios16(dev_priv, lcd_info + 0x38) & 0xf;
653 encoder->panel_blon_delay = (radeon_bios16(dev_priv, lcd_info + 0x38) >> 4) & 0xf;
655 encoder->panel_ref_divider = radeon_bios16(dev_priv, lcd_info + 46);
656 encoder->panel_post_divider = radeon_bios8(dev_priv, lcd_info + 48);
657 encoder->panel_fb_divider = radeon_bios16(dev_priv, lcd_info + 49);
658 if ((encoder->panel_ref_divider != 0) &&
659 (encoder->panel_fb_divider > 3))
660 encoder->use_bios_dividers = true;
662 panel_setup = radeon_bios32(dev_priv, lcd_info + 0x39);
663 encoder->lvds_gen_cntl = 0;
664 if (panel_setup & 0x1)
665 encoder->lvds_gen_cntl |= RADEON_LVDS_PANEL_FORMAT;
667 if ((panel_setup >> 4) & 0x1)
668 encoder->lvds_gen_cntl |= RADEON_LVDS_PANEL_TYPE;
670 switch ((panel_setup >> 8) & 0x8) {
672 encoder->lvds_gen_cntl |= RADEON_LVDS_NO_FM;
675 encoder->lvds_gen_cntl |= RADEON_LVDS_2_GREY;
678 encoder->lvds_gen_cntl |= RADEON_LVDS_4_GREY;
684 if ((panel_setup >> 16) & 0x1)
685 encoder->lvds_gen_cntl |= RADEON_LVDS_FP_POL_LOW;
687 if ((panel_setup >> 17) & 0x1)
688 encoder->lvds_gen_cntl |= RADEON_LVDS_LP_POL_LOW;
690 if ((panel_setup >> 18) & 0x1)
691 encoder->lvds_gen_cntl |= RADEON_LVDS_DTM_POL_LOW;
693 if ((panel_setup >> 23) & 0x1)
694 encoder->lvds_gen_cntl |= RADEON_LVDS_BL_CLK_SEL;
696 encoder->lvds_gen_cntl |= (panel_setup & 0xf0000000);
699 for (i = 0; i < 32; i++) {
700 tmp = radeon_bios16(dev_priv, lcd_info + 64 + i * 2);
703 if ((radeon_bios16(dev_priv, tmp) == encoder->panel_xres) &&
704 (radeon_bios16(dev_priv, tmp + 2) == encoder->panel_yres)) {
705 encoder->hblank = (radeon_bios16(dev_priv, tmp + 17) -
706 radeon_bios16(dev_priv, tmp + 19)) * 8;
707 encoder->hoverplus = (radeon_bios16(dev_priv, tmp + 21) -
708 radeon_bios16(dev_priv, tmp + 19) - 1) * 8;
709 encoder->hsync_width = radeon_bios8(dev_priv, tmp + 23) * 8;
711 encoder->vblank = (radeon_bios16(dev_priv, tmp + 24) -
712 radeon_bios16(dev_priv, tmp + 26));
713 encoder->voverplus = ((radeon_bios16(dev_priv, tmp + 28) & 0x7fff) -
714 radeon_bios16(dev_priv, tmp + 26));
715 encoder->vsync_width = ((radeon_bios16(dev_priv, tmp + 28) & 0xf800) >> 11);
716 encoder->dotclock = radeon_bios16(dev_priv, tmp + 9) * 10;
722 DRM_INFO("No panel info found in BIOS\n");
727 bool radeon_combios_get_tmds_info(struct radeon_encoder *encoder)
729 struct drm_device *dev = encoder->base.dev;
730 struct drm_radeon_private *dev_priv = dev->dev_private;
735 tmds_info = combios_get_table_offset(dev, COMBIOS_DFP_INFO_TABLE);
738 ver = radeon_bios8(dev_priv, tmds_info);
739 DRM_INFO("DFP table revision: %d\n", ver);
741 n = radeon_bios8(dev_priv, tmds_info + 5) + 1;
744 for (i = 0; i < n; i++) {
745 encoder->tmds_pll[i].value = radeon_bios32(dev_priv, tmds_info + i * 10 + 0x08);
746 encoder->tmds_pll[i].freq = radeon_bios16(dev_priv, tmds_info + i * 10 + 0x10);
749 } else if (ver == 4) {
751 n = radeon_bios8(dev_priv, tmds_info + 5) + 1;
754 for (i = 0; i < n; i++) {
755 encoder->tmds_pll[i].value = radeon_bios32(dev_priv, tmds_info + stride + 0x08);
756 encoder->tmds_pll[i].freq = radeon_bios16(dev_priv, tmds_info + stride + 0x10);
766 DRM_INFO("No TMDS info found in BIOS\n");
770 static void radeon_apply_legacy_quirks(struct drm_device *dev, int bios_index)
772 struct drm_radeon_private *dev_priv = dev->dev_private;
773 struct radeon_mode_info *mode_info = &dev_priv->mode_info;
775 /* XPRESS DDC quirks */
776 if ((dev_priv->chip_family == CHIP_RS400 ||
777 dev_priv->chip_family == CHIP_RS480) &&
778 mode_info->bios_connector[bios_index].ddc_i2c.mask_clk_reg == RADEON_GPIO_CRT2_DDC) {
779 mode_info->bios_connector[bios_index].ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_MONID);
780 } else if ((dev_priv->chip_family == CHIP_RS400 ||
781 dev_priv->chip_family == CHIP_RS480) &&
782 mode_info->bios_connector[bios_index].ddc_i2c.mask_clk_reg == RADEON_GPIO_MONID) {
783 mode_info->bios_connector[bios_index].ddc_i2c.valid = true;
784 mode_info->bios_connector[bios_index].ddc_i2c.mask_clk_mask = (0x20 << 8);
785 mode_info->bios_connector[bios_index].ddc_i2c.mask_data_mask = 0x80;
786 mode_info->bios_connector[bios_index].ddc_i2c.a_clk_mask = (0x20 << 8);
787 mode_info->bios_connector[bios_index].ddc_i2c.a_data_mask = 0x80;
788 mode_info->bios_connector[bios_index].ddc_i2c.put_clk_mask = (0x20 << 8);
789 mode_info->bios_connector[bios_index].ddc_i2c.put_data_mask = 0x80;
790 mode_info->bios_connector[bios_index].ddc_i2c.get_clk_mask = (0x20 << 8);
791 mode_info->bios_connector[bios_index].ddc_i2c.get_data_mask = 0x80;
792 mode_info->bios_connector[bios_index].ddc_i2c.mask_clk_reg = RADEON_GPIOPAD_MASK;
793 mode_info->bios_connector[bios_index].ddc_i2c.mask_data_reg = RADEON_GPIOPAD_MASK;
794 mode_info->bios_connector[bios_index].ddc_i2c.a_clk_reg = RADEON_GPIOPAD_A;
795 mode_info->bios_connector[bios_index].ddc_i2c.a_data_reg = RADEON_GPIOPAD_A;
796 mode_info->bios_connector[bios_index].ddc_i2c.put_clk_reg = RADEON_GPIOPAD_EN;
797 mode_info->bios_connector[bios_index].ddc_i2c.put_data_reg = RADEON_GPIOPAD_EN;
798 mode_info->bios_connector[bios_index].ddc_i2c.get_clk_reg = RADEON_LCD_GPIO_Y_REG;
799 mode_info->bios_connector[bios_index].ddc_i2c.get_data_reg = RADEON_LCD_GPIO_Y_REG;
802 /* Certain IBM chipset RN50s have a BIOS reporting two VGAs,
803 one with VGA DDC and one with CRT2 DDC. - kill the CRT2 DDC one */
804 if (dev->pdev->device == 0x515e &&
805 dev->pdev->subsystem_vendor == 0x1014) {
806 if (mode_info->bios_connector[bios_index].connector_type == CONNECTOR_VGA &&
807 mode_info->bios_connector[bios_index].ddc_i2c.mask_clk_reg == RADEON_GPIO_CRT2_DDC) {
808 mode_info->bios_connector[bios_index].valid = false;
812 /* Some RV100 cards with 2 VGA ports show up with DVI+VGA */
813 if (dev->pdev->device == 0x5159 &&
814 dev->pdev->subsystem_vendor == 0x1002 &&
815 dev->pdev->subsystem_device == 0x013a) {
816 if (mode_info->bios_connector[bios_index].connector_type == CONNECTOR_DVI_I)
817 mode_info->bios_connector[bios_index].connector_type = CONNECTOR_VGA;
821 /* X300 card with extra non-existent DVI port */
822 if (dev->pdev->device == 0x5B60 &&
823 dev->pdev->subsystem_vendor == 0x17af &&
824 dev->pdev->subsystem_device == 0x201e &&
826 if (mode_info->bios_connector[bios_index].connector_type == CONNECTOR_DVI_I)
827 mode_info->bios_connector[bios_index].valid = false;
832 bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)
834 struct drm_radeon_private *dev_priv = dev->dev_private;
835 struct radeon_mode_info *mode_info = &dev_priv->mode_info;
836 uint32_t conn_info, entry;
838 enum radeon_combios_ddc ddc_type;
839 enum radeon_combios_connector connector_type;
843 conn_info = combios_get_table_offset(dev, COMBIOS_CONNECTOR_INFO_TABLE);
845 for (i = 0; i < 4; i++) {
846 entry = conn_info + 2 + i * 2;
848 if (!radeon_bios16(dev_priv, entry))
851 mode_info->bios_connector[i].valid = true;
853 tmp = radeon_bios16(dev_priv, entry);
855 connector_type = (tmp >> 12) & 0xf;
856 mode_info->bios_connector[i].connector_type = connector_type;
858 switch(connector_type) {
859 case CONNECTOR_PROPRIETARY_LEGACY:
860 mode_info->bios_connector[i].connector_type = CONNECTOR_DVI_D;
862 case CONNECTOR_CRT_LEGACY:
863 mode_info->bios_connector[i].connector_type = CONNECTOR_VGA;
865 case CONNECTOR_DVI_I_LEGACY:
866 mode_info->bios_connector[i].connector_type = CONNECTOR_DVI_I;
868 case CONNECTOR_DVI_D_LEGACY:
869 mode_info->bios_connector[i].connector_type = CONNECTOR_DVI_D;
871 case CONNECTOR_CTV_LEGACY:
872 mode_info->bios_connector[i].connector_type = CONNECTOR_CTV;
874 case CONNECTOR_STV_LEGACY:
875 mode_info->bios_connector[i].connector_type = CONNECTOR_STV;
878 DRM_ERROR("Unknown connector type: %d\n", connector_type);
879 mode_info->bios_connector[i].valid = false;
883 mode_info->bios_connector[i].ddc_i2c.valid = false;
885 ddc_type = (tmp >> 8) & 0xf;
888 mode_info->bios_connector[i].ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_MONID);
891 mode_info->bios_connector[i].ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC);
894 mode_info->bios_connector[i].ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC);
897 mode_info->bios_connector[i].ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_CRT2_DDC);
904 mode_info->bios_connector[i].dac_type = DAC_TVDAC;
906 mode_info->bios_connector[i].dac_type = DAC_PRIMARY;
908 if ((dev_priv->chip_family == CHIP_RS300) ||
909 (dev_priv->chip_family == CHIP_RS400) ||
910 (dev_priv->chip_family == CHIP_RS480))
911 mode_info->bios_connector[i].dac_type = DAC_TVDAC;
913 if ((tmp >> 4) & 0x1)
914 mode_info->bios_connector[i].tmds_type = TMDS_EXT;
916 mode_info->bios_connector[i].tmds_type = TMDS_INT;
918 radeon_apply_legacy_quirks(dev, i);
921 uint16_t tmds_info = combios_get_table_offset(dev, COMBIOS_DFP_INFO_TABLE);
923 DRM_DEBUG("Found DFP table, assuming DVI connector\n");
925 mode_info->bios_connector[0].valid = true;
926 mode_info->bios_connector[0].connector_type = CONNECTOR_DVI_I;
927 mode_info->bios_connector[0].dac_type = DAC_PRIMARY;
928 mode_info->bios_connector[0].tmds_type = TMDS_INT;
929 mode_info->bios_connector[0].ddc_i2c = combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC);
931 DRM_DEBUG("No connector info found\n");
936 if (dev_priv->flags & RADEON_IS_MOBILITY ||
937 dev_priv->chip_family == CHIP_RS400 ||
938 dev_priv->chip_family == CHIP_RS480) {
939 uint16_t lcd_info = combios_get_table_offset(dev, COMBIOS_LCD_INFO_TABLE);
941 uint16_t lcd_ddc_info = combios_get_table_offset(dev, COMBIOS_LCD_DDC_INFO_TABLE);
943 mode_info->bios_connector[4].valid = true;
944 mode_info->bios_connector[4].connector_type = CONNECTOR_LVDS;
945 mode_info->bios_connector[4].dac_type = DAC_NONE;
946 mode_info->bios_connector[4].tmds_type = TMDS_NONE;
947 mode_info->bios_connector[4].ddc_i2c.valid = false;
950 ddc_type = radeon_bios8(dev_priv, lcd_ddc_info + 2);
953 mode_info->bios_connector[4].ddc_i2c =
954 combios_setup_i2c_bus(RADEON_GPIO_MONID);
957 mode_info->bios_connector[4].ddc_i2c =
958 combios_setup_i2c_bus(RADEON_GPIO_DVI_DDC);
961 mode_info->bios_connector[4].ddc_i2c =
962 combios_setup_i2c_bus(RADEON_GPIO_VGA_DDC);
965 mode_info->bios_connector[4].ddc_i2c =
966 combios_setup_i2c_bus(RADEON_GPIO_CRT2_DDC);
969 mode_info->bios_connector[4].ddc_i2c =
970 combios_setup_i2c_bus(RADEON_LCD_GPIO_MASK);
971 mode_info->bios_connector[4].ddc_i2c.mask_clk_mask =
972 radeon_bios32(dev_priv, lcd_ddc_info + 3);
973 mode_info->bios_connector[4].ddc_i2c.mask_data_mask =
974 radeon_bios32(dev_priv, lcd_ddc_info + 7);
975 mode_info->bios_connector[4].ddc_i2c.a_clk_mask =
976 radeon_bios32(dev_priv, lcd_ddc_info + 3);
977 mode_info->bios_connector[4].ddc_i2c.a_data_mask =
978 radeon_bios32(dev_priv, lcd_ddc_info + 7);
979 mode_info->bios_connector[4].ddc_i2c.put_clk_mask =
980 radeon_bios32(dev_priv, lcd_ddc_info + 3);
981 mode_info->bios_connector[4].ddc_i2c.put_data_mask =
982 radeon_bios32(dev_priv, lcd_ddc_info + 7);
983 mode_info->bios_connector[4].ddc_i2c.get_clk_mask =
984 radeon_bios32(dev_priv, lcd_ddc_info + 3);
985 mode_info->bios_connector[4].ddc_i2c.get_data_mask =
986 radeon_bios32(dev_priv, lcd_ddc_info + 7);
989 mode_info->bios_connector[4].ddc_i2c =
990 combios_setup_i2c_bus(RADEON_MDGPIO_EN_REG);
991 mode_info->bios_connector[4].ddc_i2c.mask_clk_mask =
992 radeon_bios32(dev_priv, lcd_ddc_info + 3);
993 mode_info->bios_connector[4].ddc_i2c.mask_data_mask =
994 radeon_bios32(dev_priv, lcd_ddc_info + 7);
995 mode_info->bios_connector[4].ddc_i2c.a_clk_mask =
996 radeon_bios32(dev_priv, lcd_ddc_info + 3);
997 mode_info->bios_connector[4].ddc_i2c.a_data_mask =
998 radeon_bios32(dev_priv, lcd_ddc_info + 7);
999 mode_info->bios_connector[4].ddc_i2c.put_clk_mask =
1000 radeon_bios32(dev_priv, lcd_ddc_info + 3);
1001 mode_info->bios_connector[4].ddc_i2c.put_data_mask =
1002 radeon_bios32(dev_priv, lcd_ddc_info + 7);
1003 mode_info->bios_connector[4].ddc_i2c.get_clk_mask =
1004 radeon_bios32(dev_priv, lcd_ddc_info + 3);
1005 mode_info->bios_connector[4].ddc_i2c.get_data_mask =
1006 radeon_bios32(dev_priv, lcd_ddc_info + 7);
1011 DRM_DEBUG("LCD DDC Info Table found!\n");
1014 mode_info->bios_connector[4].ddc_i2c.valid = false;
1017 /* check TV table */
1018 if (dev_priv->chip_family != CHIP_R100 &&
1019 dev_priv->chip_family != CHIP_R200) {
1020 uint32_t tv_info = combios_get_table_offset(dev, COMBIOS_TV_INFO_TABLE);
1022 if (radeon_bios8(dev_priv, tv_info + 6) == 'T') {
1023 mode_info->bios_connector[5].valid = true;
1024 mode_info->bios_connector[5].connector_type = CONNECTOR_DIN;
1025 mode_info->bios_connector[5].dac_type = DAC_TVDAC;
1026 mode_info->bios_connector[5].tmds_type = TMDS_NONE;
1027 mode_info->bios_connector[5].ddc_i2c.valid = false;
1033 DRM_DEBUG("BIOS Connector table\n");
1034 for (i = 0; i < ATOM_MAX_SUPPORTED_DEVICE; i++) {
1035 if (!mode_info->bios_connector[i].valid)
1038 DRM_DEBUG("Port %d: ddc_type 0x%x, dac_type %d, tmds_type %d, connector type %d, hpd_mask %d\n",
1039 i, mode_info->bios_connector[i].ddc_i2c.mask_clk_reg,
1040 mode_info->bios_connector[i].dac_type,
1041 mode_info->bios_connector[i].tmds_type,
1042 mode_info->bios_connector[i].connector_type,
1043 mode_info->bios_connector[i].hpd_mask);
1049 static void combios_parse_mmio_table(struct drm_device *dev, uint16_t offset)
1051 struct drm_radeon_private *dev_priv = dev->dev_private;
1054 while (radeon_bios16(dev_priv, offset)) {
1055 uint16_t cmd = ((radeon_bios16(dev_priv, offset) & 0xe000) >> 13);
1056 uint32_t addr = (radeon_bios16(dev_priv, offset) & 0x1fff);
1057 uint32_t val, and_mask, or_mask;
1063 val = radeon_bios32(dev_priv, offset);
1065 RADEON_WRITE(addr, val);
1068 val = radeon_bios32(dev_priv, offset);
1070 RADEON_WRITE(addr, val);
1073 and_mask = radeon_bios32(dev_priv, offset);
1075 or_mask = radeon_bios32(dev_priv, offset);
1077 tmp = RADEON_READ(addr);
1080 RADEON_WRITE(addr, tmp);
1083 and_mask = radeon_bios32(dev_priv, offset);
1085 or_mask = radeon_bios32(dev_priv, offset);
1087 tmp = RADEON_READ(addr);
1090 RADEON_WRITE(addr, tmp);
1093 val = radeon_bios16(dev_priv, offset);
1098 val = radeon_bios16(dev_priv, offset);
1103 if (!(RADEON_READ_PLL(dev_priv, RADEON_CLK_PWRMGT_CNTL) &
1110 if ((RADEON_READ(RADEON_MC_STATUS) &
1126 static void combios_parse_pll_table(struct drm_device *dev, uint16_t offset)
1128 struct drm_radeon_private *dev_priv = dev->dev_private;
1131 while (radeon_bios8(dev_priv, offset)) {
1132 uint8_t cmd = ((radeon_bios8(dev_priv, offset) & 0xc0) >> 6);
1133 uint8_t addr = (radeon_bios8(dev_priv, offset) & 0x3f);
1134 uint32_t val, shift, tmp;
1135 uint32_t and_mask, or_mask;
1140 val = radeon_bios32(dev_priv, offset);
1142 RADEON_WRITE_PLL(dev_priv, addr, val);
1145 shift = radeon_bios8(dev_priv, offset) * 8;
1147 and_mask = radeon_bios8(dev_priv, offset) << shift;
1148 and_mask |= ~(0xff << shift);
1150 or_mask = radeon_bios8(dev_priv, offset) << shift;
1152 tmp = RADEON_READ_PLL(dev_priv, addr);
1155 RADEON_WRITE_PLL(dev_priv, addr, tmp);
1169 if (!(RADEON_READ_PLL(dev_priv, RADEON_CLK_PWRMGT_CNTL) &
1176 if (RADEON_READ_PLL(dev_priv, RADEON_CLK_PWRMGT_CNTL) &
1182 tmp = RADEON_READ_PLL(dev_priv, RADEON_CLK_PWRMGT_CNTL);
1183 if (tmp & RADEON_CG_NO1_DEBUG_0) {
1185 uint32_t mclk_cntl = RADEON_READ_PLL(RADEON_MCLK_CNTL);
1186 mclk_cntl &= 0xffff0000;
1187 //mclk_cntl |= 0x00001111; /* ??? */
1188 RADEON_WRITE_PLL(dev_priv, RADEON_MCLK_CNTL, mclk_cntl);
1191 RADEON_WRITE_PLL(dev_priv, RADEON_CLK_PWRMGT_CNTL,
1192 tmp & ~RADEON_CG_NO1_DEBUG_0);
1207 static void combios_parse_ram_reset_table(struct drm_device *dev, uint16_t offset)
1209 struct drm_radeon_private *dev_priv = dev->dev_private;
1213 uint8_t val = radeon_bios8(dev_priv, offset);
1214 while (val != 0xff) {
1218 uint32_t channel_complete_mask;
1220 if (radeon_is_r300(dev_priv))
1221 channel_complete_mask = R300_MEM_PWRUP_COMPLETE;
1223 channel_complete_mask = RADEON_MEM_PWRUP_COMPLETE;
1226 if ((RADEON_READ(RADEON_MEM_STR_CNTL) &
1227 channel_complete_mask) ==
1228 channel_complete_mask)
1232 uint32_t or_mask = radeon_bios16(dev_priv, offset);
1235 tmp = RADEON_READ(RADEON_MEM_SDRAM_MODE_REG);
1236 tmp &= RADEON_SDRAM_MODE_MASK;
1238 RADEON_WRITE(RADEON_MEM_SDRAM_MODE_REG, tmp);
1240 or_mask = val << 24;
1241 tmp = RADEON_READ(RADEON_MEM_SDRAM_MODE_REG);
1242 tmp &= RADEON_B3MEM_RESET_MASK;
1244 RADEON_WRITE(RADEON_MEM_SDRAM_MODE_REG, tmp);
1246 val = radeon_bios8(dev_priv, offset);
1251 void radeon_combios_dyn_clk_setup(struct drm_device *dev, int enable)
1253 uint16_t dyn_clk_info = combios_get_table_offset(dev, COMBIOS_DYN_CLK_1_TABLE);
1256 combios_parse_pll_table(dev, dyn_clk_info);
1259 void radeon_combios_asic_init(struct drm_device *dev)
1264 table = combios_get_table_offset(dev, COMBIOS_ASIC_INIT_1_TABLE);
1266 combios_parse_mmio_table(dev, table);
1269 table = combios_get_table_offset(dev, COMBIOS_PLL_INIT_TABLE);
1271 combios_parse_pll_table(dev, table);
1274 table = combios_get_table_offset(dev, COMBIOS_ASIC_INIT_2_TABLE);
1276 combios_parse_mmio_table(dev, table);
1279 table = combios_get_table_offset(dev, COMBIOS_ASIC_INIT_4_TABLE);
1281 combios_parse_mmio_table(dev, table);
1284 table = combios_get_table_offset(dev, COMBIOS_RAM_RESET_TABLE);
1286 combios_parse_ram_reset_table(dev, table);
1289 table = combios_get_table_offset(dev, COMBIOS_ASIC_INIT_3_TABLE);
1291 combios_parse_mmio_table(dev, table);
1294 table = combios_get_table_offset(dev, COMBIOS_DYN_CLK_1_TABLE);
1296 combios_parse_pll_table(dev, table);
1299 table = combios_get_table_offset(dev, COMBIOS_ASIC_INIT_5_TABLE);
1301 combios_parse_mmio_table(dev, table);
1305 void radeon_combios_initialize_bios_scratch_regs(struct drm_device *dev)
1307 struct drm_radeon_private *dev_priv = dev->dev_private;
1308 uint32_t bios_0_scratch, bios_6_scratch, bios_7_scratch;
1310 bios_0_scratch = RADEON_READ(RADEON_BIOS_0_SCRATCH);
1311 bios_6_scratch = RADEON_READ(RADEON_BIOS_6_SCRATCH);
1312 //bios_7_scratch = RADEON_READ(RADEON_BIOS_7_SCRATCH);
1314 /* let the bios control the backlight */
1315 bios_0_scratch &= ~RADEON_DRIVER_BRIGHTNESS_EN;
1317 /* tell the bios not to handle mode switching */
1318 bios_6_scratch |= (RADEON_DISPLAY_SWITCHING_DIS |
1319 RADEON_ACC_MODE_CHANGE);
1321 /* tell the bios a driver is loaded */
1322 //bios_7_scratch |= RADEON_DRV_LOADED;
1324 RADEON_WRITE(RADEON_BIOS_0_SCRATCH, bios_0_scratch);
1325 RADEON_WRITE(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
1326 //RADEON_WRITE(RADEON_BIOS_7_SCRATCH, bios_7_scratch);
1330 radeon_combios_output_lock(struct drm_encoder *encoder, bool lock)
1332 struct drm_device *dev = encoder->dev;
1333 struct drm_radeon_private *dev_priv = dev->dev_private;
1334 uint32_t bios_6_scratch;
1336 bios_6_scratch = RADEON_READ(RADEON_BIOS_6_SCRATCH);
1339 bios_6_scratch |= RADEON_DRIVER_CRITICAL;
1341 bios_6_scratch &= ~RADEON_DRIVER_CRITICAL;
1343 RADEON_WRITE(RADEON_BIOS_6_SCRATCH, bios_6_scratch);