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