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