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