1/* 2 * Copyright 2004 ATI Technologies Inc., Markham, Ontario 3 * 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining 7 * a copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation on the rights to use, copy, modify, merge, 10 * publish, distribute, sublicense, and/or sell copies of the Software, 11 * and to permit persons to whom the Software is furnished to do so, 12 * subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial 16 * portions of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21 * NON-INFRINGEMENT. IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR 22 * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 23 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25 * DEALINGS IN THE SOFTWARE. 26 */ 27 28#ifdef HAVE_CONFIG_H 29#include "config.h" 30#endif 31 32#include <string.h> 33 34#include "xf86.h" 35#include "xf86_OSproc.h" 36 37#include "atipciids.h" 38#include "radeon.h" 39#include "radeon_reg.h" 40#include "radeon_macros.h" 41#include "radeon_probe.h" 42#include "radeon_atombios.h" 43 44typedef enum 45{ 46 DDC_NONE_DETECTED, 47 DDC_MONID, 48 DDC_DVI, 49 DDC_VGA, 50 DDC_CRT2, 51 DDC_LCD, 52 DDC_GPIO, 53} RADEONLegacyDDCType; 54 55typedef enum 56{ 57 CONNECTOR_NONE_LEGACY, 58 CONNECTOR_PROPRIETARY_LEGACY, 59 CONNECTOR_CRT_LEGACY, 60 CONNECTOR_DVI_I_LEGACY, 61 CONNECTOR_DVI_D_LEGACY, 62 CONNECTOR_CTV_LEGACY, 63 CONNECTOR_STV_LEGACY, 64 CONNECTOR_UNSUPPORTED_LEGACY 65} RADEONLegacyConnectorType; 66 67static Bool 68radeon_read_bios(ScrnInfoPtr pScrn) 69{ 70 RADEONInfoPtr info = RADEONPTR(pScrn); 71 72#ifdef XSERVER_LIBPCIACCESS 73 if (pci_device_read_rom(info->PciInfo, info->VBIOS)) { 74 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 75 "Failed to read PCI ROM!\n"); 76 return FALSE; 77 } 78#else 79 xf86ReadPciBIOS(0, info->PciTag, 0, info->VBIOS, RADEON_VBIOS_SIZE); 80 if (info->VBIOS[0] != 0x55 || info->VBIOS[1] != 0xaa) { 81 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 82 "Video BIOS not detected in PCI space!\n"); 83 if (xf86IsEntityPrimary(info->pEnt->index)) { 84 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 85 "Attempting to read Video BIOS from " 86 "legacy ISA space!\n"); 87 info->BIOSAddr = 0x000c0000; 88 xf86ReadDomainMemory(info->PciTag, info->BIOSAddr, 89 RADEON_VBIOS_SIZE, info->VBIOS); 90 } 91 } 92#endif 93 if (info->VBIOS[0] != 0x55 || info->VBIOS[1] != 0xaa) 94 return FALSE; 95 else 96 return TRUE; 97} 98 99static Bool 100radeon_read_disabled_bios(ScrnInfoPtr pScrn) 101{ 102 RADEONInfoPtr info = RADEONPTR(pScrn); 103 RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); 104 unsigned char *RADEONMMIO = info->MMIO; 105 Bool ret; 106 107 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Attempting to read un-POSTed bios\n"); 108 109 if (info->ChipFamily >= CHIP_FAMILY_RV770) { 110 uint32_t viph_control = INREG(RADEON_VIPH_CONTROL); 111 uint32_t bus_cntl = INREG(RADEON_BUS_CNTL); 112 uint32_t d1vga_control = INREG(AVIVO_D1VGA_CONTROL); 113 uint32_t d2vga_control = INREG(AVIVO_D2VGA_CONTROL); 114 uint32_t vga_render_control = INREG(AVIVO_VGA_RENDER_CONTROL); 115 uint32_t rom_cntl = INREG(R600_ROM_CNTL); 116 uint32_t cg_spll_func_cntl = 0; 117 uint32_t cg_spll_status; 118 119 /* disable VIP */ 120 OUTREG(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN)); 121 122 /* enable the rom */ 123 OUTREG(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM)); 124 125 /* Disable VGA mode */ 126 OUTREG(AVIVO_D1VGA_CONTROL, (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | 127 AVIVO_DVGA_CONTROL_TIMING_SELECT))); 128 OUTREG(AVIVO_D2VGA_CONTROL, (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | 129 AVIVO_DVGA_CONTROL_TIMING_SELECT))); 130 OUTREG(AVIVO_VGA_RENDER_CONTROL, (vga_render_control & ~AVIVO_VGA_VSTATUS_CNTL_MASK)); 131 132 if (info->ChipFamily == CHIP_FAMILY_RV730) { 133 cg_spll_func_cntl = INREG(R600_CG_SPLL_FUNC_CNTL); 134 135 /* enable bypass mode */ 136 OUTREG(R600_CG_SPLL_FUNC_CNTL, (cg_spll_func_cntl | R600_SPLL_BYPASS_EN)); 137 138 /* wait for SPLL_CHG_STATUS to change to 1 */ 139 cg_spll_status = 0; 140 while (!(cg_spll_status & R600_SPLL_CHG_STATUS)) 141 cg_spll_status = INREG(R600_CG_SPLL_STATUS); 142 143 OUTREG(R600_ROM_CNTL, (rom_cntl & ~R600_SCK_OVERWRITE)); 144 } else 145 OUTREG(R600_ROM_CNTL, (rom_cntl | R600_SCK_OVERWRITE)); 146 147 ret = radeon_read_bios(pScrn); 148 149 /* restore regs */ 150 if (info->ChipFamily == CHIP_FAMILY_RV730) { 151 OUTREG(R600_CG_SPLL_FUNC_CNTL, cg_spll_func_cntl); 152 153 /* wait for SPLL_CHG_STATUS to change to 1 */ 154 cg_spll_status = 0; 155 while (!(cg_spll_status & R600_SPLL_CHG_STATUS)) 156 cg_spll_status = INREG(R600_CG_SPLL_STATUS); 157 } 158 OUTREG(RADEON_VIPH_CONTROL, viph_control); 159 OUTREG(RADEON_BUS_CNTL, bus_cntl); 160 OUTREG(AVIVO_D1VGA_CONTROL, d1vga_control); 161 OUTREG(AVIVO_D2VGA_CONTROL, d2vga_control); 162 OUTREG(AVIVO_VGA_RENDER_CONTROL, vga_render_control); 163 OUTREG(R600_ROM_CNTL, rom_cntl); 164 } else if (info->ChipFamily >= CHIP_FAMILY_R600) { 165 uint32_t viph_control = INREG(RADEON_VIPH_CONTROL); 166 uint32_t bus_cntl = INREG(RADEON_BUS_CNTL); 167 uint32_t d1vga_control = INREG(AVIVO_D1VGA_CONTROL); 168 uint32_t d2vga_control = INREG(AVIVO_D2VGA_CONTROL); 169 uint32_t vga_render_control = INREG(AVIVO_VGA_RENDER_CONTROL); 170 uint32_t rom_cntl = INREG(R600_ROM_CNTL); 171 uint32_t general_pwrmgt = INREG(R600_GENERAL_PWRMGT); 172 uint32_t low_vid_lower_gpio_cntl = INREG(R600_LOW_VID_LOWER_GPIO_CNTL); 173 uint32_t medium_vid_lower_gpio_cntl = INREG(R600_MEDIUM_VID_LOWER_GPIO_CNTL); 174 uint32_t high_vid_lower_gpio_cntl = INREG(R600_HIGH_VID_LOWER_GPIO_CNTL); 175 uint32_t ctxsw_vid_lower_gpio_cntl = INREG(R600_CTXSW_VID_LOWER_GPIO_CNTL); 176 uint32_t lower_gpio_enable = INREG(R600_LOWER_GPIO_ENABLE); 177 178 /* disable VIP */ 179 OUTREG(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN)); 180 181 /* enable the rom */ 182 OUTREG(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM)); 183 184 /* Disable VGA mode */ 185 OUTREG(AVIVO_D1VGA_CONTROL, (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | 186 AVIVO_DVGA_CONTROL_TIMING_SELECT))); 187 OUTREG(AVIVO_D2VGA_CONTROL, (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | 188 AVIVO_DVGA_CONTROL_TIMING_SELECT))); 189 OUTREG(AVIVO_VGA_RENDER_CONTROL, (vga_render_control & ~AVIVO_VGA_VSTATUS_CNTL_MASK)); 190 191 OUTREG(R600_ROM_CNTL, ((rom_cntl & ~R600_SCK_PRESCALE_CRYSTAL_CLK_MASK) | 192 (1 << R600_SCK_PRESCALE_CRYSTAL_CLK_SHIFT) | 193 R600_SCK_OVERWRITE)); 194 195 OUTREG(R600_GENERAL_PWRMGT, (general_pwrmgt & ~R600_OPEN_DRAIN_PADS)); 196 197 OUTREG(R600_LOW_VID_LOWER_GPIO_CNTL, (low_vid_lower_gpio_cntl & ~0x400)); 198 199 OUTREG(R600_MEDIUM_VID_LOWER_GPIO_CNTL, (medium_vid_lower_gpio_cntl & ~0x400)); 200 201 OUTREG(R600_HIGH_VID_LOWER_GPIO_CNTL, (high_vid_lower_gpio_cntl & ~0x400)); 202 203 OUTREG(R600_CTXSW_VID_LOWER_GPIO_CNTL, (ctxsw_vid_lower_gpio_cntl & ~0x400)); 204 205 OUTREG(R600_LOWER_GPIO_ENABLE, (lower_gpio_enable | 0x400)); 206 207 ret = radeon_read_bios(pScrn); 208 209 /* restore regs */ 210 OUTREG(RADEON_VIPH_CONTROL, viph_control); 211 OUTREG(RADEON_BUS_CNTL, bus_cntl); 212 OUTREG(AVIVO_D1VGA_CONTROL, d1vga_control); 213 OUTREG(AVIVO_D2VGA_CONTROL, d2vga_control); 214 OUTREG(AVIVO_VGA_RENDER_CONTROL, vga_render_control); 215 OUTREG(R600_ROM_CNTL, rom_cntl); 216 OUTREG(R600_GENERAL_PWRMGT, general_pwrmgt); 217 OUTREG(R600_LOW_VID_LOWER_GPIO_CNTL, low_vid_lower_gpio_cntl); 218 OUTREG(R600_MEDIUM_VID_LOWER_GPIO_CNTL, medium_vid_lower_gpio_cntl); 219 OUTREG(R600_HIGH_VID_LOWER_GPIO_CNTL, high_vid_lower_gpio_cntl); 220 OUTREG(R600_CTXSW_VID_LOWER_GPIO_CNTL, ctxsw_vid_lower_gpio_cntl); 221 OUTREG(R600_LOWER_GPIO_ENABLE, lower_gpio_enable); 222 223 } else if (info->ChipFamily >= CHIP_FAMILY_RV515) { 224 uint32_t seprom_cntl1 = INREG(RADEON_SEPROM_CNTL1); 225 uint32_t viph_control = INREG(RADEON_VIPH_CONTROL); 226 uint32_t bus_cntl = INREG(RADEON_BUS_CNTL); 227 uint32_t d1vga_control = INREG(AVIVO_D1VGA_CONTROL); 228 uint32_t d2vga_control = INREG(AVIVO_D2VGA_CONTROL); 229 uint32_t vga_render_control = INREG(AVIVO_VGA_RENDER_CONTROL); 230 uint32_t gpiopad_a = INREG(RADEON_GPIOPAD_A); 231 uint32_t gpiopad_en = INREG(RADEON_GPIOPAD_EN); 232 uint32_t gpiopad_mask = INREG(RADEON_GPIOPAD_MASK); 233 234 OUTREG(RADEON_SEPROM_CNTL1, ((seprom_cntl1 & ~RADEON_SCK_PRESCALE_MASK) | 235 (0xc << RADEON_SCK_PRESCALE_SHIFT))); 236 237 OUTREG(RADEON_GPIOPAD_A, 0); 238 OUTREG(RADEON_GPIOPAD_EN, 0); 239 OUTREG(RADEON_GPIOPAD_MASK, 0); 240 241 /* disable VIP */ 242 OUTREG(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN)); 243 244 /* enable the rom */ 245 OUTREG(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM)); 246 247 /* Disable VGA mode */ 248 OUTREG(AVIVO_D1VGA_CONTROL, (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | 249 AVIVO_DVGA_CONTROL_TIMING_SELECT))); 250 OUTREG(AVIVO_D2VGA_CONTROL, (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | 251 AVIVO_DVGA_CONTROL_TIMING_SELECT))); 252 OUTREG(AVIVO_VGA_RENDER_CONTROL, (vga_render_control & ~AVIVO_VGA_VSTATUS_CNTL_MASK)); 253 254 ret = radeon_read_bios(pScrn); 255 256 /* restore regs */ 257 OUTREG(RADEON_SEPROM_CNTL1, seprom_cntl1); 258 OUTREG(RADEON_VIPH_CONTROL, viph_control); 259 OUTREG(RADEON_BUS_CNTL, bus_cntl); 260 OUTREG(AVIVO_D1VGA_CONTROL, d1vga_control); 261 OUTREG(AVIVO_D2VGA_CONTROL, d2vga_control); 262 OUTREG(AVIVO_VGA_RENDER_CONTROL, vga_render_control); 263 OUTREG(RADEON_GPIOPAD_A, gpiopad_a); 264 OUTREG(RADEON_GPIOPAD_EN, gpiopad_en); 265 OUTREG(RADEON_GPIOPAD_MASK, gpiopad_mask); 266 267 } else { 268 uint32_t seprom_cntl1 = INREG(RADEON_SEPROM_CNTL1); 269 uint32_t viph_control = INREG(RADEON_VIPH_CONTROL); 270 uint32_t bus_cntl = INREG(RADEON_BUS_CNTL); 271 uint32_t crtc_gen_cntl = INREG(RADEON_CRTC_GEN_CNTL); 272 uint32_t crtc2_gen_cntl = 0; 273 uint32_t crtc_ext_cntl = INREG(RADEON_CRTC_EXT_CNTL); 274 uint32_t fp2_gen_cntl = 0; 275 276 if (PCI_DEV_DEVICE_ID(info->PciInfo) == PCI_CHIP_RV100_QY) 277 fp2_gen_cntl = INREG(RADEON_FP2_GEN_CNTL); 278 279 if (pRADEONEnt->HasCRTC2) 280 crtc2_gen_cntl = INREG(RADEON_CRTC2_GEN_CNTL); 281 282 OUTREG(RADEON_SEPROM_CNTL1, ((seprom_cntl1 & ~RADEON_SCK_PRESCALE_MASK) | 283 (0xc << RADEON_SCK_PRESCALE_SHIFT))); 284 285 /* disable VIP */ 286 OUTREG(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN)); 287 288 /* enable the rom */ 289 OUTREG(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM)); 290 291 /* Turn off mem requests and CRTC for both controllers */ 292 OUTREG(RADEON_CRTC_GEN_CNTL, ((crtc_gen_cntl & ~RADEON_CRTC_EN) | 293 (RADEON_CRTC_DISP_REQ_EN_B | 294 RADEON_CRTC_EXT_DISP_EN))); 295 if (pRADEONEnt->HasCRTC2) 296 OUTREG(RADEON_CRTC2_GEN_CNTL, ((crtc2_gen_cntl & ~RADEON_CRTC2_EN) | 297 RADEON_CRTC2_DISP_REQ_EN_B)); 298 299 /* Turn off CRTC */ 300 OUTREG(RADEON_CRTC_EXT_CNTL, ((crtc_ext_cntl & ~RADEON_CRTC_CRT_ON) | 301 (RADEON_CRTC_SYNC_TRISTAT | 302 RADEON_CRTC_DISPLAY_DIS))); 303 304 if (PCI_DEV_DEVICE_ID(info->PciInfo) == PCI_CHIP_RV100_QY) 305 OUTREG(RADEON_FP2_GEN_CNTL, (fp2_gen_cntl & ~RADEON_FP2_ON)); 306 307 ret = radeon_read_bios(pScrn); 308 309 /* restore regs */ 310 OUTREG(RADEON_SEPROM_CNTL1, seprom_cntl1); 311 OUTREG(RADEON_VIPH_CONTROL, viph_control); 312 OUTREG(RADEON_BUS_CNTL, bus_cntl); 313 OUTREG(RADEON_CRTC_GEN_CNTL, crtc_gen_cntl); 314 if (pRADEONEnt->HasCRTC2) 315 OUTREG(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); 316 OUTREG(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl); 317 if (PCI_DEV_DEVICE_ID(info->PciInfo) == PCI_CHIP_RV100_QY) 318 OUTREG(RADEON_FP2_GEN_CNTL, fp2_gen_cntl); 319 } 320 return ret; 321} 322 323Bool 324radeon_card_posted(ScrnInfoPtr pScrn) 325{ 326 RADEONInfoPtr info = RADEONPTR(pScrn); 327 unsigned char *RADEONMMIO = info->MMIO; 328 uint32_t reg; 329 330 /* first check CRTCs */ 331 if (IS_AVIVO_VARIANT) { 332 reg = INREG(AVIVO_D1CRTC_CONTROL) | INREG(AVIVO_D2CRTC_CONTROL); 333 if (reg & AVIVO_CRTC_EN) 334 return TRUE; 335 } else { 336 reg = INREG(RADEON_CRTC_GEN_CNTL) | INREG(RADEON_CRTC2_GEN_CNTL); 337 if (reg & RADEON_CRTC_EN) 338 return TRUE; 339 } 340 341 /* then check MEM_SIZE, in case something turned the crtcs off */ 342 if (info->ChipFamily >= CHIP_FAMILY_R600) 343 reg = INREG(R600_CONFIG_MEMSIZE); 344 else 345 reg = INREG(RADEON_CONFIG_MEMSIZE); 346 347 if (reg) 348 return TRUE; 349 350 return FALSE; 351} 352 353/* Read the Video BIOS block and the FP registers (if applicable). */ 354Bool 355RADEONGetBIOSInfo(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10) 356{ 357 RADEONInfoPtr info = RADEONPTR(pScrn); 358 int tmp; 359 unsigned short dptr; 360 361#ifdef XSERVER_LIBPCIACCESS 362 int size = info->PciInfo->rom_size > RADEON_VBIOS_SIZE ? info->PciInfo->rom_size : RADEON_VBIOS_SIZE; 363 info->VBIOS = malloc(size); 364#else 365 info->VBIOS = malloc(RADEON_VBIOS_SIZE); 366#endif 367 if (!info->VBIOS) { 368 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 369 "Cannot allocate space for hold Video BIOS!\n"); 370 return FALSE; 371 } else { 372 if (pInt10) { 373 info->BIOSAddr = pInt10->BIOSseg << 4; 374 (void)memcpy(info->VBIOS, xf86int10Addr(pInt10, info->BIOSAddr), 375 RADEON_VBIOS_SIZE); 376 } else if (!radeon_read_bios(pScrn)) 377 (void)radeon_read_disabled_bios(pScrn); 378 } 379 380 if (info->VBIOS[0] != 0x55 || info->VBIOS[1] != 0xaa) { 381 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 382 "Unrecognized BIOS signature, BIOS data will not be used\n"); 383 free (info->VBIOS); 384 info->VBIOS = NULL; 385 return FALSE; 386 } 387 388 /* Verify it's an x86 BIOS not OF firmware, copied from radeonfb */ 389 dptr = RADEON_BIOS16(0x18); 390 /* If PCI data signature is wrong assume x86 video BIOS anyway */ 391 if (RADEON_BIOS32(dptr) != (('R' << 24) | ('I' << 16) | ('C' << 8) | 'P')) { 392 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 393 "ROM PCI data signature incorrect, ignoring\n"); 394 } 395 else if (info->VBIOS[dptr + 0x14] != 0x0) { 396 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 397 "Not an x86 BIOS ROM image, BIOS data will not be used\n"); 398 free (info->VBIOS); 399 info->VBIOS = NULL; 400 return FALSE; 401 } 402 403 if (info->VBIOS) info->ROMHeaderStart = RADEON_BIOS16(0x48); 404 405 if(!info->ROMHeaderStart) { 406 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 407 "Invalid ROM pointer, BIOS data will not be used\n"); 408 free (info->VBIOS); 409 info->VBIOS = NULL; 410 return FALSE; 411 } 412 413 tmp = info->ROMHeaderStart + 4; 414 if ((RADEON_BIOS8(tmp) == 'A' && 415 RADEON_BIOS8(tmp+1) == 'T' && 416 RADEON_BIOS8(tmp+2) == 'O' && 417 RADEON_BIOS8(tmp+3) == 'M') || 418 (RADEON_BIOS8(tmp) == 'M' && 419 RADEON_BIOS8(tmp+1) == 'O' && 420 RADEON_BIOS8(tmp+2) == 'T' && 421 RADEON_BIOS8(tmp+3) == 'A')) 422 info->IsAtomBios = TRUE; 423 else 424 info->IsAtomBios = FALSE; 425 426 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s BIOS detected\n", 427 info->IsAtomBios ? "ATOM":"Legacy"); 428 429 if (info->IsAtomBios) { 430 AtomBiosArgRec atomBiosArg; 431 432 if (RHDAtomBiosFunc(pScrn, NULL, ATOMBIOS_INIT, &atomBiosArg) 433 == ATOM_SUCCESS) { 434 info->atomBIOS = atomBiosArg.atomhandle; 435 } 436 437 atomBiosArg.fb.start = info->FbFreeStart; 438 atomBiosArg.fb.size = info->FbFreeSize; 439 if (RHDAtomBiosFunc(pScrn, info->atomBIOS, ATOMBIOS_ALLOCATE_FB_SCRATCH, 440 &atomBiosArg) == ATOM_SUCCESS) { 441 442 info->FbFreeStart = atomBiosArg.fb.start; 443 info->FbFreeSize = atomBiosArg.fb.size; 444 } 445 446 RHDAtomBiosFunc(pScrn, info->atomBIOS, GET_DEFAULT_ENGINE_CLOCK, 447 &atomBiosArg); 448 RHDAtomBiosFunc(pScrn, info->atomBIOS, GET_DEFAULT_MEMORY_CLOCK, 449 &atomBiosArg); 450 RHDAtomBiosFunc(pScrn, info->atomBIOS, 451 GET_MAX_PIXEL_CLOCK_PLL_OUTPUT, &atomBiosArg); 452 RHDAtomBiosFunc(pScrn, info->atomBIOS, 453 GET_MIN_PIXEL_CLOCK_PLL_OUTPUT, &atomBiosArg); 454 RHDAtomBiosFunc(pScrn, info->atomBIOS, 455 GET_MAX_PIXEL_CLOCK_PLL_INPUT, &atomBiosArg); 456 RHDAtomBiosFunc(pScrn, info->atomBIOS, 457 GET_MIN_PIXEL_CLOCK_PLL_INPUT, &atomBiosArg); 458 RHDAtomBiosFunc(pScrn, info->atomBIOS, 459 GET_MAX_PIXEL_CLK, &atomBiosArg); 460 RHDAtomBiosFunc(pScrn, info->atomBIOS, 461 GET_REF_CLOCK, &atomBiosArg); 462 463 info->MasterDataStart = RADEON_BIOS16 (info->ROMHeaderStart + 32); 464 } 465 466 /* We are a bit too quick at using this "unposted" to re-post the 467 * card. This causes some problems with VT switch on some machines, 468 * so let's work around this for now by only POSTing if none of the 469 * CRTCs are enabled 470 */ 471 if ((!radeon_card_posted(pScrn)) && info->VBIOS) { 472 if (info->IsAtomBios) { 473 if (!rhdAtomASICInit(info->atomBIOS)) 474 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 475 "%s: AsicInit failed.\n",__func__); 476 } else { 477#if 0 478 /* FIX ME */ 479 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Attempting to POST via legacy BIOS tables\n"); 480 RADEONGetBIOSInitTableOffsets(pScrn); 481 RADEONPostCardFromBIOSTables(pScrn); 482#endif 483 } 484 } 485 486 return TRUE; 487} 488 489static Bool RADEONGetATOMConnectorInfoFromBIOS (ScrnInfoPtr pScrn) 490{ 491 RADEONInfoPtr info = RADEONPTR (pScrn); 492 493 if (!info->VBIOS) return FALSE; 494 495 if (RADEONGetATOMConnectorInfoFromBIOSObject(pScrn)) 496 return TRUE; 497 498 if (RADEONGetATOMConnectorInfoFromBIOSConnectorTable(pScrn)) 499 return TRUE; 500 501 return FALSE; 502} 503 504static void RADEONApplyLegacyQuirks(ScrnInfoPtr pScrn, int index) 505{ 506 RADEONInfoPtr info = RADEONPTR (pScrn); 507 508 /* XPRESS DDC quirks */ 509 if ((info->ChipFamily == CHIP_FAMILY_RS400 || 510 info->ChipFamily == CHIP_FAMILY_RS480) && 511 info->BiosConnector[index].ddc_i2c.mask_clk_reg == RADEON_GPIO_CRT2_DDC) { 512 info->BiosConnector[index].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_MONID); 513 } else if ((info->ChipFamily == CHIP_FAMILY_RS400 || 514 info->ChipFamily == CHIP_FAMILY_RS480) && 515 info->BiosConnector[index].ddc_i2c.mask_clk_reg == RADEON_GPIO_MONID) { 516 info->BiosConnector[index].ddc_i2c.valid = TRUE; 517 info->BiosConnector[index].ddc_i2c.mask_clk_mask = (0x20 << 8); 518 info->BiosConnector[index].ddc_i2c.mask_data_mask = 0x80; 519 info->BiosConnector[index].ddc_i2c.a_clk_mask = (0x20 << 8); 520 info->BiosConnector[index].ddc_i2c.a_data_mask = 0x80; 521 info->BiosConnector[index].ddc_i2c.put_clk_mask = (0x20 << 8); 522 info->BiosConnector[index].ddc_i2c.put_data_mask = 0x80; 523 info->BiosConnector[index].ddc_i2c.get_clk_mask = (0x20 << 8); 524 info->BiosConnector[index].ddc_i2c.get_data_mask = 0x80; 525 info->BiosConnector[index].ddc_i2c.mask_clk_reg = RADEON_GPIOPAD_MASK; 526 info->BiosConnector[index].ddc_i2c.mask_data_reg = RADEON_GPIOPAD_MASK; 527 info->BiosConnector[index].ddc_i2c.a_clk_reg = RADEON_GPIOPAD_A; 528 info->BiosConnector[index].ddc_i2c.a_data_reg = RADEON_GPIOPAD_A; 529 info->BiosConnector[index].ddc_i2c.put_clk_reg = RADEON_GPIOPAD_EN; 530 info->BiosConnector[index].ddc_i2c.put_data_reg = RADEON_GPIOPAD_EN; 531 info->BiosConnector[index].ddc_i2c.get_clk_reg = RADEON_LCD_GPIO_Y_REG; 532 info->BiosConnector[index].ddc_i2c.get_data_reg = RADEON_LCD_GPIO_Y_REG; 533 } 534 535 /* R3xx+ chips don't have GPIO_CRT2_DDC gpio pad */ 536 if ((IS_R300_VARIANT) && 537 info->BiosConnector[index].ddc_i2c.mask_clk_reg == RADEON_GPIO_CRT2_DDC) 538 info->BiosConnector[index].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_DVI_DDC); 539 540 /* Certain IBM chipset RN50s have a BIOS reporting two VGAs, 541 one with VGA DDC and one with CRT2 DDC. - kill the CRT2 DDC one */ 542 if (info->Chipset == PCI_CHIP_RN50_515E && 543 PCI_SUB_VENDOR_ID(info->PciInfo) == 0x1014) { 544 if (info->BiosConnector[index].ConnectorType == CONNECTOR_VGA && 545 info->BiosConnector[index].ddc_i2c.mask_clk_reg == RADEON_GPIO_CRT2_DDC) { 546 info->BiosConnector[index].valid = FALSE; 547 } 548 } 549 550 /* X300 card with extra non-existent DVI port */ 551 if (info->Chipset == PCI_CHIP_RV370_5B60 && 552 PCI_SUB_VENDOR_ID(info->PciInfo) == 0x17af && 553 PCI_SUB_DEVICE_ID(info->PciInfo) == 0x201e && 554 index == 2) { 555 if (info->BiosConnector[index].ConnectorType == CONNECTOR_DVI_I) { 556 info->BiosConnector[index].valid = FALSE; 557 } 558 } 559 560 /* r200 card with primary dac routed to both VGA and DVI - disable load detection 561 * otherwise you end up detecing load if either port is attached 562 */ 563 if (info->Chipset == PCI_CHIP_R200_QL && 564 PCI_SUB_VENDOR_ID(info->PciInfo) == 0x1569 && 565 PCI_SUB_DEVICE_ID(info->PciInfo) == 0x514c && 566 (info->BiosConnector[index].devices & ATOM_DEVICE_CRT1_SUPPORT)) { 567 info->BiosConnector[index].load_detection = FALSE; 568 } 569 570} 571 572static Bool RADEONGetLegacyConnectorInfoFromBIOS (ScrnInfoPtr pScrn) 573{ 574 RADEONInfoPtr info = RADEONPTR (pScrn); 575 int offset, i, entry, tmp, tmp0, tmp1; 576 RADEONLegacyDDCType DDCType; 577 RADEONLegacyConnectorType ConnectorType; 578 579 if (!info->VBIOS) return FALSE; 580 581 offset = RADEON_BIOS16(info->ROMHeaderStart + 0x50); 582 if (offset) { 583 for (i = 0; i < 4; i++) { 584 entry = offset + 2 + i*2; 585 586 if (!RADEON_BIOS16(entry)) { 587 break; 588 } 589 info->BiosConnector[i].valid = TRUE; 590 tmp = RADEON_BIOS16(entry); 591 info->BiosConnector[i].ConnectorType = (tmp >> 12) & 0xf; 592 ConnectorType = (tmp >> 12) & 0xf; 593 switch (ConnectorType) { 594 case CONNECTOR_PROPRIETARY_LEGACY: 595 info->BiosConnector[i].ConnectorType = CONNECTOR_DVI_D; 596 if ((tmp >> 4) & 0x1) { 597 info->BiosConnector[i].devices |= ATOM_DEVICE_DFP2_SUPPORT; 598 if (!radeon_add_encoder(pScrn, 599 radeon_get_encoder_id_from_supported_device(pScrn, 600 ATOM_DEVICE_DFP2_SUPPORT, 601 0), 602 ATOM_DEVICE_DFP2_SUPPORT)) 603 return FALSE; 604 } else { 605 info->BiosConnector[i].devices |= ATOM_DEVICE_DFP1_SUPPORT; 606 if (!radeon_add_encoder(pScrn, 607 radeon_get_encoder_id_from_supported_device(pScrn, 608 ATOM_DEVICE_DFP1_SUPPORT, 609 0), 610 ATOM_DEVICE_DFP1_SUPPORT)) 611 return FALSE; 612 } 613 break; 614 case CONNECTOR_CRT_LEGACY: 615 info->BiosConnector[i].ConnectorType = CONNECTOR_VGA; 616 if (tmp & 0x1) { 617 info->BiosConnector[i].load_detection = FALSE; 618 info->BiosConnector[i].devices |= ATOM_DEVICE_CRT2_SUPPORT; 619 if (!radeon_add_encoder(pScrn, 620 radeon_get_encoder_id_from_supported_device(pScrn, 621 ATOM_DEVICE_CRT2_SUPPORT, 622 2), 623 ATOM_DEVICE_CRT2_SUPPORT)) 624 return FALSE; 625 } else { 626 info->BiosConnector[i].load_detection = TRUE; 627 info->BiosConnector[i].devices |= ATOM_DEVICE_CRT1_SUPPORT; 628 if (!radeon_add_encoder(pScrn, 629 radeon_get_encoder_id_from_supported_device(pScrn, 630 ATOM_DEVICE_CRT1_SUPPORT, 631 1), 632 ATOM_DEVICE_CRT1_SUPPORT)) 633 return FALSE; 634 } 635 break; 636 case CONNECTOR_DVI_I_LEGACY: 637 info->BiosConnector[i].ConnectorType = CONNECTOR_DVI_I; 638 if (tmp & 0x1) { 639 info->BiosConnector[i].load_detection = FALSE; 640 info->BiosConnector[i].devices |= ATOM_DEVICE_CRT2_SUPPORT; 641 if (!radeon_add_encoder(pScrn, 642 radeon_get_encoder_id_from_supported_device(pScrn, 643 ATOM_DEVICE_CRT2_SUPPORT, 644 2), 645 ATOM_DEVICE_CRT2_SUPPORT)) 646 return FALSE; 647 } else { 648 info->BiosConnector[i].load_detection = TRUE; 649 info->BiosConnector[i].devices |= ATOM_DEVICE_CRT1_SUPPORT; 650 if (!radeon_add_encoder(pScrn, 651 radeon_get_encoder_id_from_supported_device(pScrn, 652 ATOM_DEVICE_CRT1_SUPPORT, 653 1), 654 ATOM_DEVICE_CRT1_SUPPORT)) 655 return FALSE; 656 } 657 if ((tmp >> 4) & 0x1) { 658 info->BiosConnector[i].devices |= ATOM_DEVICE_DFP2_SUPPORT; 659 if (!radeon_add_encoder(pScrn, 660 radeon_get_encoder_id_from_supported_device(pScrn, 661 ATOM_DEVICE_DFP2_SUPPORT, 662 0), 663 ATOM_DEVICE_DFP2_SUPPORT)) 664 return FALSE; 665 } else { 666 info->BiosConnector[i].devices |= ATOM_DEVICE_DFP1_SUPPORT; 667 if (!radeon_add_encoder(pScrn, 668 radeon_get_encoder_id_from_supported_device(pScrn, 669 ATOM_DEVICE_DFP1_SUPPORT, 670 0), 671 ATOM_DEVICE_DFP1_SUPPORT)) 672 return FALSE; 673 } 674 break; 675 case CONNECTOR_DVI_D_LEGACY: 676 info->BiosConnector[i].ConnectorType = CONNECTOR_DVI_D; 677 if ((tmp >> 4) & 0x1) { 678 info->BiosConnector[i].devices |= ATOM_DEVICE_DFP2_SUPPORT; 679 if (!radeon_add_encoder(pScrn, 680 radeon_get_encoder_id_from_supported_device(pScrn, 681 ATOM_DEVICE_DFP2_SUPPORT, 682 0), 683 ATOM_DEVICE_DFP2_SUPPORT)) 684 return FALSE; 685 } else { 686 info->BiosConnector[i].devices |= ATOM_DEVICE_DFP1_SUPPORT; 687 if (!radeon_add_encoder(pScrn, 688 radeon_get_encoder_id_from_supported_device(pScrn, 689 ATOM_DEVICE_DFP1_SUPPORT, 690 0), 691 ATOM_DEVICE_DFP1_SUPPORT)) 692 return FALSE; 693 } 694 break; 695 case CONNECTOR_CTV_LEGACY: 696 info->BiosConnector[i].ConnectorType = CONNECTOR_CTV; 697 info->BiosConnector[i].load_detection = FALSE; 698 info->BiosConnector[i].devices = ATOM_DEVICE_TV1_SUPPORT; 699 if (!radeon_add_encoder(pScrn, 700 radeon_get_encoder_id_from_supported_device(pScrn, 701 ATOM_DEVICE_TV1_SUPPORT, 702 2), 703 ATOM_DEVICE_TV1_SUPPORT)) 704 return FALSE; 705 break; 706 case CONNECTOR_STV_LEGACY: 707 info->BiosConnector[i].ConnectorType = CONNECTOR_STV; 708 info->BiosConnector[i].load_detection = FALSE; 709 info->BiosConnector[i].devices = ATOM_DEVICE_TV1_SUPPORT; 710 if (!radeon_add_encoder(pScrn, 711 radeon_get_encoder_id_from_supported_device(pScrn, 712 ATOM_DEVICE_TV1_SUPPORT, 713 2), 714 ATOM_DEVICE_TV1_SUPPORT)) 715 return FALSE; 716 break; 717 default: 718 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unknown Connector Type: %d\n", ConnectorType); 719 info->BiosConnector[i].valid = FALSE; 720 break; 721 } 722 723 info->BiosConnector[i].ddc_i2c.valid = FALSE; 724 725 DDCType = (tmp >> 8) & 0xf; 726 switch (DDCType) { 727 case DDC_MONID: 728 info->BiosConnector[i].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_MONID); 729 break; 730 case DDC_DVI: 731 info->BiosConnector[i].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_DVI_DDC); 732 break; 733 case DDC_VGA: 734 info->BiosConnector[i].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_VGA_DDC); 735 break; 736 case DDC_CRT2: 737 info->BiosConnector[i].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_CRT2_DDC); 738 break; 739 default: 740 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unknown DDC Type: %d\n", DDCType); 741 break; 742 } 743 744 RADEONApplyLegacyQuirks(pScrn, i); 745 746 } 747 } else { 748 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "No Connector Info Table found!\n"); 749 750 /* old radeons and r128 didn't use connector tables you just check 751 * for LVDS, DVI, TV, etc. tables 752 */ 753 offset = RADEON_BIOS16(info->ROMHeaderStart + 0x34); 754 if (offset) { 755 xf86DrvMsg(pScrn->scrnIndex, X_INFO, 756 "Found DFP table, assuming DVI connector\n"); 757 info->BiosConnector[0].valid = TRUE; 758 info->BiosConnector[0].ConnectorType = CONNECTOR_DVI_I; 759 info->BiosConnector[0].load_detection = TRUE; 760 info->BiosConnector[0].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_DVI_DDC); 761 info->BiosConnector[0].devices = ATOM_DEVICE_CRT1_SUPPORT | ATOM_DEVICE_DFP1_SUPPORT; 762 if (!radeon_add_encoder(pScrn, 763 radeon_get_encoder_id_from_supported_device(pScrn, 764 ATOM_DEVICE_DFP1_SUPPORT, 765 0), 766 ATOM_DEVICE_DFP1_SUPPORT)) 767 return FALSE; 768 if (!radeon_add_encoder(pScrn, 769 radeon_get_encoder_id_from_supported_device(pScrn, 770 ATOM_DEVICE_CRT1_SUPPORT, 771 1), 772 ATOM_DEVICE_CRT1_SUPPORT)) 773 return FALSE; 774 } else 775 return FALSE; 776 } 777 778 /* check LVDS table */ 779 /* IGP can be mobile or desktop so check the connectors */ 780 if (info->IsMobility || info->IsIGP) { 781 offset = RADEON_BIOS16(info->ROMHeaderStart + 0x40); 782 if (offset) { 783 info->BiosConnector[4].valid = TRUE; 784 info->BiosConnector[4].ConnectorType = CONNECTOR_LVDS; 785 info->BiosConnector[4].ddc_i2c.valid = FALSE; 786 787 info->BiosConnector[4].devices = ATOM_DEVICE_LCD1_SUPPORT; 788 if (!radeon_add_encoder(pScrn, 789 radeon_get_encoder_id_from_supported_device(pScrn, 790 ATOM_DEVICE_LCD1_SUPPORT, 791 0), 792 ATOM_DEVICE_LCD1_SUPPORT)) 793 return FALSE; 794 795 tmp = RADEON_BIOS16(info->ROMHeaderStart + 0x42); 796 if (tmp) { 797 tmp0 = RADEON_BIOS16(tmp + 0x15); 798 if (tmp0) { 799 tmp1 = RADEON_BIOS8(tmp0+2) & 0x07; 800 if (tmp1) { 801 DDCType = tmp1; 802 switch (DDCType) { 803 case DDC_NONE_DETECTED: 804 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "No DDC for LCD\n"); 805 break; 806 case DDC_MONID: 807 info->BiosConnector[4].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_MONID); 808 break; 809 case DDC_DVI: 810 info->BiosConnector[4].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_DVI_DDC); 811 break; 812 case DDC_VGA: 813 info->BiosConnector[4].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_VGA_DDC); 814 break; 815 case DDC_CRT2: 816 info->BiosConnector[4].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_CRT2_DDC); 817 break; 818 case DDC_LCD: 819 info->BiosConnector[4].ddc_i2c = legacy_setup_i2c_bus(RADEON_LCD_GPIO_MASK); 820 info->BiosConnector[4].ddc_i2c.mask_clk_mask = RADEON_BIOS32(tmp0 + 0x03); 821 info->BiosConnector[4].ddc_i2c.mask_data_mask = RADEON_BIOS32(tmp0 + 0x07); 822 info->BiosConnector[4].ddc_i2c.a_clk_mask = RADEON_BIOS32(tmp0 + 0x03); 823 info->BiosConnector[4].ddc_i2c.a_data_mask = RADEON_BIOS32(tmp0 + 0x07); 824 info->BiosConnector[4].ddc_i2c.put_clk_mask = RADEON_BIOS32(tmp0 + 0x03); 825 info->BiosConnector[4].ddc_i2c.put_data_mask = RADEON_BIOS32(tmp0 + 0x07); 826 info->BiosConnector[4].ddc_i2c.get_clk_mask = RADEON_BIOS32(tmp0 + 0x03); 827 info->BiosConnector[4].ddc_i2c.get_data_mask = RADEON_BIOS32(tmp0 + 0x07); 828 break; 829 case DDC_GPIO: 830 info->BiosConnector[4].ddc_i2c = legacy_setup_i2c_bus(RADEON_MDGPIO_EN_REG); 831 info->BiosConnector[4].ddc_i2c.mask_clk_mask = RADEON_BIOS32(tmp0 + 0x03); 832 info->BiosConnector[4].ddc_i2c.mask_data_mask = RADEON_BIOS32(tmp0 + 0x07); 833 info->BiosConnector[4].ddc_i2c.a_clk_mask = RADEON_BIOS32(tmp0 + 0x03); 834 info->BiosConnector[4].ddc_i2c.a_data_mask = RADEON_BIOS32(tmp0 + 0x07); 835 info->BiosConnector[4].ddc_i2c.put_clk_mask = RADEON_BIOS32(tmp0 + 0x03); 836 info->BiosConnector[4].ddc_i2c.put_data_mask = RADEON_BIOS32(tmp0 + 0x07); 837 info->BiosConnector[4].ddc_i2c.get_clk_mask = RADEON_BIOS32(tmp0 + 0x03); 838 info->BiosConnector[4].ddc_i2c.get_data_mask = RADEON_BIOS32(tmp0 + 0x07); 839 break; 840 default: 841 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unknown DDC Type: %d\n", DDCType); 842 break; 843 } 844 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "LCD DDC Info Table found!\n"); 845 } 846 } 847 } else 848 info->BiosConnector[4].ddc_i2c.valid = FALSE; 849 } 850 } 851 852 /* check TV table */ 853 if (info->InternalTVOut) { 854 offset = RADEON_BIOS16(info->ROMHeaderStart + 0x32); 855 if (offset) { 856 if (RADEON_BIOS8(offset + 6) == 'T') { 857 info->BiosConnector[5].valid = TRUE; 858 /* assume s-video for now */ 859 info->BiosConnector[5].ConnectorType = CONNECTOR_STV; 860 info->BiosConnector[5].load_detection = FALSE; 861 info->BiosConnector[5].ddc_i2c.valid = FALSE; 862 info->BiosConnector[5].devices = ATOM_DEVICE_TV1_SUPPORT; 863 if (!radeon_add_encoder(pScrn, 864 radeon_get_encoder_id_from_supported_device(pScrn, 865 ATOM_DEVICE_TV1_SUPPORT, 866 2), 867 ATOM_DEVICE_TV1_SUPPORT)) 868 return FALSE; 869 } 870 } 871 } 872 873 return TRUE; 874} 875 876Bool RADEONGetConnectorInfoFromBIOS (ScrnInfoPtr pScrn) 877{ 878 RADEONInfoPtr info = RADEONPTR (pScrn); 879 880 if(!info->VBIOS) return FALSE; 881 882 if (info->IsAtomBios) 883 return RADEONGetATOMConnectorInfoFromBIOS(pScrn); 884 else 885 return RADEONGetLegacyConnectorInfoFromBIOS(pScrn); 886} 887 888Bool RADEONGetTVInfoFromBIOS (xf86OutputPtr output) { 889 ScrnInfoPtr pScrn = output->scrn; 890 RADEONInfoPtr info = RADEONPTR(pScrn); 891 RADEONOutputPrivatePtr radeon_output = output->driver_private; 892 radeon_tvout_ptr tvout = &radeon_output->tvout; 893 int offset, refclk, stds; 894 895 if (!info->VBIOS) return FALSE; 896 897 if (info->IsAtomBios) 898 return RADEONGetATOMTVInfo(output); 899 else { 900 offset = RADEON_BIOS16(info->ROMHeaderStart + 0x32); 901 if (offset) { 902 if (RADEON_BIOS8(offset + 6) == 'T') { 903 switch (RADEON_BIOS8(offset + 7) & 0xf) { 904 case 1: 905 tvout->default_tvStd = TV_STD_NTSC; 906 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Default TV standard: NTSC\n"); 907 break; 908 case 2: 909 tvout->default_tvStd = TV_STD_PAL; 910 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Default TV standard: PAL\n"); 911 break; 912 case 3: 913 tvout->default_tvStd = TV_STD_PAL_M; 914 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Default TV standard: PAL-M\n"); 915 break; 916 case 4: 917 tvout->default_tvStd = TV_STD_PAL_60; 918 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Default TV standard: PAL-60\n"); 919 break; 920 case 5: 921 tvout->default_tvStd = TV_STD_NTSC_J; 922 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Default TV standard: NTSC-J\n"); 923 break; 924 case 6: 925 tvout->default_tvStd = TV_STD_SCART_PAL; 926 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Default TV standard: SCART-PAL\n"); 927 break; 928 default: 929 tvout->default_tvStd = TV_STD_NTSC; 930 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Unknown TV standard; defaulting to NTSC\n"); 931 break; 932 } 933 tvout->tvStd = tvout->default_tvStd; 934 935 refclk = (RADEON_BIOS8(offset + 9) >> 2) & 0x3; 936 if (refclk == 0) 937 tvout->TVRefClk = 29.498928713; /* MHz */ 938 else if (refclk == 1) 939 tvout->TVRefClk = 28.636360000; 940 else if (refclk == 2) 941 tvout->TVRefClk = 14.318180000; 942 else if (refclk == 3) 943 tvout->TVRefClk = 27.000000000; 944 945 tvout->SupportedTVStds = tvout->default_tvStd; 946 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "TV standards supported by chip: "); 947 stds = RADEON_BIOS8(offset + 10) & 0x1f; 948 if (stds & TV_STD_NTSC) { 949 tvout->SupportedTVStds |= TV_STD_NTSC; 950 ErrorF("NTSC "); 951 } 952 if (stds & TV_STD_PAL) { 953 tvout->SupportedTVStds |= TV_STD_PAL; 954 ErrorF("PAL "); 955 } 956 if (stds & TV_STD_PAL_M) { 957 tvout->SupportedTVStds |= TV_STD_PAL_M; 958 ErrorF("PAL-M "); 959 } 960 if (stds & TV_STD_PAL_60) { 961 tvout->SupportedTVStds |= TV_STD_PAL_60; 962 ErrorF("PAL-60 "); 963 } 964 if (stds & TV_STD_NTSC_J) { 965 tvout->SupportedTVStds |= TV_STD_NTSC_J; 966 ErrorF("NTSC-J "); 967 } 968 if (stds & TV_STD_SCART_PAL) { 969 tvout->SupportedTVStds |= TV_STD_SCART_PAL; 970 ErrorF("SCART-PAL"); 971 } 972 ErrorF("\n"); 973 974 return TRUE; 975 } 976 } 977 } 978 return FALSE; 979} 980 981/* Read PLL parameters from BIOS block. Default to typical values if there 982 is no BIOS. */ 983Bool RADEONGetClockInfoFromBIOS (ScrnInfoPtr pScrn) 984{ 985 RADEONInfoPtr info = RADEONPTR (pScrn); 986 RADEONPLLPtr pll = &info->pll; 987 uint16_t pll_info_block; 988 989 if (!info->VBIOS) { 990 return FALSE; 991 } else { 992 if (info->IsAtomBios) { 993 return RADEONGetATOMClockInfo(pScrn); 994 } else { 995 int rev; 996 997 pll_info_block = RADEON_BIOS16 (info->ROMHeaderStart + 0x30); 998 999 rev = RADEON_BIOS8(pll_info_block); 1000 1001 pll->reference_freq = RADEON_BIOS16 (pll_info_block + 0x0e); 1002 pll->reference_div = RADEON_BIOS16 (pll_info_block + 0x10); 1003 pll->pll_out_min = RADEON_BIOS32 (pll_info_block + 0x12); 1004 pll->pll_out_max = RADEON_BIOS32 (pll_info_block + 0x16); 1005 1006 if (rev > 9) { 1007 pll->pll_in_min = RADEON_BIOS32(pll_info_block + 0x36); 1008 pll->pll_in_max = RADEON_BIOS32(pll_info_block + 0x3a); 1009 } else { 1010 pll->pll_in_min = 40; 1011 pll->pll_in_max = 500; 1012 } 1013 1014 pll->xclk = RADEON_BIOS16(pll_info_block + 0x08); 1015 1016 info->sclk = RADEON_BIOS16(pll_info_block + 10) / 100.0; 1017 info->mclk = RADEON_BIOS16(pll_info_block + 8) / 100.0; 1018 } 1019 1020 if (info->sclk == 0) info->sclk = 200; 1021 if (info->mclk == 0) info->mclk = 200; 1022 } 1023 1024 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "ref_freq: %d, min_out_pll: %u, " 1025 "max_out_pll: %u, min_in_pll: %u, max_in_pll: %u, xclk: %d, " 1026 "sclk: %f, mclk: %f\n", 1027 pll->reference_freq, (unsigned)pll->pll_out_min, 1028 (unsigned)pll->pll_out_max, (unsigned)pll->pll_in_min, 1029 (unsigned)pll->pll_in_max, pll->xclk, info->sclk, info->mclk); 1030 1031 return TRUE; 1032} 1033 1034Bool RADEONGetDAC2InfoFromBIOS (ScrnInfoPtr pScrn, radeon_tvdac_ptr tvdac) 1035{ 1036 RADEONInfoPtr info = RADEONPTR(pScrn); 1037 int offset, rev, bg, dac; 1038 1039 if (!info->VBIOS) return FALSE; 1040 1041 if (xf86ReturnOptValBool(info->Options, OPTION_DEFAULT_TVDAC_ADJ, FALSE)) 1042 return FALSE; 1043 1044 if (info->IsAtomBios) { 1045 /* not implemented yet */ 1046 return FALSE; 1047 } else { 1048 /* first check TV table */ 1049 offset = RADEON_BIOS16(info->ROMHeaderStart + 0x32); 1050 if (offset) { 1051 rev = RADEON_BIOS8(offset + 0x3); 1052 if (rev > 4) { 1053 bg = RADEON_BIOS8(offset + 0xc) & 0xf; 1054 dac = RADEON_BIOS8(offset + 0xd) & 0xf; 1055 tvdac->ps2_tvdac_adj = (bg << 16) | (dac << 20); 1056 1057 bg = RADEON_BIOS8(offset + 0xe) & 0xf; 1058 dac = RADEON_BIOS8(offset + 0xf) & 0xf; 1059 tvdac->pal_tvdac_adj = (bg << 16) | (dac << 20); 1060 1061 bg = RADEON_BIOS8(offset + 0x10) & 0xf; 1062 dac = RADEON_BIOS8(offset + 0x11) & 0xf; 1063 tvdac->ntsc_tvdac_adj = (bg << 16) | (dac << 20); 1064 1065 return TRUE; 1066 } else if (rev > 1) { 1067 bg = RADEON_BIOS8(offset + 0xc) & 0xf; 1068 dac = (RADEON_BIOS8(offset + 0xc) >> 4) & 0xf; 1069 tvdac->ps2_tvdac_adj = (bg << 16) | (dac << 20); 1070 1071 bg = RADEON_BIOS8(offset + 0xd) & 0xf; 1072 dac = (RADEON_BIOS8(offset + 0xd) >> 4) & 0xf; 1073 tvdac->pal_tvdac_adj = (bg << 16) | (dac << 20); 1074 1075 bg = RADEON_BIOS8(offset + 0xe) & 0xf; 1076 dac = (RADEON_BIOS8(offset + 0xe) >> 4) & 0xf; 1077 tvdac->ntsc_tvdac_adj = (bg << 16) | (dac << 20); 1078 1079 return TRUE; 1080 } 1081 } 1082 /* then check CRT table */ 1083 offset = RADEON_BIOS16(info->ROMHeaderStart + 0x60); 1084 if (offset) { 1085 rev = RADEON_BIOS8(offset) & 0x3; 1086 if (rev < 2) { 1087 bg = RADEON_BIOS8(offset + 0x3) & 0xf; 1088 dac = (RADEON_BIOS8(offset + 0x3) >> 4) & 0xf; 1089 tvdac->ps2_tvdac_adj = (bg << 16) | (dac << 20); 1090 tvdac->pal_tvdac_adj = tvdac->ps2_tvdac_adj; 1091 tvdac->ntsc_tvdac_adj = tvdac->ps2_tvdac_adj; 1092 1093 return TRUE; 1094 } else { 1095 bg = RADEON_BIOS8(offset + 0x4) & 0xf; 1096 dac = RADEON_BIOS8(offset + 0x5) & 0xf; 1097 tvdac->ps2_tvdac_adj = (bg << 16) | (dac << 20); 1098 tvdac->pal_tvdac_adj = tvdac->ps2_tvdac_adj; 1099 tvdac->ntsc_tvdac_adj = tvdac->ps2_tvdac_adj; 1100 1101 return TRUE; 1102 } 1103 } 1104 } 1105 1106 return FALSE; 1107} 1108 1109Bool 1110RADEONGetLVDSInfoFromBIOS(ScrnInfoPtr pScrn, radeon_lvds_ptr lvds) 1111{ 1112 RADEONInfoPtr info = RADEONPTR(pScrn); 1113 radeon_native_mode_ptr native_mode = &lvds->native_mode; 1114 unsigned long tmp, i; 1115 1116 if (!info->VBIOS) 1117 return FALSE; 1118 1119 if (!info->IsAtomBios) { 1120 tmp = RADEON_BIOS16(info->ROMHeaderStart + 0x40); 1121 1122 if (!tmp) { 1123 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 1124 "No Panel Info Table found in BIOS!\n"); 1125 return FALSE; 1126 } else { 1127 char stmp[30]; 1128 int tmp0; 1129 1130 for (i = 0; i < 24; i++) 1131 stmp[i] = RADEON_BIOS8(tmp+i+1); 1132 stmp[24] = 0; 1133 1134 xf86DrvMsg(pScrn->scrnIndex, X_INFO, 1135 "Panel ID string: %s\n", stmp); 1136 1137 native_mode->PanelXRes = RADEON_BIOS16(tmp+25); 1138 native_mode->PanelYRes = RADEON_BIOS16(tmp+27); 1139 xf86DrvMsg(0, X_INFO, "Panel Size from BIOS: %dx%d\n", 1140 native_mode->PanelXRes, native_mode->PanelYRes); 1141 1142 lvds->PanelPwrDly = RADEON_BIOS16(tmp+44); 1143 if (lvds->PanelPwrDly > 2000 || lvds->PanelPwrDly < 0) 1144 lvds->PanelPwrDly = 2000; 1145 1146 /* some panels only work well with certain divider combinations. 1147 */ 1148 info->RefDivider = RADEON_BIOS16(tmp+46); 1149 info->PostDivider = RADEON_BIOS8(tmp+48); 1150 info->FeedbackDivider = RADEON_BIOS16(tmp+49); 1151 if ((info->RefDivider != 0) && 1152 (info->FeedbackDivider > 3)) { 1153 info->UseBiosDividers = TRUE; 1154 xf86DrvMsg(pScrn->scrnIndex, X_INFO, 1155 "BIOS provided dividers will be used.\n"); 1156 } 1157 1158 /* We don't use a while loop here just in case we have a corrupted BIOS image. 1159 The max number of table entries is 23 at present, but may grow in future. 1160 To ensure it works with future revisions we loop it to 32. 1161 */ 1162 for (i = 0; i < 32; i++) { 1163 tmp0 = RADEON_BIOS16(tmp+64+i*2); 1164 if (tmp0 == 0) break; 1165 if ((RADEON_BIOS16(tmp0) == native_mode->PanelXRes) && 1166 (RADEON_BIOS16(tmp0+2) == native_mode->PanelYRes)) { 1167 native_mode->HBlank = (RADEON_BIOS16(tmp0+17) - 1168 RADEON_BIOS16(tmp0+19)) * 8; 1169 native_mode->HOverPlus = (RADEON_BIOS16(tmp0+21) - 1170 RADEON_BIOS16(tmp0+19) - 1) * 8; 1171 native_mode->HSyncWidth = RADEON_BIOS8(tmp0+23) * 8; 1172 native_mode->VBlank = (RADEON_BIOS16(tmp0+24) - 1173 RADEON_BIOS16(tmp0+26)); 1174 native_mode->VOverPlus = ((RADEON_BIOS16(tmp0+28) & 0x7ff) - 1175 RADEON_BIOS16(tmp0+26)); 1176 native_mode->VSyncWidth = ((RADEON_BIOS16(tmp0+28) & 0xf800) >> 11); 1177 native_mode->DotClock = RADEON_BIOS16(tmp0+9) * 10; 1178 native_mode->Flags = 0; 1179 } 1180 } 1181 } 1182 1183 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 1184 "LVDS Info:\n" 1185 "XRes: %d, YRes: %d, DotClock: %d\n" 1186 "HBlank: %d, HOverPlus: %d, HSyncWidth: %d\n" 1187 "VBlank: %d, VOverPlus: %d, VSyncWidth: %d\n", 1188 native_mode->PanelXRes, native_mode->PanelYRes, native_mode->DotClock, 1189 native_mode->HBlank, native_mode->HOverPlus, native_mode->HSyncWidth, 1190 native_mode->VBlank, native_mode->VOverPlus, native_mode->VSyncWidth); 1191 1192 return TRUE; 1193 } 1194 return FALSE; 1195} 1196 1197xf86MonPtr RADEONGetHardCodedEDIDFromBIOS (xf86OutputPtr output) 1198{ 1199 ScrnInfoPtr pScrn = output->scrn; 1200 RADEONInfoPtr info = RADEONPTR(pScrn); 1201 unsigned long tmp; 1202 unsigned char edid[256]; 1203 xf86MonPtr mon = NULL; 1204 1205 if (!info->VBIOS) 1206 return mon; 1207 1208 if (!info->IsAtomBios) { 1209 tmp = RADEON_BIOS16(info->ROMHeaderStart + 0x4c); 1210 if (tmp) { 1211 memcpy(edid, (unsigned char*)(info->VBIOS + tmp), 256); 1212 if (edid[1] == 0xff) 1213 mon = xf86InterpretEDID(output->scrn->scrnIndex, edid); 1214 } 1215 } 1216 1217 return mon; 1218} 1219 1220Bool RADEONGetTMDSInfoFromBIOS (ScrnInfoPtr pScrn, radeon_tmds_ptr tmds) 1221{ 1222 RADEONInfoPtr info = RADEONPTR(pScrn); 1223 uint32_t tmp, maxfreq; 1224 int i, n; 1225 1226 if (!info->VBIOS) return FALSE; 1227 1228 if (info->IsAtomBios) { 1229 if((tmp = RADEON_BIOS16 (info->MasterDataStart + 18))) { 1230 1231 maxfreq = RADEON_BIOS16(tmp+4); 1232 1233 for (i=0; i<4; i++) { 1234 tmds->tmds_pll[i].freq = RADEON_BIOS16(tmp+i*6+6); 1235 /* This assumes each field in TMDS_PLL has 6 bit as in R300/R420 */ 1236 tmds->tmds_pll[i].value = ((RADEON_BIOS8(tmp+i*6+8) & 0x3f) | 1237 ((RADEON_BIOS8(tmp+i*6+10) & 0x3f)<<6) | 1238 ((RADEON_BIOS8(tmp+i*6+9) & 0xf)<<12) | 1239 ((RADEON_BIOS8(tmp+i*6+11) & 0xf)<<16)); 1240 xf86DrvMsg(pScrn->scrnIndex, X_INFO, 1241 "TMDS PLL from BIOS: %u %x\n", 1242 (unsigned)tmds->tmds_pll[i].freq, 1243 (unsigned)tmds->tmds_pll[i].value); 1244 1245 if (maxfreq == tmds->tmds_pll[i].freq) { 1246 tmds->tmds_pll[i].freq = 0xffffffff; 1247 break; 1248 } 1249 } 1250 return TRUE; 1251 } 1252 } else { 1253 1254 tmp = RADEON_BIOS16(info->ROMHeaderStart + 0x34); 1255 if (tmp) { 1256 xf86DrvMsg(pScrn->scrnIndex, X_INFO, 1257 "DFP table revision: %d\n", RADEON_BIOS8(tmp)); 1258 if (RADEON_BIOS8(tmp) == 3) { 1259 n = RADEON_BIOS8(tmp + 5) + 1; 1260 if (n > 4) n = 4; 1261 for (i=0; i<n; i++) { 1262 tmds->tmds_pll[i].value = RADEON_BIOS32(tmp+i*10+0x08); 1263 tmds->tmds_pll[i].freq = RADEON_BIOS16(tmp+i*10+0x10); 1264 } 1265 return TRUE; 1266 } else if (RADEON_BIOS8(tmp) == 4) { 1267 int stride = 0; 1268 n = RADEON_BIOS8(tmp + 5) + 1; 1269 if (n > 4) n = 4; 1270 for (i=0; i<n; i++) { 1271 tmds->tmds_pll[i].value = RADEON_BIOS32(tmp+stride+0x08); 1272 tmds->tmds_pll[i].freq = RADEON_BIOS16(tmp+stride+0x10); 1273 if (i == 0) stride += 10; 1274 else stride += 6; 1275 } 1276 return TRUE; 1277 } 1278 } 1279 } 1280 return FALSE; 1281} 1282 1283static RADEONI2CBusRec 1284RADEONLookupI2CBlock(ScrnInfoPtr pScrn, int id) 1285{ 1286 RADEONInfoPtr info = RADEONPTR (pScrn); 1287 int offset, blocks, i; 1288 RADEONI2CBusRec i2c; 1289 1290 memset(&i2c, 0, sizeof(RADEONI2CBusRec)); 1291 i2c.valid = FALSE; 1292 1293 offset = RADEON_BIOS16(info->ROMHeaderStart + 0x70); 1294 if (offset) { 1295 blocks = RADEON_BIOS8(offset + 2); 1296 for (i = 0; i < blocks; i++) { 1297 int i2c_id = RADEON_BIOS8(offset + 3 + (i * 5) + 0); 1298 if (id == i2c_id) { 1299 int clock_shift = RADEON_BIOS8(offset + 3 + (i * 5) + 3); 1300 int data_shift = RADEON_BIOS8(offset + 3 + (i * 5) + 4); 1301 1302 i2c.mask_clk_mask = (1 << clock_shift); 1303 i2c.mask_data_mask = (1 << data_shift); 1304 i2c.a_clk_mask = (1 << clock_shift); 1305 i2c.a_data_mask = (1 << data_shift); 1306 i2c.put_clk_mask = (1 << clock_shift); 1307 i2c.put_data_mask = (1 << data_shift); 1308 i2c.get_clk_mask = (1 << clock_shift); 1309 i2c.get_data_mask = (1 << data_shift); 1310 i2c.mask_clk_reg = RADEON_GPIOPAD_MASK; 1311 i2c.mask_data_reg = RADEON_GPIOPAD_MASK; 1312 i2c.a_clk_reg = RADEON_GPIOPAD_A; 1313 i2c.a_data_reg = RADEON_GPIOPAD_A; 1314 i2c.put_clk_reg = RADEON_GPIOPAD_EN; 1315 i2c.put_data_reg = RADEON_GPIOPAD_EN; 1316 i2c.get_clk_reg = RADEON_LCD_GPIO_Y_REG; 1317 i2c.get_data_reg = RADEON_LCD_GPIO_Y_REG; 1318 i2c.valid = TRUE; 1319 break; 1320 } 1321 } 1322 } 1323 return i2c; 1324} 1325 1326Bool RADEONGetExtTMDSInfoFromBIOS (ScrnInfoPtr pScrn, radeon_dvo_ptr dvo) 1327{ 1328 RADEONInfoPtr info = RADEONPTR(pScrn); 1329 int offset, table_start, max_freq, gpio_reg, flags; 1330 1331 if (!info->VBIOS) 1332 return FALSE; 1333 1334 if (info->IsAtomBios) 1335 return FALSE; 1336 else if (info->IsIGP) { 1337 /* RS4xx TMDS stuff is in the mobile table */ 1338 offset = RADEON_BIOS16(info->ROMHeaderStart + 0x42); 1339 if (offset) { 1340 int rev = RADEON_BIOS8(offset); 1341 if (rev >= 6) { 1342 offset = RADEON_BIOS16(offset + 0x17); 1343 if (offset) { 1344 offset = RADEON_BIOS16(offset + 2); 1345 rev = RADEON_BIOS8(offset); 1346 if (offset && (rev > 1)) { 1347 int blocks = RADEON_BIOS8(offset + 3); 1348 int index = offset + 4; 1349 dvo->dvo_i2c.valid = FALSE; 1350 while (blocks > 0) { 1351 int id = RADEON_BIOS16(index); 1352 index += 2; 1353 switch (id >> 13) { 1354 case 0: 1355 index += 6; 1356 break; 1357 case 2: 1358 index += 10; 1359 break; 1360 case 3: 1361 index += 2; 1362 break; 1363 case 4: 1364 index += 2; 1365 break; 1366 case 6: 1367 dvo->dvo_i2c_slave_addr = 1368 RADEON_BIOS16(index) & 0xff; 1369 index += 2; 1370 dvo->dvo_i2c = 1371 RADEONLookupI2CBlock(pScrn, RADEON_BIOS8(index)); 1372 return TRUE; 1373 default: 1374 break; 1375 } 1376 blocks--; 1377 } 1378 } 1379 } 1380 } 1381 } else { 1382 dvo->dvo_i2c_slave_addr = 0x70; 1383 dvo->dvo_i2c = RADEONLookupI2CBlock(pScrn, 136); 1384 info->ext_tmds_chip = RADEON_SIL_164; 1385 } 1386 } else { 1387 offset = RADEON_BIOS16(info->ROMHeaderStart + 0x58); 1388 if (offset) { 1389 xf86DrvMsg(pScrn->scrnIndex, X_INFO, 1390 "External TMDS Table revision: %d\n", 1391 RADEON_BIOS8(offset)); 1392 table_start = offset+4; 1393 max_freq = RADEON_BIOS16(table_start); 1394 dvo->dvo_i2c_slave_addr = RADEON_BIOS8(table_start+2); 1395 dvo->dvo_i2c.valid = FALSE; 1396 gpio_reg = RADEON_BIOS8(table_start+3); 1397 if (gpio_reg == 1) 1398 dvo->dvo_i2c = legacy_setup_i2c_bus(RADEON_GPIO_MONID); 1399 else if (gpio_reg == 2) 1400 dvo->dvo_i2c = legacy_setup_i2c_bus(RADEON_GPIO_DVI_DDC); 1401 else if (gpio_reg == 3) 1402 dvo->dvo_i2c = legacy_setup_i2c_bus(RADEON_GPIO_VGA_DDC); 1403 else if (gpio_reg == 4) { 1404 if (IS_R300_VARIANT) 1405 dvo->dvo_i2c = legacy_setup_i2c_bus(RADEON_GPIO_MONID); 1406 else 1407 dvo->dvo_i2c = legacy_setup_i2c_bus(RADEON_GPIO_CRT2_DDC); 1408 } else if (gpio_reg == 5) { 1409 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 1410 "unsupported MM gpio_reg\n"); 1411 return FALSE; 1412 } else { 1413 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 1414 "Unknown gpio reg: %d\n", gpio_reg); 1415 return FALSE; 1416 } 1417 flags = RADEON_BIOS8(table_start+5); 1418 dvo->dvo_duallink = flags & 0x01; 1419 if (dvo->dvo_duallink) { 1420 xf86DrvMsg(pScrn->scrnIndex, X_INFO, 1421 "Duallink TMDS detected\n"); 1422 } 1423 return TRUE; 1424 } 1425 } 1426 1427 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 1428 "No External TMDS Table found\n"); 1429 1430 return FALSE; 1431} 1432 1433Bool RADEONInitExtTMDSInfoFromBIOS (xf86OutputPtr output) 1434{ 1435 ScrnInfoPtr pScrn = output->scrn; 1436 RADEONInfoPtr info = RADEONPTR(pScrn); 1437 unsigned char *RADEONMMIO = info->MMIO; 1438 radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output); 1439 radeon_dvo_ptr dvo = NULL; 1440 int offset, index, id; 1441 uint32_t val, reg, and_mask, or_mask; 1442 1443 if (radeon_encoder == NULL) 1444 return FALSE; 1445 1446 dvo = (radeon_dvo_ptr)radeon_encoder->dev_priv; 1447 1448 if (dvo == NULL) 1449 return FALSE; 1450 1451 if (!info->VBIOS) 1452 return FALSE; 1453 1454 if (info->IsAtomBios) 1455 return FALSE; 1456 else if (info->IsIGP) { 1457 /* RS4xx TMDS stuff is in the mobile table */ 1458 offset = RADEON_BIOS16(info->ROMHeaderStart + 0x42); 1459 if (offset) { 1460 int rev = RADEON_BIOS8(offset); 1461 if (rev >= 6) { 1462 offset = RADEON_BIOS16(offset + 0x17); 1463 if (offset) { 1464 offset = RADEON_BIOS16(offset + 2); 1465 rev = RADEON_BIOS8(offset); 1466 if (offset && (rev > 1)) { 1467 int blocks = RADEON_BIOS8(offset + 3); 1468 index = offset + 4; 1469 while (blocks > 0) { 1470 id = RADEON_BIOS16(index); 1471 index += 2; 1472 switch (id >> 13) { 1473 case 0: 1474 reg = (id & 0x1fff) * 4; 1475 val = RADEON_BIOS32(index); 1476 index += 4; 1477 ErrorF("MMIO: 0x%x 0x%x\n", 1478 (unsigned)reg, (unsigned)val); 1479 OUTREG(reg, val); 1480 break; 1481 case 2: 1482 reg = (id & 0x1fff) * 4; 1483 and_mask = RADEON_BIOS32(index); 1484 index += 4; 1485 or_mask = RADEON_BIOS32(index); 1486 index += 4; 1487 ErrorF("MMIO mask: 0x%x 0x%x 0x%x\n", 1488 (unsigned)reg, (unsigned)and_mask, (unsigned)or_mask); 1489 val = INREG(reg); 1490 val = (val & and_mask) | or_mask; 1491 OUTREG(reg, val); 1492 break; 1493 case 3: 1494 val = RADEON_BIOS16(index); 1495 index += 2; 1496 ErrorF("delay: %u\n", (unsigned)val); 1497 usleep(val); 1498 break; 1499 case 4: 1500 val = RADEON_BIOS16(index); 1501 index += 2; 1502 ErrorF("delay: %u\n", (unsigned)val * 1000); 1503 usleep(val * 1000); 1504 break; 1505 case 6: 1506 index++; 1507 reg = RADEON_BIOS8(index); 1508 index++; 1509 val = RADEON_BIOS8(index); 1510 index++; 1511 ErrorF("i2c write: 0x%x, 0x%x\n", (unsigned)reg, 1512 (unsigned)val); 1513 RADEONDVOWriteByte(dvo->DVOChip, reg, val); 1514 break; 1515 default: 1516 ErrorF("unknown id %d\n", id>>13); 1517 return FALSE; 1518 } 1519 blocks--; 1520 } 1521 return TRUE; 1522 } 1523 } 1524 } 1525 } 1526 } else { 1527 offset = RADEON_BIOS16(info->ROMHeaderStart + 0x58); 1528 if (offset) { 1529 index = offset+10; 1530 id = RADEON_BIOS16(index); 1531 while (id != 0xffff) { 1532 index += 2; 1533 switch(id >> 13) { 1534 case 0: 1535 reg = (id & 0x1fff) * 4; 1536 val = RADEON_BIOS32(index); 1537 index += 4; 1538 ErrorF("MMIO: 0x%x 0x%x\n", 1539 (unsigned)reg, (unsigned)val); 1540 OUTREG(reg, val); 1541 break; 1542 case 2: 1543 reg = (id & 0x1fff) * 4; 1544 and_mask = RADEON_BIOS32(index); 1545 index += 4; 1546 or_mask = RADEON_BIOS32(index); 1547 index += 4; 1548 val = INREG(reg); 1549 val = (val & and_mask) | or_mask; 1550 ErrorF("MMIO mask: 0x%x 0x%x 0x%x\n", 1551 (unsigned)reg, (unsigned)and_mask, (unsigned)or_mask); 1552 OUTREG(reg, val); 1553 break; 1554 case 4: 1555 val = RADEON_BIOS16(index); 1556 index += 2; 1557 ErrorF("delay: %u\n", (unsigned)val); 1558 usleep(val); 1559 break; 1560 case 5: 1561 reg = id & 0x1fff; 1562 and_mask = RADEON_BIOS32(index); 1563 index += 4; 1564 or_mask = RADEON_BIOS32(index); 1565 index += 4; 1566 ErrorF("PLL mask: 0x%x 0x%x 0x%x\n", 1567 (unsigned)reg, (unsigned)and_mask, (unsigned)or_mask); 1568 val = INPLL(pScrn, reg); 1569 val = (val & and_mask) | or_mask; 1570 OUTPLL(pScrn, reg, val); 1571 break; 1572 case 6: 1573 reg = id & 0x1fff; 1574 val = RADEON_BIOS8(index); 1575 index += 1; 1576 ErrorF("i2c write: 0x%x, 0x%x\n", (unsigned)reg, 1577 (unsigned)val); 1578 RADEONDVOWriteByte(dvo->DVOChip, reg, val); 1579 break; 1580 default: 1581 ErrorF("unknown id %d\n", id>>13); 1582 return FALSE; 1583 }; 1584 id = RADEON_BIOS16(index); 1585 } 1586 return TRUE; 1587 } 1588 } 1589 1590 return FALSE; 1591} 1592 1593/* support for init from bios tables 1594 * 1595 * Based heavily on the netbsd radeonfb driver 1596 * Written by Garrett D'Amore 1597 * Copyright (c) 2006 Itronix Inc. 1598 * 1599 */ 1600 1601/* bios table defines */ 1602 1603#define RADEON_TABLE_ENTRY_FLAG_MASK 0xe000 1604#define RADEON_TABLE_ENTRY_INDEX_MASK 0x1fff 1605#define RADEON_TABLE_ENTRY_COMMAND_MASK 0x00ff 1606 1607#define RADEON_TABLE_FLAG_WRITE_INDEXED 0x0000 1608#define RADEON_TABLE_FLAG_WRITE_DIRECT 0x2000 1609#define RADEON_TABLE_FLAG_MASK_INDEXED 0x4000 1610#define RADEON_TABLE_FLAG_MASK_DIRECT 0x6000 1611#define RADEON_TABLE_FLAG_DELAY 0x8000 1612#define RADEON_TABLE_FLAG_SCOMMAND 0xa000 1613 1614#define RADEON_TABLE_SCOMMAND_WAIT_MC_BUSY_MASK 0x03 1615#define RADEON_TABLE_SCOMMAND_WAIT_MEM_PWRUP_COMPLETE 0x08 1616 1617#define RADEON_PLL_FLAG_MASK 0xc0 1618#define RADEON_PLL_INDEX_MASK 0x3f 1619 1620#define RADEON_PLL_FLAG_WRITE 0x00 1621#define RADEON_PLL_FLAG_MASK_BYTE 0x40 1622#define RADEON_PLL_FLAG_WAIT 0x80 1623 1624#define RADEON_PLL_WAIT_150MKS 1 1625#define RADEON_PLL_WAIT_5MS 2 1626#define RADEON_PLL_WAIT_MC_BUSY_MASK 3 1627#define RADEON_PLL_WAIT_DLL_READY_MASK 4 1628#define RADEON_PLL_WAIT_CHK_SET_CLK_PWRMGT_CNTL24 5 1629 1630static uint16_t 1631RADEONValidateBIOSOffset(ScrnInfoPtr pScrn, uint16_t offset) 1632{ 1633 RADEONInfoPtr info = RADEONPTR (pScrn); 1634 uint8_t revision = RADEON_BIOS8(offset - 1); 1635 1636 if (revision > 0x10) { 1637 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 1638 "Bad revision %d for BIOS table\n", revision); 1639 return 0; 1640 } 1641 1642 if (offset < 0x60) { 1643 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 1644 "Bad offset 0x%x for BIOS Table\n", offset); 1645 return 0; 1646 } 1647 1648 return offset; 1649} 1650 1651Bool 1652RADEONGetBIOSInitTableOffsets(ScrnInfoPtr pScrn) 1653{ 1654 RADEONInfoPtr info = RADEONPTR (pScrn); 1655 uint8_t val; 1656 1657 if (!info->VBIOS) { 1658 return FALSE; 1659 } else { 1660 if (info->IsAtomBios) { 1661 return FALSE; 1662 } else { 1663 info->BiosTable.revision = RADEON_BIOS8(info->ROMHeaderStart + 4); 1664 info->BiosTable.rr1_offset = RADEON_BIOS16(info->ROMHeaderStart + 0x0c); 1665 if (info->BiosTable.rr1_offset) { 1666 info->BiosTable.rr1_offset = 1667 RADEONValidateBIOSOffset(pScrn, info->BiosTable.rr1_offset); 1668 } 1669 if (info->BiosTable.revision > 0x09) 1670 return TRUE; 1671 info->BiosTable.rr2_offset = RADEON_BIOS16(info->ROMHeaderStart + 0x4e); 1672 if (info->BiosTable.rr2_offset) { 1673 info->BiosTable.rr2_offset = 1674 RADEONValidateBIOSOffset(pScrn, info->BiosTable.rr2_offset); 1675 } 1676 info->BiosTable.dyn_clk_offset = RADEON_BIOS16(info->ROMHeaderStart + 0x52); 1677 if (info->BiosTable.dyn_clk_offset) { 1678 info->BiosTable.dyn_clk_offset = 1679 RADEONValidateBIOSOffset(pScrn, info->BiosTable.dyn_clk_offset); 1680 } 1681 info->BiosTable.pll_offset = RADEON_BIOS16(info->ROMHeaderStart + 0x46); 1682 if (info->BiosTable.pll_offset) { 1683 info->BiosTable.pll_offset = 1684 RADEONValidateBIOSOffset(pScrn, info->BiosTable.pll_offset); 1685 } 1686 info->BiosTable.mem_config_offset = RADEON_BIOS16(info->ROMHeaderStart + 0x48); 1687 if (info->BiosTable.mem_config_offset) { 1688 info->BiosTable.mem_config_offset = 1689 RADEONValidateBIOSOffset(pScrn, info->BiosTable.mem_config_offset); 1690 } 1691 if (info->BiosTable.mem_config_offset) { 1692 info->BiosTable.mem_reset_offset = info->BiosTable.mem_config_offset; 1693 if (info->BiosTable.mem_reset_offset) { 1694 while (RADEON_BIOS8(info->BiosTable.mem_reset_offset)) 1695 info->BiosTable.mem_reset_offset++; 1696 info->BiosTable.mem_reset_offset++; 1697 info->BiosTable.mem_reset_offset += 2; 1698 } 1699 } 1700 if (info->BiosTable.mem_config_offset) { 1701 info->BiosTable.short_mem_offset = info->BiosTable.mem_config_offset; 1702 if ((info->BiosTable.short_mem_offset != 0) && 1703 (RADEON_BIOS8(info->BiosTable.short_mem_offset - 2) <= 64)) 1704 info->BiosTable.short_mem_offset += 1705 RADEON_BIOS8(info->BiosTable.short_mem_offset - 3); 1706 } 1707 if (info->BiosTable.rr2_offset) { 1708 info->BiosTable.rr3_offset = info->BiosTable.rr2_offset; 1709 if (info->BiosTable.rr3_offset) { 1710 while ((val = RADEON_BIOS8(info->BiosTable.rr3_offset + 1)) != 0) { 1711 if (val & 0x40) 1712 info->BiosTable.rr3_offset += 10; 1713 else if (val & 0x80) 1714 info->BiosTable.rr3_offset += 4; 1715 else 1716 info->BiosTable.rr3_offset += 6; 1717 } 1718 info->BiosTable.rr3_offset += 2; 1719 } 1720 } 1721 1722 if (info->BiosTable.rr3_offset) { 1723 info->BiosTable.rr4_offset = info->BiosTable.rr3_offset; 1724 if (info->BiosTable.rr4_offset) { 1725 while ((val = RADEON_BIOS8(info->BiosTable.rr4_offset + 1)) != 0) { 1726 if (val & 0x40) 1727 info->BiosTable.rr4_offset += 10; 1728 else if (val & 0x80) 1729 info->BiosTable.rr4_offset += 4; 1730 else 1731 info->BiosTable.rr4_offset += 6; 1732 } 1733 info->BiosTable.rr4_offset += 2; 1734 } 1735 } 1736 1737 if (info->BiosTable.rr3_offset + 1 == info->BiosTable.pll_offset) { 1738 info->BiosTable.rr3_offset = 0; 1739 info->BiosTable.rr4_offset = 0; 1740 } 1741 1742 return TRUE; 1743 1744 } 1745 } 1746} 1747 1748static void 1749RADEONRestoreBIOSRegBlock(ScrnInfoPtr pScrn, uint16_t table_offset) 1750{ 1751 RADEONInfoPtr info = RADEONPTR (pScrn); 1752 unsigned char *RADEONMMIO = info->MMIO; 1753 uint16_t offset = table_offset; 1754 uint16_t value, flag, index, count; 1755 uint32_t andmask, ormask, val, channel_complete_mask; 1756 uint8_t command; 1757 1758 if (offset == 0) 1759 return; 1760 1761 while ((value = RADEON_BIOS16(offset)) != 0) { 1762 flag = value & RADEON_TABLE_ENTRY_FLAG_MASK; 1763 index = value & RADEON_TABLE_ENTRY_INDEX_MASK; 1764 command = value & RADEON_TABLE_ENTRY_COMMAND_MASK; 1765 1766 offset += 2; 1767 1768 switch (flag) { 1769 case RADEON_TABLE_FLAG_WRITE_INDEXED: 1770 val = RADEON_BIOS32(offset); 1771 ErrorF("WRITE INDEXED: 0x%x 0x%x\n", 1772 index, (unsigned)val); 1773 OUTREG(RADEON_MM_INDEX, index); 1774 OUTREG(RADEON_MM_DATA, val); 1775 offset += 4; 1776 break; 1777 1778 case RADEON_TABLE_FLAG_WRITE_DIRECT: 1779 val = RADEON_BIOS32(offset); 1780 ErrorF("WRITE DIRECT: 0x%x 0x%x\n", index, (unsigned)val); 1781 OUTREG(index, val); 1782 offset += 4; 1783 break; 1784 1785 case RADEON_TABLE_FLAG_MASK_INDEXED: 1786 andmask = RADEON_BIOS32(offset); 1787 offset += 4; 1788 ormask = RADEON_BIOS32(offset); 1789 offset += 4; 1790 ErrorF("MASK INDEXED: 0x%x 0x%x 0x%x\n", 1791 index, (unsigned)andmask, (unsigned)ormask); 1792 OUTREG(RADEON_MM_INDEX, index); 1793 val = INREG(RADEON_MM_DATA); 1794 val = (val & andmask) | ormask; 1795 OUTREG(RADEON_MM_DATA, val); 1796 break; 1797 1798 case RADEON_TABLE_FLAG_MASK_DIRECT: 1799 andmask = RADEON_BIOS32(offset); 1800 offset += 4; 1801 ormask = RADEON_BIOS32(offset); 1802 offset += 4; 1803 ErrorF("MASK DIRECT: 0x%x 0x%x 0x%x\n", 1804 index, (unsigned)andmask, (unsigned)ormask); 1805 val = INREG(index); 1806 val = (val & andmask) | ormask; 1807 OUTREG(index, val); 1808 break; 1809 1810 case RADEON_TABLE_FLAG_DELAY: 1811 count = RADEON_BIOS16(offset); 1812 ErrorF("delay: %d\n", count); 1813 usleep(count); 1814 offset += 2; 1815 break; 1816 1817 case RADEON_TABLE_FLAG_SCOMMAND: 1818 ErrorF("SCOMMAND 0x%x\n", command); 1819 switch (command) { 1820 case RADEON_TABLE_SCOMMAND_WAIT_MC_BUSY_MASK: 1821 count = RADEON_BIOS16(offset); 1822 ErrorF("SCOMMAND_WAIT_MC_BUSY_MASK %d\n", count); 1823 while (count--) { 1824 if (!(INPLL(pScrn, RADEON_CLK_PWRMGT_CNTL) & 1825 RADEON_MC_BUSY)) 1826 break; 1827 } 1828 break; 1829 1830 case RADEON_TABLE_SCOMMAND_WAIT_MEM_PWRUP_COMPLETE: 1831 count = RADEON_BIOS16(offset); 1832 ErrorF("SCOMMAND_WAIT_MEM_PWRUP_COMPLETE %d\n", count); 1833 /* may need to take into account how many memory channels 1834 * each card has 1835 */ 1836 if (IS_R300_VARIANT) 1837 channel_complete_mask = R300_MEM_PWRUP_COMPLETE; 1838 else 1839 channel_complete_mask = RADEON_MEM_PWRUP_COMPLETE; 1840 while (count--) { 1841 /* XXX: may need indexed access */ 1842 if ((INREG(RADEON_MEM_STR_CNTL) & 1843 channel_complete_mask) == 1844 channel_complete_mask) 1845 break; 1846 } 1847 break; 1848 1849 } 1850 offset += 2; 1851 break; 1852 } 1853 } 1854} 1855 1856static void 1857RADEONRestoreBIOSMemBlock(ScrnInfoPtr pScrn, uint16_t table_offset) 1858{ 1859 RADEONInfoPtr info = RADEONPTR (pScrn); 1860 unsigned char *RADEONMMIO = info->MMIO; 1861 uint16_t offset = table_offset; 1862 uint16_t count; 1863 uint32_t ormask, val, channel_complete_mask; 1864 uint8_t index; 1865 1866 if (offset == 0) 1867 return; 1868 1869 while ((index = RADEON_BIOS8(offset)) != 0xff) { 1870 offset++; 1871 if (index == 0x0f) { 1872 count = 20000; 1873 ErrorF("MEM_WAIT_MEM_PWRUP_COMPLETE %d\n", count); 1874 /* may need to take into account how many memory channels 1875 * each card has 1876 */ 1877 if (IS_R300_VARIANT) 1878 channel_complete_mask = R300_MEM_PWRUP_COMPLETE; 1879 else 1880 channel_complete_mask = RADEON_MEM_PWRUP_COMPLETE; 1881 while (count--) { 1882 /* XXX: may need indexed access */ 1883 if ((INREG(RADEON_MEM_STR_CNTL) & 1884 channel_complete_mask) == 1885 channel_complete_mask) 1886 break; 1887 } 1888 } else { 1889 ormask = RADEON_BIOS16(offset); 1890 offset += 2; 1891 1892 ErrorF("INDEX RADEON_MEM_SDRAM_MODE_REG %x %x\n", 1893 RADEON_SDRAM_MODE_MASK, (unsigned)ormask); 1894 1895 /* can this use direct access? */ 1896 OUTREG(RADEON_MM_INDEX, RADEON_MEM_SDRAM_MODE_REG); 1897 val = INREG(RADEON_MM_DATA); 1898 val = (val & RADEON_SDRAM_MODE_MASK) | ormask; 1899 OUTREG(RADEON_MM_DATA, val); 1900 1901 ormask = (uint32_t)index << 24; 1902 1903 ErrorF("INDEX RADEON_MEM_SDRAM_MODE_REG %x %x\n", 1904 RADEON_B3MEM_RESET_MASK, (unsigned)ormask); 1905 1906 /* can this use direct access? */ 1907 OUTREG(RADEON_MM_INDEX, RADEON_MEM_SDRAM_MODE_REG); 1908 val = INREG(RADEON_MM_DATA); 1909 val = (val & RADEON_B3MEM_RESET_MASK) | ormask; 1910 OUTREG(RADEON_MM_DATA, val); 1911 } 1912 } 1913} 1914 1915static void 1916RADEONRestoreBIOSPllBlock(ScrnInfoPtr pScrn, uint16_t table_offset) 1917{ 1918 RADEONInfoPtr info = RADEONPTR (pScrn); 1919 uint16_t offset = table_offset; 1920 uint8_t index, shift; 1921 uint32_t andmask, ormask, val, clk_pwrmgt_cntl; 1922 uint16_t count; 1923 1924 if (offset == 0) 1925 return; 1926 1927 while ((index = RADEON_BIOS8(offset)) != 0) { 1928 offset++; 1929 1930 switch (index & RADEON_PLL_FLAG_MASK) { 1931 case RADEON_PLL_FLAG_WAIT: 1932 switch (index & RADEON_PLL_INDEX_MASK) { 1933 case RADEON_PLL_WAIT_150MKS: 1934 ErrorF("delay: 150 us\n"); 1935 usleep(150); 1936 break; 1937 case RADEON_PLL_WAIT_5MS: 1938 ErrorF("delay: 5 ms\n"); 1939 usleep(5000); 1940 break; 1941 1942 case RADEON_PLL_WAIT_MC_BUSY_MASK: 1943 count = 1000; 1944 ErrorF("PLL_WAIT_MC_BUSY_MASK %d\n", count); 1945 while (count--) { 1946 if (!(INPLL(pScrn, RADEON_CLK_PWRMGT_CNTL) & 1947 RADEON_MC_BUSY)) 1948 break; 1949 } 1950 break; 1951 1952 case RADEON_PLL_WAIT_DLL_READY_MASK: 1953 count = 1000; 1954 ErrorF("PLL_WAIT_DLL_READY_MASK %d\n", count); 1955 while (count--) { 1956 if (INPLL(pScrn, RADEON_CLK_PWRMGT_CNTL) & 1957 RADEON_DLL_READY) 1958 break; 1959 } 1960 break; 1961 1962 case RADEON_PLL_WAIT_CHK_SET_CLK_PWRMGT_CNTL24: 1963 ErrorF("PLL_WAIT_CHK_SET_CLK_PWRMGT_CNTL24\n"); 1964 clk_pwrmgt_cntl = INPLL(pScrn, RADEON_CLK_PWRMGT_CNTL); 1965 if (clk_pwrmgt_cntl & RADEON_CG_NO1_DEBUG_0) { 1966 val = INPLL(pScrn, RADEON_MCLK_CNTL); 1967 /* is this right? */ 1968 val = (val & 0xFFFF0000) | 0x1111; /* seems like we should clear these... */ 1969 OUTPLL(pScrn, RADEON_MCLK_CNTL, val); 1970 usleep(10000); 1971 OUTPLL(pScrn, RADEON_CLK_PWRMGT_CNTL, 1972 clk_pwrmgt_cntl & ~RADEON_CG_NO1_DEBUG_0); 1973 usleep(10000); 1974 } 1975 break; 1976 } 1977 break; 1978 1979 case RADEON_PLL_FLAG_MASK_BYTE: 1980 shift = RADEON_BIOS8(offset) * 8; 1981 offset++; 1982 1983 andmask = 1984 (((uint32_t)RADEON_BIOS8(offset)) << shift) | 1985 ~((uint32_t)0xff << shift); 1986 offset++; 1987 1988 ormask = ((uint32_t)RADEON_BIOS8(offset)) << shift; 1989 offset++; 1990 1991 ErrorF("PLL_MASK_BYTE 0x%x 0x%x 0x%x 0x%x\n", 1992 index, shift, (unsigned)andmask, (unsigned)ormask); 1993 val = INPLL(pScrn, index); 1994 val = (val & andmask) | ormask; 1995 OUTPLL(pScrn, index, val); 1996 break; 1997 1998 case RADEON_PLL_FLAG_WRITE: 1999 val = RADEON_BIOS32(offset); 2000 ErrorF("PLL_WRITE 0x%x 0x%x\n", index, (unsigned)val); 2001 OUTPLL(pScrn, index, val); 2002 offset += 4; 2003 break; 2004 } 2005 } 2006} 2007 2008Bool 2009RADEONPostCardFromBIOSTables(ScrnInfoPtr pScrn) 2010{ 2011 RADEONInfoPtr info = RADEONPTR (pScrn); 2012 2013 if (!info->VBIOS) { 2014 return FALSE; 2015 } else { 2016 if (info->IsAtomBios) { 2017 return FALSE; 2018 } else { 2019 if (info->BiosTable.rr1_offset) { 2020 ErrorF("rr1 restore, 0x%x\n", info->BiosTable.rr1_offset); 2021 RADEONRestoreBIOSRegBlock(pScrn, info->BiosTable.rr1_offset); 2022 } 2023 if (info->BiosTable.revision < 0x09) { 2024 if (info->BiosTable.pll_offset) { 2025 ErrorF("pll restore, 0x%x\n", info->BiosTable.pll_offset); 2026 RADEONRestoreBIOSPllBlock(pScrn, info->BiosTable.pll_offset); 2027 } 2028 if (info->BiosTable.rr2_offset) { 2029 ErrorF("rr2 restore, 0x%x\n", info->BiosTable.rr2_offset); 2030 RADEONRestoreBIOSRegBlock(pScrn, info->BiosTable.rr2_offset); 2031 } 2032 if (info->BiosTable.rr4_offset) { 2033 ErrorF("rr4 restore, 0x%x\n", info->BiosTable.rr4_offset); 2034 RADEONRestoreBIOSRegBlock(pScrn, info->BiosTable.rr4_offset); 2035 } 2036 if (info->BiosTable.mem_reset_offset) { 2037 ErrorF("mem reset restore, 0x%x\n", info->BiosTable.mem_reset_offset); 2038 RADEONRestoreBIOSMemBlock(pScrn, info->BiosTable.mem_reset_offset); 2039 } 2040 if (info->BiosTable.rr3_offset) { 2041 ErrorF("rr3 restore, 0x%x\n", info->BiosTable.rr3_offset); 2042 RADEONRestoreBIOSRegBlock(pScrn, info->BiosTable.rr3_offset); 2043 } 2044 if (info->BiosTable.dyn_clk_offset) { 2045 ErrorF("dyn_clk restore, 0x%x\n", info->BiosTable.dyn_clk_offset); 2046 RADEONRestoreBIOSPllBlock(pScrn, info->BiosTable.dyn_clk_offset); 2047 } 2048 } 2049 } 2050 } 2051 return TRUE; 2052} 2053