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