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