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