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