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