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