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