Merge branches 'stable/ia64', 'stable/blkfront-cleanup' and 'stable/cleanup' of git...
[pandora-kernel.git] / drivers / gpu / drm / radeon / radeon_atombios.c
1 /*
2  * Copyright 2007-8 Advanced Micro Devices, Inc.
3  * Copyright 2008 Red Hat Inc.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21  * OTHER DEALINGS IN THE SOFTWARE.
22  *
23  * Authors: Dave Airlie
24  *          Alex Deucher
25  */
26 #include "drmP.h"
27 #include "radeon_drm.h"
28 #include "radeon.h"
29
30 #include "atom.h"
31 #include "atom-bits.h"
32
33 /* from radeon_encoder.c */
34 extern uint32_t
35 radeon_get_encoder_enum(struct drm_device *dev, uint32_t supported_device,
36                         uint8_t dac);
37 extern void radeon_link_encoder_connector(struct drm_device *dev);
38 extern void
39 radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_enum,
40                         uint32_t supported_device, u16 caps);
41
42 /* from radeon_connector.c */
43 extern void
44 radeon_add_atom_connector(struct drm_device *dev,
45                           uint32_t connector_id,
46                           uint32_t supported_device,
47                           int connector_type,
48                           struct radeon_i2c_bus_rec *i2c_bus,
49                           uint32_t igp_lane_info,
50                           uint16_t connector_object_id,
51                           struct radeon_hpd *hpd,
52                           struct radeon_router *router);
53
54 /* from radeon_legacy_encoder.c */
55 extern void
56 radeon_add_legacy_encoder(struct drm_device *dev, uint32_t encoder_enum,
57                           uint32_t supported_device);
58
59 union atom_supported_devices {
60         struct _ATOM_SUPPORTED_DEVICES_INFO info;
61         struct _ATOM_SUPPORTED_DEVICES_INFO_2 info_2;
62         struct _ATOM_SUPPORTED_DEVICES_INFO_2d1 info_2d1;
63 };
64
65 static inline struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_device *rdev,
66                                                                uint8_t id)
67 {
68         struct atom_context *ctx = rdev->mode_info.atom_context;
69         ATOM_GPIO_I2C_ASSIGMENT *gpio;
70         struct radeon_i2c_bus_rec i2c;
71         int index = GetIndexIntoMasterTable(DATA, GPIO_I2C_Info);
72         struct _ATOM_GPIO_I2C_INFO *i2c_info;
73         uint16_t data_offset, size;
74         int i, num_indices;
75
76         memset(&i2c, 0, sizeof(struct radeon_i2c_bus_rec));
77         i2c.valid = false;
78
79         if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) {
80                 i2c_info = (struct _ATOM_GPIO_I2C_INFO *)(ctx->bios + data_offset);
81
82                 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
83                         sizeof(ATOM_GPIO_I2C_ASSIGMENT);
84
85                 for (i = 0; i < num_indices; i++) {
86                         gpio = &i2c_info->asGPIO_Info[i];
87
88                         /* some evergreen boards have bad data for this entry */
89                         if (ASIC_IS_DCE4(rdev)) {
90                                 if ((i == 7) &&
91                                     (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1936) &&
92                                     (gpio->sucI2cId.ucAccess == 0)) {
93                                         gpio->sucI2cId.ucAccess = 0x97;
94                                         gpio->ucDataMaskShift = 8;
95                                         gpio->ucDataEnShift = 8;
96                                         gpio->ucDataY_Shift = 8;
97                                         gpio->ucDataA_Shift = 8;
98                                 }
99                         }
100
101                         /* some DCE3 boards have bad data for this entry */
102                         if (ASIC_IS_DCE3(rdev)) {
103                                 if ((i == 4) &&
104                                     (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1fda) &&
105                                     (gpio->sucI2cId.ucAccess == 0x94))
106                                         gpio->sucI2cId.ucAccess = 0x14;
107                         }
108
109                         if (gpio->sucI2cId.ucAccess == id) {
110                                 i2c.mask_clk_reg = le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4;
111                                 i2c.mask_data_reg = le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4;
112                                 i2c.en_clk_reg = le16_to_cpu(gpio->usClkEnRegisterIndex) * 4;
113                                 i2c.en_data_reg = le16_to_cpu(gpio->usDataEnRegisterIndex) * 4;
114                                 i2c.y_clk_reg = le16_to_cpu(gpio->usClkY_RegisterIndex) * 4;
115                                 i2c.y_data_reg = le16_to_cpu(gpio->usDataY_RegisterIndex) * 4;
116                                 i2c.a_clk_reg = le16_to_cpu(gpio->usClkA_RegisterIndex) * 4;
117                                 i2c.a_data_reg = le16_to_cpu(gpio->usDataA_RegisterIndex) * 4;
118                                 i2c.mask_clk_mask = (1 << gpio->ucClkMaskShift);
119                                 i2c.mask_data_mask = (1 << gpio->ucDataMaskShift);
120                                 i2c.en_clk_mask = (1 << gpio->ucClkEnShift);
121                                 i2c.en_data_mask = (1 << gpio->ucDataEnShift);
122                                 i2c.y_clk_mask = (1 << gpio->ucClkY_Shift);
123                                 i2c.y_data_mask = (1 << gpio->ucDataY_Shift);
124                                 i2c.a_clk_mask = (1 << gpio->ucClkA_Shift);
125                                 i2c.a_data_mask = (1 << gpio->ucDataA_Shift);
126
127                                 if (gpio->sucI2cId.sbfAccess.bfHW_Capable)
128                                         i2c.hw_capable = true;
129                                 else
130                                         i2c.hw_capable = false;
131
132                                 if (gpio->sucI2cId.ucAccess == 0xa0)
133                                         i2c.mm_i2c = true;
134                                 else
135                                         i2c.mm_i2c = false;
136
137                                 i2c.i2c_id = gpio->sucI2cId.ucAccess;
138
139                                 if (i2c.mask_clk_reg)
140                                         i2c.valid = true;
141                                 break;
142                         }
143                 }
144         }
145
146         return i2c;
147 }
148
149 void radeon_atombios_i2c_init(struct radeon_device *rdev)
150 {
151         struct atom_context *ctx = rdev->mode_info.atom_context;
152         ATOM_GPIO_I2C_ASSIGMENT *gpio;
153         struct radeon_i2c_bus_rec i2c;
154         int index = GetIndexIntoMasterTable(DATA, GPIO_I2C_Info);
155         struct _ATOM_GPIO_I2C_INFO *i2c_info;
156         uint16_t data_offset, size;
157         int i, num_indices;
158         char stmp[32];
159
160         memset(&i2c, 0, sizeof(struct radeon_i2c_bus_rec));
161
162         if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) {
163                 i2c_info = (struct _ATOM_GPIO_I2C_INFO *)(ctx->bios + data_offset);
164
165                 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
166                         sizeof(ATOM_GPIO_I2C_ASSIGMENT);
167
168                 for (i = 0; i < num_indices; i++) {
169                         gpio = &i2c_info->asGPIO_Info[i];
170                         i2c.valid = false;
171
172                         /* some evergreen boards have bad data for this entry */
173                         if (ASIC_IS_DCE4(rdev)) {
174                                 if ((i == 7) &&
175                                     (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1936) &&
176                                     (gpio->sucI2cId.ucAccess == 0)) {
177                                         gpio->sucI2cId.ucAccess = 0x97;
178                                         gpio->ucDataMaskShift = 8;
179                                         gpio->ucDataEnShift = 8;
180                                         gpio->ucDataY_Shift = 8;
181                                         gpio->ucDataA_Shift = 8;
182                                 }
183                         }
184
185                         /* some DCE3 boards have bad data for this entry */
186                         if (ASIC_IS_DCE3(rdev)) {
187                                 if ((i == 4) &&
188                                     (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1fda) &&
189                                     (gpio->sucI2cId.ucAccess == 0x94))
190                                         gpio->sucI2cId.ucAccess = 0x14;
191                         }
192
193                         i2c.mask_clk_reg = le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4;
194                         i2c.mask_data_reg = le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4;
195                         i2c.en_clk_reg = le16_to_cpu(gpio->usClkEnRegisterIndex) * 4;
196                         i2c.en_data_reg = le16_to_cpu(gpio->usDataEnRegisterIndex) * 4;
197                         i2c.y_clk_reg = le16_to_cpu(gpio->usClkY_RegisterIndex) * 4;
198                         i2c.y_data_reg = le16_to_cpu(gpio->usDataY_RegisterIndex) * 4;
199                         i2c.a_clk_reg = le16_to_cpu(gpio->usClkA_RegisterIndex) * 4;
200                         i2c.a_data_reg = le16_to_cpu(gpio->usDataA_RegisterIndex) * 4;
201                         i2c.mask_clk_mask = (1 << gpio->ucClkMaskShift);
202                         i2c.mask_data_mask = (1 << gpio->ucDataMaskShift);
203                         i2c.en_clk_mask = (1 << gpio->ucClkEnShift);
204                         i2c.en_data_mask = (1 << gpio->ucDataEnShift);
205                         i2c.y_clk_mask = (1 << gpio->ucClkY_Shift);
206                         i2c.y_data_mask = (1 << gpio->ucDataY_Shift);
207                         i2c.a_clk_mask = (1 << gpio->ucClkA_Shift);
208                         i2c.a_data_mask = (1 << gpio->ucDataA_Shift);
209
210                         if (gpio->sucI2cId.sbfAccess.bfHW_Capable)
211                                 i2c.hw_capable = true;
212                         else
213                                 i2c.hw_capable = false;
214
215                         if (gpio->sucI2cId.ucAccess == 0xa0)
216                                 i2c.mm_i2c = true;
217                         else
218                                 i2c.mm_i2c = false;
219
220                         i2c.i2c_id = gpio->sucI2cId.ucAccess;
221
222                         if (i2c.mask_clk_reg) {
223                                 i2c.valid = true;
224                                 sprintf(stmp, "0x%x", i2c.i2c_id);
225                                 rdev->i2c_bus[i] = radeon_i2c_create(rdev->ddev, &i2c, stmp);
226                         }
227                 }
228         }
229 }
230
231 static inline struct radeon_gpio_rec radeon_lookup_gpio(struct radeon_device *rdev,
232                                                         u8 id)
233 {
234         struct atom_context *ctx = rdev->mode_info.atom_context;
235         struct radeon_gpio_rec gpio;
236         int index = GetIndexIntoMasterTable(DATA, GPIO_Pin_LUT);
237         struct _ATOM_GPIO_PIN_LUT *gpio_info;
238         ATOM_GPIO_PIN_ASSIGNMENT *pin;
239         u16 data_offset, size;
240         int i, num_indices;
241
242         memset(&gpio, 0, sizeof(struct radeon_gpio_rec));
243         gpio.valid = false;
244
245         if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) {
246                 gpio_info = (struct _ATOM_GPIO_PIN_LUT *)(ctx->bios + data_offset);
247
248                 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
249                         sizeof(ATOM_GPIO_PIN_ASSIGNMENT);
250
251                 for (i = 0; i < num_indices; i++) {
252                         pin = &gpio_info->asGPIO_Pin[i];
253                         if (id == pin->ucGPIO_ID) {
254                                 gpio.id = pin->ucGPIO_ID;
255                                 gpio.reg = le16_to_cpu(pin->usGpioPin_AIndex) * 4;
256                                 gpio.mask = (1 << pin->ucGpioPinBitShift);
257                                 gpio.valid = true;
258                                 break;
259                         }
260                 }
261         }
262
263         return gpio;
264 }
265
266 static struct radeon_hpd radeon_atom_get_hpd_info_from_gpio(struct radeon_device *rdev,
267                                                             struct radeon_gpio_rec *gpio)
268 {
269         struct radeon_hpd hpd;
270         u32 reg;
271
272         memset(&hpd, 0, sizeof(struct radeon_hpd));
273
274         if (ASIC_IS_DCE4(rdev))
275                 reg = EVERGREEN_DC_GPIO_HPD_A;
276         else
277                 reg = AVIVO_DC_GPIO_HPD_A;
278
279         hpd.gpio = *gpio;
280         if (gpio->reg == reg) {
281                 switch(gpio->mask) {
282                 case (1 << 0):
283                         hpd.hpd = RADEON_HPD_1;
284                         break;
285                 case (1 << 8):
286                         hpd.hpd = RADEON_HPD_2;
287                         break;
288                 case (1 << 16):
289                         hpd.hpd = RADEON_HPD_3;
290                         break;
291                 case (1 << 24):
292                         hpd.hpd = RADEON_HPD_4;
293                         break;
294                 case (1 << 26):
295                         hpd.hpd = RADEON_HPD_5;
296                         break;
297                 case (1 << 28):
298                         hpd.hpd = RADEON_HPD_6;
299                         break;
300                 default:
301                         hpd.hpd = RADEON_HPD_NONE;
302                         break;
303                 }
304         } else
305                 hpd.hpd = RADEON_HPD_NONE;
306         return hpd;
307 }
308
309 static bool radeon_atom_apply_quirks(struct drm_device *dev,
310                                      uint32_t supported_device,
311                                      int *connector_type,
312                                      struct radeon_i2c_bus_rec *i2c_bus,
313                                      uint16_t *line_mux,
314                                      struct radeon_hpd *hpd)
315 {
316
317         /* Asus M2A-VM HDMI board lists the DVI port as HDMI */
318         if ((dev->pdev->device == 0x791e) &&
319             (dev->pdev->subsystem_vendor == 0x1043) &&
320             (dev->pdev->subsystem_device == 0x826d)) {
321                 if ((*connector_type == DRM_MODE_CONNECTOR_HDMIA) &&
322                     (supported_device == ATOM_DEVICE_DFP3_SUPPORT))
323                         *connector_type = DRM_MODE_CONNECTOR_DVID;
324         }
325
326         /* Asrock RS600 board lists the DVI port as HDMI */
327         if ((dev->pdev->device == 0x7941) &&
328             (dev->pdev->subsystem_vendor == 0x1849) &&
329             (dev->pdev->subsystem_device == 0x7941)) {
330                 if ((*connector_type == DRM_MODE_CONNECTOR_HDMIA) &&
331                     (supported_device == ATOM_DEVICE_DFP3_SUPPORT))
332                         *connector_type = DRM_MODE_CONNECTOR_DVID;
333         }
334
335         /* MSI K9A2GM V2/V3 board has no HDMI or DVI */
336         if ((dev->pdev->device == 0x796e) &&
337             (dev->pdev->subsystem_vendor == 0x1462) &&
338             (dev->pdev->subsystem_device == 0x7302)) {
339                 if ((supported_device == ATOM_DEVICE_DFP2_SUPPORT) ||
340                     (supported_device == ATOM_DEVICE_DFP3_SUPPORT))
341                         return false;
342         }
343
344         /* a-bit f-i90hd - ciaranm on #radeonhd - this board has no DVI */
345         if ((dev->pdev->device == 0x7941) &&
346             (dev->pdev->subsystem_vendor == 0x147b) &&
347             (dev->pdev->subsystem_device == 0x2412)) {
348                 if (*connector_type == DRM_MODE_CONNECTOR_DVII)
349                         return false;
350         }
351
352         /* Falcon NW laptop lists vga ddc line for LVDS */
353         if ((dev->pdev->device == 0x5653) &&
354             (dev->pdev->subsystem_vendor == 0x1462) &&
355             (dev->pdev->subsystem_device == 0x0291)) {
356                 if (*connector_type == DRM_MODE_CONNECTOR_LVDS) {
357                         i2c_bus->valid = false;
358                         *line_mux = 53;
359                 }
360         }
361
362         /* HIS X1300 is DVI+VGA, not DVI+DVI */
363         if ((dev->pdev->device == 0x7146) &&
364             (dev->pdev->subsystem_vendor == 0x17af) &&
365             (dev->pdev->subsystem_device == 0x2058)) {
366                 if (supported_device == ATOM_DEVICE_DFP1_SUPPORT)
367                         return false;
368         }
369
370         /* Gigabyte X1300 is DVI+VGA, not DVI+DVI */
371         if ((dev->pdev->device == 0x7142) &&
372             (dev->pdev->subsystem_vendor == 0x1458) &&
373             (dev->pdev->subsystem_device == 0x2134)) {
374                 if (supported_device == ATOM_DEVICE_DFP1_SUPPORT)
375                         return false;
376         }
377
378
379         /* Funky macbooks */
380         if ((dev->pdev->device == 0x71C5) &&
381             (dev->pdev->subsystem_vendor == 0x106b) &&
382             (dev->pdev->subsystem_device == 0x0080)) {
383                 if ((supported_device == ATOM_DEVICE_CRT1_SUPPORT) ||
384                     (supported_device == ATOM_DEVICE_DFP2_SUPPORT))
385                         return false;
386                 if (supported_device == ATOM_DEVICE_CRT2_SUPPORT)
387                         *line_mux = 0x90;
388         }
389
390         /* mac rv630, rv730, others */
391         if ((supported_device == ATOM_DEVICE_TV1_SUPPORT) &&
392             (*connector_type == DRM_MODE_CONNECTOR_DVII)) {
393                 *connector_type = DRM_MODE_CONNECTOR_9PinDIN;
394                 *line_mux = CONNECTOR_7PIN_DIN_ENUM_ID1;
395         }
396
397         /* ASUS HD 3600 XT board lists the DVI port as HDMI */
398         if ((dev->pdev->device == 0x9598) &&
399             (dev->pdev->subsystem_vendor == 0x1043) &&
400             (dev->pdev->subsystem_device == 0x01da)) {
401                 if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
402                         *connector_type = DRM_MODE_CONNECTOR_DVII;
403                 }
404         }
405
406         /* ASUS HD 3600 board lists the DVI port as HDMI */
407         if ((dev->pdev->device == 0x9598) &&
408             (dev->pdev->subsystem_vendor == 0x1043) &&
409             (dev->pdev->subsystem_device == 0x01e4)) {
410                 if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
411                         *connector_type = DRM_MODE_CONNECTOR_DVII;
412                 }
413         }
414
415         /* ASUS HD 3450 board lists the DVI port as HDMI */
416         if ((dev->pdev->device == 0x95C5) &&
417             (dev->pdev->subsystem_vendor == 0x1043) &&
418             (dev->pdev->subsystem_device == 0x01e2)) {
419                 if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
420                         *connector_type = DRM_MODE_CONNECTOR_DVII;
421                 }
422         }
423
424         /* some BIOSes seem to report DAC on HDMI - usually this is a board with
425          * HDMI + VGA reporting as HDMI
426          */
427         if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
428                 if (supported_device & (ATOM_DEVICE_CRT_SUPPORT)) {
429                         *connector_type = DRM_MODE_CONNECTOR_VGA;
430                         *line_mux = 0;
431                 }
432         }
433
434         /* Acer laptop (Acer TravelMate 5730G) has an HDMI port
435          * on the laptop and a DVI port on the docking station and
436          * both share the same encoder, hpd pin, and ddc line.
437          * So while the bios table is technically correct,
438          * we drop the DVI port here since xrandr has no concept of
439          * encoders and will try and drive both connectors
440          * with different crtcs which isn't possible on the hardware
441          * side and leaves no crtcs for LVDS or VGA.
442          */
443         if ((dev->pdev->device == 0x95c4) &&
444             (dev->pdev->subsystem_vendor == 0x1025) &&
445             (dev->pdev->subsystem_device == 0x013c)) {
446                 if ((*connector_type == DRM_MODE_CONNECTOR_DVII) &&
447                     (supported_device == ATOM_DEVICE_DFP1_SUPPORT)) {
448                         /* actually it's a DVI-D port not DVI-I */
449                         *connector_type = DRM_MODE_CONNECTOR_DVID;
450                         return false;
451                 }
452         }
453
454         /* XFX Pine Group device rv730 reports no VGA DDC lines
455          * even though they are wired up to record 0x93
456          */
457         if ((dev->pdev->device == 0x9498) &&
458             (dev->pdev->subsystem_vendor == 0x1682) &&
459             (dev->pdev->subsystem_device == 0x2452)) {
460                 struct radeon_device *rdev = dev->dev_private;
461                 *i2c_bus = radeon_lookup_i2c_gpio(rdev, 0x93);
462         }
463         return true;
464 }
465
466 const int supported_devices_connector_convert[] = {
467         DRM_MODE_CONNECTOR_Unknown,
468         DRM_MODE_CONNECTOR_VGA,
469         DRM_MODE_CONNECTOR_DVII,
470         DRM_MODE_CONNECTOR_DVID,
471         DRM_MODE_CONNECTOR_DVIA,
472         DRM_MODE_CONNECTOR_SVIDEO,
473         DRM_MODE_CONNECTOR_Composite,
474         DRM_MODE_CONNECTOR_LVDS,
475         DRM_MODE_CONNECTOR_Unknown,
476         DRM_MODE_CONNECTOR_Unknown,
477         DRM_MODE_CONNECTOR_HDMIA,
478         DRM_MODE_CONNECTOR_HDMIB,
479         DRM_MODE_CONNECTOR_Unknown,
480         DRM_MODE_CONNECTOR_Unknown,
481         DRM_MODE_CONNECTOR_9PinDIN,
482         DRM_MODE_CONNECTOR_DisplayPort
483 };
484
485 const uint16_t supported_devices_connector_object_id_convert[] = {
486         CONNECTOR_OBJECT_ID_NONE,
487         CONNECTOR_OBJECT_ID_VGA,
488         CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I, /* not all boards support DL */
489         CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D, /* not all boards support DL */
490         CONNECTOR_OBJECT_ID_VGA, /* technically DVI-A */
491         CONNECTOR_OBJECT_ID_COMPOSITE,
492         CONNECTOR_OBJECT_ID_SVIDEO,
493         CONNECTOR_OBJECT_ID_LVDS,
494         CONNECTOR_OBJECT_ID_9PIN_DIN,
495         CONNECTOR_OBJECT_ID_9PIN_DIN,
496         CONNECTOR_OBJECT_ID_DISPLAYPORT,
497         CONNECTOR_OBJECT_ID_HDMI_TYPE_A,
498         CONNECTOR_OBJECT_ID_HDMI_TYPE_B,
499         CONNECTOR_OBJECT_ID_SVIDEO
500 };
501
502 const int object_connector_convert[] = {
503         DRM_MODE_CONNECTOR_Unknown,
504         DRM_MODE_CONNECTOR_DVII,
505         DRM_MODE_CONNECTOR_DVII,
506         DRM_MODE_CONNECTOR_DVID,
507         DRM_MODE_CONNECTOR_DVID,
508         DRM_MODE_CONNECTOR_VGA,
509         DRM_MODE_CONNECTOR_Composite,
510         DRM_MODE_CONNECTOR_SVIDEO,
511         DRM_MODE_CONNECTOR_Unknown,
512         DRM_MODE_CONNECTOR_Unknown,
513         DRM_MODE_CONNECTOR_9PinDIN,
514         DRM_MODE_CONNECTOR_Unknown,
515         DRM_MODE_CONNECTOR_HDMIA,
516         DRM_MODE_CONNECTOR_HDMIB,
517         DRM_MODE_CONNECTOR_LVDS,
518         DRM_MODE_CONNECTOR_9PinDIN,
519         DRM_MODE_CONNECTOR_Unknown,
520         DRM_MODE_CONNECTOR_Unknown,
521         DRM_MODE_CONNECTOR_Unknown,
522         DRM_MODE_CONNECTOR_DisplayPort,
523         DRM_MODE_CONNECTOR_eDP,
524         DRM_MODE_CONNECTOR_Unknown
525 };
526
527 bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
528 {
529         struct radeon_device *rdev = dev->dev_private;
530         struct radeon_mode_info *mode_info = &rdev->mode_info;
531         struct atom_context *ctx = mode_info->atom_context;
532         int index = GetIndexIntoMasterTable(DATA, Object_Header);
533         u16 size, data_offset;
534         u8 frev, crev;
535         ATOM_CONNECTOR_OBJECT_TABLE *con_obj;
536         ATOM_ENCODER_OBJECT_TABLE *enc_obj;
537         ATOM_OBJECT_TABLE *router_obj;
538         ATOM_DISPLAY_OBJECT_PATH_TABLE *path_obj;
539         ATOM_OBJECT_HEADER *obj_header;
540         int i, j, k, path_size, device_support;
541         int connector_type;
542         u16 igp_lane_info, conn_id, connector_object_id;
543         struct radeon_i2c_bus_rec ddc_bus;
544         struct radeon_router router;
545         struct radeon_gpio_rec gpio;
546         struct radeon_hpd hpd;
547
548         if (!atom_parse_data_header(ctx, index, &size, &frev, &crev, &data_offset))
549                 return false;
550
551         if (crev < 2)
552                 return false;
553
554         obj_header = (ATOM_OBJECT_HEADER *) (ctx->bios + data_offset);
555         path_obj = (ATOM_DISPLAY_OBJECT_PATH_TABLE *)
556             (ctx->bios + data_offset +
557              le16_to_cpu(obj_header->usDisplayPathTableOffset));
558         con_obj = (ATOM_CONNECTOR_OBJECT_TABLE *)
559             (ctx->bios + data_offset +
560              le16_to_cpu(obj_header->usConnectorObjectTableOffset));
561         enc_obj = (ATOM_ENCODER_OBJECT_TABLE *)
562             (ctx->bios + data_offset +
563              le16_to_cpu(obj_header->usEncoderObjectTableOffset));
564         router_obj = (ATOM_OBJECT_TABLE *)
565                 (ctx->bios + data_offset +
566                  le16_to_cpu(obj_header->usRouterObjectTableOffset));
567         device_support = le16_to_cpu(obj_header->usDeviceSupport);
568
569         path_size = 0;
570         for (i = 0; i < path_obj->ucNumOfDispPath; i++) {
571                 uint8_t *addr = (uint8_t *) path_obj->asDispPath;
572                 ATOM_DISPLAY_OBJECT_PATH *path;
573                 addr += path_size;
574                 path = (ATOM_DISPLAY_OBJECT_PATH *) addr;
575                 path_size += le16_to_cpu(path->usSize);
576
577                 if (device_support & le16_to_cpu(path->usDeviceTag)) {
578                         uint8_t con_obj_id, con_obj_num, con_obj_type;
579
580                         con_obj_id =
581                             (le16_to_cpu(path->usConnObjectId) & OBJECT_ID_MASK)
582                             >> OBJECT_ID_SHIFT;
583                         con_obj_num =
584                             (le16_to_cpu(path->usConnObjectId) & ENUM_ID_MASK)
585                             >> ENUM_ID_SHIFT;
586                         con_obj_type =
587                             (le16_to_cpu(path->usConnObjectId) &
588                              OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT;
589
590                         /* TODO CV support */
591                         if (le16_to_cpu(path->usDeviceTag) ==
592                                 ATOM_DEVICE_CV_SUPPORT)
593                                 continue;
594
595                         /* IGP chips */
596                         if ((rdev->flags & RADEON_IS_IGP) &&
597                             (con_obj_id ==
598                              CONNECTOR_OBJECT_ID_PCIE_CONNECTOR)) {
599                                 uint16_t igp_offset = 0;
600                                 ATOM_INTEGRATED_SYSTEM_INFO_V2 *igp_obj;
601
602                                 index =
603                                     GetIndexIntoMasterTable(DATA,
604                                                             IntegratedSystemInfo);
605
606                                 if (atom_parse_data_header(ctx, index, &size, &frev,
607                                                            &crev, &igp_offset)) {
608
609                                         if (crev >= 2) {
610                                                 igp_obj =
611                                                         (ATOM_INTEGRATED_SYSTEM_INFO_V2
612                                                          *) (ctx->bios + igp_offset);
613
614                                                 if (igp_obj) {
615                                                         uint32_t slot_config, ct;
616
617                                                         if (con_obj_num == 1)
618                                                                 slot_config =
619                                                                         igp_obj->
620                                                                         ulDDISlot1Config;
621                                                         else
622                                                                 slot_config =
623                                                                         igp_obj->
624                                                                         ulDDISlot2Config;
625
626                                                         ct = (slot_config >> 16) & 0xff;
627                                                         connector_type =
628                                                                 object_connector_convert
629                                                                 [ct];
630                                                         connector_object_id = ct;
631                                                         igp_lane_info =
632                                                                 slot_config & 0xffff;
633                                                 } else
634                                                         continue;
635                                         } else
636                                                 continue;
637                                 } else {
638                                         igp_lane_info = 0;
639                                         connector_type =
640                                                 object_connector_convert[con_obj_id];
641                                         connector_object_id = con_obj_id;
642                                 }
643                         } else {
644                                 igp_lane_info = 0;
645                                 connector_type =
646                                     object_connector_convert[con_obj_id];
647                                 connector_object_id = con_obj_id;
648                         }
649
650                         if (connector_type == DRM_MODE_CONNECTOR_Unknown)
651                                 continue;
652
653                         router.ddc_valid = false;
654                         router.cd_valid = false;
655                         for (j = 0; j < ((le16_to_cpu(path->usSize) - 8) / 2); j++) {
656                                 uint8_t grph_obj_id, grph_obj_num, grph_obj_type;
657
658                                 grph_obj_id =
659                                     (le16_to_cpu(path->usGraphicObjIds[j]) &
660                                      OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
661                                 grph_obj_num =
662                                     (le16_to_cpu(path->usGraphicObjIds[j]) &
663                                      ENUM_ID_MASK) >> ENUM_ID_SHIFT;
664                                 grph_obj_type =
665                                     (le16_to_cpu(path->usGraphicObjIds[j]) &
666                                      OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT;
667
668                                 if (grph_obj_type == GRAPH_OBJECT_TYPE_ENCODER) {
669                                         for (k = 0; k < enc_obj->ucNumberOfObjects; k++) {
670                                                 u16 encoder_obj = le16_to_cpu(enc_obj->asObjects[k].usObjectID);
671                                                 if (le16_to_cpu(path->usGraphicObjIds[j]) == encoder_obj) {
672                                                         ATOM_COMMON_RECORD_HEADER *record = (ATOM_COMMON_RECORD_HEADER *)
673                                                                 (ctx->bios + data_offset +
674                                                                  le16_to_cpu(enc_obj->asObjects[k].usRecordOffset));
675                                                         ATOM_ENCODER_CAP_RECORD *cap_record;
676                                                         u16 caps = 0;
677
678                                                         while (record->ucRecordType > 0 &&
679                                                                record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
680                                                                 switch (record->ucRecordType) {
681                                                                 case ATOM_ENCODER_CAP_RECORD_TYPE:
682                                                                         cap_record =(ATOM_ENCODER_CAP_RECORD *)
683                                                                                 record;
684                                                                         caps = le16_to_cpu(cap_record->usEncoderCap);
685                                                                         break;
686                                                                 }
687                                                                 record = (ATOM_COMMON_RECORD_HEADER *)
688                                                                         ((char *)record + record->ucRecordSize);
689                                                         }
690                                                         radeon_add_atom_encoder(dev,
691                                                                                 encoder_obj,
692                                                                                 le16_to_cpu
693                                                                                 (path->
694                                                                                  usDeviceTag),
695                                                                                 caps);
696                                                 }
697                                         }
698                                 } else if (grph_obj_type == GRAPH_OBJECT_TYPE_ROUTER) {
699                                         for (k = 0; k < router_obj->ucNumberOfObjects; k++) {
700                                                 u16 router_obj_id = le16_to_cpu(router_obj->asObjects[k].usObjectID);
701                                                 if (le16_to_cpu(path->usGraphicObjIds[j]) == router_obj_id) {
702                                                         ATOM_COMMON_RECORD_HEADER *record = (ATOM_COMMON_RECORD_HEADER *)
703                                                                 (ctx->bios + data_offset +
704                                                                  le16_to_cpu(router_obj->asObjects[k].usRecordOffset));
705                                                         ATOM_I2C_RECORD *i2c_record;
706                                                         ATOM_I2C_ID_CONFIG_ACCESS *i2c_config;
707                                                         ATOM_ROUTER_DDC_PATH_SELECT_RECORD *ddc_path;
708                                                         ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD *cd_path;
709                                                         ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT *router_src_dst_table =
710                                                                 (ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT *)
711                                                                 (ctx->bios + data_offset +
712                                                                  le16_to_cpu(router_obj->asObjects[k].usSrcDstTableOffset));
713                                                         int enum_id;
714
715                                                         router.router_id = router_obj_id;
716                                                         for (enum_id = 0; enum_id < router_src_dst_table->ucNumberOfDst;
717                                                              enum_id++) {
718                                                                 if (le16_to_cpu(path->usConnObjectId) ==
719                                                                     le16_to_cpu(router_src_dst_table->usDstObjectID[enum_id]))
720                                                                         break;
721                                                         }
722
723                                                         while (record->ucRecordType > 0 &&
724                                                                record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
725                                                                 switch (record->ucRecordType) {
726                                                                 case ATOM_I2C_RECORD_TYPE:
727                                                                         i2c_record =
728                                                                                 (ATOM_I2C_RECORD *)
729                                                                                 record;
730                                                                         i2c_config =
731                                                                                 (ATOM_I2C_ID_CONFIG_ACCESS *)
732                                                                                 &i2c_record->sucI2cId;
733                                                                         router.i2c_info =
734                                                                                 radeon_lookup_i2c_gpio(rdev,
735                                                                                                        i2c_config->
736                                                                                                        ucAccess);
737                                                                         router.i2c_addr = i2c_record->ucI2CAddr >> 1;
738                                                                         break;
739                                                                 case ATOM_ROUTER_DDC_PATH_SELECT_RECORD_TYPE:
740                                                                         ddc_path = (ATOM_ROUTER_DDC_PATH_SELECT_RECORD *)
741                                                                                 record;
742                                                                         router.ddc_valid = true;
743                                                                         router.ddc_mux_type = ddc_path->ucMuxType;
744                                                                         router.ddc_mux_control_pin = ddc_path->ucMuxControlPin;
745                                                                         router.ddc_mux_state = ddc_path->ucMuxState[enum_id];
746                                                                         break;
747                                                                 case ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD_TYPE:
748                                                                         cd_path = (ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD *)
749                                                                                 record;
750                                                                         router.cd_valid = true;
751                                                                         router.cd_mux_type = cd_path->ucMuxType;
752                                                                         router.cd_mux_control_pin = cd_path->ucMuxControlPin;
753                                                                         router.cd_mux_state = cd_path->ucMuxState[enum_id];
754                                                                         break;
755                                                                 }
756                                                                 record = (ATOM_COMMON_RECORD_HEADER *)
757                                                                         ((char *)record + record->ucRecordSize);
758                                                         }
759                                                 }
760                                         }
761                                 }
762                         }
763
764                         /* look up gpio for ddc, hpd */
765                         ddc_bus.valid = false;
766                         hpd.hpd = RADEON_HPD_NONE;
767                         if ((le16_to_cpu(path->usDeviceTag) &
768                              (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) == 0) {
769                                 for (j = 0; j < con_obj->ucNumberOfObjects; j++) {
770                                         if (le16_to_cpu(path->usConnObjectId) ==
771                                             le16_to_cpu(con_obj->asObjects[j].
772                                                         usObjectID)) {
773                                                 ATOM_COMMON_RECORD_HEADER
774                                                     *record =
775                                                     (ATOM_COMMON_RECORD_HEADER
776                                                      *)
777                                                     (ctx->bios + data_offset +
778                                                      le16_to_cpu(con_obj->
779                                                                  asObjects[j].
780                                                                  usRecordOffset));
781                                                 ATOM_I2C_RECORD *i2c_record;
782                                                 ATOM_HPD_INT_RECORD *hpd_record;
783                                                 ATOM_I2C_ID_CONFIG_ACCESS *i2c_config;
784
785                                                 while (record->ucRecordType > 0
786                                                        && record->
787                                                        ucRecordType <=
788                                                        ATOM_MAX_OBJECT_RECORD_NUMBER) {
789                                                         switch (record->ucRecordType) {
790                                                         case ATOM_I2C_RECORD_TYPE:
791                                                                 i2c_record =
792                                                                     (ATOM_I2C_RECORD *)
793                                                                         record;
794                                                                 i2c_config =
795                                                                         (ATOM_I2C_ID_CONFIG_ACCESS *)
796                                                                         &i2c_record->sucI2cId;
797                                                                 ddc_bus = radeon_lookup_i2c_gpio(rdev,
798                                                                                                  i2c_config->
799                                                                                                  ucAccess);
800                                                                 break;
801                                                         case ATOM_HPD_INT_RECORD_TYPE:
802                                                                 hpd_record =
803                                                                         (ATOM_HPD_INT_RECORD *)
804                                                                         record;
805                                                                 gpio = radeon_lookup_gpio(rdev,
806                                                                                           hpd_record->ucHPDIntGPIOID);
807                                                                 hpd = radeon_atom_get_hpd_info_from_gpio(rdev, &gpio);
808                                                                 hpd.plugged_state = hpd_record->ucPlugged_PinState;
809                                                                 break;
810                                                         }
811                                                         record =
812                                                             (ATOM_COMMON_RECORD_HEADER
813                                                              *) ((char *)record
814                                                                  +
815                                                                  record->
816                                                                  ucRecordSize);
817                                                 }
818                                                 break;
819                                         }
820                                 }
821                         }
822
823                         /* needed for aux chan transactions */
824                         ddc_bus.hpd = hpd.hpd;
825
826                         conn_id = le16_to_cpu(path->usConnObjectId);
827
828                         if (!radeon_atom_apply_quirks
829                             (dev, le16_to_cpu(path->usDeviceTag), &connector_type,
830                              &ddc_bus, &conn_id, &hpd))
831                                 continue;
832
833                         radeon_add_atom_connector(dev,
834                                                   conn_id,
835                                                   le16_to_cpu(path->
836                                                               usDeviceTag),
837                                                   connector_type, &ddc_bus,
838                                                   igp_lane_info,
839                                                   connector_object_id,
840                                                   &hpd,
841                                                   &router);
842
843                 }
844         }
845
846         radeon_link_encoder_connector(dev);
847
848         return true;
849 }
850
851 static uint16_t atombios_get_connector_object_id(struct drm_device *dev,
852                                                  int connector_type,
853                                                  uint16_t devices)
854 {
855         struct radeon_device *rdev = dev->dev_private;
856
857         if (rdev->flags & RADEON_IS_IGP) {
858                 return supported_devices_connector_object_id_convert
859                         [connector_type];
860         } else if (((connector_type == DRM_MODE_CONNECTOR_DVII) ||
861                     (connector_type == DRM_MODE_CONNECTOR_DVID)) &&
862                    (devices & ATOM_DEVICE_DFP2_SUPPORT))  {
863                 struct radeon_mode_info *mode_info = &rdev->mode_info;
864                 struct atom_context *ctx = mode_info->atom_context;
865                 int index = GetIndexIntoMasterTable(DATA, XTMDS_Info);
866                 uint16_t size, data_offset;
867                 uint8_t frev, crev;
868                 ATOM_XTMDS_INFO *xtmds;
869
870                 if (atom_parse_data_header(ctx, index, &size, &frev, &crev, &data_offset)) {
871                         xtmds = (ATOM_XTMDS_INFO *)(ctx->bios + data_offset);
872
873                         if (xtmds->ucSupportedLink & ATOM_XTMDS_SUPPORTED_DUALLINK) {
874                                 if (connector_type == DRM_MODE_CONNECTOR_DVII)
875                                         return CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I;
876                                 else
877                                         return CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D;
878                         } else {
879                                 if (connector_type == DRM_MODE_CONNECTOR_DVII)
880                                         return CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I;
881                                 else
882                                         return CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D;
883                         }
884                 } else
885                         return supported_devices_connector_object_id_convert
886                                 [connector_type];
887         } else {
888                 return supported_devices_connector_object_id_convert
889                         [connector_type];
890         }
891 }
892
893 struct bios_connector {
894         bool valid;
895         uint16_t line_mux;
896         uint16_t devices;
897         int connector_type;
898         struct radeon_i2c_bus_rec ddc_bus;
899         struct radeon_hpd hpd;
900 };
901
902 bool radeon_get_atom_connector_info_from_supported_devices_table(struct
903                                                                  drm_device
904                                                                  *dev)
905 {
906         struct radeon_device *rdev = dev->dev_private;
907         struct radeon_mode_info *mode_info = &rdev->mode_info;
908         struct atom_context *ctx = mode_info->atom_context;
909         int index = GetIndexIntoMasterTable(DATA, SupportedDevicesInfo);
910         uint16_t size, data_offset;
911         uint8_t frev, crev;
912         uint16_t device_support;
913         uint8_t dac;
914         union atom_supported_devices *supported_devices;
915         int i, j, max_device;
916         struct bios_connector *bios_connectors;
917         size_t bc_size = sizeof(*bios_connectors) * ATOM_MAX_SUPPORTED_DEVICE;
918         struct radeon_router router;
919
920         router.ddc_valid = false;
921         router.cd_valid = false;
922
923         bios_connectors = kzalloc(bc_size, GFP_KERNEL);
924         if (!bios_connectors)
925                 return false;
926
927         if (!atom_parse_data_header(ctx, index, &size, &frev, &crev,
928                                     &data_offset)) {
929                 kfree(bios_connectors);
930                 return false;
931         }
932
933         supported_devices =
934             (union atom_supported_devices *)(ctx->bios + data_offset);
935
936         device_support = le16_to_cpu(supported_devices->info.usDeviceSupport);
937
938         if (frev > 1)
939                 max_device = ATOM_MAX_SUPPORTED_DEVICE;
940         else
941                 max_device = ATOM_MAX_SUPPORTED_DEVICE_INFO;
942
943         for (i = 0; i < max_device; i++) {
944                 ATOM_CONNECTOR_INFO_I2C ci =
945                     supported_devices->info.asConnInfo[i];
946
947                 bios_connectors[i].valid = false;
948
949                 if (!(device_support & (1 << i))) {
950                         continue;
951                 }
952
953                 if (i == ATOM_DEVICE_CV_INDEX) {
954                         DRM_DEBUG_KMS("Skipping Component Video\n");
955                         continue;
956                 }
957
958                 bios_connectors[i].connector_type =
959                     supported_devices_connector_convert[ci.sucConnectorInfo.
960                                                         sbfAccess.
961                                                         bfConnectorType];
962
963                 if (bios_connectors[i].connector_type ==
964                     DRM_MODE_CONNECTOR_Unknown)
965                         continue;
966
967                 dac = ci.sucConnectorInfo.sbfAccess.bfAssociatedDAC;
968
969                 bios_connectors[i].line_mux =
970                         ci.sucI2cId.ucAccess;
971
972                 /* give tv unique connector ids */
973                 if (i == ATOM_DEVICE_TV1_INDEX) {
974                         bios_connectors[i].ddc_bus.valid = false;
975                         bios_connectors[i].line_mux = 50;
976                 } else if (i == ATOM_DEVICE_TV2_INDEX) {
977                         bios_connectors[i].ddc_bus.valid = false;
978                         bios_connectors[i].line_mux = 51;
979                 } else if (i == ATOM_DEVICE_CV_INDEX) {
980                         bios_connectors[i].ddc_bus.valid = false;
981                         bios_connectors[i].line_mux = 52;
982                 } else
983                         bios_connectors[i].ddc_bus =
984                             radeon_lookup_i2c_gpio(rdev,
985                                                    bios_connectors[i].line_mux);
986
987                 if ((crev > 1) && (frev > 1)) {
988                         u8 isb = supported_devices->info_2d1.asIntSrcInfo[i].ucIntSrcBitmap;
989                         switch (isb) {
990                         case 0x4:
991                                 bios_connectors[i].hpd.hpd = RADEON_HPD_1;
992                                 break;
993                         case 0xa:
994                                 bios_connectors[i].hpd.hpd = RADEON_HPD_2;
995                                 break;
996                         default:
997                                 bios_connectors[i].hpd.hpd = RADEON_HPD_NONE;
998                                 break;
999                         }
1000                 } else {
1001                         if (i == ATOM_DEVICE_DFP1_INDEX)
1002                                 bios_connectors[i].hpd.hpd = RADEON_HPD_1;
1003                         else if (i == ATOM_DEVICE_DFP2_INDEX)
1004                                 bios_connectors[i].hpd.hpd = RADEON_HPD_2;
1005                         else
1006                                 bios_connectors[i].hpd.hpd = RADEON_HPD_NONE;
1007                 }
1008
1009                 /* Always set the connector type to VGA for CRT1/CRT2. if they are
1010                  * shared with a DVI port, we'll pick up the DVI connector when we
1011                  * merge the outputs.  Some bioses incorrectly list VGA ports as DVI.
1012                  */
1013                 if (i == ATOM_DEVICE_CRT1_INDEX || i == ATOM_DEVICE_CRT2_INDEX)
1014                         bios_connectors[i].connector_type =
1015                             DRM_MODE_CONNECTOR_VGA;
1016
1017                 if (!radeon_atom_apply_quirks
1018                     (dev, (1 << i), &bios_connectors[i].connector_type,
1019                      &bios_connectors[i].ddc_bus, &bios_connectors[i].line_mux,
1020                      &bios_connectors[i].hpd))
1021                         continue;
1022
1023                 bios_connectors[i].valid = true;
1024                 bios_connectors[i].devices = (1 << i);
1025
1026                 if (ASIC_IS_AVIVO(rdev) || radeon_r4xx_atom)
1027                         radeon_add_atom_encoder(dev,
1028                                                 radeon_get_encoder_enum(dev,
1029                                                                       (1 << i),
1030                                                                       dac),
1031                                                 (1 << i),
1032                                                 0);
1033                 else
1034                         radeon_add_legacy_encoder(dev,
1035                                                   radeon_get_encoder_enum(dev,
1036                                                                         (1 << i),
1037                                                                         dac),
1038                                                   (1 << i));
1039         }
1040
1041         /* combine shared connectors */
1042         for (i = 0; i < max_device; i++) {
1043                 if (bios_connectors[i].valid) {
1044                         for (j = 0; j < max_device; j++) {
1045                                 if (bios_connectors[j].valid && (i != j)) {
1046                                         if (bios_connectors[i].line_mux ==
1047                                             bios_connectors[j].line_mux) {
1048                                                 /* make sure not to combine LVDS */
1049                                                 if (bios_connectors[i].devices & (ATOM_DEVICE_LCD_SUPPORT)) {
1050                                                         bios_connectors[i].line_mux = 53;
1051                                                         bios_connectors[i].ddc_bus.valid = false;
1052                                                         continue;
1053                                                 }
1054                                                 if (bios_connectors[j].devices & (ATOM_DEVICE_LCD_SUPPORT)) {
1055                                                         bios_connectors[j].line_mux = 53;
1056                                                         bios_connectors[j].ddc_bus.valid = false;
1057                                                         continue;
1058                                                 }
1059                                                 /* combine analog and digital for DVI-I */
1060                                                 if (((bios_connectors[i].devices & (ATOM_DEVICE_DFP_SUPPORT)) &&
1061                                                      (bios_connectors[j].devices & (ATOM_DEVICE_CRT_SUPPORT))) ||
1062                                                     ((bios_connectors[j].devices & (ATOM_DEVICE_DFP_SUPPORT)) &&
1063                                                      (bios_connectors[i].devices & (ATOM_DEVICE_CRT_SUPPORT)))) {
1064                                                         bios_connectors[i].devices |=
1065                                                                 bios_connectors[j].devices;
1066                                                         bios_connectors[i].connector_type =
1067                                                                 DRM_MODE_CONNECTOR_DVII;
1068                                                         if (bios_connectors[j].devices & (ATOM_DEVICE_DFP_SUPPORT))
1069                                                                 bios_connectors[i].hpd =
1070                                                                         bios_connectors[j].hpd;
1071                                                         bios_connectors[j].valid = false;
1072                                                 }
1073                                         }
1074                                 }
1075                         }
1076                 }
1077         }
1078
1079         /* add the connectors */
1080         for (i = 0; i < max_device; i++) {
1081                 if (bios_connectors[i].valid) {
1082                         uint16_t connector_object_id =
1083                                 atombios_get_connector_object_id(dev,
1084                                                       bios_connectors[i].connector_type,
1085                                                       bios_connectors[i].devices);
1086                         radeon_add_atom_connector(dev,
1087                                                   bios_connectors[i].line_mux,
1088                                                   bios_connectors[i].devices,
1089                                                   bios_connectors[i].
1090                                                   connector_type,
1091                                                   &bios_connectors[i].ddc_bus,
1092                                                   0,
1093                                                   connector_object_id,
1094                                                   &bios_connectors[i].hpd,
1095                                                   &router);
1096                 }
1097         }
1098
1099         radeon_link_encoder_connector(dev);
1100
1101         kfree(bios_connectors);
1102         return true;
1103 }
1104
1105 union firmware_info {
1106         ATOM_FIRMWARE_INFO info;
1107         ATOM_FIRMWARE_INFO_V1_2 info_12;
1108         ATOM_FIRMWARE_INFO_V1_3 info_13;
1109         ATOM_FIRMWARE_INFO_V1_4 info_14;
1110         ATOM_FIRMWARE_INFO_V2_1 info_21;
1111         ATOM_FIRMWARE_INFO_V2_2 info_22;
1112 };
1113
1114 bool radeon_atom_get_clock_info(struct drm_device *dev)
1115 {
1116         struct radeon_device *rdev = dev->dev_private;
1117         struct radeon_mode_info *mode_info = &rdev->mode_info;
1118         int index = GetIndexIntoMasterTable(DATA, FirmwareInfo);
1119         union firmware_info *firmware_info;
1120         uint8_t frev, crev;
1121         struct radeon_pll *p1pll = &rdev->clock.p1pll;
1122         struct radeon_pll *p2pll = &rdev->clock.p2pll;
1123         struct radeon_pll *dcpll = &rdev->clock.dcpll;
1124         struct radeon_pll *spll = &rdev->clock.spll;
1125         struct radeon_pll *mpll = &rdev->clock.mpll;
1126         uint16_t data_offset;
1127
1128         if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1129                                    &frev, &crev, &data_offset)) {
1130                 firmware_info =
1131                         (union firmware_info *)(mode_info->atom_context->bios +
1132                                                 data_offset);
1133                 /* pixel clocks */
1134                 p1pll->reference_freq =
1135                     le16_to_cpu(firmware_info->info.usReferenceClock);
1136                 p1pll->reference_div = 0;
1137
1138                 if (crev < 2)
1139                         p1pll->pll_out_min =
1140                                 le16_to_cpu(firmware_info->info.usMinPixelClockPLL_Output);
1141                 else
1142                         p1pll->pll_out_min =
1143                                 le32_to_cpu(firmware_info->info_12.ulMinPixelClockPLL_Output);
1144                 p1pll->pll_out_max =
1145                     le32_to_cpu(firmware_info->info.ulMaxPixelClockPLL_Output);
1146
1147                 if (crev >= 4) {
1148                         p1pll->lcd_pll_out_min =
1149                                 le16_to_cpu(firmware_info->info_14.usLcdMinPixelClockPLL_Output) * 100;
1150                         if (p1pll->lcd_pll_out_min == 0)
1151                                 p1pll->lcd_pll_out_min = p1pll->pll_out_min;
1152                         p1pll->lcd_pll_out_max =
1153                                 le16_to_cpu(firmware_info->info_14.usLcdMaxPixelClockPLL_Output) * 100;
1154                         if (p1pll->lcd_pll_out_max == 0)
1155                                 p1pll->lcd_pll_out_max = p1pll->pll_out_max;
1156                 } else {
1157                         p1pll->lcd_pll_out_min = p1pll->pll_out_min;
1158                         p1pll->lcd_pll_out_max = p1pll->pll_out_max;
1159                 }
1160
1161                 if (p1pll->pll_out_min == 0) {
1162                         if (ASIC_IS_AVIVO(rdev))
1163                                 p1pll->pll_out_min = 64800;
1164                         else
1165                                 p1pll->pll_out_min = 20000;
1166                 }
1167
1168                 p1pll->pll_in_min =
1169                     le16_to_cpu(firmware_info->info.usMinPixelClockPLL_Input);
1170                 p1pll->pll_in_max =
1171                     le16_to_cpu(firmware_info->info.usMaxPixelClockPLL_Input);
1172
1173                 *p2pll = *p1pll;
1174
1175                 /* system clock */
1176                 if (ASIC_IS_DCE4(rdev))
1177                         spll->reference_freq =
1178                                 le16_to_cpu(firmware_info->info_21.usCoreReferenceClock);
1179                 else
1180                         spll->reference_freq =
1181                                 le16_to_cpu(firmware_info->info.usReferenceClock);
1182                 spll->reference_div = 0;
1183
1184                 spll->pll_out_min =
1185                     le16_to_cpu(firmware_info->info.usMinEngineClockPLL_Output);
1186                 spll->pll_out_max =
1187                     le32_to_cpu(firmware_info->info.ulMaxEngineClockPLL_Output);
1188
1189                 /* ??? */
1190                 if (spll->pll_out_min == 0) {
1191                         if (ASIC_IS_AVIVO(rdev))
1192                                 spll->pll_out_min = 64800;
1193                         else
1194                                 spll->pll_out_min = 20000;
1195                 }
1196
1197                 spll->pll_in_min =
1198                     le16_to_cpu(firmware_info->info.usMinEngineClockPLL_Input);
1199                 spll->pll_in_max =
1200                     le16_to_cpu(firmware_info->info.usMaxEngineClockPLL_Input);
1201
1202                 /* memory clock */
1203                 if (ASIC_IS_DCE4(rdev))
1204                         mpll->reference_freq =
1205                                 le16_to_cpu(firmware_info->info_21.usMemoryReferenceClock);
1206                 else
1207                         mpll->reference_freq =
1208                                 le16_to_cpu(firmware_info->info.usReferenceClock);
1209                 mpll->reference_div = 0;
1210
1211                 mpll->pll_out_min =
1212                     le16_to_cpu(firmware_info->info.usMinMemoryClockPLL_Output);
1213                 mpll->pll_out_max =
1214                     le32_to_cpu(firmware_info->info.ulMaxMemoryClockPLL_Output);
1215
1216                 /* ??? */
1217                 if (mpll->pll_out_min == 0) {
1218                         if (ASIC_IS_AVIVO(rdev))
1219                                 mpll->pll_out_min = 64800;
1220                         else
1221                                 mpll->pll_out_min = 20000;
1222                 }
1223
1224                 mpll->pll_in_min =
1225                     le16_to_cpu(firmware_info->info.usMinMemoryClockPLL_Input);
1226                 mpll->pll_in_max =
1227                     le16_to_cpu(firmware_info->info.usMaxMemoryClockPLL_Input);
1228
1229                 rdev->clock.default_sclk =
1230                     le32_to_cpu(firmware_info->info.ulDefaultEngineClock);
1231                 rdev->clock.default_mclk =
1232                     le32_to_cpu(firmware_info->info.ulDefaultMemoryClock);
1233
1234                 if (ASIC_IS_DCE4(rdev)) {
1235                         rdev->clock.default_dispclk =
1236                                 le32_to_cpu(firmware_info->info_21.ulDefaultDispEngineClkFreq);
1237                         if (rdev->clock.default_dispclk == 0) {
1238                                 if (ASIC_IS_DCE5(rdev))
1239                                         rdev->clock.default_dispclk = 54000; /* 540 Mhz */
1240                                 else
1241                                         rdev->clock.default_dispclk = 60000; /* 600 Mhz */
1242                         }
1243                         rdev->clock.dp_extclk =
1244                                 le16_to_cpu(firmware_info->info_21.usUniphyDPModeExtClkFreq);
1245                 }
1246                 *dcpll = *p1pll;
1247
1248                 return true;
1249         }
1250
1251         return false;
1252 }
1253
1254 union igp_info {
1255         struct _ATOM_INTEGRATED_SYSTEM_INFO info;
1256         struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2;
1257 };
1258
1259 bool radeon_atombios_sideport_present(struct radeon_device *rdev)
1260 {
1261         struct radeon_mode_info *mode_info = &rdev->mode_info;
1262         int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo);
1263         union igp_info *igp_info;
1264         u8 frev, crev;
1265         u16 data_offset;
1266
1267         /* sideport is AMD only */
1268         if (rdev->family == CHIP_RS600)
1269                 return false;
1270
1271         if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1272                                    &frev, &crev, &data_offset)) {
1273                 igp_info = (union igp_info *)(mode_info->atom_context->bios +
1274                                       data_offset);
1275                 switch (crev) {
1276                 case 1:
1277                         if (le32_to_cpu(igp_info->info.ulBootUpMemoryClock))
1278                                 return true;
1279                         break;
1280                 case 2:
1281                         if (le32_to_cpu(igp_info->info_2.ulBootUpSidePortClock))
1282                                 return true;
1283                         break;
1284                 default:
1285                         DRM_ERROR("Unsupported IGP table: %d %d\n", frev, crev);
1286                         break;
1287                 }
1288         }
1289         return false;
1290 }
1291
1292 bool radeon_atombios_get_tmds_info(struct radeon_encoder *encoder,
1293                                    struct radeon_encoder_int_tmds *tmds)
1294 {
1295         struct drm_device *dev = encoder->base.dev;
1296         struct radeon_device *rdev = dev->dev_private;
1297         struct radeon_mode_info *mode_info = &rdev->mode_info;
1298         int index = GetIndexIntoMasterTable(DATA, TMDS_Info);
1299         uint16_t data_offset;
1300         struct _ATOM_TMDS_INFO *tmds_info;
1301         uint8_t frev, crev;
1302         uint16_t maxfreq;
1303         int i;
1304
1305         if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1306                                    &frev, &crev, &data_offset)) {
1307                 tmds_info =
1308                         (struct _ATOM_TMDS_INFO *)(mode_info->atom_context->bios +
1309                                                    data_offset);
1310
1311                 maxfreq = le16_to_cpu(tmds_info->usMaxFrequency);
1312                 for (i = 0; i < 4; i++) {
1313                         tmds->tmds_pll[i].freq =
1314                             le16_to_cpu(tmds_info->asMiscInfo[i].usFrequency);
1315                         tmds->tmds_pll[i].value =
1316                             tmds_info->asMiscInfo[i].ucPLL_ChargePump & 0x3f;
1317                         tmds->tmds_pll[i].value |=
1318                             (tmds_info->asMiscInfo[i].
1319                              ucPLL_VCO_Gain & 0x3f) << 6;
1320                         tmds->tmds_pll[i].value |=
1321                             (tmds_info->asMiscInfo[i].
1322                              ucPLL_DutyCycle & 0xf) << 12;
1323                         tmds->tmds_pll[i].value |=
1324                             (tmds_info->asMiscInfo[i].
1325                              ucPLL_VoltageSwing & 0xf) << 16;
1326
1327                         DRM_DEBUG_KMS("TMDS PLL From ATOMBIOS %u %x\n",
1328                                   tmds->tmds_pll[i].freq,
1329                                   tmds->tmds_pll[i].value);
1330
1331                         if (maxfreq == tmds->tmds_pll[i].freq) {
1332                                 tmds->tmds_pll[i].freq = 0xffffffff;
1333                                 break;
1334                         }
1335                 }
1336                 return true;
1337         }
1338         return false;
1339 }
1340
1341 bool radeon_atombios_get_ppll_ss_info(struct radeon_device *rdev,
1342                                       struct radeon_atom_ss *ss,
1343                                       int id)
1344 {
1345         struct radeon_mode_info *mode_info = &rdev->mode_info;
1346         int index = GetIndexIntoMasterTable(DATA, PPLL_SS_Info);
1347         uint16_t data_offset, size;
1348         struct _ATOM_SPREAD_SPECTRUM_INFO *ss_info;
1349         uint8_t frev, crev;
1350         int i, num_indices;
1351
1352         memset(ss, 0, sizeof(struct radeon_atom_ss));
1353         if (atom_parse_data_header(mode_info->atom_context, index, &size,
1354                                    &frev, &crev, &data_offset)) {
1355                 ss_info =
1356                         (struct _ATOM_SPREAD_SPECTRUM_INFO *)(mode_info->atom_context->bios + data_offset);
1357
1358                 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1359                         sizeof(ATOM_SPREAD_SPECTRUM_ASSIGNMENT);
1360
1361                 for (i = 0; i < num_indices; i++) {
1362                         if (ss_info->asSS_Info[i].ucSS_Id == id) {
1363                                 ss->percentage =
1364                                         le16_to_cpu(ss_info->asSS_Info[i].usSpreadSpectrumPercentage);
1365                                 ss->type = ss_info->asSS_Info[i].ucSpreadSpectrumType;
1366                                 ss->step = ss_info->asSS_Info[i].ucSS_Step;
1367                                 ss->delay = ss_info->asSS_Info[i].ucSS_Delay;
1368                                 ss->range = ss_info->asSS_Info[i].ucSS_Range;
1369                                 ss->refdiv = ss_info->asSS_Info[i].ucRecommendedRef_Div;
1370                                 return true;
1371                         }
1372                 }
1373         }
1374         return false;
1375 }
1376
1377 static void radeon_atombios_get_igp_ss_overrides(struct radeon_device *rdev,
1378                                                  struct radeon_atom_ss *ss,
1379                                                  int id)
1380 {
1381         struct radeon_mode_info *mode_info = &rdev->mode_info;
1382         int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo);
1383         u16 data_offset, size;
1384         struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 *igp_info;
1385         u8 frev, crev;
1386         u16 percentage = 0, rate = 0;
1387
1388         /* get any igp specific overrides */
1389         if (atom_parse_data_header(mode_info->atom_context, index, &size,
1390                                    &frev, &crev, &data_offset)) {
1391                 igp_info = (struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 *)
1392                         (mode_info->atom_context->bios + data_offset);
1393                 switch (id) {
1394                 case ASIC_INTERNAL_SS_ON_TMDS:
1395                         percentage = le16_to_cpu(igp_info->usDVISSPercentage);
1396                         rate = le16_to_cpu(igp_info->usDVISSpreadRateIn10Hz);
1397                         break;
1398                 case ASIC_INTERNAL_SS_ON_HDMI:
1399                         percentage = le16_to_cpu(igp_info->usHDMISSPercentage);
1400                         rate = le16_to_cpu(igp_info->usHDMISSpreadRateIn10Hz);
1401                         break;
1402                 case ASIC_INTERNAL_SS_ON_LVDS:
1403                         percentage = le16_to_cpu(igp_info->usLvdsSSPercentage);
1404                         rate = le16_to_cpu(igp_info->usLvdsSSpreadRateIn10Hz);
1405                         break;
1406                 }
1407                 if (percentage)
1408                         ss->percentage = percentage;
1409                 if (rate)
1410                         ss->rate = rate;
1411         }
1412 }
1413
1414 union asic_ss_info {
1415         struct _ATOM_ASIC_INTERNAL_SS_INFO info;
1416         struct _ATOM_ASIC_INTERNAL_SS_INFO_V2 info_2;
1417         struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 info_3;
1418 };
1419
1420 bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev,
1421                                       struct radeon_atom_ss *ss,
1422                                       int id, u32 clock)
1423 {
1424         struct radeon_mode_info *mode_info = &rdev->mode_info;
1425         int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info);
1426         uint16_t data_offset, size;
1427         union asic_ss_info *ss_info;
1428         uint8_t frev, crev;
1429         int i, num_indices;
1430
1431         memset(ss, 0, sizeof(struct radeon_atom_ss));
1432         if (atom_parse_data_header(mode_info->atom_context, index, &size,
1433                                    &frev, &crev, &data_offset)) {
1434
1435                 ss_info =
1436                         (union asic_ss_info *)(mode_info->atom_context->bios + data_offset);
1437
1438                 switch (frev) {
1439                 case 1:
1440                         num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1441                                 sizeof(ATOM_ASIC_SS_ASSIGNMENT);
1442
1443                         for (i = 0; i < num_indices; i++) {
1444                                 if ((ss_info->info.asSpreadSpectrum[i].ucClockIndication == id) &&
1445                                     (clock <= le32_to_cpu(ss_info->info.asSpreadSpectrum[i].ulTargetClockRange))) {
1446                                         ss->percentage =
1447                                                 le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1448                                         ss->type = ss_info->info.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1449                                         ss->rate = le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadRateInKhz);
1450                                         return true;
1451                                 }
1452                         }
1453                         break;
1454                 case 2:
1455                         num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1456                                 sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2);
1457                         for (i = 0; i < num_indices; i++) {
1458                                 if ((ss_info->info_2.asSpreadSpectrum[i].ucClockIndication == id) &&
1459                                     (clock <= le32_to_cpu(ss_info->info_2.asSpreadSpectrum[i].ulTargetClockRange))) {
1460                                         ss->percentage =
1461                                                 le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1462                                         ss->type = ss_info->info_2.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1463                                         ss->rate = le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadRateIn10Hz);
1464                                         return true;
1465                                 }
1466                         }
1467                         break;
1468                 case 3:
1469                         num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1470                                 sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3);
1471                         for (i = 0; i < num_indices; i++) {
1472                                 if ((ss_info->info_3.asSpreadSpectrum[i].ucClockIndication == id) &&
1473                                     (clock <= le32_to_cpu(ss_info->info_3.asSpreadSpectrum[i].ulTargetClockRange))) {
1474                                         ss->percentage =
1475                                                 le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1476                                         ss->type = ss_info->info_3.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1477                                         ss->rate = le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadRateIn10Hz);
1478                                         if (rdev->flags & RADEON_IS_IGP)
1479                                                 radeon_atombios_get_igp_ss_overrides(rdev, ss, id);
1480                                         return true;
1481                                 }
1482                         }
1483                         break;
1484                 default:
1485                         DRM_ERROR("Unsupported ASIC_InternalSS_Info table: %d %d\n", frev, crev);
1486                         break;
1487                 }
1488
1489         }
1490         return false;
1491 }
1492
1493 union lvds_info {
1494         struct _ATOM_LVDS_INFO info;
1495         struct _ATOM_LVDS_INFO_V12 info_12;
1496 };
1497
1498 struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct
1499                                                               radeon_encoder
1500                                                               *encoder)
1501 {
1502         struct drm_device *dev = encoder->base.dev;
1503         struct radeon_device *rdev = dev->dev_private;
1504         struct radeon_mode_info *mode_info = &rdev->mode_info;
1505         int index = GetIndexIntoMasterTable(DATA, LVDS_Info);
1506         uint16_t data_offset, misc;
1507         union lvds_info *lvds_info;
1508         uint8_t frev, crev;
1509         struct radeon_encoder_atom_dig *lvds = NULL;
1510         int encoder_enum = (encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
1511
1512         if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1513                                    &frev, &crev, &data_offset)) {
1514                 lvds_info =
1515                         (union lvds_info *)(mode_info->atom_context->bios + data_offset);
1516                 lvds =
1517                     kzalloc(sizeof(struct radeon_encoder_atom_dig), GFP_KERNEL);
1518
1519                 if (!lvds)
1520                         return NULL;
1521
1522                 lvds->native_mode.clock =
1523                     le16_to_cpu(lvds_info->info.sLCDTiming.usPixClk) * 10;
1524                 lvds->native_mode.hdisplay =
1525                     le16_to_cpu(lvds_info->info.sLCDTiming.usHActive);
1526                 lvds->native_mode.vdisplay =
1527                     le16_to_cpu(lvds_info->info.sLCDTiming.usVActive);
1528                 lvds->native_mode.htotal = lvds->native_mode.hdisplay +
1529                         le16_to_cpu(lvds_info->info.sLCDTiming.usHBlanking_Time);
1530                 lvds->native_mode.hsync_start = lvds->native_mode.hdisplay +
1531                         le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncOffset);
1532                 lvds->native_mode.hsync_end = lvds->native_mode.hsync_start +
1533                         le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncWidth);
1534                 lvds->native_mode.vtotal = lvds->native_mode.vdisplay +
1535                         le16_to_cpu(lvds_info->info.sLCDTiming.usVBlanking_Time);
1536                 lvds->native_mode.vsync_start = lvds->native_mode.vdisplay +
1537                         le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncOffset);
1538                 lvds->native_mode.vsync_end = lvds->native_mode.vsync_start +
1539                         le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncWidth);
1540                 lvds->panel_pwr_delay =
1541                     le16_to_cpu(lvds_info->info.usOffDelayInMs);
1542                 lvds->lcd_misc = lvds_info->info.ucLVDS_Misc;
1543
1544                 misc = le16_to_cpu(lvds_info->info.sLCDTiming.susModeMiscInfo.usAccess);
1545                 if (misc & ATOM_VSYNC_POLARITY)
1546                         lvds->native_mode.flags |= DRM_MODE_FLAG_NVSYNC;
1547                 if (misc & ATOM_HSYNC_POLARITY)
1548                         lvds->native_mode.flags |= DRM_MODE_FLAG_NHSYNC;
1549                 if (misc & ATOM_COMPOSITESYNC)
1550                         lvds->native_mode.flags |= DRM_MODE_FLAG_CSYNC;
1551                 if (misc & ATOM_INTERLACE)
1552                         lvds->native_mode.flags |= DRM_MODE_FLAG_INTERLACE;
1553                 if (misc & ATOM_DOUBLE_CLOCK_MODE)
1554                         lvds->native_mode.flags |= DRM_MODE_FLAG_DBLSCAN;
1555
1556                 lvds->native_mode.width_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageHSize);
1557                 lvds->native_mode.height_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageVSize);
1558
1559                 /* set crtc values */
1560                 drm_mode_set_crtcinfo(&lvds->native_mode, CRTC_INTERLACE_HALVE_V);
1561
1562                 lvds->lcd_ss_id = lvds_info->info.ucSS_Id;
1563
1564                 encoder->native_mode = lvds->native_mode;
1565
1566                 if (encoder_enum == 2)
1567                         lvds->linkb = true;
1568                 else
1569                         lvds->linkb = false;
1570
1571                 /* parse the lcd record table */
1572                 if (le16_to_cpu(lvds_info->info.usModePatchTableOffset)) {
1573                         ATOM_FAKE_EDID_PATCH_RECORD *fake_edid_record;
1574                         ATOM_PANEL_RESOLUTION_PATCH_RECORD *panel_res_record;
1575                         bool bad_record = false;
1576                         u8 *record = (u8 *)(mode_info->atom_context->bios +
1577                                             data_offset +
1578                                             le16_to_cpu(lvds_info->info.usModePatchTableOffset));
1579                         while (*record != ATOM_RECORD_END_TYPE) {
1580                                 switch (*record) {
1581                                 case LCD_MODE_PATCH_RECORD_MODE_TYPE:
1582                                         record += sizeof(ATOM_PATCH_RECORD_MODE);
1583                                         break;
1584                                 case LCD_RTS_RECORD_TYPE:
1585                                         record += sizeof(ATOM_LCD_RTS_RECORD);
1586                                         break;
1587                                 case LCD_CAP_RECORD_TYPE:
1588                                         record += sizeof(ATOM_LCD_MODE_CONTROL_CAP);
1589                                         break;
1590                                 case LCD_FAKE_EDID_PATCH_RECORD_TYPE:
1591                                         fake_edid_record = (ATOM_FAKE_EDID_PATCH_RECORD *)record;
1592                                         if (fake_edid_record->ucFakeEDIDLength) {
1593                                                 struct edid *edid;
1594                                                 int edid_size =
1595                                                         max((int)EDID_LENGTH, (int)fake_edid_record->ucFakeEDIDLength);
1596                                                 edid = kmalloc(edid_size, GFP_KERNEL);
1597                                                 if (edid) {
1598                                                         memcpy((u8 *)edid, (u8 *)&fake_edid_record->ucFakeEDIDString[0],
1599                                                                fake_edid_record->ucFakeEDIDLength);
1600
1601                                                         if (drm_edid_is_valid(edid))
1602                                                                 rdev->mode_info.bios_hardcoded_edid = edid;
1603                                                         else
1604                                                                 kfree(edid);
1605                                                 }
1606                                         }
1607                                         record += sizeof(ATOM_FAKE_EDID_PATCH_RECORD);
1608                                         break;
1609                                 case LCD_PANEL_RESOLUTION_RECORD_TYPE:
1610                                         panel_res_record = (ATOM_PANEL_RESOLUTION_PATCH_RECORD *)record;
1611                                         lvds->native_mode.width_mm = panel_res_record->usHSize;
1612                                         lvds->native_mode.height_mm = panel_res_record->usVSize;
1613                                         record += sizeof(ATOM_PANEL_RESOLUTION_PATCH_RECORD);
1614                                         break;
1615                                 default:
1616                                         DRM_ERROR("Bad LCD record %d\n", *record);
1617                                         bad_record = true;
1618                                         break;
1619                                 }
1620                                 if (bad_record)
1621                                         break;
1622                         }
1623                 }
1624         }
1625         return lvds;
1626 }
1627
1628 struct radeon_encoder_primary_dac *
1629 radeon_atombios_get_primary_dac_info(struct radeon_encoder *encoder)
1630 {
1631         struct drm_device *dev = encoder->base.dev;
1632         struct radeon_device *rdev = dev->dev_private;
1633         struct radeon_mode_info *mode_info = &rdev->mode_info;
1634         int index = GetIndexIntoMasterTable(DATA, CompassionateData);
1635         uint16_t data_offset;
1636         struct _COMPASSIONATE_DATA *dac_info;
1637         uint8_t frev, crev;
1638         uint8_t bg, dac;
1639         struct radeon_encoder_primary_dac *p_dac = NULL;
1640
1641         if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1642                                    &frev, &crev, &data_offset)) {
1643                 dac_info = (struct _COMPASSIONATE_DATA *)
1644                         (mode_info->atom_context->bios + data_offset);
1645
1646                 p_dac = kzalloc(sizeof(struct radeon_encoder_primary_dac), GFP_KERNEL);
1647
1648                 if (!p_dac)
1649                         return NULL;
1650
1651                 bg = dac_info->ucDAC1_BG_Adjustment;
1652                 dac = dac_info->ucDAC1_DAC_Adjustment;
1653                 p_dac->ps2_pdac_adj = (bg << 8) | (dac);
1654
1655         }
1656         return p_dac;
1657 }
1658
1659 bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index,
1660                                 struct drm_display_mode *mode)
1661 {
1662         struct radeon_mode_info *mode_info = &rdev->mode_info;
1663         ATOM_ANALOG_TV_INFO *tv_info;
1664         ATOM_ANALOG_TV_INFO_V1_2 *tv_info_v1_2;
1665         ATOM_DTD_FORMAT *dtd_timings;
1666         int data_index = GetIndexIntoMasterTable(DATA, AnalogTV_Info);
1667         u8 frev, crev;
1668         u16 data_offset, misc;
1669
1670         if (!atom_parse_data_header(mode_info->atom_context, data_index, NULL,
1671                                     &frev, &crev, &data_offset))
1672                 return false;
1673
1674         switch (crev) {
1675         case 1:
1676                 tv_info = (ATOM_ANALOG_TV_INFO *)(mode_info->atom_context->bios + data_offset);
1677                 if (index >= MAX_SUPPORTED_TV_TIMING)
1678                         return false;
1679
1680                 mode->crtc_htotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Total);
1681                 mode->crtc_hdisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Disp);
1682                 mode->crtc_hsync_start = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart);
1683                 mode->crtc_hsync_end = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart) +
1684                         le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncWidth);
1685
1686                 mode->crtc_vtotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Total);
1687                 mode->crtc_vdisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Disp);
1688                 mode->crtc_vsync_start = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart);
1689                 mode->crtc_vsync_end = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart) +
1690                         le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncWidth);
1691
1692                 mode->flags = 0;
1693                 misc = le16_to_cpu(tv_info->aModeTimings[index].susModeMiscInfo.usAccess);
1694                 if (misc & ATOM_VSYNC_POLARITY)
1695                         mode->flags |= DRM_MODE_FLAG_NVSYNC;
1696                 if (misc & ATOM_HSYNC_POLARITY)
1697                         mode->flags |= DRM_MODE_FLAG_NHSYNC;
1698                 if (misc & ATOM_COMPOSITESYNC)
1699                         mode->flags |= DRM_MODE_FLAG_CSYNC;
1700                 if (misc & ATOM_INTERLACE)
1701                         mode->flags |= DRM_MODE_FLAG_INTERLACE;
1702                 if (misc & ATOM_DOUBLE_CLOCK_MODE)
1703                         mode->flags |= DRM_MODE_FLAG_DBLSCAN;
1704
1705                 mode->clock = le16_to_cpu(tv_info->aModeTimings[index].usPixelClock) * 10;
1706
1707                 if (index == 1) {
1708                         /* PAL timings appear to have wrong values for totals */
1709                         mode->crtc_htotal -= 1;
1710                         mode->crtc_vtotal -= 1;
1711                 }
1712                 break;
1713         case 2:
1714                 tv_info_v1_2 = (ATOM_ANALOG_TV_INFO_V1_2 *)(mode_info->atom_context->bios + data_offset);
1715                 if (index >= MAX_SUPPORTED_TV_TIMING_V1_2)
1716                         return false;
1717
1718                 dtd_timings = &tv_info_v1_2->aModeTimings[index];
1719                 mode->crtc_htotal = le16_to_cpu(dtd_timings->usHActive) +
1720                         le16_to_cpu(dtd_timings->usHBlanking_Time);
1721                 mode->crtc_hdisplay = le16_to_cpu(dtd_timings->usHActive);
1722                 mode->crtc_hsync_start = le16_to_cpu(dtd_timings->usHActive) +
1723                         le16_to_cpu(dtd_timings->usHSyncOffset);
1724                 mode->crtc_hsync_end = mode->crtc_hsync_start +
1725                         le16_to_cpu(dtd_timings->usHSyncWidth);
1726
1727                 mode->crtc_vtotal = le16_to_cpu(dtd_timings->usVActive) +
1728                         le16_to_cpu(dtd_timings->usVBlanking_Time);
1729                 mode->crtc_vdisplay = le16_to_cpu(dtd_timings->usVActive);
1730                 mode->crtc_vsync_start = le16_to_cpu(dtd_timings->usVActive) +
1731                         le16_to_cpu(dtd_timings->usVSyncOffset);
1732                 mode->crtc_vsync_end = mode->crtc_vsync_start +
1733                         le16_to_cpu(dtd_timings->usVSyncWidth);
1734
1735                 mode->flags = 0;
1736                 misc = le16_to_cpu(dtd_timings->susModeMiscInfo.usAccess);
1737                 if (misc & ATOM_VSYNC_POLARITY)
1738                         mode->flags |= DRM_MODE_FLAG_NVSYNC;
1739                 if (misc & ATOM_HSYNC_POLARITY)
1740                         mode->flags |= DRM_MODE_FLAG_NHSYNC;
1741                 if (misc & ATOM_COMPOSITESYNC)
1742                         mode->flags |= DRM_MODE_FLAG_CSYNC;
1743                 if (misc & ATOM_INTERLACE)
1744                         mode->flags |= DRM_MODE_FLAG_INTERLACE;
1745                 if (misc & ATOM_DOUBLE_CLOCK_MODE)
1746                         mode->flags |= DRM_MODE_FLAG_DBLSCAN;
1747
1748                 mode->clock = le16_to_cpu(dtd_timings->usPixClk) * 10;
1749                 break;
1750         }
1751         return true;
1752 }
1753
1754 enum radeon_tv_std
1755 radeon_atombios_get_tv_info(struct radeon_device *rdev)
1756 {
1757         struct radeon_mode_info *mode_info = &rdev->mode_info;
1758         int index = GetIndexIntoMasterTable(DATA, AnalogTV_Info);
1759         uint16_t data_offset;
1760         uint8_t frev, crev;
1761         struct _ATOM_ANALOG_TV_INFO *tv_info;
1762         enum radeon_tv_std tv_std = TV_STD_NTSC;
1763
1764         if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1765                                    &frev, &crev, &data_offset)) {
1766
1767                 tv_info = (struct _ATOM_ANALOG_TV_INFO *)
1768                         (mode_info->atom_context->bios + data_offset);
1769
1770                 switch (tv_info->ucTV_BootUpDefaultStandard) {
1771                 case ATOM_TV_NTSC:
1772                         tv_std = TV_STD_NTSC;
1773                         DRM_DEBUG_KMS("Default TV standard: NTSC\n");
1774                         break;
1775                 case ATOM_TV_NTSCJ:
1776                         tv_std = TV_STD_NTSC_J;
1777                         DRM_DEBUG_KMS("Default TV standard: NTSC-J\n");
1778                         break;
1779                 case ATOM_TV_PAL:
1780                         tv_std = TV_STD_PAL;
1781                         DRM_DEBUG_KMS("Default TV standard: PAL\n");
1782                         break;
1783                 case ATOM_TV_PALM:
1784                         tv_std = TV_STD_PAL_M;
1785                         DRM_DEBUG_KMS("Default TV standard: PAL-M\n");
1786                         break;
1787                 case ATOM_TV_PALN:
1788                         tv_std = TV_STD_PAL_N;
1789                         DRM_DEBUG_KMS("Default TV standard: PAL-N\n");
1790                         break;
1791                 case ATOM_TV_PALCN:
1792                         tv_std = TV_STD_PAL_CN;
1793                         DRM_DEBUG_KMS("Default TV standard: PAL-CN\n");
1794                         break;
1795                 case ATOM_TV_PAL60:
1796                         tv_std = TV_STD_PAL_60;
1797                         DRM_DEBUG_KMS("Default TV standard: PAL-60\n");
1798                         break;
1799                 case ATOM_TV_SECAM:
1800                         tv_std = TV_STD_SECAM;
1801                         DRM_DEBUG_KMS("Default TV standard: SECAM\n");
1802                         break;
1803                 default:
1804                         tv_std = TV_STD_NTSC;
1805                         DRM_DEBUG_KMS("Unknown TV standard; defaulting to NTSC\n");
1806                         break;
1807                 }
1808         }
1809         return tv_std;
1810 }
1811
1812 struct radeon_encoder_tv_dac *
1813 radeon_atombios_get_tv_dac_info(struct radeon_encoder *encoder)
1814 {
1815         struct drm_device *dev = encoder->base.dev;
1816         struct radeon_device *rdev = dev->dev_private;
1817         struct radeon_mode_info *mode_info = &rdev->mode_info;
1818         int index = GetIndexIntoMasterTable(DATA, CompassionateData);
1819         uint16_t data_offset;
1820         struct _COMPASSIONATE_DATA *dac_info;
1821         uint8_t frev, crev;
1822         uint8_t bg, dac;
1823         struct radeon_encoder_tv_dac *tv_dac = NULL;
1824
1825         if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1826                                    &frev, &crev, &data_offset)) {
1827
1828                 dac_info = (struct _COMPASSIONATE_DATA *)
1829                         (mode_info->atom_context->bios + data_offset);
1830
1831                 tv_dac = kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL);
1832
1833                 if (!tv_dac)
1834                         return NULL;
1835
1836                 bg = dac_info->ucDAC2_CRT2_BG_Adjustment;
1837                 dac = dac_info->ucDAC2_CRT2_DAC_Adjustment;
1838                 tv_dac->ps2_tvdac_adj = (bg << 16) | (dac << 20);
1839
1840                 bg = dac_info->ucDAC2_PAL_BG_Adjustment;
1841                 dac = dac_info->ucDAC2_PAL_DAC_Adjustment;
1842                 tv_dac->pal_tvdac_adj = (bg << 16) | (dac << 20);
1843
1844                 bg = dac_info->ucDAC2_NTSC_BG_Adjustment;
1845                 dac = dac_info->ucDAC2_NTSC_DAC_Adjustment;
1846                 tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20);
1847
1848                 tv_dac->tv_std = radeon_atombios_get_tv_info(rdev);
1849         }
1850         return tv_dac;
1851 }
1852
1853 static const char *thermal_controller_names[] = {
1854         "NONE",
1855         "lm63",
1856         "adm1032",
1857         "adm1030",
1858         "max6649",
1859         "lm64",
1860         "f75375",
1861         "asc7xxx",
1862 };
1863
1864 static const char *pp_lib_thermal_controller_names[] = {
1865         "NONE",
1866         "lm63",
1867         "adm1032",
1868         "adm1030",
1869         "max6649",
1870         "lm64",
1871         "f75375",
1872         "RV6xx",
1873         "RV770",
1874         "adt7473",
1875         "NONE",
1876         "External GPIO",
1877         "Evergreen",
1878         "emc2103",
1879         "Sumo",
1880         "Northern Islands",
1881 };
1882
1883 union power_info {
1884         struct _ATOM_POWERPLAY_INFO info;
1885         struct _ATOM_POWERPLAY_INFO_V2 info_2;
1886         struct _ATOM_POWERPLAY_INFO_V3 info_3;
1887         struct _ATOM_PPLIB_POWERPLAYTABLE pplib;
1888         struct _ATOM_PPLIB_POWERPLAYTABLE2 pplib2;
1889         struct _ATOM_PPLIB_POWERPLAYTABLE3 pplib3;
1890 };
1891
1892 union pplib_clock_info {
1893         struct _ATOM_PPLIB_R600_CLOCK_INFO r600;
1894         struct _ATOM_PPLIB_RS780_CLOCK_INFO rs780;
1895         struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO evergreen;
1896         struct _ATOM_PPLIB_SUMO_CLOCK_INFO sumo;
1897 };
1898
1899 union pplib_power_state {
1900         struct _ATOM_PPLIB_STATE v1;
1901         struct _ATOM_PPLIB_STATE_V2 v2;
1902 };
1903
1904 static void radeon_atombios_parse_misc_flags_1_3(struct radeon_device *rdev,
1905                                                  int state_index,
1906                                                  u32 misc, u32 misc2)
1907 {
1908         rdev->pm.power_state[state_index].misc = misc;
1909         rdev->pm.power_state[state_index].misc2 = misc2;
1910         /* order matters! */
1911         if (misc & ATOM_PM_MISCINFO_POWER_SAVING_MODE)
1912                 rdev->pm.power_state[state_index].type =
1913                         POWER_STATE_TYPE_POWERSAVE;
1914         if (misc & ATOM_PM_MISCINFO_DEFAULT_DC_STATE_ENTRY_TRUE)
1915                 rdev->pm.power_state[state_index].type =
1916                         POWER_STATE_TYPE_BATTERY;
1917         if (misc & ATOM_PM_MISCINFO_DEFAULT_LOW_DC_STATE_ENTRY_TRUE)
1918                 rdev->pm.power_state[state_index].type =
1919                         POWER_STATE_TYPE_BATTERY;
1920         if (misc & ATOM_PM_MISCINFO_LOAD_BALANCE_EN)
1921                 rdev->pm.power_state[state_index].type =
1922                         POWER_STATE_TYPE_BALANCED;
1923         if (misc & ATOM_PM_MISCINFO_3D_ACCELERATION_EN) {
1924                 rdev->pm.power_state[state_index].type =
1925                         POWER_STATE_TYPE_PERFORMANCE;
1926                 rdev->pm.power_state[state_index].flags &=
1927                         ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
1928         }
1929         if (misc2 & ATOM_PM_MISCINFO2_SYSTEM_AC_LITE_MODE)
1930                 rdev->pm.power_state[state_index].type =
1931                         POWER_STATE_TYPE_BALANCED;
1932         if (misc & ATOM_PM_MISCINFO_DRIVER_DEFAULT_MODE) {
1933                 rdev->pm.power_state[state_index].type =
1934                         POWER_STATE_TYPE_DEFAULT;
1935                 rdev->pm.default_power_state_index = state_index;
1936                 rdev->pm.power_state[state_index].default_clock_mode =
1937                         &rdev->pm.power_state[state_index].clock_info[0];
1938         } else if (state_index == 0) {
1939                 rdev->pm.power_state[state_index].clock_info[0].flags |=
1940                         RADEON_PM_MODE_NO_DISPLAY;
1941         }
1942 }
1943
1944 static int radeon_atombios_parse_power_table_1_3(struct radeon_device *rdev)
1945 {
1946         struct radeon_mode_info *mode_info = &rdev->mode_info;
1947         u32 misc, misc2 = 0;
1948         int num_modes = 0, i;
1949         int state_index = 0;
1950         struct radeon_i2c_bus_rec i2c_bus;
1951         union power_info *power_info;
1952         int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
1953         u16 data_offset;
1954         u8 frev, crev;
1955
1956         if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
1957                                    &frev, &crev, &data_offset))
1958                 return state_index;
1959         power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
1960
1961         /* add the i2c bus for thermal/fan chip */
1962         if (power_info->info.ucOverdriveThermalController > 0) {
1963                 DRM_INFO("Possible %s thermal controller at 0x%02x\n",
1964                          thermal_controller_names[power_info->info.ucOverdriveThermalController],
1965                          power_info->info.ucOverdriveControllerAddress >> 1);
1966                 i2c_bus = radeon_lookup_i2c_gpio(rdev, power_info->info.ucOverdriveI2cLine);
1967                 rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
1968                 if (rdev->pm.i2c_bus) {
1969                         struct i2c_board_info info = { };
1970                         const char *name = thermal_controller_names[power_info->info.
1971                                                                     ucOverdriveThermalController];
1972                         info.addr = power_info->info.ucOverdriveControllerAddress >> 1;
1973                         strlcpy(info.type, name, sizeof(info.type));
1974                         i2c_new_device(&rdev->pm.i2c_bus->adapter, &info);
1975                 }
1976         }
1977         num_modes = power_info->info.ucNumOfPowerModeEntries;
1978         if (num_modes > ATOM_MAX_NUMBEROF_POWER_BLOCK)
1979                 num_modes = ATOM_MAX_NUMBEROF_POWER_BLOCK;
1980         rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) * num_modes, GFP_KERNEL);
1981         if (!rdev->pm.power_state)
1982                 return state_index;
1983         /* last mode is usually default, array is low to high */
1984         for (i = 0; i < num_modes; i++) {
1985                 rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
1986                 switch (frev) {
1987                 case 1:
1988                         rdev->pm.power_state[state_index].num_clock_modes = 1;
1989                         rdev->pm.power_state[state_index].clock_info[0].mclk =
1990                                 le16_to_cpu(power_info->info.asPowerPlayInfo[i].usMemoryClock);
1991                         rdev->pm.power_state[state_index].clock_info[0].sclk =
1992                                 le16_to_cpu(power_info->info.asPowerPlayInfo[i].usEngineClock);
1993                         /* skip invalid modes */
1994                         if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
1995                             (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
1996                                 continue;
1997                         rdev->pm.power_state[state_index].pcie_lanes =
1998                                 power_info->info.asPowerPlayInfo[i].ucNumPciELanes;
1999                         misc = le32_to_cpu(power_info->info.asPowerPlayInfo[i].ulMiscInfo);
2000                         if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2001                             (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2002                                 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2003                                         VOLTAGE_GPIO;
2004                                 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2005                                         radeon_lookup_gpio(rdev,
2006                                                            power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex);
2007                                 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2008                                         rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2009                                                 true;
2010                                 else
2011                                         rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2012                                                 false;
2013                         } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2014                                 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2015                                         VOLTAGE_VDDC;
2016                                 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2017                                         power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex;
2018                         }
2019                         rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2020                         radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, 0);
2021                         state_index++;
2022                         break;
2023                 case 2:
2024                         rdev->pm.power_state[state_index].num_clock_modes = 1;
2025                         rdev->pm.power_state[state_index].clock_info[0].mclk =
2026                                 le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMemoryClock);
2027                         rdev->pm.power_state[state_index].clock_info[0].sclk =
2028                                 le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulEngineClock);
2029                         /* skip invalid modes */
2030                         if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2031                             (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2032                                 continue;
2033                         rdev->pm.power_state[state_index].pcie_lanes =
2034                                 power_info->info_2.asPowerPlayInfo[i].ucNumPciELanes;
2035                         misc = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo);
2036                         misc2 = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo2);
2037                         if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2038                             (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2039                                 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2040                                         VOLTAGE_GPIO;
2041                                 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2042                                         radeon_lookup_gpio(rdev,
2043                                                            power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex);
2044                                 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2045                                         rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2046                                                 true;
2047                                 else
2048                                         rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2049                                                 false;
2050                         } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2051                                 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2052                                         VOLTAGE_VDDC;
2053                                 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2054                                         power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex;
2055                         }
2056                         rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2057                         radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, misc2);
2058                         state_index++;
2059                         break;
2060                 case 3:
2061                         rdev->pm.power_state[state_index].num_clock_modes = 1;
2062                         rdev->pm.power_state[state_index].clock_info[0].mclk =
2063                                 le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMemoryClock);
2064                         rdev->pm.power_state[state_index].clock_info[0].sclk =
2065                                 le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulEngineClock);
2066                         /* skip invalid modes */
2067                         if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2068                             (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2069                                 continue;
2070                         rdev->pm.power_state[state_index].pcie_lanes =
2071                                 power_info->info_3.asPowerPlayInfo[i].ucNumPciELanes;
2072                         misc = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo);
2073                         misc2 = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo2);
2074                         if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2075                             (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2076                                 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2077                                         VOLTAGE_GPIO;
2078                                 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2079                                         radeon_lookup_gpio(rdev,
2080                                                            power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex);
2081                                 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2082                                         rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2083                                                 true;
2084                                 else
2085                                         rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2086                                                 false;
2087                         } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2088                                 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2089                                         VOLTAGE_VDDC;
2090                                 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2091                                         power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex;
2092                                 if (misc2 & ATOM_PM_MISCINFO2_VDDCI_DYNAMIC_VOLTAGE_EN) {
2093                                         rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_enabled =
2094                                                 true;
2095                                         rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_id =
2096                                                 power_info->info_3.asPowerPlayInfo[i].ucVDDCI_VoltageDropIndex;
2097                                 }
2098                         }
2099                         rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2100                         radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, misc2);
2101                         state_index++;
2102                         break;
2103                 }
2104         }
2105         /* last mode is usually default */
2106         if (rdev->pm.default_power_state_index == -1) {
2107                 rdev->pm.power_state[state_index - 1].type =
2108                         POWER_STATE_TYPE_DEFAULT;
2109                 rdev->pm.default_power_state_index = state_index - 1;
2110                 rdev->pm.power_state[state_index - 1].default_clock_mode =
2111                         &rdev->pm.power_state[state_index - 1].clock_info[0];
2112                 rdev->pm.power_state[state_index].flags &=
2113                         ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2114                 rdev->pm.power_state[state_index].misc = 0;
2115                 rdev->pm.power_state[state_index].misc2 = 0;
2116         }
2117         return state_index;
2118 }
2119
2120 static void radeon_atombios_add_pplib_thermal_controller(struct radeon_device *rdev,
2121                                                          ATOM_PPLIB_THERMALCONTROLLER *controller)
2122 {
2123         struct radeon_i2c_bus_rec i2c_bus;
2124
2125         /* add the i2c bus for thermal/fan chip */
2126         if (controller->ucType > 0) {
2127                 if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV6xx) {
2128                         DRM_INFO("Internal thermal controller %s fan control\n",
2129                                  (controller->ucFanParameters &
2130                                   ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2131                         rdev->pm.int_thermal_type = THERMAL_TYPE_RV6XX;
2132                 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV770) {
2133                         DRM_INFO("Internal thermal controller %s fan control\n",
2134                                  (controller->ucFanParameters &
2135                                   ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2136                         rdev->pm.int_thermal_type = THERMAL_TYPE_RV770;
2137                 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_EVERGREEN) {
2138                         DRM_INFO("Internal thermal controller %s fan control\n",
2139                                  (controller->ucFanParameters &
2140                                   ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2141                         rdev->pm.int_thermal_type = THERMAL_TYPE_EVERGREEN;
2142                 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_SUMO) {
2143                         DRM_INFO("Internal thermal controller %s fan control\n",
2144                                  (controller->ucFanParameters &
2145                                   ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2146                         rdev->pm.int_thermal_type = THERMAL_TYPE_SUMO;
2147                 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_NISLANDS) {
2148                         DRM_INFO("Internal thermal controller %s fan control\n",
2149                                  (controller->ucFanParameters &
2150                                   ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2151                         rdev->pm.int_thermal_type = THERMAL_TYPE_NI;
2152                 } else if ((controller->ucType ==
2153                             ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO) ||
2154                            (controller->ucType ==
2155                             ATOM_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL) ||
2156                            (controller->ucType ==
2157                             ATOM_PP_THERMALCONTROLLER_EMC2103_WITH_INTERNAL)) {
2158                         DRM_INFO("Special thermal controller config\n");
2159                 } else {
2160                         DRM_INFO("Possible %s thermal controller at 0x%02x %s fan control\n",
2161                                  pp_lib_thermal_controller_names[controller->ucType],
2162                                  controller->ucI2cAddress >> 1,
2163                                  (controller->ucFanParameters &
2164                                   ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2165                         i2c_bus = radeon_lookup_i2c_gpio(rdev, controller->ucI2cLine);
2166                         rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
2167                         if (rdev->pm.i2c_bus) {
2168                                 struct i2c_board_info info = { };
2169                                 const char *name = pp_lib_thermal_controller_names[controller->ucType];
2170                                 info.addr = controller->ucI2cAddress >> 1;
2171                                 strlcpy(info.type, name, sizeof(info.type));
2172                                 i2c_new_device(&rdev->pm.i2c_bus->adapter, &info);
2173                         }
2174                 }
2175         }
2176 }
2177
2178 static u16 radeon_atombios_get_default_vddc(struct radeon_device *rdev)
2179 {
2180         struct radeon_mode_info *mode_info = &rdev->mode_info;
2181         int index = GetIndexIntoMasterTable(DATA, FirmwareInfo);
2182         u8 frev, crev;
2183         u16 data_offset;
2184         union firmware_info *firmware_info;
2185         u16 vddc = 0;
2186
2187         if (atom_parse_data_header(mode_info->atom_context, index, NULL,
2188                                    &frev, &crev, &data_offset)) {
2189                 firmware_info =
2190                         (union firmware_info *)(mode_info->atom_context->bios +
2191                                                 data_offset);
2192                 vddc = le16_to_cpu(firmware_info->info_14.usBootUpVDDCVoltage);
2193         }
2194
2195         return vddc;
2196 }
2197
2198 static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rdev,
2199                                                        int state_index, int mode_index,
2200                                                        struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info)
2201 {
2202         int j;
2203         u32 misc = le32_to_cpu(non_clock_info->ulCapsAndSettings);
2204         u32 misc2 = le16_to_cpu(non_clock_info->usClassification);
2205         u16 vddc = radeon_atombios_get_default_vddc(rdev);
2206
2207         rdev->pm.power_state[state_index].misc = misc;
2208         rdev->pm.power_state[state_index].misc2 = misc2;
2209         rdev->pm.power_state[state_index].pcie_lanes =
2210                 ((misc & ATOM_PPLIB_PCIE_LINK_WIDTH_MASK) >>
2211                  ATOM_PPLIB_PCIE_LINK_WIDTH_SHIFT) + 1;
2212         switch (misc2 & ATOM_PPLIB_CLASSIFICATION_UI_MASK) {
2213         case ATOM_PPLIB_CLASSIFICATION_UI_BATTERY:
2214                 rdev->pm.power_state[state_index].type =
2215                         POWER_STATE_TYPE_BATTERY;
2216                 break;
2217         case ATOM_PPLIB_CLASSIFICATION_UI_BALANCED:
2218                 rdev->pm.power_state[state_index].type =
2219                         POWER_STATE_TYPE_BALANCED;
2220                 break;
2221         case ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE:
2222                 rdev->pm.power_state[state_index].type =
2223                         POWER_STATE_TYPE_PERFORMANCE;
2224                 break;
2225         case ATOM_PPLIB_CLASSIFICATION_UI_NONE:
2226                 if (misc2 & ATOM_PPLIB_CLASSIFICATION_3DPERFORMANCE)
2227                         rdev->pm.power_state[state_index].type =
2228                                 POWER_STATE_TYPE_PERFORMANCE;
2229                 break;
2230         }
2231         rdev->pm.power_state[state_index].flags = 0;
2232         if (misc & ATOM_PPLIB_SINGLE_DISPLAY_ONLY)
2233                 rdev->pm.power_state[state_index].flags |=
2234                         RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2235         if (misc2 & ATOM_PPLIB_CLASSIFICATION_BOOT) {
2236                 rdev->pm.power_state[state_index].type =
2237                         POWER_STATE_TYPE_DEFAULT;
2238                 rdev->pm.default_power_state_index = state_index;
2239                 rdev->pm.power_state[state_index].default_clock_mode =
2240                         &rdev->pm.power_state[state_index].clock_info[mode_index - 1];
2241                 if (ASIC_IS_DCE5(rdev)) {
2242                         /* NI chips post without MC ucode, so default clocks are strobe mode only */
2243                         rdev->pm.default_sclk = rdev->pm.power_state[state_index].clock_info[0].sclk;
2244                         rdev->pm.default_mclk = rdev->pm.power_state[state_index].clock_info[0].mclk;
2245                         rdev->pm.default_vddc = rdev->pm.power_state[state_index].clock_info[0].voltage.voltage;
2246                 } else {
2247                         /* patch the table values with the default slck/mclk from firmware info */
2248                         for (j = 0; j < mode_index; j++) {
2249                                 rdev->pm.power_state[state_index].clock_info[j].mclk =
2250                                         rdev->clock.default_mclk;
2251                                 rdev->pm.power_state[state_index].clock_info[j].sclk =
2252                                         rdev->clock.default_sclk;
2253                                 if (vddc)
2254                                         rdev->pm.power_state[state_index].clock_info[j].voltage.voltage =
2255                                                 vddc;
2256                         }
2257                 }
2258         }
2259 }
2260
2261 static bool radeon_atombios_parse_pplib_clock_info(struct radeon_device *rdev,
2262                                                    int state_index, int mode_index,
2263                                                    union pplib_clock_info *clock_info)
2264 {
2265         u32 sclk, mclk;
2266
2267         if (rdev->flags & RADEON_IS_IGP) {
2268                 if (rdev->family >= CHIP_PALM) {
2269                         sclk = le16_to_cpu(clock_info->sumo.usEngineClockLow);
2270                         sclk |= clock_info->sumo.ucEngineClockHigh << 16;
2271                         rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2272                 } else {
2273                         sclk = le16_to_cpu(clock_info->rs780.usLowEngineClockLow);
2274                         sclk |= clock_info->rs780.ucLowEngineClockHigh << 16;
2275                         rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2276                 }
2277         } else if (ASIC_IS_DCE4(rdev)) {
2278                 sclk = le16_to_cpu(clock_info->evergreen.usEngineClockLow);
2279                 sclk |= clock_info->evergreen.ucEngineClockHigh << 16;
2280                 mclk = le16_to_cpu(clock_info->evergreen.usMemoryClockLow);
2281                 mclk |= clock_info->evergreen.ucMemoryClockHigh << 16;
2282                 rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk;
2283                 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2284                 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2285                         VOLTAGE_SW;
2286                 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
2287                         le16_to_cpu(clock_info->evergreen.usVDDC);
2288         } else {
2289                 sclk = le16_to_cpu(clock_info->r600.usEngineClockLow);
2290                 sclk |= clock_info->r600.ucEngineClockHigh << 16;
2291                 mclk = le16_to_cpu(clock_info->r600.usMemoryClockLow);
2292                 mclk |= clock_info->r600.ucMemoryClockHigh << 16;
2293                 rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk;
2294                 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2295                 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2296                         VOLTAGE_SW;
2297                 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
2298                         le16_to_cpu(clock_info->r600.usVDDC);
2299         }
2300
2301         if (rdev->flags & RADEON_IS_IGP) {
2302                 /* skip invalid modes */
2303                 if (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0)
2304                         return false;
2305         } else {
2306                 /* skip invalid modes */
2307                 if ((rdev->pm.power_state[state_index].clock_info[mode_index].mclk == 0) ||
2308                     (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0))
2309                         return false;
2310         }
2311         return true;
2312 }
2313
2314 static int radeon_atombios_parse_power_table_4_5(struct radeon_device *rdev)
2315 {
2316         struct radeon_mode_info *mode_info = &rdev->mode_info;
2317         struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
2318         union pplib_power_state *power_state;
2319         int i, j;
2320         int state_index = 0, mode_index = 0;
2321         union pplib_clock_info *clock_info;
2322         bool valid;
2323         union power_info *power_info;
2324         int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2325         u16 data_offset;
2326         u8 frev, crev;
2327
2328         if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2329                                    &frev, &crev, &data_offset))
2330                 return state_index;
2331         power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2332
2333         radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
2334         rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
2335                                        power_info->pplib.ucNumStates, GFP_KERNEL);
2336         if (!rdev->pm.power_state)
2337                 return state_index;
2338         /* first mode is usually default, followed by low to high */
2339         for (i = 0; i < power_info->pplib.ucNumStates; i++) {
2340                 mode_index = 0;
2341                 power_state = (union pplib_power_state *)
2342                         (mode_info->atom_context->bios + data_offset +
2343                          le16_to_cpu(power_info->pplib.usStateArrayOffset) +
2344                          i * power_info->pplib.ucStateEntrySize);
2345                 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
2346                         (mode_info->atom_context->bios + data_offset +
2347                          le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset) +
2348                          (power_state->v1.ucNonClockStateIndex *
2349                           power_info->pplib.ucNonClockSize));
2350                 for (j = 0; j < (power_info->pplib.ucStateEntrySize - 1); j++) {
2351                         clock_info = (union pplib_clock_info *)
2352                                 (mode_info->atom_context->bios + data_offset +
2353                                  le16_to_cpu(power_info->pplib.usClockInfoArrayOffset) +
2354                                  (power_state->v1.ucClockStateIndices[j] *
2355                                   power_info->pplib.ucClockInfoSize));
2356                         valid = radeon_atombios_parse_pplib_clock_info(rdev,
2357                                                                        state_index, mode_index,
2358                                                                        clock_info);
2359                         if (valid)
2360                                 mode_index++;
2361                 }
2362                 rdev->pm.power_state[state_index].num_clock_modes = mode_index;
2363                 if (mode_index) {
2364                         radeon_atombios_parse_pplib_non_clock_info(rdev, state_index, mode_index,
2365                                                                    non_clock_info);
2366                         state_index++;
2367                 }
2368         }
2369         /* if multiple clock modes, mark the lowest as no display */
2370         for (i = 0; i < state_index; i++) {
2371                 if (rdev->pm.power_state[i].num_clock_modes > 1)
2372                         rdev->pm.power_state[i].clock_info[0].flags |=
2373                                 RADEON_PM_MODE_NO_DISPLAY;
2374         }
2375         /* first mode is usually default */
2376         if (rdev->pm.default_power_state_index == -1) {
2377                 rdev->pm.power_state[0].type =
2378                         POWER_STATE_TYPE_DEFAULT;
2379                 rdev->pm.default_power_state_index = 0;
2380                 rdev->pm.power_state[0].default_clock_mode =
2381                         &rdev->pm.power_state[0].clock_info[0];
2382         }
2383         return state_index;
2384 }
2385
2386 static int radeon_atombios_parse_power_table_6(struct radeon_device *rdev)
2387 {
2388         struct radeon_mode_info *mode_info = &rdev->mode_info;
2389         struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
2390         union pplib_power_state *power_state;
2391         int i, j, non_clock_array_index, clock_array_index;
2392         int state_index = 0, mode_index = 0;
2393         union pplib_clock_info *clock_info;
2394         struct StateArray *state_array;
2395         struct ClockInfoArray *clock_info_array;
2396         struct NonClockInfoArray *non_clock_info_array;
2397         bool valid;
2398         union power_info *power_info;
2399         int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2400         u16 data_offset;
2401         u8 frev, crev;
2402
2403         if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2404                                    &frev, &crev, &data_offset))
2405                 return state_index;
2406         power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2407
2408         radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
2409         state_array = (struct StateArray *)
2410                 (mode_info->atom_context->bios + data_offset +
2411                  le16_to_cpu(power_info->pplib.usStateArrayOffset));
2412         clock_info_array = (struct ClockInfoArray *)
2413                 (mode_info->atom_context->bios + data_offset +
2414                  le16_to_cpu(power_info->pplib.usClockInfoArrayOffset));
2415         non_clock_info_array = (struct NonClockInfoArray *)
2416                 (mode_info->atom_context->bios + data_offset +
2417                  le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset));
2418         rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
2419                                        state_array->ucNumEntries, GFP_KERNEL);
2420         if (!rdev->pm.power_state)
2421                 return state_index;
2422         for (i = 0; i < state_array->ucNumEntries; i++) {
2423                 mode_index = 0;
2424                 power_state = (union pplib_power_state *)&state_array->states[i];
2425                 /* XXX this might be an inagua bug... */
2426                 non_clock_array_index = i; /* power_state->v2.nonClockInfoIndex */
2427                 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
2428                         &non_clock_info_array->nonClockInfo[non_clock_array_index];
2429                 for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) {
2430                         clock_array_index = power_state->v2.clockInfoIndex[j];
2431                         /* XXX this might be an inagua bug... */
2432                         if (clock_array_index >= clock_info_array->ucNumEntries)
2433                                 continue;
2434                         clock_info = (union pplib_clock_info *)
2435                                 &clock_info_array->clockInfo[clock_array_index];
2436                         valid = radeon_atombios_parse_pplib_clock_info(rdev,
2437                                                                        state_index, mode_index,
2438                                                                        clock_info);
2439                         if (valid)
2440                                 mode_index++;
2441                 }
2442                 rdev->pm.power_state[state_index].num_clock_modes = mode_index;
2443                 if (mode_index) {
2444                         radeon_atombios_parse_pplib_non_clock_info(rdev, state_index, mode_index,
2445                                                                    non_clock_info);
2446                         state_index++;
2447                 }
2448         }
2449         /* if multiple clock modes, mark the lowest as no display */
2450         for (i = 0; i < state_index; i++) {
2451                 if (rdev->pm.power_state[i].num_clock_modes > 1)
2452                         rdev->pm.power_state[i].clock_info[0].flags |=
2453                                 RADEON_PM_MODE_NO_DISPLAY;
2454         }
2455         /* first mode is usually default */
2456         if (rdev->pm.default_power_state_index == -1) {
2457                 rdev->pm.power_state[0].type =
2458                         POWER_STATE_TYPE_DEFAULT;
2459                 rdev->pm.default_power_state_index = 0;
2460                 rdev->pm.power_state[0].default_clock_mode =
2461                         &rdev->pm.power_state[0].clock_info[0];
2462         }
2463         return state_index;
2464 }
2465
2466 void radeon_atombios_get_power_modes(struct radeon_device *rdev)
2467 {
2468         struct radeon_mode_info *mode_info = &rdev->mode_info;
2469         int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2470         u16 data_offset;
2471         u8 frev, crev;
2472         int state_index = 0;
2473
2474         rdev->pm.default_power_state_index = -1;
2475
2476         if (atom_parse_data_header(mode_info->atom_context, index, NULL,
2477                                    &frev, &crev, &data_offset)) {
2478                 switch (frev) {
2479                 case 1:
2480                 case 2:
2481                 case 3:
2482                         state_index = radeon_atombios_parse_power_table_1_3(rdev);
2483                         break;
2484                 case 4:
2485                 case 5:
2486                         state_index = radeon_atombios_parse_power_table_4_5(rdev);
2487                         break;
2488                 case 6:
2489                         state_index = radeon_atombios_parse_power_table_6(rdev);
2490                         break;
2491                 default:
2492                         break;
2493                 }
2494         } else {
2495                 rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state), GFP_KERNEL);
2496                 if (rdev->pm.power_state) {
2497                         /* add the default mode */
2498                         rdev->pm.power_state[state_index].type =
2499                                 POWER_STATE_TYPE_DEFAULT;
2500                         rdev->pm.power_state[state_index].num_clock_modes = 1;
2501                         rdev->pm.power_state[state_index].clock_info[0].mclk = rdev->clock.default_mclk;
2502                         rdev->pm.power_state[state_index].clock_info[0].sclk = rdev->clock.default_sclk;
2503                         rdev->pm.power_state[state_index].default_clock_mode =
2504                                 &rdev->pm.power_state[state_index].clock_info[0];
2505                         rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
2506                         rdev->pm.power_state[state_index].pcie_lanes = 16;
2507                         rdev->pm.default_power_state_index = state_index;
2508                         rdev->pm.power_state[state_index].flags = 0;
2509                         state_index++;
2510                 }
2511         }
2512
2513         rdev->pm.num_power_states = state_index;
2514
2515         rdev->pm.current_power_state_index = rdev->pm.default_power_state_index;
2516         rdev->pm.current_clock_mode_index = 0;
2517         rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage;
2518 }
2519
2520 void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable)
2521 {
2522         DYNAMIC_CLOCK_GATING_PS_ALLOCATION args;
2523         int index = GetIndexIntoMasterTable(COMMAND, DynamicClockGating);
2524
2525         args.ucEnable = enable;
2526
2527         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2528 }
2529
2530 uint32_t radeon_atom_get_engine_clock(struct radeon_device *rdev)
2531 {
2532         GET_ENGINE_CLOCK_PS_ALLOCATION args;
2533         int index = GetIndexIntoMasterTable(COMMAND, GetEngineClock);
2534
2535         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2536         return le32_to_cpu(args.ulReturnEngineClock);
2537 }
2538
2539 uint32_t radeon_atom_get_memory_clock(struct radeon_device *rdev)
2540 {
2541         GET_MEMORY_CLOCK_PS_ALLOCATION args;
2542         int index = GetIndexIntoMasterTable(COMMAND, GetMemoryClock);
2543
2544         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2545         return le32_to_cpu(args.ulReturnMemoryClock);
2546 }
2547
2548 void radeon_atom_set_engine_clock(struct radeon_device *rdev,
2549                                   uint32_t eng_clock)
2550 {
2551         SET_ENGINE_CLOCK_PS_ALLOCATION args;
2552         int index = GetIndexIntoMasterTable(COMMAND, SetEngineClock);
2553
2554         args.ulTargetEngineClock = cpu_to_le32(eng_clock);      /* 10 khz */
2555
2556         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2557 }
2558
2559 void radeon_atom_set_memory_clock(struct radeon_device *rdev,
2560                                   uint32_t mem_clock)
2561 {
2562         SET_MEMORY_CLOCK_PS_ALLOCATION args;
2563         int index = GetIndexIntoMasterTable(COMMAND, SetMemoryClock);
2564
2565         if (rdev->flags & RADEON_IS_IGP)
2566                 return;
2567
2568         args.ulTargetMemoryClock = cpu_to_le32(mem_clock);      /* 10 khz */
2569
2570         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2571 }
2572
2573 union set_voltage {
2574         struct _SET_VOLTAGE_PS_ALLOCATION alloc;
2575         struct _SET_VOLTAGE_PARAMETERS v1;
2576         struct _SET_VOLTAGE_PARAMETERS_V2 v2;
2577 };
2578
2579 void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level)
2580 {
2581         union set_voltage args;
2582         int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
2583         u8 frev, crev, volt_index = level;
2584
2585         if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
2586                 return;
2587
2588         switch (crev) {
2589         case 1:
2590                 args.v1.ucVoltageType = SET_VOLTAGE_TYPE_ASIC_VDDC;
2591                 args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE;
2592                 args.v1.ucVoltageIndex = volt_index;
2593                 break;
2594         case 2:
2595                 args.v2.ucVoltageType = SET_VOLTAGE_TYPE_ASIC_VDDC;
2596                 args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE;
2597                 args.v2.usVoltageLevel = cpu_to_le16(level);
2598                 break;
2599         default:
2600                 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
2601                 return;
2602         }
2603
2604         atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2605 }
2606
2607
2608
2609 void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
2610 {
2611         struct radeon_device *rdev = dev->dev_private;
2612         uint32_t bios_2_scratch, bios_6_scratch;
2613
2614         if (rdev->family >= CHIP_R600) {
2615                 bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH);
2616                 bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
2617         } else {
2618                 bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH);
2619                 bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
2620         }
2621
2622         /* let the bios control the backlight */
2623         bios_2_scratch &= ~ATOM_S2_VRI_BRIGHT_ENABLE;
2624
2625         /* tell the bios not to handle mode switching */
2626         bios_6_scratch |= ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH;
2627
2628         if (rdev->family >= CHIP_R600) {
2629                 WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
2630                 WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
2631         } else {
2632                 WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
2633                 WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
2634         }
2635
2636 }
2637
2638 void radeon_save_bios_scratch_regs(struct radeon_device *rdev)
2639 {
2640         uint32_t scratch_reg;
2641         int i;
2642
2643         if (rdev->family >= CHIP_R600)
2644                 scratch_reg = R600_BIOS_0_SCRATCH;
2645         else
2646                 scratch_reg = RADEON_BIOS_0_SCRATCH;
2647
2648         for (i = 0; i < RADEON_BIOS_NUM_SCRATCH; i++)
2649                 rdev->bios_scratch[i] = RREG32(scratch_reg + (i * 4));
2650 }
2651
2652 void radeon_restore_bios_scratch_regs(struct radeon_device *rdev)
2653 {
2654         uint32_t scratch_reg;
2655         int i;
2656
2657         if (rdev->family >= CHIP_R600)
2658                 scratch_reg = R600_BIOS_0_SCRATCH;
2659         else
2660                 scratch_reg = RADEON_BIOS_0_SCRATCH;
2661
2662         for (i = 0; i < RADEON_BIOS_NUM_SCRATCH; i++)
2663                 WREG32(scratch_reg + (i * 4), rdev->bios_scratch[i]);
2664 }
2665
2666 void radeon_atom_output_lock(struct drm_encoder *encoder, bool lock)
2667 {
2668         struct drm_device *dev = encoder->dev;
2669         struct radeon_device *rdev = dev->dev_private;
2670         uint32_t bios_6_scratch;
2671
2672         if (rdev->family >= CHIP_R600)
2673                 bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
2674         else
2675                 bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
2676
2677         if (lock) {
2678                 bios_6_scratch |= ATOM_S6_CRITICAL_STATE;
2679                 bios_6_scratch &= ~ATOM_S6_ACC_MODE;
2680         } else {
2681                 bios_6_scratch &= ~ATOM_S6_CRITICAL_STATE;
2682                 bios_6_scratch |= ATOM_S6_ACC_MODE;
2683         }
2684
2685         if (rdev->family >= CHIP_R600)
2686                 WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
2687         else
2688                 WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
2689 }
2690
2691 /* at some point we may want to break this out into individual functions */
2692 void
2693 radeon_atombios_connected_scratch_regs(struct drm_connector *connector,
2694                                        struct drm_encoder *encoder,
2695                                        bool connected)
2696 {
2697         struct drm_device *dev = connector->dev;
2698         struct radeon_device *rdev = dev->dev_private;
2699         struct radeon_connector *radeon_connector =
2700             to_radeon_connector(connector);
2701         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2702         uint32_t bios_0_scratch, bios_3_scratch, bios_6_scratch;
2703
2704         if (rdev->family >= CHIP_R600) {
2705                 bios_0_scratch = RREG32(R600_BIOS_0_SCRATCH);
2706                 bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH);
2707                 bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
2708         } else {
2709                 bios_0_scratch = RREG32(RADEON_BIOS_0_SCRATCH);
2710                 bios_3_scratch = RREG32(RADEON_BIOS_3_SCRATCH);
2711                 bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
2712         }
2713
2714         if ((radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) &&
2715             (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT)) {
2716                 if (connected) {
2717                         DRM_DEBUG_KMS("TV1 connected\n");
2718                         bios_3_scratch |= ATOM_S3_TV1_ACTIVE;
2719                         bios_6_scratch |= ATOM_S6_ACC_REQ_TV1;
2720                 } else {
2721                         DRM_DEBUG_KMS("TV1 disconnected\n");
2722                         bios_0_scratch &= ~ATOM_S0_TV1_MASK;
2723                         bios_3_scratch &= ~ATOM_S3_TV1_ACTIVE;
2724                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_TV1;
2725                 }
2726         }
2727         if ((radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) &&
2728             (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT)) {
2729                 if (connected) {
2730                         DRM_DEBUG_KMS("CV connected\n");
2731                         bios_3_scratch |= ATOM_S3_CV_ACTIVE;
2732                         bios_6_scratch |= ATOM_S6_ACC_REQ_CV;
2733                 } else {
2734                         DRM_DEBUG_KMS("CV disconnected\n");
2735                         bios_0_scratch &= ~ATOM_S0_CV_MASK;
2736                         bios_3_scratch &= ~ATOM_S3_CV_ACTIVE;
2737                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_CV;
2738                 }
2739         }
2740         if ((radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) &&
2741             (radeon_connector->devices & ATOM_DEVICE_LCD1_SUPPORT)) {
2742                 if (connected) {
2743                         DRM_DEBUG_KMS("LCD1 connected\n");
2744                         bios_0_scratch |= ATOM_S0_LCD1;
2745                         bios_3_scratch |= ATOM_S3_LCD1_ACTIVE;
2746                         bios_6_scratch |= ATOM_S6_ACC_REQ_LCD1;
2747                 } else {
2748                         DRM_DEBUG_KMS("LCD1 disconnected\n");
2749                         bios_0_scratch &= ~ATOM_S0_LCD1;
2750                         bios_3_scratch &= ~ATOM_S3_LCD1_ACTIVE;
2751                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_LCD1;
2752                 }
2753         }
2754         if ((radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) &&
2755             (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT)) {
2756                 if (connected) {
2757                         DRM_DEBUG_KMS("CRT1 connected\n");
2758                         bios_0_scratch |= ATOM_S0_CRT1_COLOR;
2759                         bios_3_scratch |= ATOM_S3_CRT1_ACTIVE;
2760                         bios_6_scratch |= ATOM_S6_ACC_REQ_CRT1;
2761                 } else {
2762                         DRM_DEBUG_KMS("CRT1 disconnected\n");
2763                         bios_0_scratch &= ~ATOM_S0_CRT1_MASK;
2764                         bios_3_scratch &= ~ATOM_S3_CRT1_ACTIVE;
2765                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT1;
2766                 }
2767         }
2768         if ((radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) &&
2769             (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT)) {
2770                 if (connected) {
2771                         DRM_DEBUG_KMS("CRT2 connected\n");
2772                         bios_0_scratch |= ATOM_S0_CRT2_COLOR;
2773                         bios_3_scratch |= ATOM_S3_CRT2_ACTIVE;
2774                         bios_6_scratch |= ATOM_S6_ACC_REQ_CRT2;
2775                 } else {
2776                         DRM_DEBUG_KMS("CRT2 disconnected\n");
2777                         bios_0_scratch &= ~ATOM_S0_CRT2_MASK;
2778                         bios_3_scratch &= ~ATOM_S3_CRT2_ACTIVE;
2779                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT2;
2780                 }
2781         }
2782         if ((radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) &&
2783             (radeon_connector->devices & ATOM_DEVICE_DFP1_SUPPORT)) {
2784                 if (connected) {
2785                         DRM_DEBUG_KMS("DFP1 connected\n");
2786                         bios_0_scratch |= ATOM_S0_DFP1;
2787                         bios_3_scratch |= ATOM_S3_DFP1_ACTIVE;
2788                         bios_6_scratch |= ATOM_S6_ACC_REQ_DFP1;
2789                 } else {
2790                         DRM_DEBUG_KMS("DFP1 disconnected\n");
2791                         bios_0_scratch &= ~ATOM_S0_DFP1;
2792                         bios_3_scratch &= ~ATOM_S3_DFP1_ACTIVE;
2793                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP1;
2794                 }
2795         }
2796         if ((radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) &&
2797             (radeon_connector->devices & ATOM_DEVICE_DFP2_SUPPORT)) {
2798                 if (connected) {
2799                         DRM_DEBUG_KMS("DFP2 connected\n");
2800                         bios_0_scratch |= ATOM_S0_DFP2;
2801                         bios_3_scratch |= ATOM_S3_DFP2_ACTIVE;
2802                         bios_6_scratch |= ATOM_S6_ACC_REQ_DFP2;
2803                 } else {
2804                         DRM_DEBUG_KMS("DFP2 disconnected\n");
2805                         bios_0_scratch &= ~ATOM_S0_DFP2;
2806                         bios_3_scratch &= ~ATOM_S3_DFP2_ACTIVE;
2807                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP2;
2808                 }
2809         }
2810         if ((radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) &&
2811             (radeon_connector->devices & ATOM_DEVICE_DFP3_SUPPORT)) {
2812                 if (connected) {
2813                         DRM_DEBUG_KMS("DFP3 connected\n");
2814                         bios_0_scratch |= ATOM_S0_DFP3;
2815                         bios_3_scratch |= ATOM_S3_DFP3_ACTIVE;
2816                         bios_6_scratch |= ATOM_S6_ACC_REQ_DFP3;
2817                 } else {
2818                         DRM_DEBUG_KMS("DFP3 disconnected\n");
2819                         bios_0_scratch &= ~ATOM_S0_DFP3;
2820                         bios_3_scratch &= ~ATOM_S3_DFP3_ACTIVE;
2821                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP3;
2822                 }
2823         }
2824         if ((radeon_encoder->devices & ATOM_DEVICE_DFP4_SUPPORT) &&
2825             (radeon_connector->devices & ATOM_DEVICE_DFP4_SUPPORT)) {
2826                 if (connected) {
2827                         DRM_DEBUG_KMS("DFP4 connected\n");
2828                         bios_0_scratch |= ATOM_S0_DFP4;
2829                         bios_3_scratch |= ATOM_S3_DFP4_ACTIVE;
2830                         bios_6_scratch |= ATOM_S6_ACC_REQ_DFP4;
2831                 } else {
2832                         DRM_DEBUG_KMS("DFP4 disconnected\n");
2833                         bios_0_scratch &= ~ATOM_S0_DFP4;
2834                         bios_3_scratch &= ~ATOM_S3_DFP4_ACTIVE;
2835                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP4;
2836                 }
2837         }
2838         if ((radeon_encoder->devices & ATOM_DEVICE_DFP5_SUPPORT) &&
2839             (radeon_connector->devices & ATOM_DEVICE_DFP5_SUPPORT)) {
2840                 if (connected) {
2841                         DRM_DEBUG_KMS("DFP5 connected\n");
2842                         bios_0_scratch |= ATOM_S0_DFP5;
2843                         bios_3_scratch |= ATOM_S3_DFP5_ACTIVE;
2844                         bios_6_scratch |= ATOM_S6_ACC_REQ_DFP5;
2845                 } else {
2846                         DRM_DEBUG_KMS("DFP5 disconnected\n");
2847                         bios_0_scratch &= ~ATOM_S0_DFP5;
2848                         bios_3_scratch &= ~ATOM_S3_DFP5_ACTIVE;
2849                         bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP5;
2850                 }
2851         }
2852
2853         if (rdev->family >= CHIP_R600) {
2854                 WREG32(R600_BIOS_0_SCRATCH, bios_0_scratch);
2855                 WREG32(R600_BIOS_3_SCRATCH, bios_3_scratch);
2856                 WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
2857         } else {
2858                 WREG32(RADEON_BIOS_0_SCRATCH, bios_0_scratch);
2859                 WREG32(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
2860                 WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
2861         }
2862 }
2863
2864 void
2865 radeon_atombios_encoder_crtc_scratch_regs(struct drm_encoder *encoder, int crtc)
2866 {
2867         struct drm_device *dev = encoder->dev;
2868         struct radeon_device *rdev = dev->dev_private;
2869         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2870         uint32_t bios_3_scratch;
2871
2872         if (rdev->family >= CHIP_R600)
2873                 bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH);
2874         else
2875                 bios_3_scratch = RREG32(RADEON_BIOS_3_SCRATCH);
2876
2877         if (radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) {
2878                 bios_3_scratch &= ~ATOM_S3_TV1_CRTC_ACTIVE;
2879                 bios_3_scratch |= (crtc << 18);
2880         }
2881         if (radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) {
2882                 bios_3_scratch &= ~ATOM_S3_CV_CRTC_ACTIVE;
2883                 bios_3_scratch |= (crtc << 24);
2884         }
2885         if (radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) {
2886                 bios_3_scratch &= ~ATOM_S3_CRT1_CRTC_ACTIVE;
2887                 bios_3_scratch |= (crtc << 16);
2888         }
2889         if (radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) {
2890                 bios_3_scratch &= ~ATOM_S3_CRT2_CRTC_ACTIVE;
2891                 bios_3_scratch |= (crtc << 20);
2892         }
2893         if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) {
2894                 bios_3_scratch &= ~ATOM_S3_LCD1_CRTC_ACTIVE;
2895                 bios_3_scratch |= (crtc << 17);
2896         }
2897         if (radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) {
2898                 bios_3_scratch &= ~ATOM_S3_DFP1_CRTC_ACTIVE;
2899                 bios_3_scratch |= (crtc << 19);
2900         }
2901         if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) {
2902                 bios_3_scratch &= ~ATOM_S3_DFP2_CRTC_ACTIVE;
2903                 bios_3_scratch |= (crtc << 23);
2904         }
2905         if (radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) {
2906                 bios_3_scratch &= ~ATOM_S3_DFP3_CRTC_ACTIVE;
2907                 bios_3_scratch |= (crtc << 25);
2908         }
2909
2910         if (rdev->family >= CHIP_R600)
2911                 WREG32(R600_BIOS_3_SCRATCH, bios_3_scratch);
2912         else
2913                 WREG32(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
2914 }
2915
2916 void
2917 radeon_atombios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on)
2918 {
2919         struct drm_device *dev = encoder->dev;
2920         struct radeon_device *rdev = dev->dev_private;
2921         struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2922         uint32_t bios_2_scratch;
2923
2924         if (rdev->family >= CHIP_R600)
2925                 bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH);
2926         else
2927                 bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH);
2928
2929         if (radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) {
2930                 if (on)
2931                         bios_2_scratch &= ~ATOM_S2_TV1_DPMS_STATE;
2932                 else
2933                         bios_2_scratch |= ATOM_S2_TV1_DPMS_STATE;
2934         }
2935         if (radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) {
2936                 if (on)
2937                         bios_2_scratch &= ~ATOM_S2_CV_DPMS_STATE;
2938                 else
2939                         bios_2_scratch |= ATOM_S2_CV_DPMS_STATE;
2940         }
2941         if (radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) {
2942                 if (on)
2943                         bios_2_scratch &= ~ATOM_S2_CRT1_DPMS_STATE;
2944                 else
2945                         bios_2_scratch |= ATOM_S2_CRT1_DPMS_STATE;
2946         }
2947         if (radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) {
2948                 if (on)
2949                         bios_2_scratch &= ~ATOM_S2_CRT2_DPMS_STATE;
2950                 else
2951                         bios_2_scratch |= ATOM_S2_CRT2_DPMS_STATE;
2952         }
2953         if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) {
2954                 if (on)
2955                         bios_2_scratch &= ~ATOM_S2_LCD1_DPMS_STATE;
2956                 else
2957                         bios_2_scratch |= ATOM_S2_LCD1_DPMS_STATE;
2958         }
2959         if (radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) {
2960                 if (on)
2961                         bios_2_scratch &= ~ATOM_S2_DFP1_DPMS_STATE;
2962                 else
2963                         bios_2_scratch |= ATOM_S2_DFP1_DPMS_STATE;
2964         }
2965         if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) {
2966                 if (on)
2967                         bios_2_scratch &= ~ATOM_S2_DFP2_DPMS_STATE;
2968                 else
2969                         bios_2_scratch |= ATOM_S2_DFP2_DPMS_STATE;
2970         }
2971         if (radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) {
2972                 if (on)
2973                         bios_2_scratch &= ~ATOM_S2_DFP3_DPMS_STATE;
2974                 else
2975                         bios_2_scratch |= ATOM_S2_DFP3_DPMS_STATE;
2976         }
2977         if (radeon_encoder->devices & ATOM_DEVICE_DFP4_SUPPORT) {
2978                 if (on)
2979                         bios_2_scratch &= ~ATOM_S2_DFP4_DPMS_STATE;
2980                 else
2981                         bios_2_scratch |= ATOM_S2_DFP4_DPMS_STATE;
2982         }
2983         if (radeon_encoder->devices & ATOM_DEVICE_DFP5_SUPPORT) {
2984                 if (on)
2985                         bios_2_scratch &= ~ATOM_S2_DFP5_DPMS_STATE;
2986                 else
2987                         bios_2_scratch |= ATOM_S2_DFP5_DPMS_STATE;
2988         }
2989
2990         if (rdev->family >= CHIP_R600)
2991                 WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
2992         else
2993                 WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
2994 }