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