]> rtime.felk.cvut.cz Git - linux-imx.git/blob - drivers/gpu/drm/radeon/radeon_atombios.c
Merge git://git.infradead.org/users/eparis/audit
[linux-imx.git] / drivers / gpu / drm / radeon / radeon_atombios.c
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 */
34 extern uint32_t
35 radeon_get_encoder_enum(struct drm_device *dev, uint32_t supported_device,
36                         uint8_t dac);
37 extern void radeon_link_encoder_connector(struct drm_device *dev);
38 extern void
39 radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_enum,
40                         uint32_t supported_device, u16 caps);
41
42 /* from radeon_connector.c */
43 extern void
44 radeon_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 */
55 extern void
56 radeon_add_legacy_encoder(struct drm_device *dev, uint32_t encoder_enum,
57                           uint32_t supported_device);
58
59 /* local */
60 static int radeon_atom_get_max_vddc(struct radeon_device *rdev, u8 voltage_type,
61                                     u16 voltage_id, u16 *voltage);
62
63 union 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
69 static 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
107 static 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
150 static 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
185 void 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
217 static 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
252 static 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
297 static 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
470 const 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
489 const 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
506 const 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
531 bool 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
856 static 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
898 struct 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
907 bool 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
1110 union 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
1119 bool 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
1267 union 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
1274 bool 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
1307 bool 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
1356 bool 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
1392 static 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
1452 union 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
1458 bool 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
1531 union lvds_info {
1532         struct _ATOM_LVDS_INFO info;
1533         struct _ATOM_LVDS_INFO_V12 info_12;
1534 };
1535
1536 struct 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
1675 struct radeon_encoder_primary_dac *
1676 radeon_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
1706 bool 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
1801 enum radeon_tv_std
1802 radeon_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
1859 struct radeon_encoder_tv_dac *
1860 radeon_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
1900 static const char *thermal_controller_names[] = {
1901         "NONE",
1902         "lm63",
1903         "adm1032",
1904         "adm1030",
1905         "max6649",
1906         "lm64",
1907         "f75375",
1908         "asc7xxx",
1909 };
1910
1911 static 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
1932 union 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
1941 union 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
1949 union pplib_power_state {
1950         struct _ATOM_PPLIB_STATE v1;
1951         struct _ATOM_PPLIB_STATE_V2 v2;
1952 };
1953
1954 static 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
1994 static 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
2175 static 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
2244 static 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
2267 static 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
2333 static 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
2417 static 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
2505 static 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
2600 void 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
2664 union 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
2672 int 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
2769 void 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
2779 uint32_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
2788 uint32_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
2797 void 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
2808 void 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
2822 union 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
2829 void 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
2866 static 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
2905 void 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
2934 void 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
2948 void 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
2962 void 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 */
2988 void
2989 radeon_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
3174 void
3175 radeon_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
3229 void
3230 radeon_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 }