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
  33/* from radeon_encoder.c */
  34extern uint32_t
  35radeon_get_encoder_enum(struct drm_device *dev, uint32_t supported_device,
  36                        uint8_t dac);
  37extern void radeon_link_encoder_connector(struct drm_device *dev);
  38extern void
  39radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_enum,
  40                        uint32_t supported_device, u16 caps);
  41
  42/* from radeon_connector.c */
  43extern void
  44radeon_add_atom_connector(struct drm_device *dev,
  45                          uint32_t connector_id,
  46                          uint32_t supported_device,
  47                          int connector_type,
  48                          struct radeon_i2c_bus_rec *i2c_bus,
  49                          uint32_t igp_lane_info,
  50                          uint16_t connector_object_id,
  51                          struct radeon_hpd *hpd,
  52                          struct radeon_router *router);
  53
  54/* from radeon_legacy_encoder.c */
  55extern void
  56radeon_add_legacy_encoder(struct drm_device *dev, uint32_t encoder_enum,
  57                          uint32_t supported_device);
  58
  59/* local */
  60static int radeon_atom_get_max_vddc(struct radeon_device *rdev, u8 voltage_type,
  61                                    u16 voltage_id, u16 *voltage);
  62
  63union atom_supported_devices {
  64        struct _ATOM_SUPPORTED_DEVICES_INFO info;
  65        struct _ATOM_SUPPORTED_DEVICES_INFO_2 info_2;
  66        struct _ATOM_SUPPORTED_DEVICES_INFO_2d1 info_2d1;
  67};
  68
  69static void radeon_lookup_i2c_gpio_quirks(struct radeon_device *rdev,
  70                                          ATOM_GPIO_I2C_ASSIGMENT *gpio,
  71                                          u8 index)
  72{
  73        /* r4xx mask is technically not used by the hw, so patch in the legacy mask bits */
  74        if ((rdev->family == CHIP_R420) ||
  75            (rdev->family == CHIP_R423) ||
  76            (rdev->family == CHIP_RV410)) {
  77                if ((le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x0018) ||
  78                    (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x0019) ||
  79                    (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x001a)) {
  80                        gpio->ucClkMaskShift = 0x19;
  81                        gpio->ucDataMaskShift = 0x18;
  82                }
  83        }
  84
  85        /* some evergreen boards have bad data for this entry */
  86        if (ASIC_IS_DCE4(rdev)) {
  87                if ((index == 7) &&
  88                    (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1936) &&
  89                    (gpio->sucI2cId.ucAccess == 0)) {
  90                        gpio->sucI2cId.ucAccess = 0x97;
  91                        gpio->ucDataMaskShift = 8;
  92                        gpio->ucDataEnShift = 8;
  93                        gpio->ucDataY_Shift = 8;
  94                        gpio->ucDataA_Shift = 8;
  95                }
  96        }
  97
  98        /* some DCE3 boards have bad data for this entry */
  99        if (ASIC_IS_DCE3(rdev)) {
 100                if ((index == 4) &&
 101                    (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1fda) &&
 102                    (gpio->sucI2cId.ucAccess == 0x94))
 103                        gpio->sucI2cId.ucAccess = 0x14;
 104        }
 105}
 106
 107static struct radeon_i2c_bus_rec radeon_get_bus_rec_for_i2c_gpio(ATOM_GPIO_I2C_ASSIGMENT *gpio)
 108{
 109        struct radeon_i2c_bus_rec i2c;
 110
 111        memset(&i2c, 0, sizeof(struct radeon_i2c_bus_rec));
 112
 113        i2c.mask_clk_reg = le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4;
 114        i2c.mask_data_reg = le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4;
 115        i2c.en_clk_reg = le16_to_cpu(gpio->usClkEnRegisterIndex) * 4;
 116        i2c.en_data_reg = le16_to_cpu(gpio->usDataEnRegisterIndex) * 4;
 117        i2c.y_clk_reg = le16_to_cpu(gpio->usClkY_RegisterIndex) * 4;
 118        i2c.y_data_reg = le16_to_cpu(gpio->usDataY_RegisterIndex) * 4;
 119        i2c.a_clk_reg = le16_to_cpu(gpio->usClkA_RegisterIndex) * 4;
 120        i2c.a_data_reg = le16_to_cpu(gpio->usDataA_RegisterIndex) * 4;
 121        i2c.mask_clk_mask = (1 << gpio->ucClkMaskShift);
 122        i2c.mask_data_mask = (1 << gpio->ucDataMaskShift);
 123        i2c.en_clk_mask = (1 << gpio->ucClkEnShift);
 124        i2c.en_data_mask = (1 << gpio->ucDataEnShift);
 125        i2c.y_clk_mask = (1 << gpio->ucClkY_Shift);
 126        i2c.y_data_mask = (1 << gpio->ucDataY_Shift);
 127        i2c.a_clk_mask = (1 << gpio->ucClkA_Shift);
 128        i2c.a_data_mask = (1 << gpio->ucDataA_Shift);
 129
 130        if (gpio->sucI2cId.sbfAccess.bfHW_Capable)
 131                i2c.hw_capable = true;
 132        else
 133                i2c.hw_capable = false;
 134
 135        if (gpio->sucI2cId.ucAccess == 0xa0)
 136                i2c.mm_i2c = true;
 137        else
 138                i2c.mm_i2c = false;
 139
 140        i2c.i2c_id = gpio->sucI2cId.ucAccess;
 141
 142        if (i2c.mask_clk_reg)
 143                i2c.valid = true;
 144        else
 145                i2c.valid = false;
 146
 147        return i2c;
 148}
 149
 150static struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_device *rdev,
 151                                                               uint8_t id)
 152{
 153        struct atom_context *ctx = rdev->mode_info.atom_context;
 154        ATOM_GPIO_I2C_ASSIGMENT *gpio;
 155        struct radeon_i2c_bus_rec i2c;
 156        int index = GetIndexIntoMasterTable(DATA, GPIO_I2C_Info);
 157        struct _ATOM_GPIO_I2C_INFO *i2c_info;
 158        uint16_t data_offset, size;
 159        int i, num_indices;
 160
 161        memset(&i2c, 0, sizeof(struct radeon_i2c_bus_rec));
 162        i2c.valid = false;
 163
 164        if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) {
 165                i2c_info = (struct _ATOM_GPIO_I2C_INFO *)(ctx->bios + data_offset);
 166
 167                num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
 168                        sizeof(ATOM_GPIO_I2C_ASSIGMENT);
 169
 170                for (i = 0; i < num_indices; i++) {
 171                        gpio = &i2c_info->asGPIO_Info[i];
 172
 173                        radeon_lookup_i2c_gpio_quirks(rdev, gpio, i);
 174
 175                        if (gpio->sucI2cId.ucAccess == id) {
 176                                i2c = radeon_get_bus_rec_for_i2c_gpio(gpio);
 177                                break;
 178                        }
 179                }
 180        }
 181
 182        return i2c;
 183}
 184
 185void radeon_atombios_i2c_init(struct radeon_device *rdev)
 186{
 187        struct atom_context *ctx = rdev->mode_info.atom_context;
 188        ATOM_GPIO_I2C_ASSIGMENT *gpio;
 189        struct radeon_i2c_bus_rec i2c;
 190        int index = GetIndexIntoMasterTable(DATA, GPIO_I2C_Info);
 191        struct _ATOM_GPIO_I2C_INFO *i2c_info;
 192        uint16_t data_offset, size;
 193        int i, num_indices;
 194        char stmp[32];
 195
 196        if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) {
 197                i2c_info = (struct _ATOM_GPIO_I2C_INFO *)(ctx->bios + data_offset);
 198
 199                num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
 200                        sizeof(ATOM_GPIO_I2C_ASSIGMENT);
 201
 202                for (i = 0; i < num_indices; i++) {
 203                        gpio = &i2c_info->asGPIO_Info[i];
 204
 205                        radeon_lookup_i2c_gpio_quirks(rdev, gpio, i);
 206
 207                        i2c = radeon_get_bus_rec_for_i2c_gpio(gpio);
 208
 209                        if (i2c.valid) {
 210                                sprintf(stmp, "0x%x", i2c.i2c_id);
 211                                rdev->i2c_bus[i] = radeon_i2c_create(rdev->ddev, &i2c, stmp);
 212                        }
 213                }
 214        }
 215}
 216
 217static struct radeon_gpio_rec radeon_lookup_gpio(struct radeon_device *rdev,
 218                                                        u8 id)
 219{
 220        struct atom_context *ctx = rdev->mode_info.atom_context;
 221        struct radeon_gpio_rec gpio;
 222        int index = GetIndexIntoMasterTable(DATA, GPIO_Pin_LUT);
 223        struct _ATOM_GPIO_PIN_LUT *gpio_info;
 224        ATOM_GPIO_PIN_ASSIGNMENT *pin;
 225        u16 data_offset, size;
 226        int i, num_indices;
 227
 228        memset(&gpio, 0, sizeof(struct radeon_gpio_rec));
 229        gpio.valid = false;
 230
 231        if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) {
 232                gpio_info = (struct _ATOM_GPIO_PIN_LUT *)(ctx->bios + data_offset);
 233
 234                num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
 235                        sizeof(ATOM_GPIO_PIN_ASSIGNMENT);
 236
 237                for (i = 0; i < num_indices; i++) {
 238                        pin = &gpio_info->asGPIO_Pin[i];
 239                        if (id == pin->ucGPIO_ID) {
 240                                gpio.id = pin->ucGPIO_ID;
 241                                gpio.reg = le16_to_cpu(pin->usGpioPin_AIndex) * 4;
 242                                gpio.mask = (1 << pin->ucGpioPinBitShift);
 243                                gpio.valid = true;
 244                                break;
 245                        }
 246                }
 247        }
 248
 249        return gpio;
 250}
 251
 252static struct radeon_hpd radeon_atom_get_hpd_info_from_gpio(struct radeon_device *rdev,
 253                                                            struct radeon_gpio_rec *gpio)
 254{
 255        struct radeon_hpd hpd;
 256        u32 reg;
 257
 258        memset(&hpd, 0, sizeof(struct radeon_hpd));
 259
 260        if (ASIC_IS_DCE6(rdev))
 261                reg = SI_DC_GPIO_HPD_A;
 262        else if (ASIC_IS_DCE4(rdev))
 263                reg = EVERGREEN_DC_GPIO_HPD_A;
 264        else
 265                reg = AVIVO_DC_GPIO_HPD_A;
 266
 267        hpd.gpio = *gpio;
 268        if (gpio->reg == reg) {
 269                switch(gpio->mask) {
 270                case (1 << 0):
 271                        hpd.hpd = RADEON_HPD_1;
 272                        break;
 273                case (1 << 8):
 274                        hpd.hpd = RADEON_HPD_2;
 275                        break;
 276                case (1 << 16):
 277                        hpd.hpd = RADEON_HPD_3;
 278                        break;
 279                case (1 << 24):
 280                        hpd.hpd = RADEON_HPD_4;
 281                        break;
 282                case (1 << 26):
 283                        hpd.hpd = RADEON_HPD_5;
 284                        break;
 285                case (1 << 28):
 286                        hpd.hpd = RADEON_HPD_6;
 287                        break;
 288                default:
 289                        hpd.hpd = RADEON_HPD_NONE;
 290                        break;
 291                }
 292        } else
 293                hpd.hpd = RADEON_HPD_NONE;
 294        return hpd;
 295}
 296
 297static bool radeon_atom_apply_quirks(struct drm_device *dev,
 298                                     uint32_t supported_device,
 299                                     int *connector_type,
 300                                     struct radeon_i2c_bus_rec *i2c_bus,
 301                                     uint16_t *line_mux,
 302                                     struct radeon_hpd *hpd)
 303{
 304
 305        /* Asus M2A-VM HDMI board lists the DVI port as HDMI */
 306        if ((dev->pdev->device == 0x791e) &&
 307            (dev->pdev->subsystem_vendor == 0x1043) &&
 308            (dev->pdev->subsystem_device == 0x826d)) {
 309                if ((*connector_type == DRM_MODE_CONNECTOR_HDMIA) &&
 310                    (supported_device == ATOM_DEVICE_DFP3_SUPPORT))
 311                        *connector_type = DRM_MODE_CONNECTOR_DVID;
 312        }
 313
 314        /* Asrock RS600 board lists the DVI port as HDMI */
 315        if ((dev->pdev->device == 0x7941) &&
 316            (dev->pdev->subsystem_vendor == 0x1849) &&
 317            (dev->pdev->subsystem_device == 0x7941)) {
 318                if ((*connector_type == DRM_MODE_CONNECTOR_HDMIA) &&
 319                    (supported_device == ATOM_DEVICE_DFP3_SUPPORT))
 320                        *connector_type = DRM_MODE_CONNECTOR_DVID;
 321        }
 322
 323        /* MSI K9A2GM V2/V3 board has no HDMI or DVI */
 324        if ((dev->pdev->device == 0x796e) &&
 325            (dev->pdev->subsystem_vendor == 0x1462) &&
 326            (dev->pdev->subsystem_device == 0x7302)) {
 327                if ((supported_device == ATOM_DEVICE_DFP2_SUPPORT) ||
 328                    (supported_device == ATOM_DEVICE_DFP3_SUPPORT))
 329                        return false;
 330        }
 331
 332        /* a-bit f-i90hd - ciaranm on #radeonhd - this board has no DVI */
 333        if ((dev->pdev->device == 0x7941) &&
 334            (dev->pdev->subsystem_vendor == 0x147b) &&
 335            (dev->pdev->subsystem_device == 0x2412)) {
 336                if (*connector_type == DRM_MODE_CONNECTOR_DVII)
 337                        return false;
 338        }
 339
 340        /* Falcon NW laptop lists vga ddc line for LVDS */
 341        if ((dev->pdev->device == 0x5653) &&
 342            (dev->pdev->subsystem_vendor == 0x1462) &&
 343            (dev->pdev->subsystem_device == 0x0291)) {
 344                if (*connector_type == DRM_MODE_CONNECTOR_LVDS) {
 345                        i2c_bus->valid = false;
 346                        *line_mux = 53;
 347                }
 348        }
 349
 350        /* HIS X1300 is DVI+VGA, not DVI+DVI */
 351        if ((dev->pdev->device == 0x7146) &&
 352            (dev->pdev->subsystem_vendor == 0x17af) &&
 353            (dev->pdev->subsystem_device == 0x2058)) {
 354                if (supported_device == ATOM_DEVICE_DFP1_SUPPORT)
 355                        return false;
 356        }
 357
 358        /* Gigabyte X1300 is DVI+VGA, not DVI+DVI */
 359        if ((dev->pdev->device == 0x7142) &&
 360            (dev->pdev->subsystem_vendor == 0x1458) &&
 361            (dev->pdev->subsystem_device == 0x2134)) {
 362                if (supported_device == ATOM_DEVICE_DFP1_SUPPORT)
 363                        return false;
 364        }
 365
 366
 367        /* Funky macbooks */
 368        if ((dev->pdev->device == 0x71C5) &&
 369            (dev->pdev->subsystem_vendor == 0x106b) &&
 370            (dev->pdev->subsystem_device == 0x0080)) {
 371                if ((supported_device == ATOM_DEVICE_CRT1_SUPPORT) ||
 372                    (supported_device == ATOM_DEVICE_DFP2_SUPPORT))
 373                        return false;
 374                if (supported_device == ATOM_DEVICE_CRT2_SUPPORT)
 375                        *line_mux = 0x90;
 376        }
 377
 378        /* mac rv630, rv730, others */
 379        if ((supported_device == ATOM_DEVICE_TV1_SUPPORT) &&
 380            (*connector_type == DRM_MODE_CONNECTOR_DVII)) {
 381                *connector_type = DRM_MODE_CONNECTOR_9PinDIN;
 382                *line_mux = CONNECTOR_7PIN_DIN_ENUM_ID1;
 383        }
 384
 385        /* ASUS HD 3600 XT board lists the DVI port as HDMI */
 386        if ((dev->pdev->device == 0x9598) &&
 387            (dev->pdev->subsystem_vendor == 0x1043) &&
 388            (dev->pdev->subsystem_device == 0x01da)) {
 389                if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
 390                        *connector_type = DRM_MODE_CONNECTOR_DVII;
 391                }
 392        }
 393
 394        /* ASUS HD 3600 board lists the DVI port as HDMI */
 395        if ((dev->pdev->device == 0x9598) &&
 396            (dev->pdev->subsystem_vendor == 0x1043) &&
 397            (dev->pdev->subsystem_device == 0x01e4)) {
 398                if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
 399                        *connector_type = DRM_MODE_CONNECTOR_DVII;
 400                }
 401        }
 402
 403        /* ASUS HD 3450 board lists the DVI port as HDMI */
 404        if ((dev->pdev->device == 0x95C5) &&
 405            (dev->pdev->subsystem_vendor == 0x1043) &&
 406            (dev->pdev->subsystem_device == 0x01e2)) {
 407                if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
 408                        *connector_type = DRM_MODE_CONNECTOR_DVII;
 409                }
 410        }
 411
 412        /* some BIOSes seem to report DAC on HDMI - usually this is a board with
 413         * HDMI + VGA reporting as HDMI
 414         */
 415        if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
 416                if (supported_device & (ATOM_DEVICE_CRT_SUPPORT)) {
 417                        *connector_type = DRM_MODE_CONNECTOR_VGA;
 418                        *line_mux = 0;
 419                }
 420        }
 421
 422        /* Acer laptop (Acer TravelMate 5730/5730G) has an HDMI port
 423         * on the laptop and a DVI port on the docking station and
 424         * both share the same encoder, hpd pin, and ddc line.
 425         * So while the bios table is technically correct,
 426         * we drop the DVI port here since xrandr has no concept of
 427         * encoders and will try and drive both connectors
 428         * with different crtcs which isn't possible on the hardware
 429         * side and leaves no crtcs for LVDS or VGA.
 430         */
 431        if (((dev->pdev->device == 0x95c4) || (dev->pdev->device == 0x9591)) &&
 432            (dev->pdev->subsystem_vendor == 0x1025) &&
 433            (dev->pdev->subsystem_device == 0x013c)) {
 434                if ((*connector_type == DRM_MODE_CONNECTOR_DVII) &&
 435                    (supported_device == ATOM_DEVICE_DFP1_SUPPORT)) {
 436                        /* actually it's a DVI-D port not DVI-I */
 437                        *connector_type = DRM_MODE_CONNECTOR_DVID;
 438                        return false;
 439                }
 440        }
 441
 442        /* XFX Pine Group device rv730 reports no VGA DDC lines
 443         * even though they are wired up to record 0x93
 444         */
 445        if ((dev->pdev->device == 0x9498) &&
 446            (dev->pdev->subsystem_vendor == 0x1682) &&
 447            (dev->pdev->subsystem_device == 0x2452) &&
 448            (i2c_bus->valid == false) &&
 449            !(supported_device & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT))) {
 450                struct radeon_device *rdev = dev->dev_private;
 451                *i2c_bus = radeon_lookup_i2c_gpio(rdev, 0x93);
 452        }
 453
 454        /* Fujitsu D3003-S2 board lists DVI-I as DVI-D and VGA */
 455        if (((dev->pdev->device == 0x9802) || (dev->pdev->device == 0x9806)) &&
 456            (dev->pdev->subsystem_vendor == 0x1734) &&
 457            (dev->pdev->subsystem_device == 0x11bd)) {
 458                if (*connector_type == DRM_MODE_CONNECTOR_VGA) {
 459                        *connector_type = DRM_MODE_CONNECTOR_DVII;
 460                        *line_mux = 0x3103;
 461                } else if (*connector_type == DRM_MODE_CONNECTOR_DVID) {
 462                        *connector_type = DRM_MODE_CONNECTOR_DVII;
 463                }
 464        }
 465
 466
 467        return true;
 468}
 469
 470const int supported_devices_connector_convert[] = {
 471        DRM_MODE_CONNECTOR_Unknown,
 472        DRM_MODE_CONNECTOR_VGA,
 473        DRM_MODE_CONNECTOR_DVII,
 474        DRM_MODE_CONNECTOR_DVID,
 475        DRM_MODE_CONNECTOR_DVIA,
 476        DRM_MODE_CONNECTOR_SVIDEO,
 477        DRM_MODE_CONNECTOR_Composite,
 478        DRM_MODE_CONNECTOR_LVDS,
 479        DRM_MODE_CONNECTOR_Unknown,
 480        DRM_MODE_CONNECTOR_Unknown,
 481        DRM_MODE_CONNECTOR_HDMIA,
 482        DRM_MODE_CONNECTOR_HDMIB,
 483        DRM_MODE_CONNECTOR_Unknown,
 484        DRM_MODE_CONNECTOR_Unknown,
 485        DRM_MODE_CONNECTOR_9PinDIN,
 486        DRM_MODE_CONNECTOR_DisplayPort
 487};
 488
 489const uint16_t supported_devices_connector_object_id_convert[] = {
 490        CONNECTOR_OBJECT_ID_NONE,
 491        CONNECTOR_OBJECT_ID_VGA,
 492        CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I, /* not all boards support DL */
 493        CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D, /* not all boards support DL */
 494        CONNECTOR_OBJECT_ID_VGA, /* technically DVI-A */
 495        CONNECTOR_OBJECT_ID_COMPOSITE,
 496        CONNECTOR_OBJECT_ID_SVIDEO,
 497        CONNECTOR_OBJECT_ID_LVDS,
 498        CONNECTOR_OBJECT_ID_9PIN_DIN,
 499        CONNECTOR_OBJECT_ID_9PIN_DIN,
 500        CONNECTOR_OBJECT_ID_DISPLAYPORT,
 501        CONNECTOR_OBJECT_ID_HDMI_TYPE_A,
 502        CONNECTOR_OBJECT_ID_HDMI_TYPE_B,
 503        CONNECTOR_OBJECT_ID_SVIDEO
 504};
 505
 506const int object_connector_convert[] = {
 507        DRM_MODE_CONNECTOR_Unknown,
 508        DRM_MODE_CONNECTOR_DVII,
 509        DRM_MODE_CONNECTOR_DVII,
 510        DRM_MODE_CONNECTOR_DVID,
 511        DRM_MODE_CONNECTOR_DVID,
 512        DRM_MODE_CONNECTOR_VGA,
 513        DRM_MODE_CONNECTOR_Composite,
 514        DRM_MODE_CONNECTOR_SVIDEO,
 515        DRM_MODE_CONNECTOR_Unknown,
 516        DRM_MODE_CONNECTOR_Unknown,
 517        DRM_MODE_CONNECTOR_9PinDIN,
 518        DRM_MODE_CONNECTOR_Unknown,
 519        DRM_MODE_CONNECTOR_HDMIA,
 520        DRM_MODE_CONNECTOR_HDMIB,
 521        DRM_MODE_CONNECTOR_LVDS,
 522        DRM_MODE_CONNECTOR_9PinDIN,
 523        DRM_MODE_CONNECTOR_Unknown,
 524        DRM_MODE_CONNECTOR_Unknown,
 525        DRM_MODE_CONNECTOR_Unknown,
 526        DRM_MODE_CONNECTOR_DisplayPort,
 527        DRM_MODE_CONNECTOR_eDP,
 528        DRM_MODE_CONNECTOR_Unknown
 529};
 530
 531bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
 532{
 533        struct radeon_device *rdev = dev->dev_private;
 534        struct radeon_mode_info *mode_info = &rdev->mode_info;
 535        struct atom_context *ctx = mode_info->atom_context;
 536        int index = GetIndexIntoMasterTable(DATA, Object_Header);
 537        u16 size, data_offset;
 538        u8 frev, crev;
 539        ATOM_CONNECTOR_OBJECT_TABLE *con_obj;
 540        ATOM_ENCODER_OBJECT_TABLE *enc_obj;
 541        ATOM_OBJECT_TABLE *router_obj;
 542        ATOM_DISPLAY_OBJECT_PATH_TABLE *path_obj;
 543        ATOM_OBJECT_HEADER *obj_header;
 544        int i, j, k, path_size, device_support;
 545        int connector_type;
 546        u16 igp_lane_info, conn_id, connector_object_id;
 547        struct radeon_i2c_bus_rec ddc_bus;
 548        struct radeon_router router;
 549        struct radeon_gpio_rec gpio;
 550        struct radeon_hpd hpd;
 551
 552        if (!atom_parse_data_header(ctx, index, &size, &frev, &crev, &data_offset))
 553                return false;
 554
 555        if (crev < 2)
 556                return false;
 557
 558        obj_header = (ATOM_OBJECT_HEADER *) (ctx->bios + data_offset);
 559        path_obj = (ATOM_DISPLAY_OBJECT_PATH_TABLE *)
 560            (ctx->bios + data_offset +
 561             le16_to_cpu(obj_header->usDisplayPathTableOffset));
 562        con_obj = (ATOM_CONNECTOR_OBJECT_TABLE *)
 563            (ctx->bios + data_offset +
 564             le16_to_cpu(obj_header->usConnectorObjectTableOffset));
 565        enc_obj = (ATOM_ENCODER_OBJECT_TABLE *)
 566            (ctx->bios + data_offset +
 567             le16_to_cpu(obj_header->usEncoderObjectTableOffset));
 568        router_obj = (ATOM_OBJECT_TABLE *)
 569                (ctx->bios + data_offset +
 570                 le16_to_cpu(obj_header->usRouterObjectTableOffset));
 571        device_support = le16_to_cpu(obj_header->usDeviceSupport);
 572
 573        path_size = 0;
 574        for (i = 0; i < path_obj->ucNumOfDispPath; i++) {
 575                uint8_t *addr = (uint8_t *) path_obj->asDispPath;
 576                ATOM_DISPLAY_OBJECT_PATH *path;
 577                addr += path_size;
 578                path = (ATOM_DISPLAY_OBJECT_PATH *) addr;
 579                path_size += le16_to_cpu(path->usSize);
 580
 581                if (device_support & le16_to_cpu(path->usDeviceTag)) {
 582                        uint8_t con_obj_id, con_obj_num, con_obj_type;
 583
 584                        con_obj_id =
 585                            (le16_to_cpu(path->usConnObjectId) & OBJECT_ID_MASK)
 586                            >> OBJECT_ID_SHIFT;
 587                        con_obj_num =
 588                            (le16_to_cpu(path->usConnObjectId) & ENUM_ID_MASK)
 589                            >> ENUM_ID_SHIFT;
 590                        con_obj_type =
 591                            (le16_to_cpu(path->usConnObjectId) &
 592                             OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT;
 593
 594                        /* TODO CV support */
 595                        if (le16_to_cpu(path->usDeviceTag) ==
 596                                ATOM_DEVICE_CV_SUPPORT)
 597                                continue;
 598
 599                        /* IGP chips */
 600                        if ((rdev->flags & RADEON_IS_IGP) &&
 601                            (con_obj_id ==
 602                             CONNECTOR_OBJECT_ID_PCIE_CONNECTOR)) {
 603                                uint16_t igp_offset = 0;
 604                                ATOM_INTEGRATED_SYSTEM_INFO_V2 *igp_obj;
 605
 606                                index =
 607                                    GetIndexIntoMasterTable(DATA,
 608                                                            IntegratedSystemInfo);
 609
 610                                if (atom_parse_data_header(ctx, index, &size, &frev,
 611                                                           &crev, &igp_offset)) {
 612
 613                                        if (crev >= 2) {
 614                                                igp_obj =
 615                                                        (ATOM_INTEGRATED_SYSTEM_INFO_V2
 616                                                         *) (ctx->bios + igp_offset);
 617
 618                                                if (igp_obj) {
 619                                                        uint32_t slot_config, ct;
 620
 621                                                        if (con_obj_num == 1)
 622                                                                slot_config =
 623                                                                        igp_obj->
 624                                                                        ulDDISlot1Config;
 625                                                        else
 626                                                                slot_config =
 627                                                                        igp_obj->
 628                                                                        ulDDISlot2Config;
 629
 630                                                        ct = (slot_config >> 16) & 0xff;
 631                                                        connector_type =
 632                                                                object_connector_convert
 633                                                                [ct];
 634                                                        connector_object_id = ct;
 635                                                        igp_lane_info =
 636                                                                slot_config & 0xffff;
 637                                                } else
 638                                                        continue;
 639                                        } else
 640                                                continue;
 641                                } else {
 642                                        igp_lane_info = 0;
 643                                        connector_type =
 644                                                object_connector_convert[con_obj_id];
 645                                        connector_object_id = con_obj_id;
 646                                }
 647                        } else {
 648                                igp_lane_info = 0;
 649                                connector_type =
 650                                    object_connector_convert[con_obj_id];
 651                                connector_object_id = con_obj_id;
 652                        }
 653
 654                        if (connector_type == DRM_MODE_CONNECTOR_Unknown)
 655                                continue;
 656
 657                        router.ddc_valid = false;
 658                        router.cd_valid = false;
 659                        for (j = 0; j < ((le16_to_cpu(path->usSize) - 8) / 2); j++) {
 660                                uint8_t grph_obj_id, grph_obj_num, grph_obj_type;
 661
 662                                grph_obj_id =
 663                                    (le16_to_cpu(path->usGraphicObjIds[j]) &
 664                                     OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
 665                                grph_obj_num =
 666                                    (le16_to_cpu(path->usGraphicObjIds[j]) &
 667                                     ENUM_ID_MASK) >> ENUM_ID_SHIFT;
 668                                grph_obj_type =
 669                                    (le16_to_cpu(path->usGraphicObjIds[j]) &
 670                                     OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT;
 671
 672                                if (grph_obj_type == GRAPH_OBJECT_TYPE_ENCODER) {
 673                                        for (k = 0; k < enc_obj->ucNumberOfObjects; k++) {
 674                                                u16 encoder_obj = le16_to_cpu(enc_obj->asObjects[k].usObjectID);
 675                                                if (le16_to_cpu(path->usGraphicObjIds[j]) == encoder_obj) {
 676                                                        ATOM_COMMON_RECORD_HEADER *record = (ATOM_COMMON_RECORD_HEADER *)
 677                                                                (ctx->bios + data_offset +
 678                                                                 le16_to_cpu(enc_obj->asObjects[k].usRecordOffset));
 679                                                        ATOM_ENCODER_CAP_RECORD *cap_record;
 680                                                        u16 caps = 0;
 681
 682                                                        while (record->ucRecordSize > 0 &&
 683                                                               record->ucRecordType > 0 &&
 684                                                               record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
 685                                                                switch (record->ucRecordType) {
 686                                                                case ATOM_ENCODER_CAP_RECORD_TYPE:
 687                                                                        cap_record =(ATOM_ENCODER_CAP_RECORD *)
 688                                                                                record;
 689                                                                        caps = le16_to_cpu(cap_record->usEncoderCap);
 690                                                                        break;
 691                                                                }
 692                                                                record = (ATOM_COMMON_RECORD_HEADER *)
 693                                                                        ((char *)record + record->ucRecordSize);
 694                                                        }
 695                                                        radeon_add_atom_encoder(dev,
 696                                                                                encoder_obj,
 697                                                                                le16_to_cpu
 698                                                                                (path->
 699                                                                                 usDeviceTag),
 700                                                                                caps);
 701                                                }
 702                                        }
 703                                } else if (grph_obj_type == GRAPH_OBJECT_TYPE_ROUTER) {
 704                                        for (k = 0; k < router_obj->ucNumberOfObjects; k++) {
 705                                                u16 router_obj_id = le16_to_cpu(router_obj->asObjects[k].usObjectID);
 706                                                if (le16_to_cpu(path->usGraphicObjIds[j]) == router_obj_id) {
 707                                                        ATOM_COMMON_RECORD_HEADER *record = (ATOM_COMMON_RECORD_HEADER *)
 708                                                                (ctx->bios + data_offset +
 709                                                                 le16_to_cpu(router_obj->asObjects[k].usRecordOffset));
 710                                                        ATOM_I2C_RECORD *i2c_record;
 711                                                        ATOM_I2C_ID_CONFIG_ACCESS *i2c_config;
 712                                                        ATOM_ROUTER_DDC_PATH_SELECT_RECORD *ddc_path;
 713                                                        ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD *cd_path;
 714                                                        ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT *router_src_dst_table =
 715                                                                (ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT *)
 716                                                                (ctx->bios + data_offset +
 717                                                                 le16_to_cpu(router_obj->asObjects[k].usSrcDstTableOffset));
 718                                                        int enum_id;
 719
 720                                                        router.router_id = router_obj_id;
 721                                                        for (enum_id = 0; enum_id < router_src_dst_table->ucNumberOfDst;
 722                                                             enum_id++) {
 723                                                                if (le16_to_cpu(path->usConnObjectId) ==
 724                                                                    le16_to_cpu(router_src_dst_table->usDstObjectID[enum_id]))
 725                                                                        break;
 726                                                        }
 727
 728                                                        while (record->ucRecordSize > 0 &&
 729                                                               record->ucRecordType > 0 &&
 730                                                               record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
 731                                                                switch (record->ucRecordType) {
 732                                                                case ATOM_I2C_RECORD_TYPE:
 733                                                                        i2c_record =
 734                                                                                (ATOM_I2C_RECORD *)
 735                                                                                record;
 736                                                                        i2c_config =
 737                                                                                (ATOM_I2C_ID_CONFIG_ACCESS *)
 738                                                                                &i2c_record->sucI2cId;
 739                                                                        router.i2c_info =
 740                                                                                radeon_lookup_i2c_gpio(rdev,
 741                                                                                                       i2c_config->
 742                                                                                                       ucAccess);
 743                                                                        router.i2c_addr = i2c_record->ucI2CAddr >> 1;
 744                                                                        break;
 745                                                                case ATOM_ROUTER_DDC_PATH_SELECT_RECORD_TYPE:
 746                                                                        ddc_path = (ATOM_ROUTER_DDC_PATH_SELECT_RECORD *)
 747                                                                                record;
 748                                                                        router.ddc_valid = true;
 749                                                                        router.ddc_mux_type = ddc_path->ucMuxType;
 750                                                                        router.ddc_mux_control_pin = ddc_path->ucMuxControlPin;
 751                                                                        router.ddc_mux_state = ddc_path->ucMuxState[enum_id];
 752                                                                        break;
 753                                                                case ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD_TYPE:
 754                                                                        cd_path = (ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD *)
 755                                                                                record;
 756                                                                        router.cd_valid = true;
 757                                                                        router.cd_mux_type = cd_path->ucMuxType;
 758                                                                        router.cd_mux_control_pin = cd_path->ucMuxControlPin;
 759                                                                        router.cd_mux_state = cd_path->ucMuxState[enum_id];
 760                                                                        break;
 761                                                                }
 762                                                                record = (ATOM_COMMON_RECORD_HEADER *)
 763                                                                        ((char *)record + record->ucRecordSize);
 764                                                        }
 765                                                }
 766                                        }
 767                                }
 768                        }
 769
 770                        /* look up gpio for ddc, hpd */
 771                        ddc_bus.valid = false;
 772                        hpd.hpd = RADEON_HPD_NONE;
 773                        if ((le16_to_cpu(path->usDeviceTag) &
 774                             (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) == 0) {
 775                                for (j = 0; j < con_obj->ucNumberOfObjects; j++) {
 776                                        if (le16_to_cpu(path->usConnObjectId) ==
 777                                            le16_to_cpu(con_obj->asObjects[j].
 778                                                        usObjectID)) {
 779                                                ATOM_COMMON_RECORD_HEADER
 780                                                    *record =
 781                                                    (ATOM_COMMON_RECORD_HEADER
 782                                                     *)
 783                                                    (ctx->bios + data_offset +
 784                                                     le16_to_cpu(con_obj->
 785                                                                 asObjects[j].
 786                                                                 usRecordOffset));
 787                                                ATOM_I2C_RECORD *i2c_record;
 788                                                ATOM_HPD_INT_RECORD *hpd_record;
 789                                                ATOM_I2C_ID_CONFIG_ACCESS *i2c_config;
 790
 791                                                while (record->ucRecordSize > 0 &&
 792                                                       record->ucRecordType > 0 &&
 793                                                       record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
 794                                                        switch (record->ucRecordType) {
 795                                                        case ATOM_I2C_RECORD_TYPE:
 796                                                                i2c_record =
 797                                                                    (ATOM_I2C_RECORD *)
 798                                                                        record;
 799                                                                i2c_config =
 800                                                                        (ATOM_I2C_ID_CONFIG_ACCESS *)
 801                                                                        &i2c_record->sucI2cId;
 802                                                                ddc_bus = radeon_lookup_i2c_gpio(rdev,
 803                                                                                                 i2c_config->
 804                                                                                                 ucAccess);
 805                                                                break;
 806                                                        case ATOM_HPD_INT_RECORD_TYPE:
 807                                                                hpd_record =
 808                                                                        (ATOM_HPD_INT_RECORD *)
 809                                                                        record;
 810                                                                gpio = radeon_lookup_gpio(rdev,
 811                                                                                          hpd_record->ucHPDIntGPIOID);
 812                                                                hpd = radeon_atom_get_hpd_info_from_gpio(rdev, &gpio);
 813                                                                hpd.plugged_state = hpd_record->ucPlugged_PinState;
 814                                                                break;
 815                                                        }
 816                                                        record =
 817                                                            (ATOM_COMMON_RECORD_HEADER
 818                                                             *) ((char *)record
 819                                                                 +
 820                                                                 record->
 821                                                                 ucRecordSize);
 822                                                }
 823                                                break;
 824                                        }
 825                                }
 826                        }
 827
 828                        /* needed for aux chan transactions */
 829                        ddc_bus.hpd = hpd.hpd;
 830
 831                        conn_id = le16_to_cpu(path->usConnObjectId);
 832
 833                        if (!radeon_atom_apply_quirks
 834                            (dev, le16_to_cpu(path->usDeviceTag), &connector_type,
 835                             &ddc_bus, &conn_id, &hpd))
 836                                continue;
 837
 838                        radeon_add_atom_connector(dev,
 839                                                  conn_id,
 840                                                  le16_to_cpu(path->
 841                                                              usDeviceTag),
 842                                                  connector_type, &ddc_bus,
 843                                                  igp_lane_info,
 844                                                  connector_object_id,
 845                                                  &hpd,
 846                                                  &router);
 847
 848                }
 849        }
 850
 851        radeon_link_encoder_connector(dev);
 852
 853        return true;
 854}
 855
 856static uint16_t atombios_get_connector_object_id(struct drm_device *dev,
 857                                                 int connector_type,
 858                                                 uint16_t devices)
 859{
 860        struct radeon_device *rdev = dev->dev_private;
 861
 862        if (rdev->flags & RADEON_IS_IGP) {
 863                return supported_devices_connector_object_id_convert
 864                        [connector_type];
 865        } else if (((connector_type == DRM_MODE_CONNECTOR_DVII) ||
 866                    (connector_type == DRM_MODE_CONNECTOR_DVID)) &&
 867                   (devices & ATOM_DEVICE_DFP2_SUPPORT))  {
 868                struct radeon_mode_info *mode_info = &rdev->mode_info;
 869                struct atom_context *ctx = mode_info->atom_context;
 870                int index = GetIndexIntoMasterTable(DATA, XTMDS_Info);
 871                uint16_t size, data_offset;
 872                uint8_t frev, crev;
 873                ATOM_XTMDS_INFO *xtmds;
 874
 875                if (atom_parse_data_header(ctx, index, &size, &frev, &crev, &data_offset)) {
 876                        xtmds = (ATOM_XTMDS_INFO *)(ctx->bios + data_offset);
 877
 878                        if (xtmds->ucSupportedLink & ATOM_XTMDS_SUPPORTED_DUALLINK) {
 879                                if (connector_type == DRM_MODE_CONNECTOR_DVII)
 880                                        return CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I;
 881                                else
 882                                        return CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D;
 883                        } else {
 884                                if (connector_type == DRM_MODE_CONNECTOR_DVII)
 885                                        return CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I;
 886                                else
 887                                        return CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D;
 888                        }
 889                } else
 890                        return supported_devices_connector_object_id_convert
 891                                [connector_type];
 892        } else {
 893                return supported_devices_connector_object_id_convert
 894                        [connector_type];
 895        }
 896}
 897
 898struct bios_connector {
 899        bool valid;
 900        uint16_t line_mux;
 901        uint16_t devices;
 902        int connector_type;
 903        struct radeon_i2c_bus_rec ddc_bus;
 904        struct radeon_hpd hpd;
 905};
 906
 907bool radeon_get_atom_connector_info_from_supported_devices_table(struct
 908                                                                 drm_device
 909                                                                 *dev)
 910{
 911        struct radeon_device *rdev = dev->dev_private;
 912        struct radeon_mode_info *mode_info = &rdev->mode_info;
 913        struct atom_context *ctx = mode_info->atom_context;
 914        int index = GetIndexIntoMasterTable(DATA, SupportedDevicesInfo);
 915        uint16_t size, data_offset;
 916        uint8_t frev, crev;
 917        uint16_t device_support;
 918        uint8_t dac;
 919        union atom_supported_devices *supported_devices;
 920        int i, j, max_device;
 921        struct bios_connector *bios_connectors;
 922        size_t bc_size = sizeof(*bios_connectors) * ATOM_MAX_SUPPORTED_DEVICE;
 923        struct radeon_router router;
 924
 925        router.ddc_valid = false;
 926        router.cd_valid = false;
 927
 928        bios_connectors = kzalloc(bc_size, GFP_KERNEL);
 929        if (!bios_connectors)
 930                return false;
 931
 932        if (!atom_parse_data_header(ctx, index, &size, &frev, &crev,
 933                                    &data_offset)) {
 934                kfree(bios_connectors);
 935                return false;
 936        }
 937
 938        supported_devices =
 939            (union atom_supported_devices *)(ctx->bios + data_offset);
 940
 941        device_support = le16_to_cpu(supported_devices->info.usDeviceSupport);
 942
 943        if (frev > 1)
 944                max_device = ATOM_MAX_SUPPORTED_DEVICE;
 945        else
 946                max_device = ATOM_MAX_SUPPORTED_DEVICE_INFO;
 947
 948        for (i = 0; i < max_device; i++) {
 949                ATOM_CONNECTOR_INFO_I2C ci =
 950                    supported_devices->info.asConnInfo[i];
 951
 952                bios_connectors[i].valid = false;
 953
 954                if (!(device_support & (1 << i))) {
 955                        continue;
 956                }
 957
 958                if (i == ATOM_DEVICE_CV_INDEX) {
 959                        DRM_DEBUG_KMS("Skipping Component Video\n");
 960                        continue;
 961                }
 962
 963                bios_connectors[i].connector_type =
 964                    supported_devices_connector_convert[ci.sucConnectorInfo.
 965                                                        sbfAccess.
 966                                                        bfConnectorType];
 967
 968                if (bios_connectors[i].connector_type ==
 969                    DRM_MODE_CONNECTOR_Unknown)
 970                        continue;
 971
 972                dac = ci.sucConnectorInfo.sbfAccess.bfAssociatedDAC;
 973
 974                bios_connectors[i].line_mux =
 975                        ci.sucI2cId.ucAccess;
 976
 977                /* give tv unique connector ids */
 978                if (i == ATOM_DEVICE_TV1_INDEX) {
 979                        bios_connectors[i].ddc_bus.valid = false;
 980                        bios_connectors[i].line_mux = 50;
 981                } else if (i == ATOM_DEVICE_TV2_INDEX) {
 982                        bios_connectors[i].ddc_bus.valid = false;
 983                        bios_connectors[i].line_mux = 51;
 984                } else if (i == ATOM_DEVICE_CV_INDEX) {
 985                        bios_connectors[i].ddc_bus.valid = false;
 986                        bios_connectors[i].line_mux = 52;
 987                } else
 988                        bios_connectors[i].ddc_bus =
 989                            radeon_lookup_i2c_gpio(rdev,
 990                                                   bios_connectors[i].line_mux);
 991
 992                if ((crev > 1) && (frev > 1)) {
 993                        u8 isb = supported_devices->info_2d1.asIntSrcInfo[i].ucIntSrcBitmap;
 994                        switch (isb) {
 995                        case 0x4:
 996                                bios_connectors[i].hpd.hpd = RADEON_HPD_1;
 997                                break;
 998                        case 0xa:
 999                                bios_connectors[i].hpd.hpd = RADEON_HPD_2;
1000                                break;
1001                        default:
1002                                bios_connectors[i].hpd.hpd = RADEON_HPD_NONE;
1003                                break;
1004                        }
1005                } else {
1006                        if (i == ATOM_DEVICE_DFP1_INDEX)
1007                                bios_connectors[i].hpd.hpd = RADEON_HPD_1;
1008                        else if (i == ATOM_DEVICE_DFP2_INDEX)
1009                                bios_connectors[i].hpd.hpd = RADEON_HPD_2;
1010                        else
1011                                bios_connectors[i].hpd.hpd = RADEON_HPD_NONE;
1012                }
1013
1014                /* Always set the connector type to VGA for CRT1/CRT2. if they are
1015                 * shared with a DVI port, we'll pick up the DVI connector when we
1016                 * merge the outputs.  Some bioses incorrectly list VGA ports as DVI.
1017                 */
1018                if (i == ATOM_DEVICE_CRT1_INDEX || i == ATOM_DEVICE_CRT2_INDEX)
1019                        bios_connectors[i].connector_type =
1020                            DRM_MODE_CONNECTOR_VGA;
1021
1022                if (!radeon_atom_apply_quirks
1023                    (dev, (1 << i), &bios_connectors[i].connector_type,
1024                     &bios_connectors[i].ddc_bus, &bios_connectors[i].line_mux,
1025                     &bios_connectors[i].hpd))
1026                        continue;
1027
1028                bios_connectors[i].valid = true;
1029                bios_connectors[i].devices = (1 << i);
1030
1031                if (ASIC_IS_AVIVO(rdev) || radeon_r4xx_atom)
1032                        radeon_add_atom_encoder(dev,
1033                                                radeon_get_encoder_enum(dev,
1034                                                                      (1 << i),
1035                                                                      dac),
1036                                                (1 << i),
1037                                                0);
1038                else
1039                        radeon_add_legacy_encoder(dev,
1040                                                  radeon_get_encoder_enum(dev,
1041                                                                        (1 << i),
1042                                                                        dac),
1043                                                  (1 << i));
1044        }
1045
1046        /* combine shared connectors */
1047        for (i = 0; i < max_device; i++) {
1048                if (bios_connectors[i].valid) {
1049                        for (j = 0; j < max_device; j++) {
1050                                if (bios_connectors[j].valid && (i != j)) {
1051                                        if (bios_connectors[i].line_mux ==
1052                                            bios_connectors[j].line_mux) {
1053                                                /* make sure not to combine LVDS */
1054                                                if (bios_connectors[i].devices & (ATOM_DEVICE_LCD_SUPPORT)) {
1055                                                        bios_connectors[i].line_mux = 53;
1056                                                        bios_connectors[i].ddc_bus.valid = false;
1057                                                        continue;
1058                                                }
1059                                                if (bios_connectors[j].devices & (ATOM_DEVICE_LCD_SUPPORT)) {
1060                                                        bios_connectors[j].line_mux = 53;
1061                                                        bios_connectors[j].ddc_bus.valid = false;
1062                                                        continue;
1063                                                }
1064                                                /* combine analog and digital for DVI-I */
1065                                                if (((bios_connectors[i].devices & (ATOM_DEVICE_DFP_SUPPORT)) &&
1066                                                     (bios_connectors[j].devices & (ATOM_DEVICE_CRT_SUPPORT))) ||
1067                                                    ((bios_connectors[j].devices & (ATOM_DEVICE_DFP_SUPPORT)) &&
1068                                                     (bios_connectors[i].devices & (ATOM_DEVICE_CRT_SUPPORT)))) {
1069                                                        bios_connectors[i].devices |=
1070                                                                bios_connectors[j].devices;
1071                                                        bios_connectors[i].connector_type =
1072                                                                DRM_MODE_CONNECTOR_DVII;
1073                                                        if (bios_connectors[j].devices & (ATOM_DEVICE_DFP_SUPPORT))
1074                                                                bios_connectors[i].hpd =
1075                                                                        bios_connectors[j].hpd;
1076                                                        bios_connectors[j].valid = false;
1077                                                }
1078                                        }
1079                                }
1080                        }
1081                }
1082        }
1083
1084        /* add the connectors */
1085        for (i = 0; i < max_device; i++) {
1086                if (bios_connectors[i].valid) {
1087                        uint16_t connector_object_id =
1088                                atombios_get_connector_object_id(dev,
1089                                                      bios_connectors[i].connector_type,
1090                                                      bios_connectors[i].devices);
1091                        radeon_add_atom_connector(dev,
1092                                                  bios_connectors[i].line_mux,
1093                                                  bios_connectors[i].devices,
1094                                                  bios_connectors[i].
1095                                                  connector_type,
1096                                                  &bios_connectors[i].ddc_bus,
1097                                                  0,
1098                                                  connector_object_id,
1099                                                  &bios_connectors[i].hpd,
1100                                                  &router);
1101                }
1102        }
1103
1104        radeon_link_encoder_connector(dev);
1105
1106        kfree(bios_connectors);
1107        return true;
1108}
1109
1110union firmware_info {
1111        ATOM_FIRMWARE_INFO info;
1112        ATOM_FIRMWARE_INFO_V1_2 info_12;
1113        ATOM_FIRMWARE_INFO_V1_3 info_13;
1114        ATOM_FIRMWARE_INFO_V1_4 info_14;
1115        ATOM_FIRMWARE_INFO_V2_1 info_21;
1116        ATOM_FIRMWARE_INFO_V2_2 info_22;
1117};
1118
1119bool radeon_atom_get_clock_info(struct drm_device *dev)
1120{
1121        struct radeon_device *rdev = dev->dev_private;
1122        struct radeon_mode_info *mode_info = &rdev->mode_info;
1123        int index = GetIndexIntoMasterTable(DATA, FirmwareInfo);
1124        union firmware_info *firmware_info;
1125        uint8_t frev, crev;
1126        struct radeon_pll *p1pll = &rdev->clock.p1pll;
1127        struct radeon_pll *p2pll = &rdev->clock.p2pll;
1128        struct radeon_pll *dcpll = &rdev->clock.dcpll;
1129        struct radeon_pll *spll = &rdev->clock.spll;
1130        struct radeon_pll *mpll = &rdev->clock.mpll;
1131        uint16_t data_offset;
1132
1133        if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1134                                   &frev, &crev, &data_offset)) {
1135                firmware_info =
1136                        (union firmware_info *)(mode_info->atom_context->bios +
1137                                                data_offset);
1138                /* pixel clocks */
1139                p1pll->reference_freq =
1140                    le16_to_cpu(firmware_info->info.usReferenceClock);
1141                p1pll->reference_div = 0;
1142
1143                if (crev < 2)
1144                        p1pll->pll_out_min =
1145                                le16_to_cpu(firmware_info->info.usMinPixelClockPLL_Output);
1146                else
1147                        p1pll->pll_out_min =
1148                                le32_to_cpu(firmware_info->info_12.ulMinPixelClockPLL_Output);
1149                p1pll->pll_out_max =
1150                    le32_to_cpu(firmware_info->info.ulMaxPixelClockPLL_Output);
1151
1152                if (crev >= 4) {
1153                        p1pll->lcd_pll_out_min =
1154                                le16_to_cpu(firmware_info->info_14.usLcdMinPixelClockPLL_Output) * 100;
1155                        if (p1pll->lcd_pll_out_min == 0)
1156                                p1pll->lcd_pll_out_min = p1pll->pll_out_min;
1157                        p1pll->lcd_pll_out_max =
1158                                le16_to_cpu(firmware_info->info_14.usLcdMaxPixelClockPLL_Output) * 100;
1159                        if (p1pll->lcd_pll_out_max == 0)
1160                                p1pll->lcd_pll_out_max = p1pll->pll_out_max;
1161                } else {
1162                        p1pll->lcd_pll_out_min = p1pll->pll_out_min;
1163                        p1pll->lcd_pll_out_max = p1pll->pll_out_max;
1164                }
1165
1166                if (p1pll->pll_out_min == 0) {
1167                        if (ASIC_IS_AVIVO(rdev))
1168                                p1pll->pll_out_min = 64800;
1169                        else
1170                                p1pll->pll_out_min = 20000;
1171                }
1172
1173                p1pll->pll_in_min =
1174                    le16_to_cpu(firmware_info->info.usMinPixelClockPLL_Input);
1175                p1pll->pll_in_max =
1176                    le16_to_cpu(firmware_info->info.usMaxPixelClockPLL_Input);
1177
1178                *p2pll = *p1pll;
1179
1180                /* system clock */
1181                if (ASIC_IS_DCE4(rdev))
1182                        spll->reference_freq =
1183                                le16_to_cpu(firmware_info->info_21.usCoreReferenceClock);
1184                else
1185                        spll->reference_freq =
1186                                le16_to_cpu(firmware_info->info.usReferenceClock);
1187                spll->reference_div = 0;
1188
1189                spll->pll_out_min =
1190                    le16_to_cpu(firmware_info->info.usMinEngineClockPLL_Output);
1191                spll->pll_out_max =
1192                    le32_to_cpu(firmware_info->info.ulMaxEngineClockPLL_Output);
1193
1194                /* ??? */
1195                if (spll->pll_out_min == 0) {
1196                        if (ASIC_IS_AVIVO(rdev))
1197                                spll->pll_out_min = 64800;
1198                        else
1199                                spll->pll_out_min = 20000;
1200                }
1201
1202                spll->pll_in_min =
1203                    le16_to_cpu(firmware_info->info.usMinEngineClockPLL_Input);
1204                spll->pll_in_max =
1205                    le16_to_cpu(firmware_info->info.usMaxEngineClockPLL_Input);
1206
1207                /* memory clock */
1208                if (ASIC_IS_DCE4(rdev))
1209                        mpll->reference_freq =
1210                                le16_to_cpu(firmware_info->info_21.usMemoryReferenceClock);
1211                else
1212                        mpll->reference_freq =
1213                                le16_to_cpu(firmware_info->info.usReferenceClock);
1214                mpll->reference_div = 0;
1215
1216                mpll->pll_out_min =
1217                    le16_to_cpu(firmware_info->info.usMinMemoryClockPLL_Output);
1218                mpll->pll_out_max =
1219                    le32_to_cpu(firmware_info->info.ulMaxMemoryClockPLL_Output);
1220
1221                /* ??? */
1222                if (mpll->pll_out_min == 0) {
1223                        if (ASIC_IS_AVIVO(rdev))
1224                                mpll->pll_out_min = 64800;
1225                        else
1226                                mpll->pll_out_min = 20000;
1227                }
1228
1229                mpll->pll_in_min =
1230                    le16_to_cpu(firmware_info->info.usMinMemoryClockPLL_Input);
1231                mpll->pll_in_max =
1232                    le16_to_cpu(firmware_info->info.usMaxMemoryClockPLL_Input);
1233
1234                rdev->clock.default_sclk =
1235                    le32_to_cpu(firmware_info->info.ulDefaultEngineClock);
1236                rdev->clock.default_mclk =
1237                    le32_to_cpu(firmware_info->info.ulDefaultMemoryClock);
1238
1239                if (ASIC_IS_DCE4(rdev)) {
1240                        rdev->clock.default_dispclk =
1241                                le32_to_cpu(firmware_info->info_21.ulDefaultDispEngineClkFreq);
1242                        if (rdev->clock.default_dispclk == 0) {
1243                                if (ASIC_IS_DCE5(rdev))
1244                                        rdev->clock.default_dispclk = 54000; /* 540 Mhz */
1245                                else
1246                                        rdev->clock.default_dispclk = 60000; /* 600 Mhz */
1247                        }
1248                        rdev->clock.dp_extclk =
1249                                le16_to_cpu(firmware_info->info_21.usUniphyDPModeExtClkFreq);
1250                }
1251                *dcpll = *p1pll;
1252
1253                rdev->clock.max_pixel_clock = le16_to_cpu(firmware_info->info.usMaxPixelClock);
1254                if (rdev->clock.max_pixel_clock == 0)
1255                        rdev->clock.max_pixel_clock = 40000;
1256
1257                /* not technically a clock, but... */
1258                rdev->mode_info.firmware_flags =
1259                        le16_to_cpu(firmware_info->info.usFirmwareCapability.susAccess);
1260
1261                return true;
1262        }
1263
1264        return false;
1265}
1266
1267union igp_info {
1268        struct _ATOM_INTEGRATED_SYSTEM_INFO info;
1269        struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2;
1270        struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 info_6;
1271        struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_7 info_7;
1272};
1273
1274bool radeon_atombios_sideport_present(struct radeon_device *rdev)
1275{
1276        struct radeon_mode_info *mode_info = &rdev->mode_info;
1277        int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo);
1278        union igp_info *igp_info;
1279        u8 frev, crev;
1280        u16 data_offset;
1281
1282        /* sideport is AMD only */
1283        if (rdev->family == CHIP_RS600)
1284                return false;
1285
1286        if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1287                                   &frev, &crev, &data_offset)) {
1288                igp_info = (union igp_info *)(mode_info->atom_context->bios +
1289                                      data_offset);
1290                switch (crev) {
1291                case 1:
1292                        if (le32_to_cpu(igp_info->info.ulBootUpMemoryClock))
1293                                return true;
1294                        break;
1295                case 2:
1296                        if (le32_to_cpu(igp_info->info_2.ulBootUpSidePortClock))
1297                                return true;
1298                        break;
1299                default:
1300                        DRM_ERROR("Unsupported IGP table: %d %d\n", frev, crev);
1301                        break;
1302                }
1303        }
1304        return false;
1305}
1306
1307bool radeon_atombios_get_tmds_info(struct radeon_encoder *encoder,
1308                                   struct radeon_encoder_int_tmds *tmds)
1309{
1310        struct drm_device *dev = encoder->base.dev;
1311        struct radeon_device *rdev = dev->dev_private;
1312        struct radeon_mode_info *mode_info = &rdev->mode_info;
1313        int index = GetIndexIntoMasterTable(DATA, TMDS_Info);
1314        uint16_t data_offset;
1315        struct _ATOM_TMDS_INFO *tmds_info;
1316        uint8_t frev, crev;
1317        uint16_t maxfreq;
1318        int i;
1319
1320        if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1321                                   &frev, &crev, &data_offset)) {
1322                tmds_info =
1323                        (struct _ATOM_TMDS_INFO *)(mode_info->atom_context->bios +
1324                                                   data_offset);
1325
1326                maxfreq = le16_to_cpu(tmds_info->usMaxFrequency);
1327                for (i = 0; i < 4; i++) {
1328                        tmds->tmds_pll[i].freq =
1329                            le16_to_cpu(tmds_info->asMiscInfo[i].usFrequency);
1330                        tmds->tmds_pll[i].value =
1331                            tmds_info->asMiscInfo[i].ucPLL_ChargePump & 0x3f;
1332                        tmds->tmds_pll[i].value |=
1333                            (tmds_info->asMiscInfo[i].
1334                             ucPLL_VCO_Gain & 0x3f) << 6;
1335                        tmds->tmds_pll[i].value |=
1336                            (tmds_info->asMiscInfo[i].
1337                             ucPLL_DutyCycle & 0xf) << 12;
1338                        tmds->tmds_pll[i].value |=
1339                            (tmds_info->asMiscInfo[i].
1340                             ucPLL_VoltageSwing & 0xf) << 16;
1341
1342                        DRM_DEBUG_KMS("TMDS PLL From ATOMBIOS %u %x\n",
1343                                  tmds->tmds_pll[i].freq,
1344                                  tmds->tmds_pll[i].value);
1345
1346                        if (maxfreq == tmds->tmds_pll[i].freq) {
1347                                tmds->tmds_pll[i].freq = 0xffffffff;
1348                                break;
1349                        }
1350                }
1351                return true;
1352        }
1353        return false;
1354}
1355
1356bool radeon_atombios_get_ppll_ss_info(struct radeon_device *rdev,
1357                                      struct radeon_atom_ss *ss,
1358                                      int id)
1359{
1360        struct radeon_mode_info *mode_info = &rdev->mode_info;
1361        int index = GetIndexIntoMasterTable(DATA, PPLL_SS_Info);
1362        uint16_t data_offset, size;
1363        struct _ATOM_SPREAD_SPECTRUM_INFO *ss_info;
1364        uint8_t frev, crev;
1365        int i, num_indices;
1366
1367        memset(ss, 0, sizeof(struct radeon_atom_ss));
1368        if (atom_parse_data_header(mode_info->atom_context, index, &size,
1369                                   &frev, &crev, &data_offset)) {
1370                ss_info =
1371                        (struct _ATOM_SPREAD_SPECTRUM_INFO *)(mode_info->atom_context->bios + data_offset);
1372
1373                num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1374                        sizeof(ATOM_SPREAD_SPECTRUM_ASSIGNMENT);
1375
1376                for (i = 0; i < num_indices; i++) {
1377                        if (ss_info->asSS_Info[i].ucSS_Id == id) {
1378                                ss->percentage =
1379                                        le16_to_cpu(ss_info->asSS_Info[i].usSpreadSpectrumPercentage);
1380                                ss->type = ss_info->asSS_Info[i].ucSpreadSpectrumType;
1381                                ss->step = ss_info->asSS_Info[i].ucSS_Step;
1382                                ss->delay = ss_info->asSS_Info[i].ucSS_Delay;
1383                                ss->range = ss_info->asSS_Info[i].ucSS_Range;
1384                                ss->refdiv = ss_info->asSS_Info[i].ucRecommendedRef_Div;
1385                                return true;
1386                        }
1387                }
1388        }
1389        return false;
1390}
1391
1392static void radeon_atombios_get_igp_ss_overrides(struct radeon_device *rdev,
1393                                                 struct radeon_atom_ss *ss,
1394                                                 int id)
1395{
1396        struct radeon_mode_info *mode_info = &rdev->mode_info;
1397        int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo);
1398        u16 data_offset, size;
1399        union igp_info *igp_info;
1400        u8 frev, crev;
1401        u16 percentage = 0, rate = 0;
1402
1403        /* get any igp specific overrides */
1404        if (atom_parse_data_header(mode_info->atom_context, index, &size,
1405                                   &frev, &crev, &data_offset)) {
1406                igp_info = (union igp_info *)
1407                        (mode_info->atom_context->bios + data_offset);
1408                switch (crev) {
1409                case 6:
1410                        switch (id) {
1411                        case ASIC_INTERNAL_SS_ON_TMDS:
1412                                percentage = le16_to_cpu(igp_info->info_6.usDVISSPercentage);
1413                                rate = le16_to_cpu(igp_info->info_6.usDVISSpreadRateIn10Hz);
1414                                break;
1415                        case ASIC_INTERNAL_SS_ON_HDMI:
1416                                percentage = le16_to_cpu(igp_info->info_6.usHDMISSPercentage);
1417                                rate = le16_to_cpu(igp_info->info_6.usHDMISSpreadRateIn10Hz);
1418                                break;
1419                        case ASIC_INTERNAL_SS_ON_LVDS:
1420                                percentage = le16_to_cpu(igp_info->info_6.usLvdsSSPercentage);
1421                                rate = le16_to_cpu(igp_info->info_6.usLvdsSSpreadRateIn10Hz);
1422                                break;
1423                        }
1424                        break;
1425                case 7:
1426                        switch (id) {
1427                        case ASIC_INTERNAL_SS_ON_TMDS:
1428                                percentage = le16_to_cpu(igp_info->info_7.usDVISSPercentage);
1429                                rate = le16_to_cpu(igp_info->info_7.usDVISSpreadRateIn10Hz);
1430                                break;
1431                        case ASIC_INTERNAL_SS_ON_HDMI:
1432                                percentage = le16_to_cpu(igp_info->info_7.usHDMISSPercentage);
1433                                rate = le16_to_cpu(igp_info->info_7.usHDMISSpreadRateIn10Hz);
1434                                break;
1435                        case ASIC_INTERNAL_SS_ON_LVDS:
1436                                percentage = le16_to_cpu(igp_info->info_7.usLvdsSSPercentage);
1437                                rate = le16_to_cpu(igp_info->info_7.usLvdsSSpreadRateIn10Hz);
1438                                break;
1439                        }
1440                        break;
1441                default:
1442                        DRM_ERROR("Unsupported IGP table: %d %d\n", frev, crev);
1443                        break;
1444                }
1445                if (percentage)
1446                        ss->percentage = percentage;
1447                if (rate)
1448                        ss->rate = rate;
1449        }
1450}
1451
1452union asic_ss_info {
1453        struct _ATOM_ASIC_INTERNAL_SS_INFO info;
1454        struct _ATOM_ASIC_INTERNAL_SS_INFO_V2 info_2;
1455        struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 info_3;
1456};
1457
1458bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev,
1459                                      struct radeon_atom_ss *ss,
1460                                      int id, u32 clock)
1461{
1462        struct radeon_mode_info *mode_info = &rdev->mode_info;
1463        int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info);
1464        uint16_t data_offset, size;
1465        union asic_ss_info *ss_info;
1466        uint8_t frev, crev;
1467        int i, num_indices;
1468
1469        memset(ss, 0, sizeof(struct radeon_atom_ss));
1470        if (atom_parse_data_header(mode_info->atom_context, index, &size,
1471                                   &frev, &crev, &data_offset)) {
1472
1473                ss_info =
1474                        (union asic_ss_info *)(mode_info->atom_context->bios + data_offset);
1475
1476                switch (frev) {
1477                case 1:
1478                        num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1479                                sizeof(ATOM_ASIC_SS_ASSIGNMENT);
1480
1481                        for (i = 0; i < num_indices; i++) {
1482                                if ((ss_info->info.asSpreadSpectrum[i].ucClockIndication == id) &&
1483                                    (clock <= le32_to_cpu(ss_info->info.asSpreadSpectrum[i].ulTargetClockRange))) {
1484                                        ss->percentage =
1485                                                le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1486                                        ss->type = ss_info->info.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1487                                        ss->rate = le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadRateInKhz);
1488                                        return true;
1489                                }
1490                        }
1491                        break;
1492                case 2:
1493                        num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1494                                sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2);
1495                        for (i = 0; i < num_indices; i++) {
1496                                if ((ss_info->info_2.asSpreadSpectrum[i].ucClockIndication == id) &&
1497                                    (clock <= le32_to_cpu(ss_info->info_2.asSpreadSpectrum[i].ulTargetClockRange))) {
1498                                        ss->percentage =
1499                                                le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1500                                        ss->type = ss_info->info_2.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1501                                        ss->rate = le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadRateIn10Hz);
1502                                        return true;
1503                                }
1504                        }
1505                        break;
1506                case 3:
1507                        num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1508                                sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3);
1509                        for (i = 0; i < num_indices; i++) {
1510                                if ((ss_info->info_3.asSpreadSpectrum[i].ucClockIndication == id) &&
1511                                    (clock <= le32_to_cpu(ss_info->info_3.asSpreadSpectrum[i].ulTargetClockRange))) {
1512                                        ss->percentage =
1513                                                le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1514                                        ss->type = ss_info->info_3.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1515                                        ss->rate = le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadRateIn10Hz);
1516                                        if (rdev->flags & RADEON_IS_IGP)
1517                                                radeon_atombios_get_igp_ss_overrides(rdev, ss, id);
1518                                        return true;
1519                                }
1520                        }
1521                        break;
1522                default:
1523                        DRM_ERROR("Unsupported ASIC_InternalSS_Info table: %d %d\n", frev, crev);
1524                        break;
1525                }
1526
1527        }
1528        return false;
1529}
1530
1531union lvds_info {
1532        struct _ATOM_LVDS_INFO info;
1533        struct _ATOM_LVDS_INFO_V12 info_12;
1534};
1535
1536struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct
1537                                                              radeon_encoder
1538                                                              *encoder)
1539{
1540        struct drm_device *dev = encoder->base.dev;
1541        struct radeon_device *rdev = dev->dev_private;
1542        struct radeon_mode_info *mode_info = &rdev->mode_info;
1543        int index = GetIndexIntoMasterTable(DATA, LVDS_Info);
1544        uint16_t data_offset, misc;
1545        union lvds_info *lvds_info;
1546        uint8_t frev, crev;
1547        struct radeon_encoder_atom_dig *lvds = NULL;
1548        int encoder_enum = (encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
1549
1550        if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1551                                   &frev, &crev, &data_offset)) {
1552                lvds_info =
1553                        (union lvds_info *)(mode_info->atom_context->bios + data_offset);
1554                lvds =
1555                    kzalloc(sizeof(struct radeon_encoder_atom_dig), GFP_KERNEL);
1556
1557                if (!lvds)
1558                        return NULL;
1559
1560                lvds->native_mode.clock =
1561                    le16_to_cpu(lvds_info->info.sLCDTiming.usPixClk) * 10;
1562                lvds->native_mode.hdisplay =
1563                    le16_to_cpu(lvds_info->info.sLCDTiming.usHActive);
1564                lvds->native_mode.vdisplay =
1565                    le16_to_cpu(lvds_info->info.sLCDTiming.usVActive);
1566                lvds->native_mode.htotal = lvds->native_mode.hdisplay +
1567                        le16_to_cpu(lvds_info->info.sLCDTiming.usHBlanking_Time);
1568                lvds->native_mode.hsync_start = lvds->native_mode.hdisplay +
1569                        le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncOffset);
1570                lvds->native_mode.hsync_end = lvds->native_mode.hsync_start +
1571                        le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncWidth);
1572                lvds->native_mode.vtotal = lvds->native_mode.vdisplay +
1573                        le16_to_cpu(lvds_info->info.sLCDTiming.usVBlanking_Time);
1574                lvds->native_mode.vsync_start = lvds->native_mode.vdisplay +
1575                        le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncOffset);
1576                lvds->native_mode.vsync_end = lvds->native_mode.vsync_start +
1577                        le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncWidth);
1578                lvds->panel_pwr_delay =
1579                    le16_to_cpu(lvds_info->info.usOffDelayInMs);
1580                lvds->lcd_misc = lvds_info->info.ucLVDS_Misc;
1581
1582                misc = le16_to_cpu(lvds_info->info.sLCDTiming.susModeMiscInfo.usAccess);
1583                if (misc & ATOM_VSYNC_POLARITY)
1584                        lvds->native_mode.flags |= DRM_MODE_FLAG_NVSYNC;
1585                if (misc & ATOM_HSYNC_POLARITY)
1586                        lvds->native_mode.flags |= DRM_MODE_FLAG_NHSYNC;
1587                if (misc & ATOM_COMPOSITESYNC)
1588                        lvds->native_mode.flags |= DRM_MODE_FLAG_CSYNC;
1589                if (misc & ATOM_INTERLACE)
1590                        lvds->native_mode.flags |= DRM_MODE_FLAG_INTERLACE;
1591                if (misc & ATOM_DOUBLE_CLOCK_MODE)
1592                        lvds->native_mode.flags |= DRM_MODE_FLAG_DBLSCAN;
1593
1594                lvds->native_mode.width_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageHSize);
1595                lvds->native_mode.height_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageVSize);
1596
1597                /* set crtc values */
1598                drm_mode_set_crtcinfo(&lvds->native_mode, CRTC_INTERLACE_HALVE_V);
1599
1600                lvds->lcd_ss_id = lvds_info->info.ucSS_Id;
1601
1602                encoder->native_mode = lvds->native_mode;
1603
1604                if (encoder_enum == 2)
1605                        lvds->linkb = true;
1606                else
1607                        lvds->linkb = false;
1608
1609                /* parse the lcd record table */
1610                if (le16_to_cpu(lvds_info->info.usModePatchTableOffset)) {
1611                        ATOM_FAKE_EDID_PATCH_RECORD *fake_edid_record;
1612                        ATOM_PANEL_RESOLUTION_PATCH_RECORD *panel_res_record;
1613                        bool bad_record = false;
1614                        u8 *record;
1615
1616                        if ((frev == 1) && (crev < 2))
1617                                /* absolute */
1618                                record = (u8 *)(mode_info->atom_context->bios +
1619                                                le16_to_cpu(lvds_info->info.usModePatchTableOffset));
1620                        else
1621                                /* relative */
1622                                record = (u8 *)(mode_info->atom_context->bios +
1623                                                data_offset +
1624                                                le16_to_cpu(lvds_info->info.usModePatchTableOffset));
1625                        while (*record != ATOM_RECORD_END_TYPE) {
1626                                switch (*record) {
1627                                case LCD_MODE_PATCH_RECORD_MODE_TYPE:
1628                                        record += sizeof(ATOM_PATCH_RECORD_MODE);
1629                                        break;
1630                                case LCD_RTS_RECORD_TYPE:
1631                                        record += sizeof(ATOM_LCD_RTS_RECORD);
1632                                        break;
1633                                case LCD_CAP_RECORD_TYPE:
1634                                        record += sizeof(ATOM_LCD_MODE_CONTROL_CAP);
1635                                        break;
1636                                case LCD_FAKE_EDID_PATCH_RECORD_TYPE:
1637                                        fake_edid_record = (ATOM_FAKE_EDID_PATCH_RECORD *)record;
1638                                        if (fake_edid_record->ucFakeEDIDLength) {
1639                                                struct edid *edid;
1640                                                int edid_size =
1641                                                        max((int)EDID_LENGTH, (int)fake_edid_record->ucFakeEDIDLength);
1642                                                edid = kmalloc(edid_size, GFP_KERNEL);
1643                                                if (edid) {
1644                                                        memcpy((u8 *)edid, (u8 *)&fake_edid_record->ucFakeEDIDString[0],
1645                                                               fake_edid_record->ucFakeEDIDLength);
1646
1647                                                        if (drm_edid_is_valid(edid)) {
1648                                                                rdev->mode_info.bios_hardcoded_edid = edid;
1649                                                                rdev->mode_info.bios_hardcoded_edid_size = edid_size;
1650                                                        } else
1651                                                                kfree(edid);
1652                                                }
1653                                        }
1654                                        record += sizeof(ATOM_FAKE_EDID_PATCH_RECORD);
1655                                        break;
1656                                case LCD_PANEL_RESOLUTION_RECORD_TYPE:
1657                                        panel_res_record = (ATOM_PANEL_RESOLUTION_PATCH_RECORD *)record;
1658                                        lvds->native_mode.width_mm = panel_res_record->usHSize;
1659                                        lvds->native_mode.height_mm = panel_res_record->usVSize;
1660                                        record += sizeof(ATOM_PANEL_RESOLUTION_PATCH_RECORD);
1661                                        break;
1662                                default:
1663                                        DRM_ERROR("Bad LCD record %d\n", *record);
1664                                        bad_record = true;
1665                                        break;
1666                                }
1667                                if (bad_record)
1668                                        break;
1669                        }
1670                }
1671        }
1672        return lvds;
1673}
1674
1675struct radeon_encoder_primary_dac *
1676radeon_atombios_get_primary_dac_info(struct radeon_encoder *encoder)
1677{
1678        struct drm_device *dev = encoder->base.dev;
1679        struct radeon_device *rdev = dev->dev_private;
1680        struct radeon_mode_info *mode_info = &rdev->mode_info;
1681        int index = GetIndexIntoMasterTable(DATA, CompassionateData);
1682        uint16_t data_offset;
1683        struct _COMPASSIONATE_DATA *dac_info;
1684        uint8_t frev, crev;
1685        uint8_t bg, dac;
1686        struct radeon_encoder_primary_dac *p_dac = NULL;
1687
1688        if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1689                                   &frev, &crev, &data_offset)) {
1690                dac_info = (struct _COMPASSIONATE_DATA *)
1691                        (mode_info->atom_context->bios + data_offset);
1692
1693                p_dac = kzalloc(sizeof(struct radeon_encoder_primary_dac), GFP_KERNEL);
1694
1695                if (!p_dac)
1696                        return NULL;
1697
1698                bg = dac_info->ucDAC1_BG_Adjustment;
1699                dac = dac_info->ucDAC1_DAC_Adjustment;
1700                p_dac->ps2_pdac_adj = (bg << 8) | (dac);
1701
1702        }
1703        return p_dac;
1704}
1705
1706bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index,
1707                                struct drm_display_mode *mode)
1708{
1709        struct radeon_mode_info *mode_info = &rdev->mode_info;
1710        ATOM_ANALOG_TV_INFO *tv_info;
1711        ATOM_ANALOG_TV_INFO_V1_2 *tv_info_v1_2;
1712        ATOM_DTD_FORMAT *dtd_timings;
1713        int data_index = GetIndexIntoMasterTable(DATA, AnalogTV_Info);
1714        u8 frev, crev;
1715        u16 data_offset, misc;
1716
1717        if (!atom_parse_data_header(mode_info->atom_context, data_index, NULL,
1718                                    &frev, &crev, &data_offset))
1719                return false;
1720
1721        switch (crev) {
1722        case 1:
1723                tv_info = (ATOM_ANALOG_TV_INFO *)(mode_info->atom_context->bios + data_offset);
1724                if (index >= MAX_SUPPORTED_TV_TIMING)
1725                        return false;
1726
1727                mode->crtc_htotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Total);
1728                mode->crtc_hdisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Disp);
1729                mode->crtc_hsync_start = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart);
1730                mode->crtc_hsync_end = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart) +
1731                        le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncWidth);
1732
1733                mode->crtc_vtotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Total);
1734                mode->crtc_vdisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Disp);
1735                mode->crtc_vsync_start = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart);
1736                mode->crtc_vsync_end = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart) +
1737                        le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncWidth);
1738
1739                mode->flags = 0;
1740                misc = le16_to_cpu(tv_info->aModeTimings[index].susModeMiscInfo.usAccess);
1741                if (misc & ATOM_VSYNC_POLARITY)
1742                        mode->flags |= DRM_MODE_FLAG_NVSYNC;
1743                if (misc & ATOM_HSYNC_POLARITY)
1744                        mode->flags |= DRM_MODE_FLAG_NHSYNC;
1745                if (misc & ATOM_COMPOSITESYNC)
1746                        mode->flags |= DRM_MODE_FLAG_CSYNC;
1747                if (misc & ATOM_INTERLACE)
1748                        mode->flags |= DRM_MODE_FLAG_INTERLACE;
1749                if (misc & ATOM_DOUBLE_CLOCK_MODE)
1750                        mode->flags |= DRM_MODE_FLAG_DBLSCAN;
1751
1752                mode->clock = le16_to_cpu(tv_info->aModeTimings[index].usPixelClock) * 10;
1753
1754                if (index == 1) {
1755                        /* PAL timings appear to have wrong values for totals */
1756                        mode->crtc_htotal -= 1;
1757                        mode->crtc_vtotal -= 1;
1758                }
1759                break;
1760        case 2:
1761                tv_info_v1_2 = (ATOM_ANALOG_TV_INFO_V1_2 *)(mode_info->atom_context->bios + data_offset);
1762                if (index >= MAX_SUPPORTED_TV_TIMING_V1_2)
1763                        return false;
1764
1765                dtd_timings = &tv_info_v1_2->aModeTimings[index];
1766                mode->crtc_htotal = le16_to_cpu(dtd_timings->usHActive) +
1767                        le16_to_cpu(dtd_timings->usHBlanking_Time);
1768                mode->crtc_hdisplay = le16_to_cpu(dtd_timings->usHActive);
1769                mode->crtc_hsync_start = le16_to_cpu(dtd_timings->usHActive) +
1770                        le16_to_cpu(dtd_timings->usHSyncOffset);
1771                mode->crtc_hsync_end = mode->crtc_hsync_start +
1772                        le16_to_cpu(dtd_timings->usHSyncWidth);
1773
1774                mode->crtc_vtotal = le16_to_cpu(dtd_timings->usVActive) +
1775                        le16_to_cpu(dtd_timings->usVBlanking_Time);
1776                mode->crtc_vdisplay = le16_to_cpu(dtd_timings->usVActive);
1777                mode->crtc_vsync_start = le16_to_cpu(dtd_timings->usVActive) +
1778                        le16_to_cpu(dtd_timings->usVSyncOffset);
1779                mode->crtc_vsync_end = mode->crtc_vsync_start +
1780                        le16_to_cpu(dtd_timings->usVSyncWidth);
1781
1782                mode->flags = 0;
1783                misc = le16_to_cpu(dtd_timings->susModeMiscInfo.usAccess);
1784                if (misc & ATOM_VSYNC_POLARITY)
1785                        mode->flags |= DRM_MODE_FLAG_NVSYNC;
1786                if (misc & ATOM_HSYNC_POLARITY)
1787                        mode->flags |= DRM_MODE_FLAG_NHSYNC;
1788                if (misc & ATOM_COMPOSITESYNC)
1789                        mode->flags |= DRM_MODE_FLAG_CSYNC;
1790                if (misc & ATOM_INTERLACE)
1791                        mode->flags |= DRM_MODE_FLAG_INTERLACE;
1792                if (misc & ATOM_DOUBLE_CLOCK_MODE)
1793                        mode->flags |= DRM_MODE_FLAG_DBLSCAN;
1794
1795                mode->clock = le16_to_cpu(dtd_timings->usPixClk) * 10;
1796                break;
1797        }
1798        return true;
1799}
1800
1801enum radeon_tv_std
1802radeon_atombios_get_tv_info(struct radeon_device *rdev)
1803{
1804        struct radeon_mode_info *mode_info = &rdev->mode_info;
1805        int index = GetIndexIntoMasterTable(DATA, AnalogTV_Info);
1806        uint16_t data_offset;
1807        uint8_t frev, crev;
1808        struct _ATOM_ANALOG_TV_INFO *tv_info;
1809        enum radeon_tv_std tv_std = TV_STD_NTSC;
1810
1811        if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1812                                   &frev, &crev, &data_offset)) {
1813
1814                tv_info = (struct _ATOM_ANALOG_TV_INFO *)
1815                        (mode_info->atom_context->bios + data_offset);
1816
1817                switch (tv_info->ucTV_BootUpDefaultStandard) {
1818                case ATOM_TV_NTSC:
1819                        tv_std = TV_STD_NTSC;
1820                        DRM_DEBUG_KMS("Default TV standard: NTSC\n");
1821                        break;
1822                case ATOM_TV_NTSCJ:
1823                        tv_std = TV_STD_NTSC_J;
1824                        DRM_DEBUG_KMS("Default TV standard: NTSC-J\n");
1825                        break;
1826                case ATOM_TV_PAL:
1827                        tv_std = TV_STD_PAL;
1828                        DRM_DEBUG_KMS("Default TV standard: PAL\n");
1829                        break;
1830                case ATOM_TV_PALM:
1831                        tv_std = TV_STD_PAL_M;
1832                        DRM_DEBUG_KMS("Default TV standard: PAL-M\n");
1833                        break;
1834                case ATOM_TV_PALN:
1835                        tv_std = TV_STD_PAL_N;
1836                        DRM_DEBUG_KMS("Default TV standard: PAL-N\n");
1837                        break;
1838                case ATOM_TV_PALCN:
1839                        tv_std = TV_STD_PAL_CN;
1840                        DRM_DEBUG_KMS("Default TV standard: PAL-CN\n");
1841                        break;
1842                case ATOM_TV_PAL60:
1843                        tv_std = TV_STD_PAL_60;
1844                        DRM_DEBUG_KMS("Default TV standard: PAL-60\n");
1845                        break;
1846                case ATOM_TV_SECAM:
1847                        tv_std = TV_STD_SECAM;
1848                        DRM_DEBUG_KMS("Default TV standard: SECAM\n");
1849                        break;
1850                default:
1851                        tv_std = TV_STD_NTSC;
1852                        DRM_DEBUG_KMS("Unknown TV standard; defaulting to NTSC\n");
1853                        break;
1854                }
1855        }
1856        return tv_std;
1857}
1858
1859struct radeon_encoder_tv_dac *
1860radeon_atombios_get_tv_dac_info(struct radeon_encoder *encoder)
1861{
1862        struct drm_device *dev = encoder->base.dev;
1863        struct radeon_device *rdev = dev->dev_private;
1864        struct radeon_mode_info *mode_info = &rdev->mode_info;
1865        int index = GetIndexIntoMasterTable(DATA, CompassionateData);
1866        uint16_t data_offset;
1867        struct _COMPASSIONATE_DATA *dac_info;
1868        uint8_t frev, crev;
1869        uint8_t bg, dac;
1870        struct radeon_encoder_tv_dac *tv_dac = NULL;
1871
1872        if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1873                                   &frev, &crev, &data_offset)) {
1874
1875                dac_info = (struct _COMPASSIONATE_DATA *)
1876                        (mode_info->atom_context->bios + data_offset);
1877
1878                tv_dac = kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL);
1879
1880                if (!tv_dac)
1881                        return NULL;
1882
1883                bg = dac_info->ucDAC2_CRT2_BG_Adjustment;
1884                dac = dac_info->ucDAC2_CRT2_DAC_Adjustment;
1885                tv_dac->ps2_tvdac_adj = (bg << 16) | (dac << 20);
1886
1887                bg = dac_info->ucDAC2_PAL_BG_Adjustment;
1888                dac = dac_info->ucDAC2_PAL_DAC_Adjustment;
1889                tv_dac->pal_tvdac_adj = (bg << 16) | (dac << 20);
1890
1891                bg = dac_info->ucDAC2_NTSC_BG_Adjustment;
1892                dac = dac_info->ucDAC2_NTSC_DAC_Adjustment;
1893                tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20);
1894
1895                tv_dac->tv_std = radeon_atombios_get_tv_info(rdev);
1896        }
1897        return tv_dac;
1898}
1899
1900static const char *thermal_controller_names[] = {
1901        "NONE",
1902        "lm63",
1903        "adm1032",
1904        "adm1030",
1905        "max6649",
1906        "lm64",
1907        "f75375",
1908        "asc7xxx",
1909};
1910
1911static const char *pp_lib_thermal_controller_names[] = {
1912        "NONE",
1913        "lm63",
1914        "adm1032",
1915        "adm1030",
1916        "max6649",
1917        "lm64",
1918        "f75375",
1919        "RV6xx",
1920        "RV770",
1921        "adt7473",
1922        "NONE",
1923        "External GPIO",
1924        "Evergreen",
1925        "emc2103",
1926        "Sumo",
1927        "Northern Islands",
1928        "Southern Islands",
1929        "lm96163",
1930};
1931
1932union power_info {
1933        struct _ATOM_POWERPLAY_INFO info;
1934        struct _ATOM_POWERPLAY_INFO_V2 info_2;
1935        struct _ATOM_POWERPLAY_INFO_V3 info_3;
1936        struct _ATOM_PPLIB_POWERPLAYTABLE pplib;
1937        struct _ATOM_PPLIB_POWERPLAYTABLE2 pplib2;
1938        struct _ATOM_PPLIB_POWERPLAYTABLE3 pplib3;
1939};
1940
1941union pplib_clock_info {
1942        struct _ATOM_PPLIB_R600_CLOCK_INFO r600;
1943        struct _ATOM_PPLIB_RS780_CLOCK_INFO rs780;
1944        struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO evergreen;
1945        struct _ATOM_PPLIB_SUMO_CLOCK_INFO sumo;
1946        struct _ATOM_PPLIB_SI_CLOCK_INFO si;
1947};
1948
1949union pplib_power_state {
1950        struct _ATOM_PPLIB_STATE v1;
1951        struct _ATOM_PPLIB_STATE_V2 v2;
1952};
1953
1954static void radeon_atombios_parse_misc_flags_1_3(struct radeon_device *rdev,
1955                                                 int state_index,
1956                                                 u32 misc, u32 misc2)
1957{
1958        rdev->pm.power_state[state_index].misc = misc;
1959        rdev->pm.power_state[state_index].misc2 = misc2;
1960        /* order matters! */
1961        if (misc & ATOM_PM_MISCINFO_POWER_SAVING_MODE)
1962                rdev->pm.power_state[state_index].type =
1963                        POWER_STATE_TYPE_POWERSAVE;
1964        if (misc & ATOM_PM_MISCINFO_DEFAULT_DC_STATE_ENTRY_TRUE)
1965                rdev->pm.power_state[state_index].type =
1966                        POWER_STATE_TYPE_BATTERY;
1967        if (misc & ATOM_PM_MISCINFO_DEFAULT_LOW_DC_STATE_ENTRY_TRUE)
1968                rdev->pm.power_state[state_index].type =
1969                        POWER_STATE_TYPE_BATTERY;
1970        if (misc & ATOM_PM_MISCINFO_LOAD_BALANCE_EN)
1971                rdev->pm.power_state[state_index].type =
1972                        POWER_STATE_TYPE_BALANCED;
1973        if (misc & ATOM_PM_MISCINFO_3D_ACCELERATION_EN) {
1974                rdev->pm.power_state[state_index].type =
1975                        POWER_STATE_TYPE_PERFORMANCE;
1976                rdev->pm.power_state[state_index].flags &=
1977                        ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
1978        }
1979        if (misc2 & ATOM_PM_MISCINFO2_SYSTEM_AC_LITE_MODE)
1980                rdev->pm.power_state[state_index].type =
1981                        POWER_STATE_TYPE_BALANCED;
1982        if (misc & ATOM_PM_MISCINFO_DRIVER_DEFAULT_MODE) {
1983                rdev->pm.power_state[state_index].type =
1984                        POWER_STATE_TYPE_DEFAULT;
1985                rdev->pm.default_power_state_index = state_index;
1986                rdev->pm.power_state[state_index].default_clock_mode =
1987                        &rdev->pm.power_state[state_index].clock_info[0];
1988        } else if (state_index == 0) {
1989                rdev->pm.power_state[state_index].clock_info[0].flags |=
1990                        RADEON_PM_MODE_NO_DISPLAY;
1991        }
1992}
1993
1994static int radeon_atombios_parse_power_table_1_3(struct radeon_device *rdev)
1995{
1996        struct radeon_mode_info *mode_info = &rdev->mode_info;
1997        u32 misc, misc2 = 0;
1998        int num_modes = 0, i;
1999        int state_index = 0;
2000        struct radeon_i2c_bus_rec i2c_bus;
2001        union power_info *power_info;
2002        int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2003        u16 data_offset;
2004        u8 frev, crev;
2005
2006        if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2007                                   &frev, &crev, &data_offset))
2008                return state_index;
2009        power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2010
2011        /* add the i2c bus for thermal/fan chip */
2012        if ((power_info->info.ucOverdriveThermalController > 0) &&
2013            (power_info->info.ucOverdriveThermalController < ARRAY_SIZE(thermal_controller_names))) {
2014                DRM_INFO("Possible %s thermal controller at 0x%02x\n",
2015                         thermal_controller_names[power_info->info.ucOverdriveThermalController],
2016                         power_info->info.ucOverdriveControllerAddress >> 1);
2017                i2c_bus = radeon_lookup_i2c_gpio(rdev, power_info->info.ucOverdriveI2cLine);
2018                rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
2019                if (rdev->pm.i2c_bus) {
2020                        struct i2c_board_info info = { };
2021                        const char *name = thermal_controller_names[power_info->info.
2022                                                                    ucOverdriveThermalController];
2023                        info.addr = power_info->info.ucOverdriveControllerAddress >> 1;
2024                        strlcpy(info.type, name, sizeof(info.type));
2025                        i2c_new_device(&rdev->pm.i2c_bus->adapter, &info);
2026                }
2027        }
2028        num_modes = power_info->info.ucNumOfPowerModeEntries;
2029        if (num_modes > ATOM_MAX_NUMBEROF_POWER_BLOCK)
2030                num_modes = ATOM_MAX_NUMBEROF_POWER_BLOCK;
2031        if (num_modes == 0)
2032                return state_index;
2033        rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) * num_modes, GFP_KERNEL);
2034        if (!rdev->pm.power_state)
2035                return state_index;
2036        /* last mode is usually default, array is low to high */
2037        for (i = 0; i < num_modes; i++) {
2038                rdev->pm.power_state[state_index].clock_info =
2039                        kzalloc(sizeof(struct radeon_pm_clock_info) * 1, GFP_KERNEL);
2040                if (!rdev->pm.power_state[state_index].clock_info)
2041                        return state_index;
2042                rdev->pm.power_state[state_index].num_clock_modes = 1;
2043                rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
2044                switch (frev) {
2045                case 1:
2046                        rdev->pm.power_state[state_index].clock_info[0].mclk =
2047                                le16_to_cpu(power_info->info.asPowerPlayInfo[i].usMemoryClock);
2048                        rdev->pm.power_state[state_index].clock_info[0].sclk =
2049                                le16_to_cpu(power_info->info.asPowerPlayInfo[i].usEngineClock);
2050                        /* skip invalid modes */
2051                        if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2052                            (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2053                                continue;
2054                        rdev->pm.power_state[state_index].pcie_lanes =
2055                                power_info->info.asPowerPlayInfo[i].ucNumPciELanes;
2056                        misc = le32_to_cpu(power_info->info.asPowerPlayInfo[i].ulMiscInfo);
2057                        if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2058                            (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2059                                rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2060                                        VOLTAGE_GPIO;
2061                                rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2062                                        radeon_lookup_gpio(rdev,
2063                                                           power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex);
2064                                if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2065                                        rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2066                                                true;
2067                                else
2068                                        rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2069                                                false;
2070                        } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2071                                rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2072                                        VOLTAGE_VDDC;
2073                                rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2074                                        power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex;
2075                        }
2076                        rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2077                        radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, 0);
2078                        state_index++;
2079                        break;
2080                case 2:
2081                        rdev->pm.power_state[state_index].clock_info[0].mclk =
2082                                le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMemoryClock);
2083                        rdev->pm.power_state[state_index].clock_info[0].sclk =
2084                                le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulEngineClock);
2085                        /* skip invalid modes */
2086                        if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2087                            (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2088                                continue;
2089                        rdev->pm.power_state[state_index].pcie_lanes =
2090                                power_info->info_2.asPowerPlayInfo[i].ucNumPciELanes;
2091                        misc = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo);
2092                        misc2 = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo2);
2093                        if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2094                            (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2095                                rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2096                                        VOLTAGE_GPIO;
2097                                rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2098                                        radeon_lookup_gpio(rdev,
2099                                                           power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex);
2100                                if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2101                                        rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2102                                                true;
2103                                else
2104                                        rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2105                                                false;
2106                        } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2107                                rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2108                                        VOLTAGE_VDDC;
2109                                rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2110                                        power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex;
2111                        }
2112                        rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2113                        radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, misc2);
2114                        state_index++;
2115                        break;
2116                case 3:
2117                        rdev->pm.power_state[state_index].clock_info[0].mclk =
2118                                le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMemoryClock);
2119                        rdev->pm.power_state[state_index].clock_info[0].sclk =
2120                                le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulEngineClock);
2121                        /* skip invalid modes */
2122                        if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2123                            (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2124                                continue;
2125                        rdev->pm.power_state[state_index].pcie_lanes =
2126                                power_info->info_3.asPowerPlayInfo[i].ucNumPciELanes;
2127                        misc = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo);
2128                        misc2 = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo2);
2129                        if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2130                            (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2131                                rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2132                                        VOLTAGE_GPIO;
2133                                rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2134                                        radeon_lookup_gpio(rdev,
2135                                                           power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex);
2136                                if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2137                                        rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2138                                                true;
2139                                else
2140                                        rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2141                                                false;
2142                        } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2143                                rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2144                                        VOLTAGE_VDDC;
2145                                rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2146                                        power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex;
2147                                if (misc2 & ATOM_PM_MISCINFO2_VDDCI_DYNAMIC_VOLTAGE_EN) {
2148                                        rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_enabled =
2149                                                true;
2150                                        rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_id =
2151                                                power_info->info_3.asPowerPlayInfo[i].ucVDDCI_VoltageDropIndex;
2152                                }
2153                        }
2154                        rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2155                        radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, misc2);
2156                        state_index++;
2157                        break;
2158                }
2159        }
2160        /* last mode is usually default */
2161        if (rdev->pm.default_power_state_index == -1) {
2162                rdev->pm.power_state[state_index - 1].type =
2163                        POWER_STATE_TYPE_DEFAULT;
2164                rdev->pm.default_power_state_index = state_index - 1;
2165                rdev->pm.power_state[state_index - 1].default_clock_mode =
2166                        &rdev->pm.power_state[state_index - 1].clock_info[0];
2167                rdev->pm.power_state[state_index].flags &=
2168                        ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2169                rdev->pm.power_state[state_index].misc = 0;
2170                rdev->pm.power_state[state_index].misc2 = 0;
2171        }
2172        return state_index;
2173}
2174
2175static void radeon_atombios_add_pplib_thermal_controller(struct radeon_device *rdev,
2176                                                         ATOM_PPLIB_THERMALCONTROLLER *controller)
2177{
2178        struct radeon_i2c_bus_rec i2c_bus;
2179
2180        /* add the i2c bus for thermal/fan chip */
2181        if (controller->ucType > 0) {
2182                if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV6xx) {
2183                        DRM_INFO("Internal thermal controller %s fan control\n",
2184                                 (controller->ucFanParameters &
2185                                  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2186                        rdev->pm.int_thermal_type = THERMAL_TYPE_RV6XX;
2187                } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV770) {
2188                        DRM_INFO("Internal thermal controller %s fan control\n",
2189                                 (controller->ucFanParameters &
2190                                  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2191                        rdev->pm.int_thermal_type = THERMAL_TYPE_RV770;
2192                } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_EVERGREEN) {
2193                        DRM_INFO("Internal thermal controller %s fan control\n",
2194                                 (controller->ucFanParameters &
2195                                  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2196                        rdev->pm.int_thermal_type = THERMAL_TYPE_EVERGREEN;
2197                } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_SUMO) {
2198                        DRM_INFO("Internal thermal controller %s fan control\n",
2199                                 (controller->ucFanParameters &
2200                                  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2201                        rdev->pm.int_thermal_type = THERMAL_TYPE_SUMO;
2202                } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_NISLANDS) {
2203                        DRM_INFO("Internal thermal controller %s fan control\n",
2204                                 (controller->ucFanParameters &
2205                                  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2206                        rdev->pm.int_thermal_type = THERMAL_TYPE_NI;
2207                } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_SISLANDS) {
2208                        DRM_INFO("Internal thermal controller %s fan control\n",
2209                                 (controller->ucFanParameters &
2210                                  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2211                        rdev->pm.int_thermal_type = THERMAL_TYPE_SI;
2212                } else if ((controller->ucType ==
2213                            ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO) ||
2214                           (controller->ucType ==
2215                            ATOM_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL) ||
2216                           (controller->ucType ==
2217                            ATOM_PP_THERMALCONTROLLER_EMC2103_WITH_INTERNAL)) {
2218                        DRM_INFO("Special thermal controller config\n");
2219                } else if (controller->ucType < ARRAY_SIZE(pp_lib_thermal_controller_names)) {
2220                        DRM_INFO("Possible %s thermal controller at 0x%02x %s fan control\n",
2221                                 pp_lib_thermal_controller_names[controller->ucType],
2222                                 controller->ucI2cAddress >> 1,
2223                                 (controller->ucFanParameters &
2224                                  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2225                        i2c_bus = radeon_lookup_i2c_gpio(rdev, controller->ucI2cLine);
2226                        rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
2227                        if (rdev->pm.i2c_bus) {
2228                                struct i2c_board_info info = { };
2229                                const char *name = pp_lib_thermal_controller_names[controller->ucType];
2230                                info.addr = controller->ucI2cAddress >> 1;
2231                                strlcpy(info.type, name, sizeof(info.type));
2232                                i2c_new_device(&rdev->pm.i2c_bus->adapter, &info);
2233                        }
2234                } else {
2235                        DRM_INFO("Unknown thermal controller type %d at 0x%02x %s fan control\n",
2236                                 controller->ucType,
2237                                 controller->ucI2cAddress >> 1,
2238                                 (controller->ucFanParameters &
2239                                  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2240                }
2241        }
2242}
2243
2244static void radeon_atombios_get_default_voltages(struct radeon_device *rdev,
2245                                                 u16 *vddc, u16 *vddci)
2246{
2247        struct radeon_mode_info *mode_info = &rdev->mode_info;
2248        int index = GetIndexIntoMasterTable(DATA, FirmwareInfo);
2249        u8 frev, crev;
2250        u16 data_offset;
2251        union firmware_info *firmware_info;
2252
2253        *vddc = 0;
2254        *vddci = 0;
2255
2256        if (atom_parse_data_header(mode_info->atom_context, index, NULL,
2257                                   &frev, &crev, &data_offset)) {
2258                firmware_info =
2259                        (union firmware_info *)(mode_info->atom_context->bios +
2260                                                data_offset);
2261                *vddc = le16_to_cpu(firmware_info->info_14.usBootUpVDDCVoltage);
2262                if ((frev == 2) && (crev >= 2))
2263                        *vddci = le16_to_cpu(firmware_info->info_22.usBootUpVDDCIVoltage);
2264        }
2265}
2266
2267static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rdev,
2268                                                       int state_index, int mode_index,
2269                                                       struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info)
2270{
2271        int j;
2272        u32 misc = le32_to_cpu(non_clock_info->ulCapsAndSettings);
2273        u32 misc2 = le16_to_cpu(non_clock_info->usClassification);
2274        u16 vddc, vddci;
2275
2276        radeon_atombios_get_default_voltages(rdev, &vddc, &vddci);
2277
2278        rdev->pm.power_state[state_index].misc = misc;
2279        rdev->pm.power_state[state_index].misc2 = misc2;
2280        rdev->pm.power_state[state_index].pcie_lanes =
2281                ((misc & ATOM_PPLIB_PCIE_LINK_WIDTH_MASK) >>
2282                 ATOM_PPLIB_PCIE_LINK_WIDTH_SHIFT) + 1;
2283        switch (misc2 & ATOM_PPLIB_CLASSIFICATION_UI_MASK) {
2284        case ATOM_PPLIB_CLASSIFICATION_UI_BATTERY:
2285                rdev->pm.power_state[state_index].type =
2286                        POWER_STATE_TYPE_BATTERY;
2287                break;
2288        case ATOM_PPLIB_CLASSIFICATION_UI_BALANCED:
2289                rdev->pm.power_state[state_index].type =
2290                        POWER_STATE_TYPE_BALANCED;
2291                break;
2292        case ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE:
2293                rdev->pm.power_state[state_index].type =
2294                        POWER_STATE_TYPE_PERFORMANCE;
2295                break;
2296        case ATOM_PPLIB_CLASSIFICATION_UI_NONE:
2297                if (misc2 & ATOM_PPLIB_CLASSIFICATION_3DPERFORMANCE)
2298                        rdev->pm.power_state[state_index].type =
2299                                POWER_STATE_TYPE_PERFORMANCE;
2300                break;
2301        }
2302        rdev->pm.power_state[state_index].flags = 0;
2303        if (misc & ATOM_PPLIB_SINGLE_DISPLAY_ONLY)
2304                rdev->pm.power_state[state_index].flags |=
2305                        RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2306        if (misc2 & ATOM_PPLIB_CLASSIFICATION_BOOT) {
2307                rdev->pm.power_state[state_index].type =
2308                        POWER_STATE_TYPE_DEFAULT;
2309                rdev->pm.default_power_state_index = state_index;
2310                rdev->pm.power_state[state_index].default_clock_mode =
2311                        &rdev->pm.power_state[state_index].clock_info[mode_index - 1];
2312                if ((rdev->family >= CHIP_BARTS) && !(rdev->flags & RADEON_IS_IGP)) {
2313                        /* NI chips post without MC ucode, so default clocks are strobe mode only */
2314                        rdev->pm.default_sclk = rdev->pm.power_state[state_index].clock_info[0].sclk;
2315                        rdev->pm.default_mclk = rdev->pm.power_state[state_index].clock_info[0].mclk;
2316                        rdev->pm.default_vddc = rdev->pm.power_state[state_index].clock_info[0].voltage.voltage;
2317                        rdev->pm.default_vddci = rdev->pm.power_state[state_index].clock_info[0].voltage.vddci;
2318                } else {
2319                        /* patch the table values with the default slck/mclk from firmware info */
2320                        for (j = 0; j < mode_index; j++) {
2321                                rdev->pm.power_state[state_index].clock_info[j].mclk =
2322                                        rdev->clock.default_mclk;
2323                                rdev->pm.power_state[state_index].clock_info[j].sclk =
2324                                        rdev->clock.default_sclk;
2325                                if (vddc)
2326                                        rdev->pm.power_state[state_index].clock_info[j].voltage.voltage =
2327                                                vddc;
2328                        }
2329                }
2330        }
2331}
2332
2333static bool radeon_atombios_parse_pplib_clock_info(struct radeon_device *rdev,
2334                                                   int state_index, int mode_index,
2335                                                   union pplib_clock_info *clock_info)
2336{
2337        u32 sclk, mclk;
2338        u16 vddc;
2339
2340        if (rdev->flags & RADEON_IS_IGP) {
2341                if (rdev->family >= CHIP_PALM) {
2342                        sclk = le16_to_cpu(clock_info->sumo.usEngineClockLow);
2343                        sclk |= clock_info->sumo.ucEngineClockHigh << 16;
2344                        rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2345                } else {
2346                        sclk = le16_to_cpu(clock_info->rs780.usLowEngineClockLow);
2347                        sclk |= clock_info->rs780.ucLowEngineClockHigh << 16;
2348                        rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2349                }
2350        } else if (rdev->family >= CHIP_TAHITI) {
2351                sclk = le16_to_cpu(clock_info->si.usEngineClockLow);
2352                sclk |= clock_info->si.ucEngineClockHigh << 16;
2353                mclk = le16_to_cpu(clock_info->si.usMemoryClockLow);
2354                mclk |= clock_info->si.ucMemoryClockHigh << 16;
2355                rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk;
2356                rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2357                rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2358                        VOLTAGE_SW;
2359                rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
2360                        le16_to_cpu(clock_info->si.usVDDC);
2361                rdev->pm.power_state[state_index].clock_info[mode_index].voltage.vddci =
2362                        le16_to_cpu(clock_info->si.usVDDCI);
2363        } else if (rdev->family >= CHIP_CEDAR) {
2364                sclk = le16_to_cpu(clock_info->evergreen.usEngineClockLow);
2365                sclk |= clock_info->evergreen.ucEngineClockHigh << 16;
2366                mclk = le16_to_cpu(clock_info->evergreen.usMemoryClockLow);
2367                mclk |= clock_info->evergreen.ucMemoryClockHigh << 16;
2368                rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk;
2369                rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2370                rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2371                        VOLTAGE_SW;
2372                rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
2373                        le16_to_cpu(clock_info->evergreen.usVDDC);
2374                rdev->pm.power_state[state_index].clock_info[mode_index].voltage.vddci =
2375                        le16_to_cpu(clock_info->evergreen.usVDDCI);
2376        } else {
2377                sclk = le16_to_cpu(clock_info->r600.usEngineClockLow);
2378                sclk |= clock_info->r600.ucEngineClockHigh << 16;
2379                mclk = le16_to_cpu(clock_info->r600.usMemoryClockLow);
2380                mclk |= clock_info->r600.ucMemoryClockHigh << 16;
2381                rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk;
2382                rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2383                rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2384                        VOLTAGE_SW;
2385                rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
2386                        le16_to_cpu(clock_info->r600.usVDDC);
2387        }
2388
2389        /* patch up vddc if necessary */
2390        switch (rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage) {
2391        case ATOM_VIRTUAL_VOLTAGE_ID0:
2392        case ATOM_VIRTUAL_VOLTAGE_ID1:
2393        case ATOM_VIRTUAL_VOLTAGE_ID2:
2394        case ATOM_VIRTUAL_VOLTAGE_ID3:
2395                if (radeon_atom_get_max_vddc(rdev, VOLTAGE_TYPE_VDDC,
2396                                             rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage,
2397                                             &vddc) == 0)
2398                        rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage = vddc;
2399                break;
2400        default:
2401                break;
2402        }
2403
2404        if (rdev->flags & RADEON_IS_IGP) {
2405                /* skip invalid modes */
2406                if (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0)
2407                        return false;
2408        } else {
2409                /* skip invalid modes */
2410                if ((rdev->pm.power_state[state_index].clock_info[mode_index].mclk == 0) ||
2411                    (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0))
2412                        return false;
2413        }
2414        return true;
2415}
2416
2417static int radeon_atombios_parse_power_table_4_5(struct radeon_device *rdev)
2418{
2419        struct radeon_mode_info *mode_info = &rdev->mode_info;
2420        struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
2421        union pplib_power_state *power_state;
2422        int i, j;
2423        int state_index = 0, mode_index = 0;
2424        union pplib_clock_info *clock_info;
2425        bool valid;
2426        union power_info *power_info;
2427        int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2428        u16 data_offset;
2429        u8 frev, crev;
2430
2431        if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2432                                   &frev, &crev, &data_offset))
2433                return state_index;
2434        power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2435
2436        radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
2437        if (power_info->pplib.ucNumStates == 0)
2438                return state_index;
2439        rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
2440                                       power_info->pplib.ucNumStates, GFP_KERNEL);
2441        if (!rdev->pm.power_state)
2442                return state_index;
2443        /* first mode is usually default, followed by low to high */
2444        for (i = 0; i < power_info->pplib.ucNumStates; i++) {
2445                mode_index = 0;
2446                power_state = (union pplib_power_state *)
2447                        (mode_info->atom_context->bios + data_offset +
2448                         le16_to_cpu(power_info->pplib.usStateArrayOffset) +
2449                         i * power_info->pplib.ucStateEntrySize);
2450                non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
2451                        (mode_info->atom_context->bios + data_offset +
2452                         le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset) +
2453                         (power_state->v1.ucNonClockStateIndex *
2454                          power_info->pplib.ucNonClockSize));
2455                rdev->pm.power_state[i].clock_info = kzalloc(sizeof(struct radeon_pm_clock_info) *
2456                                                             ((power_info->pplib.ucStateEntrySize - 1) ?
2457                                                              (power_info->pplib.ucStateEntrySize - 1) : 1),
2458                                                             GFP_KERNEL);
2459                if (!rdev->pm.power_state[i].clock_info)
2460                        return state_index;
2461                if (power_info->pplib.ucStateEntrySize - 1) {
2462                        for (j = 0; j < (power_info->pplib.ucStateEntrySize - 1); j++) {
2463                                clock_info = (union pplib_clock_info *)
2464                                        (mode_info->atom_context->bios + data_offset +
2465                                         le16_to_cpu(power_info->pplib.usClockInfoArrayOffset) +
2466                                         (power_state->v1.ucClockStateIndices[j] *
2467                                          power_info->pplib.ucClockInfoSize));
2468                                valid = radeon_atombios_parse_pplib_clock_info(rdev,
2469                                                                               state_index, mode_index,
2470                                                                               clock_info);
2471                                if (valid)
2472                                        mode_index++;
2473                        }
2474                } else {
2475                        rdev->pm.power_state[state_index].clock_info[0].mclk =
2476                                rdev->clock.default_mclk;
2477                        rdev->pm.power_state[state_index].clock_info[0].sclk =
2478                                rdev->clock.default_sclk;
2479                        mode_index++;
2480                }
2481                rdev->pm.power_state[state_index].num_clock_modes = mode_index;
2482                if (mode_index) {
2483                        radeon_atombios_parse_pplib_non_clock_info(rdev, state_index, mode_index,
2484                                                                   non_clock_info);
2485                        state_index++;
2486                }
2487        }
2488        /* if multiple clock modes, mark the lowest as no display */
2489        for (i = 0; i < state_index; i++) {
2490                if (rdev->pm.power_state[i].num_clock_modes > 1)
2491                        rdev->pm.power_state[i].clock_info[0].flags |=
2492                                RADEON_PM_MODE_NO_DISPLAY;
2493        }
2494        /* first mode is usually default */
2495        if (rdev->pm.default_power_state_index == -1) {
2496                rdev->pm.power_state[0].type =
2497                        POWER_STATE_TYPE_DEFAULT;
2498                rdev->pm.default_power_state_index = 0;
2499                rdev->pm.power_state[0].default_clock_mode =
2500                        &rdev->pm.power_state[0].clock_info[0];
2501        }
2502        return state_index;
2503}
2504
2505static int radeon_atombios_parse_power_table_6(struct radeon_device *rdev)
2506{
2507        struct radeon_mode_info *mode_info = &rdev->mode_info;
2508        struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
2509        union pplib_power_state *power_state;
2510        int i, j, non_clock_array_index, clock_array_index;
2511        int state_index = 0, mode_index = 0;
2512        union pplib_clock_info *clock_info;
2513        struct _StateArray *state_array;
2514        struct _ClockInfoArray *clock_info_array;
2515        struct _NonClockInfoArray *non_clock_info_array;
2516        bool valid;
2517        union power_info *power_info;
2518        int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2519        u16 data_offset;
2520        u8 frev, crev;
2521        u8 *power_state_offset;
2522
2523        if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2524                                   &frev, &crev, &data_offset))
2525                return state_index;
2526        power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2527
2528        radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
2529        state_array = (struct _StateArray *)
2530                (mode_info->atom_context->bios + data_offset +
2531                 le16_to_cpu(power_info->pplib.usStateArrayOffset));
2532        clock_info_array = (struct _ClockInfoArray *)
2533                (mode_info->atom_context->bios + data_offset +
2534                 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset));
2535        non_clock_info_array = (struct _NonClockInfoArray *)
2536                (mode_info->atom_context->bios + data_offset +
2537                 le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset));
2538        if (state_array->ucNumEntries == 0)
2539                return state_index;
2540        rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
2541                                       state_array->ucNumEntries, GFP_KERNEL);
2542        if (!rdev->pm.power_state)
2543                return state_index;
2544        power_state_offset = (u8 *)state_array->states;
2545        for (i = 0; i < state_array->ucNumEntries; i++) {
2546                mode_index = 0;
2547                power_state = (union pplib_power_state *)power_state_offset;
2548                non_clock_array_index = power_state->v2.nonClockInfoIndex;
2549                non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
2550                        &non_clock_info_array->nonClockInfo[non_clock_array_index];
2551                rdev->pm.power_state[i].clock_info = kzalloc(sizeof(struct radeon_pm_clock_info) *
2552                                                             (power_state->v2.ucNumDPMLevels ?
2553                                                              power_state->v2.ucNumDPMLevels : 1),
2554                                                             GFP_KERNEL);
2555                if (!rdev->pm.power_state[i].clock_info)
2556                        return state_index;
2557                if (power_state->v2.ucNumDPMLevels) {
2558                        for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) {
2559                                clock_array_index = power_state->v2.clockInfoIndex[j];
2560                                clock_info = (union pplib_clock_info *)
2561                                        &clock_info_array->clockInfo[clock_array_index * clock_info_array->ucEntrySize];
2562                                valid = radeon_atombios_parse_pplib_clock_info(rdev,
2563                                                                               state_index, mode_index,
2564                                                                               clock_info);
2565                                if (valid)
2566                                        mode_index++;
2567                        }
2568                } else {
2569                        rdev->pm.power_state[state_index].clock_info[0].mclk =
2570                                rdev->clock.default_mclk;
2571                        rdev->pm.power_state[state_index].clock_info[0].sclk =
2572                                rdev->clock.default_sclk;
2573                        mode_index++;
2574                }
2575                rdev->pm.power_state[state_index].num_clock_modes = mode_index;
2576                if (mode_index) {
2577                        radeon_atombios_parse_pplib_non_clock_info(rdev, state_index, mode_index,
2578                                                                   non_clock_info);
2579                        state_index++;
2580                }
2581                power_state_offset += 2 + power_state->v2.ucNumDPMLevels;
2582        }
2583        /* if multiple clock modes, mark the lowest as no display */
2584        for (i = 0; i < state_index; i++) {
2585                if (rdev->pm.power_state[i].num_clock_modes > 1)
2586                        rdev->pm.power_state[i].clock_info[0].flags |=
2587                                RADEON_PM_MODE_NO_DISPLAY;
2588        }
2589        /* first mode is usually default */
2590        if (rdev->pm.default_power_state_index == -1) {
2591                rdev->pm.power_state[0].type =
2592                        POWER_STATE_TYPE_DEFAULT;
2593                rdev->pm.default_power_state_index = 0;
2594                rdev->pm.power_state[0].default_clock_mode =
2595                        &rdev->pm.power_state[0].clock_info[0];
2596        }
2597        return state_index;
2598}
2599
2600void radeon_atombios_get_power_modes(struct radeon_device *rdev)
2601{
2602        struct radeon_mode_info *mode_info = &rdev->mode_info;
2603        int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2604        u16 data_offset;
2605        u8 frev, crev;
2606        int state_index = 0;
2607
2608        rdev->pm.default_power_state_index = -1;
2609
2610        if (atom_parse_data_header(mode_info->atom_context, index, NULL,
2611                                   &frev, &crev, &data_offset)) {
2612                switch (frev) {
2613                case 1:
2614                case 2:
2615                case 3:
2616                        state_index = radeon_atombios_parse_power_table_1_3(rdev);
2617                        break;
2618                case 4:
2619                case 5:
2620                        state_index = radeon_atombios_parse_power_table_4_5(rdev);
2621                        break;
2622                case 6:
2623                        state_index = radeon_atombios_parse_power_table_6(rdev);
2624                        break;
2625                default:
2626                        break;
2627                }
2628        }
2629
2630        if (state_index == 0) {
2631                rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state), GFP_KERNEL);
2632                if (rdev->pm.power_state) {
2633                        rdev->pm.power_state[0].clock_info =
2634                                kzalloc(sizeof(struct radeon_pm_clock_info) * 1, GFP_KERNEL);
2635                        if (rdev->pm.power_state[0].clock_info) {
2636                                /* add the default mode */
2637                                rdev->pm.power_state[state_index].type =
2638                                        POWER_STATE_TYPE_DEFAULT;
2639                                rdev->pm.power_state[state_index].num_clock_modes = 1;
2640                                rdev->pm.power_state[state_index].clock_info[0].mclk = rdev->clock.default_mclk;
2641                                rdev->pm.power_state[state_index].clock_info[0].sclk = rdev->clock.default_sclk;
2642                                rdev->pm.power_state[state_index].default_clock_mode =
2643                                        &rdev->pm.power_state[state_index].clock_info[0];
2644                                rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
2645                                rdev->pm.power_state[state_index].pcie_lanes = 16;
2646                                rdev->pm.default_power_state_index = state_index;
2647                                rdev->pm.power_state[state_index].flags = 0;
2648                                state_index++;
2649                        }
2650                }
2651        }
2652
2653        rdev->pm.num_power_states = state_index;
2654
2655        rdev->pm.current_power_state_index = rdev->pm.default_power_state_index;
2656        rdev->pm.current_clock_mode_index = 0;
2657        if (rdev->pm.default_power_state_index >= 0)
2658                rdev->pm.current_vddc =
2659                        rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage;
2660        else
2661                rdev->pm.current_vddc = 0;
2662}
2663
2664union get_clock_dividers {
2665        struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS v1;
2666        struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V2 v2;
2667        struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V3 v3;
2668        struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V4 v4;
2669        struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V5 v5;
2670};
2671
2672int radeon_atom_get_clock_dividers(struct radeon_device *rdev,
2673                                   u8 clock_type,
2674                                   u32 clock,
2675                                   bool strobe_mode,
2676                                   struct atom_clock_dividers *dividers)
2677{
2678        union get_clock_dividers args;
2679        int index = GetIndexIntoMasterTable(COMMAND, ComputeMemoryEnginePLL);
2680        u8 frev, crev;
2681
2682        memset(&args, 0, sizeof(args));
2683        memset(dividers, 0, sizeof(struct atom_clock_dividers));
2684
2685        if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
2686                return -EINVAL;
2687
2688        switch (crev) {
2689        case 1:
2690                /* r4xx, r5xx */
2691                args.v1.ucAction = clock_type;
2692                args.v1.ulClock = cpu_to_le32(clock);   /* 10 khz */
2693
2694                atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2695
2696                dividers->post_div = args.v1.ucPostDiv;
2697                dividers->fb_div = args.v1.ucFbDiv;
2698                dividers->enable_post_div = true;
2699                break;
2700        case 2:
2701        case 3:
2702                /* r6xx, r7xx, evergreen, ni */
2703                if (rdev->family <= CHIP_RV770) {
2704                        args.v2.ucAction = clock_type;
2705                        args.v2.ulClock = cpu_to_le32(clock);   /* 10 khz */
2706
2707                        atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2708
2709                        dividers->post_div = args.v2.ucPostDiv;
2710                        dividers->fb_div = le16_to_cpu(args.v2.usFbDiv);
2711                        dividers->ref_div = args.v2.ucAction;
2712                        if (rdev->family == CHIP_RV770) {
2713                                dividers->enable_post_div = (le32_to_cpu(args.v2.ulClock) & (1 << 24)) ?
2714                                        true : false;
2715                                dividers->vco_mode = (le32_to_cpu(args.v2.ulClock) & (1 << 25)) ? 1 : 0;
2716                        } else
2717                                dividers->enable_post_div = (dividers->fb_div & 1) ? true : false;
2718                } else {
2719                        if (clock_type == COMPUTE_ENGINE_PLL_PARAM) {
2720                                args.v3.ulClockParams = cpu_to_le32((clock_type << 24) | clock);
2721
2722                                atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2723
2724                                dividers->post_div = args.v3.ucPostDiv;
2725                                dividers->enable_post_div = (args.v3.ucCntlFlag &
2726                                                             ATOM_PLL_CNTL_FLAG_PLL_POST_DIV_EN) ? true : false;
2727                                dividers->enable_dithen = (args.v3.ucCntlFlag &
2728                                                           ATOM_PLL_CNTL_FLAG_FRACTION_DISABLE) ? false : true;
2729                                dividers->fb_div = le16_to_cpu(args.v3.ulFbDiv.usFbDiv);
2730                                dividers->frac_fb_div = le16_to_cpu(args.v3.ulFbDiv.usFbDivFrac);
2731                                dividers->ref_div = args.v3.ucRefDiv;
2732                                dividers->vco_mode = (args.v3.ucCntlFlag &
2733                                                      ATOM_PLL_CNTL_FLAG_MPLL_VCO_MODE) ? 1 : 0;
2734                        } else {
2735                                args.v5.ulClockParams = cpu_to_le32((clock_type << 24) | clock);
2736                                if (strobe_mode)
2737                                        args.v5.ucInputFlag = ATOM_PLL_INPUT_FLAG_PLL_STROBE_MODE_EN;
2738
2739                                atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2740
2741                                dividers->post_div = args.v5.ucPostDiv;
2742                                dividers->enable_post_div = (args.v5.ucCntlFlag &
2743                                                             ATOM_PLL_CNTL_FLAG_PLL_POST_DIV_EN) ? true : false;
2744                                dividers->enable_dithen = (args.v5.ucCntlFlag &
2745                                                           ATOM_PLL_CNTL_FLAG_FRACTION_DISABLE) ? false : true;
2746                                dividers->whole_fb_div = le16_to_cpu(args.v5.ulFbDiv.usFbDiv);
2747                                dividers->frac_fb_div = le16_to_cpu(args.v5.ulFbDiv.usFbDivFrac);
2748                                dividers->ref_div = args.v5.ucRefDiv;
2749                                dividers->vco_mode = (args.v5.ucCntlFlag &
2750                                                      ATOM_PLL_CNTL_FLAG_MPLL_VCO_MODE) ? 1 : 0;
2751                        }
2752                }
2753                break;
2754        case 4:
2755                /* fusion */
2756                args.v4.ulClock = cpu_to_le32(clock);   /* 10 khz */
2757
2758                atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2759
2760                dividers->post_div = args.v4.ucPostDiv;
2761                dividers->real_clock = le32_to_cpu(args.v4.ulClock);
2762                break;
2763        default:
2764                return -EINVAL;
2765        }
2766        return 0;
2767}
2768
2769void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable)
2770{
2771        DYNAMIC_CLOCK_GATING_PS_ALLOCATION args;
2772        int index = GetIndexIntoMasterTable(COMMAND, DynamicClockGating);
2773
2774        args.ucEnable = enable;
2775
2776        atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2777}
2778
2779uint32_t radeon_atom_get_engine_clock(struct radeon_device *rdev)
2780{
2781        GET_ENGINE_CLOCK_PS_ALLOCATION args;
2782        int index = GetIndexIntoMasterTable(COMMAND, GetEngineClock);
2783
2784        atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2785        return le32_to_cpu(args.ulReturnEngineClock);
2786}
2787
2788uint32_t radeon_atom_get_memory_clock(struct radeon_device *rdev)
2789{
2790        GET_MEMORY_CLOCK_PS_ALLOCATION args;
2791        int index = GetIndexIntoMasterTable(COMMAND, GetMemoryClock);
2792
2793        atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2794        return le32_to_cpu(args.ulReturnMemoryClock);
2795}
2796
2797void radeon_atom_set_engine_clock(struct radeon_device *rdev,
2798                                  uint32_t eng_clock)
2799{
2800        SET_ENGINE_CLOCK_PS_ALLOCATION args;
2801        int index = GetIndexIntoMasterTable(COMMAND, SetEngineClock);
2802
2803        args.ulTargetEngineClock = cpu_to_le32(eng_clock);      /* 10 khz */
2804
2805        atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2806}
2807
2808void radeon_atom_set_memory_clock(struct radeon_device *rdev,
2809                                  uint32_t mem_clock)
2810{
2811        SET_MEMORY_CLOCK_PS_ALLOCATION args;
2812        int index = GetIndexIntoMasterTable(COMMAND, SetMemoryClock);
2813
2814        if (rdev->flags & RADEON_IS_IGP)
2815                return;
2816
2817        args.ulTargetMemoryClock = cpu_to_le32(mem_clock);      /* 10 khz */
2818
2819        atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2820}
2821
2822union set_voltage {
2823        struct _SET_VOLTAGE_PS_ALLOCATION alloc;
2824        struct _SET_VOLTAGE_PARAMETERS v1;
2825        struct _SET_VOLTAGE_PARAMETERS_V2 v2;
2826        struct _SET_VOLTAGE_PARAMETERS_V1_3 v3;
2827};
2828
2829void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type)
2830{
2831        union set_voltage args;
2832        int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
2833        u8 frev, crev, volt_index = voltage_level;
2834
2835        if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
2836                return;
2837
2838        /* 0xff01 is a flag rather then an actual voltage */
2839        if (voltage_level == 0xff01)
2840                return;
2841
2842        switch (crev) {
2843        case 1:
2844                args.v1.ucVoltageType = voltage_type;
2845                args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE;
2846                args.v1.ucVoltageIndex = volt_index;
2847                break;
2848        case 2:
2849                args.v2.ucVoltageType = voltage_type;
2850                args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE;
2851                args.v2.usVoltageLevel = cpu_to_le16(voltage_level);
2852                break;
2853        case 3:
2854                args.v3.ucVoltageType = voltage_type;
2855                args.v3.ucVoltageMode = ATOM_SET_VOLTAGE;
2856                args.v3.usVoltageLevel = cpu_to_le16(voltage_level);
2857                break;
2858        default:
2859                DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
2860                return;
2861        }
2862
2863        atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2864}
2865
2866static int radeon_atom_get_max_vddc(struct radeon_device *rdev, u8 voltage_type,
2867                                    u16 voltage_id, u16 *voltage)
2868{
2869        union set_voltage args;
2870        int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
2871        u8 frev, crev;
2872
2873        if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
2874                return -EINVAL;
2875
2876        switch (crev) {
2877        case 1:
2878                return -EINVAL;
2879        case 2:
2880                args.v2.ucVoltageType = SET_VOLTAGE_GET_MAX_VOLTAGE;
2881                args.v2.ucVoltageMode = 0;
2882                args.v2.usVoltageLevel = 0;
2883
2884                atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2885
2886                *voltage = le16_to_cpu(args.v2.usVoltageLevel);
2887                break;
2888        case 3:
2889                args.v3.ucVoltageType = voltage_type;
2890                args.v3.ucVoltageMode = ATOM_GET_VOLTAGE_LEVEL;
2891                args.v3.usVoltageLevel = cpu_to_le16(voltage_id);
2892
2893                atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2894
2895                *voltage = le16_to_cpu(args.v3.usVoltageLevel);
2896                break;
2897        default:
2898                DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
2899                return -EINVAL;
2900        }
2901
2902        return 0;
2903}
2904
2905void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
2906{
2907        struct radeon_device *rdev = dev->dev_private;
2908        uint32_t bios_2_scratch, bios_6_scratch;
2909
2910        if (rdev->family >= CHIP_R600) {
2911                bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH);
2912                bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
2913        } else {
2914                bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH);
2915                bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
2916        }
2917
2918        /* let the bios control the backlight */
2919        bios_2_scratch &= ~ATOM_S2_VRI_BRIGHT_ENABLE;
2920
2921        /* tell the bios not to handle mode switching */
2922        bios_6_scratch |= ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH;
2923
2924        if (rdev->family >= CHIP_R600) {
2925                WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
2926                WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
2927        } else {
2928                WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
2929                WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
2930        }
2931
2932}
2933
2934void radeon_save_bios_scratch_regs(struct radeon_device *rdev)
2935{
2936        uint32_t scratch_reg;
2937        int i;
2938
2939        if (rdev->family >= CHIP_R600)
2940                scratch_reg = R600_BIOS_0_SCRATCH;
2941        else
2942                scratch_reg = RADEON_BIOS_0_SCRATCH;
2943
2944        for (i = 0; i < RADEON_BIOS_NUM_SCRATCH; i++)
2945                rdev->bios_scratch[i] = RREG32(scratch_reg + (i * 4));
2946}
2947
2948void radeon_restore_bios_scratch_regs(struct radeon_device *rdev)
2949{
2950        uint32_t scratch_reg;
2951        int i;
2952
2953        if (rdev->family >= CHIP_R600)
2954                scratch_reg = R600_BIOS_0_SCRATCH;
2955        else
2956                scratch_reg = RADEON_BIOS_0_SCRATCH;
2957
2958        for (i = 0; i < RADEON_BIOS_NUM_SCRATCH; i++)
2959                WREG32(scratch_reg + (i * 4), rdev->bios_scratch[i]);
2960}
2961
2962void radeon_atom_output_lock(struct drm_encoder *encoder, bool lock)
2963{
2964        struct drm_device *dev = encoder->dev;
2965        struct radeon_device *rdev = dev->dev_private;
2966        uint32_t bios_6_scratch;
2967
2968        if (rdev->family >= CHIP_R600)
2969                bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
2970        else
2971                bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
2972
2973        if (lock) {
2974                bios_6_scratch |= ATOM_S6_CRITICAL_STATE;
2975                bios_6_scratch &= ~ATOM_S6_ACC_MODE;
2976        } else {
2977                bios_6_scratch &= ~ATOM_S6_CRITICAL_STATE;
2978                bios_6_scratch |= ATOM_S6_ACC_MODE;
2979        }
2980
2981        if (rdev->family >= CHIP_R600)
2982                WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
2983        else
2984                WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
2985}
2986
2987/* at some point we may want to break this out into individual functions */
2988void
2989radeon_atombios_connected_scratch_regs(struct drm_connector *connector,
2990                                       struct drm_encoder *encoder,
2991                                       bool connected)
2992{
2993        struct drm_device *dev = connector->dev;
2994        struct radeon_device *rdev = dev->dev_private;
2995        struct radeon_connector *radeon_connector =
2996            to_radeon_connector(connector);
2997        struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2998        uint32_t bios_0_scratch, bios_3_scratch, bios_6_scratch;
2999
3000        if (rdev->family >= CHIP_R600) {
3001                bios_0_scratch = RREG32(R600_BIOS_0_SCRATCH);
3002                bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH);
3003                bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
3004        } else {
3005                bios_0_scratch = RREG32(RADEON_BIOS_0_SCRATCH);
3006                bios_3_scratch = RREG32(RADEON_BIOS_3_SCRATCH);
3007                bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
3008        }
3009
3010        if ((radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) &&
3011            (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT)) {
3012                if (connected) {
3013                        DRM_DEBUG_KMS("TV1 connected\n");
3014                        bios_3_scratch |= ATOM_S3_TV1_ACTIVE;
3015                        bios_6_scratch |= ATOM_S6_ACC_REQ_TV1;
3016                } else {
3017                        DRM_DEBUG_KMS("TV1 disconnected\n");
3018                        bios_0_scratch &= ~ATOM_S0_TV1_MASK;
3019                        bios_3_scratch &= ~ATOM_S3_TV1_ACTIVE;
3020                        bios_6_scratch &= ~ATOM_S6_ACC_REQ_TV1;
3021                }
3022        }
3023        if ((radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) &&
3024            (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT)) {
3025                if (connected) {
3026                        DRM_DEBUG_KMS("CV connected\n");
3027                        bios_3_scratch |= ATOM_S3_CV_ACTIVE;
3028                        bios_6_scratch |= ATOM_S6_ACC_REQ_CV;
3029                } else {
3030                        DRM_DEBUG_KMS("CV disconnected\n");
3031                        bios_0_scratch &= ~ATOM_S0_CV_MASK;
3032                        bios_3_scratch &= ~ATOM_S3_CV_ACTIVE;
3033                        bios_6_scratch &= ~ATOM_S6_ACC_REQ_CV;
3034                }
3035        }
3036        if ((radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) &&
3037            (radeon_connector->devices & ATOM_DEVICE_LCD1_SUPPORT)) {
3038                if (connected) {
3039                        DRM_DEBUG_KMS("LCD1 connected\n");
3040                        bios_0_scratch |= ATOM_S0_LCD1;
3041                        bios_3_scratch |= ATOM_S3_LCD1_ACTIVE;
3042                        bios_6_scratch |= ATOM_S6_ACC_REQ_LCD1;
3043                } else {
3044                        DRM_DEBUG_KMS("LCD1 disconnected\n");
3045                        bios_0_scratch &= ~ATOM_S0_LCD1;
3046                        bios_3_scratch &= ~ATOM_S3_LCD1_ACTIVE;
3047                        bios_6_scratch &= ~ATOM_S6_ACC_REQ_LCD1;
3048                }
3049        }
3050        if ((radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) &&
3051            (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT)) {
3052                if (connected) {
3053                        DRM_DEBUG_KMS("CRT1 connected\n");
3054                        bios_0_scratch |= ATOM_S0_CRT1_COLOR;
3055                        bios_3_scratch |= ATOM_S3_CRT1_ACTIVE;
3056                        bios_6_scratch |= ATOM_S6_ACC_REQ_CRT1;
3057                } else {
3058                        DRM_DEBUG_KMS("CRT1 disconnected\n");
3059                        bios_0_scratch &= ~ATOM_S0_CRT1_MASK;
3060                        bios_3_scratch &= ~ATOM_S3_CRT1_ACTIVE;
3061                        bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT1;
3062                }
3063        }
3064        if ((radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) &&
3065            (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT)) {
3066                if (connected) {
3067                        DRM_DEBUG_KMS("CRT2 connected\n");
3068                        bios_0_scratch |= ATOM_S0_CRT2_COLOR;
3069                        bios_3_scratch |= ATOM_S3_CRT2_ACTIVE;
3070                        bios_6_scratch |= ATOM_S6_ACC_REQ_CRT2;
3071                } else {
3072                        DRM_DEBUG_KMS("CRT2 disconnected\n");
3073                        bios_0_scratch &= ~ATOM_S0_CRT2_MASK;
3074                        bios_3_scratch &= ~ATOM_S3_CRT2_ACTIVE;
3075                        bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT2;
3076                }
3077        }
3078        if ((radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) &&
3079            (radeon_connector->devices & ATOM_DEVICE_DFP1_SUPPORT)) {
3080                if (connected) {
3081                        DRM_DEBUG_KMS("DFP1 connected\n");
3082                        bios_0_scratch |= ATOM_S0_DFP1;
3083                        bios_3_scratch |= ATOM_S3_DFP1_ACTIVE;
3084                        bios_6_scratch |= ATOM_S6_ACC_REQ_DFP1;
3085                } else {
3086                        DRM_DEBUG_KMS("DFP1 disconnected\n");
3087                        bios_0_scratch &= ~ATOM_S0_DFP1;
3088                        bios_3_scratch &= ~ATOM_S3_DFP1_ACTIVE;
3089                        bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP1;
3090                }
3091        }
3092        if ((radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) &&
3093            (radeon_connector->devices & ATOM_DEVICE_DFP2_SUPPORT)) {
3094                if (connected) {
3095                        DRM_DEBUG_KMS("DFP2 connected\n");
3096                        bios_0_scratch |= ATOM_S0_DFP2;
3097                        bios_3_scratch |= ATOM_S3_DFP2_ACTIVE;
3098                        bios_6_scratch |= ATOM_S6_ACC_REQ_DFP2;
3099                } else {
3100                        DRM_DEBUG_KMS("DFP2 disconnected\n");
3101                        bios_0_scratch &= ~ATOM_S0_DFP2;
3102                        bios_3_scratch &= ~ATOM_S3_DFP2_ACTIVE;
3103                        bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP2;
3104                }
3105        }
3106        if ((radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) &&
3107            (radeon_connector->devices & ATOM_DEVICE_DFP3_SUPPORT)) {
3108                if (connected) {
3109                        DRM_DEBUG_KMS("DFP3 connected\n");
3110                        bios_0_scratch |= ATOM_S0_DFP3;
3111                        bios_3_scratch |= ATOM_S3_DFP3_ACTIVE;
3112                        bios_6_scratch |= ATOM_S6_ACC_REQ_DFP3;
3113                } else {
3114                        DRM_DEBUG_KMS("DFP3 disconnected\n");
3115                        bios_0_scratch &= ~ATOM_S0_DFP3;
3116                        bios_3_scratch &= ~ATOM_S3_DFP3_ACTIVE;
3117                        bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP3;
3118                }
3119        }
3120        if ((radeon_encoder->devices & ATOM_DEVICE_DFP4_SUPPORT) &&
3121            (radeon_connector->devices & ATOM_DEVICE_DFP4_SUPPORT)) {
3122                if (connected) {
3123                        DRM_DEBUG_KMS("DFP4 connected\n");
3124                        bios_0_scratch |= ATOM_S0_DFP4;
3125                        bios_3_scratch |= ATOM_S3_DFP4_ACTIVE;
3126                        bios_6_scratch |= ATOM_S6_ACC_REQ_DFP4;
3127                } else {
3128                        DRM_DEBUG_KMS("DFP4 disconnected\n");
3129                        bios_0_scratch &= ~ATOM_S0_DFP4;
3130                        bios_3_scratch &= ~ATOM_S3_DFP4_ACTIVE;
3131                        bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP4;
3132                }
3133        }
3134        if ((radeon_encoder->devices & ATOM_DEVICE_DFP5_SUPPORT) &&
3135            (radeon_connector->devices & ATOM_DEVICE_DFP5_SUPPORT)) {
3136                if (connected) {
3137                        DRM_DEBUG_KMS("DFP5 connected\n");
3138                        bios_0_scratch |= ATOM_S0_DFP5;
3139                        bios_3_scratch |= ATOM_S3_DFP5_ACTIVE;
3140                        bios_6_scratch |= ATOM_S6_ACC_REQ_DFP5;
3141                } else {
3142                        DRM_DEBUG_KMS("DFP5 disconnected\n");
3143                        bios_0_scratch &= ~ATOM_S0_DFP5;
3144                        bios_3_scratch &= ~ATOM_S3_DFP5_ACTIVE;
3145                        bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP5;
3146                }
3147        }
3148        if ((radeon_encoder->devices & ATOM_DEVICE_DFP6_SUPPORT) &&
3149            (radeon_connector->devices & ATOM_DEVICE_DFP6_SUPPORT)) {
3150                if (connected) {
3151                        DRM_DEBUG_KMS("DFP6 connected\n");
3152                        bios_0_scratch |= ATOM_S0_DFP6;
3153                        bios_3_scratch |= ATOM_S3_DFP6_ACTIVE;
3154                        bios_6_scratch |= ATOM_S6_ACC_REQ_DFP6;
3155                } else {
3156                        DRM_DEBUG_KMS("DFP6 disconnected\n");
3157                        bios_0_scratch &= ~ATOM_S0_DFP6;
3158                        bios_3_scratch &= ~ATOM_S3_DFP6_ACTIVE;
3159                        bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP6;
3160                }
3161        }
3162
3163        if (rdev->family >= CHIP_R600) {
3164                WREG32(R600_BIOS_0_SCRATCH, bios_0_scratch);
3165                WREG32(R600_BIOS_3_SCRATCH, bios_3_scratch);
3166                WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
3167        } else {
3168                WREG32(RADEON_BIOS_0_SCRATCH, bios_0_scratch);
3169                WREG32(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
3170                WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
3171        }
3172}
3173
3174void
3175radeon_atombios_encoder_crtc_scratch_regs(struct drm_encoder *encoder, int crtc)
3176{
3177        struct drm_device *dev = encoder->dev;
3178        struct radeon_device *rdev = dev->dev_private;
3179        struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
3180        uint32_t bios_3_scratch;
3181
3182        if (ASIC_IS_DCE4(rdev))
3183                return;
3184
3185        if (rdev->family >= CHIP_R600)
3186                bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH);
3187        else
3188                bios_3_scratch = RREG32(RADEON_BIOS_3_SCRATCH);
3189
3190        if (radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) {
3191                bios_3_scratch &= ~ATOM_S3_TV1_CRTC_ACTIVE;
3192                bios_3_scratch |= (crtc << 18);
3193        }
3194        if (radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) {
3195                bios_3_scratch &= ~ATOM_S3_CV_CRTC_ACTIVE;
3196                bios_3_scratch |= (crtc << 24);
3197        }
3198        if (radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) {
3199                bios_3_scratch &= ~ATOM_S3_CRT1_CRTC_ACTIVE;
3200                bios_3_scratch |= (crtc << 16);
3201        }
3202        if (radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) {
3203                bios_3_scratch &= ~ATOM_S3_CRT2_CRTC_ACTIVE;
3204                bios_3_scratch |= (crtc << 20);
3205        }
3206        if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) {
3207                bios_3_scratch &= ~ATOM_S3_LCD1_CRTC_ACTIVE;
3208                bios_3_scratch |= (crtc << 17);
3209        }
3210        if (radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) {
3211                bios_3_scratch &= ~ATOM_S3_DFP1_CRTC_ACTIVE;
3212                bios_3_scratch |= (crtc << 19);
3213        }
3214        if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) {
3215                bios_3_scratch &= ~ATOM_S3_DFP2_CRTC_ACTIVE;
3216                bios_3_scratch |= (crtc << 23);
3217        }
3218        if (radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) {
3219                bios_3_scratch &= ~ATOM_S3_DFP3_CRTC_ACTIVE;
3220                bios_3_scratch |= (crtc << 25);
3221        }
3222
3223        if (rdev->family >= CHIP_R600)
3224                WREG32(R600_BIOS_3_SCRATCH, bios_3_scratch);
3225        else
3226                WREG32(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
3227}
3228
3229void
3230radeon_atombios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on)
3231{
3232        struct drm_device *dev = encoder->dev;
3233        struct radeon_device *rdev = dev->dev_private;
3234        struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
3235        uint32_t bios_2_scratch;
3236
3237        if (ASIC_IS_DCE4(rdev))
3238                return;
3239
3240        if (rdev->family >= CHIP_R600)
3241                bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH);
3242        else
3243                bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH);
3244
3245        if (radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) {
3246                if (on)
3247                        bios_2_scratch &= ~ATOM_S2_TV1_DPMS_STATE;
3248                else
3249                        bios_2_scratch |= ATOM_S2_TV1_DPMS_STATE;
3250        }
3251        if (radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) {
3252                if (on)
3253                        bios_2_scratch &= ~ATOM_S2_CV_DPMS_STATE;
3254                else
3255                        bios_2_scratch |= ATOM_S2_CV_DPMS_STATE;
3256        }
3257        if (radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) {
3258                if (on)
3259                        bios_2_scratch &= ~ATOM_S2_CRT1_DPMS_STATE;
3260                else
3261                        bios_2_scratch |= ATOM_S2_CRT1_DPMS_STATE;
3262        }
3263        if (radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) {
3264                if (on)
3265                        bios_2_scratch &= ~ATOM_S2_CRT2_DPMS_STATE;
3266                else
3267                        bios_2_scratch |= ATOM_S2_CRT2_DPMS_STATE;
3268        }
3269        if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) {
3270                if (on)
3271                        bios_2_scratch &= ~ATOM_S2_LCD1_DPMS_STATE;
3272                else
3273                        bios_2_scratch |= ATOM_S2_LCD1_DPMS_STATE;
3274        }
3275        if (radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) {
3276                if (on)
3277                        bios_2_scratch &= ~ATOM_S2_DFP1_DPMS_STATE;
3278                else
3279                        bios_2_scratch |= ATOM_S2_DFP1_DPMS_STATE;
3280        }
3281        if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) {
3282                if (on)
3283                        bios_2_scratch &= ~ATOM_S2_DFP2_DPMS_STATE;
3284                else
3285                        bios_2_scratch |= ATOM_S2_DFP2_DPMS_STATE;
3286        }
3287        if (radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) {
3288                if (on)
3289                        bios_2_scratch &= ~ATOM_S2_DFP3_DPMS_STATE;
3290                else
3291                        bios_2_scratch |= ATOM_S2_DFP3_DPMS_STATE;
3292        }
3293        if (radeon_encoder->devices & ATOM_DEVICE_DFP4_SUPPORT) {
3294                if (on)
3295                        bios_2_scratch &= ~ATOM_S2_DFP4_DPMS_STATE;
3296                else
3297                        bios_2_scratch |= ATOM_S2_DFP4_DPMS_STATE;
3298        }
3299        if (radeon_encoder->devices & ATOM_DEVICE_DFP5_SUPPORT) {
3300                if (on)
3301                        bios_2_scratch &= ~ATOM_S2_DFP5_DPMS_STATE;
3302                else
3303                        bios_2_scratch |= ATOM_S2_DFP5_DPMS_STATE;
3304        }
3305
3306        if (rdev->family >= CHIP_R600)
3307                WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
3308        else
3309                WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
3310}
3311