Merge branch 'upstream-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid
[pandora-kernel.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 "drmP.h"
27 #include "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                 return true;
1258         }
1259
1260         return false;
1261 }
1262
1263 union igp_info {
1264         struct _ATOM_INTEGRATED_SYSTEM_INFO info;
1265         struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2;
1266         struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 info_6;
1267         struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_7 info_7;
1268 };
1269
1270 bool radeon_atombios_sideport_present(struct radeon_device *rdev)
1271 {
1272         struct radeon_mode_info *mode_info = &rdev->mode_info;
1273         int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo);
1274         union igp_info *igp_info;
1275         u8 frev, crev;
1276         u16 data_offset;
1277
1278         /* sideport is AMD only */
1279         if (rdev->family == CHIP_RS600)
1280                 return false;
1281
1282         if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1283                                    &frev, &crev, &data_offset)) {
1284                 igp_info = (union igp_info *)(mode_info->atom_context->bios +
1285                                       data_offset);
1286                 switch (crev) {
1287                 case 1:
1288                         if (le32_to_cpu(igp_info->info.ulBootUpMemoryClock))
1289                                 return true;
1290                         break;
1291                 case 2:
1292                         if (le32_to_cpu(igp_info->info_2.ulBootUpSidePortClock))
1293                                 return true;
1294                         break;
1295                 default:
1296                         DRM_ERROR("Unsupported IGP table: %d %d\n", frev, crev);
1297                         break;
1298                 }
1299         }
1300         return false;
1301 }
1302
1303 bool radeon_atombios_get_tmds_info(struct radeon_encoder *encoder,
1304                                    struct radeon_encoder_int_tmds *tmds)
1305 {
1306         struct drm_device *dev = encoder->base.dev;
1307         struct radeon_device *rdev = dev->dev_private;
1308         struct radeon_mode_info *mode_info = &rdev->mode_info;
1309         int index = GetIndexIntoMasterTable(DATA, TMDS_Info);
1310         uint16_t data_offset;
1311         struct _ATOM_TMDS_INFO *tmds_info;
1312         uint8_t frev, crev;
1313         uint16_t maxfreq;
1314         int i;
1315
1316         if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1317                                    &frev, &crev, &data_offset)) {
1318                 tmds_info =
1319                         (struct _ATOM_TMDS_INFO *)(mode_info->atom_context->bios +
1320                                                    data_offset);
1321
1322                 maxfreq = le16_to_cpu(tmds_info->usMaxFrequency);
1323                 for (i = 0; i < 4; i++) {
1324                         tmds->tmds_pll[i].freq =
1325                             le16_to_cpu(tmds_info->asMiscInfo[i].usFrequency);
1326                         tmds->tmds_pll[i].value =
1327                             tmds_info->asMiscInfo[i].ucPLL_ChargePump & 0x3f;
1328                         tmds->tmds_pll[i].value |=
1329                             (tmds_info->asMiscInfo[i].
1330                              ucPLL_VCO_Gain & 0x3f) << 6;
1331                         tmds->tmds_pll[i].value |=
1332                             (tmds_info->asMiscInfo[i].
1333                              ucPLL_DutyCycle & 0xf) << 12;
1334                         tmds->tmds_pll[i].value |=
1335                             (tmds_info->asMiscInfo[i].
1336                              ucPLL_VoltageSwing & 0xf) << 16;
1337
1338                         DRM_DEBUG_KMS("TMDS PLL From ATOMBIOS %u %x\n",
1339                                   tmds->tmds_pll[i].freq,
1340                                   tmds->tmds_pll[i].value);
1341
1342                         if (maxfreq == tmds->tmds_pll[i].freq) {
1343                                 tmds->tmds_pll[i].freq = 0xffffffff;
1344                                 break;
1345                         }
1346                 }
1347                 return true;
1348         }
1349         return false;
1350 }
1351
1352 bool radeon_atombios_get_ppll_ss_info(struct radeon_device *rdev,
1353                                       struct radeon_atom_ss *ss,
1354                                       int id)
1355 {
1356         struct radeon_mode_info *mode_info = &rdev->mode_info;
1357         int index = GetIndexIntoMasterTable(DATA, PPLL_SS_Info);
1358         uint16_t data_offset, size;
1359         struct _ATOM_SPREAD_SPECTRUM_INFO *ss_info;
1360         uint8_t frev, crev;
1361         int i, num_indices;
1362
1363         memset(ss, 0, sizeof(struct radeon_atom_ss));
1364         if (atom_parse_data_header(mode_info->atom_context, index, &size,
1365                                    &frev, &crev, &data_offset)) {
1366                 ss_info =
1367                         (struct _ATOM_SPREAD_SPECTRUM_INFO *)(mode_info->atom_context->bios + data_offset);
1368
1369                 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1370                         sizeof(ATOM_SPREAD_SPECTRUM_ASSIGNMENT);
1371
1372                 for (i = 0; i < num_indices; i++) {
1373                         if (ss_info->asSS_Info[i].ucSS_Id == id) {
1374                                 ss->percentage =
1375                                         le16_to_cpu(ss_info->asSS_Info[i].usSpreadSpectrumPercentage);
1376                                 ss->type = ss_info->asSS_Info[i].ucSpreadSpectrumType;
1377                                 ss->step = ss_info->asSS_Info[i].ucSS_Step;
1378                                 ss->delay = ss_info->asSS_Info[i].ucSS_Delay;
1379                                 ss->range = ss_info->asSS_Info[i].ucSS_Range;
1380                                 ss->refdiv = ss_info->asSS_Info[i].ucRecommendedRef_Div;
1381                                 return true;
1382                         }
1383                 }
1384         }
1385         return false;
1386 }
1387
1388 static void radeon_atombios_get_igp_ss_overrides(struct radeon_device *rdev,
1389                                                  struct radeon_atom_ss *ss,
1390                                                  int id)
1391 {
1392         struct radeon_mode_info *mode_info = &rdev->mode_info;
1393         int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo);
1394         u16 data_offset, size;
1395         union igp_info *igp_info;
1396         u8 frev, crev;
1397         u16 percentage = 0, rate = 0;
1398
1399         /* get any igp specific overrides */
1400         if (atom_parse_data_header(mode_info->atom_context, index, &size,
1401                                    &frev, &crev, &data_offset)) {
1402                 igp_info = (union igp_info *)
1403                         (mode_info->atom_context->bios + data_offset);
1404                 switch (crev) {
1405                 case 6:
1406                         switch (id) {
1407                         case ASIC_INTERNAL_SS_ON_TMDS:
1408                                 percentage = le16_to_cpu(igp_info->info_6.usDVISSPercentage);
1409                                 rate = le16_to_cpu(igp_info->info_6.usDVISSpreadRateIn10Hz);
1410                                 break;
1411                         case ASIC_INTERNAL_SS_ON_HDMI:
1412                                 percentage = le16_to_cpu(igp_info->info_6.usHDMISSPercentage);
1413                                 rate = le16_to_cpu(igp_info->info_6.usHDMISSpreadRateIn10Hz);
1414                                 break;
1415                         case ASIC_INTERNAL_SS_ON_LVDS:
1416                                 percentage = le16_to_cpu(igp_info->info_6.usLvdsSSPercentage);
1417                                 rate = le16_to_cpu(igp_info->info_6.usLvdsSSpreadRateIn10Hz);
1418                                 break;
1419                         }
1420                         break;
1421                 case 7:
1422                         switch (id) {
1423                         case ASIC_INTERNAL_SS_ON_TMDS:
1424                                 percentage = le16_to_cpu(igp_info->info_7.usDVISSPercentage);
1425                                 rate = le16_to_cpu(igp_info->info_7.usDVISSpreadRateIn10Hz);
1426                                 break;
1427                         case ASIC_INTERNAL_SS_ON_HDMI:
1428                                 percentage = le16_to_cpu(igp_info->info_7.usHDMISSPercentage);
1429                                 rate = le16_to_cpu(igp_info->info_7.usHDMISSpreadRateIn10Hz);
1430                                 break;
1431                         case ASIC_INTERNAL_SS_ON_LVDS:
1432                                 percentage = le16_to_cpu(igp_info->info_7.usLvdsSSPercentage);
1433                                 rate = le16_to_cpu(igp_info->info_7.usLvdsSSpreadRateIn10Hz);
1434                                 break;
1435                         }
1436                         break;
1437                 default:
1438                         DRM_ERROR("Unsupported IGP table: %d %d\n", frev, crev);
1439                         break;
1440                 }
1441                 if (percentage)
1442                         ss->percentage = percentage;
1443                 if (rate)
1444                         ss->rate = rate;
1445         }
1446 }
1447
1448 union asic_ss_info {
1449         struct _ATOM_ASIC_INTERNAL_SS_INFO info;
1450         struct _ATOM_ASIC_INTERNAL_SS_INFO_V2 info_2;
1451         struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 info_3;
1452 };
1453
1454 bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev,
1455                                       struct radeon_atom_ss *ss,
1456                                       int id, u32 clock)
1457 {
1458         struct radeon_mode_info *mode_info = &rdev->mode_info;
1459         int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info);
1460         uint16_t data_offset, size;
1461         union asic_ss_info *ss_info;
1462         uint8_t frev, crev;
1463         int i, num_indices;
1464
1465         memset(ss, 0, sizeof(struct radeon_atom_ss));
1466         if (atom_parse_data_header(mode_info->atom_context, index, &size,
1467                                    &frev, &crev, &data_offset)) {
1468
1469                 ss_info =
1470                         (union asic_ss_info *)(mode_info->atom_context->bios + data_offset);
1471
1472                 switch (frev) {
1473                 case 1:
1474                         num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1475                                 sizeof(ATOM_ASIC_SS_ASSIGNMENT);
1476
1477                         for (i = 0; i < num_indices; i++) {
1478                                 if ((ss_info->info.asSpreadSpectrum[i].ucClockIndication == id) &&
1479                                     (clock <= le32_to_cpu(ss_info->info.asSpreadSpectrum[i].ulTargetClockRange))) {
1480                                         ss->percentage =
1481                                                 le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1482                                         ss->type = ss_info->info.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1483                                         ss->rate = le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadRateInKhz);
1484                                         return true;
1485                                 }
1486                         }
1487                         break;
1488                 case 2:
1489                         num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1490                                 sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2);
1491                         for (i = 0; i < num_indices; i++) {
1492                                 if ((ss_info->info_2.asSpreadSpectrum[i].ucClockIndication == id) &&
1493                                     (clock <= le32_to_cpu(ss_info->info_2.asSpreadSpectrum[i].ulTargetClockRange))) {
1494                                         ss->percentage =
1495                                                 le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1496                                         ss->type = ss_info->info_2.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1497                                         ss->rate = le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadRateIn10Hz);
1498                                         return true;
1499                                 }
1500                         }
1501                         break;
1502                 case 3:
1503                         num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1504                                 sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3);
1505                         for (i = 0; i < num_indices; i++) {
1506                                 if ((ss_info->info_3.asSpreadSpectrum[i].ucClockIndication == id) &&
1507                                     (clock <= le32_to_cpu(ss_info->info_3.asSpreadSpectrum[i].ulTargetClockRange))) {
1508                                         ss->percentage =
1509                                                 le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1510                                         ss->type = ss_info->info_3.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1511                                         ss->rate = le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadRateIn10Hz);
1512                                         if (rdev->flags & RADEON_IS_IGP)
1513                                                 radeon_atombios_get_igp_ss_overrides(rdev, ss, id);
1514                                         return true;
1515                                 }
1516                         }
1517                         break;
1518                 default:
1519                         DRM_ERROR("Unsupported ASIC_InternalSS_Info table: %d %d\n", frev, crev);
1520                         break;
1521                 }
1522
1523         }
1524         return false;
1525 }
1526
1527 union lvds_info {
1528         struct _ATOM_LVDS_INFO info;
1529         struct _ATOM_LVDS_INFO_V12 info_12;
1530 };
1531
1532 struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct
1533                                                               radeon_encoder
1534                                                               *encoder)
1535 {
1536         struct drm_device *dev = encoder->base.dev;
1537         struct radeon_device *rdev = dev->dev_private;
1538         struct radeon_mode_info *mode_info = &rdev->mode_info;
1539         int index = GetIndexIntoMasterTable(DATA, LVDS_Info);
1540         uint16_t data_offset, misc;
1541         union lvds_info *lvds_info;
1542         uint8_t frev, crev;
1543         struct radeon_encoder_atom_dig *lvds = NULL;
1544         int encoder_enum = (encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
1545
1546         if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1547                                    &frev, &crev, &data_offset)) {
1548                 lvds_info =
1549                         (union lvds_info *)(mode_info->atom_context->bios + data_offset);
1550                 lvds =
1551                     kzalloc(sizeof(struct radeon_encoder_atom_dig), GFP_KERNEL);
1552
1553                 if (!lvds)
1554                         return NULL;
1555
1556                 lvds->native_mode.clock =
1557                     le16_to_cpu(lvds_info->info.sLCDTiming.usPixClk) * 10;
1558                 lvds->native_mode.hdisplay =
1559                     le16_to_cpu(lvds_info->info.sLCDTiming.usHActive);
1560                 lvds->native_mode.vdisplay =
1561                     le16_to_cpu(lvds_info->info.sLCDTiming.usVActive);
1562                 lvds->native_mode.htotal = lvds->native_mode.hdisplay +
1563                         le16_to_cpu(lvds_info->info.sLCDTiming.usHBlanking_Time);
1564                 lvds->native_mode.hsync_start = lvds->native_mode.hdisplay +
1565                         le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncOffset);
1566                 lvds->native_mode.hsync_end = lvds->native_mode.hsync_start +
1567                         le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncWidth);
1568                 lvds->native_mode.vtotal = lvds->native_mode.vdisplay +
1569                         le16_to_cpu(lvds_info->info.sLCDTiming.usVBlanking_Time);
1570                 lvds->native_mode.vsync_start = lvds->native_mode.vdisplay +
1571                         le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncOffset);
1572                 lvds->native_mode.vsync_end = lvds->native_mode.vsync_start +
1573                         le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncWidth);
1574                 lvds->panel_pwr_delay =
1575                     le16_to_cpu(lvds_info->info.usOffDelayInMs);
1576                 lvds->lcd_misc = lvds_info->info.ucLVDS_Misc;
1577
1578                 misc = le16_to_cpu(lvds_info->info.sLCDTiming.susModeMiscInfo.usAccess);
1579                 if (misc & ATOM_VSYNC_POLARITY)
1580                         lvds->native_mode.flags |= DRM_MODE_FLAG_NVSYNC;
1581                 if (misc & ATOM_HSYNC_POLARITY)
1582                         lvds->native_mode.flags |= DRM_MODE_FLAG_NHSYNC;
1583                 if (misc & ATOM_COMPOSITESYNC)
1584                         lvds->native_mode.flags |= DRM_MODE_FLAG_CSYNC;
1585                 if (misc & ATOM_INTERLACE)
1586                         lvds->native_mode.flags |= DRM_MODE_FLAG_INTERLACE;
1587                 if (misc & ATOM_DOUBLE_CLOCK_MODE)
1588                         lvds->native_mode.flags |= DRM_MODE_FLAG_DBLSCAN;
1589
1590                 lvds->native_mode.width_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageHSize);
1591                 lvds->native_mode.height_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageVSize);
1592
1593                 /* set crtc values */
1594                 drm_mode_set_crtcinfo(&lvds->native_mode, CRTC_INTERLACE_HALVE_V);
1595
1596                 lvds->lcd_ss_id = lvds_info->info.ucSS_Id;
1597
1598                 encoder->native_mode = lvds->native_mode;
1599
1600                 if (encoder_enum == 2)
1601                         lvds->linkb = true;
1602                 else
1603                         lvds->linkb = false;
1604
1605                 /* parse the lcd record table */
1606                 if (le16_to_cpu(lvds_info->info.usModePatchTableOffset)) {
1607                         ATOM_FAKE_EDID_PATCH_RECORD *fake_edid_record;
1608                         ATOM_PANEL_RESOLUTION_PATCH_RECORD *panel_res_record;
1609                         bool bad_record = false;
1610                         u8 *record;
1611
1612                         if ((frev == 1) && (crev < 2))
1613                                 /* absolute */
1614                                 record = (u8 *)(mode_info->atom_context->bios +
1615                                                 le16_to_cpu(lvds_info->info.usModePatchTableOffset));
1616                         else
1617                                 /* relative */
1618                                 record = (u8 *)(mode_info->atom_context->bios +
1619                                                 data_offset +
1620                                                 le16_to_cpu(lvds_info->info.usModePatchTableOffset));
1621                         while (*record != ATOM_RECORD_END_TYPE) {
1622                                 switch (*record) {
1623                                 case LCD_MODE_PATCH_RECORD_MODE_TYPE:
1624                                         record += sizeof(ATOM_PATCH_RECORD_MODE);
1625                                         break;
1626                                 case LCD_RTS_RECORD_TYPE:
1627                                         record += sizeof(ATOM_LCD_RTS_RECORD);
1628                                         break;
1629                                 case LCD_CAP_RECORD_TYPE:
1630                                         record += sizeof(ATOM_LCD_MODE_CONTROL_CAP);
1631                                         break;
1632                                 case LCD_FAKE_EDID_PATCH_RECORD_TYPE:
1633                                         fake_edid_record = (ATOM_FAKE_EDID_PATCH_RECORD *)record;
1634                                         if (fake_edid_record->ucFakeEDIDLength) {
1635                                                 struct edid *edid;
1636                                                 int edid_size =
1637                                                         max((int)EDID_LENGTH, (int)fake_edid_record->ucFakeEDIDLength);
1638                                                 edid = kmalloc(edid_size, GFP_KERNEL);
1639                                                 if (edid) {
1640                                                         memcpy((u8 *)edid, (u8 *)&fake_edid_record->ucFakeEDIDString[0],
1641                                                                fake_edid_record->ucFakeEDIDLength);
1642
1643                                                         if (drm_edid_is_valid(edid)) {
1644                                                                 rdev->mode_info.bios_hardcoded_edid = edid;
1645                                                                 rdev->mode_info.bios_hardcoded_edid_size = edid_size;
1646                                                         } else
1647                                                                 kfree(edid);
1648                                                 }
1649                                         }
1650                                         record += sizeof(ATOM_FAKE_EDID_PATCH_RECORD);
1651                                         break;
1652                                 case LCD_PANEL_RESOLUTION_RECORD_TYPE:
1653                                         panel_res_record = (ATOM_PANEL_RESOLUTION_PATCH_RECORD *)record;
1654                                         lvds->native_mode.width_mm = panel_res_record->usHSize;
1655                                         lvds->native_mode.height_mm = panel_res_record->usVSize;
1656                                         record += sizeof(ATOM_PANEL_RESOLUTION_PATCH_RECORD);
1657                                         break;
1658                                 default:
1659                                         DRM_ERROR("Bad LCD record %d\n", *record);
1660                                         bad_record = true;
1661                                         break;
1662                                 }
1663                                 if (bad_record)
1664                                         break;
1665                         }
1666                 }
1667         }
1668         return lvds;
1669 }
1670
1671 struct radeon_encoder_primary_dac *
1672 radeon_atombios_get_primary_dac_info(struct radeon_encoder *encoder)
1673 {
1674         struct drm_device *dev = encoder->base.dev;
1675         struct radeon_device *rdev = dev->dev_private;
1676         struct radeon_mode_info *mode_info = &rdev->mode_info;
1677         int index = GetIndexIntoMasterTable(DATA, CompassionateData);
1678         uint16_t data_offset;
1679         struct _COMPASSIONATE_DATA *dac_info;
1680         uint8_t frev, crev;
1681         uint8_t bg, dac;
1682         struct radeon_encoder_primary_dac *p_dac = NULL;
1683
1684         if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1685                                    &frev, &crev, &data_offset)) {
1686                 dac_info = (struct _COMPASSIONATE_DATA *)
1687                         (mode_info->atom_context->bios + data_offset);
1688
1689                 p_dac = kzalloc(sizeof(struct radeon_encoder_primary_dac), GFP_KERNEL);
1690
1691                 if (!p_dac)
1692                         return NULL;
1693
1694                 bg = dac_info->ucDAC1_BG_Adjustment;
1695                 dac = dac_info->ucDAC1_DAC_Adjustment;
1696                 p_dac->ps2_pdac_adj = (bg << 8) | (dac);
1697
1698         }
1699         return p_dac;
1700 }
1701
1702 bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index,
1703                                 struct drm_display_mode *mode)
1704 {
1705         struct radeon_mode_info *mode_info = &rdev->mode_info;
1706         ATOM_ANALOG_TV_INFO *tv_info;
1707         ATOM_ANALOG_TV_INFO_V1_2 *tv_info_v1_2;
1708         ATOM_DTD_FORMAT *dtd_timings;
1709         int data_index = GetIndexIntoMasterTable(DATA, AnalogTV_Info);
1710         u8 frev, crev;
1711         u16 data_offset, misc;
1712
1713         if (!atom_parse_data_header(mode_info->atom_context, data_index, NULL,
1714                                     &frev, &crev, &data_offset))
1715                 return false;
1716
1717         switch (crev) {
1718         case 1:
1719                 tv_info = (ATOM_ANALOG_TV_INFO *)(mode_info->atom_context->bios + data_offset);
1720                 if (index >= MAX_SUPPORTED_TV_TIMING)
1721                         return false;
1722
1723                 mode->crtc_htotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Total);
1724                 mode->crtc_hdisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Disp);
1725                 mode->crtc_hsync_start = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart);
1726                 mode->crtc_hsync_end = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart) +
1727                         le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncWidth);
1728
1729                 mode->crtc_vtotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Total);
1730                 mode->crtc_vdisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Disp);
1731                 mode->crtc_vsync_start = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart);
1732                 mode->crtc_vsync_end = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart) +
1733                         le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncWidth);
1734
1735                 mode->flags = 0;
1736                 misc = le16_to_cpu(tv_info->aModeTimings[index].susModeMiscInfo.usAccess);
1737                 if (misc & ATOM_VSYNC_POLARITY)
1738                         mode->flags |= DRM_MODE_FLAG_NVSYNC;
1739                 if (misc & ATOM_HSYNC_POLARITY)
1740                         mode->flags |= DRM_MODE_FLAG_NHSYNC;
1741                 if (misc & ATOM_COMPOSITESYNC)
1742                         mode->flags |= DRM_MODE_FLAG_CSYNC;
1743                 if (misc & ATOM_INTERLACE)
1744                         mode->flags |= DRM_MODE_FLAG_INTERLACE;
1745                 if (misc & ATOM_DOUBLE_CLOCK_MODE)
1746                         mode->flags |= DRM_MODE_FLAG_DBLSCAN;
1747
1748                 mode->clock = le16_to_cpu(tv_info->aModeTimings[index].usPixelClock) * 10;
1749
1750                 if (index == 1) {
1751                         /* PAL timings appear to have wrong values for totals */
1752                         mode->crtc_htotal -= 1;
1753                         mode->crtc_vtotal -= 1;
1754                 }
1755                 break;
1756         case 2:
1757                 tv_info_v1_2 = (ATOM_ANALOG_TV_INFO_V1_2 *)(mode_info->atom_context->bios + data_offset);
1758                 if (index >= MAX_SUPPORTED_TV_TIMING_V1_2)
1759                         return false;
1760
1761                 dtd_timings = &tv_info_v1_2->aModeTimings[index];
1762                 mode->crtc_htotal = le16_to_cpu(dtd_timings->usHActive) +
1763                         le16_to_cpu(dtd_timings->usHBlanking_Time);
1764                 mode->crtc_hdisplay = le16_to_cpu(dtd_timings->usHActive);
1765                 mode->crtc_hsync_start = le16_to_cpu(dtd_timings->usHActive) +
1766                         le16_to_cpu(dtd_timings->usHSyncOffset);
1767                 mode->crtc_hsync_end = mode->crtc_hsync_start +
1768                         le16_to_cpu(dtd_timings->usHSyncWidth);
1769
1770                 mode->crtc_vtotal = le16_to_cpu(dtd_timings->usVActive) +
1771                         le16_to_cpu(dtd_timings->usVBlanking_Time);
1772                 mode->crtc_vdisplay = le16_to_cpu(dtd_timings->usVActive);
1773                 mode->crtc_vsync_start = le16_to_cpu(dtd_timings->usVActive) +
1774                         le16_to_cpu(dtd_timings->usVSyncOffset);
1775                 mode->crtc_vsync_end = mode->crtc_vsync_start +
1776                         le16_to_cpu(dtd_timings->usVSyncWidth);
1777
1778                 mode->flags = 0;
1779                 misc = le16_to_cpu(dtd_timings->susModeMiscInfo.usAccess);
1780                 if (misc & ATOM_VSYNC_POLARITY)
1781                         mode->flags |= DRM_MODE_FLAG_NVSYNC;
1782                 if (misc & ATOM_HSYNC_POLARITY)
1783                         mode->flags |= DRM_MODE_FLAG_NHSYNC;
1784                 if (misc & ATOM_COMPOSITESYNC)
1785                         mode->flags |= DRM_MODE_FLAG_CSYNC;
1786                 if (misc & ATOM_INTERLACE)
1787                         mode->flags |= DRM_MODE_FLAG_INTERLACE;
1788                 if (misc & ATOM_DOUBLE_CLOCK_MODE)
1789                         mode->flags |= DRM_MODE_FLAG_DBLSCAN;
1790
1791                 mode->clock = le16_to_cpu(dtd_timings->usPixClk) * 10;
1792                 break;
1793         }
1794         return true;
1795 }
1796
1797 enum radeon_tv_std
1798 radeon_atombios_get_tv_info(struct radeon_device *rdev)
1799 {
1800         struct radeon_mode_info *mode_info = &rdev->mode_info;
1801         int index = GetIndexIntoMasterTable(DATA, AnalogTV_Info);
1802         uint16_t data_offset;
1803         uint8_t frev, crev;
1804         struct _ATOM_ANALOG_TV_INFO *tv_info;
1805         enum radeon_tv_std tv_std = TV_STD_NTSC;
1806
1807         if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1808                                    &frev, &crev, &data_offset)) {
1809
1810                 tv_info = (struct _ATOM_ANALOG_TV_INFO *)
1811                         (mode_info->atom_context->bios + data_offset);
1812
1813                 switch (tv_info->ucTV_BootUpDefaultStandard) {
1814                 case ATOM_TV_NTSC:
1815                         tv_std = TV_STD_NTSC;
1816                         DRM_DEBUG_KMS("Default TV standard: NTSC\n");
1817                         break;
1818                 case ATOM_TV_NTSCJ:
1819                         tv_std = TV_STD_NTSC_J;
1820                         DRM_DEBUG_KMS("Default TV standard: NTSC-J\n");
1821                         break;
1822                 case ATOM_TV_PAL:
1823                         tv_std = TV_STD_PAL;
1824                         DRM_DEBUG_KMS("Default TV standard: PAL\n");
1825                         break;
1826                 case ATOM_TV_PALM:
1827                         tv_std = TV_STD_PAL_M;
1828                         DRM_DEBUG_KMS("Default TV standard: PAL-M\n");
1829                         break;
1830                 case ATOM_TV_PALN:
1831                         tv_std = TV_STD_PAL_N;
1832                         DRM_DEBUG_KMS("Default TV standard: PAL-N\n");
1833                         break;
1834                 case ATOM_TV_PALCN:
1835                         tv_std = TV_STD_PAL_CN;
1836                         DRM_DEBUG_KMS("Default TV standard: PAL-CN\n");
1837                         break;
1838                 case ATOM_TV_PAL60:
1839                         tv_std = TV_STD_PAL_60;
1840                         DRM_DEBUG_KMS("Default TV standard: PAL-60\n");
1841                         break;
1842                 case ATOM_TV_SECAM:
1843                         tv_std = TV_STD_SECAM;
1844                         DRM_DEBUG_KMS("Default TV standard: SECAM\n");
1845                         break;
1846                 default:
1847                         tv_std = TV_STD_NTSC;
1848                         DRM_DEBUG_KMS("Unknown TV standard; defaulting to NTSC\n");
1849                         break;
1850                 }
1851         }
1852         return tv_std;
1853 }
1854
1855 struct radeon_encoder_tv_dac *
1856 radeon_atombios_get_tv_dac_info(struct radeon_encoder *encoder)
1857 {
1858         struct drm_device *dev = encoder->base.dev;
1859         struct radeon_device *rdev = dev->dev_private;
1860         struct radeon_mode_info *mode_info = &rdev->mode_info;
1861         int index = GetIndexIntoMasterTable(DATA, CompassionateData);
1862         uint16_t data_offset;
1863         struct _COMPASSIONATE_DATA *dac_info;
1864         uint8_t frev, crev;
1865         uint8_t bg, dac;
1866         struct radeon_encoder_tv_dac *tv_dac = NULL;
1867
1868         if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1869                                    &frev, &crev, &data_offset)) {
1870
1871                 dac_info = (struct _COMPASSIONATE_DATA *)
1872                         (mode_info->atom_context->bios + data_offset);
1873
1874                 tv_dac = kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL);
1875
1876                 if (!tv_dac)
1877                         return NULL;
1878
1879                 bg = dac_info->ucDAC2_CRT2_BG_Adjustment;
1880                 dac = dac_info->ucDAC2_CRT2_DAC_Adjustment;
1881                 tv_dac->ps2_tvdac_adj = (bg << 16) | (dac << 20);
1882
1883                 bg = dac_info->ucDAC2_PAL_BG_Adjustment;
1884                 dac = dac_info->ucDAC2_PAL_DAC_Adjustment;
1885                 tv_dac->pal_tvdac_adj = (bg << 16) | (dac << 20);
1886
1887                 bg = dac_info->ucDAC2_NTSC_BG_Adjustment;
1888                 dac = dac_info->ucDAC2_NTSC_DAC_Adjustment;
1889                 tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20);
1890
1891                 tv_dac->tv_std = radeon_atombios_get_tv_info(rdev);
1892         }
1893         return tv_dac;
1894 }
1895
1896 static const char *thermal_controller_names[] = {
1897         "NONE",
1898         "lm63",
1899         "adm1032",
1900         "adm1030",
1901         "max6649",
1902         "lm64",
1903         "f75375",
1904         "asc7xxx",
1905 };
1906
1907 static const char *pp_lib_thermal_controller_names[] = {
1908         "NONE",
1909         "lm63",
1910         "adm1032",
1911         "adm1030",
1912         "max6649",
1913         "lm64",
1914         "f75375",
1915         "RV6xx",
1916         "RV770",
1917         "adt7473",
1918         "NONE",
1919         "External GPIO",
1920         "Evergreen",
1921         "emc2103",
1922         "Sumo",
1923         "Northern Islands",
1924         "Southern Islands",
1925         "lm96163",
1926 };
1927
1928 union power_info {
1929         struct _ATOM_POWERPLAY_INFO info;
1930         struct _ATOM_POWERPLAY_INFO_V2 info_2;
1931         struct _ATOM_POWERPLAY_INFO_V3 info_3;
1932         struct _ATOM_PPLIB_POWERPLAYTABLE pplib;
1933         struct _ATOM_PPLIB_POWERPLAYTABLE2 pplib2;
1934         struct _ATOM_PPLIB_POWERPLAYTABLE3 pplib3;
1935 };
1936
1937 union pplib_clock_info {
1938         struct _ATOM_PPLIB_R600_CLOCK_INFO r600;
1939         struct _ATOM_PPLIB_RS780_CLOCK_INFO rs780;
1940         struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO evergreen;
1941         struct _ATOM_PPLIB_SUMO_CLOCK_INFO sumo;
1942         struct _ATOM_PPLIB_SI_CLOCK_INFO si;
1943 };
1944
1945 union pplib_power_state {
1946         struct _ATOM_PPLIB_STATE v1;
1947         struct _ATOM_PPLIB_STATE_V2 v2;
1948 };
1949
1950 static void radeon_atombios_parse_misc_flags_1_3(struct radeon_device *rdev,
1951                                                  int state_index,
1952                                                  u32 misc, u32 misc2)
1953 {
1954         rdev->pm.power_state[state_index].misc = misc;
1955         rdev->pm.power_state[state_index].misc2 = misc2;
1956         /* order matters! */
1957         if (misc & ATOM_PM_MISCINFO_POWER_SAVING_MODE)
1958                 rdev->pm.power_state[state_index].type =
1959                         POWER_STATE_TYPE_POWERSAVE;
1960         if (misc & ATOM_PM_MISCINFO_DEFAULT_DC_STATE_ENTRY_TRUE)
1961                 rdev->pm.power_state[state_index].type =
1962                         POWER_STATE_TYPE_BATTERY;
1963         if (misc & ATOM_PM_MISCINFO_DEFAULT_LOW_DC_STATE_ENTRY_TRUE)
1964                 rdev->pm.power_state[state_index].type =
1965                         POWER_STATE_TYPE_BATTERY;
1966         if (misc & ATOM_PM_MISCINFO_LOAD_BALANCE_EN)
1967                 rdev->pm.power_state[state_index].type =
1968                         POWER_STATE_TYPE_BALANCED;
1969         if (misc & ATOM_PM_MISCINFO_3D_ACCELERATION_EN) {
1970                 rdev->pm.power_state[state_index].type =
1971                         POWER_STATE_TYPE_PERFORMANCE;
1972                 rdev->pm.power_state[state_index].flags &=
1973                         ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
1974         }
1975         if (misc2 & ATOM_PM_MISCINFO2_SYSTEM_AC_LITE_MODE)
1976                 rdev->pm.power_state[state_index].type =
1977                         POWER_STATE_TYPE_BALANCED;
1978         if (misc & ATOM_PM_MISCINFO_DRIVER_DEFAULT_MODE) {
1979                 rdev->pm.power_state[state_index].type =
1980                         POWER_STATE_TYPE_DEFAULT;
1981                 rdev->pm.default_power_state_index = state_index;
1982                 rdev->pm.power_state[state_index].default_clock_mode =
1983                         &rdev->pm.power_state[state_index].clock_info[0];
1984         } else if (state_index == 0) {
1985                 rdev->pm.power_state[state_index].clock_info[0].flags |=
1986                         RADEON_PM_MODE_NO_DISPLAY;
1987         }
1988 }
1989
1990 static int radeon_atombios_parse_power_table_1_3(struct radeon_device *rdev)
1991 {
1992         struct radeon_mode_info *mode_info = &rdev->mode_info;
1993         u32 misc, misc2 = 0;
1994         int num_modes = 0, i;
1995         int state_index = 0;
1996         struct radeon_i2c_bus_rec i2c_bus;
1997         union power_info *power_info;
1998         int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
1999         u16 data_offset;
2000         u8 frev, crev;
2001
2002         if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2003                                    &frev, &crev, &data_offset))
2004                 return state_index;
2005         power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2006
2007         /* add the i2c bus for thermal/fan chip */
2008         if (power_info->info.ucOverdriveThermalController > 0) {
2009                 DRM_INFO("Possible %s thermal controller at 0x%02x\n",
2010                          thermal_controller_names[power_info->info.ucOverdriveThermalController],
2011                          power_info->info.ucOverdriveControllerAddress >> 1);
2012                 i2c_bus = radeon_lookup_i2c_gpio(rdev, power_info->info.ucOverdriveI2cLine);
2013                 rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
2014                 if (rdev->pm.i2c_bus) {
2015                         struct i2c_board_info info = { };
2016                         const char *name = thermal_controller_names[power_info->info.
2017                                                                     ucOverdriveThermalController];
2018                         info.addr = power_info->info.ucOverdriveControllerAddress >> 1;
2019                         strlcpy(info.type, name, sizeof(info.type));
2020                         i2c_new_device(&rdev->pm.i2c_bus->adapter, &info);
2021                 }
2022         }
2023         num_modes = power_info->info.ucNumOfPowerModeEntries;
2024         if (num_modes > ATOM_MAX_NUMBEROF_POWER_BLOCK)
2025                 num_modes = ATOM_MAX_NUMBEROF_POWER_BLOCK;
2026         rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) * num_modes, GFP_KERNEL);
2027         if (!rdev->pm.power_state)
2028                 return state_index;
2029         /* last mode is usually default, array is low to high */
2030         for (i = 0; i < num_modes; i++) {
2031                 rdev->pm.power_state[state_index].clock_info =
2032                         kzalloc(sizeof(struct radeon_pm_clock_info) * 1, GFP_KERNEL);
2033                 if (!rdev->pm.power_state[state_index].clock_info)
2034                         return state_index;
2035                 rdev->pm.power_state[state_index].num_clock_modes = 1;
2036                 rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
2037                 switch (frev) {
2038                 case 1:
2039                         rdev->pm.power_state[state_index].clock_info[0].mclk =
2040                                 le16_to_cpu(power_info->info.asPowerPlayInfo[i].usMemoryClock);
2041                         rdev->pm.power_state[state_index].clock_info[0].sclk =
2042                                 le16_to_cpu(power_info->info.asPowerPlayInfo[i].usEngineClock);
2043                         /* skip invalid modes */
2044                         if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2045                             (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2046                                 continue;
2047                         rdev->pm.power_state[state_index].pcie_lanes =
2048                                 power_info->info.asPowerPlayInfo[i].ucNumPciELanes;
2049                         misc = le32_to_cpu(power_info->info.asPowerPlayInfo[i].ulMiscInfo);
2050                         if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2051                             (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2052                                 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2053                                         VOLTAGE_GPIO;
2054                                 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2055                                         radeon_lookup_gpio(rdev,
2056                                                            power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex);
2057                                 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2058                                         rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2059                                                 true;
2060                                 else
2061                                         rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2062                                                 false;
2063                         } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2064                                 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2065                                         VOLTAGE_VDDC;
2066                                 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2067                                         power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex;
2068                         }
2069                         rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2070                         radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, 0);
2071                         state_index++;
2072                         break;
2073                 case 2:
2074                         rdev->pm.power_state[state_index].clock_info[0].mclk =
2075                                 le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMemoryClock);
2076                         rdev->pm.power_state[state_index].clock_info[0].sclk =
2077                                 le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulEngineClock);
2078                         /* skip invalid modes */
2079                         if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2080                             (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2081                                 continue;
2082                         rdev->pm.power_state[state_index].pcie_lanes =
2083                                 power_info->info_2.asPowerPlayInfo[i].ucNumPciELanes;
2084                         misc = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo);
2085                         misc2 = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo2);
2086                         if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2087                             (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2088                                 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2089                                         VOLTAGE_GPIO;
2090                                 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2091                                         radeon_lookup_gpio(rdev,
2092                                                            power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex);
2093                                 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2094                                         rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2095                                                 true;
2096                                 else
2097                                         rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2098                                                 false;
2099                         } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2100                                 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2101                                         VOLTAGE_VDDC;
2102                                 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2103                                         power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex;
2104                         }
2105                         rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2106                         radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, misc2);
2107                         state_index++;
2108                         break;
2109                 case 3:
2110                         rdev->pm.power_state[state_index].clock_info[0].mclk =
2111                                 le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMemoryClock);
2112                         rdev->pm.power_state[state_index].clock_info[0].sclk =
2113                                 le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulEngineClock);
2114                         /* skip invalid modes */
2115                         if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2116                             (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2117                                 continue;
2118                         rdev->pm.power_state[state_index].pcie_lanes =
2119                                 power_info->info_3.asPowerPlayInfo[i].ucNumPciELanes;
2120                         misc = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo);
2121                         misc2 = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo2);
2122                         if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2123                             (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2124                                 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2125                                         VOLTAGE_GPIO;
2126                                 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2127                                         radeon_lookup_gpio(rdev,
2128                                                            power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex);
2129                                 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2130                                         rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2131                                                 true;
2132                                 else
2133                                         rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2134                                                 false;
2135                         } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2136                                 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2137                                         VOLTAGE_VDDC;
2138                                 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2139                                         power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex;
2140                                 if (misc2 & ATOM_PM_MISCINFO2_VDDCI_DYNAMIC_VOLTAGE_EN) {
2141                                         rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_enabled =
2142                                                 true;
2143                                         rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_id =
2144                                                 power_info->info_3.asPowerPlayInfo[i].ucVDDCI_VoltageDropIndex;
2145                                 }
2146                         }
2147                         rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2148                         radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, misc2);
2149                         state_index++;
2150                         break;
2151                 }
2152         }
2153         /* last mode is usually default */
2154         if (rdev->pm.default_power_state_index == -1) {
2155                 rdev->pm.power_state[state_index - 1].type =
2156                         POWER_STATE_TYPE_DEFAULT;
2157                 rdev->pm.default_power_state_index = state_index - 1;
2158                 rdev->pm.power_state[state_index - 1].default_clock_mode =
2159                         &rdev->pm.power_state[state_index - 1].clock_info[0];
2160                 rdev->pm.power_state[state_index].flags &=
2161                         ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2162                 rdev->pm.power_state[state_index].misc = 0;
2163                 rdev->pm.power_state[state_index].misc2 = 0;
2164         }
2165         return state_index;
2166 }
2167
2168 static void radeon_atombios_add_pplib_thermal_controller(struct radeon_device *rdev,
2169                                                          ATOM_PPLIB_THERMALCONTROLLER *controller)
2170 {
2171         struct radeon_i2c_bus_rec i2c_bus;
2172
2173         /* add the i2c bus for thermal/fan chip */
2174         if (controller->ucType > 0) {
2175                 if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV6xx) {
2176                         DRM_INFO("Internal thermal controller %s fan control\n",
2177                                  (controller->ucFanParameters &
2178                                   ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2179                         rdev->pm.int_thermal_type = THERMAL_TYPE_RV6XX;
2180                 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV770) {
2181                         DRM_INFO("Internal thermal controller %s fan control\n",
2182                                  (controller->ucFanParameters &
2183                                   ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2184                         rdev->pm.int_thermal_type = THERMAL_TYPE_RV770;
2185                 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_EVERGREEN) {
2186                         DRM_INFO("Internal thermal controller %s fan control\n",
2187                                  (controller->ucFanParameters &
2188                                   ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2189                         rdev->pm.int_thermal_type = THERMAL_TYPE_EVERGREEN;
2190                 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_SUMO) {
2191                         DRM_INFO("Internal thermal controller %s fan control\n",
2192                                  (controller->ucFanParameters &
2193                                   ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2194                         rdev->pm.int_thermal_type = THERMAL_TYPE_SUMO;
2195                 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_NISLANDS) {
2196                         DRM_INFO("Internal thermal controller %s fan control\n",
2197                                  (controller->ucFanParameters &
2198                                   ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2199                         rdev->pm.int_thermal_type = THERMAL_TYPE_NI;
2200                 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_SISLANDS) {
2201                         DRM_INFO("Internal thermal controller %s fan control\n",
2202                                  (controller->ucFanParameters &
2203                                   ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2204                         rdev->pm.int_thermal_type = THERMAL_TYPE_SI;
2205                 } else if ((controller->ucType ==
2206                             ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO) ||
2207                            (controller->ucType ==
2208                             ATOM_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL) ||
2209                            (controller->ucType ==
2210                             ATOM_PP_THERMALCONTROLLER_EMC2103_WITH_INTERNAL)) {
2211                         DRM_INFO("Special thermal controller config\n");
2212                 } else {
2213                         DRM_INFO("Possible %s thermal controller at 0x%02x %s fan control\n",
2214                                  pp_lib_thermal_controller_names[controller->ucType],
2215                                  controller->ucI2cAddress >> 1,
2216                                  (controller->ucFanParameters &
2217                                   ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2218                         i2c_bus = radeon_lookup_i2c_gpio(rdev, controller->ucI2cLine);
2219                         rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
2220                         if (rdev->pm.i2c_bus) {
2221                                 struct i2c_board_info info = { };
2222                                 const char *name = pp_lib_thermal_controller_names[controller->ucType];
2223                                 info.addr = controller->ucI2cAddress >> 1;
2224                                 strlcpy(info.type, name, sizeof(info.type));
2225                                 i2c_new_device(&rdev->pm.i2c_bus->adapter, &info);
2226                         }
2227                 }
2228         }
2229 }
2230
2231 static void radeon_atombios_get_default_voltages(struct radeon_device *rdev,
2232                                                  u16 *vddc, u16 *vddci)
2233 {
2234         struct radeon_mode_info *mode_info = &rdev->mode_info;
2235         int index = GetIndexIntoMasterTable(DATA, FirmwareInfo);
2236         u8 frev, crev;
2237         u16 data_offset;
2238         union firmware_info *firmware_info;
2239
2240         *vddc = 0;
2241         *vddci = 0;
2242
2243         if (atom_parse_data_header(mode_info->atom_context, index, NULL,
2244                                    &frev, &crev, &data_offset)) {
2245                 firmware_info =
2246                         (union firmware_info *)(mode_info->atom_context->bios +
2247                                                 data_offset);
2248                 *vddc = le16_to_cpu(firmware_info->info_14.usBootUpVDDCVoltage);
2249                 if ((frev == 2) && (crev >= 2))
2250                         *vddci = le16_to_cpu(firmware_info->info_22.usBootUpVDDCIVoltage);
2251         }
2252 }
2253
2254 static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rdev,
2255                                                        int state_index, int mode_index,
2256                                                        struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info)
2257 {
2258         int j;
2259         u32 misc = le32_to_cpu(non_clock_info->ulCapsAndSettings);
2260         u32 misc2 = le16_to_cpu(non_clock_info->usClassification);
2261         u16 vddc, vddci;
2262
2263         radeon_atombios_get_default_voltages(rdev, &vddc, &vddci);
2264
2265         rdev->pm.power_state[state_index].misc = misc;
2266         rdev->pm.power_state[state_index].misc2 = misc2;
2267         rdev->pm.power_state[state_index].pcie_lanes =
2268                 ((misc & ATOM_PPLIB_PCIE_LINK_WIDTH_MASK) >>
2269                  ATOM_PPLIB_PCIE_LINK_WIDTH_SHIFT) + 1;
2270         switch (misc2 & ATOM_PPLIB_CLASSIFICATION_UI_MASK) {
2271         case ATOM_PPLIB_CLASSIFICATION_UI_BATTERY:
2272                 rdev->pm.power_state[state_index].type =
2273                         POWER_STATE_TYPE_BATTERY;
2274                 break;
2275         case ATOM_PPLIB_CLASSIFICATION_UI_BALANCED:
2276                 rdev->pm.power_state[state_index].type =
2277                         POWER_STATE_TYPE_BALANCED;
2278                 break;
2279         case ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE:
2280                 rdev->pm.power_state[state_index].type =
2281                         POWER_STATE_TYPE_PERFORMANCE;
2282                 break;
2283         case ATOM_PPLIB_CLASSIFICATION_UI_NONE:
2284                 if (misc2 & ATOM_PPLIB_CLASSIFICATION_3DPERFORMANCE)
2285                         rdev->pm.power_state[state_index].type =
2286                                 POWER_STATE_TYPE_PERFORMANCE;
2287                 break;
2288         }
2289         rdev->pm.power_state[state_index].flags = 0;
2290         if (misc & ATOM_PPLIB_SINGLE_DISPLAY_ONLY)
2291                 rdev->pm.power_state[state_index].flags |=
2292                         RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2293         if (misc2 & ATOM_PPLIB_CLASSIFICATION_BOOT) {
2294                 rdev->pm.power_state[state_index].type =
2295                         POWER_STATE_TYPE_DEFAULT;
2296                 rdev->pm.default_power_state_index = state_index;
2297                 rdev->pm.power_state[state_index].default_clock_mode =
2298                         &rdev->pm.power_state[state_index].clock_info[mode_index - 1];
2299                 if (ASIC_IS_DCE5(rdev) && !(rdev->flags & RADEON_IS_IGP)) {
2300                         /* NI chips post without MC ucode, so default clocks are strobe mode only */
2301                         rdev->pm.default_sclk = rdev->pm.power_state[state_index].clock_info[0].sclk;
2302                         rdev->pm.default_mclk = rdev->pm.power_state[state_index].clock_info[0].mclk;
2303                         rdev->pm.default_vddc = rdev->pm.power_state[state_index].clock_info[0].voltage.voltage;
2304                         rdev->pm.default_vddci = rdev->pm.power_state[state_index].clock_info[0].voltage.vddci;
2305                 } else {
2306                         /* patch the table values with the default slck/mclk from firmware info */
2307                         for (j = 0; j < mode_index; j++) {
2308                                 rdev->pm.power_state[state_index].clock_info[j].mclk =
2309                                         rdev->clock.default_mclk;
2310                                 rdev->pm.power_state[state_index].clock_info[j].sclk =
2311                                         rdev->clock.default_sclk;
2312                                 if (vddc)
2313                                         rdev->pm.power_state[state_index].clock_info[j].voltage.voltage =
2314                                                 vddc;
2315                         }
2316                 }
2317         }
2318 }
2319
2320 static bool radeon_atombios_parse_pplib_clock_info(struct radeon_device *rdev,
2321                                                    int state_index, int mode_index,
2322                                                    union pplib_clock_info *clock_info)
2323 {
2324         u32 sclk, mclk;
2325         u16 vddc;
2326
2327         if (rdev->flags & RADEON_IS_IGP) {
2328                 if (rdev->family >= CHIP_PALM) {
2329                         sclk = le16_to_cpu(clock_info->sumo.usEngineClockLow);
2330                         sclk |= clock_info->sumo.ucEngineClockHigh << 16;
2331                         rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2332                 } else {
2333                         sclk = le16_to_cpu(clock_info->rs780.usLowEngineClockLow);
2334                         sclk |= clock_info->rs780.ucLowEngineClockHigh << 16;
2335                         rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2336                 }
2337         } else if (ASIC_IS_DCE6(rdev)) {
2338                 sclk = le16_to_cpu(clock_info->si.usEngineClockLow);
2339                 sclk |= clock_info->si.ucEngineClockHigh << 16;
2340                 mclk = le16_to_cpu(clock_info->si.usMemoryClockLow);
2341                 mclk |= clock_info->si.ucMemoryClockHigh << 16;
2342                 rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk;
2343                 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2344                 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2345                         VOLTAGE_SW;
2346                 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
2347                         le16_to_cpu(clock_info->si.usVDDC);
2348                 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.vddci =
2349                         le16_to_cpu(clock_info->si.usVDDCI);
2350         } else if (ASIC_IS_DCE4(rdev)) {
2351                 sclk = le16_to_cpu(clock_info->evergreen.usEngineClockLow);
2352                 sclk |= clock_info->evergreen.ucEngineClockHigh << 16;
2353                 mclk = le16_to_cpu(clock_info->evergreen.usMemoryClockLow);
2354                 mclk |= clock_info->evergreen.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->evergreen.usVDDC);
2361                 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.vddci =
2362                         le16_to_cpu(clock_info->evergreen.usVDDCI);
2363         } else {
2364                 sclk = le16_to_cpu(clock_info->r600.usEngineClockLow);
2365                 sclk |= clock_info->r600.ucEngineClockHigh << 16;
2366                 mclk = le16_to_cpu(clock_info->r600.usMemoryClockLow);
2367                 mclk |= clock_info->r600.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->r600.usVDDC);
2374         }
2375
2376         /* patch up vddc if necessary */
2377         switch (rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage) {
2378         case ATOM_VIRTUAL_VOLTAGE_ID0:
2379         case ATOM_VIRTUAL_VOLTAGE_ID1:
2380         case ATOM_VIRTUAL_VOLTAGE_ID2:
2381         case ATOM_VIRTUAL_VOLTAGE_ID3:
2382                 if (radeon_atom_get_max_vddc(rdev, VOLTAGE_TYPE_VDDC,
2383                                              rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage,
2384                                              &vddc) == 0)
2385                         rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage = vddc;
2386                 break;
2387         default:
2388                 break;
2389         }
2390
2391         if (rdev->flags & RADEON_IS_IGP) {
2392                 /* skip invalid modes */
2393                 if (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0)
2394                         return false;
2395         } else {
2396                 /* skip invalid modes */
2397                 if ((rdev->pm.power_state[state_index].clock_info[mode_index].mclk == 0) ||
2398                     (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0))
2399                         return false;
2400         }
2401         return true;
2402 }
2403
2404 static int radeon_atombios_parse_power_table_4_5(struct radeon_device *rdev)
2405 {
2406         struct radeon_mode_info *mode_info = &rdev->mode_info;
2407         struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
2408         union pplib_power_state *power_state;
2409         int i, j;
2410         int state_index = 0, mode_index = 0;
2411         union pplib_clock_info *clock_info;
2412         bool valid;
2413         union power_info *power_info;
2414         int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2415         u16 data_offset;
2416         u8 frev, crev;
2417
2418         if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2419                                    &frev, &crev, &data_offset))
2420                 return state_index;
2421         power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2422
2423         radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
2424         rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
2425                                        power_info->pplib.ucNumStates, GFP_KERNEL);
2426         if (!rdev->pm.power_state)
2427                 return state_index;
2428         /* first mode is usually default, followed by low to high */
2429         for (i = 0; i < power_info->pplib.ucNumStates; i++) {
2430                 mode_index = 0;
2431                 power_state = (union pplib_power_state *)
2432                         (mode_info->atom_context->bios + data_offset +
2433                          le16_to_cpu(power_info->pplib.usStateArrayOffset) +
2434                          i * power_info->pplib.ucStateEntrySize);
2435                 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
2436                         (mode_info->atom_context->bios + data_offset +
2437                          le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset) +
2438                          (power_state->v1.ucNonClockStateIndex *
2439                           power_info->pplib.ucNonClockSize));
2440                 rdev->pm.power_state[i].clock_info = kzalloc(sizeof(struct radeon_pm_clock_info) *
2441                                                              ((power_info->pplib.ucStateEntrySize - 1) ?
2442                                                               (power_info->pplib.ucStateEntrySize - 1) : 1),
2443                                                              GFP_KERNEL);
2444                 if (!rdev->pm.power_state[i].clock_info)
2445                         return state_index;
2446                 if (power_info->pplib.ucStateEntrySize - 1) {
2447                         for (j = 0; j < (power_info->pplib.ucStateEntrySize - 1); j++) {
2448                                 clock_info = (union pplib_clock_info *)
2449                                         (mode_info->atom_context->bios + data_offset +
2450                                          le16_to_cpu(power_info->pplib.usClockInfoArrayOffset) +
2451                                          (power_state->v1.ucClockStateIndices[j] *
2452                                           power_info->pplib.ucClockInfoSize));
2453                                 valid = radeon_atombios_parse_pplib_clock_info(rdev,
2454                                                                                state_index, mode_index,
2455                                                                                clock_info);
2456                                 if (valid)
2457                                         mode_index++;
2458                         }
2459                 } else {
2460                         rdev->pm.power_state[state_index].clock_info[0].mclk =
2461                                 rdev->clock.default_mclk;
2462                         rdev->pm.power_state[state_index].clock_info[0].sclk =
2463                                 rdev->clock.default_sclk;
2464                         mode_index++;
2465                 }
2466                 rdev->pm.power_state[state_index].num_clock_modes = mode_index;
2467                 if (mode_index) {
2468                         radeon_atombios_parse_pplib_non_clock_info(rdev, state_index, mode_index,
2469                                                                    non_clock_info);
2470                         state_index++;
2471                 }
2472         }
2473         /* if multiple clock modes, mark the lowest as no display */
2474         for (i = 0; i < state_index; i++) {
2475                 if (rdev->pm.power_state[i].num_clock_modes > 1)
2476                         rdev->pm.power_state[i].clock_info[0].flags |=
2477                                 RADEON_PM_MODE_NO_DISPLAY;
2478         }
2479         /* first mode is usually default */
2480         if (rdev->pm.default_power_state_index == -1) {
2481                 rdev->pm.power_state[0].type =
2482                         POWER_STATE_TYPE_DEFAULT;
2483                 rdev->pm.default_power_state_index = 0;
2484                 rdev->pm.power_state[0].default_clock_mode =
2485                         &rdev->pm.power_state[0].clock_info[0];
2486         }
2487         return state_index;
2488 }
2489
2490 static int radeon_atombios_parse_power_table_6(struct radeon_device *rdev)
2491 {
2492         struct radeon_mode_info *mode_info = &rdev->mode_info;
2493         struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
2494         union pplib_power_state *power_state;
2495         int i, j, non_clock_array_index, clock_array_index;
2496         int state_index = 0, mode_index = 0;
2497         union pplib_clock_info *clock_info;
2498         struct _StateArray *state_array;
2499         struct _ClockInfoArray *clock_info_array;
2500         struct _NonClockInfoArray *non_clock_info_array;
2501         bool valid;
2502         union power_info *power_info;
2503         int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2504         u16 data_offset;
2505         u8 frev, crev;
2506
2507         if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2508                                    &frev, &crev, &data_offset))
2509                 return state_index;
2510         power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2511
2512         radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
2513         state_array = (struct _StateArray *)
2514                 (mode_info->atom_context->bios + data_offset +
2515                  le16_to_cpu(power_info->pplib.usStateArrayOffset));
2516         clock_info_array = (struct _ClockInfoArray *)
2517                 (mode_info->atom_context->bios + data_offset +
2518                  le16_to_cpu(power_info->pplib.usClockInfoArrayOffset));
2519         non_clock_info_array = (struct _NonClockInfoArray *)
2520                 (mode_info->atom_context->bios + data_offset +
2521                  le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset));
2522         rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
2523                                        state_array->ucNumEntries, GFP_KERNEL);
2524         if (!rdev->pm.power_state)
2525                 return state_index;
2526         for (i = 0; i < state_array->ucNumEntries; i++) {
2527                 mode_index = 0;
2528                 power_state = (union pplib_power_state *)&state_array->states[i];
2529                 /* XXX this might be an inagua bug... */
2530                 non_clock_array_index = i; /* power_state->v2.nonClockInfoIndex */
2531                 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
2532                         &non_clock_info_array->nonClockInfo[non_clock_array_index];
2533                 rdev->pm.power_state[i].clock_info = kzalloc(sizeof(struct radeon_pm_clock_info) *
2534                                                              (power_state->v2.ucNumDPMLevels ?
2535                                                               power_state->v2.ucNumDPMLevels : 1),
2536                                                              GFP_KERNEL);
2537                 if (!rdev->pm.power_state[i].clock_info)
2538                         return state_index;
2539                 if (power_state->v2.ucNumDPMLevels) {
2540                         for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) {
2541                                 clock_array_index = power_state->v2.clockInfoIndex[j];
2542                                 /* XXX this might be an inagua bug... */
2543                                 if (clock_array_index >= clock_info_array->ucNumEntries)
2544                                         continue;
2545                                 clock_info = (union pplib_clock_info *)
2546                                         &clock_info_array->clockInfo[clock_array_index * clock_info_array->ucEntrySize];
2547                                 valid = radeon_atombios_parse_pplib_clock_info(rdev,
2548                                                                                state_index, mode_index,
2549                                                                                clock_info);
2550                                 if (valid)
2551                                         mode_index++;
2552                         }
2553                 } else {
2554                         rdev->pm.power_state[state_index].clock_info[0].mclk =
2555                                 rdev->clock.default_mclk;
2556                         rdev->pm.power_state[state_index].clock_info[0].sclk =
2557                                 rdev->clock.default_sclk;
2558                         mode_index++;
2559                 }
2560                 rdev->pm.power_state[state_index].num_clock_modes = mode_index;
2561                 if (mode_index) {
2562                         radeon_atombios_parse_pplib_non_clock_info(rdev, state_index, mode_index,
2563                                                                    non_clock_info);
2564                         state_index++;
2565                 }
2566         }
2567         /* if multiple clock modes, mark the lowest as no display */
2568         for (i = 0; i < state_index; i++) {
2569                 if (rdev->pm.power_state[i].num_clock_modes > 1)
2570                         rdev->pm.power_state[i].clock_info[0].flags |=
2571                                 RADEON_PM_MODE_NO_DISPLAY;
2572         }
2573         /* first mode is usually default */
2574         if (rdev->pm.default_power_state_index == -1) {
2575                 rdev->pm.power_state[0].type =
2576                         POWER_STATE_TYPE_DEFAULT;
2577                 rdev->pm.default_power_state_index = 0;
2578                 rdev->pm.power_state[0].default_clock_mode =
2579                         &rdev->pm.power_state[0].clock_info[0];
2580         }
2581         return state_index;
2582 }
2583
2584 void radeon_atombios_get_power_modes(struct radeon_device *rdev)
2585 {
2586         struct radeon_mode_info *mode_info = &rdev->mode_info;
2587         int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2588         u16 data_offset;
2589         u8 frev, crev;
2590         int state_index = 0;
2591
2592         rdev->pm.default_power_state_index = -1;
2593
2594         if (atom_parse_data_header(mode_info->atom_context, index, NULL,
2595                                    &frev, &crev, &data_offset)) {
2596                 switch (frev) {
2597                 case 1:
2598                 case 2:
2599                 case 3:
2600                         state_index = radeon_atombios_parse_power_table_1_3(rdev);
2601                         break;
2602                 case 4:
2603                 case 5:
2604                         state_index = radeon_atombios_parse_power_table_4_5(rdev);
2605                         break;
2606                 case 6:
2607                         state_index = radeon_atombios_parse_power_table_6(rdev);
2608                         break;
2609                 default:
2610                         break;
2611                 }
2612         } else {
2613                 rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state), GFP_KERNEL);
2614                 if (rdev->pm.power_state) {
2615                         rdev->pm.power_state[0].clock_info =
2616                                 kzalloc(sizeof(struct radeon_pm_clock_info) * 1, GFP_KERNEL);
2617                         if (rdev->pm.power_state[0].clock_info) {
2618                                 /* add the default mode */
2619                                 rdev->pm.power_state[state_index].type =
2620                                         POWER_STATE_TYPE_DEFAULT;
2621                                 rdev->pm.power_state[state_index].num_clock_modes = 1;
2622                                 rdev->pm.power_state[state_index].clock_info[0].mclk = rdev->clock.default_mclk;
2623                                 rdev->pm.power_state[state_index].clock_info[0].sclk = rdev->clock.default_sclk;
2624                                 rdev->pm.power_state[state_index].default_clock_mode =
2625                                         &rdev->pm.power_state[state_index].clock_info[0];
2626                                 rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
2627                                 rdev->pm.power_state[state_index].pcie_lanes = 16;
2628                                 rdev->pm.default_power_state_index = state_index;
2629                                 rdev->pm.power_state[state_index].flags = 0;
2630                                 state_index++;
2631                         }
2632                 }
2633         }
2634
2635         rdev->pm.num_power_states = state_index;
2636
2637         rdev->pm.current_power_state_index = rdev->pm.default_power_state_index;
2638         rdev->pm.current_clock_mode_index = 0;
2639         if (rdev->pm.default_power_state_index >= 0)
2640                 rdev->pm.current_vddc =
2641                         rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage;
2642         else
2643                 rdev->pm.current_vddc = 0;
2644 }
2645
2646 void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable)
2647 {
2648         DYNAMIC_CLOCK_GATING_PS_ALLOCATION args;
2649         int index = GetIndexIntoMasterTable(COMMAND, DynamicClockGating);
2650
2651         args.ucEnable = enable;
2652
2653         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2654 }
2655
2656 uint32_t radeon_atom_get_engine_clock(struct radeon_device *rdev)
2657 {
2658         GET_ENGINE_CLOCK_PS_ALLOCATION args;
2659         int index = GetIndexIntoMasterTable(COMMAND, GetEngineClock);
2660
2661         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2662         return le32_to_cpu(args.ulReturnEngineClock);
2663 }
2664
2665 uint32_t radeon_atom_get_memory_clock(struct radeon_device *rdev)
2666 {
2667         GET_MEMORY_CLOCK_PS_ALLOCATION args;
2668         int index = GetIndexIntoMasterTable(COMMAND, GetMemoryClock);
2669
2670         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2671         return le32_to_cpu(args.ulReturnMemoryClock);
2672 }
2673
2674 void radeon_atom_set_engine_clock(struct radeon_device *rdev,
2675                                   uint32_t eng_clock)
2676 {
2677         SET_ENGINE_CLOCK_PS_ALLOCATION args;
2678         int index = GetIndexIntoMasterTable(COMMAND, SetEngineClock);
2679
2680         args.ulTargetEngineClock = cpu_to_le32(eng_clock);      /* 10 khz */
2681
2682         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2683 }
2684
2685 void radeon_atom_set_memory_clock(struct radeon_device *rdev,
2686                                   uint32_t mem_clock)
2687 {
2688         SET_MEMORY_CLOCK_PS_ALLOCATION args;
2689         int index = GetIndexIntoMasterTable(COMMAND, SetMemoryClock);
2690
2691         if (rdev->flags & RADEON_IS_IGP)
2692                 return;
2693
2694         args.ulTargetMemoryClock = cpu_to_le32(mem_clock);      /* 10 khz */
2695
2696         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2697 }
2698
2699 union set_voltage {
2700         struct _SET_VOLTAGE_PS_ALLOCATION alloc;
2701         struct _SET_VOLTAGE_PARAMETERS v1;
2702         struct _SET_VOLTAGE_PARAMETERS_V2 v2;
2703         struct _SET_VOLTAGE_PARAMETERS_V1_3 v3;
2704 };
2705
2706 void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type)
2707 {
2708         union set_voltage args;
2709         int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
2710         u8 frev, crev, volt_index = voltage_level;
2711
2712         if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
2713                 return;
2714
2715         /* 0xff01 is a flag rather then an actual voltage */
2716         if (voltage_level == 0xff01)
2717                 return;
2718
2719         switch (crev) {
2720         case 1:
2721                 args.v1.ucVoltageType = voltage_type;
2722                 args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE;
2723                 args.v1.ucVoltageIndex = volt_index;
2724                 break;
2725         case 2:
2726                 args.v2.ucVoltageType = voltage_type;
2727                 args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE;
2728                 args.v2.usVoltageLevel = cpu_to_le16(voltage_level);
2729                 break;
2730         case 3:
2731                 args.v3.ucVoltageType = voltage_type;
2732                 args.v3.ucVoltageMode = ATOM_SET_VOLTAGE;
2733                 args.v3.usVoltageLevel = cpu_to_le16(voltage_level);
2734                 break;
2735         default:
2736                 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
2737                 return;
2738         }
2739
2740         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2741 }
2742
2743 static int radeon_atom_get_max_vddc(struct radeon_device *rdev, u8 voltage_type,
2744                                     u16 voltage_id, u16 *voltage)
2745 {
2746         union set_voltage args;
2747         int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
2748         u8 frev, crev;
2749
2750         if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
2751                 return -EINVAL;
2752
2753         switch (crev) {
2754         case 1:
2755                 return -EINVAL;
2756         case 2:
2757                 args.v2.ucVoltageType = SET_VOLTAGE_GET_MAX_VOLTAGE;
2758                 args.v2.ucVoltageMode = 0;
2759                 args.v2.usVoltageLevel = 0;
2760
2761                 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2762
2763                 *voltage = le16_to_cpu(args.v2.usVoltageLevel);
2764                 break;
2765         case 3:
2766                 args.v3.ucVoltageType = voltage_type;
2767                 args.v3.ucVoltageMode = ATOM_GET_VOLTAGE_LEVEL;
2768                 args.v3.usVoltageLevel = cpu_to_le16(voltage_id);
2769
2770                 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2771
2772                 *voltage = le16_to_cpu(args.v3.usVoltageLevel);
2773                 break;
2774         default:
2775                 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
2776                 return -EINVAL;
2777         }
2778
2779         return 0;
2780 }
2781
2782 void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
2783 {
2784         struct radeon_device *rdev = dev->dev_private;
2785         uint32_t bios_2_scratch, bios_6_scratch;
2786
2787         if (rdev->family >= CHIP_R600) {
2788                 bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH);
2789                 bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
2790         } else {
2791                 bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH);
2792                 bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
2793         }
2794
2795         /* let the bios control the backlight */
2796         bios_2_scratch &= ~ATOM_S2_VRI_BRIGHT_ENABLE;
2797
2798         /* tell the bios not to handle mode switching */
2799         bios_6_scratch |= ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH;
2800
2801         if (rdev->family >= CHIP_R600) {
2802                 WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
2803                 WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
2804         } else {
2805                 WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
2806                 WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
2807         }
2808
2809 }
2810
2811 void radeon_save_bios_scratch_regs(struct radeon_device *rdev)
2812 {
2813         uint32_t scratch_reg;
2814         int i;
2815
2816         if (rdev->family >= CHIP_R600)
2817                 scratch_reg = R600_BIOS_0_SCRATCH;
2818         else
2819                 scratch_reg = RADEON_BIOS_0_SCRATCH;
2820
2821         for (i = 0; i < RADEON_BIOS_NUM_SCRATCH; i++)
2822                 rdev->bios_scratch[i] = RREG32(scratch_reg + (i * 4));
2823 }
2824
2825 void radeon_restore_bios_scratch_regs(struct radeon_device *rdev)
2826 {
2827         uint32_t scratch_reg;
2828         int i;
2829
2830         if (rdev->family >= CHIP_R600)
2831                 scratch_reg = R600_BIOS_0_SCRATCH;
2832         else
2833                 scratch_reg = RADEON_BIOS_0_SCRATCH;
2834
2835         for (i = 0; i < RADEON_BIOS_NUM_SCRATCH; i++)
2836                 WREG32(scratch_reg + (i * 4), rdev->bios_scratch[i]);
2837 }
2838
2839 void radeon_atom_output_lock(struct drm_encoder *encoder, bool lock)
2840 {
2841         struct drm_device *dev = encoder->dev;
2842         struct radeon_device *rdev = dev->dev_private;
2843         uint32_t bios_6_scratch;
2844
2845         if (rdev->family >= CHIP_R600)
2846                 bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
2847         else
2848                 bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
2849
2850         if (lock) {
2851                 bios_6_scratch |= ATOM_S6_CRITICAL_STATE;
2852                 bios_6_scratch &= ~ATOM_S6_ACC_MODE;
2853         } else {
2854                 bios_6_scratch &= ~ATOM_S6_CRITICAL_STATE;
2855                 bios_6_scratch |= ATOM_S6_ACC_MODE;
2856         }
2857
2858         if (rdev->family >= CHIP_R600)
2859                 WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
2860         else
2861                 WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
2862 }
2863
2864 /* at some point we may want to break this out into individual functions */
2865 void
2866 radeon_atombios_connected_scratch_regs(struct drm_connector *connector,
2867                                        struct drm_encoder *encoder,
2868                                        bool connected)
2869 {
2870         struct drm_device *dev = connector->dev;
2871         struct radeon_device *rdev = dev->dev_private;
2872         struct radeon_connector *radeon_connector =
2873             to_radeon_connector(connector);
2874         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2875         uint32_t bios_0_scratch, bios_3_scratch, bios_6_scratch;
2876
2877         if (rdev->family >= CHIP_R600) {
2878                 bios_0_scratch = RREG32(R600_BIOS_0_SCRATCH);
2879                 bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH);
2880                 bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
2881         } else {
2882                 bios_0_scratch = RREG32(RADEON_BIOS_0_SCRATCH);
2883                 bios_3_scratch = RREG32(RADEON_BIOS_3_SCRATCH);
2884                 bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
2885         }
2886
2887         if ((radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) &&
2888             (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT)) {
2889                 if (connected) {
2890                         DRM_DEBUG_KMS("TV1 connected\n");
2891                         bios_3_scratch |= ATOM_S3_TV1_ACTIVE;
2892                         bios_6_scratch |= ATOM_S6_ACC_REQ_TV1;
2893                 } else {
2894                         DRM_DEBUG_KMS("TV1 disconnected\n");
2895                         bios_0_scratch &= ~ATOM_S0_TV1_MASK;
2896                         bios_3_scratch &= ~ATOM_S3_TV1_ACTIVE;
2897                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_TV1;
2898                 }
2899         }
2900         if ((radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) &&
2901             (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT)) {
2902                 if (connected) {
2903                         DRM_DEBUG_KMS("CV connected\n");
2904                         bios_3_scratch |= ATOM_S3_CV_ACTIVE;
2905                         bios_6_scratch |= ATOM_S6_ACC_REQ_CV;
2906                 } else {
2907                         DRM_DEBUG_KMS("CV disconnected\n");
2908                         bios_0_scratch &= ~ATOM_S0_CV_MASK;
2909                         bios_3_scratch &= ~ATOM_S3_CV_ACTIVE;
2910                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_CV;
2911                 }
2912         }
2913         if ((radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) &&
2914             (radeon_connector->devices & ATOM_DEVICE_LCD1_SUPPORT)) {
2915                 if (connected) {
2916                         DRM_DEBUG_KMS("LCD1 connected\n");
2917                         bios_0_scratch |= ATOM_S0_LCD1;
2918                         bios_3_scratch |= ATOM_S3_LCD1_ACTIVE;
2919                         bios_6_scratch |= ATOM_S6_ACC_REQ_LCD1;
2920                 } else {
2921                         DRM_DEBUG_KMS("LCD1 disconnected\n");
2922                         bios_0_scratch &= ~ATOM_S0_LCD1;
2923                         bios_3_scratch &= ~ATOM_S3_LCD1_ACTIVE;
2924                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_LCD1;
2925                 }
2926         }
2927         if ((radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) &&
2928             (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT)) {
2929                 if (connected) {
2930                         DRM_DEBUG_KMS("CRT1 connected\n");
2931                         bios_0_scratch |= ATOM_S0_CRT1_COLOR;
2932                         bios_3_scratch |= ATOM_S3_CRT1_ACTIVE;
2933                         bios_6_scratch |= ATOM_S6_ACC_REQ_CRT1;
2934                 } else {
2935                         DRM_DEBUG_KMS("CRT1 disconnected\n");
2936                         bios_0_scratch &= ~ATOM_S0_CRT1_MASK;
2937                         bios_3_scratch &= ~ATOM_S3_CRT1_ACTIVE;
2938                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT1;
2939                 }
2940         }
2941         if ((radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) &&
2942             (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT)) {
2943                 if (connected) {
2944                         DRM_DEBUG_KMS("CRT2 connected\n");
2945                         bios_0_scratch |= ATOM_S0_CRT2_COLOR;
2946                         bios_3_scratch |= ATOM_S3_CRT2_ACTIVE;
2947                         bios_6_scratch |= ATOM_S6_ACC_REQ_CRT2;
2948                 } else {
2949                         DRM_DEBUG_KMS("CRT2 disconnected\n");
2950                         bios_0_scratch &= ~ATOM_S0_CRT2_MASK;
2951                         bios_3_scratch &= ~ATOM_S3_CRT2_ACTIVE;
2952                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT2;
2953                 }
2954         }
2955         if ((radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) &&
2956             (radeon_connector->devices & ATOM_DEVICE_DFP1_SUPPORT)) {
2957                 if (connected) {
2958                         DRM_DEBUG_KMS("DFP1 connected\n");
2959                         bios_0_scratch |= ATOM_S0_DFP1;
2960                         bios_3_scratch |= ATOM_S3_DFP1_ACTIVE;
2961                         bios_6_scratch |= ATOM_S6_ACC_REQ_DFP1;
2962                 } else {
2963                         DRM_DEBUG_KMS("DFP1 disconnected\n");
2964                         bios_0_scratch &= ~ATOM_S0_DFP1;
2965                         bios_3_scratch &= ~ATOM_S3_DFP1_ACTIVE;
2966                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP1;
2967                 }
2968         }
2969         if ((radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) &&
2970             (radeon_connector->devices & ATOM_DEVICE_DFP2_SUPPORT)) {
2971                 if (connected) {
2972                         DRM_DEBUG_KMS("DFP2 connected\n");
2973                         bios_0_scratch |= ATOM_S0_DFP2;
2974                         bios_3_scratch |= ATOM_S3_DFP2_ACTIVE;
2975                         bios_6_scratch |= ATOM_S6_ACC_REQ_DFP2;
2976                 } else {
2977                         DRM_DEBUG_KMS("DFP2 disconnected\n");
2978                         bios_0_scratch &= ~ATOM_S0_DFP2;
2979                         bios_3_scratch &= ~ATOM_S3_DFP2_ACTIVE;
2980                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP2;
2981                 }
2982         }
2983         if ((radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) &&
2984             (radeon_connector->devices & ATOM_DEVICE_DFP3_SUPPORT)) {
2985                 if (connected) {
2986                         DRM_DEBUG_KMS("DFP3 connected\n");
2987                         bios_0_scratch |= ATOM_S0_DFP3;
2988                         bios_3_scratch |= ATOM_S3_DFP3_ACTIVE;
2989                         bios_6_scratch |= ATOM_S6_ACC_REQ_DFP3;
2990                 } else {
2991                         DRM_DEBUG_KMS("DFP3 disconnected\n");
2992                         bios_0_scratch &= ~ATOM_S0_DFP3;
2993                         bios_3_scratch &= ~ATOM_S3_DFP3_ACTIVE;
2994                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP3;
2995                 }
2996         }
2997         if ((radeon_encoder->devices & ATOM_DEVICE_DFP4_SUPPORT) &&
2998             (radeon_connector->devices & ATOM_DEVICE_DFP4_SUPPORT)) {
2999                 if (connected) {
3000                         DRM_DEBUG_KMS("DFP4 connected\n");
3001                         bios_0_scratch |= ATOM_S0_DFP4;
3002                         bios_3_scratch |= ATOM_S3_DFP4_ACTIVE;
3003                         bios_6_scratch |= ATOM_S6_ACC_REQ_DFP4;
3004                 } else {
3005                         DRM_DEBUG_KMS("DFP4 disconnected\n");
3006                         bios_0_scratch &= ~ATOM_S0_DFP4;
3007                         bios_3_scratch &= ~ATOM_S3_DFP4_ACTIVE;
3008                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP4;
3009                 }
3010         }
3011         if ((radeon_encoder->devices & ATOM_DEVICE_DFP5_SUPPORT) &&
3012             (radeon_connector->devices & ATOM_DEVICE_DFP5_SUPPORT)) {
3013                 if (connected) {
3014                         DRM_DEBUG_KMS("DFP5 connected\n");
3015                         bios_0_scratch |= ATOM_S0_DFP5;
3016                         bios_3_scratch |= ATOM_S3_DFP5_ACTIVE;
3017                         bios_6_scratch |= ATOM_S6_ACC_REQ_DFP5;
3018                 } else {
3019                         DRM_DEBUG_KMS("DFP5 disconnected\n");
3020                         bios_0_scratch &= ~ATOM_S0_DFP5;
3021                         bios_3_scratch &= ~ATOM_S3_DFP5_ACTIVE;
3022                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP5;
3023                 }
3024         }
3025         if ((radeon_encoder->devices & ATOM_DEVICE_DFP6_SUPPORT) &&
3026             (radeon_connector->devices & ATOM_DEVICE_DFP6_SUPPORT)) {
3027                 if (connected) {
3028                         DRM_DEBUG_KMS("DFP6 connected\n");
3029                         bios_0_scratch |= ATOM_S0_DFP6;
3030                         bios_3_scratch |= ATOM_S3_DFP6_ACTIVE;
3031                         bios_6_scratch |= ATOM_S6_ACC_REQ_DFP6;
3032                 } else {
3033                         DRM_DEBUG_KMS("DFP6 disconnected\n");
3034                         bios_0_scratch &= ~ATOM_S0_DFP6;
3035                         bios_3_scratch &= ~ATOM_S3_DFP6_ACTIVE;
3036                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP6;
3037                 }
3038         }
3039
3040         if (rdev->family >= CHIP_R600) {
3041                 WREG32(R600_BIOS_0_SCRATCH, bios_0_scratch);
3042                 WREG32(R600_BIOS_3_SCRATCH, bios_3_scratch);
3043                 WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
3044         } else {
3045                 WREG32(RADEON_BIOS_0_SCRATCH, bios_0_scratch);
3046                 WREG32(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
3047                 WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
3048         }
3049 }
3050
3051 void
3052 radeon_atombios_encoder_crtc_scratch_regs(struct drm_encoder *encoder, int crtc)
3053 {
3054         struct drm_device *dev = encoder->dev;
3055         struct radeon_device *rdev = dev->dev_private;
3056         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
3057         uint32_t bios_3_scratch;
3058
3059         if (ASIC_IS_DCE4(rdev))
3060                 return;
3061
3062         if (rdev->family >= CHIP_R600)
3063                 bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH);
3064         else
3065                 bios_3_scratch = RREG32(RADEON_BIOS_3_SCRATCH);
3066
3067         if (radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) {
3068                 bios_3_scratch &= ~ATOM_S3_TV1_CRTC_ACTIVE;
3069                 bios_3_scratch |= (crtc << 18);
3070         }
3071         if (radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) {
3072                 bios_3_scratch &= ~ATOM_S3_CV_CRTC_ACTIVE;
3073                 bios_3_scratch |= (crtc << 24);
3074         }
3075         if (radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) {
3076                 bios_3_scratch &= ~ATOM_S3_CRT1_CRTC_ACTIVE;
3077                 bios_3_scratch |= (crtc << 16);
3078         }
3079         if (radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) {
3080                 bios_3_scratch &= ~ATOM_S3_CRT2_CRTC_ACTIVE;
3081                 bios_3_scratch |= (crtc << 20);
3082         }
3083         if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) {
3084                 bios_3_scratch &= ~ATOM_S3_LCD1_CRTC_ACTIVE;
3085                 bios_3_scratch |= (crtc << 17);
3086         }
3087         if (radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) {
3088                 bios_3_scratch &= ~ATOM_S3_DFP1_CRTC_ACTIVE;
3089                 bios_3_scratch |= (crtc << 19);
3090         }
3091         if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) {
3092                 bios_3_scratch &= ~ATOM_S3_DFP2_CRTC_ACTIVE;
3093                 bios_3_scratch |= (crtc << 23);
3094         }
3095         if (radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) {
3096                 bios_3_scratch &= ~ATOM_S3_DFP3_CRTC_ACTIVE;
3097                 bios_3_scratch |= (crtc << 25);
3098         }
3099
3100         if (rdev->family >= CHIP_R600)
3101                 WREG32(R600_BIOS_3_SCRATCH, bios_3_scratch);
3102         else
3103                 WREG32(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
3104 }
3105
3106 void
3107 radeon_atombios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on)
3108 {
3109         struct drm_device *dev = encoder->dev;
3110         struct radeon_device *rdev = dev->dev_private;
3111         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
3112         uint32_t bios_2_scratch;
3113
3114         if (ASIC_IS_DCE4(rdev))
3115                 return;
3116
3117         if (rdev->family >= CHIP_R600)
3118                 bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH);
3119         else
3120                 bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH);
3121
3122         if (radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) {
3123                 if (on)
3124                         bios_2_scratch &= ~ATOM_S2_TV1_DPMS_STATE;
3125                 else
3126                         bios_2_scratch |= ATOM_S2_TV1_DPMS_STATE;
3127         }
3128         if (radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) {
3129                 if (on)
3130                         bios_2_scratch &= ~ATOM_S2_CV_DPMS_STATE;
3131                 else
3132                         bios_2_scratch |= ATOM_S2_CV_DPMS_STATE;
3133         }
3134         if (radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) {
3135                 if (on)
3136                         bios_2_scratch &= ~ATOM_S2_CRT1_DPMS_STATE;
3137                 else
3138                         bios_2_scratch |= ATOM_S2_CRT1_DPMS_STATE;
3139         }
3140         if (radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) {
3141                 if (on)
3142                         bios_2_scratch &= ~ATOM_S2_CRT2_DPMS_STATE;
3143                 else
3144                         bios_2_scratch |= ATOM_S2_CRT2_DPMS_STATE;
3145         }
3146         if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) {
3147                 if (on)
3148                         bios_2_scratch &= ~ATOM_S2_LCD1_DPMS_STATE;
3149                 else
3150                         bios_2_scratch |= ATOM_S2_LCD1_DPMS_STATE;
3151         }
3152         if (radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) {
3153                 if (on)
3154                         bios_2_scratch &= ~ATOM_S2_DFP1_DPMS_STATE;
3155                 else
3156                         bios_2_scratch |= ATOM_S2_DFP1_DPMS_STATE;
3157         }
3158         if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) {
3159                 if (on)
3160                         bios_2_scratch &= ~ATOM_S2_DFP2_DPMS_STATE;
3161                 else
3162                         bios_2_scratch |= ATOM_S2_DFP2_DPMS_STATE;
3163         }
3164         if (radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) {
3165                 if (on)
3166                         bios_2_scratch &= ~ATOM_S2_DFP3_DPMS_STATE;
3167                 else
3168                         bios_2_scratch |= ATOM_S2_DFP3_DPMS_STATE;
3169         }
3170         if (radeon_encoder->devices & ATOM_DEVICE_DFP4_SUPPORT) {
3171                 if (on)
3172                         bios_2_scratch &= ~ATOM_S2_DFP4_DPMS_STATE;
3173                 else
3174                         bios_2_scratch |= ATOM_S2_DFP4_DPMS_STATE;
3175         }
3176         if (radeon_encoder->devices & ATOM_DEVICE_DFP5_SUPPORT) {
3177                 if (on)
3178                         bios_2_scratch &= ~ATOM_S2_DFP5_DPMS_STATE;
3179                 else
3180                         bios_2_scratch |= ATOM_S2_DFP5_DPMS_STATE;
3181         }
3182
3183         if (rdev->family >= CHIP_R600)
3184                 WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
3185         else
3186                 WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
3187 }