1 /* 2 * Copyright 2007-8 Advanced Micro Devices, Inc. 3 * Copyright 2008 Red Hat Inc. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be included in 13 * all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 21 * OTHER DEALINGS IN THE SOFTWARE. 22 * 23 * Authors: Dave Airlie 24 * Alex Deucher 25 */ 26 27 #include <linux/pci.h> 28 29 #include <drm/drm_device.h> 30 #include <drm/radeon_drm.h> 31 32 #include "radeon.h" 33 34 #include "atom.h" 35 #include "atom-bits.h" 36 #include "radeon_asic.h" 37 #include "radeon_atombios.h" 38 #include "radeon_legacy_encoders.h" 39 40 union atom_supported_devices { 41 struct _ATOM_SUPPORTED_DEVICES_INFO info; 42 struct _ATOM_SUPPORTED_DEVICES_INFO_2 info_2; 43 struct _ATOM_SUPPORTED_DEVICES_INFO_2d1 info_2d1; 44 }; 45 46 static void radeon_lookup_i2c_gpio_quirks(struct radeon_device *rdev, 47 ATOM_GPIO_I2C_ASSIGMENT *gpio, 48 u8 index) 49 { 50 /* r4xx mask is technically not used by the hw, so patch in the legacy mask bits */ 51 if ((rdev->family == CHIP_R420) || 52 (rdev->family == CHIP_R423) || 53 (rdev->family == CHIP_RV410)) { 54 if ((le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x0018) || 55 (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x0019) || 56 (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x001a)) { 57 gpio->ucClkMaskShift = 0x19; 58 gpio->ucDataMaskShift = 0x18; 59 } 60 } 61 62 /* some evergreen boards have bad data for this entry */ 63 if (ASIC_IS_DCE4(rdev)) { 64 if ((index == 7) && 65 (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1936) && 66 (gpio->sucI2cId.ucAccess == 0)) { 67 gpio->sucI2cId.ucAccess = 0x97; 68 gpio->ucDataMaskShift = 8; 69 gpio->ucDataEnShift = 8; 70 gpio->ucDataY_Shift = 8; 71 gpio->ucDataA_Shift = 8; 72 } 73 } 74 75 /* some DCE3 boards have bad data for this entry */ 76 if (ASIC_IS_DCE3(rdev)) { 77 if ((index == 4) && 78 (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1fda) && 79 (gpio->sucI2cId.ucAccess == 0x94)) 80 gpio->sucI2cId.ucAccess = 0x14; 81 } 82 } 83 84 static struct radeon_i2c_bus_rec radeon_get_bus_rec_for_i2c_gpio(ATOM_GPIO_I2C_ASSIGMENT *gpio) 85 { 86 struct radeon_i2c_bus_rec i2c; 87 88 memset(&i2c, 0, sizeof(struct radeon_i2c_bus_rec)); 89 90 i2c.mask_clk_reg = le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4; 91 i2c.mask_data_reg = le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4; 92 i2c.en_clk_reg = le16_to_cpu(gpio->usClkEnRegisterIndex) * 4; 93 i2c.en_data_reg = le16_to_cpu(gpio->usDataEnRegisterIndex) * 4; 94 i2c.y_clk_reg = le16_to_cpu(gpio->usClkY_RegisterIndex) * 4; 95 i2c.y_data_reg = le16_to_cpu(gpio->usDataY_RegisterIndex) * 4; 96 i2c.a_clk_reg = le16_to_cpu(gpio->usClkA_RegisterIndex) * 4; 97 i2c.a_data_reg = le16_to_cpu(gpio->usDataA_RegisterIndex) * 4; 98 i2c.mask_clk_mask = (1 << gpio->ucClkMaskShift); 99 i2c.mask_data_mask = (1 << gpio->ucDataMaskShift); 100 i2c.en_clk_mask = (1 << gpio->ucClkEnShift); 101 i2c.en_data_mask = (1 << gpio->ucDataEnShift); 102 i2c.y_clk_mask = (1 << gpio->ucClkY_Shift); 103 i2c.y_data_mask = (1 << gpio->ucDataY_Shift); 104 i2c.a_clk_mask = (1 << gpio->ucClkA_Shift); 105 i2c.a_data_mask = (1 << gpio->ucDataA_Shift); 106 107 if (gpio->sucI2cId.sbfAccess.bfHW_Capable) 108 i2c.hw_capable = true; 109 else 110 i2c.hw_capable = false; 111 112 if (gpio->sucI2cId.ucAccess == 0xa0) 113 i2c.mm_i2c = true; 114 else 115 i2c.mm_i2c = false; 116 117 i2c.i2c_id = gpio->sucI2cId.ucAccess; 118 119 if (i2c.mask_clk_reg) 120 i2c.valid = true; 121 else 122 i2c.valid = false; 123 124 return i2c; 125 } 126 127 static struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_device *rdev, 128 uint8_t id) 129 { 130 struct atom_context *ctx = rdev->mode_info.atom_context; 131 ATOM_GPIO_I2C_ASSIGMENT *gpio; 132 struct radeon_i2c_bus_rec i2c; 133 int index = GetIndexIntoMasterTable(DATA, GPIO_I2C_Info); 134 struct _ATOM_GPIO_I2C_INFO *i2c_info; 135 uint16_t data_offset, size; 136 int i, num_indices; 137 138 memset(&i2c, 0, sizeof(struct radeon_i2c_bus_rec)); 139 i2c.valid = false; 140 141 if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) { 142 i2c_info = (struct _ATOM_GPIO_I2C_INFO *)(ctx->bios + data_offset); 143 144 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / 145 sizeof(ATOM_GPIO_I2C_ASSIGMENT); 146 147 gpio = &i2c_info->asGPIO_Info[0]; 148 for (i = 0; i < num_indices; i++) { 149 150 radeon_lookup_i2c_gpio_quirks(rdev, gpio, i); 151 152 if (gpio->sucI2cId.ucAccess == id) { 153 i2c = radeon_get_bus_rec_for_i2c_gpio(gpio); 154 break; 155 } 156 gpio = (ATOM_GPIO_I2C_ASSIGMENT *) 157 ((u8 *)gpio + sizeof(ATOM_GPIO_I2C_ASSIGMENT)); 158 } 159 } 160 161 return i2c; 162 } 163 164 void radeon_atombios_i2c_init(struct radeon_device *rdev) 165 { 166 struct atom_context *ctx = rdev->mode_info.atom_context; 167 ATOM_GPIO_I2C_ASSIGMENT *gpio; 168 struct radeon_i2c_bus_rec i2c; 169 int index = GetIndexIntoMasterTable(DATA, GPIO_I2C_Info); 170 struct _ATOM_GPIO_I2C_INFO *i2c_info; 171 uint16_t data_offset, size; 172 int i, num_indices; 173 char stmp[32]; 174 175 if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) { 176 i2c_info = (struct _ATOM_GPIO_I2C_INFO *)(ctx->bios + data_offset); 177 178 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / 179 sizeof(ATOM_GPIO_I2C_ASSIGMENT); 180 181 gpio = &i2c_info->asGPIO_Info[0]; 182 for (i = 0; i < num_indices; i++) { 183 radeon_lookup_i2c_gpio_quirks(rdev, gpio, i); 184 185 i2c = radeon_get_bus_rec_for_i2c_gpio(gpio); 186 187 if (i2c.valid) { 188 snprintf(stmp, sizeof(stmp), "0x%x", i2c.i2c_id); 189 rdev->i2c_bus[i] = radeon_i2c_create(rdev->ddev, &i2c, stmp); 190 } 191 gpio = (ATOM_GPIO_I2C_ASSIGMENT *) 192 ((u8 *)gpio + sizeof(ATOM_GPIO_I2C_ASSIGMENT)); 193 } 194 } 195 } 196 197 struct radeon_gpio_rec radeon_atombios_lookup_gpio(struct radeon_device *rdev, 198 u8 id) 199 { 200 struct atom_context *ctx = rdev->mode_info.atom_context; 201 struct radeon_gpio_rec gpio; 202 int index = GetIndexIntoMasterTable(DATA, GPIO_Pin_LUT); 203 struct _ATOM_GPIO_PIN_LUT *gpio_info; 204 ATOM_GPIO_PIN_ASSIGNMENT *pin; 205 u16 data_offset, size; 206 int i, num_indices; 207 208 memset(&gpio, 0, sizeof(struct radeon_gpio_rec)); 209 gpio.valid = false; 210 211 if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) { 212 gpio_info = (struct _ATOM_GPIO_PIN_LUT *)(ctx->bios + data_offset); 213 214 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / 215 sizeof(ATOM_GPIO_PIN_ASSIGNMENT); 216 217 pin = gpio_info->asGPIO_Pin; 218 for (i = 0; i < num_indices; i++) { 219 if (id == pin->ucGPIO_ID) { 220 gpio.id = pin->ucGPIO_ID; 221 gpio.reg = le16_to_cpu(pin->usGpioPin_AIndex) * 4; 222 gpio.shift = pin->ucGpioPinBitShift; 223 gpio.mask = (1 << pin->ucGpioPinBitShift); 224 gpio.valid = true; 225 break; 226 } 227 pin = (ATOM_GPIO_PIN_ASSIGNMENT *) 228 ((u8 *)pin + sizeof(ATOM_GPIO_PIN_ASSIGNMENT)); 229 } 230 } 231 232 return gpio; 233 } 234 235 static struct radeon_hpd radeon_atom_get_hpd_info_from_gpio(struct radeon_device *rdev, 236 struct radeon_gpio_rec *gpio) 237 { 238 struct radeon_hpd hpd; 239 u32 reg; 240 241 memset(&hpd, 0, sizeof(struct radeon_hpd)); 242 243 if (ASIC_IS_DCE6(rdev)) 244 reg = SI_DC_GPIO_HPD_A; 245 else if (ASIC_IS_DCE4(rdev)) 246 reg = EVERGREEN_DC_GPIO_HPD_A; 247 else 248 reg = AVIVO_DC_GPIO_HPD_A; 249 250 hpd.gpio = *gpio; 251 if (gpio->reg == reg) { 252 switch(gpio->mask) { 253 case (1 << 0): 254 hpd.hpd = RADEON_HPD_1; 255 break; 256 case (1 << 8): 257 hpd.hpd = RADEON_HPD_2; 258 break; 259 case (1 << 16): 260 hpd.hpd = RADEON_HPD_3; 261 break; 262 case (1 << 24): 263 hpd.hpd = RADEON_HPD_4; 264 break; 265 case (1 << 26): 266 hpd.hpd = RADEON_HPD_5; 267 break; 268 case (1 << 28): 269 hpd.hpd = RADEON_HPD_6; 270 break; 271 default: 272 hpd.hpd = RADEON_HPD_NONE; 273 break; 274 } 275 } else 276 hpd.hpd = RADEON_HPD_NONE; 277 return hpd; 278 } 279 280 static bool radeon_atom_apply_quirks(struct drm_device *dev, 281 uint32_t supported_device, 282 int *connector_type, 283 struct radeon_i2c_bus_rec *i2c_bus, 284 uint16_t *line_mux, 285 struct radeon_hpd *hpd) 286 { 287 #ifdef __linux__ 288 struct pci_dev *pdev = to_pci_dev(dev->dev); 289 #else 290 struct pci_dev *pdev = dev->pdev; 291 #endif 292 293 /* Asus M2A-VM HDMI board lists the DVI port as HDMI */ 294 if ((pdev->device == 0x791e) && 295 (pdev->subsystem_vendor == 0x1043) && 296 (pdev->subsystem_device == 0x826d)) { 297 if ((*connector_type == DRM_MODE_CONNECTOR_HDMIA) && 298 (supported_device == ATOM_DEVICE_DFP3_SUPPORT)) 299 *connector_type = DRM_MODE_CONNECTOR_DVID; 300 } 301 302 /* Asrock RS600 board lists the DVI port as HDMI */ 303 if ((pdev->device == 0x7941) && 304 (pdev->subsystem_vendor == 0x1849) && 305 (pdev->subsystem_device == 0x7941)) { 306 if ((*connector_type == DRM_MODE_CONNECTOR_HDMIA) && 307 (supported_device == ATOM_DEVICE_DFP3_SUPPORT)) 308 *connector_type = DRM_MODE_CONNECTOR_DVID; 309 } 310 311 /* MSI K9A2GM V2/V3 board has no HDMI or DVI */ 312 if ((pdev->device == 0x796e) && 313 (pdev->subsystem_vendor == 0x1462) && 314 (pdev->subsystem_device == 0x7302)) { 315 if ((supported_device == ATOM_DEVICE_DFP2_SUPPORT) || 316 (supported_device == ATOM_DEVICE_DFP3_SUPPORT)) 317 return false; 318 } 319 320 /* a-bit f-i90hd - ciaranm on #radeonhd - this board has no DVI */ 321 if ((pdev->device == 0x7941) && 322 (pdev->subsystem_vendor == 0x147b) && 323 (pdev->subsystem_device == 0x2412)) { 324 if (*connector_type == DRM_MODE_CONNECTOR_DVII) 325 return false; 326 } 327 328 /* Falcon NW laptop lists vga ddc line for LVDS */ 329 if ((pdev->device == 0x5653) && 330 (pdev->subsystem_vendor == 0x1462) && 331 (pdev->subsystem_device == 0x0291)) { 332 if (*connector_type == DRM_MODE_CONNECTOR_LVDS) { 333 i2c_bus->valid = false; 334 *line_mux = 53; 335 } 336 } 337 338 /* HIS X1300 is DVI+VGA, not DVI+DVI */ 339 if ((pdev->device == 0x7146) && 340 (pdev->subsystem_vendor == 0x17af) && 341 (pdev->subsystem_device == 0x2058)) { 342 if (supported_device == ATOM_DEVICE_DFP1_SUPPORT) 343 return false; 344 } 345 346 /* Gigabyte X1300 is DVI+VGA, not DVI+DVI */ 347 if ((pdev->device == 0x7142) && 348 (pdev->subsystem_vendor == 0x1458) && 349 (pdev->subsystem_device == 0x2134)) { 350 if (supported_device == ATOM_DEVICE_DFP1_SUPPORT) 351 return false; 352 } 353 354 355 /* Funky macbooks */ 356 if ((pdev->device == 0x71C5) && 357 (pdev->subsystem_vendor == 0x106b) && 358 (pdev->subsystem_device == 0x0080)) { 359 if ((supported_device == ATOM_DEVICE_CRT1_SUPPORT) || 360 (supported_device == ATOM_DEVICE_DFP2_SUPPORT)) 361 return false; 362 if (supported_device == ATOM_DEVICE_CRT2_SUPPORT) 363 *line_mux = 0x90; 364 } 365 366 /* mac rv630, rv730, others */ 367 if ((supported_device == ATOM_DEVICE_TV1_SUPPORT) && 368 (*connector_type == DRM_MODE_CONNECTOR_DVII)) { 369 *connector_type = DRM_MODE_CONNECTOR_9PinDIN; 370 *line_mux = CONNECTOR_7PIN_DIN_ENUM_ID1; 371 } 372 373 /* ASUS HD 3600 XT board lists the DVI port as HDMI */ 374 if ((pdev->device == 0x9598) && 375 (pdev->subsystem_vendor == 0x1043) && 376 (pdev->subsystem_device == 0x01da)) { 377 if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) { 378 *connector_type = DRM_MODE_CONNECTOR_DVII; 379 } 380 } 381 382 /* ASUS HD 3600 board lists the DVI port as HDMI */ 383 if ((pdev->device == 0x9598) && 384 (pdev->subsystem_vendor == 0x1043) && 385 (pdev->subsystem_device == 0x01e4)) { 386 if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) { 387 *connector_type = DRM_MODE_CONNECTOR_DVII; 388 } 389 } 390 391 /* ASUS HD 3450 board lists the DVI port as HDMI */ 392 if ((pdev->device == 0x95C5) && 393 (pdev->subsystem_vendor == 0x1043) && 394 (pdev->subsystem_device == 0x01e2)) { 395 if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) { 396 *connector_type = DRM_MODE_CONNECTOR_DVII; 397 } 398 } 399 400 /* some BIOSes seem to report DAC on HDMI - usually this is a board with 401 * HDMI + VGA reporting as HDMI 402 */ 403 if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) { 404 if (supported_device & (ATOM_DEVICE_CRT_SUPPORT)) { 405 *connector_type = DRM_MODE_CONNECTOR_VGA; 406 *line_mux = 0; 407 } 408 } 409 410 /* Acer laptop (Acer TravelMate 5730/5730G) has an HDMI port 411 * on the laptop and a DVI port on the docking station and 412 * both share the same encoder, hpd pin, and ddc line. 413 * So while the bios table is technically correct, 414 * we drop the DVI port here since xrandr has no concept of 415 * encoders and will try and drive both connectors 416 * with different crtcs which isn't possible on the hardware 417 * side and leaves no crtcs for LVDS or VGA. 418 */ 419 if (((pdev->device == 0x95c4) || (pdev->device == 0x9591)) && 420 (pdev->subsystem_vendor == 0x1025) && 421 (pdev->subsystem_device == 0x013c)) { 422 if ((*connector_type == DRM_MODE_CONNECTOR_DVII) && 423 (supported_device == ATOM_DEVICE_DFP1_SUPPORT)) { 424 /* actually it's a DVI-D port not DVI-I */ 425 *connector_type = DRM_MODE_CONNECTOR_DVID; 426 return false; 427 } 428 } 429 430 /* XFX Pine Group device rv730 reports no VGA DDC lines 431 * even though they are wired up to record 0x93 432 */ 433 if ((pdev->device == 0x9498) && 434 (pdev->subsystem_vendor == 0x1682) && 435 (pdev->subsystem_device == 0x2452) && 436 (i2c_bus->valid == false) && 437 !(supported_device & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT))) { 438 struct radeon_device *rdev = dev->dev_private; 439 *i2c_bus = radeon_lookup_i2c_gpio(rdev, 0x93); 440 } 441 442 /* Fujitsu D3003-S2 board lists DVI-I as DVI-D and VGA */ 443 if (((pdev->device == 0x9802) || 444 (pdev->device == 0x9805) || 445 (pdev->device == 0x9806)) && 446 (pdev->subsystem_vendor == 0x1734) && 447 (pdev->subsystem_device == 0x11bd)) { 448 if (*connector_type == DRM_MODE_CONNECTOR_VGA) { 449 *connector_type = DRM_MODE_CONNECTOR_DVII; 450 *line_mux = 0x3103; 451 } else if (*connector_type == DRM_MODE_CONNECTOR_DVID) { 452 *connector_type = DRM_MODE_CONNECTOR_DVII; 453 } 454 } 455 456 return true; 457 } 458 459 static const int supported_devices_connector_convert[] = { 460 DRM_MODE_CONNECTOR_Unknown, 461 DRM_MODE_CONNECTOR_VGA, 462 DRM_MODE_CONNECTOR_DVII, 463 DRM_MODE_CONNECTOR_DVID, 464 DRM_MODE_CONNECTOR_DVIA, 465 DRM_MODE_CONNECTOR_SVIDEO, 466 DRM_MODE_CONNECTOR_Composite, 467 DRM_MODE_CONNECTOR_LVDS, 468 DRM_MODE_CONNECTOR_Unknown, 469 DRM_MODE_CONNECTOR_Unknown, 470 DRM_MODE_CONNECTOR_HDMIA, 471 DRM_MODE_CONNECTOR_HDMIB, 472 DRM_MODE_CONNECTOR_Unknown, 473 DRM_MODE_CONNECTOR_Unknown, 474 DRM_MODE_CONNECTOR_9PinDIN, 475 DRM_MODE_CONNECTOR_DisplayPort 476 }; 477 478 static const uint16_t supported_devices_connector_object_id_convert[] = { 479 CONNECTOR_OBJECT_ID_NONE, 480 CONNECTOR_OBJECT_ID_VGA, 481 CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I, /* not all boards support DL */ 482 CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D, /* not all boards support DL */ 483 CONNECTOR_OBJECT_ID_VGA, /* technically DVI-A */ 484 CONNECTOR_OBJECT_ID_COMPOSITE, 485 CONNECTOR_OBJECT_ID_SVIDEO, 486 CONNECTOR_OBJECT_ID_LVDS, 487 CONNECTOR_OBJECT_ID_9PIN_DIN, 488 CONNECTOR_OBJECT_ID_9PIN_DIN, 489 CONNECTOR_OBJECT_ID_DISPLAYPORT, 490 CONNECTOR_OBJECT_ID_HDMI_TYPE_A, 491 CONNECTOR_OBJECT_ID_HDMI_TYPE_B, 492 CONNECTOR_OBJECT_ID_SVIDEO 493 }; 494 495 static const int object_connector_convert[] = { 496 DRM_MODE_CONNECTOR_Unknown, 497 DRM_MODE_CONNECTOR_DVII, 498 DRM_MODE_CONNECTOR_DVII, 499 DRM_MODE_CONNECTOR_DVID, 500 DRM_MODE_CONNECTOR_DVID, 501 DRM_MODE_CONNECTOR_VGA, 502 DRM_MODE_CONNECTOR_Composite, 503 DRM_MODE_CONNECTOR_SVIDEO, 504 DRM_MODE_CONNECTOR_Unknown, 505 DRM_MODE_CONNECTOR_Unknown, 506 DRM_MODE_CONNECTOR_9PinDIN, 507 DRM_MODE_CONNECTOR_Unknown, 508 DRM_MODE_CONNECTOR_HDMIA, 509 DRM_MODE_CONNECTOR_HDMIB, 510 DRM_MODE_CONNECTOR_LVDS, 511 DRM_MODE_CONNECTOR_9PinDIN, 512 DRM_MODE_CONNECTOR_Unknown, 513 DRM_MODE_CONNECTOR_Unknown, 514 DRM_MODE_CONNECTOR_Unknown, 515 DRM_MODE_CONNECTOR_DisplayPort, 516 DRM_MODE_CONNECTOR_eDP, 517 DRM_MODE_CONNECTOR_Unknown 518 }; 519 520 bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) 521 { 522 struct radeon_device *rdev = dev->dev_private; 523 struct radeon_mode_info *mode_info = &rdev->mode_info; 524 struct atom_context *ctx = mode_info->atom_context; 525 int index = GetIndexIntoMasterTable(DATA, Object_Header); 526 u16 size, data_offset; 527 u8 frev, crev; 528 ATOM_CONNECTOR_OBJECT_TABLE *con_obj; 529 ATOM_ENCODER_OBJECT_TABLE *enc_obj; 530 ATOM_OBJECT_TABLE *router_obj; 531 ATOM_DISPLAY_OBJECT_PATH_TABLE *path_obj; 532 ATOM_OBJECT_HEADER *obj_header; 533 int i, j, k, path_size, device_support; 534 int connector_type; 535 u16 igp_lane_info, conn_id, connector_object_id; 536 struct radeon_i2c_bus_rec ddc_bus; 537 struct radeon_router router; 538 struct radeon_gpio_rec gpio; 539 struct radeon_hpd hpd; 540 541 if (!atom_parse_data_header(ctx, index, &size, &frev, &crev, &data_offset)) 542 return false; 543 544 if (crev < 2) 545 return false; 546 547 obj_header = (ATOM_OBJECT_HEADER *) (ctx->bios + data_offset); 548 path_obj = (ATOM_DISPLAY_OBJECT_PATH_TABLE *) 549 (ctx->bios + data_offset + 550 le16_to_cpu(obj_header->usDisplayPathTableOffset)); 551 con_obj = (ATOM_CONNECTOR_OBJECT_TABLE *) 552 (ctx->bios + data_offset + 553 le16_to_cpu(obj_header->usConnectorObjectTableOffset)); 554 enc_obj = (ATOM_ENCODER_OBJECT_TABLE *) 555 (ctx->bios + data_offset + 556 le16_to_cpu(obj_header->usEncoderObjectTableOffset)); 557 router_obj = (ATOM_OBJECT_TABLE *) 558 (ctx->bios + data_offset + 559 le16_to_cpu(obj_header->usRouterObjectTableOffset)); 560 device_support = le16_to_cpu(obj_header->usDeviceSupport); 561 562 path_size = 0; 563 for (i = 0; i < path_obj->ucNumOfDispPath; i++) { 564 uint8_t *addr = (uint8_t *) path_obj->asDispPath; 565 ATOM_DISPLAY_OBJECT_PATH *path; 566 addr += path_size; 567 path = (ATOM_DISPLAY_OBJECT_PATH *) addr; 568 path_size += le16_to_cpu(path->usSize); 569 570 if (device_support & le16_to_cpu(path->usDeviceTag)) { 571 uint8_t con_obj_id, con_obj_num; 572 573 con_obj_id = 574 (le16_to_cpu(path->usConnObjectId) & OBJECT_ID_MASK) 575 >> OBJECT_ID_SHIFT; 576 con_obj_num = 577 (le16_to_cpu(path->usConnObjectId) & ENUM_ID_MASK) 578 >> ENUM_ID_SHIFT; 579 580 /* TODO CV support */ 581 if (le16_to_cpu(path->usDeviceTag) == 582 ATOM_DEVICE_CV_SUPPORT) 583 continue; 584 585 /* IGP chips */ 586 if ((rdev->flags & RADEON_IS_IGP) && 587 (con_obj_id == 588 CONNECTOR_OBJECT_ID_PCIE_CONNECTOR)) { 589 uint16_t igp_offset = 0; 590 ATOM_INTEGRATED_SYSTEM_INFO_V2 *igp_obj; 591 592 index = 593 GetIndexIntoMasterTable(DATA, 594 IntegratedSystemInfo); 595 596 if (atom_parse_data_header(ctx, index, &size, &frev, 597 &crev, &igp_offset)) { 598 599 if (crev >= 2) { 600 igp_obj = 601 (ATOM_INTEGRATED_SYSTEM_INFO_V2 602 *) (ctx->bios + igp_offset); 603 604 if (igp_obj) { 605 uint32_t slot_config, ct; 606 607 if (con_obj_num == 1) 608 slot_config = 609 igp_obj-> 610 ulDDISlot1Config; 611 else 612 slot_config = 613 igp_obj-> 614 ulDDISlot2Config; 615 616 ct = (slot_config >> 16) & 0xff; 617 connector_type = 618 object_connector_convert 619 [ct]; 620 connector_object_id = ct; 621 igp_lane_info = 622 slot_config & 0xffff; 623 } else 624 continue; 625 } else 626 continue; 627 } else { 628 igp_lane_info = 0; 629 connector_type = 630 object_connector_convert[con_obj_id]; 631 connector_object_id = con_obj_id; 632 } 633 } else { 634 igp_lane_info = 0; 635 connector_type = 636 object_connector_convert[con_obj_id]; 637 connector_object_id = con_obj_id; 638 } 639 640 if (connector_type == DRM_MODE_CONNECTOR_Unknown) 641 continue; 642 643 router.ddc_valid = false; 644 router.cd_valid = false; 645 for (j = 0; j < ((le16_to_cpu(path->usSize) - 8) / 2); j++) { 646 uint8_t grph_obj_type = 647 (le16_to_cpu(path->usGraphicObjIds[j]) & 648 OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT; 649 650 if (grph_obj_type == GRAPH_OBJECT_TYPE_ENCODER) { 651 for (k = 0; k < enc_obj->ucNumberOfObjects; k++) { 652 u16 encoder_obj = le16_to_cpu(enc_obj->asObjects[k].usObjectID); 653 if (le16_to_cpu(path->usGraphicObjIds[j]) == encoder_obj) { 654 ATOM_COMMON_RECORD_HEADER *record = (ATOM_COMMON_RECORD_HEADER *) 655 (ctx->bios + data_offset + 656 le16_to_cpu(enc_obj->asObjects[k].usRecordOffset)); 657 ATOM_ENCODER_CAP_RECORD *cap_record; 658 u16 caps = 0; 659 660 while (record->ucRecordSize > 0 && 661 record->ucRecordType > 0 && 662 record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) { 663 switch (record->ucRecordType) { 664 case ATOM_ENCODER_CAP_RECORD_TYPE: 665 cap_record =(ATOM_ENCODER_CAP_RECORD *) 666 record; 667 caps = le16_to_cpu(cap_record->usEncoderCap); 668 break; 669 } 670 record = (ATOM_COMMON_RECORD_HEADER *) 671 ((char *)record + record->ucRecordSize); 672 } 673 radeon_add_atom_encoder(dev, 674 encoder_obj, 675 le16_to_cpu 676 (path-> 677 usDeviceTag), 678 caps); 679 } 680 } 681 } else if (grph_obj_type == GRAPH_OBJECT_TYPE_ROUTER) { 682 for (k = 0; k < router_obj->ucNumberOfObjects; k++) { 683 u16 router_obj_id = le16_to_cpu(router_obj->asObjects[k].usObjectID); 684 if (le16_to_cpu(path->usGraphicObjIds[j]) == router_obj_id) { 685 ATOM_COMMON_RECORD_HEADER *record = (ATOM_COMMON_RECORD_HEADER *) 686 (ctx->bios + data_offset + 687 le16_to_cpu(router_obj->asObjects[k].usRecordOffset)); 688 ATOM_I2C_RECORD *i2c_record; 689 ATOM_I2C_ID_CONFIG_ACCESS *i2c_config; 690 ATOM_ROUTER_DDC_PATH_SELECT_RECORD *ddc_path; 691 ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD *cd_path; 692 ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT *router_src_dst_table = 693 (ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT *) 694 (ctx->bios + data_offset + 695 le16_to_cpu(router_obj->asObjects[k].usSrcDstTableOffset)); 696 u8 *num_dst_objs = (u8 *) 697 ((u8 *)router_src_dst_table + 1 + 698 (router_src_dst_table->ucNumberOfSrc * 2)); 699 u16 *dst_objs = (u16 *)(num_dst_objs + 1); 700 int enum_id; 701 702 router.router_id = router_obj_id; 703 for (enum_id = 0; enum_id < (*num_dst_objs); enum_id++) { 704 if (le16_to_cpu(path->usConnObjectId) == 705 le16_to_cpu(dst_objs[enum_id])) 706 break; 707 } 708 709 while (record->ucRecordSize > 0 && 710 record->ucRecordType > 0 && 711 record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) { 712 switch (record->ucRecordType) { 713 case ATOM_I2C_RECORD_TYPE: 714 i2c_record = 715 (ATOM_I2C_RECORD *) 716 record; 717 i2c_config = 718 (ATOM_I2C_ID_CONFIG_ACCESS *) 719 &i2c_record->sucI2cId; 720 router.i2c_info = 721 radeon_lookup_i2c_gpio(rdev, 722 i2c_config-> 723 ucAccess); 724 router.i2c_addr = i2c_record->ucI2CAddr >> 1; 725 break; 726 case ATOM_ROUTER_DDC_PATH_SELECT_RECORD_TYPE: 727 ddc_path = (ATOM_ROUTER_DDC_PATH_SELECT_RECORD *) 728 record; 729 router.ddc_valid = true; 730 router.ddc_mux_type = ddc_path->ucMuxType; 731 router.ddc_mux_control_pin = ddc_path->ucMuxControlPin; 732 router.ddc_mux_state = ddc_path->ucMuxState[enum_id]; 733 break; 734 case ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD_TYPE: 735 cd_path = (ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD *) 736 record; 737 router.cd_valid = true; 738 router.cd_mux_type = cd_path->ucMuxType; 739 router.cd_mux_control_pin = cd_path->ucMuxControlPin; 740 router.cd_mux_state = cd_path->ucMuxState[enum_id]; 741 break; 742 } 743 record = (ATOM_COMMON_RECORD_HEADER *) 744 ((char *)record + record->ucRecordSize); 745 } 746 } 747 } 748 } 749 } 750 751 /* look up gpio for ddc, hpd */ 752 ddc_bus.valid = false; 753 hpd.hpd = RADEON_HPD_NONE; 754 if ((le16_to_cpu(path->usDeviceTag) & 755 (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) == 0) { 756 for (j = 0; j < con_obj->ucNumberOfObjects; j++) { 757 if (le16_to_cpu(path->usConnObjectId) == 758 le16_to_cpu(con_obj->asObjects[j]. 759 usObjectID)) { 760 ATOM_COMMON_RECORD_HEADER 761 *record = 762 (ATOM_COMMON_RECORD_HEADER 763 *) 764 (ctx->bios + data_offset + 765 le16_to_cpu(con_obj-> 766 asObjects[j]. 767 usRecordOffset)); 768 ATOM_I2C_RECORD *i2c_record; 769 ATOM_HPD_INT_RECORD *hpd_record; 770 ATOM_I2C_ID_CONFIG_ACCESS *i2c_config; 771 772 while (record->ucRecordSize > 0 && 773 record->ucRecordType > 0 && 774 record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) { 775 switch (record->ucRecordType) { 776 case ATOM_I2C_RECORD_TYPE: 777 i2c_record = 778 (ATOM_I2C_RECORD *) 779 record; 780 i2c_config = 781 (ATOM_I2C_ID_CONFIG_ACCESS *) 782 &i2c_record->sucI2cId; 783 ddc_bus = radeon_lookup_i2c_gpio(rdev, 784 i2c_config-> 785 ucAccess); 786 break; 787 case ATOM_HPD_INT_RECORD_TYPE: 788 hpd_record = 789 (ATOM_HPD_INT_RECORD *) 790 record; 791 gpio = radeon_atombios_lookup_gpio(rdev, 792 hpd_record->ucHPDIntGPIOID); 793 hpd = radeon_atom_get_hpd_info_from_gpio(rdev, &gpio); 794 hpd.plugged_state = hpd_record->ucPlugged_PinState; 795 break; 796 } 797 record = 798 (ATOM_COMMON_RECORD_HEADER 799 *) ((char *)record 800 + 801 record-> 802 ucRecordSize); 803 } 804 break; 805 } 806 } 807 } 808 809 /* needed for aux chan transactions */ 810 ddc_bus.hpd = hpd.hpd; 811 812 conn_id = le16_to_cpu(path->usConnObjectId); 813 814 if (!radeon_atom_apply_quirks 815 (dev, le16_to_cpu(path->usDeviceTag), &connector_type, 816 &ddc_bus, &conn_id, &hpd)) 817 continue; 818 819 radeon_add_atom_connector(dev, 820 conn_id, 821 le16_to_cpu(path-> 822 usDeviceTag), 823 connector_type, &ddc_bus, 824 igp_lane_info, 825 connector_object_id, 826 &hpd, 827 &router); 828 829 } 830 } 831 832 radeon_link_encoder_connector(dev); 833 return true; 834 } 835 836 static uint16_t atombios_get_connector_object_id(struct drm_device *dev, 837 int connector_type, 838 uint16_t devices) 839 { 840 struct radeon_device *rdev = dev->dev_private; 841 842 if (rdev->flags & RADEON_IS_IGP) { 843 return supported_devices_connector_object_id_convert 844 [connector_type]; 845 } else if (((connector_type == DRM_MODE_CONNECTOR_DVII) || 846 (connector_type == DRM_MODE_CONNECTOR_DVID)) && 847 (devices & ATOM_DEVICE_DFP2_SUPPORT)) { 848 struct radeon_mode_info *mode_info = &rdev->mode_info; 849 struct atom_context *ctx = mode_info->atom_context; 850 int index = GetIndexIntoMasterTable(DATA, XTMDS_Info); 851 uint16_t size, data_offset; 852 uint8_t frev, crev; 853 ATOM_XTMDS_INFO *xtmds; 854 855 if (atom_parse_data_header(ctx, index, &size, &frev, &crev, &data_offset)) { 856 xtmds = (ATOM_XTMDS_INFO *)(ctx->bios + data_offset); 857 858 if (xtmds->ucSupportedLink & ATOM_XTMDS_SUPPORTED_DUALLINK) { 859 if (connector_type == DRM_MODE_CONNECTOR_DVII) 860 return CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I; 861 else 862 return CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D; 863 } else { 864 if (connector_type == DRM_MODE_CONNECTOR_DVII) 865 return CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I; 866 else 867 return CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D; 868 } 869 } else 870 return supported_devices_connector_object_id_convert 871 [connector_type]; 872 } else { 873 return supported_devices_connector_object_id_convert 874 [connector_type]; 875 } 876 } 877 878 struct bios_connector { 879 bool valid; 880 uint16_t line_mux; 881 uint16_t devices; 882 int connector_type; 883 struct radeon_i2c_bus_rec ddc_bus; 884 struct radeon_hpd hpd; 885 }; 886 887 bool radeon_get_atom_connector_info_from_supported_devices_table(struct 888 drm_device 889 *dev) 890 { 891 struct radeon_device *rdev = dev->dev_private; 892 struct radeon_mode_info *mode_info = &rdev->mode_info; 893 struct atom_context *ctx = mode_info->atom_context; 894 int index = GetIndexIntoMasterTable(DATA, SupportedDevicesInfo); 895 uint16_t size, data_offset; 896 uint8_t frev, crev; 897 uint16_t device_support; 898 uint8_t dac; 899 union atom_supported_devices *supported_devices; 900 int i, j, max_device; 901 struct bios_connector *bios_connectors; 902 size_t bc_size = sizeof(*bios_connectors) * ATOM_MAX_SUPPORTED_DEVICE; 903 struct radeon_router router; 904 905 router.ddc_valid = false; 906 router.cd_valid = false; 907 908 bios_connectors = kzalloc(bc_size, GFP_KERNEL); 909 if (!bios_connectors) 910 return false; 911 912 if (!atom_parse_data_header(ctx, index, &size, &frev, &crev, 913 &data_offset)) { 914 kfree(bios_connectors); 915 return false; 916 } 917 918 supported_devices = 919 (union atom_supported_devices *)(ctx->bios + data_offset); 920 921 device_support = le16_to_cpu(supported_devices->info.usDeviceSupport); 922 923 if (frev > 1) 924 max_device = ATOM_MAX_SUPPORTED_DEVICE; 925 else 926 max_device = ATOM_MAX_SUPPORTED_DEVICE_INFO; 927 928 for (i = 0; i < max_device; i++) { 929 ATOM_CONNECTOR_INFO_I2C ci; 930 931 if (frev > 1) 932 ci = supported_devices->info_2d1.asConnInfo[i]; 933 else 934 ci = supported_devices->info.asConnInfo[i]; 935 936 bios_connectors[i].valid = false; 937 938 if (!(device_support & (1 << i))) { 939 continue; 940 } 941 942 if (i == ATOM_DEVICE_CV_INDEX) { 943 DRM_DEBUG_KMS("Skipping Component Video\n"); 944 continue; 945 } 946 947 bios_connectors[i].connector_type = 948 supported_devices_connector_convert[ci.sucConnectorInfo. 949 sbfAccess. 950 bfConnectorType]; 951 952 if (bios_connectors[i].connector_type == 953 DRM_MODE_CONNECTOR_Unknown) 954 continue; 955 956 dac = ci.sucConnectorInfo.sbfAccess.bfAssociatedDAC; 957 958 bios_connectors[i].line_mux = 959 ci.sucI2cId.ucAccess; 960 961 /* give tv unique connector ids */ 962 if (i == ATOM_DEVICE_TV1_INDEX) { 963 bios_connectors[i].ddc_bus.valid = false; 964 bios_connectors[i].line_mux = 50; 965 } else if (i == ATOM_DEVICE_TV2_INDEX) { 966 bios_connectors[i].ddc_bus.valid = false; 967 bios_connectors[i].line_mux = 51; 968 } else if (i == ATOM_DEVICE_CV_INDEX) { 969 bios_connectors[i].ddc_bus.valid = false; 970 bios_connectors[i].line_mux = 52; 971 } else 972 bios_connectors[i].ddc_bus = 973 radeon_lookup_i2c_gpio(rdev, 974 bios_connectors[i].line_mux); 975 976 if ((crev > 1) && (frev > 1)) { 977 u8 isb = supported_devices->info_2d1.asIntSrcInfo[i].ucIntSrcBitmap; 978 switch (isb) { 979 case 0x4: 980 bios_connectors[i].hpd.hpd = RADEON_HPD_1; 981 break; 982 case 0xa: 983 bios_connectors[i].hpd.hpd = RADEON_HPD_2; 984 break; 985 default: 986 bios_connectors[i].hpd.hpd = RADEON_HPD_NONE; 987 break; 988 } 989 } else { 990 if (i == ATOM_DEVICE_DFP1_INDEX) 991 bios_connectors[i].hpd.hpd = RADEON_HPD_1; 992 else if (i == ATOM_DEVICE_DFP2_INDEX) 993 bios_connectors[i].hpd.hpd = RADEON_HPD_2; 994 else 995 bios_connectors[i].hpd.hpd = RADEON_HPD_NONE; 996 } 997 998 /* Always set the connector type to VGA for CRT1/CRT2. if they are 999 * shared with a DVI port, we'll pick up the DVI connector when we 1000 * merge the outputs. Some bioses incorrectly list VGA ports as DVI. 1001 */ 1002 if (i == ATOM_DEVICE_CRT1_INDEX || i == ATOM_DEVICE_CRT2_INDEX) 1003 bios_connectors[i].connector_type = 1004 DRM_MODE_CONNECTOR_VGA; 1005 1006 if (!radeon_atom_apply_quirks 1007 (dev, (1 << i), &bios_connectors[i].connector_type, 1008 &bios_connectors[i].ddc_bus, &bios_connectors[i].line_mux, 1009 &bios_connectors[i].hpd)) 1010 continue; 1011 1012 bios_connectors[i].valid = true; 1013 bios_connectors[i].devices = (1 << i); 1014 1015 if (ASIC_IS_AVIVO(rdev) || radeon_r4xx_atom) 1016 radeon_add_atom_encoder(dev, 1017 radeon_get_encoder_enum(dev, 1018 (1 << i), 1019 dac), 1020 (1 << i), 1021 0); 1022 else 1023 radeon_add_legacy_encoder(dev, 1024 radeon_get_encoder_enum(dev, 1025 (1 << i), 1026 dac), 1027 (1 << i)); 1028 } 1029 1030 /* combine shared connectors */ 1031 for (i = 0; i < max_device; i++) { 1032 if (bios_connectors[i].valid) { 1033 for (j = 0; j < max_device; j++) { 1034 if (bios_connectors[j].valid && (i != j)) { 1035 if (bios_connectors[i].line_mux == 1036 bios_connectors[j].line_mux) { 1037 /* make sure not to combine LVDS */ 1038 if (bios_connectors[i].devices & (ATOM_DEVICE_LCD_SUPPORT)) { 1039 bios_connectors[i].line_mux = 53; 1040 bios_connectors[i].ddc_bus.valid = false; 1041 continue; 1042 } 1043 if (bios_connectors[j].devices & (ATOM_DEVICE_LCD_SUPPORT)) { 1044 bios_connectors[j].line_mux = 53; 1045 bios_connectors[j].ddc_bus.valid = false; 1046 continue; 1047 } 1048 /* combine analog and digital for DVI-I */ 1049 if (((bios_connectors[i].devices & (ATOM_DEVICE_DFP_SUPPORT)) && 1050 (bios_connectors[j].devices & (ATOM_DEVICE_CRT_SUPPORT))) || 1051 ((bios_connectors[j].devices & (ATOM_DEVICE_DFP_SUPPORT)) && 1052 (bios_connectors[i].devices & (ATOM_DEVICE_CRT_SUPPORT)))) { 1053 bios_connectors[i].devices |= 1054 bios_connectors[j].devices; 1055 bios_connectors[i].connector_type = 1056 DRM_MODE_CONNECTOR_DVII; 1057 if (bios_connectors[j].devices & (ATOM_DEVICE_DFP_SUPPORT)) 1058 bios_connectors[i].hpd = 1059 bios_connectors[j].hpd; 1060 bios_connectors[j].valid = false; 1061 } 1062 } 1063 } 1064 } 1065 } 1066 } 1067 1068 /* add the connectors */ 1069 for (i = 0; i < max_device; i++) { 1070 if (bios_connectors[i].valid) { 1071 uint16_t connector_object_id = 1072 atombios_get_connector_object_id(dev, 1073 bios_connectors[i].connector_type, 1074 bios_connectors[i].devices); 1075 radeon_add_atom_connector(dev, 1076 bios_connectors[i].line_mux, 1077 bios_connectors[i].devices, 1078 bios_connectors[i]. 1079 connector_type, 1080 &bios_connectors[i].ddc_bus, 1081 0, 1082 connector_object_id, 1083 &bios_connectors[i].hpd, 1084 &router); 1085 } 1086 } 1087 1088 radeon_link_encoder_connector(dev); 1089 1090 kfree(bios_connectors); 1091 return true; 1092 } 1093 1094 union firmware_info { 1095 ATOM_FIRMWARE_INFO info; 1096 ATOM_FIRMWARE_INFO_V1_2 info_12; 1097 ATOM_FIRMWARE_INFO_V1_3 info_13; 1098 ATOM_FIRMWARE_INFO_V1_4 info_14; 1099 ATOM_FIRMWARE_INFO_V2_1 info_21; 1100 ATOM_FIRMWARE_INFO_V2_2 info_22; 1101 }; 1102 1103 union igp_info { 1104 struct _ATOM_INTEGRATED_SYSTEM_INFO info; 1105 struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2; 1106 struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 info_6; 1107 struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_7 info_7; 1108 struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_8 info_8; 1109 }; 1110 1111 static void radeon_atombios_get_dentist_vco_freq(struct radeon_device *rdev) 1112 { 1113 struct radeon_mode_info *mode_info = &rdev->mode_info; 1114 int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo); 1115 union igp_info *igp_info; 1116 u8 frev, crev; 1117 u16 data_offset; 1118 1119 if (atom_parse_data_header(mode_info->atom_context, index, NULL, 1120 &frev, &crev, &data_offset)) { 1121 igp_info = (union igp_info *)(mode_info->atom_context->bios + 1122 data_offset); 1123 rdev->clock.vco_freq = 1124 le32_to_cpu(igp_info->info_6.ulDentistVCOFreq); 1125 } 1126 } 1127 1128 bool radeon_atom_get_clock_info(struct drm_device *dev) 1129 { 1130 struct radeon_device *rdev = dev->dev_private; 1131 struct radeon_mode_info *mode_info = &rdev->mode_info; 1132 int index = GetIndexIntoMasterTable(DATA, FirmwareInfo); 1133 union firmware_info *firmware_info; 1134 uint8_t frev, crev; 1135 struct radeon_pll *p1pll = &rdev->clock.p1pll; 1136 struct radeon_pll *p2pll = &rdev->clock.p2pll; 1137 struct radeon_pll *dcpll = &rdev->clock.dcpll; 1138 struct radeon_pll *spll = &rdev->clock.spll; 1139 struct radeon_pll *mpll = &rdev->clock.mpll; 1140 uint16_t data_offset; 1141 1142 if (atom_parse_data_header(mode_info->atom_context, index, NULL, 1143 &frev, &crev, &data_offset)) { 1144 firmware_info = 1145 (union firmware_info *)(mode_info->atom_context->bios + 1146 data_offset); 1147 /* pixel clocks */ 1148 p1pll->reference_freq = 1149 le16_to_cpu(firmware_info->info.usReferenceClock); 1150 p1pll->reference_div = 0; 1151 1152 if ((frev < 2) && (crev < 2)) 1153 p1pll->pll_out_min = 1154 le16_to_cpu(firmware_info->info.usMinPixelClockPLL_Output); 1155 else 1156 p1pll->pll_out_min = 1157 le32_to_cpu(firmware_info->info_12.ulMinPixelClockPLL_Output); 1158 p1pll->pll_out_max = 1159 le32_to_cpu(firmware_info->info.ulMaxPixelClockPLL_Output); 1160 1161 if (((frev < 2) && (crev >= 4)) || (frev >= 2)) { 1162 p1pll->lcd_pll_out_min = 1163 le16_to_cpu(firmware_info->info_14.usLcdMinPixelClockPLL_Output) * 100; 1164 if (p1pll->lcd_pll_out_min == 0) 1165 p1pll->lcd_pll_out_min = p1pll->pll_out_min; 1166 p1pll->lcd_pll_out_max = 1167 le16_to_cpu(firmware_info->info_14.usLcdMaxPixelClockPLL_Output) * 100; 1168 if (p1pll->lcd_pll_out_max == 0) 1169 p1pll->lcd_pll_out_max = p1pll->pll_out_max; 1170 } else { 1171 p1pll->lcd_pll_out_min = p1pll->pll_out_min; 1172 p1pll->lcd_pll_out_max = p1pll->pll_out_max; 1173 } 1174 1175 if (p1pll->pll_out_min == 0) { 1176 if (ASIC_IS_AVIVO(rdev)) 1177 p1pll->pll_out_min = 64800; 1178 else 1179 p1pll->pll_out_min = 20000; 1180 } 1181 1182 p1pll->pll_in_min = 1183 le16_to_cpu(firmware_info->info.usMinPixelClockPLL_Input); 1184 p1pll->pll_in_max = 1185 le16_to_cpu(firmware_info->info.usMaxPixelClockPLL_Input); 1186 1187 *p2pll = *p1pll; 1188 1189 /* system clock */ 1190 if (ASIC_IS_DCE4(rdev)) 1191 spll->reference_freq = 1192 le16_to_cpu(firmware_info->info_21.usCoreReferenceClock); 1193 else 1194 spll->reference_freq = 1195 le16_to_cpu(firmware_info->info.usReferenceClock); 1196 spll->reference_div = 0; 1197 1198 spll->pll_out_min = 1199 le16_to_cpu(firmware_info->info.usMinEngineClockPLL_Output); 1200 spll->pll_out_max = 1201 le32_to_cpu(firmware_info->info.ulMaxEngineClockPLL_Output); 1202 1203 /* ??? */ 1204 if (spll->pll_out_min == 0) { 1205 if (ASIC_IS_AVIVO(rdev)) 1206 spll->pll_out_min = 64800; 1207 else 1208 spll->pll_out_min = 20000; 1209 } 1210 1211 spll->pll_in_min = 1212 le16_to_cpu(firmware_info->info.usMinEngineClockPLL_Input); 1213 spll->pll_in_max = 1214 le16_to_cpu(firmware_info->info.usMaxEngineClockPLL_Input); 1215 1216 /* memory clock */ 1217 if (ASIC_IS_DCE4(rdev)) 1218 mpll->reference_freq = 1219 le16_to_cpu(firmware_info->info_21.usMemoryReferenceClock); 1220 else 1221 mpll->reference_freq = 1222 le16_to_cpu(firmware_info->info.usReferenceClock); 1223 mpll->reference_div = 0; 1224 1225 mpll->pll_out_min = 1226 le16_to_cpu(firmware_info->info.usMinMemoryClockPLL_Output); 1227 mpll->pll_out_max = 1228 le32_to_cpu(firmware_info->info.ulMaxMemoryClockPLL_Output); 1229 1230 /* ??? */ 1231 if (mpll->pll_out_min == 0) { 1232 if (ASIC_IS_AVIVO(rdev)) 1233 mpll->pll_out_min = 64800; 1234 else 1235 mpll->pll_out_min = 20000; 1236 } 1237 1238 mpll->pll_in_min = 1239 le16_to_cpu(firmware_info->info.usMinMemoryClockPLL_Input); 1240 mpll->pll_in_max = 1241 le16_to_cpu(firmware_info->info.usMaxMemoryClockPLL_Input); 1242 1243 rdev->clock.default_sclk = 1244 le32_to_cpu(firmware_info->info.ulDefaultEngineClock); 1245 rdev->clock.default_mclk = 1246 le32_to_cpu(firmware_info->info.ulDefaultMemoryClock); 1247 1248 if (ASIC_IS_DCE4(rdev)) { 1249 rdev->clock.default_dispclk = 1250 le32_to_cpu(firmware_info->info_21.ulDefaultDispEngineClkFreq); 1251 if (rdev->clock.default_dispclk == 0) { 1252 if (ASIC_IS_DCE6(rdev)) 1253 rdev->clock.default_dispclk = 60000; /* 600 Mhz */ 1254 else if (ASIC_IS_DCE5(rdev)) 1255 rdev->clock.default_dispclk = 54000; /* 540 Mhz */ 1256 else 1257 rdev->clock.default_dispclk = 60000; /* 600 Mhz */ 1258 } 1259 /* set a reasonable default for DP */ 1260 if (ASIC_IS_DCE6(rdev) && (rdev->clock.default_dispclk < 53900)) { 1261 DRM_INFO("Changing default dispclk from %dMhz to 600Mhz\n", 1262 rdev->clock.default_dispclk / 100); 1263 rdev->clock.default_dispclk = 60000; 1264 } 1265 rdev->clock.dp_extclk = 1266 le16_to_cpu(firmware_info->info_21.usUniphyDPModeExtClkFreq); 1267 rdev->clock.current_dispclk = rdev->clock.default_dispclk; 1268 } 1269 *dcpll = *p1pll; 1270 1271 rdev->clock.max_pixel_clock = le16_to_cpu(firmware_info->info.usMaxPixelClock); 1272 if (rdev->clock.max_pixel_clock == 0) 1273 rdev->clock.max_pixel_clock = 40000; 1274 1275 /* not technically a clock, but... */ 1276 rdev->mode_info.firmware_flags = 1277 le16_to_cpu(firmware_info->info.usFirmwareCapability.susAccess); 1278 1279 if (ASIC_IS_DCE8(rdev)) 1280 rdev->clock.vco_freq = 1281 le32_to_cpu(firmware_info->info_22.ulGPUPLL_OutputFreq); 1282 else if (ASIC_IS_DCE5(rdev)) 1283 rdev->clock.vco_freq = rdev->clock.current_dispclk; 1284 else if (ASIC_IS_DCE41(rdev)) 1285 radeon_atombios_get_dentist_vco_freq(rdev); 1286 else 1287 rdev->clock.vco_freq = rdev->clock.current_dispclk; 1288 1289 if (rdev->clock.vco_freq == 0) 1290 rdev->clock.vco_freq = 360000; /* 3.6 GHz */ 1291 1292 return true; 1293 } 1294 1295 return false; 1296 } 1297 1298 bool radeon_atombios_sideport_present(struct radeon_device *rdev) 1299 { 1300 struct radeon_mode_info *mode_info = &rdev->mode_info; 1301 int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo); 1302 union igp_info *igp_info; 1303 u8 frev, crev; 1304 u16 data_offset; 1305 1306 /* sideport is AMD only */ 1307 if (rdev->family == CHIP_RS600) 1308 return false; 1309 1310 if (atom_parse_data_header(mode_info->atom_context, index, NULL, 1311 &frev, &crev, &data_offset)) { 1312 igp_info = (union igp_info *)(mode_info->atom_context->bios + 1313 data_offset); 1314 switch (crev) { 1315 case 1: 1316 if (le32_to_cpu(igp_info->info.ulBootUpMemoryClock)) 1317 return true; 1318 break; 1319 case 2: 1320 if (le32_to_cpu(igp_info->info_2.ulBootUpSidePortClock)) 1321 return true; 1322 break; 1323 default: 1324 DRM_ERROR("Unsupported IGP table: %d %d\n", frev, crev); 1325 break; 1326 } 1327 } 1328 return false; 1329 } 1330 1331 bool radeon_atombios_get_tmds_info(struct radeon_encoder *encoder, 1332 struct radeon_encoder_int_tmds *tmds) 1333 { 1334 struct drm_device *dev = encoder->base.dev; 1335 struct radeon_device *rdev = dev->dev_private; 1336 struct radeon_mode_info *mode_info = &rdev->mode_info; 1337 int index = GetIndexIntoMasterTable(DATA, TMDS_Info); 1338 uint16_t data_offset; 1339 struct _ATOM_TMDS_INFO *tmds_info; 1340 uint8_t frev, crev; 1341 uint16_t maxfreq; 1342 int i; 1343 1344 if (atom_parse_data_header(mode_info->atom_context, index, NULL, 1345 &frev, &crev, &data_offset)) { 1346 tmds_info = 1347 (struct _ATOM_TMDS_INFO *)(mode_info->atom_context->bios + 1348 data_offset); 1349 1350 maxfreq = le16_to_cpu(tmds_info->usMaxFrequency); 1351 for (i = 0; i < 4; i++) { 1352 tmds->tmds_pll[i].freq = 1353 le16_to_cpu(tmds_info->asMiscInfo[i].usFrequency); 1354 tmds->tmds_pll[i].value = 1355 tmds_info->asMiscInfo[i].ucPLL_ChargePump & 0x3f; 1356 tmds->tmds_pll[i].value |= 1357 (tmds_info->asMiscInfo[i]. 1358 ucPLL_VCO_Gain & 0x3f) << 6; 1359 tmds->tmds_pll[i].value |= 1360 (tmds_info->asMiscInfo[i]. 1361 ucPLL_DutyCycle & 0xf) << 12; 1362 tmds->tmds_pll[i].value |= 1363 (tmds_info->asMiscInfo[i]. 1364 ucPLL_VoltageSwing & 0xf) << 16; 1365 1366 DRM_DEBUG_KMS("TMDS PLL From ATOMBIOS %u %x\n", 1367 tmds->tmds_pll[i].freq, 1368 tmds->tmds_pll[i].value); 1369 1370 if (maxfreq == tmds->tmds_pll[i].freq) { 1371 tmds->tmds_pll[i].freq = 0xffffffff; 1372 break; 1373 } 1374 } 1375 return true; 1376 } 1377 return false; 1378 } 1379 1380 bool radeon_atombios_get_ppll_ss_info(struct radeon_device *rdev, 1381 struct radeon_atom_ss *ss, 1382 int id) 1383 { 1384 struct radeon_mode_info *mode_info = &rdev->mode_info; 1385 int index = GetIndexIntoMasterTable(DATA, PPLL_SS_Info); 1386 uint16_t data_offset, size; 1387 struct _ATOM_SPREAD_SPECTRUM_INFO *ss_info; 1388 struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT *ss_assign; 1389 uint8_t frev, crev; 1390 int i, num_indices; 1391 1392 memset(ss, 0, sizeof(struct radeon_atom_ss)); 1393 if (atom_parse_data_header(mode_info->atom_context, index, &size, 1394 &frev, &crev, &data_offset)) { 1395 ss_info = 1396 (struct _ATOM_SPREAD_SPECTRUM_INFO *)(mode_info->atom_context->bios + data_offset); 1397 1398 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / 1399 sizeof(ATOM_SPREAD_SPECTRUM_ASSIGNMENT); 1400 ss_assign = (struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT *) 1401 ((u8 *)&ss_info->asSS_Info[0]); 1402 for (i = 0; i < num_indices; i++) { 1403 if (ss_assign->ucSS_Id == id) { 1404 ss->percentage = 1405 le16_to_cpu(ss_assign->usSpreadSpectrumPercentage); 1406 ss->type = ss_assign->ucSpreadSpectrumType; 1407 ss->step = ss_assign->ucSS_Step; 1408 ss->delay = ss_assign->ucSS_Delay; 1409 ss->range = ss_assign->ucSS_Range; 1410 ss->refdiv = ss_assign->ucRecommendedRef_Div; 1411 return true; 1412 } 1413 ss_assign = (struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT *) 1414 ((u8 *)ss_assign + sizeof(struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT)); 1415 } 1416 } 1417 return false; 1418 } 1419 1420 static void radeon_atombios_get_igp_ss_overrides(struct radeon_device *rdev, 1421 struct radeon_atom_ss *ss, 1422 int id) 1423 { 1424 struct radeon_mode_info *mode_info = &rdev->mode_info; 1425 int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo); 1426 u16 data_offset, size; 1427 union igp_info *igp_info; 1428 u8 frev, crev; 1429 u16 percentage = 0, rate = 0; 1430 1431 /* get any igp specific overrides */ 1432 if (atom_parse_data_header(mode_info->atom_context, index, &size, 1433 &frev, &crev, &data_offset)) { 1434 igp_info = (union igp_info *) 1435 (mode_info->atom_context->bios + data_offset); 1436 switch (crev) { 1437 case 6: 1438 switch (id) { 1439 case ASIC_INTERNAL_SS_ON_TMDS: 1440 percentage = le16_to_cpu(igp_info->info_6.usDVISSPercentage); 1441 rate = le16_to_cpu(igp_info->info_6.usDVISSpreadRateIn10Hz); 1442 break; 1443 case ASIC_INTERNAL_SS_ON_HDMI: 1444 percentage = le16_to_cpu(igp_info->info_6.usHDMISSPercentage); 1445 rate = le16_to_cpu(igp_info->info_6.usHDMISSpreadRateIn10Hz); 1446 break; 1447 case ASIC_INTERNAL_SS_ON_LVDS: 1448 percentage = le16_to_cpu(igp_info->info_6.usLvdsSSPercentage); 1449 rate = le16_to_cpu(igp_info->info_6.usLvdsSSpreadRateIn10Hz); 1450 break; 1451 } 1452 break; 1453 case 7: 1454 switch (id) { 1455 case ASIC_INTERNAL_SS_ON_TMDS: 1456 percentage = le16_to_cpu(igp_info->info_7.usDVISSPercentage); 1457 rate = le16_to_cpu(igp_info->info_7.usDVISSpreadRateIn10Hz); 1458 break; 1459 case ASIC_INTERNAL_SS_ON_HDMI: 1460 percentage = le16_to_cpu(igp_info->info_7.usHDMISSPercentage); 1461 rate = le16_to_cpu(igp_info->info_7.usHDMISSpreadRateIn10Hz); 1462 break; 1463 case ASIC_INTERNAL_SS_ON_LVDS: 1464 percentage = le16_to_cpu(igp_info->info_7.usLvdsSSPercentage); 1465 rate = le16_to_cpu(igp_info->info_7.usLvdsSSpreadRateIn10Hz); 1466 break; 1467 } 1468 break; 1469 case 8: 1470 switch (id) { 1471 case ASIC_INTERNAL_SS_ON_TMDS: 1472 percentage = le16_to_cpu(igp_info->info_8.usDVISSPercentage); 1473 rate = le16_to_cpu(igp_info->info_8.usDVISSpreadRateIn10Hz); 1474 break; 1475 case ASIC_INTERNAL_SS_ON_HDMI: 1476 percentage = le16_to_cpu(igp_info->info_8.usHDMISSPercentage); 1477 rate = le16_to_cpu(igp_info->info_8.usHDMISSpreadRateIn10Hz); 1478 break; 1479 case ASIC_INTERNAL_SS_ON_LVDS: 1480 percentage = le16_to_cpu(igp_info->info_8.usLvdsSSPercentage); 1481 rate = le16_to_cpu(igp_info->info_8.usLvdsSSpreadRateIn10Hz); 1482 break; 1483 } 1484 break; 1485 default: 1486 DRM_ERROR("Unsupported IGP table: %d %d\n", frev, crev); 1487 break; 1488 } 1489 if (percentage) 1490 ss->percentage = percentage; 1491 if (rate) 1492 ss->rate = rate; 1493 } 1494 } 1495 1496 union asic_ss_info { 1497 struct _ATOM_ASIC_INTERNAL_SS_INFO info; 1498 struct _ATOM_ASIC_INTERNAL_SS_INFO_V2 info_2; 1499 struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 info_3; 1500 }; 1501 1502 union asic_ss_assignment { 1503 struct _ATOM_ASIC_SS_ASSIGNMENT v1; 1504 struct _ATOM_ASIC_SS_ASSIGNMENT_V2 v2; 1505 struct _ATOM_ASIC_SS_ASSIGNMENT_V3 v3; 1506 }; 1507 1508 bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev, 1509 struct radeon_atom_ss *ss, 1510 int id, u32 clock) 1511 { 1512 struct radeon_mode_info *mode_info = &rdev->mode_info; 1513 int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info); 1514 uint16_t data_offset, size; 1515 union asic_ss_info *ss_info; 1516 union asic_ss_assignment *ss_assign; 1517 uint8_t frev, crev; 1518 int i, num_indices; 1519 1520 if (id == ASIC_INTERNAL_MEMORY_SS) { 1521 if (!(rdev->mode_info.firmware_flags & ATOM_BIOS_INFO_MEMORY_CLOCK_SS_SUPPORT)) 1522 return false; 1523 } 1524 if (id == ASIC_INTERNAL_ENGINE_SS) { 1525 if (!(rdev->mode_info.firmware_flags & ATOM_BIOS_INFO_ENGINE_CLOCK_SS_SUPPORT)) 1526 return false; 1527 } 1528 1529 memset(ss, 0, sizeof(struct radeon_atom_ss)); 1530 if (atom_parse_data_header(mode_info->atom_context, index, &size, 1531 &frev, &crev, &data_offset)) { 1532 1533 ss_info = 1534 (union asic_ss_info *)(mode_info->atom_context->bios + data_offset); 1535 1536 switch (frev) { 1537 case 1: 1538 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / 1539 sizeof(ATOM_ASIC_SS_ASSIGNMENT); 1540 1541 ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info.asSpreadSpectrum[0]); 1542 for (i = 0; i < num_indices; i++) { 1543 if ((ss_assign->v1.ucClockIndication == id) && 1544 (clock <= le32_to_cpu(ss_assign->v1.ulTargetClockRange))) { 1545 ss->percentage = 1546 le16_to_cpu(ss_assign->v1.usSpreadSpectrumPercentage); 1547 ss->type = ss_assign->v1.ucSpreadSpectrumMode; 1548 ss->rate = le16_to_cpu(ss_assign->v1.usSpreadRateInKhz); 1549 ss->percentage_divider = 100; 1550 return true; 1551 } 1552 ss_assign = (union asic_ss_assignment *) 1553 ((u8 *)ss_assign + sizeof(ATOM_ASIC_SS_ASSIGNMENT)); 1554 } 1555 break; 1556 case 2: 1557 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / 1558 sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2); 1559 ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info_2.asSpreadSpectrum[0]); 1560 for (i = 0; i < num_indices; i++) { 1561 if ((ss_assign->v2.ucClockIndication == id) && 1562 (clock <= le32_to_cpu(ss_assign->v2.ulTargetClockRange))) { 1563 ss->percentage = 1564 le16_to_cpu(ss_assign->v2.usSpreadSpectrumPercentage); 1565 ss->type = ss_assign->v2.ucSpreadSpectrumMode; 1566 ss->rate = le16_to_cpu(ss_assign->v2.usSpreadRateIn10Hz); 1567 ss->percentage_divider = 100; 1568 if ((crev == 2) && 1569 ((id == ASIC_INTERNAL_ENGINE_SS) || 1570 (id == ASIC_INTERNAL_MEMORY_SS))) 1571 ss->rate /= 100; 1572 return true; 1573 } 1574 ss_assign = (union asic_ss_assignment *) 1575 ((u8 *)ss_assign + sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2)); 1576 } 1577 break; 1578 case 3: 1579 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) / 1580 sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3); 1581 ss_assign = (union asic_ss_assignment *)((u8 *)&ss_info->info_3.asSpreadSpectrum[0]); 1582 for (i = 0; i < num_indices; i++) { 1583 if ((ss_assign->v3.ucClockIndication == id) && 1584 (clock <= le32_to_cpu(ss_assign->v3.ulTargetClockRange))) { 1585 ss->percentage = 1586 le16_to_cpu(ss_assign->v3.usSpreadSpectrumPercentage); 1587 ss->type = ss_assign->v3.ucSpreadSpectrumMode; 1588 ss->rate = le16_to_cpu(ss_assign->v3.usSpreadRateIn10Hz); 1589 if (ss_assign->v3.ucSpreadSpectrumMode & 1590 SS_MODE_V3_PERCENTAGE_DIV_BY_1000_MASK) 1591 ss->percentage_divider = 1000; 1592 else 1593 ss->percentage_divider = 100; 1594 if ((id == ASIC_INTERNAL_ENGINE_SS) || 1595 (id == ASIC_INTERNAL_MEMORY_SS)) 1596 ss->rate /= 100; 1597 if (rdev->flags & RADEON_IS_IGP) 1598 radeon_atombios_get_igp_ss_overrides(rdev, ss, id); 1599 return true; 1600 } 1601 ss_assign = (union asic_ss_assignment *) 1602 ((u8 *)ss_assign + sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3)); 1603 } 1604 break; 1605 default: 1606 DRM_ERROR("Unsupported ASIC_InternalSS_Info table: %d %d\n", frev, crev); 1607 break; 1608 } 1609 1610 } 1611 return false; 1612 } 1613 1614 union lvds_info { 1615 struct _ATOM_LVDS_INFO info; 1616 struct _ATOM_LVDS_INFO_V12 info_12; 1617 }; 1618 1619 struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct 1620 radeon_encoder 1621 *encoder) 1622 { 1623 struct drm_device *dev = encoder->base.dev; 1624 struct radeon_device *rdev = dev->dev_private; 1625 struct radeon_mode_info *mode_info = &rdev->mode_info; 1626 int index = GetIndexIntoMasterTable(DATA, LVDS_Info); 1627 uint16_t data_offset, misc; 1628 union lvds_info *lvds_info; 1629 uint8_t frev, crev; 1630 struct radeon_encoder_atom_dig *lvds = NULL; 1631 int encoder_enum = (encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT; 1632 1633 if (atom_parse_data_header(mode_info->atom_context, index, NULL, 1634 &frev, &crev, &data_offset)) { 1635 lvds_info = 1636 (union lvds_info *)(mode_info->atom_context->bios + data_offset); 1637 lvds = 1638 kzalloc(sizeof(struct radeon_encoder_atom_dig), GFP_KERNEL); 1639 1640 if (!lvds) 1641 return NULL; 1642 1643 lvds->native_mode.clock = 1644 le16_to_cpu(lvds_info->info.sLCDTiming.usPixClk) * 10; 1645 lvds->native_mode.hdisplay = 1646 le16_to_cpu(lvds_info->info.sLCDTiming.usHActive); 1647 lvds->native_mode.vdisplay = 1648 le16_to_cpu(lvds_info->info.sLCDTiming.usVActive); 1649 lvds->native_mode.htotal = lvds->native_mode.hdisplay + 1650 le16_to_cpu(lvds_info->info.sLCDTiming.usHBlanking_Time); 1651 lvds->native_mode.hsync_start = lvds->native_mode.hdisplay + 1652 le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncOffset); 1653 lvds->native_mode.hsync_end = lvds->native_mode.hsync_start + 1654 le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncWidth); 1655 lvds->native_mode.vtotal = lvds->native_mode.vdisplay + 1656 le16_to_cpu(lvds_info->info.sLCDTiming.usVBlanking_Time); 1657 lvds->native_mode.vsync_start = lvds->native_mode.vdisplay + 1658 le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncOffset); 1659 lvds->native_mode.vsync_end = lvds->native_mode.vsync_start + 1660 le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncWidth); 1661 lvds->panel_pwr_delay = 1662 le16_to_cpu(lvds_info->info.usOffDelayInMs); 1663 lvds->lcd_misc = lvds_info->info.ucLVDS_Misc; 1664 1665 misc = le16_to_cpu(lvds_info->info.sLCDTiming.susModeMiscInfo.usAccess); 1666 if (misc & ATOM_VSYNC_POLARITY) 1667 lvds->native_mode.flags |= DRM_MODE_FLAG_NVSYNC; 1668 if (misc & ATOM_HSYNC_POLARITY) 1669 lvds->native_mode.flags |= DRM_MODE_FLAG_NHSYNC; 1670 if (misc & ATOM_COMPOSITESYNC) 1671 lvds->native_mode.flags |= DRM_MODE_FLAG_CSYNC; 1672 if (misc & ATOM_INTERLACE) 1673 lvds->native_mode.flags |= DRM_MODE_FLAG_INTERLACE; 1674 if (misc & ATOM_DOUBLE_CLOCK_MODE) 1675 lvds->native_mode.flags |= DRM_MODE_FLAG_DBLSCAN; 1676 1677 lvds->native_mode.width_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageHSize); 1678 lvds->native_mode.height_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageVSize); 1679 1680 /* set crtc values */ 1681 drm_mode_set_crtcinfo(&lvds->native_mode, CRTC_INTERLACE_HALVE_V); 1682 1683 lvds->lcd_ss_id = lvds_info->info.ucSS_Id; 1684 1685 encoder->native_mode = lvds->native_mode; 1686 1687 if (encoder_enum == 2) 1688 lvds->linkb = true; 1689 else 1690 lvds->linkb = false; 1691 1692 /* parse the lcd record table */ 1693 if (le16_to_cpu(lvds_info->info.usModePatchTableOffset)) { 1694 ATOM_FAKE_EDID_PATCH_RECORD *fake_edid_record; 1695 ATOM_PANEL_RESOLUTION_PATCH_RECORD *panel_res_record; 1696 bool bad_record = false; 1697 u8 *record; 1698 1699 if ((frev == 1) && (crev < 2)) 1700 /* absolute */ 1701 record = (u8 *)(mode_info->atom_context->bios + 1702 le16_to_cpu(lvds_info->info.usModePatchTableOffset)); 1703 else 1704 /* relative */ 1705 record = (u8 *)(mode_info->atom_context->bios + 1706 data_offset + 1707 le16_to_cpu(lvds_info->info.usModePatchTableOffset)); 1708 while (*record != ATOM_RECORD_END_TYPE) { 1709 switch (*record) { 1710 case LCD_MODE_PATCH_RECORD_MODE_TYPE: 1711 record += sizeof(ATOM_PATCH_RECORD_MODE); 1712 break; 1713 case LCD_RTS_RECORD_TYPE: 1714 record += sizeof(ATOM_LCD_RTS_RECORD); 1715 break; 1716 case LCD_CAP_RECORD_TYPE: 1717 record += sizeof(ATOM_LCD_MODE_CONTROL_CAP); 1718 break; 1719 case LCD_FAKE_EDID_PATCH_RECORD_TYPE: 1720 fake_edid_record = (ATOM_FAKE_EDID_PATCH_RECORD *)record; 1721 if (fake_edid_record->ucFakeEDIDLength) { 1722 struct edid *edid; 1723 int edid_size = 1724 max((int)EDID_LENGTH, (int)fake_edid_record->ucFakeEDIDLength); 1725 edid = kmalloc(edid_size, GFP_KERNEL); 1726 if (edid) { 1727 memcpy((u8 *)edid, (u8 *)&fake_edid_record->ucFakeEDIDString[0], 1728 fake_edid_record->ucFakeEDIDLength); 1729 1730 if (drm_edid_is_valid(edid)) { 1731 rdev->mode_info.bios_hardcoded_edid = edid; 1732 rdev->mode_info.bios_hardcoded_edid_size = edid_size; 1733 } else 1734 kfree(edid); 1735 } 1736 } 1737 record += fake_edid_record->ucFakeEDIDLength ? 1738 struct_size(fake_edid_record, 1739 ucFakeEDIDString, 1740 fake_edid_record->ucFakeEDIDLength) : 1741 /* empty fake edid record must be 3 bytes long */ 1742 sizeof(ATOM_FAKE_EDID_PATCH_RECORD) + 1; 1743 break; 1744 case LCD_PANEL_RESOLUTION_RECORD_TYPE: 1745 panel_res_record = (ATOM_PANEL_RESOLUTION_PATCH_RECORD *)record; 1746 lvds->native_mode.width_mm = panel_res_record->usHSize; 1747 lvds->native_mode.height_mm = panel_res_record->usVSize; 1748 record += sizeof(ATOM_PANEL_RESOLUTION_PATCH_RECORD); 1749 break; 1750 default: 1751 DRM_ERROR("Bad LCD record %d\n", *record); 1752 bad_record = true; 1753 break; 1754 } 1755 if (bad_record) 1756 break; 1757 } 1758 } 1759 } 1760 return lvds; 1761 } 1762 1763 struct radeon_encoder_primary_dac * 1764 radeon_atombios_get_primary_dac_info(struct radeon_encoder *encoder) 1765 { 1766 struct drm_device *dev = encoder->base.dev; 1767 struct radeon_device *rdev = dev->dev_private; 1768 struct radeon_mode_info *mode_info = &rdev->mode_info; 1769 int index = GetIndexIntoMasterTable(DATA, CompassionateData); 1770 uint16_t data_offset; 1771 struct _COMPASSIONATE_DATA *dac_info; 1772 uint8_t frev, crev; 1773 uint8_t bg, dac; 1774 struct radeon_encoder_primary_dac *p_dac = NULL; 1775 1776 if (atom_parse_data_header(mode_info->atom_context, index, NULL, 1777 &frev, &crev, &data_offset)) { 1778 dac_info = (struct _COMPASSIONATE_DATA *) 1779 (mode_info->atom_context->bios + data_offset); 1780 1781 p_dac = kzalloc(sizeof(struct radeon_encoder_primary_dac), GFP_KERNEL); 1782 1783 if (!p_dac) 1784 return NULL; 1785 1786 bg = dac_info->ucDAC1_BG_Adjustment; 1787 dac = dac_info->ucDAC1_DAC_Adjustment; 1788 p_dac->ps2_pdac_adj = (bg << 8) | (dac); 1789 1790 } 1791 return p_dac; 1792 } 1793 1794 bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index, 1795 struct drm_display_mode *mode) 1796 { 1797 struct radeon_mode_info *mode_info = &rdev->mode_info; 1798 ATOM_ANALOG_TV_INFO *tv_info; 1799 ATOM_ANALOG_TV_INFO_V1_2 *tv_info_v1_2; 1800 ATOM_DTD_FORMAT *dtd_timings; 1801 int data_index = GetIndexIntoMasterTable(DATA, AnalogTV_Info); 1802 u8 frev, crev; 1803 u16 data_offset, misc; 1804 1805 if (!atom_parse_data_header(mode_info->atom_context, data_index, NULL, 1806 &frev, &crev, &data_offset)) 1807 return false; 1808 1809 switch (crev) { 1810 case 1: 1811 tv_info = (ATOM_ANALOG_TV_INFO *)(mode_info->atom_context->bios + data_offset); 1812 if (index >= MAX_SUPPORTED_TV_TIMING) 1813 return false; 1814 1815 mode->crtc_htotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Total); 1816 mode->crtc_hdisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Disp); 1817 mode->crtc_hsync_start = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart); 1818 mode->crtc_hsync_end = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart) + 1819 le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncWidth); 1820 1821 mode->crtc_vtotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Total); 1822 mode->crtc_vdisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Disp); 1823 mode->crtc_vsync_start = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart); 1824 mode->crtc_vsync_end = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart) + 1825 le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncWidth); 1826 1827 mode->flags = 0; 1828 misc = le16_to_cpu(tv_info->aModeTimings[index].susModeMiscInfo.usAccess); 1829 if (misc & ATOM_VSYNC_POLARITY) 1830 mode->flags |= DRM_MODE_FLAG_NVSYNC; 1831 if (misc & ATOM_HSYNC_POLARITY) 1832 mode->flags |= DRM_MODE_FLAG_NHSYNC; 1833 if (misc & ATOM_COMPOSITESYNC) 1834 mode->flags |= DRM_MODE_FLAG_CSYNC; 1835 if (misc & ATOM_INTERLACE) 1836 mode->flags |= DRM_MODE_FLAG_INTERLACE; 1837 if (misc & ATOM_DOUBLE_CLOCK_MODE) 1838 mode->flags |= DRM_MODE_FLAG_DBLSCAN; 1839 1840 mode->crtc_clock = mode->clock = 1841 le16_to_cpu(tv_info->aModeTimings[index].usPixelClock) * 10; 1842 1843 if (index == 1) { 1844 /* PAL timings appear to have wrong values for totals */ 1845 mode->crtc_htotal -= 1; 1846 mode->crtc_vtotal -= 1; 1847 } 1848 break; 1849 case 2: 1850 tv_info_v1_2 = (ATOM_ANALOG_TV_INFO_V1_2 *)(mode_info->atom_context->bios + data_offset); 1851 if (index >= MAX_SUPPORTED_TV_TIMING_V1_2) 1852 return false; 1853 1854 dtd_timings = &tv_info_v1_2->aModeTimings[index]; 1855 mode->crtc_htotal = le16_to_cpu(dtd_timings->usHActive) + 1856 le16_to_cpu(dtd_timings->usHBlanking_Time); 1857 mode->crtc_hdisplay = le16_to_cpu(dtd_timings->usHActive); 1858 mode->crtc_hsync_start = le16_to_cpu(dtd_timings->usHActive) + 1859 le16_to_cpu(dtd_timings->usHSyncOffset); 1860 mode->crtc_hsync_end = mode->crtc_hsync_start + 1861 le16_to_cpu(dtd_timings->usHSyncWidth); 1862 1863 mode->crtc_vtotal = le16_to_cpu(dtd_timings->usVActive) + 1864 le16_to_cpu(dtd_timings->usVBlanking_Time); 1865 mode->crtc_vdisplay = le16_to_cpu(dtd_timings->usVActive); 1866 mode->crtc_vsync_start = le16_to_cpu(dtd_timings->usVActive) + 1867 le16_to_cpu(dtd_timings->usVSyncOffset); 1868 mode->crtc_vsync_end = mode->crtc_vsync_start + 1869 le16_to_cpu(dtd_timings->usVSyncWidth); 1870 1871 mode->flags = 0; 1872 misc = le16_to_cpu(dtd_timings->susModeMiscInfo.usAccess); 1873 if (misc & ATOM_VSYNC_POLARITY) 1874 mode->flags |= DRM_MODE_FLAG_NVSYNC; 1875 if (misc & ATOM_HSYNC_POLARITY) 1876 mode->flags |= DRM_MODE_FLAG_NHSYNC; 1877 if (misc & ATOM_COMPOSITESYNC) 1878 mode->flags |= DRM_MODE_FLAG_CSYNC; 1879 if (misc & ATOM_INTERLACE) 1880 mode->flags |= DRM_MODE_FLAG_INTERLACE; 1881 if (misc & ATOM_DOUBLE_CLOCK_MODE) 1882 mode->flags |= DRM_MODE_FLAG_DBLSCAN; 1883 1884 mode->crtc_clock = mode->clock = 1885 le16_to_cpu(dtd_timings->usPixClk) * 10; 1886 break; 1887 } 1888 return true; 1889 } 1890 1891 enum radeon_tv_std 1892 radeon_atombios_get_tv_info(struct radeon_device *rdev) 1893 { 1894 struct radeon_mode_info *mode_info = &rdev->mode_info; 1895 int index = GetIndexIntoMasterTable(DATA, AnalogTV_Info); 1896 uint16_t data_offset; 1897 uint8_t frev, crev; 1898 struct _ATOM_ANALOG_TV_INFO *tv_info; 1899 enum radeon_tv_std tv_std = TV_STD_NTSC; 1900 1901 if (atom_parse_data_header(mode_info->atom_context, index, NULL, 1902 &frev, &crev, &data_offset)) { 1903 1904 tv_info = (struct _ATOM_ANALOG_TV_INFO *) 1905 (mode_info->atom_context->bios + data_offset); 1906 1907 switch (tv_info->ucTV_BootUpDefaultStandard) { 1908 case ATOM_TV_NTSC: 1909 tv_std = TV_STD_NTSC; 1910 DRM_DEBUG_KMS("Default TV standard: NTSC\n"); 1911 break; 1912 case ATOM_TV_NTSCJ: 1913 tv_std = TV_STD_NTSC_J; 1914 DRM_DEBUG_KMS("Default TV standard: NTSC-J\n"); 1915 break; 1916 case ATOM_TV_PAL: 1917 tv_std = TV_STD_PAL; 1918 DRM_DEBUG_KMS("Default TV standard: PAL\n"); 1919 break; 1920 case ATOM_TV_PALM: 1921 tv_std = TV_STD_PAL_M; 1922 DRM_DEBUG_KMS("Default TV standard: PAL-M\n"); 1923 break; 1924 case ATOM_TV_PALN: 1925 tv_std = TV_STD_PAL_N; 1926 DRM_DEBUG_KMS("Default TV standard: PAL-N\n"); 1927 break; 1928 case ATOM_TV_PALCN: 1929 tv_std = TV_STD_PAL_CN; 1930 DRM_DEBUG_KMS("Default TV standard: PAL-CN\n"); 1931 break; 1932 case ATOM_TV_PAL60: 1933 tv_std = TV_STD_PAL_60; 1934 DRM_DEBUG_KMS("Default TV standard: PAL-60\n"); 1935 break; 1936 case ATOM_TV_SECAM: 1937 tv_std = TV_STD_SECAM; 1938 DRM_DEBUG_KMS("Default TV standard: SECAM\n"); 1939 break; 1940 default: 1941 tv_std = TV_STD_NTSC; 1942 DRM_DEBUG_KMS("Unknown TV standard; defaulting to NTSC\n"); 1943 break; 1944 } 1945 } 1946 return tv_std; 1947 } 1948 1949 struct radeon_encoder_tv_dac * 1950 radeon_atombios_get_tv_dac_info(struct radeon_encoder *encoder) 1951 { 1952 struct drm_device *dev = encoder->base.dev; 1953 struct radeon_device *rdev = dev->dev_private; 1954 struct radeon_mode_info *mode_info = &rdev->mode_info; 1955 int index = GetIndexIntoMasterTable(DATA, CompassionateData); 1956 uint16_t data_offset; 1957 struct _COMPASSIONATE_DATA *dac_info; 1958 uint8_t frev, crev; 1959 uint8_t bg, dac; 1960 struct radeon_encoder_tv_dac *tv_dac = NULL; 1961 1962 if (atom_parse_data_header(mode_info->atom_context, index, NULL, 1963 &frev, &crev, &data_offset)) { 1964 1965 dac_info = (struct _COMPASSIONATE_DATA *) 1966 (mode_info->atom_context->bios + data_offset); 1967 1968 tv_dac = kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL); 1969 1970 if (!tv_dac) 1971 return NULL; 1972 1973 bg = dac_info->ucDAC2_CRT2_BG_Adjustment; 1974 dac = dac_info->ucDAC2_CRT2_DAC_Adjustment; 1975 tv_dac->ps2_tvdac_adj = (bg << 16) | (dac << 20); 1976 1977 bg = dac_info->ucDAC2_PAL_BG_Adjustment; 1978 dac = dac_info->ucDAC2_PAL_DAC_Adjustment; 1979 tv_dac->pal_tvdac_adj = (bg << 16) | (dac << 20); 1980 1981 bg = dac_info->ucDAC2_NTSC_BG_Adjustment; 1982 dac = dac_info->ucDAC2_NTSC_DAC_Adjustment; 1983 tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20); 1984 1985 tv_dac->tv_std = radeon_atombios_get_tv_info(rdev); 1986 } 1987 return tv_dac; 1988 } 1989 1990 static const char *thermal_controller_names[] = { 1991 "NONE", 1992 "lm63", 1993 "adm1032", 1994 "adm1030", 1995 "max6649", 1996 "lm63", /* lm64 */ 1997 "f75375", 1998 "asc7xxx", 1999 }; 2000 2001 static const char *pp_lib_thermal_controller_names[] = { 2002 "NONE", 2003 "lm63", 2004 "adm1032", 2005 "adm1030", 2006 "max6649", 2007 "lm63", /* lm64 */ 2008 "f75375", 2009 "RV6xx", 2010 "RV770", 2011 "adt7473", 2012 "NONE", 2013 "External GPIO", 2014 "Evergreen", 2015 "emc2103", 2016 "Sumo", 2017 "Northern Islands", 2018 "Southern Islands", 2019 "lm96163", 2020 "Sea Islands", 2021 }; 2022 2023 union power_info { 2024 struct _ATOM_POWERPLAY_INFO info; 2025 struct _ATOM_POWERPLAY_INFO_V2 info_2; 2026 struct _ATOM_POWERPLAY_INFO_V3 info_3; 2027 struct _ATOM_PPLIB_POWERPLAYTABLE pplib; 2028 struct _ATOM_PPLIB_POWERPLAYTABLE2 pplib2; 2029 struct _ATOM_PPLIB_POWERPLAYTABLE3 pplib3; 2030 }; 2031 2032 union pplib_clock_info { 2033 struct _ATOM_PPLIB_R600_CLOCK_INFO r600; 2034 struct _ATOM_PPLIB_RS780_CLOCK_INFO rs780; 2035 struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO evergreen; 2036 struct _ATOM_PPLIB_SUMO_CLOCK_INFO sumo; 2037 struct _ATOM_PPLIB_SI_CLOCK_INFO si; 2038 struct _ATOM_PPLIB_CI_CLOCK_INFO ci; 2039 }; 2040 2041 union pplib_power_state { 2042 struct _ATOM_PPLIB_STATE v1; 2043 struct _ATOM_PPLIB_STATE_V2 v2; 2044 }; 2045 2046 static void radeon_atombios_parse_misc_flags_1_3(struct radeon_device *rdev, 2047 int state_index, 2048 u32 misc, u32 misc2) 2049 { 2050 rdev->pm.power_state[state_index].misc = misc; 2051 rdev->pm.power_state[state_index].misc2 = misc2; 2052 /* order matters! */ 2053 if (misc & ATOM_PM_MISCINFO_POWER_SAVING_MODE) 2054 rdev->pm.power_state[state_index].type = 2055 POWER_STATE_TYPE_POWERSAVE; 2056 if (misc & ATOM_PM_MISCINFO_DEFAULT_DC_STATE_ENTRY_TRUE) 2057 rdev->pm.power_state[state_index].type = 2058 POWER_STATE_TYPE_BATTERY; 2059 if (misc & ATOM_PM_MISCINFO_DEFAULT_LOW_DC_STATE_ENTRY_TRUE) 2060 rdev->pm.power_state[state_index].type = 2061 POWER_STATE_TYPE_BATTERY; 2062 if (misc & ATOM_PM_MISCINFO_LOAD_BALANCE_EN) 2063 rdev->pm.power_state[state_index].type = 2064 POWER_STATE_TYPE_BALANCED; 2065 if (misc & ATOM_PM_MISCINFO_3D_ACCELERATION_EN) { 2066 rdev->pm.power_state[state_index].type = 2067 POWER_STATE_TYPE_PERFORMANCE; 2068 rdev->pm.power_state[state_index].flags &= 2069 ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY; 2070 } 2071 if (misc2 & ATOM_PM_MISCINFO2_SYSTEM_AC_LITE_MODE) 2072 rdev->pm.power_state[state_index].type = 2073 POWER_STATE_TYPE_BALANCED; 2074 if (misc & ATOM_PM_MISCINFO_DRIVER_DEFAULT_MODE) { 2075 rdev->pm.power_state[state_index].type = 2076 POWER_STATE_TYPE_DEFAULT; 2077 rdev->pm.default_power_state_index = state_index; 2078 rdev->pm.power_state[state_index].default_clock_mode = 2079 &rdev->pm.power_state[state_index].clock_info[0]; 2080 } else if (state_index == 0) { 2081 rdev->pm.power_state[state_index].clock_info[0].flags |= 2082 RADEON_PM_MODE_NO_DISPLAY; 2083 } 2084 } 2085 2086 static int radeon_atombios_parse_power_table_1_3(struct radeon_device *rdev) 2087 { 2088 struct radeon_mode_info *mode_info = &rdev->mode_info; 2089 u32 misc, misc2 = 0; 2090 int num_modes = 0, i; 2091 int state_index = 0; 2092 struct radeon_i2c_bus_rec i2c_bus; 2093 union power_info *power_info; 2094 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); 2095 u16 data_offset; 2096 u8 frev, crev; 2097 2098 if (!atom_parse_data_header(mode_info->atom_context, index, NULL, 2099 &frev, &crev, &data_offset)) 2100 return state_index; 2101 power_info = (union power_info *)(mode_info->atom_context->bios + data_offset); 2102 2103 /* add the i2c bus for thermal/fan chip */ 2104 if ((power_info->info.ucOverdriveThermalController > 0) && 2105 (power_info->info.ucOverdriveThermalController < ARRAY_SIZE(thermal_controller_names))) { 2106 DRM_INFO("Possible %s thermal controller at 0x%02x\n", 2107 thermal_controller_names[power_info->info.ucOverdriveThermalController], 2108 power_info->info.ucOverdriveControllerAddress >> 1); 2109 i2c_bus = radeon_lookup_i2c_gpio(rdev, power_info->info.ucOverdriveI2cLine); 2110 rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus); 2111 #ifdef notyet 2112 if (rdev->pm.i2c_bus) { 2113 struct i2c_board_info info = { }; 2114 const char *name = thermal_controller_names[power_info->info. 2115 ucOverdriveThermalController]; 2116 info.addr = power_info->info.ucOverdriveControllerAddress >> 1; 2117 strscpy(info.type, name, sizeof(info.type)); 2118 i2c_new_client_device(&rdev->pm.i2c_bus->adapter, &info); 2119 } 2120 #endif 2121 } 2122 num_modes = power_info->info.ucNumOfPowerModeEntries; 2123 if (num_modes > ATOM_MAX_NUMBEROF_POWER_BLOCK) 2124 num_modes = ATOM_MAX_NUMBEROF_POWER_BLOCK; 2125 if (num_modes == 0) 2126 return state_index; 2127 rdev->pm.power_state = kcalloc(num_modes, 2128 sizeof(struct radeon_power_state), 2129 GFP_KERNEL); 2130 if (!rdev->pm.power_state) 2131 return state_index; 2132 /* last mode is usually default, array is low to high */ 2133 for (i = 0; i < num_modes; i++) { 2134 /* avoid memory leaks from invalid modes or unknown frev. */ 2135 if (!rdev->pm.power_state[state_index].clock_info) { 2136 rdev->pm.power_state[state_index].clock_info = 2137 kzalloc(sizeof(struct radeon_pm_clock_info), 2138 GFP_KERNEL); 2139 } 2140 if (!rdev->pm.power_state[state_index].clock_info) 2141 goto out; 2142 rdev->pm.power_state[state_index].num_clock_modes = 1; 2143 rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE; 2144 switch (frev) { 2145 case 1: 2146 rdev->pm.power_state[state_index].clock_info[0].mclk = 2147 le16_to_cpu(power_info->info.asPowerPlayInfo[i].usMemoryClock); 2148 rdev->pm.power_state[state_index].clock_info[0].sclk = 2149 le16_to_cpu(power_info->info.asPowerPlayInfo[i].usEngineClock); 2150 /* skip invalid modes */ 2151 if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) || 2152 (rdev->pm.power_state[state_index].clock_info[0].sclk == 0)) 2153 continue; 2154 rdev->pm.power_state[state_index].pcie_lanes = 2155 power_info->info.asPowerPlayInfo[i].ucNumPciELanes; 2156 misc = le32_to_cpu(power_info->info.asPowerPlayInfo[i].ulMiscInfo); 2157 if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) || 2158 (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) { 2159 rdev->pm.power_state[state_index].clock_info[0].voltage.type = 2160 VOLTAGE_GPIO; 2161 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio = 2162 radeon_atombios_lookup_gpio(rdev, 2163 power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex); 2164 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH) 2165 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high = 2166 true; 2167 else 2168 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high = 2169 false; 2170 } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) { 2171 rdev->pm.power_state[state_index].clock_info[0].voltage.type = 2172 VOLTAGE_VDDC; 2173 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id = 2174 power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex; 2175 } 2176 rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY; 2177 radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, 0); 2178 state_index++; 2179 break; 2180 case 2: 2181 rdev->pm.power_state[state_index].clock_info[0].mclk = 2182 le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMemoryClock); 2183 rdev->pm.power_state[state_index].clock_info[0].sclk = 2184 le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulEngineClock); 2185 /* skip invalid modes */ 2186 if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) || 2187 (rdev->pm.power_state[state_index].clock_info[0].sclk == 0)) 2188 continue; 2189 rdev->pm.power_state[state_index].pcie_lanes = 2190 power_info->info_2.asPowerPlayInfo[i].ucNumPciELanes; 2191 misc = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo); 2192 misc2 = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo2); 2193 if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) || 2194 (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) { 2195 rdev->pm.power_state[state_index].clock_info[0].voltage.type = 2196 VOLTAGE_GPIO; 2197 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio = 2198 radeon_atombios_lookup_gpio(rdev, 2199 power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex); 2200 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH) 2201 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high = 2202 true; 2203 else 2204 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high = 2205 false; 2206 } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) { 2207 rdev->pm.power_state[state_index].clock_info[0].voltage.type = 2208 VOLTAGE_VDDC; 2209 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id = 2210 power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex; 2211 } 2212 rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY; 2213 radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, misc2); 2214 state_index++; 2215 break; 2216 case 3: 2217 rdev->pm.power_state[state_index].clock_info[0].mclk = 2218 le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMemoryClock); 2219 rdev->pm.power_state[state_index].clock_info[0].sclk = 2220 le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulEngineClock); 2221 /* skip invalid modes */ 2222 if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) || 2223 (rdev->pm.power_state[state_index].clock_info[0].sclk == 0)) 2224 continue; 2225 rdev->pm.power_state[state_index].pcie_lanes = 2226 power_info->info_3.asPowerPlayInfo[i].ucNumPciELanes; 2227 misc = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo); 2228 misc2 = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo2); 2229 if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) || 2230 (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) { 2231 rdev->pm.power_state[state_index].clock_info[0].voltage.type = 2232 VOLTAGE_GPIO; 2233 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio = 2234 radeon_atombios_lookup_gpio(rdev, 2235 power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex); 2236 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH) 2237 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high = 2238 true; 2239 else 2240 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high = 2241 false; 2242 } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) { 2243 rdev->pm.power_state[state_index].clock_info[0].voltage.type = 2244 VOLTAGE_VDDC; 2245 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id = 2246 power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex; 2247 if (misc2 & ATOM_PM_MISCINFO2_VDDCI_DYNAMIC_VOLTAGE_EN) { 2248 rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_enabled = 2249 true; 2250 rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_id = 2251 power_info->info_3.asPowerPlayInfo[i].ucVDDCI_VoltageDropIndex; 2252 } 2253 } 2254 rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY; 2255 radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, misc2); 2256 state_index++; 2257 break; 2258 } 2259 } 2260 out: 2261 /* free any unused clock_info allocation. */ 2262 if (state_index && state_index < num_modes) { 2263 kfree(rdev->pm.power_state[state_index].clock_info); 2264 rdev->pm.power_state[state_index].clock_info = NULL; 2265 } 2266 2267 /* last mode is usually default */ 2268 if (state_index && rdev->pm.default_power_state_index == -1) { 2269 rdev->pm.power_state[state_index - 1].type = 2270 POWER_STATE_TYPE_DEFAULT; 2271 rdev->pm.default_power_state_index = state_index - 1; 2272 rdev->pm.power_state[state_index - 1].default_clock_mode = 2273 &rdev->pm.power_state[state_index - 1].clock_info[0]; 2274 rdev->pm.power_state[state_index - 1].flags &= 2275 ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY; 2276 rdev->pm.power_state[state_index - 1].misc = 0; 2277 rdev->pm.power_state[state_index - 1].misc2 = 0; 2278 } 2279 return state_index; 2280 } 2281 2282 static void radeon_atombios_add_pplib_thermal_controller(struct radeon_device *rdev, 2283 ATOM_PPLIB_THERMALCONTROLLER *controller) 2284 { 2285 struct radeon_i2c_bus_rec i2c_bus; 2286 2287 /* add the i2c bus for thermal/fan chip */ 2288 if (controller->ucType > 0) { 2289 if (controller->ucFanParameters & ATOM_PP_FANPARAMETERS_NOFAN) 2290 rdev->pm.no_fan = true; 2291 rdev->pm.fan_pulses_per_revolution = 2292 controller->ucFanParameters & ATOM_PP_FANPARAMETERS_TACHOMETER_PULSES_PER_REVOLUTION_MASK; 2293 if (rdev->pm.fan_pulses_per_revolution) { 2294 rdev->pm.fan_min_rpm = controller->ucFanMinRPM; 2295 rdev->pm.fan_max_rpm = controller->ucFanMaxRPM; 2296 } 2297 if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV6xx) { 2298 DRM_INFO("Internal thermal controller %s fan control\n", 2299 (controller->ucFanParameters & 2300 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); 2301 rdev->pm.int_thermal_type = THERMAL_TYPE_RV6XX; 2302 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV770) { 2303 DRM_INFO("Internal thermal controller %s fan control\n", 2304 (controller->ucFanParameters & 2305 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); 2306 rdev->pm.int_thermal_type = THERMAL_TYPE_RV770; 2307 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_EVERGREEN) { 2308 DRM_INFO("Internal thermal controller %s fan control\n", 2309 (controller->ucFanParameters & 2310 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); 2311 rdev->pm.int_thermal_type = THERMAL_TYPE_EVERGREEN; 2312 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_SUMO) { 2313 DRM_INFO("Internal thermal controller %s fan control\n", 2314 (controller->ucFanParameters & 2315 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); 2316 rdev->pm.int_thermal_type = THERMAL_TYPE_SUMO; 2317 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_NISLANDS) { 2318 DRM_INFO("Internal thermal controller %s fan control\n", 2319 (controller->ucFanParameters & 2320 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); 2321 rdev->pm.int_thermal_type = THERMAL_TYPE_NI; 2322 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_SISLANDS) { 2323 DRM_INFO("Internal thermal controller %s fan control\n", 2324 (controller->ucFanParameters & 2325 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); 2326 rdev->pm.int_thermal_type = THERMAL_TYPE_SI; 2327 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_CISLANDS) { 2328 DRM_INFO("Internal thermal controller %s fan control\n", 2329 (controller->ucFanParameters & 2330 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); 2331 rdev->pm.int_thermal_type = THERMAL_TYPE_CI; 2332 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_KAVERI) { 2333 DRM_INFO("Internal thermal controller %s fan control\n", 2334 (controller->ucFanParameters & 2335 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); 2336 rdev->pm.int_thermal_type = THERMAL_TYPE_KV; 2337 } else if (controller->ucType == 2338 ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO) { 2339 DRM_INFO("External GPIO thermal controller %s fan control\n", 2340 (controller->ucFanParameters & 2341 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); 2342 rdev->pm.int_thermal_type = THERMAL_TYPE_EXTERNAL_GPIO; 2343 } else if (controller->ucType == 2344 ATOM_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL) { 2345 DRM_INFO("ADT7473 with internal thermal controller %s fan control\n", 2346 (controller->ucFanParameters & 2347 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); 2348 rdev->pm.int_thermal_type = THERMAL_TYPE_ADT7473_WITH_INTERNAL; 2349 } else if (controller->ucType == 2350 ATOM_PP_THERMALCONTROLLER_EMC2103_WITH_INTERNAL) { 2351 DRM_INFO("EMC2103 with internal thermal controller %s fan control\n", 2352 (controller->ucFanParameters & 2353 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); 2354 rdev->pm.int_thermal_type = THERMAL_TYPE_EMC2103_WITH_INTERNAL; 2355 } else if (controller->ucType < ARRAY_SIZE(pp_lib_thermal_controller_names)) { 2356 DRM_INFO("Possible %s thermal controller at 0x%02x %s fan control\n", 2357 pp_lib_thermal_controller_names[controller->ucType], 2358 controller->ucI2cAddress >> 1, 2359 (controller->ucFanParameters & 2360 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); 2361 rdev->pm.int_thermal_type = THERMAL_TYPE_EXTERNAL; 2362 i2c_bus = radeon_lookup_i2c_gpio(rdev, controller->ucI2cLine); 2363 rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus); 2364 #ifdef notyet 2365 if (rdev->pm.i2c_bus) { 2366 struct i2c_board_info info = { }; 2367 const char *name = pp_lib_thermal_controller_names[controller->ucType]; 2368 info.addr = controller->ucI2cAddress >> 1; 2369 strscpy(info.type, name, sizeof(info.type)); 2370 i2c_new_client_device(&rdev->pm.i2c_bus->adapter, &info); 2371 } 2372 #endif 2373 } else { 2374 DRM_INFO("Unknown thermal controller type %d at 0x%02x %s fan control\n", 2375 controller->ucType, 2376 controller->ucI2cAddress >> 1, 2377 (controller->ucFanParameters & 2378 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); 2379 } 2380 } 2381 } 2382 2383 void radeon_atombios_get_default_voltages(struct radeon_device *rdev, 2384 u16 *vddc, u16 *vddci, u16 *mvdd) 2385 { 2386 struct radeon_mode_info *mode_info = &rdev->mode_info; 2387 int index = GetIndexIntoMasterTable(DATA, FirmwareInfo); 2388 u8 frev, crev; 2389 u16 data_offset; 2390 union firmware_info *firmware_info; 2391 2392 *vddc = 0; 2393 *vddci = 0; 2394 *mvdd = 0; 2395 2396 if (atom_parse_data_header(mode_info->atom_context, index, NULL, 2397 &frev, &crev, &data_offset)) { 2398 firmware_info = 2399 (union firmware_info *)(mode_info->atom_context->bios + 2400 data_offset); 2401 *vddc = le16_to_cpu(firmware_info->info_14.usBootUpVDDCVoltage); 2402 if ((frev == 2) && (crev >= 2)) { 2403 *vddci = le16_to_cpu(firmware_info->info_22.usBootUpVDDCIVoltage); 2404 *mvdd = le16_to_cpu(firmware_info->info_22.usBootUpMVDDCVoltage); 2405 } 2406 } 2407 } 2408 2409 static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rdev, 2410 int state_index, int mode_index, 2411 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info) 2412 { 2413 int j; 2414 u32 misc = le32_to_cpu(non_clock_info->ulCapsAndSettings); 2415 u32 misc2 = le16_to_cpu(non_clock_info->usClassification); 2416 u16 vddc, vddci, mvdd; 2417 2418 radeon_atombios_get_default_voltages(rdev, &vddc, &vddci, &mvdd); 2419 2420 rdev->pm.power_state[state_index].misc = misc; 2421 rdev->pm.power_state[state_index].misc2 = misc2; 2422 rdev->pm.power_state[state_index].pcie_lanes = 2423 ((misc & ATOM_PPLIB_PCIE_LINK_WIDTH_MASK) >> 2424 ATOM_PPLIB_PCIE_LINK_WIDTH_SHIFT) + 1; 2425 switch (misc2 & ATOM_PPLIB_CLASSIFICATION_UI_MASK) { 2426 case ATOM_PPLIB_CLASSIFICATION_UI_BATTERY: 2427 rdev->pm.power_state[state_index].type = 2428 POWER_STATE_TYPE_BATTERY; 2429 break; 2430 case ATOM_PPLIB_CLASSIFICATION_UI_BALANCED: 2431 rdev->pm.power_state[state_index].type = 2432 POWER_STATE_TYPE_BALANCED; 2433 break; 2434 case ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE: 2435 rdev->pm.power_state[state_index].type = 2436 POWER_STATE_TYPE_PERFORMANCE; 2437 break; 2438 case ATOM_PPLIB_CLASSIFICATION_UI_NONE: 2439 if (misc2 & ATOM_PPLIB_CLASSIFICATION_3DPERFORMANCE) 2440 rdev->pm.power_state[state_index].type = 2441 POWER_STATE_TYPE_PERFORMANCE; 2442 break; 2443 } 2444 rdev->pm.power_state[state_index].flags = 0; 2445 if (misc & ATOM_PPLIB_SINGLE_DISPLAY_ONLY) 2446 rdev->pm.power_state[state_index].flags |= 2447 RADEON_PM_STATE_SINGLE_DISPLAY_ONLY; 2448 if (misc2 & ATOM_PPLIB_CLASSIFICATION_BOOT) { 2449 rdev->pm.power_state[state_index].type = 2450 POWER_STATE_TYPE_DEFAULT; 2451 rdev->pm.default_power_state_index = state_index; 2452 rdev->pm.power_state[state_index].default_clock_mode = 2453 &rdev->pm.power_state[state_index].clock_info[mode_index - 1]; 2454 if ((rdev->family >= CHIP_BARTS) && !(rdev->flags & RADEON_IS_IGP)) { 2455 /* NI chips post without MC ucode, so default clocks are strobe mode only */ 2456 rdev->pm.default_sclk = rdev->pm.power_state[state_index].clock_info[0].sclk; 2457 rdev->pm.default_mclk = rdev->pm.power_state[state_index].clock_info[0].mclk; 2458 rdev->pm.default_vddc = rdev->pm.power_state[state_index].clock_info[0].voltage.voltage; 2459 rdev->pm.default_vddci = rdev->pm.power_state[state_index].clock_info[0].voltage.vddci; 2460 } else { 2461 u16 max_vddci = 0; 2462 2463 if (ASIC_IS_DCE4(rdev)) 2464 radeon_atom_get_max_voltage(rdev, 2465 SET_VOLTAGE_TYPE_ASIC_VDDCI, 2466 &max_vddci); 2467 /* patch the table values with the default sclk/mclk from firmware info */ 2468 for (j = 0; j < mode_index; j++) { 2469 rdev->pm.power_state[state_index].clock_info[j].mclk = 2470 rdev->clock.default_mclk; 2471 rdev->pm.power_state[state_index].clock_info[j].sclk = 2472 rdev->clock.default_sclk; 2473 if (vddc) 2474 rdev->pm.power_state[state_index].clock_info[j].voltage.voltage = 2475 vddc; 2476 if (max_vddci) 2477 rdev->pm.power_state[state_index].clock_info[j].voltage.vddci = 2478 max_vddci; 2479 } 2480 } 2481 } 2482 } 2483 2484 static bool radeon_atombios_parse_pplib_clock_info(struct radeon_device *rdev, 2485 int state_index, int mode_index, 2486 union pplib_clock_info *clock_info) 2487 { 2488 u32 sclk, mclk; 2489 u16 vddc; 2490 2491 if (rdev->flags & RADEON_IS_IGP) { 2492 if (rdev->family >= CHIP_PALM) { 2493 sclk = le16_to_cpu(clock_info->sumo.usEngineClockLow); 2494 sclk |= clock_info->sumo.ucEngineClockHigh << 16; 2495 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk; 2496 } else { 2497 sclk = le16_to_cpu(clock_info->rs780.usLowEngineClockLow); 2498 sclk |= clock_info->rs780.ucLowEngineClockHigh << 16; 2499 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk; 2500 } 2501 } else if (rdev->family >= CHIP_BONAIRE) { 2502 sclk = le16_to_cpu(clock_info->ci.usEngineClockLow); 2503 sclk |= clock_info->ci.ucEngineClockHigh << 16; 2504 mclk = le16_to_cpu(clock_info->ci.usMemoryClockLow); 2505 mclk |= clock_info->ci.ucMemoryClockHigh << 16; 2506 rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk; 2507 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk; 2508 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type = 2509 VOLTAGE_NONE; 2510 } else if (rdev->family >= CHIP_TAHITI) { 2511 sclk = le16_to_cpu(clock_info->si.usEngineClockLow); 2512 sclk |= clock_info->si.ucEngineClockHigh << 16; 2513 mclk = le16_to_cpu(clock_info->si.usMemoryClockLow); 2514 mclk |= clock_info->si.ucMemoryClockHigh << 16; 2515 rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk; 2516 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk; 2517 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type = 2518 VOLTAGE_SW; 2519 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage = 2520 le16_to_cpu(clock_info->si.usVDDC); 2521 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.vddci = 2522 le16_to_cpu(clock_info->si.usVDDCI); 2523 } else if (rdev->family >= CHIP_CEDAR) { 2524 sclk = le16_to_cpu(clock_info->evergreen.usEngineClockLow); 2525 sclk |= clock_info->evergreen.ucEngineClockHigh << 16; 2526 mclk = le16_to_cpu(clock_info->evergreen.usMemoryClockLow); 2527 mclk |= clock_info->evergreen.ucMemoryClockHigh << 16; 2528 rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk; 2529 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk; 2530 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type = 2531 VOLTAGE_SW; 2532 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage = 2533 le16_to_cpu(clock_info->evergreen.usVDDC); 2534 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.vddci = 2535 le16_to_cpu(clock_info->evergreen.usVDDCI); 2536 } else { 2537 sclk = le16_to_cpu(clock_info->r600.usEngineClockLow); 2538 sclk |= clock_info->r600.ucEngineClockHigh << 16; 2539 mclk = le16_to_cpu(clock_info->r600.usMemoryClockLow); 2540 mclk |= clock_info->r600.ucMemoryClockHigh << 16; 2541 rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk; 2542 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk; 2543 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type = 2544 VOLTAGE_SW; 2545 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage = 2546 le16_to_cpu(clock_info->r600.usVDDC); 2547 } 2548 2549 /* patch up vddc if necessary */ 2550 switch (rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage) { 2551 case ATOM_VIRTUAL_VOLTAGE_ID0: 2552 case ATOM_VIRTUAL_VOLTAGE_ID1: 2553 case ATOM_VIRTUAL_VOLTAGE_ID2: 2554 case ATOM_VIRTUAL_VOLTAGE_ID3: 2555 case ATOM_VIRTUAL_VOLTAGE_ID4: 2556 case ATOM_VIRTUAL_VOLTAGE_ID5: 2557 case ATOM_VIRTUAL_VOLTAGE_ID6: 2558 case ATOM_VIRTUAL_VOLTAGE_ID7: 2559 if (radeon_atom_get_max_vddc(rdev, VOLTAGE_TYPE_VDDC, 2560 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage, 2561 &vddc) == 0) 2562 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage = vddc; 2563 break; 2564 default: 2565 break; 2566 } 2567 2568 if (rdev->flags & RADEON_IS_IGP) { 2569 /* skip invalid modes */ 2570 if (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0) 2571 return false; 2572 } else { 2573 /* skip invalid modes */ 2574 if ((rdev->pm.power_state[state_index].clock_info[mode_index].mclk == 0) || 2575 (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0)) 2576 return false; 2577 } 2578 return true; 2579 } 2580 2581 static int radeon_atombios_parse_power_table_4_5(struct radeon_device *rdev) 2582 { 2583 struct radeon_mode_info *mode_info = &rdev->mode_info; 2584 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info; 2585 union pplib_power_state *power_state; 2586 int i, j; 2587 int state_index = 0, mode_index = 0; 2588 union pplib_clock_info *clock_info; 2589 bool valid; 2590 union power_info *power_info; 2591 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); 2592 u16 data_offset; 2593 u8 frev, crev; 2594 2595 if (!atom_parse_data_header(mode_info->atom_context, index, NULL, 2596 &frev, &crev, &data_offset)) 2597 return state_index; 2598 power_info = (union power_info *)(mode_info->atom_context->bios + data_offset); 2599 2600 radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController); 2601 if (power_info->pplib.ucNumStates == 0) 2602 return state_index; 2603 rdev->pm.power_state = kcalloc(power_info->pplib.ucNumStates, 2604 sizeof(struct radeon_power_state), 2605 GFP_KERNEL); 2606 if (!rdev->pm.power_state) 2607 return state_index; 2608 /* first mode is usually default, followed by low to high */ 2609 for (i = 0; i < power_info->pplib.ucNumStates; i++) { 2610 mode_index = 0; 2611 power_state = (union pplib_power_state *) 2612 (mode_info->atom_context->bios + data_offset + 2613 le16_to_cpu(power_info->pplib.usStateArrayOffset) + 2614 i * power_info->pplib.ucStateEntrySize); 2615 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *) 2616 (mode_info->atom_context->bios + data_offset + 2617 le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset) + 2618 (power_state->v1.ucNonClockStateIndex * 2619 power_info->pplib.ucNonClockSize)); 2620 rdev->pm.power_state[i].clock_info = 2621 kcalloc((power_info->pplib.ucStateEntrySize - 1) ? 2622 (power_info->pplib.ucStateEntrySize - 1) : 1, 2623 sizeof(struct radeon_pm_clock_info), 2624 GFP_KERNEL); 2625 if (!rdev->pm.power_state[i].clock_info) 2626 return state_index; 2627 if (power_info->pplib.ucStateEntrySize - 1) { 2628 for (j = 0; j < (power_info->pplib.ucStateEntrySize - 1); j++) { 2629 clock_info = (union pplib_clock_info *) 2630 (mode_info->atom_context->bios + data_offset + 2631 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset) + 2632 (power_state->v1.ucClockStateIndices[j] * 2633 power_info->pplib.ucClockInfoSize)); 2634 valid = radeon_atombios_parse_pplib_clock_info(rdev, 2635 state_index, mode_index, 2636 clock_info); 2637 if (valid) 2638 mode_index++; 2639 } 2640 } else { 2641 rdev->pm.power_state[state_index].clock_info[0].mclk = 2642 rdev->clock.default_mclk; 2643 rdev->pm.power_state[state_index].clock_info[0].sclk = 2644 rdev->clock.default_sclk; 2645 mode_index++; 2646 } 2647 rdev->pm.power_state[state_index].num_clock_modes = mode_index; 2648 if (mode_index) { 2649 radeon_atombios_parse_pplib_non_clock_info(rdev, state_index, mode_index, 2650 non_clock_info); 2651 state_index++; 2652 } 2653 } 2654 /* if multiple clock modes, mark the lowest as no display */ 2655 for (i = 0; i < state_index; i++) { 2656 if (rdev->pm.power_state[i].num_clock_modes > 1) 2657 rdev->pm.power_state[i].clock_info[0].flags |= 2658 RADEON_PM_MODE_NO_DISPLAY; 2659 } 2660 /* first mode is usually default */ 2661 if (rdev->pm.default_power_state_index == -1) { 2662 rdev->pm.power_state[0].type = 2663 POWER_STATE_TYPE_DEFAULT; 2664 rdev->pm.default_power_state_index = 0; 2665 rdev->pm.power_state[0].default_clock_mode = 2666 &rdev->pm.power_state[0].clock_info[0]; 2667 } 2668 return state_index; 2669 } 2670 2671 static int radeon_atombios_parse_power_table_6(struct radeon_device *rdev) 2672 { 2673 struct radeon_mode_info *mode_info = &rdev->mode_info; 2674 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info; 2675 union pplib_power_state *power_state; 2676 int i, j, non_clock_array_index, clock_array_index; 2677 int state_index = 0, mode_index = 0; 2678 union pplib_clock_info *clock_info; 2679 struct _StateArray *state_array; 2680 struct _ClockInfoArray *clock_info_array; 2681 struct _NonClockInfoArray *non_clock_info_array; 2682 bool valid; 2683 union power_info *power_info; 2684 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); 2685 u16 data_offset; 2686 u8 frev, crev; 2687 u8 *power_state_offset; 2688 2689 if (!atom_parse_data_header(mode_info->atom_context, index, NULL, 2690 &frev, &crev, &data_offset)) 2691 return state_index; 2692 power_info = (union power_info *)(mode_info->atom_context->bios + data_offset); 2693 2694 radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController); 2695 state_array = (struct _StateArray *) 2696 (mode_info->atom_context->bios + data_offset + 2697 le16_to_cpu(power_info->pplib.usStateArrayOffset)); 2698 clock_info_array = (struct _ClockInfoArray *) 2699 (mode_info->atom_context->bios + data_offset + 2700 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset)); 2701 non_clock_info_array = (struct _NonClockInfoArray *) 2702 (mode_info->atom_context->bios + data_offset + 2703 le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset)); 2704 if (state_array->ucNumEntries == 0) 2705 return state_index; 2706 rdev->pm.power_state = kcalloc(state_array->ucNumEntries, 2707 sizeof(struct radeon_power_state), 2708 GFP_KERNEL); 2709 if (!rdev->pm.power_state) 2710 return state_index; 2711 power_state_offset = (u8 *)state_array->states; 2712 for (i = 0; i < state_array->ucNumEntries; i++) { 2713 mode_index = 0; 2714 power_state = (union pplib_power_state *)power_state_offset; 2715 non_clock_array_index = power_state->v2.nonClockInfoIndex; 2716 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *) 2717 &non_clock_info_array->nonClockInfo[non_clock_array_index]; 2718 rdev->pm.power_state[i].clock_info = 2719 kcalloc(power_state->v2.ucNumDPMLevels ? 2720 power_state->v2.ucNumDPMLevels : 1, 2721 sizeof(struct radeon_pm_clock_info), 2722 GFP_KERNEL); 2723 if (!rdev->pm.power_state[i].clock_info) 2724 return state_index; 2725 if (power_state->v2.ucNumDPMLevels) { 2726 for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) { 2727 clock_array_index = power_state->v2.clockInfoIndex[j]; 2728 clock_info = (union pplib_clock_info *) 2729 &clock_info_array->clockInfo[clock_array_index * clock_info_array->ucEntrySize]; 2730 valid = radeon_atombios_parse_pplib_clock_info(rdev, 2731 state_index, mode_index, 2732 clock_info); 2733 if (valid) 2734 mode_index++; 2735 } 2736 } else { 2737 rdev->pm.power_state[state_index].clock_info[0].mclk = 2738 rdev->clock.default_mclk; 2739 rdev->pm.power_state[state_index].clock_info[0].sclk = 2740 rdev->clock.default_sclk; 2741 mode_index++; 2742 } 2743 rdev->pm.power_state[state_index].num_clock_modes = mode_index; 2744 if (mode_index) { 2745 radeon_atombios_parse_pplib_non_clock_info(rdev, state_index, mode_index, 2746 non_clock_info); 2747 state_index++; 2748 } 2749 power_state_offset += 2 + power_state->v2.ucNumDPMLevels; 2750 } 2751 /* if multiple clock modes, mark the lowest as no display */ 2752 for (i = 0; i < state_index; i++) { 2753 if (rdev->pm.power_state[i].num_clock_modes > 1) 2754 rdev->pm.power_state[i].clock_info[0].flags |= 2755 RADEON_PM_MODE_NO_DISPLAY; 2756 } 2757 /* first mode is usually default */ 2758 if (rdev->pm.default_power_state_index == -1) { 2759 rdev->pm.power_state[0].type = 2760 POWER_STATE_TYPE_DEFAULT; 2761 rdev->pm.default_power_state_index = 0; 2762 rdev->pm.power_state[0].default_clock_mode = 2763 &rdev->pm.power_state[0].clock_info[0]; 2764 } 2765 return state_index; 2766 } 2767 2768 void radeon_atombios_get_power_modes(struct radeon_device *rdev) 2769 { 2770 struct radeon_mode_info *mode_info = &rdev->mode_info; 2771 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); 2772 u16 data_offset; 2773 u8 frev, crev; 2774 int state_index = 0; 2775 2776 rdev->pm.default_power_state_index = -1; 2777 2778 if (atom_parse_data_header(mode_info->atom_context, index, NULL, 2779 &frev, &crev, &data_offset)) { 2780 switch (frev) { 2781 case 1: 2782 case 2: 2783 case 3: 2784 state_index = radeon_atombios_parse_power_table_1_3(rdev); 2785 break; 2786 case 4: 2787 case 5: 2788 state_index = radeon_atombios_parse_power_table_4_5(rdev); 2789 break; 2790 case 6: 2791 state_index = radeon_atombios_parse_power_table_6(rdev); 2792 break; 2793 default: 2794 break; 2795 } 2796 } 2797 2798 if (state_index == 0) { 2799 rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state), GFP_KERNEL); 2800 if (rdev->pm.power_state) { 2801 rdev->pm.power_state[0].clock_info = 2802 kcalloc(1, 2803 sizeof(struct radeon_pm_clock_info), 2804 GFP_KERNEL); 2805 if (rdev->pm.power_state[0].clock_info) { 2806 /* add the default mode */ 2807 rdev->pm.power_state[state_index].type = 2808 POWER_STATE_TYPE_DEFAULT; 2809 rdev->pm.power_state[state_index].num_clock_modes = 1; 2810 rdev->pm.power_state[state_index].clock_info[0].mclk = rdev->clock.default_mclk; 2811 rdev->pm.power_state[state_index].clock_info[0].sclk = rdev->clock.default_sclk; 2812 rdev->pm.power_state[state_index].default_clock_mode = 2813 &rdev->pm.power_state[state_index].clock_info[0]; 2814 rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE; 2815 rdev->pm.power_state[state_index].pcie_lanes = 16; 2816 rdev->pm.default_power_state_index = state_index; 2817 rdev->pm.power_state[state_index].flags = 0; 2818 state_index++; 2819 } 2820 } 2821 } 2822 2823 rdev->pm.num_power_states = state_index; 2824 2825 rdev->pm.current_power_state_index = rdev->pm.default_power_state_index; 2826 rdev->pm.current_clock_mode_index = 0; 2827 if (rdev->pm.default_power_state_index >= 0) 2828 rdev->pm.current_vddc = 2829 rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage; 2830 else 2831 rdev->pm.current_vddc = 0; 2832 } 2833 2834 union get_clock_dividers { 2835 struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS v1; 2836 struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V2 v2; 2837 struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V3 v3; 2838 struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V4 v4; 2839 struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V5 v5; 2840 struct _COMPUTE_GPU_CLOCK_INPUT_PARAMETERS_V1_6 v6_in; 2841 struct _COMPUTE_GPU_CLOCK_OUTPUT_PARAMETERS_V1_6 v6_out; 2842 }; 2843 2844 int radeon_atom_get_clock_dividers(struct radeon_device *rdev, 2845 u8 clock_type, 2846 u32 clock, 2847 bool strobe_mode, 2848 struct atom_clock_dividers *dividers) 2849 { 2850 union get_clock_dividers args; 2851 int index = GetIndexIntoMasterTable(COMMAND, ComputeMemoryEnginePLL); 2852 u8 frev, crev; 2853 2854 memset(&args, 0, sizeof(args)); 2855 memset(dividers, 0, sizeof(struct atom_clock_dividers)); 2856 2857 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) 2858 return -EINVAL; 2859 2860 switch (crev) { 2861 case 1: 2862 /* r4xx, r5xx */ 2863 args.v1.ucAction = clock_type; 2864 args.v1.ulClock = cpu_to_le32(clock); /* 10 khz */ 2865 2866 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 2867 2868 dividers->post_div = args.v1.ucPostDiv; 2869 dividers->fb_div = args.v1.ucFbDiv; 2870 dividers->enable_post_div = true; 2871 break; 2872 case 2: 2873 case 3: 2874 case 5: 2875 /* r6xx, r7xx, evergreen, ni, si */ 2876 if (rdev->family <= CHIP_RV770) { 2877 args.v2.ucAction = clock_type; 2878 args.v2.ulClock = cpu_to_le32(clock); /* 10 khz */ 2879 2880 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 2881 2882 dividers->post_div = args.v2.ucPostDiv; 2883 dividers->fb_div = le16_to_cpu(args.v2.usFbDiv); 2884 dividers->ref_div = args.v2.ucAction; 2885 if (rdev->family == CHIP_RV770) { 2886 dividers->enable_post_div = (le32_to_cpu(args.v2.ulClock) & (1 << 24)) ? 2887 true : false; 2888 dividers->vco_mode = (le32_to_cpu(args.v2.ulClock) & (1 << 25)) ? 1 : 0; 2889 } else 2890 dividers->enable_post_div = (dividers->fb_div & 1) ? true : false; 2891 } else { 2892 if (clock_type == COMPUTE_ENGINE_PLL_PARAM) { 2893 args.v3.ulClockParams = cpu_to_le32((clock_type << 24) | clock); 2894 2895 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 2896 2897 dividers->post_div = args.v3.ucPostDiv; 2898 dividers->enable_post_div = (args.v3.ucCntlFlag & 2899 ATOM_PLL_CNTL_FLAG_PLL_POST_DIV_EN) ? true : false; 2900 dividers->enable_dithen = (args.v3.ucCntlFlag & 2901 ATOM_PLL_CNTL_FLAG_FRACTION_DISABLE) ? false : true; 2902 dividers->whole_fb_div = le16_to_cpu(args.v3.ulFbDiv.usFbDiv); 2903 dividers->frac_fb_div = le16_to_cpu(args.v3.ulFbDiv.usFbDivFrac); 2904 dividers->ref_div = args.v3.ucRefDiv; 2905 dividers->vco_mode = (args.v3.ucCntlFlag & 2906 ATOM_PLL_CNTL_FLAG_MPLL_VCO_MODE) ? 1 : 0; 2907 } else { 2908 /* for SI we use ComputeMemoryClockParam for memory plls */ 2909 if (rdev->family >= CHIP_TAHITI) 2910 return -EINVAL; 2911 args.v5.ulClockParams = cpu_to_le32((clock_type << 24) | clock); 2912 if (strobe_mode) 2913 args.v5.ucInputFlag = ATOM_PLL_INPUT_FLAG_PLL_STROBE_MODE_EN; 2914 2915 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 2916 2917 dividers->post_div = args.v5.ucPostDiv; 2918 dividers->enable_post_div = (args.v5.ucCntlFlag & 2919 ATOM_PLL_CNTL_FLAG_PLL_POST_DIV_EN) ? true : false; 2920 dividers->enable_dithen = (args.v5.ucCntlFlag & 2921 ATOM_PLL_CNTL_FLAG_FRACTION_DISABLE) ? false : true; 2922 dividers->whole_fb_div = le16_to_cpu(args.v5.ulFbDiv.usFbDiv); 2923 dividers->frac_fb_div = le16_to_cpu(args.v5.ulFbDiv.usFbDivFrac); 2924 dividers->ref_div = args.v5.ucRefDiv; 2925 dividers->vco_mode = (args.v5.ucCntlFlag & 2926 ATOM_PLL_CNTL_FLAG_MPLL_VCO_MODE) ? 1 : 0; 2927 } 2928 } 2929 break; 2930 case 4: 2931 /* fusion */ 2932 args.v4.ulClock = cpu_to_le32(clock); /* 10 khz */ 2933 2934 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 2935 2936 dividers->post_divider = dividers->post_div = args.v4.ucPostDiv; 2937 dividers->real_clock = le32_to_cpu(args.v4.ulClock); 2938 break; 2939 case 6: 2940 /* CI */ 2941 /* COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK, COMPUTE_GPUCLK_INPUT_FLAG_SCLK */ 2942 args.v6_in.ulClock.ulComputeClockFlag = clock_type; 2943 args.v6_in.ulClock.ulClockFreq = cpu_to_le32(clock); /* 10 khz */ 2944 2945 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 2946 2947 dividers->whole_fb_div = le16_to_cpu(args.v6_out.ulFbDiv.usFbDiv); 2948 dividers->frac_fb_div = le16_to_cpu(args.v6_out.ulFbDiv.usFbDivFrac); 2949 dividers->ref_div = args.v6_out.ucPllRefDiv; 2950 dividers->post_div = args.v6_out.ucPllPostDiv; 2951 dividers->flags = args.v6_out.ucPllCntlFlag; 2952 dividers->real_clock = le32_to_cpu(args.v6_out.ulClock.ulClock); 2953 dividers->post_divider = args.v6_out.ulClock.ucPostDiv; 2954 break; 2955 default: 2956 return -EINVAL; 2957 } 2958 return 0; 2959 } 2960 2961 int radeon_atom_get_memory_pll_dividers(struct radeon_device *rdev, 2962 u32 clock, 2963 bool strobe_mode, 2964 struct atom_mpll_param *mpll_param) 2965 { 2966 COMPUTE_MEMORY_CLOCK_PARAM_PARAMETERS_V2_1 args; 2967 int index = GetIndexIntoMasterTable(COMMAND, ComputeMemoryClockParam); 2968 u8 frev, crev; 2969 2970 memset(&args, 0, sizeof(args)); 2971 memset(mpll_param, 0, sizeof(struct atom_mpll_param)); 2972 2973 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) 2974 return -EINVAL; 2975 2976 switch (frev) { 2977 case 2: 2978 switch (crev) { 2979 case 1: 2980 /* SI */ 2981 args.ulClock = cpu_to_le32(clock); /* 10 khz */ 2982 args.ucInputFlag = 0; 2983 if (strobe_mode) 2984 args.ucInputFlag |= MPLL_INPUT_FLAG_STROBE_MODE_EN; 2985 2986 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 2987 2988 mpll_param->clkfrac = le16_to_cpu(args.ulFbDiv.usFbDivFrac); 2989 mpll_param->clkf = le16_to_cpu(args.ulFbDiv.usFbDiv); 2990 mpll_param->post_div = args.ucPostDiv; 2991 mpll_param->dll_speed = args.ucDllSpeed; 2992 mpll_param->bwcntl = args.ucBWCntl; 2993 mpll_param->vco_mode = 2994 (args.ucPllCntlFlag & MPLL_CNTL_FLAG_VCO_MODE_MASK); 2995 mpll_param->yclk_sel = 2996 (args.ucPllCntlFlag & MPLL_CNTL_FLAG_BYPASS_DQ_PLL) ? 1 : 0; 2997 mpll_param->qdr = 2998 (args.ucPllCntlFlag & MPLL_CNTL_FLAG_QDR_ENABLE) ? 1 : 0; 2999 mpll_param->half_rate = 3000 (args.ucPllCntlFlag & MPLL_CNTL_FLAG_AD_HALF_RATE) ? 1 : 0; 3001 break; 3002 default: 3003 return -EINVAL; 3004 } 3005 break; 3006 default: 3007 return -EINVAL; 3008 } 3009 return 0; 3010 } 3011 3012 void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable) 3013 { 3014 DYNAMIC_CLOCK_GATING_PS_ALLOCATION args; 3015 int index = GetIndexIntoMasterTable(COMMAND, DynamicClockGating); 3016 3017 args.ucEnable = enable; 3018 3019 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 3020 } 3021 3022 uint32_t radeon_atom_get_engine_clock(struct radeon_device *rdev) 3023 { 3024 GET_ENGINE_CLOCK_PS_ALLOCATION args; 3025 int index = GetIndexIntoMasterTable(COMMAND, GetEngineClock); 3026 3027 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 3028 return le32_to_cpu(args.ulReturnEngineClock); 3029 } 3030 3031 uint32_t radeon_atom_get_memory_clock(struct radeon_device *rdev) 3032 { 3033 GET_MEMORY_CLOCK_PS_ALLOCATION args; 3034 int index = GetIndexIntoMasterTable(COMMAND, GetMemoryClock); 3035 3036 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 3037 return le32_to_cpu(args.ulReturnMemoryClock); 3038 } 3039 3040 void radeon_atom_set_engine_clock(struct radeon_device *rdev, 3041 uint32_t eng_clock) 3042 { 3043 SET_ENGINE_CLOCK_PS_ALLOCATION args; 3044 int index = GetIndexIntoMasterTable(COMMAND, SetEngineClock); 3045 3046 args.ulTargetEngineClock = cpu_to_le32(eng_clock); /* 10 khz */ 3047 3048 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 3049 } 3050 3051 void radeon_atom_set_memory_clock(struct radeon_device *rdev, 3052 uint32_t mem_clock) 3053 { 3054 SET_MEMORY_CLOCK_PS_ALLOCATION args; 3055 int index = GetIndexIntoMasterTable(COMMAND, SetMemoryClock); 3056 3057 if (rdev->flags & RADEON_IS_IGP) 3058 return; 3059 3060 args.ulTargetMemoryClock = cpu_to_le32(mem_clock); /* 10 khz */ 3061 3062 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 3063 } 3064 3065 void radeon_atom_set_engine_dram_timings(struct radeon_device *rdev, 3066 u32 eng_clock, u32 mem_clock) 3067 { 3068 SET_ENGINE_CLOCK_PS_ALLOCATION args; 3069 int index = GetIndexIntoMasterTable(COMMAND, DynamicMemorySettings); 3070 u32 tmp; 3071 3072 memset(&args, 0, sizeof(args)); 3073 3074 tmp = eng_clock & SET_CLOCK_FREQ_MASK; 3075 tmp |= (COMPUTE_ENGINE_PLL_PARAM << 24); 3076 3077 args.ulTargetEngineClock = cpu_to_le32(tmp); 3078 if (mem_clock) 3079 args.sReserved.ulClock = cpu_to_le32(mem_clock & SET_CLOCK_FREQ_MASK); 3080 3081 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 3082 } 3083 3084 void radeon_atom_update_memory_dll(struct radeon_device *rdev, 3085 u32 mem_clock) 3086 { 3087 u32 args; 3088 int index = GetIndexIntoMasterTable(COMMAND, DynamicMemorySettings); 3089 3090 args = cpu_to_le32(mem_clock); /* 10 khz */ 3091 3092 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 3093 } 3094 3095 void radeon_atom_set_ac_timing(struct radeon_device *rdev, 3096 u32 mem_clock) 3097 { 3098 SET_MEMORY_CLOCK_PS_ALLOCATION args; 3099 int index = GetIndexIntoMasterTable(COMMAND, DynamicMemorySettings); 3100 u32 tmp = mem_clock | (COMPUTE_MEMORY_PLL_PARAM << 24); 3101 3102 args.ulTargetMemoryClock = cpu_to_le32(tmp); /* 10 khz */ 3103 3104 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 3105 } 3106 3107 union set_voltage { 3108 struct _SET_VOLTAGE_PS_ALLOCATION alloc; 3109 struct _SET_VOLTAGE_PARAMETERS v1; 3110 struct _SET_VOLTAGE_PARAMETERS_V2 v2; 3111 struct _SET_VOLTAGE_PARAMETERS_V1_3 v3; 3112 }; 3113 3114 void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type) 3115 { 3116 union set_voltage args; 3117 int index = GetIndexIntoMasterTable(COMMAND, SetVoltage); 3118 u8 frev, crev, volt_index = voltage_level; 3119 3120 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) 3121 return; 3122 3123 /* 0xff01 is a flag rather then an actual voltage */ 3124 if (voltage_level == 0xff01) 3125 return; 3126 3127 switch (crev) { 3128 case 1: 3129 args.v1.ucVoltageType = voltage_type; 3130 args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE; 3131 args.v1.ucVoltageIndex = volt_index; 3132 break; 3133 case 2: 3134 args.v2.ucVoltageType = voltage_type; 3135 args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE; 3136 args.v2.usVoltageLevel = cpu_to_le16(voltage_level); 3137 break; 3138 case 3: 3139 args.v3.ucVoltageType = voltage_type; 3140 args.v3.ucVoltageMode = ATOM_SET_VOLTAGE; 3141 args.v3.usVoltageLevel = cpu_to_le16(voltage_level); 3142 break; 3143 default: 3144 DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 3145 return; 3146 } 3147 3148 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 3149 } 3150 3151 int radeon_atom_get_max_vddc(struct radeon_device *rdev, u8 voltage_type, 3152 u16 voltage_id, u16 *voltage) 3153 { 3154 union set_voltage args; 3155 int index = GetIndexIntoMasterTable(COMMAND, SetVoltage); 3156 u8 frev, crev; 3157 3158 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) 3159 return -EINVAL; 3160 3161 switch (crev) { 3162 case 1: 3163 return -EINVAL; 3164 case 2: 3165 args.v2.ucVoltageType = SET_VOLTAGE_GET_MAX_VOLTAGE; 3166 args.v2.ucVoltageMode = 0; 3167 args.v2.usVoltageLevel = 0; 3168 3169 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 3170 3171 *voltage = le16_to_cpu(args.v2.usVoltageLevel); 3172 break; 3173 case 3: 3174 args.v3.ucVoltageType = voltage_type; 3175 args.v3.ucVoltageMode = ATOM_GET_VOLTAGE_LEVEL; 3176 args.v3.usVoltageLevel = cpu_to_le16(voltage_id); 3177 3178 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 3179 3180 *voltage = le16_to_cpu(args.v3.usVoltageLevel); 3181 break; 3182 default: 3183 DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 3184 return -EINVAL; 3185 } 3186 3187 return 0; 3188 } 3189 3190 int radeon_atom_get_leakage_vddc_based_on_leakage_idx(struct radeon_device *rdev, 3191 u16 *voltage, 3192 u16 leakage_idx) 3193 { 3194 return radeon_atom_get_max_vddc(rdev, VOLTAGE_TYPE_VDDC, leakage_idx, voltage); 3195 } 3196 3197 int radeon_atom_get_leakage_id_from_vbios(struct radeon_device *rdev, 3198 u16 *leakage_id) 3199 { 3200 union set_voltage args; 3201 int index = GetIndexIntoMasterTable(COMMAND, SetVoltage); 3202 u8 frev, crev; 3203 3204 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) 3205 return -EINVAL; 3206 3207 switch (crev) { 3208 case 3: 3209 case 4: 3210 args.v3.ucVoltageType = 0; 3211 args.v3.ucVoltageMode = ATOM_GET_LEAKAGE_ID; 3212 args.v3.usVoltageLevel = 0; 3213 3214 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 3215 3216 *leakage_id = le16_to_cpu(args.v3.usVoltageLevel); 3217 break; 3218 default: 3219 DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 3220 return -EINVAL; 3221 } 3222 3223 return 0; 3224 } 3225 3226 int radeon_atom_get_leakage_vddc_based_on_leakage_params(struct radeon_device *rdev, 3227 u16 *vddc, u16 *vddci, 3228 u16 virtual_voltage_id, 3229 u16 vbios_voltage_id) 3230 { 3231 int index = GetIndexIntoMasterTable(DATA, ASIC_ProfilingInfo); 3232 u8 frev, crev; 3233 u16 data_offset, size; 3234 int i, j; 3235 ATOM_ASIC_PROFILING_INFO_V2_1 *profile; 3236 u16 *leakage_bin, *vddc_id_buf, *vddc_buf, *vddci_id_buf, *vddci_buf; 3237 3238 *vddc = 0; 3239 *vddci = 0; 3240 3241 if (!atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 3242 &frev, &crev, &data_offset)) 3243 return -EINVAL; 3244 3245 profile = (ATOM_ASIC_PROFILING_INFO_V2_1 *) 3246 (rdev->mode_info.atom_context->bios + data_offset); 3247 3248 switch (frev) { 3249 case 1: 3250 return -EINVAL; 3251 case 2: 3252 switch (crev) { 3253 case 1: 3254 if (size < sizeof(ATOM_ASIC_PROFILING_INFO_V2_1)) 3255 return -EINVAL; 3256 leakage_bin = (u16 *) 3257 (rdev->mode_info.atom_context->bios + data_offset + 3258 le16_to_cpu(profile->usLeakageBinArrayOffset)); 3259 vddc_id_buf = (u16 *) 3260 (rdev->mode_info.atom_context->bios + data_offset + 3261 le16_to_cpu(profile->usElbVDDC_IdArrayOffset)); 3262 vddc_buf = (u16 *) 3263 (rdev->mode_info.atom_context->bios + data_offset + 3264 le16_to_cpu(profile->usElbVDDC_LevelArrayOffset)); 3265 vddci_id_buf = (u16 *) 3266 (rdev->mode_info.atom_context->bios + data_offset + 3267 le16_to_cpu(profile->usElbVDDCI_IdArrayOffset)); 3268 vddci_buf = (u16 *) 3269 (rdev->mode_info.atom_context->bios + data_offset + 3270 le16_to_cpu(profile->usElbVDDCI_LevelArrayOffset)); 3271 3272 if (profile->ucElbVDDC_Num > 0) { 3273 for (i = 0; i < profile->ucElbVDDC_Num; i++) { 3274 if (vddc_id_buf[i] == virtual_voltage_id) { 3275 for (j = 0; j < profile->ucLeakageBinNum; j++) { 3276 if (vbios_voltage_id <= leakage_bin[j]) { 3277 *vddc = vddc_buf[j * profile->ucElbVDDC_Num + i]; 3278 break; 3279 } 3280 } 3281 break; 3282 } 3283 } 3284 } 3285 if (profile->ucElbVDDCI_Num > 0) { 3286 for (i = 0; i < profile->ucElbVDDCI_Num; i++) { 3287 if (vddci_id_buf[i] == virtual_voltage_id) { 3288 for (j = 0; j < profile->ucLeakageBinNum; j++) { 3289 if (vbios_voltage_id <= leakage_bin[j]) { 3290 *vddci = vddci_buf[j * profile->ucElbVDDCI_Num + i]; 3291 break; 3292 } 3293 } 3294 break; 3295 } 3296 } 3297 } 3298 break; 3299 default: 3300 DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 3301 return -EINVAL; 3302 } 3303 break; 3304 default: 3305 DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 3306 return -EINVAL; 3307 } 3308 3309 return 0; 3310 } 3311 3312 union get_voltage_info { 3313 struct _GET_VOLTAGE_INFO_INPUT_PARAMETER_V1_2 in; 3314 struct _GET_EVV_VOLTAGE_INFO_OUTPUT_PARAMETER_V1_2 evv_out; 3315 }; 3316 3317 int radeon_atom_get_voltage_evv(struct radeon_device *rdev, 3318 u16 virtual_voltage_id, 3319 u16 *voltage) 3320 { 3321 int index = GetIndexIntoMasterTable(COMMAND, GetVoltageInfo); 3322 u32 entry_id; 3323 u32 count = rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.count; 3324 union get_voltage_info args; 3325 3326 for (entry_id = 0; entry_id < count; entry_id++) { 3327 if (rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[entry_id].v == 3328 virtual_voltage_id) 3329 break; 3330 } 3331 3332 if (entry_id >= count) 3333 return -EINVAL; 3334 3335 args.in.ucVoltageType = VOLTAGE_TYPE_VDDC; 3336 args.in.ucVoltageMode = ATOM_GET_VOLTAGE_EVV_VOLTAGE; 3337 args.in.usVoltageLevel = cpu_to_le16(virtual_voltage_id); 3338 args.in.ulSCLKFreq = 3339 cpu_to_le32(rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk.entries[entry_id].clk); 3340 3341 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 3342 3343 *voltage = le16_to_cpu(args.evv_out.usVoltageLevel); 3344 3345 return 0; 3346 } 3347 3348 int radeon_atom_get_voltage_gpio_settings(struct radeon_device *rdev, 3349 u16 voltage_level, u8 voltage_type, 3350 u32 *gpio_value, u32 *gpio_mask) 3351 { 3352 union set_voltage args; 3353 int index = GetIndexIntoMasterTable(COMMAND, SetVoltage); 3354 u8 frev, crev; 3355 3356 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) 3357 return -EINVAL; 3358 3359 switch (crev) { 3360 case 1: 3361 return -EINVAL; 3362 case 2: 3363 args.v2.ucVoltageType = voltage_type; 3364 args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_GET_GPIOMASK; 3365 args.v2.usVoltageLevel = cpu_to_le16(voltage_level); 3366 3367 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 3368 3369 *gpio_mask = le32_to_cpu(*(u32 *)&args.v2); 3370 3371 args.v2.ucVoltageType = voltage_type; 3372 args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_GET_GPIOVAL; 3373 args.v2.usVoltageLevel = cpu_to_le16(voltage_level); 3374 3375 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); 3376 3377 *gpio_value = le32_to_cpu(*(u32 *)&args.v2); 3378 break; 3379 default: 3380 DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 3381 return -EINVAL; 3382 } 3383 3384 return 0; 3385 } 3386 3387 union voltage_object_info { 3388 struct _ATOM_VOLTAGE_OBJECT_INFO v1; 3389 struct _ATOM_VOLTAGE_OBJECT_INFO_V2 v2; 3390 struct _ATOM_VOLTAGE_OBJECT_INFO_V3_1 v3; 3391 }; 3392 3393 union voltage_object { 3394 struct _ATOM_VOLTAGE_OBJECT v1; 3395 struct _ATOM_VOLTAGE_OBJECT_V2 v2; 3396 union _ATOM_VOLTAGE_OBJECT_V3 v3; 3397 }; 3398 3399 static ATOM_VOLTAGE_OBJECT *atom_lookup_voltage_object_v1(ATOM_VOLTAGE_OBJECT_INFO *v1, 3400 u8 voltage_type) 3401 { 3402 u32 size = le16_to_cpu(v1->sHeader.usStructureSize); 3403 u32 offset = offsetof(ATOM_VOLTAGE_OBJECT_INFO, asVoltageObj[0]); 3404 u8 *start = (u8 *)v1; 3405 3406 while (offset < size) { 3407 ATOM_VOLTAGE_OBJECT *vo = (ATOM_VOLTAGE_OBJECT *)(start + offset); 3408 if (vo->ucVoltageType == voltage_type) 3409 return vo; 3410 offset += offsetof(ATOM_VOLTAGE_OBJECT, asFormula.ucVIDAdjustEntries) + 3411 vo->asFormula.ucNumOfVoltageEntries; 3412 } 3413 return NULL; 3414 } 3415 3416 static ATOM_VOLTAGE_OBJECT_V2 *atom_lookup_voltage_object_v2(ATOM_VOLTAGE_OBJECT_INFO_V2 *v2, 3417 u8 voltage_type) 3418 { 3419 u32 size = le16_to_cpu(v2->sHeader.usStructureSize); 3420 u32 offset = offsetof(ATOM_VOLTAGE_OBJECT_INFO_V2, asVoltageObj[0]); 3421 u8 *start = (u8 *)v2; 3422 3423 while (offset < size) { 3424 ATOM_VOLTAGE_OBJECT_V2 *vo = (ATOM_VOLTAGE_OBJECT_V2 *)(start + offset); 3425 if (vo->ucVoltageType == voltage_type) 3426 return vo; 3427 offset += offsetof(ATOM_VOLTAGE_OBJECT_V2, asFormula.asVIDAdjustEntries) + 3428 (vo->asFormula.ucNumOfVoltageEntries * sizeof(VOLTAGE_LUT_ENTRY)); 3429 } 3430 return NULL; 3431 } 3432 3433 static ATOM_VOLTAGE_OBJECT_V3 *atom_lookup_voltage_object_v3(ATOM_VOLTAGE_OBJECT_INFO_V3_1 *v3, 3434 u8 voltage_type, u8 voltage_mode) 3435 { 3436 u32 size = le16_to_cpu(v3->sHeader.usStructureSize); 3437 u32 offset = offsetof(ATOM_VOLTAGE_OBJECT_INFO_V3_1, asVoltageObj[0]); 3438 u8 *start = (u8 *)v3; 3439 3440 while (offset < size) { 3441 ATOM_VOLTAGE_OBJECT_V3 *vo = (ATOM_VOLTAGE_OBJECT_V3 *)(start + offset); 3442 if ((vo->asGpioVoltageObj.sHeader.ucVoltageType == voltage_type) && 3443 (vo->asGpioVoltageObj.sHeader.ucVoltageMode == voltage_mode)) 3444 return vo; 3445 offset += le16_to_cpu(vo->asGpioVoltageObj.sHeader.usSize); 3446 } 3447 return NULL; 3448 } 3449 3450 bool 3451 radeon_atom_is_voltage_gpio(struct radeon_device *rdev, 3452 u8 voltage_type, u8 voltage_mode) 3453 { 3454 int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo); 3455 u8 frev, crev; 3456 u16 data_offset, size; 3457 union voltage_object_info *voltage_info; 3458 union voltage_object *voltage_object = NULL; 3459 3460 if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 3461 &frev, &crev, &data_offset)) { 3462 voltage_info = (union voltage_object_info *) 3463 (rdev->mode_info.atom_context->bios + data_offset); 3464 3465 switch (frev) { 3466 case 1: 3467 case 2: 3468 switch (crev) { 3469 case 1: 3470 voltage_object = (union voltage_object *) 3471 atom_lookup_voltage_object_v1(&voltage_info->v1, voltage_type); 3472 if (voltage_object && 3473 (voltage_object->v1.asControl.ucVoltageControlId == VOLTAGE_CONTROLLED_BY_GPIO)) 3474 return true; 3475 break; 3476 case 2: 3477 voltage_object = (union voltage_object *) 3478 atom_lookup_voltage_object_v2(&voltage_info->v2, voltage_type); 3479 if (voltage_object && 3480 (voltage_object->v2.asControl.ucVoltageControlId == VOLTAGE_CONTROLLED_BY_GPIO)) 3481 return true; 3482 break; 3483 default: 3484 DRM_ERROR("unknown voltage object table\n"); 3485 return false; 3486 } 3487 break; 3488 case 3: 3489 switch (crev) { 3490 case 1: 3491 if (atom_lookup_voltage_object_v3(&voltage_info->v3, 3492 voltage_type, voltage_mode)) 3493 return true; 3494 break; 3495 default: 3496 DRM_ERROR("unknown voltage object table\n"); 3497 return false; 3498 } 3499 break; 3500 default: 3501 DRM_ERROR("unknown voltage object table\n"); 3502 return false; 3503 } 3504 3505 } 3506 return false; 3507 } 3508 3509 int radeon_atom_get_svi2_info(struct radeon_device *rdev, 3510 u8 voltage_type, 3511 u8 *svd_gpio_id, u8 *svc_gpio_id) 3512 { 3513 int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo); 3514 u8 frev, crev; 3515 u16 data_offset, size; 3516 union voltage_object_info *voltage_info; 3517 union voltage_object *voltage_object = NULL; 3518 3519 if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 3520 &frev, &crev, &data_offset)) { 3521 voltage_info = (union voltage_object_info *) 3522 (rdev->mode_info.atom_context->bios + data_offset); 3523 3524 switch (frev) { 3525 case 3: 3526 switch (crev) { 3527 case 1: 3528 voltage_object = (union voltage_object *) 3529 atom_lookup_voltage_object_v3(&voltage_info->v3, 3530 voltage_type, 3531 VOLTAGE_OBJ_SVID2); 3532 if (voltage_object) { 3533 *svd_gpio_id = voltage_object->v3.asSVID2Obj.ucSVDGpioId; 3534 *svc_gpio_id = voltage_object->v3.asSVID2Obj.ucSVCGpioId; 3535 } else { 3536 return -EINVAL; 3537 } 3538 break; 3539 default: 3540 DRM_ERROR("unknown voltage object table\n"); 3541 return -EINVAL; 3542 } 3543 break; 3544 default: 3545 DRM_ERROR("unknown voltage object table\n"); 3546 return -EINVAL; 3547 } 3548 3549 } 3550 return 0; 3551 } 3552 3553 int radeon_atom_get_max_voltage(struct radeon_device *rdev, 3554 u8 voltage_type, u16 *max_voltage) 3555 { 3556 int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo); 3557 u8 frev, crev; 3558 u16 data_offset, size; 3559 union voltage_object_info *voltage_info; 3560 union voltage_object *voltage_object = NULL; 3561 3562 if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 3563 &frev, &crev, &data_offset)) { 3564 voltage_info = (union voltage_object_info *) 3565 (rdev->mode_info.atom_context->bios + data_offset); 3566 3567 switch (crev) { 3568 case 1: 3569 voltage_object = (union voltage_object *) 3570 atom_lookup_voltage_object_v1(&voltage_info->v1, voltage_type); 3571 if (voltage_object) { 3572 ATOM_VOLTAGE_FORMULA *formula = 3573 &voltage_object->v1.asFormula; 3574 if (formula->ucFlag & 1) 3575 *max_voltage = 3576 le16_to_cpu(formula->usVoltageBaseLevel) + 3577 formula->ucNumOfVoltageEntries / 2 * 3578 le16_to_cpu(formula->usVoltageStep); 3579 else 3580 *max_voltage = 3581 le16_to_cpu(formula->usVoltageBaseLevel) + 3582 (formula->ucNumOfVoltageEntries - 1) * 3583 le16_to_cpu(formula->usVoltageStep); 3584 return 0; 3585 } 3586 break; 3587 case 2: 3588 voltage_object = (union voltage_object *) 3589 atom_lookup_voltage_object_v2(&voltage_info->v2, voltage_type); 3590 if (voltage_object) { 3591 ATOM_VOLTAGE_FORMULA_V2 *formula = 3592 &voltage_object->v2.asFormula; 3593 if (formula->ucNumOfVoltageEntries) { 3594 VOLTAGE_LUT_ENTRY *lut = (VOLTAGE_LUT_ENTRY *) 3595 ((u8 *)&formula->asVIDAdjustEntries[0] + 3596 (sizeof(VOLTAGE_LUT_ENTRY) * (formula->ucNumOfVoltageEntries - 1))); 3597 *max_voltage = 3598 le16_to_cpu(lut->usVoltageValue); 3599 return 0; 3600 } 3601 } 3602 break; 3603 default: 3604 DRM_ERROR("unknown voltage object table\n"); 3605 return -EINVAL; 3606 } 3607 3608 } 3609 return -EINVAL; 3610 } 3611 3612 int radeon_atom_get_min_voltage(struct radeon_device *rdev, 3613 u8 voltage_type, u16 *min_voltage) 3614 { 3615 int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo); 3616 u8 frev, crev; 3617 u16 data_offset, size; 3618 union voltage_object_info *voltage_info; 3619 union voltage_object *voltage_object = NULL; 3620 3621 if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 3622 &frev, &crev, &data_offset)) { 3623 voltage_info = (union voltage_object_info *) 3624 (rdev->mode_info.atom_context->bios + data_offset); 3625 3626 switch (crev) { 3627 case 1: 3628 voltage_object = (union voltage_object *) 3629 atom_lookup_voltage_object_v1(&voltage_info->v1, voltage_type); 3630 if (voltage_object) { 3631 ATOM_VOLTAGE_FORMULA *formula = 3632 &voltage_object->v1.asFormula; 3633 *min_voltage = 3634 le16_to_cpu(formula->usVoltageBaseLevel); 3635 return 0; 3636 } 3637 break; 3638 case 2: 3639 voltage_object = (union voltage_object *) 3640 atom_lookup_voltage_object_v2(&voltage_info->v2, voltage_type); 3641 if (voltage_object) { 3642 ATOM_VOLTAGE_FORMULA_V2 *formula = 3643 &voltage_object->v2.asFormula; 3644 if (formula->ucNumOfVoltageEntries) { 3645 *min_voltage = 3646 le16_to_cpu(formula->asVIDAdjustEntries[ 3647 0 3648 ].usVoltageValue); 3649 return 0; 3650 } 3651 } 3652 break; 3653 default: 3654 DRM_ERROR("unknown voltage object table\n"); 3655 return -EINVAL; 3656 } 3657 3658 } 3659 return -EINVAL; 3660 } 3661 3662 int radeon_atom_get_voltage_step(struct radeon_device *rdev, 3663 u8 voltage_type, u16 *voltage_step) 3664 { 3665 int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo); 3666 u8 frev, crev; 3667 u16 data_offset, size; 3668 union voltage_object_info *voltage_info; 3669 union voltage_object *voltage_object = NULL; 3670 3671 if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 3672 &frev, &crev, &data_offset)) { 3673 voltage_info = (union voltage_object_info *) 3674 (rdev->mode_info.atom_context->bios + data_offset); 3675 3676 switch (crev) { 3677 case 1: 3678 voltage_object = (union voltage_object *) 3679 atom_lookup_voltage_object_v1(&voltage_info->v1, voltage_type); 3680 if (voltage_object) { 3681 ATOM_VOLTAGE_FORMULA *formula = 3682 &voltage_object->v1.asFormula; 3683 if (formula->ucFlag & 1) 3684 *voltage_step = 3685 (le16_to_cpu(formula->usVoltageStep) + 1) / 2; 3686 else 3687 *voltage_step = 3688 le16_to_cpu(formula->usVoltageStep); 3689 return 0; 3690 } 3691 break; 3692 case 2: 3693 return -EINVAL; 3694 default: 3695 DRM_ERROR("unknown voltage object table\n"); 3696 return -EINVAL; 3697 } 3698 3699 } 3700 return -EINVAL; 3701 } 3702 3703 int radeon_atom_round_to_true_voltage(struct radeon_device *rdev, 3704 u8 voltage_type, 3705 u16 nominal_voltage, 3706 u16 *true_voltage) 3707 { 3708 u16 min_voltage, max_voltage, voltage_step; 3709 3710 if (radeon_atom_get_max_voltage(rdev, voltage_type, &max_voltage)) 3711 return -EINVAL; 3712 if (radeon_atom_get_min_voltage(rdev, voltage_type, &min_voltage)) 3713 return -EINVAL; 3714 if (radeon_atom_get_voltage_step(rdev, voltage_type, &voltage_step)) 3715 return -EINVAL; 3716 3717 if (nominal_voltage <= min_voltage) 3718 *true_voltage = min_voltage; 3719 else if (nominal_voltage >= max_voltage) 3720 *true_voltage = max_voltage; 3721 else 3722 *true_voltage = min_voltage + 3723 ((nominal_voltage - min_voltage) / voltage_step) * 3724 voltage_step; 3725 3726 return 0; 3727 } 3728 3729 int radeon_atom_get_voltage_table(struct radeon_device *rdev, 3730 u8 voltage_type, u8 voltage_mode, 3731 struct atom_voltage_table *voltage_table) 3732 { 3733 int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo); 3734 u8 frev, crev; 3735 u16 data_offset, size; 3736 int i, ret; 3737 union voltage_object_info *voltage_info; 3738 union voltage_object *voltage_object = NULL; 3739 3740 if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 3741 &frev, &crev, &data_offset)) { 3742 voltage_info = (union voltage_object_info *) 3743 (rdev->mode_info.atom_context->bios + data_offset); 3744 3745 switch (frev) { 3746 case 1: 3747 case 2: 3748 switch (crev) { 3749 case 1: 3750 DRM_ERROR("old table version %d, %d\n", frev, crev); 3751 return -EINVAL; 3752 case 2: 3753 voltage_object = (union voltage_object *) 3754 atom_lookup_voltage_object_v2(&voltage_info->v2, voltage_type); 3755 if (voltage_object) { 3756 ATOM_VOLTAGE_FORMULA_V2 *formula = 3757 &voltage_object->v2.asFormula; 3758 VOLTAGE_LUT_ENTRY *lut; 3759 if (formula->ucNumOfVoltageEntries > MAX_VOLTAGE_ENTRIES) 3760 return -EINVAL; 3761 lut = &formula->asVIDAdjustEntries[0]; 3762 for (i = 0; i < formula->ucNumOfVoltageEntries; i++) { 3763 voltage_table->entries[i].value = 3764 le16_to_cpu(lut->usVoltageValue); 3765 ret = radeon_atom_get_voltage_gpio_settings(rdev, 3766 voltage_table->entries[i].value, 3767 voltage_type, 3768 &voltage_table->entries[i].smio_low, 3769 &voltage_table->mask_low); 3770 if (ret) 3771 return ret; 3772 lut = (VOLTAGE_LUT_ENTRY *) 3773 ((u8 *)lut + sizeof(VOLTAGE_LUT_ENTRY)); 3774 } 3775 voltage_table->count = formula->ucNumOfVoltageEntries; 3776 return 0; 3777 } 3778 break; 3779 default: 3780 DRM_ERROR("unknown voltage object table\n"); 3781 return -EINVAL; 3782 } 3783 break; 3784 case 3: 3785 switch (crev) { 3786 case 1: 3787 voltage_object = (union voltage_object *) 3788 atom_lookup_voltage_object_v3(&voltage_info->v3, 3789 voltage_type, voltage_mode); 3790 if (voltage_object) { 3791 ATOM_GPIO_VOLTAGE_OBJECT_V3 *gpio = 3792 &voltage_object->v3.asGpioVoltageObj; 3793 VOLTAGE_LUT_ENTRY_V2 *lut; 3794 if (gpio->ucGpioEntryNum > MAX_VOLTAGE_ENTRIES) 3795 return -EINVAL; 3796 lut = &gpio->asVolGpioLut[0]; 3797 for (i = 0; i < gpio->ucGpioEntryNum; i++) { 3798 voltage_table->entries[i].value = 3799 le16_to_cpu(lut->usVoltageValue); 3800 voltage_table->entries[i].smio_low = 3801 le32_to_cpu(lut->ulVoltageId); 3802 lut = (VOLTAGE_LUT_ENTRY_V2 *) 3803 ((u8 *)lut + sizeof(VOLTAGE_LUT_ENTRY_V2)); 3804 } 3805 voltage_table->mask_low = le32_to_cpu(gpio->ulGpioMaskVal); 3806 voltage_table->count = gpio->ucGpioEntryNum; 3807 voltage_table->phase_delay = gpio->ucPhaseDelay; 3808 return 0; 3809 } 3810 break; 3811 default: 3812 DRM_ERROR("unknown voltage object table\n"); 3813 return -EINVAL; 3814 } 3815 break; 3816 default: 3817 DRM_ERROR("unknown voltage object table\n"); 3818 return -EINVAL; 3819 } 3820 } 3821 return -EINVAL; 3822 } 3823 3824 union vram_info { 3825 struct _ATOM_VRAM_INFO_V3 v1_3; 3826 struct _ATOM_VRAM_INFO_V4 v1_4; 3827 struct _ATOM_VRAM_INFO_HEADER_V2_1 v2_1; 3828 }; 3829 3830 int radeon_atom_get_memory_info(struct radeon_device *rdev, 3831 u8 module_index, struct atom_memory_info *mem_info) 3832 { 3833 int index = GetIndexIntoMasterTable(DATA, VRAM_Info); 3834 u8 frev, crev, i; 3835 u16 data_offset, size; 3836 union vram_info *vram_info; 3837 3838 memset(mem_info, 0, sizeof(struct atom_memory_info)); 3839 3840 if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 3841 &frev, &crev, &data_offset)) { 3842 vram_info = (union vram_info *) 3843 (rdev->mode_info.atom_context->bios + data_offset); 3844 switch (frev) { 3845 case 1: 3846 switch (crev) { 3847 case 3: 3848 /* r6xx */ 3849 if (module_index < vram_info->v1_3.ucNumOfVRAMModule) { 3850 ATOM_VRAM_MODULE_V3 *vram_module = 3851 (ATOM_VRAM_MODULE_V3 *)vram_info->v1_3.aVramInfo; 3852 3853 for (i = 0; i < module_index; i++) { 3854 if (le16_to_cpu(vram_module->usSize) == 0) 3855 return -EINVAL; 3856 vram_module = (ATOM_VRAM_MODULE_V3 *) 3857 ((u8 *)vram_module + le16_to_cpu(vram_module->usSize)); 3858 } 3859 mem_info->mem_vendor = vram_module->asMemory.ucMemoryVenderID & 0xf; 3860 mem_info->mem_type = vram_module->asMemory.ucMemoryType & 0xf0; 3861 } else 3862 return -EINVAL; 3863 break; 3864 case 4: 3865 /* r7xx, evergreen */ 3866 if (module_index < vram_info->v1_4.ucNumOfVRAMModule) { 3867 ATOM_VRAM_MODULE_V4 *vram_module = 3868 (ATOM_VRAM_MODULE_V4 *)vram_info->v1_4.aVramInfo; 3869 3870 for (i = 0; i < module_index; i++) { 3871 if (le16_to_cpu(vram_module->usModuleSize) == 0) 3872 return -EINVAL; 3873 vram_module = (ATOM_VRAM_MODULE_V4 *) 3874 ((u8 *)vram_module + le16_to_cpu(vram_module->usModuleSize)); 3875 } 3876 mem_info->mem_vendor = vram_module->ucMemoryVenderID & 0xf; 3877 mem_info->mem_type = vram_module->ucMemoryType & 0xf0; 3878 } else 3879 return -EINVAL; 3880 break; 3881 default: 3882 DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 3883 return -EINVAL; 3884 } 3885 break; 3886 case 2: 3887 switch (crev) { 3888 case 1: 3889 /* ni */ 3890 if (module_index < vram_info->v2_1.ucNumOfVRAMModule) { 3891 ATOM_VRAM_MODULE_V7 *vram_module = 3892 (ATOM_VRAM_MODULE_V7 *)vram_info->v2_1.aVramInfo; 3893 3894 for (i = 0; i < module_index; i++) { 3895 if (le16_to_cpu(vram_module->usModuleSize) == 0) 3896 return -EINVAL; 3897 vram_module = (ATOM_VRAM_MODULE_V7 *) 3898 ((u8 *)vram_module + le16_to_cpu(vram_module->usModuleSize)); 3899 } 3900 mem_info->mem_vendor = vram_module->ucMemoryVenderID & 0xf; 3901 mem_info->mem_type = vram_module->ucMemoryType & 0xf0; 3902 } else 3903 return -EINVAL; 3904 break; 3905 default: 3906 DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 3907 return -EINVAL; 3908 } 3909 break; 3910 default: 3911 DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 3912 return -EINVAL; 3913 } 3914 return 0; 3915 } 3916 return -EINVAL; 3917 } 3918 3919 int radeon_atom_get_mclk_range_table(struct radeon_device *rdev, 3920 bool gddr5, u8 module_index, 3921 struct atom_memory_clock_range_table *mclk_range_table) 3922 { 3923 int index = GetIndexIntoMasterTable(DATA, VRAM_Info); 3924 u8 frev, crev, i; 3925 u16 data_offset, size; 3926 union vram_info *vram_info; 3927 u32 mem_timing_size = gddr5 ? 3928 sizeof(ATOM_MEMORY_TIMING_FORMAT_V2) : sizeof(ATOM_MEMORY_TIMING_FORMAT); 3929 3930 memset(mclk_range_table, 0, sizeof(struct atom_memory_clock_range_table)); 3931 3932 if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 3933 &frev, &crev, &data_offset)) { 3934 vram_info = (union vram_info *) 3935 (rdev->mode_info.atom_context->bios + data_offset); 3936 switch (frev) { 3937 case 1: 3938 switch (crev) { 3939 case 3: 3940 DRM_ERROR("old table version %d, %d\n", frev, crev); 3941 return -EINVAL; 3942 case 4: 3943 /* r7xx, evergreen */ 3944 if (module_index < vram_info->v1_4.ucNumOfVRAMModule) { 3945 ATOM_VRAM_MODULE_V4 *vram_module = 3946 (ATOM_VRAM_MODULE_V4 *)vram_info->v1_4.aVramInfo; 3947 ATOM_MEMORY_TIMING_FORMAT *format; 3948 3949 for (i = 0; i < module_index; i++) { 3950 if (le16_to_cpu(vram_module->usModuleSize) == 0) 3951 return -EINVAL; 3952 vram_module = (ATOM_VRAM_MODULE_V4 *) 3953 ((u8 *)vram_module + le16_to_cpu(vram_module->usModuleSize)); 3954 } 3955 mclk_range_table->num_entries = (u8) 3956 ((le16_to_cpu(vram_module->usModuleSize) - offsetof(ATOM_VRAM_MODULE_V4, asMemTiming)) / 3957 mem_timing_size); 3958 format = &vram_module->asMemTiming[0]; 3959 for (i = 0; i < mclk_range_table->num_entries; i++) { 3960 mclk_range_table->mclk[i] = le32_to_cpu(format->ulClkRange); 3961 format = (ATOM_MEMORY_TIMING_FORMAT *) 3962 ((u8 *)format + mem_timing_size); 3963 } 3964 } else 3965 return -EINVAL; 3966 break; 3967 default: 3968 DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 3969 return -EINVAL; 3970 } 3971 break; 3972 case 2: 3973 DRM_ERROR("new table version %d, %d\n", frev, crev); 3974 return -EINVAL; 3975 default: 3976 DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 3977 return -EINVAL; 3978 } 3979 return 0; 3980 } 3981 return -EINVAL; 3982 } 3983 3984 #define MEM_ID_MASK 0xff000000 3985 #define MEM_ID_SHIFT 24 3986 #define CLOCK_RANGE_MASK 0x00ffffff 3987 #define CLOCK_RANGE_SHIFT 0 3988 #define LOW_NIBBLE_MASK 0xf 3989 #define DATA_EQU_PREV 0 3990 #define DATA_FROM_TABLE 4 3991 3992 int radeon_atom_init_mc_reg_table(struct radeon_device *rdev, 3993 u8 module_index, 3994 struct atom_mc_reg_table *reg_table) 3995 { 3996 int index = GetIndexIntoMasterTable(DATA, VRAM_Info); 3997 u8 frev, crev, num_entries, t_mem_id, num_ranges = 0; 3998 u32 i = 0, j; 3999 u16 data_offset, size; 4000 union vram_info *vram_info; 4001 4002 memset(reg_table, 0, sizeof(struct atom_mc_reg_table)); 4003 4004 if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size, 4005 &frev, &crev, &data_offset)) { 4006 vram_info = (union vram_info *) 4007 (rdev->mode_info.atom_context->bios + data_offset); 4008 switch (frev) { 4009 case 1: 4010 DRM_ERROR("old table version %d, %d\n", frev, crev); 4011 return -EINVAL; 4012 case 2: 4013 switch (crev) { 4014 case 1: 4015 if (module_index < vram_info->v2_1.ucNumOfVRAMModule) { 4016 ATOM_INIT_REG_BLOCK *reg_block = 4017 (ATOM_INIT_REG_BLOCK *) 4018 ((u8 *)vram_info + le16_to_cpu(vram_info->v2_1.usMemClkPatchTblOffset)); 4019 ATOM_MEMORY_SETTING_DATA_BLOCK *reg_data = 4020 (ATOM_MEMORY_SETTING_DATA_BLOCK *) 4021 ((u8 *)reg_block + (2 * sizeof(u16)) + 4022 le16_to_cpu(reg_block->usRegIndexTblSize)); 4023 ATOM_INIT_REG_INDEX_FORMAT *format = ®_block->asRegIndexBuf[0]; 4024 num_entries = (u8)((le16_to_cpu(reg_block->usRegIndexTblSize)) / 4025 sizeof(ATOM_INIT_REG_INDEX_FORMAT)) - 1; 4026 if (num_entries > VBIOS_MC_REGISTER_ARRAY_SIZE) 4027 return -EINVAL; 4028 while (i < num_entries) { 4029 if (format->ucPreRegDataLength & ACCESS_PLACEHOLDER) 4030 break; 4031 reg_table->mc_reg_address[i].s1 = 4032 (u16)(le16_to_cpu(format->usRegIndex)); 4033 reg_table->mc_reg_address[i].pre_reg_data = 4034 (u8)(format->ucPreRegDataLength); 4035 i++; 4036 format = (ATOM_INIT_REG_INDEX_FORMAT *) 4037 ((u8 *)format + sizeof(ATOM_INIT_REG_INDEX_FORMAT)); 4038 } 4039 reg_table->last = i; 4040 while ((le32_to_cpu(*(u32 *)reg_data) != END_OF_REG_DATA_BLOCK) && 4041 (num_ranges < VBIOS_MAX_AC_TIMING_ENTRIES)) { 4042 t_mem_id = (u8)((le32_to_cpu(*(u32 *)reg_data) & MEM_ID_MASK) 4043 >> MEM_ID_SHIFT); 4044 if (module_index == t_mem_id) { 4045 reg_table->mc_reg_table_entry[num_ranges].mclk_max = 4046 (u32)((le32_to_cpu(*(u32 *)reg_data) & CLOCK_RANGE_MASK) 4047 >> CLOCK_RANGE_SHIFT); 4048 for (i = 0, j = 1; i < reg_table->last; i++) { 4049 if ((reg_table->mc_reg_address[i].pre_reg_data & LOW_NIBBLE_MASK) == DATA_FROM_TABLE) { 4050 reg_table->mc_reg_table_entry[num_ranges].mc_data[i] = 4051 (u32)le32_to_cpu(*((u32 *)reg_data + j)); 4052 j++; 4053 } else if ((reg_table->mc_reg_address[i].pre_reg_data & LOW_NIBBLE_MASK) == DATA_EQU_PREV) { 4054 reg_table->mc_reg_table_entry[num_ranges].mc_data[i] = 4055 reg_table->mc_reg_table_entry[num_ranges].mc_data[i - 1]; 4056 } 4057 } 4058 num_ranges++; 4059 } 4060 reg_data = (ATOM_MEMORY_SETTING_DATA_BLOCK *) 4061 ((u8 *)reg_data + le16_to_cpu(reg_block->usRegDataBlkSize)); 4062 } 4063 if (le32_to_cpu(*(u32 *)reg_data) != END_OF_REG_DATA_BLOCK) 4064 return -EINVAL; 4065 reg_table->num_entries = num_ranges; 4066 } else 4067 return -EINVAL; 4068 break; 4069 default: 4070 DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 4071 return -EINVAL; 4072 } 4073 break; 4074 default: 4075 DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 4076 return -EINVAL; 4077 } 4078 return 0; 4079 } 4080 return -EINVAL; 4081 } 4082 4083 void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev) 4084 { 4085 struct radeon_device *rdev = dev->dev_private; 4086 uint32_t bios_2_scratch, bios_6_scratch; 4087 4088 if (rdev->family >= CHIP_R600) { 4089 bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH); 4090 bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH); 4091 } else { 4092 bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH); 4093 bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH); 4094 } 4095 4096 /* let the bios control the backlight */ 4097 bios_2_scratch &= ~ATOM_S2_VRI_BRIGHT_ENABLE; 4098 4099 /* tell the bios not to handle mode switching */ 4100 bios_6_scratch |= ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH; 4101 4102 /* clear the vbios dpms state */ 4103 if (ASIC_IS_DCE4(rdev)) 4104 bios_2_scratch &= ~ATOM_S2_DEVICE_DPMS_STATE; 4105 4106 if (rdev->family >= CHIP_R600) { 4107 WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch); 4108 WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch); 4109 } else { 4110 WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch); 4111 WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch); 4112 } 4113 4114 } 4115 4116 void radeon_save_bios_scratch_regs(struct radeon_device *rdev) 4117 { 4118 uint32_t scratch_reg; 4119 int i; 4120 4121 if (rdev->family >= CHIP_R600) 4122 scratch_reg = R600_BIOS_0_SCRATCH; 4123 else 4124 scratch_reg = RADEON_BIOS_0_SCRATCH; 4125 4126 for (i = 0; i < RADEON_BIOS_NUM_SCRATCH; i++) 4127 rdev->bios_scratch[i] = RREG32(scratch_reg + (i * 4)); 4128 } 4129 4130 void radeon_restore_bios_scratch_regs(struct radeon_device *rdev) 4131 { 4132 uint32_t scratch_reg; 4133 int i; 4134 4135 if (rdev->family >= CHIP_R600) 4136 scratch_reg = R600_BIOS_0_SCRATCH; 4137 else 4138 scratch_reg = RADEON_BIOS_0_SCRATCH; 4139 4140 for (i = 0; i < RADEON_BIOS_NUM_SCRATCH; i++) 4141 WREG32(scratch_reg + (i * 4), rdev->bios_scratch[i]); 4142 } 4143 4144 void radeon_atom_output_lock(struct drm_encoder *encoder, bool lock) 4145 { 4146 struct drm_device *dev = encoder->dev; 4147 struct radeon_device *rdev = dev->dev_private; 4148 uint32_t bios_6_scratch; 4149 4150 if (rdev->family >= CHIP_R600) 4151 bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH); 4152 else 4153 bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH); 4154 4155 if (lock) { 4156 bios_6_scratch |= ATOM_S6_CRITICAL_STATE; 4157 bios_6_scratch &= ~ATOM_S6_ACC_MODE; 4158 } else { 4159 bios_6_scratch &= ~ATOM_S6_CRITICAL_STATE; 4160 bios_6_scratch |= ATOM_S6_ACC_MODE; 4161 } 4162 4163 if (rdev->family >= CHIP_R600) 4164 WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch); 4165 else 4166 WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch); 4167 } 4168 4169 /* at some point we may want to break this out into individual functions */ 4170 void 4171 radeon_atombios_connected_scratch_regs(struct drm_connector *connector, 4172 struct drm_encoder *encoder, 4173 bool connected) 4174 { 4175 struct drm_device *dev = connector->dev; 4176 struct radeon_device *rdev = dev->dev_private; 4177 struct radeon_connector *radeon_connector = 4178 to_radeon_connector(connector); 4179 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 4180 uint32_t bios_0_scratch, bios_3_scratch, bios_6_scratch; 4181 4182 if (rdev->family >= CHIP_R600) { 4183 bios_0_scratch = RREG32(R600_BIOS_0_SCRATCH); 4184 bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH); 4185 bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH); 4186 } else { 4187 bios_0_scratch = RREG32(RADEON_BIOS_0_SCRATCH); 4188 bios_3_scratch = RREG32(RADEON_BIOS_3_SCRATCH); 4189 bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH); 4190 } 4191 4192 if ((radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) && 4193 (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT)) { 4194 if (connected) { 4195 DRM_DEBUG_KMS("TV1 connected\n"); 4196 bios_3_scratch |= ATOM_S3_TV1_ACTIVE; 4197 bios_6_scratch |= ATOM_S6_ACC_REQ_TV1; 4198 } else { 4199 DRM_DEBUG_KMS("TV1 disconnected\n"); 4200 bios_0_scratch &= ~ATOM_S0_TV1_MASK; 4201 bios_3_scratch &= ~ATOM_S3_TV1_ACTIVE; 4202 bios_6_scratch &= ~ATOM_S6_ACC_REQ_TV1; 4203 } 4204 } 4205 if ((radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) && 4206 (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT)) { 4207 if (connected) { 4208 DRM_DEBUG_KMS("CV connected\n"); 4209 bios_3_scratch |= ATOM_S3_CV_ACTIVE; 4210 bios_6_scratch |= ATOM_S6_ACC_REQ_CV; 4211 } else { 4212 DRM_DEBUG_KMS("CV disconnected\n"); 4213 bios_0_scratch &= ~ATOM_S0_CV_MASK; 4214 bios_3_scratch &= ~ATOM_S3_CV_ACTIVE; 4215 bios_6_scratch &= ~ATOM_S6_ACC_REQ_CV; 4216 } 4217 } 4218 if ((radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) && 4219 (radeon_connector->devices & ATOM_DEVICE_LCD1_SUPPORT)) { 4220 if (connected) { 4221 DRM_DEBUG_KMS("LCD1 connected\n"); 4222 bios_0_scratch |= ATOM_S0_LCD1; 4223 bios_3_scratch |= ATOM_S3_LCD1_ACTIVE; 4224 bios_6_scratch |= ATOM_S6_ACC_REQ_LCD1; 4225 } else { 4226 DRM_DEBUG_KMS("LCD1 disconnected\n"); 4227 bios_0_scratch &= ~ATOM_S0_LCD1; 4228 bios_3_scratch &= ~ATOM_S3_LCD1_ACTIVE; 4229 bios_6_scratch &= ~ATOM_S6_ACC_REQ_LCD1; 4230 } 4231 } 4232 if ((radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) && 4233 (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT)) { 4234 if (connected) { 4235 DRM_DEBUG_KMS("CRT1 connected\n"); 4236 bios_0_scratch |= ATOM_S0_CRT1_COLOR; 4237 bios_3_scratch |= ATOM_S3_CRT1_ACTIVE; 4238 bios_6_scratch |= ATOM_S6_ACC_REQ_CRT1; 4239 } else { 4240 DRM_DEBUG_KMS("CRT1 disconnected\n"); 4241 bios_0_scratch &= ~ATOM_S0_CRT1_MASK; 4242 bios_3_scratch &= ~ATOM_S3_CRT1_ACTIVE; 4243 bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT1; 4244 } 4245 } 4246 if ((radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) && 4247 (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT)) { 4248 if (connected) { 4249 DRM_DEBUG_KMS("CRT2 connected\n"); 4250 bios_0_scratch |= ATOM_S0_CRT2_COLOR; 4251 bios_3_scratch |= ATOM_S3_CRT2_ACTIVE; 4252 bios_6_scratch |= ATOM_S6_ACC_REQ_CRT2; 4253 } else { 4254 DRM_DEBUG_KMS("CRT2 disconnected\n"); 4255 bios_0_scratch &= ~ATOM_S0_CRT2_MASK; 4256 bios_3_scratch &= ~ATOM_S3_CRT2_ACTIVE; 4257 bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT2; 4258 } 4259 } 4260 if ((radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) && 4261 (radeon_connector->devices & ATOM_DEVICE_DFP1_SUPPORT)) { 4262 if (connected) { 4263 DRM_DEBUG_KMS("DFP1 connected\n"); 4264 bios_0_scratch |= ATOM_S0_DFP1; 4265 bios_3_scratch |= ATOM_S3_DFP1_ACTIVE; 4266 bios_6_scratch |= ATOM_S6_ACC_REQ_DFP1; 4267 } else { 4268 DRM_DEBUG_KMS("DFP1 disconnected\n"); 4269 bios_0_scratch &= ~ATOM_S0_DFP1; 4270 bios_3_scratch &= ~ATOM_S3_DFP1_ACTIVE; 4271 bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP1; 4272 } 4273 } 4274 if ((radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) && 4275 (radeon_connector->devices & ATOM_DEVICE_DFP2_SUPPORT)) { 4276 if (connected) { 4277 DRM_DEBUG_KMS("DFP2 connected\n"); 4278 bios_0_scratch |= ATOM_S0_DFP2; 4279 bios_3_scratch |= ATOM_S3_DFP2_ACTIVE; 4280 bios_6_scratch |= ATOM_S6_ACC_REQ_DFP2; 4281 } else { 4282 DRM_DEBUG_KMS("DFP2 disconnected\n"); 4283 bios_0_scratch &= ~ATOM_S0_DFP2; 4284 bios_3_scratch &= ~ATOM_S3_DFP2_ACTIVE; 4285 bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP2; 4286 } 4287 } 4288 if ((radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) && 4289 (radeon_connector->devices & ATOM_DEVICE_DFP3_SUPPORT)) { 4290 if (connected) { 4291 DRM_DEBUG_KMS("DFP3 connected\n"); 4292 bios_0_scratch |= ATOM_S0_DFP3; 4293 bios_3_scratch |= ATOM_S3_DFP3_ACTIVE; 4294 bios_6_scratch |= ATOM_S6_ACC_REQ_DFP3; 4295 } else { 4296 DRM_DEBUG_KMS("DFP3 disconnected\n"); 4297 bios_0_scratch &= ~ATOM_S0_DFP3; 4298 bios_3_scratch &= ~ATOM_S3_DFP3_ACTIVE; 4299 bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP3; 4300 } 4301 } 4302 if ((radeon_encoder->devices & ATOM_DEVICE_DFP4_SUPPORT) && 4303 (radeon_connector->devices & ATOM_DEVICE_DFP4_SUPPORT)) { 4304 if (connected) { 4305 DRM_DEBUG_KMS("DFP4 connected\n"); 4306 bios_0_scratch |= ATOM_S0_DFP4; 4307 bios_3_scratch |= ATOM_S3_DFP4_ACTIVE; 4308 bios_6_scratch |= ATOM_S6_ACC_REQ_DFP4; 4309 } else { 4310 DRM_DEBUG_KMS("DFP4 disconnected\n"); 4311 bios_0_scratch &= ~ATOM_S0_DFP4; 4312 bios_3_scratch &= ~ATOM_S3_DFP4_ACTIVE; 4313 bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP4; 4314 } 4315 } 4316 if ((radeon_encoder->devices & ATOM_DEVICE_DFP5_SUPPORT) && 4317 (radeon_connector->devices & ATOM_DEVICE_DFP5_SUPPORT)) { 4318 if (connected) { 4319 DRM_DEBUG_KMS("DFP5 connected\n"); 4320 bios_0_scratch |= ATOM_S0_DFP5; 4321 bios_3_scratch |= ATOM_S3_DFP5_ACTIVE; 4322 bios_6_scratch |= ATOM_S6_ACC_REQ_DFP5; 4323 } else { 4324 DRM_DEBUG_KMS("DFP5 disconnected\n"); 4325 bios_0_scratch &= ~ATOM_S0_DFP5; 4326 bios_3_scratch &= ~ATOM_S3_DFP5_ACTIVE; 4327 bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP5; 4328 } 4329 } 4330 if ((radeon_encoder->devices & ATOM_DEVICE_DFP6_SUPPORT) && 4331 (radeon_connector->devices & ATOM_DEVICE_DFP6_SUPPORT)) { 4332 if (connected) { 4333 DRM_DEBUG_KMS("DFP6 connected\n"); 4334 bios_0_scratch |= ATOM_S0_DFP6; 4335 bios_3_scratch |= ATOM_S3_DFP6_ACTIVE; 4336 bios_6_scratch |= ATOM_S6_ACC_REQ_DFP6; 4337 } else { 4338 DRM_DEBUG_KMS("DFP6 disconnected\n"); 4339 bios_0_scratch &= ~ATOM_S0_DFP6; 4340 bios_3_scratch &= ~ATOM_S3_DFP6_ACTIVE; 4341 bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP6; 4342 } 4343 } 4344 4345 if (rdev->family >= CHIP_R600) { 4346 WREG32(R600_BIOS_0_SCRATCH, bios_0_scratch); 4347 WREG32(R600_BIOS_3_SCRATCH, bios_3_scratch); 4348 WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch); 4349 } else { 4350 WREG32(RADEON_BIOS_0_SCRATCH, bios_0_scratch); 4351 WREG32(RADEON_BIOS_3_SCRATCH, bios_3_scratch); 4352 WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch); 4353 } 4354 } 4355 4356 void 4357 radeon_atombios_encoder_crtc_scratch_regs(struct drm_encoder *encoder, int crtc) 4358 { 4359 struct drm_device *dev = encoder->dev; 4360 struct radeon_device *rdev = dev->dev_private; 4361 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 4362 uint32_t bios_3_scratch; 4363 4364 if (ASIC_IS_DCE4(rdev)) 4365 return; 4366 4367 if (rdev->family >= CHIP_R600) 4368 bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH); 4369 else 4370 bios_3_scratch = RREG32(RADEON_BIOS_3_SCRATCH); 4371 4372 if (radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) { 4373 bios_3_scratch &= ~ATOM_S3_TV1_CRTC_ACTIVE; 4374 bios_3_scratch |= (crtc << 18); 4375 } 4376 if (radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) { 4377 bios_3_scratch &= ~ATOM_S3_CV_CRTC_ACTIVE; 4378 bios_3_scratch |= (crtc << 24); 4379 } 4380 if (radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) { 4381 bios_3_scratch &= ~ATOM_S3_CRT1_CRTC_ACTIVE; 4382 bios_3_scratch |= (crtc << 16); 4383 } 4384 if (radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) { 4385 bios_3_scratch &= ~ATOM_S3_CRT2_CRTC_ACTIVE; 4386 bios_3_scratch |= (crtc << 20); 4387 } 4388 if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) { 4389 bios_3_scratch &= ~ATOM_S3_LCD1_CRTC_ACTIVE; 4390 bios_3_scratch |= (crtc << 17); 4391 } 4392 if (radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) { 4393 bios_3_scratch &= ~ATOM_S3_DFP1_CRTC_ACTIVE; 4394 bios_3_scratch |= (crtc << 19); 4395 } 4396 if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) { 4397 bios_3_scratch &= ~ATOM_S3_DFP2_CRTC_ACTIVE; 4398 bios_3_scratch |= (crtc << 23); 4399 } 4400 if (radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) { 4401 bios_3_scratch &= ~ATOM_S3_DFP3_CRTC_ACTIVE; 4402 bios_3_scratch |= (crtc << 25); 4403 } 4404 4405 if (rdev->family >= CHIP_R600) 4406 WREG32(R600_BIOS_3_SCRATCH, bios_3_scratch); 4407 else 4408 WREG32(RADEON_BIOS_3_SCRATCH, bios_3_scratch); 4409 } 4410 4411 void 4412 radeon_atombios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on) 4413 { 4414 struct drm_device *dev = encoder->dev; 4415 struct radeon_device *rdev = dev->dev_private; 4416 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 4417 uint32_t bios_2_scratch; 4418 4419 if (ASIC_IS_DCE4(rdev)) 4420 return; 4421 4422 if (rdev->family >= CHIP_R600) 4423 bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH); 4424 else 4425 bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH); 4426 4427 if (radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) { 4428 if (on) 4429 bios_2_scratch &= ~ATOM_S2_TV1_DPMS_STATE; 4430 else 4431 bios_2_scratch |= ATOM_S2_TV1_DPMS_STATE; 4432 } 4433 if (radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) { 4434 if (on) 4435 bios_2_scratch &= ~ATOM_S2_CV_DPMS_STATE; 4436 else 4437 bios_2_scratch |= ATOM_S2_CV_DPMS_STATE; 4438 } 4439 if (radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) { 4440 if (on) 4441 bios_2_scratch &= ~ATOM_S2_CRT1_DPMS_STATE; 4442 else 4443 bios_2_scratch |= ATOM_S2_CRT1_DPMS_STATE; 4444 } 4445 if (radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) { 4446 if (on) 4447 bios_2_scratch &= ~ATOM_S2_CRT2_DPMS_STATE; 4448 else 4449 bios_2_scratch |= ATOM_S2_CRT2_DPMS_STATE; 4450 } 4451 if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) { 4452 if (on) 4453 bios_2_scratch &= ~ATOM_S2_LCD1_DPMS_STATE; 4454 else 4455 bios_2_scratch |= ATOM_S2_LCD1_DPMS_STATE; 4456 } 4457 if (radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) { 4458 if (on) 4459 bios_2_scratch &= ~ATOM_S2_DFP1_DPMS_STATE; 4460 else 4461 bios_2_scratch |= ATOM_S2_DFP1_DPMS_STATE; 4462 } 4463 if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) { 4464 if (on) 4465 bios_2_scratch &= ~ATOM_S2_DFP2_DPMS_STATE; 4466 else 4467 bios_2_scratch |= ATOM_S2_DFP2_DPMS_STATE; 4468 } 4469 if (radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) { 4470 if (on) 4471 bios_2_scratch &= ~ATOM_S2_DFP3_DPMS_STATE; 4472 else 4473 bios_2_scratch |= ATOM_S2_DFP3_DPMS_STATE; 4474 } 4475 if (radeon_encoder->devices & ATOM_DEVICE_DFP4_SUPPORT) { 4476 if (on) 4477 bios_2_scratch &= ~ATOM_S2_DFP4_DPMS_STATE; 4478 else 4479 bios_2_scratch |= ATOM_S2_DFP4_DPMS_STATE; 4480 } 4481 if (radeon_encoder->devices & ATOM_DEVICE_DFP5_SUPPORT) { 4482 if (on) 4483 bios_2_scratch &= ~ATOM_S2_DFP5_DPMS_STATE; 4484 else 4485 bios_2_scratch |= ATOM_S2_DFP5_DPMS_STATE; 4486 } 4487 4488 if (rdev->family >= CHIP_R600) 4489 WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch); 4490 else 4491 WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch); 4492 } 4493