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