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