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 "drmP.h"
27 #include "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 /* local */
60 static int radeon_atom_get_max_vddc(struct radeon_device *rdev, u8 voltage_type,
61 				    u16 voltage_id, u16 *voltage);
62 
63 union atom_supported_devices {
64 	struct _ATOM_SUPPORTED_DEVICES_INFO info;
65 	struct _ATOM_SUPPORTED_DEVICES_INFO_2 info_2;
66 	struct _ATOM_SUPPORTED_DEVICES_INFO_2d1 info_2d1;
67 };
68 
69 static void radeon_lookup_i2c_gpio_quirks(struct radeon_device *rdev,
70 					  ATOM_GPIO_I2C_ASSIGMENT *gpio,
71 					  u8 index)
72 {
73 	/* r4xx mask is technically not used by the hw, so patch in the legacy mask bits */
74 	if ((rdev->family == CHIP_R420) ||
75 	    (rdev->family == CHIP_R423) ||
76 	    (rdev->family == CHIP_RV410)) {
77 		if ((le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x0018) ||
78 		    (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x0019) ||
79 		    (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x001a)) {
80 			gpio->ucClkMaskShift = 0x19;
81 			gpio->ucDataMaskShift = 0x18;
82 		}
83 	}
84 
85 	/* some evergreen boards have bad data for this entry */
86 	if (ASIC_IS_DCE4(rdev)) {
87 		if ((index == 7) &&
88 		    (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1936) &&
89 		    (gpio->sucI2cId.ucAccess == 0)) {
90 			gpio->sucI2cId.ucAccess = 0x97;
91 			gpio->ucDataMaskShift = 8;
92 			gpio->ucDataEnShift = 8;
93 			gpio->ucDataY_Shift = 8;
94 			gpio->ucDataA_Shift = 8;
95 		}
96 	}
97 
98 	/* some DCE3 boards have bad data for this entry */
99 	if (ASIC_IS_DCE3(rdev)) {
100 		if ((index == 4) &&
101 		    (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1fda) &&
102 		    (gpio->sucI2cId.ucAccess == 0x94))
103 			gpio->sucI2cId.ucAccess = 0x14;
104 	}
105 }
106 
107 static struct radeon_i2c_bus_rec radeon_get_bus_rec_for_i2c_gpio(ATOM_GPIO_I2C_ASSIGMENT *gpio)
108 {
109 	struct radeon_i2c_bus_rec i2c;
110 
111 	memset(&i2c, 0, sizeof(struct radeon_i2c_bus_rec));
112 
113 	i2c.mask_clk_reg = le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4;
114 	i2c.mask_data_reg = le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4;
115 	i2c.en_clk_reg = le16_to_cpu(gpio->usClkEnRegisterIndex) * 4;
116 	i2c.en_data_reg = le16_to_cpu(gpio->usDataEnRegisterIndex) * 4;
117 	i2c.y_clk_reg = le16_to_cpu(gpio->usClkY_RegisterIndex) * 4;
118 	i2c.y_data_reg = le16_to_cpu(gpio->usDataY_RegisterIndex) * 4;
119 	i2c.a_clk_reg = le16_to_cpu(gpio->usClkA_RegisterIndex) * 4;
120 	i2c.a_data_reg = le16_to_cpu(gpio->usDataA_RegisterIndex) * 4;
121 	i2c.mask_clk_mask = (1 << gpio->ucClkMaskShift);
122 	i2c.mask_data_mask = (1 << gpio->ucDataMaskShift);
123 	i2c.en_clk_mask = (1 << gpio->ucClkEnShift);
124 	i2c.en_data_mask = (1 << gpio->ucDataEnShift);
125 	i2c.y_clk_mask = (1 << gpio->ucClkY_Shift);
126 	i2c.y_data_mask = (1 << gpio->ucDataY_Shift);
127 	i2c.a_clk_mask = (1 << gpio->ucClkA_Shift);
128 	i2c.a_data_mask = (1 << gpio->ucDataA_Shift);
129 
130 	if (gpio->sucI2cId.sbfAccess.bfHW_Capable)
131 		i2c.hw_capable = true;
132 	else
133 		i2c.hw_capable = false;
134 
135 	if (gpio->sucI2cId.ucAccess == 0xa0)
136 		i2c.mm_i2c = true;
137 	else
138 		i2c.mm_i2c = false;
139 
140 	i2c.i2c_id = gpio->sucI2cId.ucAccess;
141 
142 	if (i2c.mask_clk_reg)
143 		i2c.valid = true;
144 	else
145 		i2c.valid = false;
146 
147 	return i2c;
148 }
149 
150 static struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_device *rdev,
151 							       uint8_t id)
152 {
153 	struct atom_context *ctx = rdev->mode_info.atom_context;
154 	ATOM_GPIO_I2C_ASSIGMENT *gpio;
155 	struct radeon_i2c_bus_rec i2c;
156 	int index = GetIndexIntoMasterTable(DATA, GPIO_I2C_Info);
157 	struct _ATOM_GPIO_I2C_INFO *i2c_info;
158 	uint16_t data_offset, size;
159 	int i, num_indices;
160 
161 	memset(&i2c, 0, sizeof(struct radeon_i2c_bus_rec));
162 	i2c.valid = false;
163 
164 	if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) {
165 		i2c_info = (struct _ATOM_GPIO_I2C_INFO *)(ctx->bios + data_offset);
166 
167 		num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
168 			sizeof(ATOM_GPIO_I2C_ASSIGMENT);
169 
170 		for (i = 0; i < num_indices; i++) {
171 			gpio = &i2c_info->asGPIO_Info[i];
172 
173 			radeon_lookup_i2c_gpio_quirks(rdev, gpio, i);
174 
175 			if (gpio->sucI2cId.ucAccess == id) {
176 				i2c = radeon_get_bus_rec_for_i2c_gpio(gpio);
177 				break;
178 			}
179 		}
180 	}
181 
182 	return i2c;
183 }
184 
185 void radeon_atombios_i2c_init(struct radeon_device *rdev)
186 {
187 	struct atom_context *ctx = rdev->mode_info.atom_context;
188 	ATOM_GPIO_I2C_ASSIGMENT *gpio;
189 	struct radeon_i2c_bus_rec i2c;
190 	int index = GetIndexIntoMasterTable(DATA, GPIO_I2C_Info);
191 	struct _ATOM_GPIO_I2C_INFO *i2c_info;
192 	uint16_t data_offset, size;
193 	int i, num_indices;
194 	char stmp[32];
195 
196 	if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) {
197 		i2c_info = (struct _ATOM_GPIO_I2C_INFO *)(ctx->bios + data_offset);
198 
199 		num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
200 			sizeof(ATOM_GPIO_I2C_ASSIGMENT);
201 
202 		for (i = 0; i < num_indices; i++) {
203 			gpio = &i2c_info->asGPIO_Info[i];
204 
205 			radeon_lookup_i2c_gpio_quirks(rdev, gpio, i);
206 
207 			i2c = radeon_get_bus_rec_for_i2c_gpio(gpio);
208 
209 			if (i2c.valid) {
210 				sprintf(stmp, "0x%x", i2c.i2c_id);
211 				rdev->i2c_bus[i] = radeon_i2c_create(rdev->ddev, &i2c, stmp);
212 			}
213 		}
214 	}
215 }
216 
217 static struct radeon_gpio_rec radeon_lookup_gpio(struct radeon_device *rdev,
218 							u8 id)
219 {
220 	struct atom_context *ctx = rdev->mode_info.atom_context;
221 	struct radeon_gpio_rec gpio;
222 	int index = GetIndexIntoMasterTable(DATA, GPIO_Pin_LUT);
223 	struct _ATOM_GPIO_PIN_LUT *gpio_info;
224 	ATOM_GPIO_PIN_ASSIGNMENT *pin;
225 	u16 data_offset, size;
226 	int i, num_indices;
227 
228 	memset(&gpio, 0, sizeof(struct radeon_gpio_rec));
229 	gpio.valid = false;
230 
231 	if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) {
232 		gpio_info = (struct _ATOM_GPIO_PIN_LUT *)(ctx->bios + data_offset);
233 
234 		num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
235 			sizeof(ATOM_GPIO_PIN_ASSIGNMENT);
236 
237 		for (i = 0; i < num_indices; i++) {
238 			pin = &gpio_info->asGPIO_Pin[i];
239 			if (id == pin->ucGPIO_ID) {
240 				gpio.id = pin->ucGPIO_ID;
241 				gpio.reg = le16_to_cpu(pin->usGpioPin_AIndex) * 4;
242 				gpio.mask = (1 << pin->ucGpioPinBitShift);
243 				gpio.valid = true;
244 				break;
245 			}
246 		}
247 	}
248 
249 	return gpio;
250 }
251 
252 static struct radeon_hpd radeon_atom_get_hpd_info_from_gpio(struct radeon_device *rdev,
253 							    struct radeon_gpio_rec *gpio)
254 {
255 	struct radeon_hpd hpd;
256 	u32 reg;
257 
258 	memset(&hpd, 0, sizeof(struct radeon_hpd));
259 
260 	if (ASIC_IS_DCE6(rdev))
261 		reg = SI_DC_GPIO_HPD_A;
262 	else if (ASIC_IS_DCE4(rdev))
263 		reg = EVERGREEN_DC_GPIO_HPD_A;
264 	else
265 		reg = AVIVO_DC_GPIO_HPD_A;
266 
267 	hpd.gpio = *gpio;
268 	if (gpio->reg == reg) {
269 		switch(gpio->mask) {
270 		case (1 << 0):
271 			hpd.hpd = RADEON_HPD_1;
272 			break;
273 		case (1 << 8):
274 			hpd.hpd = RADEON_HPD_2;
275 			break;
276 		case (1 << 16):
277 			hpd.hpd = RADEON_HPD_3;
278 			break;
279 		case (1 << 24):
280 			hpd.hpd = RADEON_HPD_4;
281 			break;
282 		case (1 << 26):
283 			hpd.hpd = RADEON_HPD_5;
284 			break;
285 		case (1 << 28):
286 			hpd.hpd = RADEON_HPD_6;
287 			break;
288 		default:
289 			hpd.hpd = RADEON_HPD_NONE;
290 			break;
291 		}
292 	} else
293 		hpd.hpd = RADEON_HPD_NONE;
294 	return hpd;
295 }
296 
297 static bool radeon_atom_apply_quirks(struct drm_device *dev,
298 				     uint32_t supported_device,
299 				     int *connector_type,
300 				     struct radeon_i2c_bus_rec *i2c_bus,
301 				     uint16_t *line_mux,
302 				     struct radeon_hpd *hpd)
303 {
304 
305 	/* Asus M2A-VM HDMI board lists the DVI port as HDMI */
306 	if ((dev->pdev->device == 0x791e) &&
307 	    (dev->pdev->subsystem_vendor == 0x1043) &&
308 	    (dev->pdev->subsystem_device == 0x826d)) {
309 		if ((*connector_type == DRM_MODE_CONNECTOR_HDMIA) &&
310 		    (supported_device == ATOM_DEVICE_DFP3_SUPPORT))
311 			*connector_type = DRM_MODE_CONNECTOR_DVID;
312 	}
313 
314 	/* Asrock RS600 board lists the DVI port as HDMI */
315 	if ((dev->pdev->device == 0x7941) &&
316 	    (dev->pdev->subsystem_vendor == 0x1849) &&
317 	    (dev->pdev->subsystem_device == 0x7941)) {
318 		if ((*connector_type == DRM_MODE_CONNECTOR_HDMIA) &&
319 		    (supported_device == ATOM_DEVICE_DFP3_SUPPORT))
320 			*connector_type = DRM_MODE_CONNECTOR_DVID;
321 	}
322 
323 	/* MSI K9A2GM V2/V3 board has no HDMI or DVI */
324 	if ((dev->pdev->device == 0x796e) &&
325 	    (dev->pdev->subsystem_vendor == 0x1462) &&
326 	    (dev->pdev->subsystem_device == 0x7302)) {
327 		if ((supported_device == ATOM_DEVICE_DFP2_SUPPORT) ||
328 		    (supported_device == ATOM_DEVICE_DFP3_SUPPORT))
329 			return false;
330 	}
331 
332 	/* a-bit f-i90hd - ciaranm on #radeonhd - this board has no DVI */
333 	if ((dev->pdev->device == 0x7941) &&
334 	    (dev->pdev->subsystem_vendor == 0x147b) &&
335 	    (dev->pdev->subsystem_device == 0x2412)) {
336 		if (*connector_type == DRM_MODE_CONNECTOR_DVII)
337 			return false;
338 	}
339 
340 	/* Falcon NW laptop lists vga ddc line for LVDS */
341 	if ((dev->pdev->device == 0x5653) &&
342 	    (dev->pdev->subsystem_vendor == 0x1462) &&
343 	    (dev->pdev->subsystem_device == 0x0291)) {
344 		if (*connector_type == DRM_MODE_CONNECTOR_LVDS) {
345 			i2c_bus->valid = false;
346 			*line_mux = 53;
347 		}
348 	}
349 
350 	/* HIS X1300 is DVI+VGA, not DVI+DVI */
351 	if ((dev->pdev->device == 0x7146) &&
352 	    (dev->pdev->subsystem_vendor == 0x17af) &&
353 	    (dev->pdev->subsystem_device == 0x2058)) {
354 		if (supported_device == ATOM_DEVICE_DFP1_SUPPORT)
355 			return false;
356 	}
357 
358 	/* Gigabyte X1300 is DVI+VGA, not DVI+DVI */
359 	if ((dev->pdev->device == 0x7142) &&
360 	    (dev->pdev->subsystem_vendor == 0x1458) &&
361 	    (dev->pdev->subsystem_device == 0x2134)) {
362 		if (supported_device == ATOM_DEVICE_DFP1_SUPPORT)
363 			return false;
364 	}
365 
366 
367 	/* Funky macbooks */
368 	if ((dev->pdev->device == 0x71C5) &&
369 	    (dev->pdev->subsystem_vendor == 0x106b) &&
370 	    (dev->pdev->subsystem_device == 0x0080)) {
371 		if ((supported_device == ATOM_DEVICE_CRT1_SUPPORT) ||
372 		    (supported_device == ATOM_DEVICE_DFP2_SUPPORT))
373 			return false;
374 		if (supported_device == ATOM_DEVICE_CRT2_SUPPORT)
375 			*line_mux = 0x90;
376 	}
377 
378 	/* mac rv630, rv730, others */
379 	if ((supported_device == ATOM_DEVICE_TV1_SUPPORT) &&
380 	    (*connector_type == DRM_MODE_CONNECTOR_DVII)) {
381 		*connector_type = DRM_MODE_CONNECTOR_9PinDIN;
382 		*line_mux = CONNECTOR_7PIN_DIN_ENUM_ID1;
383 	}
384 
385 	/* ASUS HD 3600 XT board lists the DVI port as HDMI */
386 	if ((dev->pdev->device == 0x9598) &&
387 	    (dev->pdev->subsystem_vendor == 0x1043) &&
388 	    (dev->pdev->subsystem_device == 0x01da)) {
389 		if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
390 			*connector_type = DRM_MODE_CONNECTOR_DVII;
391 		}
392 	}
393 
394 	/* ASUS HD 3600 board lists the DVI port as HDMI */
395 	if ((dev->pdev->device == 0x9598) &&
396 	    (dev->pdev->subsystem_vendor == 0x1043) &&
397 	    (dev->pdev->subsystem_device == 0x01e4)) {
398 		if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
399 			*connector_type = DRM_MODE_CONNECTOR_DVII;
400 		}
401 	}
402 
403 	/* ASUS HD 3450 board lists the DVI port as HDMI */
404 	if ((dev->pdev->device == 0x95C5) &&
405 	    (dev->pdev->subsystem_vendor == 0x1043) &&
406 	    (dev->pdev->subsystem_device == 0x01e2)) {
407 		if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
408 			*connector_type = DRM_MODE_CONNECTOR_DVII;
409 		}
410 	}
411 
412 	/* some BIOSes seem to report DAC on HDMI - usually this is a board with
413 	 * HDMI + VGA reporting as HDMI
414 	 */
415 	if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
416 		if (supported_device & (ATOM_DEVICE_CRT_SUPPORT)) {
417 			*connector_type = DRM_MODE_CONNECTOR_VGA;
418 			*line_mux = 0;
419 		}
420 	}
421 
422 	/* Acer laptop (Acer TravelMate 5730/5730G) has an HDMI port
423 	 * on the laptop and a DVI port on the docking station and
424 	 * both share the same encoder, hpd pin, and ddc line.
425 	 * So while the bios table is technically correct,
426 	 * we drop the DVI port here since xrandr has no concept of
427 	 * encoders and will try and drive both connectors
428 	 * with different crtcs which isn't possible on the hardware
429 	 * side and leaves no crtcs for LVDS or VGA.
430 	 */
431 	if (((dev->pdev->device == 0x95c4) || (dev->pdev->device == 0x9591)) &&
432 	    (dev->pdev->subsystem_vendor == 0x1025) &&
433 	    (dev->pdev->subsystem_device == 0x013c)) {
434 		if ((*connector_type == DRM_MODE_CONNECTOR_DVII) &&
435 		    (supported_device == ATOM_DEVICE_DFP1_SUPPORT)) {
436 			/* actually it's a DVI-D port not DVI-I */
437 			*connector_type = DRM_MODE_CONNECTOR_DVID;
438 			return false;
439 		}
440 	}
441 
442 	/* XFX Pine Group device rv730 reports no VGA DDC lines
443 	 * even though they are wired up to record 0x93
444 	 */
445 	if ((dev->pdev->device == 0x9498) &&
446 	    (dev->pdev->subsystem_vendor == 0x1682) &&
447 	    (dev->pdev->subsystem_device == 0x2452) &&
448 	    (i2c_bus->valid == false) &&
449 	    !(supported_device & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT))) {
450 		struct radeon_device *rdev = dev->dev_private;
451 		*i2c_bus = radeon_lookup_i2c_gpio(rdev, 0x93);
452 	}
453 
454 	/* Fujitsu D3003-S2 board lists DVI-I as DVI-D and VGA */
455 	if (((dev->pdev->device == 0x9802) || (dev->pdev->device == 0x9806)) &&
456 	    (dev->pdev->subsystem_vendor == 0x1734) &&
457 	    (dev->pdev->subsystem_device == 0x11bd)) {
458 		if (*connector_type == DRM_MODE_CONNECTOR_VGA) {
459 			*connector_type = DRM_MODE_CONNECTOR_DVII;
460 			*line_mux = 0x3103;
461 		} else if (*connector_type == DRM_MODE_CONNECTOR_DVID) {
462 			*connector_type = DRM_MODE_CONNECTOR_DVII;
463 		}
464 	}
465 
466 
467 	return true;
468 }
469 
470 const int supported_devices_connector_convert[] = {
471 	DRM_MODE_CONNECTOR_Unknown,
472 	DRM_MODE_CONNECTOR_VGA,
473 	DRM_MODE_CONNECTOR_DVII,
474 	DRM_MODE_CONNECTOR_DVID,
475 	DRM_MODE_CONNECTOR_DVIA,
476 	DRM_MODE_CONNECTOR_SVIDEO,
477 	DRM_MODE_CONNECTOR_Composite,
478 	DRM_MODE_CONNECTOR_LVDS,
479 	DRM_MODE_CONNECTOR_Unknown,
480 	DRM_MODE_CONNECTOR_Unknown,
481 	DRM_MODE_CONNECTOR_HDMIA,
482 	DRM_MODE_CONNECTOR_HDMIB,
483 	DRM_MODE_CONNECTOR_Unknown,
484 	DRM_MODE_CONNECTOR_Unknown,
485 	DRM_MODE_CONNECTOR_9PinDIN,
486 	DRM_MODE_CONNECTOR_DisplayPort
487 };
488 
489 const uint16_t supported_devices_connector_object_id_convert[] = {
490 	CONNECTOR_OBJECT_ID_NONE,
491 	CONNECTOR_OBJECT_ID_VGA,
492 	CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I, /* not all boards support DL */
493 	CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D, /* not all boards support DL */
494 	CONNECTOR_OBJECT_ID_VGA, /* technically DVI-A */
495 	CONNECTOR_OBJECT_ID_COMPOSITE,
496 	CONNECTOR_OBJECT_ID_SVIDEO,
497 	CONNECTOR_OBJECT_ID_LVDS,
498 	CONNECTOR_OBJECT_ID_9PIN_DIN,
499 	CONNECTOR_OBJECT_ID_9PIN_DIN,
500 	CONNECTOR_OBJECT_ID_DISPLAYPORT,
501 	CONNECTOR_OBJECT_ID_HDMI_TYPE_A,
502 	CONNECTOR_OBJECT_ID_HDMI_TYPE_B,
503 	CONNECTOR_OBJECT_ID_SVIDEO
504 };
505 
506 const int object_connector_convert[] = {
507 	DRM_MODE_CONNECTOR_Unknown,
508 	DRM_MODE_CONNECTOR_DVII,
509 	DRM_MODE_CONNECTOR_DVII,
510 	DRM_MODE_CONNECTOR_DVID,
511 	DRM_MODE_CONNECTOR_DVID,
512 	DRM_MODE_CONNECTOR_VGA,
513 	DRM_MODE_CONNECTOR_Composite,
514 	DRM_MODE_CONNECTOR_SVIDEO,
515 	DRM_MODE_CONNECTOR_Unknown,
516 	DRM_MODE_CONNECTOR_Unknown,
517 	DRM_MODE_CONNECTOR_9PinDIN,
518 	DRM_MODE_CONNECTOR_Unknown,
519 	DRM_MODE_CONNECTOR_HDMIA,
520 	DRM_MODE_CONNECTOR_HDMIB,
521 	DRM_MODE_CONNECTOR_LVDS,
522 	DRM_MODE_CONNECTOR_9PinDIN,
523 	DRM_MODE_CONNECTOR_Unknown,
524 	DRM_MODE_CONNECTOR_Unknown,
525 	DRM_MODE_CONNECTOR_Unknown,
526 	DRM_MODE_CONNECTOR_DisplayPort,
527 	DRM_MODE_CONNECTOR_eDP,
528 	DRM_MODE_CONNECTOR_Unknown
529 };
530 
531 bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)
532 {
533 	struct radeon_device *rdev = dev->dev_private;
534 	struct radeon_mode_info *mode_info = &rdev->mode_info;
535 	struct atom_context *ctx = mode_info->atom_context;
536 	int index = GetIndexIntoMasterTable(DATA, Object_Header);
537 	u16 size, data_offset;
538 	u8 frev, crev;
539 	ATOM_CONNECTOR_OBJECT_TABLE *con_obj;
540 	ATOM_ENCODER_OBJECT_TABLE *enc_obj;
541 	ATOM_OBJECT_TABLE *router_obj;
542 	ATOM_DISPLAY_OBJECT_PATH_TABLE *path_obj;
543 	ATOM_OBJECT_HEADER *obj_header;
544 	int i, j, k, path_size, device_support;
545 	int connector_type;
546 	u16 igp_lane_info, conn_id, connector_object_id;
547 	struct radeon_i2c_bus_rec ddc_bus;
548 	struct radeon_router router;
549 	struct radeon_gpio_rec gpio;
550 	struct radeon_hpd hpd;
551 
552 	if (!atom_parse_data_header(ctx, index, &size, &frev, &crev, &data_offset))
553 		return false;
554 
555 	if (crev < 2)
556 		return false;
557 
558 	obj_header = (ATOM_OBJECT_HEADER *) (ctx->bios + data_offset);
559 	path_obj = (ATOM_DISPLAY_OBJECT_PATH_TABLE *)
560 	    (ctx->bios + data_offset +
561 	     le16_to_cpu(obj_header->usDisplayPathTableOffset));
562 	con_obj = (ATOM_CONNECTOR_OBJECT_TABLE *)
563 	    (ctx->bios + data_offset +
564 	     le16_to_cpu(obj_header->usConnectorObjectTableOffset));
565 	enc_obj = (ATOM_ENCODER_OBJECT_TABLE *)
566 	    (ctx->bios + data_offset +
567 	     le16_to_cpu(obj_header->usEncoderObjectTableOffset));
568 	router_obj = (ATOM_OBJECT_TABLE *)
569 		(ctx->bios + data_offset +
570 		 le16_to_cpu(obj_header->usRouterObjectTableOffset));
571 	device_support = le16_to_cpu(obj_header->usDeviceSupport);
572 
573 	path_size = 0;
574 	for (i = 0; i < path_obj->ucNumOfDispPath; i++) {
575 		uint8_t *addr = (uint8_t *) path_obj->asDispPath;
576 		ATOM_DISPLAY_OBJECT_PATH *path;
577 		addr += path_size;
578 		path = (ATOM_DISPLAY_OBJECT_PATH *) addr;
579 		path_size += le16_to_cpu(path->usSize);
580 
581 		if (device_support & le16_to_cpu(path->usDeviceTag)) {
582 			uint8_t con_obj_id, con_obj_num, con_obj_type;
583 
584 			con_obj_id =
585 			    (le16_to_cpu(path->usConnObjectId) & OBJECT_ID_MASK)
586 			    >> OBJECT_ID_SHIFT;
587 			con_obj_num =
588 			    (le16_to_cpu(path->usConnObjectId) & ENUM_ID_MASK)
589 			    >> ENUM_ID_SHIFT;
590 			con_obj_type =
591 			    (le16_to_cpu(path->usConnObjectId) &
592 			     OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT;
593 
594 			/* TODO CV support */
595 			if (le16_to_cpu(path->usDeviceTag) ==
596 				ATOM_DEVICE_CV_SUPPORT)
597 				continue;
598 
599 			/* IGP chips */
600 			if ((rdev->flags & RADEON_IS_IGP) &&
601 			    (con_obj_id ==
602 			     CONNECTOR_OBJECT_ID_PCIE_CONNECTOR)) {
603 				uint16_t igp_offset = 0;
604 				ATOM_INTEGRATED_SYSTEM_INFO_V2 *igp_obj;
605 
606 				index =
607 				    GetIndexIntoMasterTable(DATA,
608 							    IntegratedSystemInfo);
609 
610 				if (atom_parse_data_header(ctx, index, &size, &frev,
611 							   &crev, &igp_offset)) {
612 
613 					if (crev >= 2) {
614 						igp_obj =
615 							(ATOM_INTEGRATED_SYSTEM_INFO_V2
616 							 *) (ctx->bios + igp_offset);
617 
618 						if (igp_obj) {
619 							uint32_t slot_config, ct;
620 
621 							if (con_obj_num == 1)
622 								slot_config =
623 									igp_obj->
624 									ulDDISlot1Config;
625 							else
626 								slot_config =
627 									igp_obj->
628 									ulDDISlot2Config;
629 
630 							ct = (slot_config >> 16) & 0xff;
631 							connector_type =
632 								object_connector_convert
633 								[ct];
634 							connector_object_id = ct;
635 							igp_lane_info =
636 								slot_config & 0xffff;
637 						} else
638 							continue;
639 					} else
640 						continue;
641 				} else {
642 					igp_lane_info = 0;
643 					connector_type =
644 						object_connector_convert[con_obj_id];
645 					connector_object_id = con_obj_id;
646 				}
647 			} else {
648 				igp_lane_info = 0;
649 				connector_type =
650 				    object_connector_convert[con_obj_id];
651 				connector_object_id = con_obj_id;
652 			}
653 
654 			if (connector_type == DRM_MODE_CONNECTOR_Unknown)
655 				continue;
656 
657 			router.ddc_valid = false;
658 			router.cd_valid = false;
659 			for (j = 0; j < ((le16_to_cpu(path->usSize) - 8) / 2); j++) {
660 				uint8_t grph_obj_id, grph_obj_num, grph_obj_type;
661 
662 				grph_obj_id =
663 				    (le16_to_cpu(path->usGraphicObjIds[j]) &
664 				     OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
665 				grph_obj_num =
666 				    (le16_to_cpu(path->usGraphicObjIds[j]) &
667 				     ENUM_ID_MASK) >> ENUM_ID_SHIFT;
668 				grph_obj_type =
669 				    (le16_to_cpu(path->usGraphicObjIds[j]) &
670 				     OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT;
671 
672 				if (grph_obj_type == GRAPH_OBJECT_TYPE_ENCODER) {
673 					for (k = 0; k < enc_obj->ucNumberOfObjects; k++) {
674 						u16 encoder_obj = le16_to_cpu(enc_obj->asObjects[k].usObjectID);
675 						if (le16_to_cpu(path->usGraphicObjIds[j]) == encoder_obj) {
676 							ATOM_COMMON_RECORD_HEADER *record = (ATOM_COMMON_RECORD_HEADER *)
677 								(ctx->bios + data_offset +
678 								 le16_to_cpu(enc_obj->asObjects[k].usRecordOffset));
679 							ATOM_ENCODER_CAP_RECORD *cap_record;
680 							u16 caps = 0;
681 
682 							while (record->ucRecordSize > 0 &&
683 							       record->ucRecordType > 0 &&
684 							       record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
685 								switch (record->ucRecordType) {
686 								case ATOM_ENCODER_CAP_RECORD_TYPE:
687 									cap_record =(ATOM_ENCODER_CAP_RECORD *)
688 										record;
689 									caps = le16_to_cpu(cap_record->usEncoderCap);
690 									break;
691 								}
692 								record = (ATOM_COMMON_RECORD_HEADER *)
693 									((char *)record + record->ucRecordSize);
694 							}
695 							radeon_add_atom_encoder(dev,
696 										encoder_obj,
697 										le16_to_cpu
698 										(path->
699 										 usDeviceTag),
700 										caps);
701 						}
702 					}
703 				} else if (grph_obj_type == GRAPH_OBJECT_TYPE_ROUTER) {
704 					for (k = 0; k < router_obj->ucNumberOfObjects; k++) {
705 						u16 router_obj_id = le16_to_cpu(router_obj->asObjects[k].usObjectID);
706 						if (le16_to_cpu(path->usGraphicObjIds[j]) == router_obj_id) {
707 							ATOM_COMMON_RECORD_HEADER *record = (ATOM_COMMON_RECORD_HEADER *)
708 								(ctx->bios + data_offset +
709 								 le16_to_cpu(router_obj->asObjects[k].usRecordOffset));
710 							ATOM_I2C_RECORD *i2c_record;
711 							ATOM_I2C_ID_CONFIG_ACCESS *i2c_config;
712 							ATOM_ROUTER_DDC_PATH_SELECT_RECORD *ddc_path;
713 							ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD *cd_path;
714 							ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT *router_src_dst_table =
715 								(ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT *)
716 								(ctx->bios + data_offset +
717 								 le16_to_cpu(router_obj->asObjects[k].usSrcDstTableOffset));
718 							int enum_id;
719 
720 							router.router_id = router_obj_id;
721 							for (enum_id = 0; enum_id < router_src_dst_table->ucNumberOfDst;
722 							     enum_id++) {
723 								if (le16_to_cpu(path->usConnObjectId) ==
724 								    le16_to_cpu(router_src_dst_table->usDstObjectID[enum_id]))
725 									break;
726 							}
727 
728 							while (record->ucRecordSize > 0 &&
729 							       record->ucRecordType > 0 &&
730 							       record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
731 								switch (record->ucRecordType) {
732 								case ATOM_I2C_RECORD_TYPE:
733 									i2c_record =
734 										(ATOM_I2C_RECORD *)
735 										record;
736 									i2c_config =
737 										(ATOM_I2C_ID_CONFIG_ACCESS *)
738 										&i2c_record->sucI2cId;
739 									router.i2c_info =
740 										radeon_lookup_i2c_gpio(rdev,
741 												       i2c_config->
742 												       ucAccess);
743 									router.i2c_addr = i2c_record->ucI2CAddr >> 1;
744 									break;
745 								case ATOM_ROUTER_DDC_PATH_SELECT_RECORD_TYPE:
746 									ddc_path = (ATOM_ROUTER_DDC_PATH_SELECT_RECORD *)
747 										record;
748 									router.ddc_valid = true;
749 									router.ddc_mux_type = ddc_path->ucMuxType;
750 									router.ddc_mux_control_pin = ddc_path->ucMuxControlPin;
751 									router.ddc_mux_state = ddc_path->ucMuxState[enum_id];
752 									break;
753 								case ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD_TYPE:
754 									cd_path = (ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD *)
755 										record;
756 									router.cd_valid = true;
757 									router.cd_mux_type = cd_path->ucMuxType;
758 									router.cd_mux_control_pin = cd_path->ucMuxControlPin;
759 									router.cd_mux_state = cd_path->ucMuxState[enum_id];
760 									break;
761 								}
762 								record = (ATOM_COMMON_RECORD_HEADER *)
763 									((char *)record + record->ucRecordSize);
764 							}
765 						}
766 					}
767 				}
768 			}
769 
770 			/* look up gpio for ddc, hpd */
771 			ddc_bus.valid = false;
772 			hpd.hpd = RADEON_HPD_NONE;
773 			if ((le16_to_cpu(path->usDeviceTag) &
774 			     (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) == 0) {
775 				for (j = 0; j < con_obj->ucNumberOfObjects; j++) {
776 					if (le16_to_cpu(path->usConnObjectId) ==
777 					    le16_to_cpu(con_obj->asObjects[j].
778 							usObjectID)) {
779 						ATOM_COMMON_RECORD_HEADER
780 						    *record =
781 						    (ATOM_COMMON_RECORD_HEADER
782 						     *)
783 						    (ctx->bios + data_offset +
784 						     le16_to_cpu(con_obj->
785 								 asObjects[j].
786 								 usRecordOffset));
787 						ATOM_I2C_RECORD *i2c_record;
788 						ATOM_HPD_INT_RECORD *hpd_record;
789 						ATOM_I2C_ID_CONFIG_ACCESS *i2c_config;
790 
791 						while (record->ucRecordSize > 0 &&
792 						       record->ucRecordType > 0 &&
793 						       record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {
794 							switch (record->ucRecordType) {
795 							case ATOM_I2C_RECORD_TYPE:
796 								i2c_record =
797 								    (ATOM_I2C_RECORD *)
798 									record;
799 								i2c_config =
800 									(ATOM_I2C_ID_CONFIG_ACCESS *)
801 									&i2c_record->sucI2cId;
802 								ddc_bus = radeon_lookup_i2c_gpio(rdev,
803 												 i2c_config->
804 												 ucAccess);
805 								break;
806 							case ATOM_HPD_INT_RECORD_TYPE:
807 								hpd_record =
808 									(ATOM_HPD_INT_RECORD *)
809 									record;
810 								gpio = radeon_lookup_gpio(rdev,
811 											  hpd_record->ucHPDIntGPIOID);
812 								hpd = radeon_atom_get_hpd_info_from_gpio(rdev, &gpio);
813 								hpd.plugged_state = hpd_record->ucPlugged_PinState;
814 								break;
815 							}
816 							record =
817 							    (ATOM_COMMON_RECORD_HEADER
818 							     *) ((char *)record
819 								 +
820 								 record->
821 								 ucRecordSize);
822 						}
823 						break;
824 					}
825 				}
826 			}
827 
828 			/* needed for aux chan transactions */
829 			ddc_bus.hpd = hpd.hpd;
830 
831 			conn_id = le16_to_cpu(path->usConnObjectId);
832 
833 			if (!radeon_atom_apply_quirks
834 			    (dev, le16_to_cpu(path->usDeviceTag), &connector_type,
835 			     &ddc_bus, &conn_id, &hpd))
836 				continue;
837 
838 			radeon_add_atom_connector(dev,
839 						  conn_id,
840 						  le16_to_cpu(path->
841 							      usDeviceTag),
842 						  connector_type, &ddc_bus,
843 						  igp_lane_info,
844 						  connector_object_id,
845 						  &hpd,
846 						  &router);
847 
848 		}
849 	}
850 
851 	radeon_link_encoder_connector(dev);
852 
853 	return true;
854 }
855 
856 static uint16_t atombios_get_connector_object_id(struct drm_device *dev,
857 						 int connector_type,
858 						 uint16_t devices)
859 {
860 	struct radeon_device *rdev = dev->dev_private;
861 
862 	if (rdev->flags & RADEON_IS_IGP) {
863 		return supported_devices_connector_object_id_convert
864 			[connector_type];
865 	} else if (((connector_type == DRM_MODE_CONNECTOR_DVII) ||
866 		    (connector_type == DRM_MODE_CONNECTOR_DVID)) &&
867 		   (devices & ATOM_DEVICE_DFP2_SUPPORT))  {
868 		struct radeon_mode_info *mode_info = &rdev->mode_info;
869 		struct atom_context *ctx = mode_info->atom_context;
870 		int index = GetIndexIntoMasterTable(DATA, XTMDS_Info);
871 		uint16_t size, data_offset;
872 		uint8_t frev, crev;
873 		ATOM_XTMDS_INFO *xtmds;
874 
875 		if (atom_parse_data_header(ctx, index, &size, &frev, &crev, &data_offset)) {
876 			xtmds = (ATOM_XTMDS_INFO *)(ctx->bios + data_offset);
877 
878 			if (xtmds->ucSupportedLink & ATOM_XTMDS_SUPPORTED_DUALLINK) {
879 				if (connector_type == DRM_MODE_CONNECTOR_DVII)
880 					return CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I;
881 				else
882 					return CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D;
883 			} else {
884 				if (connector_type == DRM_MODE_CONNECTOR_DVII)
885 					return CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I;
886 				else
887 					return CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D;
888 			}
889 		} else
890 			return supported_devices_connector_object_id_convert
891 				[connector_type];
892 	} else {
893 		return supported_devices_connector_object_id_convert
894 			[connector_type];
895 	}
896 }
897 
898 struct bios_connector {
899 	bool valid;
900 	uint16_t line_mux;
901 	uint16_t devices;
902 	int connector_type;
903 	struct radeon_i2c_bus_rec ddc_bus;
904 	struct radeon_hpd hpd;
905 };
906 
907 bool radeon_get_atom_connector_info_from_supported_devices_table(struct
908 								 drm_device
909 								 *dev)
910 {
911 	struct radeon_device *rdev = dev->dev_private;
912 	struct radeon_mode_info *mode_info = &rdev->mode_info;
913 	struct atom_context *ctx = mode_info->atom_context;
914 	int index = GetIndexIntoMasterTable(DATA, SupportedDevicesInfo);
915 	uint16_t size, data_offset;
916 	uint8_t frev, crev;
917 	uint16_t device_support;
918 	uint8_t dac;
919 	union atom_supported_devices *supported_devices;
920 	int i, j, max_device;
921 	struct bios_connector *bios_connectors;
922 	size_t bc_size = sizeof(*bios_connectors) * ATOM_MAX_SUPPORTED_DEVICE;
923 	struct radeon_router router;
924 
925 	router.ddc_valid = false;
926 	router.cd_valid = false;
927 
928 	bios_connectors = kzalloc(bc_size, GFP_KERNEL);
929 	if (!bios_connectors)
930 		return false;
931 
932 	if (!atom_parse_data_header(ctx, index, &size, &frev, &crev,
933 				    &data_offset)) {
934 		kfree(bios_connectors);
935 		return false;
936 	}
937 
938 	supported_devices =
939 	    (union atom_supported_devices *)(ctx->bios + data_offset);
940 
941 	device_support = le16_to_cpu(supported_devices->info.usDeviceSupport);
942 
943 	if (frev > 1)
944 		max_device = ATOM_MAX_SUPPORTED_DEVICE;
945 	else
946 		max_device = ATOM_MAX_SUPPORTED_DEVICE_INFO;
947 
948 	for (i = 0; i < max_device; i++) {
949 		ATOM_CONNECTOR_INFO_I2C ci =
950 		    supported_devices->info.asConnInfo[i];
951 
952 		bios_connectors[i].valid = false;
953 
954 		if (!(device_support & (1 << i))) {
955 			continue;
956 		}
957 
958 		if (i == ATOM_DEVICE_CV_INDEX) {
959 			DRM_DEBUG_KMS("Skipping Component Video\n");
960 			continue;
961 		}
962 
963 		bios_connectors[i].connector_type =
964 		    supported_devices_connector_convert[ci.sucConnectorInfo.
965 							sbfAccess.
966 							bfConnectorType];
967 
968 		if (bios_connectors[i].connector_type ==
969 		    DRM_MODE_CONNECTOR_Unknown)
970 			continue;
971 
972 		dac = ci.sucConnectorInfo.sbfAccess.bfAssociatedDAC;
973 
974 		bios_connectors[i].line_mux =
975 			ci.sucI2cId.ucAccess;
976 
977 		/* give tv unique connector ids */
978 		if (i == ATOM_DEVICE_TV1_INDEX) {
979 			bios_connectors[i].ddc_bus.valid = false;
980 			bios_connectors[i].line_mux = 50;
981 		} else if (i == ATOM_DEVICE_TV2_INDEX) {
982 			bios_connectors[i].ddc_bus.valid = false;
983 			bios_connectors[i].line_mux = 51;
984 		} else if (i == ATOM_DEVICE_CV_INDEX) {
985 			bios_connectors[i].ddc_bus.valid = false;
986 			bios_connectors[i].line_mux = 52;
987 		} else
988 			bios_connectors[i].ddc_bus =
989 			    radeon_lookup_i2c_gpio(rdev,
990 						   bios_connectors[i].line_mux);
991 
992 		if ((crev > 1) && (frev > 1)) {
993 			u8 isb = supported_devices->info_2d1.asIntSrcInfo[i].ucIntSrcBitmap;
994 			switch (isb) {
995 			case 0x4:
996 				bios_connectors[i].hpd.hpd = RADEON_HPD_1;
997 				break;
998 			case 0xa:
999 				bios_connectors[i].hpd.hpd = RADEON_HPD_2;
1000 				break;
1001 			default:
1002 				bios_connectors[i].hpd.hpd = RADEON_HPD_NONE;
1003 				break;
1004 			}
1005 		} else {
1006 			if (i == ATOM_DEVICE_DFP1_INDEX)
1007 				bios_connectors[i].hpd.hpd = RADEON_HPD_1;
1008 			else if (i == ATOM_DEVICE_DFP2_INDEX)
1009 				bios_connectors[i].hpd.hpd = RADEON_HPD_2;
1010 			else
1011 				bios_connectors[i].hpd.hpd = RADEON_HPD_NONE;
1012 		}
1013 
1014 		/* Always set the connector type to VGA for CRT1/CRT2. if they are
1015 		 * shared with a DVI port, we'll pick up the DVI connector when we
1016 		 * merge the outputs.  Some bioses incorrectly list VGA ports as DVI.
1017 		 */
1018 		if (i == ATOM_DEVICE_CRT1_INDEX || i == ATOM_DEVICE_CRT2_INDEX)
1019 			bios_connectors[i].connector_type =
1020 			    DRM_MODE_CONNECTOR_VGA;
1021 
1022 		if (!radeon_atom_apply_quirks
1023 		    (dev, (1 << i), &bios_connectors[i].connector_type,
1024 		     &bios_connectors[i].ddc_bus, &bios_connectors[i].line_mux,
1025 		     &bios_connectors[i].hpd))
1026 			continue;
1027 
1028 		bios_connectors[i].valid = true;
1029 		bios_connectors[i].devices = (1 << i);
1030 
1031 		if (ASIC_IS_AVIVO(rdev) || radeon_r4xx_atom)
1032 			radeon_add_atom_encoder(dev,
1033 						radeon_get_encoder_enum(dev,
1034 								      (1 << i),
1035 								      dac),
1036 						(1 << i),
1037 						0);
1038 		else
1039 			radeon_add_legacy_encoder(dev,
1040 						  radeon_get_encoder_enum(dev,
1041 									(1 << i),
1042 									dac),
1043 						  (1 << i));
1044 	}
1045 
1046 	/* combine shared connectors */
1047 	for (i = 0; i < max_device; i++) {
1048 		if (bios_connectors[i].valid) {
1049 			for (j = 0; j < max_device; j++) {
1050 				if (bios_connectors[j].valid && (i != j)) {
1051 					if (bios_connectors[i].line_mux ==
1052 					    bios_connectors[j].line_mux) {
1053 						/* make sure not to combine LVDS */
1054 						if (bios_connectors[i].devices & (ATOM_DEVICE_LCD_SUPPORT)) {
1055 							bios_connectors[i].line_mux = 53;
1056 							bios_connectors[i].ddc_bus.valid = false;
1057 							continue;
1058 						}
1059 						if (bios_connectors[j].devices & (ATOM_DEVICE_LCD_SUPPORT)) {
1060 							bios_connectors[j].line_mux = 53;
1061 							bios_connectors[j].ddc_bus.valid = false;
1062 							continue;
1063 						}
1064 						/* combine analog and digital for DVI-I */
1065 						if (((bios_connectors[i].devices & (ATOM_DEVICE_DFP_SUPPORT)) &&
1066 						     (bios_connectors[j].devices & (ATOM_DEVICE_CRT_SUPPORT))) ||
1067 						    ((bios_connectors[j].devices & (ATOM_DEVICE_DFP_SUPPORT)) &&
1068 						     (bios_connectors[i].devices & (ATOM_DEVICE_CRT_SUPPORT)))) {
1069 							bios_connectors[i].devices |=
1070 								bios_connectors[j].devices;
1071 							bios_connectors[i].connector_type =
1072 								DRM_MODE_CONNECTOR_DVII;
1073 							if (bios_connectors[j].devices & (ATOM_DEVICE_DFP_SUPPORT))
1074 								bios_connectors[i].hpd =
1075 									bios_connectors[j].hpd;
1076 							bios_connectors[j].valid = false;
1077 						}
1078 					}
1079 				}
1080 			}
1081 		}
1082 	}
1083 
1084 	/* add the connectors */
1085 	for (i = 0; i < max_device; i++) {
1086 		if (bios_connectors[i].valid) {
1087 			uint16_t connector_object_id =
1088 				atombios_get_connector_object_id(dev,
1089 						      bios_connectors[i].connector_type,
1090 						      bios_connectors[i].devices);
1091 			radeon_add_atom_connector(dev,
1092 						  bios_connectors[i].line_mux,
1093 						  bios_connectors[i].devices,
1094 						  bios_connectors[i].
1095 						  connector_type,
1096 						  &bios_connectors[i].ddc_bus,
1097 						  0,
1098 						  connector_object_id,
1099 						  &bios_connectors[i].hpd,
1100 						  &router);
1101 		}
1102 	}
1103 
1104 	radeon_link_encoder_connector(dev);
1105 
1106 	kfree(bios_connectors);
1107 	return true;
1108 }
1109 
1110 union firmware_info {
1111 	ATOM_FIRMWARE_INFO info;
1112 	ATOM_FIRMWARE_INFO_V1_2 info_12;
1113 	ATOM_FIRMWARE_INFO_V1_3 info_13;
1114 	ATOM_FIRMWARE_INFO_V1_4 info_14;
1115 	ATOM_FIRMWARE_INFO_V2_1 info_21;
1116 	ATOM_FIRMWARE_INFO_V2_2 info_22;
1117 };
1118 
1119 bool radeon_atom_get_clock_info(struct drm_device *dev)
1120 {
1121 	struct radeon_device *rdev = dev->dev_private;
1122 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1123 	int index = GetIndexIntoMasterTable(DATA, FirmwareInfo);
1124 	union firmware_info *firmware_info;
1125 	uint8_t frev, crev;
1126 	struct radeon_pll *p1pll = &rdev->clock.p1pll;
1127 	struct radeon_pll *p2pll = &rdev->clock.p2pll;
1128 	struct radeon_pll *dcpll = &rdev->clock.dcpll;
1129 	struct radeon_pll *spll = &rdev->clock.spll;
1130 	struct radeon_pll *mpll = &rdev->clock.mpll;
1131 	uint16_t data_offset;
1132 
1133 	if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1134 				   &frev, &crev, &data_offset)) {
1135 		firmware_info =
1136 			(union firmware_info *)(mode_info->atom_context->bios +
1137 						data_offset);
1138 		/* pixel clocks */
1139 		p1pll->reference_freq =
1140 		    le16_to_cpu(firmware_info->info.usReferenceClock);
1141 		p1pll->reference_div = 0;
1142 
1143 		if (crev < 2)
1144 			p1pll->pll_out_min =
1145 				le16_to_cpu(firmware_info->info.usMinPixelClockPLL_Output);
1146 		else
1147 			p1pll->pll_out_min =
1148 				le32_to_cpu(firmware_info->info_12.ulMinPixelClockPLL_Output);
1149 		p1pll->pll_out_max =
1150 		    le32_to_cpu(firmware_info->info.ulMaxPixelClockPLL_Output);
1151 
1152 		if (crev >= 4) {
1153 			p1pll->lcd_pll_out_min =
1154 				le16_to_cpu(firmware_info->info_14.usLcdMinPixelClockPLL_Output) * 100;
1155 			if (p1pll->lcd_pll_out_min == 0)
1156 				p1pll->lcd_pll_out_min = p1pll->pll_out_min;
1157 			p1pll->lcd_pll_out_max =
1158 				le16_to_cpu(firmware_info->info_14.usLcdMaxPixelClockPLL_Output) * 100;
1159 			if (p1pll->lcd_pll_out_max == 0)
1160 				p1pll->lcd_pll_out_max = p1pll->pll_out_max;
1161 		} else {
1162 			p1pll->lcd_pll_out_min = p1pll->pll_out_min;
1163 			p1pll->lcd_pll_out_max = p1pll->pll_out_max;
1164 		}
1165 
1166 		if (p1pll->pll_out_min == 0) {
1167 			if (ASIC_IS_AVIVO(rdev))
1168 				p1pll->pll_out_min = 64800;
1169 			else
1170 				p1pll->pll_out_min = 20000;
1171 		}
1172 
1173 		p1pll->pll_in_min =
1174 		    le16_to_cpu(firmware_info->info.usMinPixelClockPLL_Input);
1175 		p1pll->pll_in_max =
1176 		    le16_to_cpu(firmware_info->info.usMaxPixelClockPLL_Input);
1177 
1178 		*p2pll = *p1pll;
1179 
1180 		/* system clock */
1181 		if (ASIC_IS_DCE4(rdev))
1182 			spll->reference_freq =
1183 				le16_to_cpu(firmware_info->info_21.usCoreReferenceClock);
1184 		else
1185 			spll->reference_freq =
1186 				le16_to_cpu(firmware_info->info.usReferenceClock);
1187 		spll->reference_div = 0;
1188 
1189 		spll->pll_out_min =
1190 		    le16_to_cpu(firmware_info->info.usMinEngineClockPLL_Output);
1191 		spll->pll_out_max =
1192 		    le32_to_cpu(firmware_info->info.ulMaxEngineClockPLL_Output);
1193 
1194 		/* ??? */
1195 		if (spll->pll_out_min == 0) {
1196 			if (ASIC_IS_AVIVO(rdev))
1197 				spll->pll_out_min = 64800;
1198 			else
1199 				spll->pll_out_min = 20000;
1200 		}
1201 
1202 		spll->pll_in_min =
1203 		    le16_to_cpu(firmware_info->info.usMinEngineClockPLL_Input);
1204 		spll->pll_in_max =
1205 		    le16_to_cpu(firmware_info->info.usMaxEngineClockPLL_Input);
1206 
1207 		/* memory clock */
1208 		if (ASIC_IS_DCE4(rdev))
1209 			mpll->reference_freq =
1210 				le16_to_cpu(firmware_info->info_21.usMemoryReferenceClock);
1211 		else
1212 			mpll->reference_freq =
1213 				le16_to_cpu(firmware_info->info.usReferenceClock);
1214 		mpll->reference_div = 0;
1215 
1216 		mpll->pll_out_min =
1217 		    le16_to_cpu(firmware_info->info.usMinMemoryClockPLL_Output);
1218 		mpll->pll_out_max =
1219 		    le32_to_cpu(firmware_info->info.ulMaxMemoryClockPLL_Output);
1220 
1221 		/* ??? */
1222 		if (mpll->pll_out_min == 0) {
1223 			if (ASIC_IS_AVIVO(rdev))
1224 				mpll->pll_out_min = 64800;
1225 			else
1226 				mpll->pll_out_min = 20000;
1227 		}
1228 
1229 		mpll->pll_in_min =
1230 		    le16_to_cpu(firmware_info->info.usMinMemoryClockPLL_Input);
1231 		mpll->pll_in_max =
1232 		    le16_to_cpu(firmware_info->info.usMaxMemoryClockPLL_Input);
1233 
1234 		rdev->clock.default_sclk =
1235 		    le32_to_cpu(firmware_info->info.ulDefaultEngineClock);
1236 		rdev->clock.default_mclk =
1237 		    le32_to_cpu(firmware_info->info.ulDefaultMemoryClock);
1238 
1239 		if (ASIC_IS_DCE4(rdev)) {
1240 			rdev->clock.default_dispclk =
1241 				le32_to_cpu(firmware_info->info_21.ulDefaultDispEngineClkFreq);
1242 			if (rdev->clock.default_dispclk == 0) {
1243 				if (ASIC_IS_DCE5(rdev))
1244 					rdev->clock.default_dispclk = 54000; /* 540 Mhz */
1245 				else
1246 					rdev->clock.default_dispclk = 60000; /* 600 Mhz */
1247 			}
1248 			rdev->clock.dp_extclk =
1249 				le16_to_cpu(firmware_info->info_21.usUniphyDPModeExtClkFreq);
1250 		}
1251 		*dcpll = *p1pll;
1252 
1253 		rdev->clock.max_pixel_clock = le16_to_cpu(firmware_info->info.usMaxPixelClock);
1254 		if (rdev->clock.max_pixel_clock == 0)
1255 			rdev->clock.max_pixel_clock = 40000;
1256 
1257 		return true;
1258 	}
1259 
1260 	return false;
1261 }
1262 
1263 union igp_info {
1264 	struct _ATOM_INTEGRATED_SYSTEM_INFO info;
1265 	struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2;
1266 	struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 info_6;
1267 	struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_7 info_7;
1268 };
1269 
1270 bool radeon_atombios_sideport_present(struct radeon_device *rdev)
1271 {
1272 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1273 	int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo);
1274 	union igp_info *igp_info;
1275 	u8 frev, crev;
1276 	u16 data_offset;
1277 
1278 	/* sideport is AMD only */
1279 	if (rdev->family == CHIP_RS600)
1280 		return false;
1281 
1282 	if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1283 				   &frev, &crev, &data_offset)) {
1284 		igp_info = (union igp_info *)(mode_info->atom_context->bios +
1285 				      data_offset);
1286 		switch (crev) {
1287 		case 1:
1288 			if (le32_to_cpu(igp_info->info.ulBootUpMemoryClock))
1289 				return true;
1290 			break;
1291 		case 2:
1292 			if (le32_to_cpu(igp_info->info_2.ulBootUpSidePortClock))
1293 				return true;
1294 			break;
1295 		default:
1296 			DRM_ERROR("Unsupported IGP table: %d %d\n", frev, crev);
1297 			break;
1298 		}
1299 	}
1300 	return false;
1301 }
1302 
1303 bool radeon_atombios_get_tmds_info(struct radeon_encoder *encoder,
1304 				   struct radeon_encoder_int_tmds *tmds)
1305 {
1306 	struct drm_device *dev = encoder->base.dev;
1307 	struct radeon_device *rdev = dev->dev_private;
1308 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1309 	int index = GetIndexIntoMasterTable(DATA, TMDS_Info);
1310 	uint16_t data_offset;
1311 	struct _ATOM_TMDS_INFO *tmds_info;
1312 	uint8_t frev, crev;
1313 	uint16_t maxfreq;
1314 	int i;
1315 
1316 	if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1317 				   &frev, &crev, &data_offset)) {
1318 		tmds_info =
1319 			(struct _ATOM_TMDS_INFO *)(mode_info->atom_context->bios +
1320 						   data_offset);
1321 
1322 		maxfreq = le16_to_cpu(tmds_info->usMaxFrequency);
1323 		for (i = 0; i < 4; i++) {
1324 			tmds->tmds_pll[i].freq =
1325 			    le16_to_cpu(tmds_info->asMiscInfo[i].usFrequency);
1326 			tmds->tmds_pll[i].value =
1327 			    tmds_info->asMiscInfo[i].ucPLL_ChargePump & 0x3f;
1328 			tmds->tmds_pll[i].value |=
1329 			    (tmds_info->asMiscInfo[i].
1330 			     ucPLL_VCO_Gain & 0x3f) << 6;
1331 			tmds->tmds_pll[i].value |=
1332 			    (tmds_info->asMiscInfo[i].
1333 			     ucPLL_DutyCycle & 0xf) << 12;
1334 			tmds->tmds_pll[i].value |=
1335 			    (tmds_info->asMiscInfo[i].
1336 			     ucPLL_VoltageSwing & 0xf) << 16;
1337 
1338 			DRM_DEBUG_KMS("TMDS PLL From ATOMBIOS %u %x\n",
1339 				  tmds->tmds_pll[i].freq,
1340 				  tmds->tmds_pll[i].value);
1341 
1342 			if (maxfreq == tmds->tmds_pll[i].freq) {
1343 				tmds->tmds_pll[i].freq = 0xffffffff;
1344 				break;
1345 			}
1346 		}
1347 		return true;
1348 	}
1349 	return false;
1350 }
1351 
1352 bool radeon_atombios_get_ppll_ss_info(struct radeon_device *rdev,
1353 				      struct radeon_atom_ss *ss,
1354 				      int id)
1355 {
1356 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1357 	int index = GetIndexIntoMasterTable(DATA, PPLL_SS_Info);
1358 	uint16_t data_offset, size;
1359 	struct _ATOM_SPREAD_SPECTRUM_INFO *ss_info;
1360 	uint8_t frev, crev;
1361 	int i, num_indices;
1362 
1363 	memset(ss, 0, sizeof(struct radeon_atom_ss));
1364 	if (atom_parse_data_header(mode_info->atom_context, index, &size,
1365 				   &frev, &crev, &data_offset)) {
1366 		ss_info =
1367 			(struct _ATOM_SPREAD_SPECTRUM_INFO *)(mode_info->atom_context->bios + data_offset);
1368 
1369 		num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1370 			sizeof(ATOM_SPREAD_SPECTRUM_ASSIGNMENT);
1371 
1372 		for (i = 0; i < num_indices; i++) {
1373 			if (ss_info->asSS_Info[i].ucSS_Id == id) {
1374 				ss->percentage =
1375 					le16_to_cpu(ss_info->asSS_Info[i].usSpreadSpectrumPercentage);
1376 				ss->type = ss_info->asSS_Info[i].ucSpreadSpectrumType;
1377 				ss->step = ss_info->asSS_Info[i].ucSS_Step;
1378 				ss->delay = ss_info->asSS_Info[i].ucSS_Delay;
1379 				ss->range = ss_info->asSS_Info[i].ucSS_Range;
1380 				ss->refdiv = ss_info->asSS_Info[i].ucRecommendedRef_Div;
1381 				return true;
1382 			}
1383 		}
1384 	}
1385 	return false;
1386 }
1387 
1388 static void radeon_atombios_get_igp_ss_overrides(struct radeon_device *rdev,
1389 						 struct radeon_atom_ss *ss,
1390 						 int id)
1391 {
1392 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1393 	int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo);
1394 	u16 data_offset, size;
1395 	union igp_info *igp_info;
1396 	u8 frev, crev;
1397 	u16 percentage = 0, rate = 0;
1398 
1399 	/* get any igp specific overrides */
1400 	if (atom_parse_data_header(mode_info->atom_context, index, &size,
1401 				   &frev, &crev, &data_offset)) {
1402 		igp_info = (union igp_info *)
1403 			(mode_info->atom_context->bios + data_offset);
1404 		switch (crev) {
1405 		case 6:
1406 			switch (id) {
1407 			case ASIC_INTERNAL_SS_ON_TMDS:
1408 				percentage = le16_to_cpu(igp_info->info_6.usDVISSPercentage);
1409 				rate = le16_to_cpu(igp_info->info_6.usDVISSpreadRateIn10Hz);
1410 				break;
1411 			case ASIC_INTERNAL_SS_ON_HDMI:
1412 				percentage = le16_to_cpu(igp_info->info_6.usHDMISSPercentage);
1413 				rate = le16_to_cpu(igp_info->info_6.usHDMISSpreadRateIn10Hz);
1414 				break;
1415 			case ASIC_INTERNAL_SS_ON_LVDS:
1416 				percentage = le16_to_cpu(igp_info->info_6.usLvdsSSPercentage);
1417 				rate = le16_to_cpu(igp_info->info_6.usLvdsSSpreadRateIn10Hz);
1418 				break;
1419 			}
1420 			break;
1421 		case 7:
1422 			switch (id) {
1423 			case ASIC_INTERNAL_SS_ON_TMDS:
1424 				percentage = le16_to_cpu(igp_info->info_7.usDVISSPercentage);
1425 				rate = le16_to_cpu(igp_info->info_7.usDVISSpreadRateIn10Hz);
1426 				break;
1427 			case ASIC_INTERNAL_SS_ON_HDMI:
1428 				percentage = le16_to_cpu(igp_info->info_7.usHDMISSPercentage);
1429 				rate = le16_to_cpu(igp_info->info_7.usHDMISSpreadRateIn10Hz);
1430 				break;
1431 			case ASIC_INTERNAL_SS_ON_LVDS:
1432 				percentage = le16_to_cpu(igp_info->info_7.usLvdsSSPercentage);
1433 				rate = le16_to_cpu(igp_info->info_7.usLvdsSSpreadRateIn10Hz);
1434 				break;
1435 			}
1436 			break;
1437 		default:
1438 			DRM_ERROR("Unsupported IGP table: %d %d\n", frev, crev);
1439 			break;
1440 		}
1441 		if (percentage)
1442 			ss->percentage = percentage;
1443 		if (rate)
1444 			ss->rate = rate;
1445 	}
1446 }
1447 
1448 union asic_ss_info {
1449 	struct _ATOM_ASIC_INTERNAL_SS_INFO info;
1450 	struct _ATOM_ASIC_INTERNAL_SS_INFO_V2 info_2;
1451 	struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 info_3;
1452 };
1453 
1454 bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev,
1455 				      struct radeon_atom_ss *ss,
1456 				      int id, u32 clock)
1457 {
1458 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1459 	int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info);
1460 	uint16_t data_offset, size;
1461 	union asic_ss_info *ss_info;
1462 	uint8_t frev, crev;
1463 	int i, num_indices;
1464 
1465 	memset(ss, 0, sizeof(struct radeon_atom_ss));
1466 	if (atom_parse_data_header(mode_info->atom_context, index, &size,
1467 				   &frev, &crev, &data_offset)) {
1468 
1469 		ss_info =
1470 			(union asic_ss_info *)(mode_info->atom_context->bios + data_offset);
1471 
1472 		switch (frev) {
1473 		case 1:
1474 			num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1475 				sizeof(ATOM_ASIC_SS_ASSIGNMENT);
1476 
1477 			for (i = 0; i < num_indices; i++) {
1478 				if ((ss_info->info.asSpreadSpectrum[i].ucClockIndication == id) &&
1479 				    (clock <= le32_to_cpu(ss_info->info.asSpreadSpectrum[i].ulTargetClockRange))) {
1480 					ss->percentage =
1481 						le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1482 					ss->type = ss_info->info.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1483 					ss->rate = le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadRateInKhz);
1484 					return true;
1485 				}
1486 			}
1487 			break;
1488 		case 2:
1489 			num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1490 				sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2);
1491 			for (i = 0; i < num_indices; i++) {
1492 				if ((ss_info->info_2.asSpreadSpectrum[i].ucClockIndication == id) &&
1493 				    (clock <= le32_to_cpu(ss_info->info_2.asSpreadSpectrum[i].ulTargetClockRange))) {
1494 					ss->percentage =
1495 						le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1496 					ss->type = ss_info->info_2.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1497 					ss->rate = le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadRateIn10Hz);
1498 					return true;
1499 				}
1500 			}
1501 			break;
1502 		case 3:
1503 			num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1504 				sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3);
1505 			for (i = 0; i < num_indices; i++) {
1506 				if ((ss_info->info_3.asSpreadSpectrum[i].ucClockIndication == id) &&
1507 				    (clock <= le32_to_cpu(ss_info->info_3.asSpreadSpectrum[i].ulTargetClockRange))) {
1508 					ss->percentage =
1509 						le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1510 					ss->type = ss_info->info_3.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1511 					ss->rate = le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadRateIn10Hz);
1512 					if (rdev->flags & RADEON_IS_IGP)
1513 						radeon_atombios_get_igp_ss_overrides(rdev, ss, id);
1514 					return true;
1515 				}
1516 			}
1517 			break;
1518 		default:
1519 			DRM_ERROR("Unsupported ASIC_InternalSS_Info table: %d %d\n", frev, crev);
1520 			break;
1521 		}
1522 
1523 	}
1524 	return false;
1525 }
1526 
1527 union lvds_info {
1528 	struct _ATOM_LVDS_INFO info;
1529 	struct _ATOM_LVDS_INFO_V12 info_12;
1530 };
1531 
1532 struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct
1533 							      radeon_encoder
1534 							      *encoder)
1535 {
1536 	struct drm_device *dev = encoder->base.dev;
1537 	struct radeon_device *rdev = dev->dev_private;
1538 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1539 	int index = GetIndexIntoMasterTable(DATA, LVDS_Info);
1540 	uint16_t data_offset, misc;
1541 	union lvds_info *lvds_info;
1542 	uint8_t frev, crev;
1543 	struct radeon_encoder_atom_dig *lvds = NULL;
1544 	int encoder_enum = (encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
1545 
1546 	if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1547 				   &frev, &crev, &data_offset)) {
1548 		lvds_info =
1549 			(union lvds_info *)(mode_info->atom_context->bios + data_offset);
1550 		lvds =
1551 		    kzalloc(sizeof(struct radeon_encoder_atom_dig), GFP_KERNEL);
1552 
1553 		if (!lvds)
1554 			return NULL;
1555 
1556 		lvds->native_mode.clock =
1557 		    le16_to_cpu(lvds_info->info.sLCDTiming.usPixClk) * 10;
1558 		lvds->native_mode.hdisplay =
1559 		    le16_to_cpu(lvds_info->info.sLCDTiming.usHActive);
1560 		lvds->native_mode.vdisplay =
1561 		    le16_to_cpu(lvds_info->info.sLCDTiming.usVActive);
1562 		lvds->native_mode.htotal = lvds->native_mode.hdisplay +
1563 			le16_to_cpu(lvds_info->info.sLCDTiming.usHBlanking_Time);
1564 		lvds->native_mode.hsync_start = lvds->native_mode.hdisplay +
1565 			le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncOffset);
1566 		lvds->native_mode.hsync_end = lvds->native_mode.hsync_start +
1567 			le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncWidth);
1568 		lvds->native_mode.vtotal = lvds->native_mode.vdisplay +
1569 			le16_to_cpu(lvds_info->info.sLCDTiming.usVBlanking_Time);
1570 		lvds->native_mode.vsync_start = lvds->native_mode.vdisplay +
1571 			le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncOffset);
1572 		lvds->native_mode.vsync_end = lvds->native_mode.vsync_start +
1573 			le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncWidth);
1574 		lvds->panel_pwr_delay =
1575 		    le16_to_cpu(lvds_info->info.usOffDelayInMs);
1576 		lvds->lcd_misc = lvds_info->info.ucLVDS_Misc;
1577 
1578 		misc = le16_to_cpu(lvds_info->info.sLCDTiming.susModeMiscInfo.usAccess);
1579 		if (misc & ATOM_VSYNC_POLARITY)
1580 			lvds->native_mode.flags |= DRM_MODE_FLAG_NVSYNC;
1581 		if (misc & ATOM_HSYNC_POLARITY)
1582 			lvds->native_mode.flags |= DRM_MODE_FLAG_NHSYNC;
1583 		if (misc & ATOM_COMPOSITESYNC)
1584 			lvds->native_mode.flags |= DRM_MODE_FLAG_CSYNC;
1585 		if (misc & ATOM_INTERLACE)
1586 			lvds->native_mode.flags |= DRM_MODE_FLAG_INTERLACE;
1587 		if (misc & ATOM_DOUBLE_CLOCK_MODE)
1588 			lvds->native_mode.flags |= DRM_MODE_FLAG_DBLSCAN;
1589 
1590 		lvds->native_mode.width_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageHSize);
1591 		lvds->native_mode.height_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageVSize);
1592 
1593 		/* set crtc values */
1594 		drm_mode_set_crtcinfo(&lvds->native_mode, CRTC_INTERLACE_HALVE_V);
1595 
1596 		lvds->lcd_ss_id = lvds_info->info.ucSS_Id;
1597 
1598 		encoder->native_mode = lvds->native_mode;
1599 
1600 		if (encoder_enum == 2)
1601 			lvds->linkb = true;
1602 		else
1603 			lvds->linkb = false;
1604 
1605 		/* parse the lcd record table */
1606 		if (le16_to_cpu(lvds_info->info.usModePatchTableOffset)) {
1607 			ATOM_FAKE_EDID_PATCH_RECORD *fake_edid_record;
1608 			ATOM_PANEL_RESOLUTION_PATCH_RECORD *panel_res_record;
1609 			bool bad_record = false;
1610 			u8 *record;
1611 
1612 			if ((frev == 1) && (crev < 2))
1613 				/* absolute */
1614 				record = (u8 *)(mode_info->atom_context->bios +
1615 						le16_to_cpu(lvds_info->info.usModePatchTableOffset));
1616 			else
1617 				/* relative */
1618 				record = (u8 *)(mode_info->atom_context->bios +
1619 						data_offset +
1620 						le16_to_cpu(lvds_info->info.usModePatchTableOffset));
1621 			while (*record != ATOM_RECORD_END_TYPE) {
1622 				switch (*record) {
1623 				case LCD_MODE_PATCH_RECORD_MODE_TYPE:
1624 					record += sizeof(ATOM_PATCH_RECORD_MODE);
1625 					break;
1626 				case LCD_RTS_RECORD_TYPE:
1627 					record += sizeof(ATOM_LCD_RTS_RECORD);
1628 					break;
1629 				case LCD_CAP_RECORD_TYPE:
1630 					record += sizeof(ATOM_LCD_MODE_CONTROL_CAP);
1631 					break;
1632 				case LCD_FAKE_EDID_PATCH_RECORD_TYPE:
1633 					fake_edid_record = (ATOM_FAKE_EDID_PATCH_RECORD *)record;
1634 					if (fake_edid_record->ucFakeEDIDLength) {
1635 						struct edid *edid;
1636 						int edid_size =
1637 							max((int)EDID_LENGTH, (int)fake_edid_record->ucFakeEDIDLength);
1638 						edid = kmalloc(edid_size, GFP_KERNEL);
1639 						if (edid) {
1640 							memcpy((u8 *)edid, (u8 *)&fake_edid_record->ucFakeEDIDString[0],
1641 							       fake_edid_record->ucFakeEDIDLength);
1642 
1643 							if (drm_edid_is_valid(edid)) {
1644 								rdev->mode_info.bios_hardcoded_edid = edid;
1645 								rdev->mode_info.bios_hardcoded_edid_size = edid_size;
1646 							} else
1647 								kfree(edid);
1648 						}
1649 					}
1650 					record += sizeof(ATOM_FAKE_EDID_PATCH_RECORD);
1651 					break;
1652 				case LCD_PANEL_RESOLUTION_RECORD_TYPE:
1653 					panel_res_record = (ATOM_PANEL_RESOLUTION_PATCH_RECORD *)record;
1654 					lvds->native_mode.width_mm = panel_res_record->usHSize;
1655 					lvds->native_mode.height_mm = panel_res_record->usVSize;
1656 					record += sizeof(ATOM_PANEL_RESOLUTION_PATCH_RECORD);
1657 					break;
1658 				default:
1659 					DRM_ERROR("Bad LCD record %d\n", *record);
1660 					bad_record = true;
1661 					break;
1662 				}
1663 				if (bad_record)
1664 					break;
1665 			}
1666 		}
1667 	}
1668 	return lvds;
1669 }
1670 
1671 struct radeon_encoder_primary_dac *
1672 radeon_atombios_get_primary_dac_info(struct radeon_encoder *encoder)
1673 {
1674 	struct drm_device *dev = encoder->base.dev;
1675 	struct radeon_device *rdev = dev->dev_private;
1676 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1677 	int index = GetIndexIntoMasterTable(DATA, CompassionateData);
1678 	uint16_t data_offset;
1679 	struct _COMPASSIONATE_DATA *dac_info;
1680 	uint8_t frev, crev;
1681 	uint8_t bg, dac;
1682 	struct radeon_encoder_primary_dac *p_dac = NULL;
1683 
1684 	if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1685 				   &frev, &crev, &data_offset)) {
1686 		dac_info = (struct _COMPASSIONATE_DATA *)
1687 			(mode_info->atom_context->bios + data_offset);
1688 
1689 		p_dac = kzalloc(sizeof(struct radeon_encoder_primary_dac), GFP_KERNEL);
1690 
1691 		if (!p_dac)
1692 			return NULL;
1693 
1694 		bg = dac_info->ucDAC1_BG_Adjustment;
1695 		dac = dac_info->ucDAC1_DAC_Adjustment;
1696 		p_dac->ps2_pdac_adj = (bg << 8) | (dac);
1697 
1698 	}
1699 	return p_dac;
1700 }
1701 
1702 bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index,
1703 				struct drm_display_mode *mode)
1704 {
1705 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1706 	ATOM_ANALOG_TV_INFO *tv_info;
1707 	ATOM_ANALOG_TV_INFO_V1_2 *tv_info_v1_2;
1708 	ATOM_DTD_FORMAT *dtd_timings;
1709 	int data_index = GetIndexIntoMasterTable(DATA, AnalogTV_Info);
1710 	u8 frev, crev;
1711 	u16 data_offset, misc;
1712 
1713 	if (!atom_parse_data_header(mode_info->atom_context, data_index, NULL,
1714 				    &frev, &crev, &data_offset))
1715 		return false;
1716 
1717 	switch (crev) {
1718 	case 1:
1719 		tv_info = (ATOM_ANALOG_TV_INFO *)(mode_info->atom_context->bios + data_offset);
1720 		if (index >= MAX_SUPPORTED_TV_TIMING)
1721 			return false;
1722 
1723 		mode->crtc_htotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Total);
1724 		mode->crtc_hdisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Disp);
1725 		mode->crtc_hsync_start = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart);
1726 		mode->crtc_hsync_end = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart) +
1727 			le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncWidth);
1728 
1729 		mode->crtc_vtotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Total);
1730 		mode->crtc_vdisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Disp);
1731 		mode->crtc_vsync_start = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart);
1732 		mode->crtc_vsync_end = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart) +
1733 			le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncWidth);
1734 
1735 		mode->flags = 0;
1736 		misc = le16_to_cpu(tv_info->aModeTimings[index].susModeMiscInfo.usAccess);
1737 		if (misc & ATOM_VSYNC_POLARITY)
1738 			mode->flags |= DRM_MODE_FLAG_NVSYNC;
1739 		if (misc & ATOM_HSYNC_POLARITY)
1740 			mode->flags |= DRM_MODE_FLAG_NHSYNC;
1741 		if (misc & ATOM_COMPOSITESYNC)
1742 			mode->flags |= DRM_MODE_FLAG_CSYNC;
1743 		if (misc & ATOM_INTERLACE)
1744 			mode->flags |= DRM_MODE_FLAG_INTERLACE;
1745 		if (misc & ATOM_DOUBLE_CLOCK_MODE)
1746 			mode->flags |= DRM_MODE_FLAG_DBLSCAN;
1747 
1748 		mode->clock = le16_to_cpu(tv_info->aModeTimings[index].usPixelClock) * 10;
1749 
1750 		if (index == 1) {
1751 			/* PAL timings appear to have wrong values for totals */
1752 			mode->crtc_htotal -= 1;
1753 			mode->crtc_vtotal -= 1;
1754 		}
1755 		break;
1756 	case 2:
1757 		tv_info_v1_2 = (ATOM_ANALOG_TV_INFO_V1_2 *)(mode_info->atom_context->bios + data_offset);
1758 		if (index >= MAX_SUPPORTED_TV_TIMING_V1_2)
1759 			return false;
1760 
1761 		dtd_timings = &tv_info_v1_2->aModeTimings[index];
1762 		mode->crtc_htotal = le16_to_cpu(dtd_timings->usHActive) +
1763 			le16_to_cpu(dtd_timings->usHBlanking_Time);
1764 		mode->crtc_hdisplay = le16_to_cpu(dtd_timings->usHActive);
1765 		mode->crtc_hsync_start = le16_to_cpu(dtd_timings->usHActive) +
1766 			le16_to_cpu(dtd_timings->usHSyncOffset);
1767 		mode->crtc_hsync_end = mode->crtc_hsync_start +
1768 			le16_to_cpu(dtd_timings->usHSyncWidth);
1769 
1770 		mode->crtc_vtotal = le16_to_cpu(dtd_timings->usVActive) +
1771 			le16_to_cpu(dtd_timings->usVBlanking_Time);
1772 		mode->crtc_vdisplay = le16_to_cpu(dtd_timings->usVActive);
1773 		mode->crtc_vsync_start = le16_to_cpu(dtd_timings->usVActive) +
1774 			le16_to_cpu(dtd_timings->usVSyncOffset);
1775 		mode->crtc_vsync_end = mode->crtc_vsync_start +
1776 			le16_to_cpu(dtd_timings->usVSyncWidth);
1777 
1778 		mode->flags = 0;
1779 		misc = le16_to_cpu(dtd_timings->susModeMiscInfo.usAccess);
1780 		if (misc & ATOM_VSYNC_POLARITY)
1781 			mode->flags |= DRM_MODE_FLAG_NVSYNC;
1782 		if (misc & ATOM_HSYNC_POLARITY)
1783 			mode->flags |= DRM_MODE_FLAG_NHSYNC;
1784 		if (misc & ATOM_COMPOSITESYNC)
1785 			mode->flags |= DRM_MODE_FLAG_CSYNC;
1786 		if (misc & ATOM_INTERLACE)
1787 			mode->flags |= DRM_MODE_FLAG_INTERLACE;
1788 		if (misc & ATOM_DOUBLE_CLOCK_MODE)
1789 			mode->flags |= DRM_MODE_FLAG_DBLSCAN;
1790 
1791 		mode->clock = le16_to_cpu(dtd_timings->usPixClk) * 10;
1792 		break;
1793 	}
1794 	return true;
1795 }
1796 
1797 enum radeon_tv_std
1798 radeon_atombios_get_tv_info(struct radeon_device *rdev)
1799 {
1800 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1801 	int index = GetIndexIntoMasterTable(DATA, AnalogTV_Info);
1802 	uint16_t data_offset;
1803 	uint8_t frev, crev;
1804 	struct _ATOM_ANALOG_TV_INFO *tv_info;
1805 	enum radeon_tv_std tv_std = TV_STD_NTSC;
1806 
1807 	if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1808 				   &frev, &crev, &data_offset)) {
1809 
1810 		tv_info = (struct _ATOM_ANALOG_TV_INFO *)
1811 			(mode_info->atom_context->bios + data_offset);
1812 
1813 		switch (tv_info->ucTV_BootUpDefaultStandard) {
1814 		case ATOM_TV_NTSC:
1815 			tv_std = TV_STD_NTSC;
1816 			DRM_DEBUG_KMS("Default TV standard: NTSC\n");
1817 			break;
1818 		case ATOM_TV_NTSCJ:
1819 			tv_std = TV_STD_NTSC_J;
1820 			DRM_DEBUG_KMS("Default TV standard: NTSC-J\n");
1821 			break;
1822 		case ATOM_TV_PAL:
1823 			tv_std = TV_STD_PAL;
1824 			DRM_DEBUG_KMS("Default TV standard: PAL\n");
1825 			break;
1826 		case ATOM_TV_PALM:
1827 			tv_std = TV_STD_PAL_M;
1828 			DRM_DEBUG_KMS("Default TV standard: PAL-M\n");
1829 			break;
1830 		case ATOM_TV_PALN:
1831 			tv_std = TV_STD_PAL_N;
1832 			DRM_DEBUG_KMS("Default TV standard: PAL-N\n");
1833 			break;
1834 		case ATOM_TV_PALCN:
1835 			tv_std = TV_STD_PAL_CN;
1836 			DRM_DEBUG_KMS("Default TV standard: PAL-CN\n");
1837 			break;
1838 		case ATOM_TV_PAL60:
1839 			tv_std = TV_STD_PAL_60;
1840 			DRM_DEBUG_KMS("Default TV standard: PAL-60\n");
1841 			break;
1842 		case ATOM_TV_SECAM:
1843 			tv_std = TV_STD_SECAM;
1844 			DRM_DEBUG_KMS("Default TV standard: SECAM\n");
1845 			break;
1846 		default:
1847 			tv_std = TV_STD_NTSC;
1848 			DRM_DEBUG_KMS("Unknown TV standard; defaulting to NTSC\n");
1849 			break;
1850 		}
1851 	}
1852 	return tv_std;
1853 }
1854 
1855 struct radeon_encoder_tv_dac *
1856 radeon_atombios_get_tv_dac_info(struct radeon_encoder *encoder)
1857 {
1858 	struct drm_device *dev = encoder->base.dev;
1859 	struct radeon_device *rdev = dev->dev_private;
1860 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1861 	int index = GetIndexIntoMasterTable(DATA, CompassionateData);
1862 	uint16_t data_offset;
1863 	struct _COMPASSIONATE_DATA *dac_info;
1864 	uint8_t frev, crev;
1865 	uint8_t bg, dac;
1866 	struct radeon_encoder_tv_dac *tv_dac = NULL;
1867 
1868 	if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1869 				   &frev, &crev, &data_offset)) {
1870 
1871 		dac_info = (struct _COMPASSIONATE_DATA *)
1872 			(mode_info->atom_context->bios + data_offset);
1873 
1874 		tv_dac = kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL);
1875 
1876 		if (!tv_dac)
1877 			return NULL;
1878 
1879 		bg = dac_info->ucDAC2_CRT2_BG_Adjustment;
1880 		dac = dac_info->ucDAC2_CRT2_DAC_Adjustment;
1881 		tv_dac->ps2_tvdac_adj = (bg << 16) | (dac << 20);
1882 
1883 		bg = dac_info->ucDAC2_PAL_BG_Adjustment;
1884 		dac = dac_info->ucDAC2_PAL_DAC_Adjustment;
1885 		tv_dac->pal_tvdac_adj = (bg << 16) | (dac << 20);
1886 
1887 		bg = dac_info->ucDAC2_NTSC_BG_Adjustment;
1888 		dac = dac_info->ucDAC2_NTSC_DAC_Adjustment;
1889 		tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20);
1890 
1891 		tv_dac->tv_std = radeon_atombios_get_tv_info(rdev);
1892 	}
1893 	return tv_dac;
1894 }
1895 
1896 static const char *thermal_controller_names[] = {
1897 	"NONE",
1898 	"lm63",
1899 	"adm1032",
1900 	"adm1030",
1901 	"max6649",
1902 	"lm64",
1903 	"f75375",
1904 	"asc7xxx",
1905 };
1906 
1907 static const char *pp_lib_thermal_controller_names[] = {
1908 	"NONE",
1909 	"lm63",
1910 	"adm1032",
1911 	"adm1030",
1912 	"max6649",
1913 	"lm64",
1914 	"f75375",
1915 	"RV6xx",
1916 	"RV770",
1917 	"adt7473",
1918 	"NONE",
1919 	"External GPIO",
1920 	"Evergreen",
1921 	"emc2103",
1922 	"Sumo",
1923 	"Northern Islands",
1924 	"Southern Islands",
1925 	"lm96163",
1926 };
1927 
1928 union power_info {
1929 	struct _ATOM_POWERPLAY_INFO info;
1930 	struct _ATOM_POWERPLAY_INFO_V2 info_2;
1931 	struct _ATOM_POWERPLAY_INFO_V3 info_3;
1932 	struct _ATOM_PPLIB_POWERPLAYTABLE pplib;
1933 	struct _ATOM_PPLIB_POWERPLAYTABLE2 pplib2;
1934 	struct _ATOM_PPLIB_POWERPLAYTABLE3 pplib3;
1935 };
1936 
1937 union pplib_clock_info {
1938 	struct _ATOM_PPLIB_R600_CLOCK_INFO r600;
1939 	struct _ATOM_PPLIB_RS780_CLOCK_INFO rs780;
1940 	struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO evergreen;
1941 	struct _ATOM_PPLIB_SUMO_CLOCK_INFO sumo;
1942 	struct _ATOM_PPLIB_SI_CLOCK_INFO si;
1943 };
1944 
1945 union pplib_power_state {
1946 	struct _ATOM_PPLIB_STATE v1;
1947 	struct _ATOM_PPLIB_STATE_V2 v2;
1948 };
1949 
1950 static void radeon_atombios_parse_misc_flags_1_3(struct radeon_device *rdev,
1951 						 int state_index,
1952 						 u32 misc, u32 misc2)
1953 {
1954 	rdev->pm.power_state[state_index].misc = misc;
1955 	rdev->pm.power_state[state_index].misc2 = misc2;
1956 	/* order matters! */
1957 	if (misc & ATOM_PM_MISCINFO_POWER_SAVING_MODE)
1958 		rdev->pm.power_state[state_index].type =
1959 			POWER_STATE_TYPE_POWERSAVE;
1960 	if (misc & ATOM_PM_MISCINFO_DEFAULT_DC_STATE_ENTRY_TRUE)
1961 		rdev->pm.power_state[state_index].type =
1962 			POWER_STATE_TYPE_BATTERY;
1963 	if (misc & ATOM_PM_MISCINFO_DEFAULT_LOW_DC_STATE_ENTRY_TRUE)
1964 		rdev->pm.power_state[state_index].type =
1965 			POWER_STATE_TYPE_BATTERY;
1966 	if (misc & ATOM_PM_MISCINFO_LOAD_BALANCE_EN)
1967 		rdev->pm.power_state[state_index].type =
1968 			POWER_STATE_TYPE_BALANCED;
1969 	if (misc & ATOM_PM_MISCINFO_3D_ACCELERATION_EN) {
1970 		rdev->pm.power_state[state_index].type =
1971 			POWER_STATE_TYPE_PERFORMANCE;
1972 		rdev->pm.power_state[state_index].flags &=
1973 			~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
1974 	}
1975 	if (misc2 & ATOM_PM_MISCINFO2_SYSTEM_AC_LITE_MODE)
1976 		rdev->pm.power_state[state_index].type =
1977 			POWER_STATE_TYPE_BALANCED;
1978 	if (misc & ATOM_PM_MISCINFO_DRIVER_DEFAULT_MODE) {
1979 		rdev->pm.power_state[state_index].type =
1980 			POWER_STATE_TYPE_DEFAULT;
1981 		rdev->pm.default_power_state_index = state_index;
1982 		rdev->pm.power_state[state_index].default_clock_mode =
1983 			&rdev->pm.power_state[state_index].clock_info[0];
1984 	} else if (state_index == 0) {
1985 		rdev->pm.power_state[state_index].clock_info[0].flags |=
1986 			RADEON_PM_MODE_NO_DISPLAY;
1987 	}
1988 }
1989 
1990 static int radeon_atombios_parse_power_table_1_3(struct radeon_device *rdev)
1991 {
1992 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1993 	u32 misc, misc2 = 0;
1994 	int num_modes = 0, i;
1995 	int state_index = 0;
1996 	struct radeon_i2c_bus_rec i2c_bus;
1997 	union power_info *power_info;
1998 	int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
1999         u16 data_offset;
2000 	u8 frev, crev;
2001 
2002 	if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2003 				   &frev, &crev, &data_offset))
2004 		return state_index;
2005 	power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2006 
2007 	/* add the i2c bus for thermal/fan chip */
2008 	if (power_info->info.ucOverdriveThermalController > 0) {
2009 		DRM_INFO("Possible %s thermal controller at 0x%02x\n",
2010 			 thermal_controller_names[power_info->info.ucOverdriveThermalController],
2011 			 power_info->info.ucOverdriveControllerAddress >> 1);
2012 		i2c_bus = radeon_lookup_i2c_gpio(rdev, power_info->info.ucOverdriveI2cLine);
2013 		rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
2014 		if (rdev->pm.i2c_bus) {
2015 			struct i2c_board_info info = { };
2016 			const char *name = thermal_controller_names[power_info->info.
2017 								    ucOverdriveThermalController];
2018 			info.addr = power_info->info.ucOverdriveControllerAddress >> 1;
2019 			strlcpy(info.type, name, sizeof(info.type));
2020 			i2c_new_device(&rdev->pm.i2c_bus->adapter, &info);
2021 		}
2022 	}
2023 	num_modes = power_info->info.ucNumOfPowerModeEntries;
2024 	if (num_modes > ATOM_MAX_NUMBEROF_POWER_BLOCK)
2025 		num_modes = ATOM_MAX_NUMBEROF_POWER_BLOCK;
2026 	rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) * num_modes, GFP_KERNEL);
2027 	if (!rdev->pm.power_state)
2028 		return state_index;
2029 	/* last mode is usually default, array is low to high */
2030 	for (i = 0; i < num_modes; i++) {
2031 		rdev->pm.power_state[state_index].clock_info =
2032 			kzalloc(sizeof(struct radeon_pm_clock_info) * 1, GFP_KERNEL);
2033 		if (!rdev->pm.power_state[state_index].clock_info)
2034 			return state_index;
2035 		rdev->pm.power_state[state_index].num_clock_modes = 1;
2036 		rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
2037 		switch (frev) {
2038 		case 1:
2039 			rdev->pm.power_state[state_index].clock_info[0].mclk =
2040 				le16_to_cpu(power_info->info.asPowerPlayInfo[i].usMemoryClock);
2041 			rdev->pm.power_state[state_index].clock_info[0].sclk =
2042 				le16_to_cpu(power_info->info.asPowerPlayInfo[i].usEngineClock);
2043 			/* skip invalid modes */
2044 			if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2045 			    (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2046 				continue;
2047 			rdev->pm.power_state[state_index].pcie_lanes =
2048 				power_info->info.asPowerPlayInfo[i].ucNumPciELanes;
2049 			misc = le32_to_cpu(power_info->info.asPowerPlayInfo[i].ulMiscInfo);
2050 			if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2051 			    (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2052 				rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2053 					VOLTAGE_GPIO;
2054 				rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2055 					radeon_lookup_gpio(rdev,
2056 							   power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex);
2057 				if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2058 					rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2059 						true;
2060 				else
2061 					rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2062 						false;
2063 			} else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2064 				rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2065 					VOLTAGE_VDDC;
2066 				rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2067 					power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex;
2068 			}
2069 			rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2070 			radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, 0);
2071 			state_index++;
2072 			break;
2073 		case 2:
2074 			rdev->pm.power_state[state_index].clock_info[0].mclk =
2075 				le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMemoryClock);
2076 			rdev->pm.power_state[state_index].clock_info[0].sclk =
2077 				le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulEngineClock);
2078 			/* skip invalid modes */
2079 			if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2080 			    (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2081 				continue;
2082 			rdev->pm.power_state[state_index].pcie_lanes =
2083 				power_info->info_2.asPowerPlayInfo[i].ucNumPciELanes;
2084 			misc = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo);
2085 			misc2 = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo2);
2086 			if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2087 			    (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2088 				rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2089 					VOLTAGE_GPIO;
2090 				rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2091 					radeon_lookup_gpio(rdev,
2092 							   power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex);
2093 				if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2094 					rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2095 						true;
2096 				else
2097 					rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2098 						false;
2099 			} else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2100 				rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2101 					VOLTAGE_VDDC;
2102 				rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2103 					power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex;
2104 			}
2105 			rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2106 			radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, misc2);
2107 			state_index++;
2108 			break;
2109 		case 3:
2110 			rdev->pm.power_state[state_index].clock_info[0].mclk =
2111 				le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMemoryClock);
2112 			rdev->pm.power_state[state_index].clock_info[0].sclk =
2113 				le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulEngineClock);
2114 			/* skip invalid modes */
2115 			if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2116 			    (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2117 				continue;
2118 			rdev->pm.power_state[state_index].pcie_lanes =
2119 				power_info->info_3.asPowerPlayInfo[i].ucNumPciELanes;
2120 			misc = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo);
2121 			misc2 = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo2);
2122 			if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2123 			    (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2124 				rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2125 					VOLTAGE_GPIO;
2126 				rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2127 					radeon_lookup_gpio(rdev,
2128 							   power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex);
2129 				if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2130 					rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2131 						true;
2132 				else
2133 					rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2134 						false;
2135 			} else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2136 				rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2137 					VOLTAGE_VDDC;
2138 				rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2139 					power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex;
2140 				if (misc2 & ATOM_PM_MISCINFO2_VDDCI_DYNAMIC_VOLTAGE_EN) {
2141 					rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_enabled =
2142 						true;
2143 					rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_id =
2144 						power_info->info_3.asPowerPlayInfo[i].ucVDDCI_VoltageDropIndex;
2145 				}
2146 			}
2147 			rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2148 			radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, misc2);
2149 			state_index++;
2150 			break;
2151 		}
2152 	}
2153 	/* last mode is usually default */
2154 	if (rdev->pm.default_power_state_index == -1) {
2155 		rdev->pm.power_state[state_index - 1].type =
2156 			POWER_STATE_TYPE_DEFAULT;
2157 		rdev->pm.default_power_state_index = state_index - 1;
2158 		rdev->pm.power_state[state_index - 1].default_clock_mode =
2159 			&rdev->pm.power_state[state_index - 1].clock_info[0];
2160 		rdev->pm.power_state[state_index].flags &=
2161 			~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2162 		rdev->pm.power_state[state_index].misc = 0;
2163 		rdev->pm.power_state[state_index].misc2 = 0;
2164 	}
2165 	return state_index;
2166 }
2167 
2168 static void radeon_atombios_add_pplib_thermal_controller(struct radeon_device *rdev,
2169 							 ATOM_PPLIB_THERMALCONTROLLER *controller)
2170 {
2171 	struct radeon_i2c_bus_rec i2c_bus;
2172 
2173 	/* add the i2c bus for thermal/fan chip */
2174 	if (controller->ucType > 0) {
2175 		if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV6xx) {
2176 			DRM_INFO("Internal thermal controller %s fan control\n",
2177 				 (controller->ucFanParameters &
2178 				  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2179 			rdev->pm.int_thermal_type = THERMAL_TYPE_RV6XX;
2180 		} else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV770) {
2181 			DRM_INFO("Internal thermal controller %s fan control\n",
2182 				 (controller->ucFanParameters &
2183 				  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2184 			rdev->pm.int_thermal_type = THERMAL_TYPE_RV770;
2185 		} else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_EVERGREEN) {
2186 			DRM_INFO("Internal thermal controller %s fan control\n",
2187 				 (controller->ucFanParameters &
2188 				  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2189 			rdev->pm.int_thermal_type = THERMAL_TYPE_EVERGREEN;
2190 		} else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_SUMO) {
2191 			DRM_INFO("Internal thermal controller %s fan control\n",
2192 				 (controller->ucFanParameters &
2193 				  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2194 			rdev->pm.int_thermal_type = THERMAL_TYPE_SUMO;
2195 		} else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_NISLANDS) {
2196 			DRM_INFO("Internal thermal controller %s fan control\n",
2197 				 (controller->ucFanParameters &
2198 				  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2199 			rdev->pm.int_thermal_type = THERMAL_TYPE_NI;
2200 		} else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_SISLANDS) {
2201 			DRM_INFO("Internal thermal controller %s fan control\n",
2202 				 (controller->ucFanParameters &
2203 				  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2204 			rdev->pm.int_thermal_type = THERMAL_TYPE_SI;
2205 		} else if ((controller->ucType ==
2206 			    ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO) ||
2207 			   (controller->ucType ==
2208 			    ATOM_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL) ||
2209 			   (controller->ucType ==
2210 			    ATOM_PP_THERMALCONTROLLER_EMC2103_WITH_INTERNAL)) {
2211 			DRM_INFO("Special thermal controller config\n");
2212 		} else {
2213 			DRM_INFO("Possible %s thermal controller at 0x%02x %s fan control\n",
2214 				 pp_lib_thermal_controller_names[controller->ucType],
2215 				 controller->ucI2cAddress >> 1,
2216 				 (controller->ucFanParameters &
2217 				  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2218 			i2c_bus = radeon_lookup_i2c_gpio(rdev, controller->ucI2cLine);
2219 			rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
2220 			if (rdev->pm.i2c_bus) {
2221 				struct i2c_board_info info = { };
2222 				const char *name = pp_lib_thermal_controller_names[controller->ucType];
2223 				info.addr = controller->ucI2cAddress >> 1;
2224 				strlcpy(info.type, name, sizeof(info.type));
2225 				i2c_new_device(&rdev->pm.i2c_bus->adapter, &info);
2226 			}
2227 		}
2228 	}
2229 }
2230 
2231 static void radeon_atombios_get_default_voltages(struct radeon_device *rdev,
2232 						 u16 *vddc, u16 *vddci)
2233 {
2234 	struct radeon_mode_info *mode_info = &rdev->mode_info;
2235 	int index = GetIndexIntoMasterTable(DATA, FirmwareInfo);
2236 	u8 frev, crev;
2237 	u16 data_offset;
2238 	union firmware_info *firmware_info;
2239 
2240 	*vddc = 0;
2241 	*vddci = 0;
2242 
2243 	if (atom_parse_data_header(mode_info->atom_context, index, NULL,
2244 				   &frev, &crev, &data_offset)) {
2245 		firmware_info =
2246 			(union firmware_info *)(mode_info->atom_context->bios +
2247 						data_offset);
2248 		*vddc = le16_to_cpu(firmware_info->info_14.usBootUpVDDCVoltage);
2249 		if ((frev == 2) && (crev >= 2))
2250 			*vddci = le16_to_cpu(firmware_info->info_22.usBootUpVDDCIVoltage);
2251 	}
2252 }
2253 
2254 static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rdev,
2255 						       int state_index, int mode_index,
2256 						       struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info)
2257 {
2258 	int j;
2259 	u32 misc = le32_to_cpu(non_clock_info->ulCapsAndSettings);
2260 	u32 misc2 = le16_to_cpu(non_clock_info->usClassification);
2261 	u16 vddc, vddci;
2262 
2263 	radeon_atombios_get_default_voltages(rdev, &vddc, &vddci);
2264 
2265 	rdev->pm.power_state[state_index].misc = misc;
2266 	rdev->pm.power_state[state_index].misc2 = misc2;
2267 	rdev->pm.power_state[state_index].pcie_lanes =
2268 		((misc & ATOM_PPLIB_PCIE_LINK_WIDTH_MASK) >>
2269 		 ATOM_PPLIB_PCIE_LINK_WIDTH_SHIFT) + 1;
2270 	switch (misc2 & ATOM_PPLIB_CLASSIFICATION_UI_MASK) {
2271 	case ATOM_PPLIB_CLASSIFICATION_UI_BATTERY:
2272 		rdev->pm.power_state[state_index].type =
2273 			POWER_STATE_TYPE_BATTERY;
2274 		break;
2275 	case ATOM_PPLIB_CLASSIFICATION_UI_BALANCED:
2276 		rdev->pm.power_state[state_index].type =
2277 			POWER_STATE_TYPE_BALANCED;
2278 		break;
2279 	case ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE:
2280 		rdev->pm.power_state[state_index].type =
2281 			POWER_STATE_TYPE_PERFORMANCE;
2282 		break;
2283 	case ATOM_PPLIB_CLASSIFICATION_UI_NONE:
2284 		if (misc2 & ATOM_PPLIB_CLASSIFICATION_3DPERFORMANCE)
2285 			rdev->pm.power_state[state_index].type =
2286 				POWER_STATE_TYPE_PERFORMANCE;
2287 		break;
2288 	}
2289 	rdev->pm.power_state[state_index].flags = 0;
2290 	if (misc & ATOM_PPLIB_SINGLE_DISPLAY_ONLY)
2291 		rdev->pm.power_state[state_index].flags |=
2292 			RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2293 	if (misc2 & ATOM_PPLIB_CLASSIFICATION_BOOT) {
2294 		rdev->pm.power_state[state_index].type =
2295 			POWER_STATE_TYPE_DEFAULT;
2296 		rdev->pm.default_power_state_index = state_index;
2297 		rdev->pm.power_state[state_index].default_clock_mode =
2298 			&rdev->pm.power_state[state_index].clock_info[mode_index - 1];
2299 		if (ASIC_IS_DCE5(rdev) && !(rdev->flags & RADEON_IS_IGP)) {
2300 			/* NI chips post without MC ucode, so default clocks are strobe mode only */
2301 			rdev->pm.default_sclk = rdev->pm.power_state[state_index].clock_info[0].sclk;
2302 			rdev->pm.default_mclk = rdev->pm.power_state[state_index].clock_info[0].mclk;
2303 			rdev->pm.default_vddc = rdev->pm.power_state[state_index].clock_info[0].voltage.voltage;
2304 			rdev->pm.default_vddci = rdev->pm.power_state[state_index].clock_info[0].voltage.vddci;
2305 		} else {
2306 			/* patch the table values with the default slck/mclk from firmware info */
2307 			for (j = 0; j < mode_index; j++) {
2308 				rdev->pm.power_state[state_index].clock_info[j].mclk =
2309 					rdev->clock.default_mclk;
2310 				rdev->pm.power_state[state_index].clock_info[j].sclk =
2311 					rdev->clock.default_sclk;
2312 				if (vddc)
2313 					rdev->pm.power_state[state_index].clock_info[j].voltage.voltage =
2314 						vddc;
2315 			}
2316 		}
2317 	}
2318 }
2319 
2320 static bool radeon_atombios_parse_pplib_clock_info(struct radeon_device *rdev,
2321 						   int state_index, int mode_index,
2322 						   union pplib_clock_info *clock_info)
2323 {
2324 	u32 sclk, mclk;
2325 	u16 vddc;
2326 
2327 	if (rdev->flags & RADEON_IS_IGP) {
2328 		if (rdev->family >= CHIP_PALM) {
2329 			sclk = le16_to_cpu(clock_info->sumo.usEngineClockLow);
2330 			sclk |= clock_info->sumo.ucEngineClockHigh << 16;
2331 			rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2332 		} else {
2333 			sclk = le16_to_cpu(clock_info->rs780.usLowEngineClockLow);
2334 			sclk |= clock_info->rs780.ucLowEngineClockHigh << 16;
2335 			rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2336 		}
2337 	} else if (ASIC_IS_DCE6(rdev)) {
2338 		sclk = le16_to_cpu(clock_info->si.usEngineClockLow);
2339 		sclk |= clock_info->si.ucEngineClockHigh << 16;
2340 		mclk = le16_to_cpu(clock_info->si.usMemoryClockLow);
2341 		mclk |= clock_info->si.ucMemoryClockHigh << 16;
2342 		rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk;
2343 		rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2344 		rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2345 			VOLTAGE_SW;
2346 		rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
2347 			le16_to_cpu(clock_info->si.usVDDC);
2348 		rdev->pm.power_state[state_index].clock_info[mode_index].voltage.vddci =
2349 			le16_to_cpu(clock_info->si.usVDDCI);
2350 	} else if (ASIC_IS_DCE4(rdev)) {
2351 		sclk = le16_to_cpu(clock_info->evergreen.usEngineClockLow);
2352 		sclk |= clock_info->evergreen.ucEngineClockHigh << 16;
2353 		mclk = le16_to_cpu(clock_info->evergreen.usMemoryClockLow);
2354 		mclk |= clock_info->evergreen.ucMemoryClockHigh << 16;
2355 		rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk;
2356 		rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2357 		rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2358 			VOLTAGE_SW;
2359 		rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
2360 			le16_to_cpu(clock_info->evergreen.usVDDC);
2361 		rdev->pm.power_state[state_index].clock_info[mode_index].voltage.vddci =
2362 			le16_to_cpu(clock_info->evergreen.usVDDCI);
2363 	} else {
2364 		sclk = le16_to_cpu(clock_info->r600.usEngineClockLow);
2365 		sclk |= clock_info->r600.ucEngineClockHigh << 16;
2366 		mclk = le16_to_cpu(clock_info->r600.usMemoryClockLow);
2367 		mclk |= clock_info->r600.ucMemoryClockHigh << 16;
2368 		rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk;
2369 		rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2370 		rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2371 			VOLTAGE_SW;
2372 		rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
2373 			le16_to_cpu(clock_info->r600.usVDDC);
2374 	}
2375 
2376 	/* patch up vddc if necessary */
2377 	switch (rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage) {
2378 	case ATOM_VIRTUAL_VOLTAGE_ID0:
2379 	case ATOM_VIRTUAL_VOLTAGE_ID1:
2380 	case ATOM_VIRTUAL_VOLTAGE_ID2:
2381 	case ATOM_VIRTUAL_VOLTAGE_ID3:
2382 		if (radeon_atom_get_max_vddc(rdev, VOLTAGE_TYPE_VDDC,
2383 					     rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage,
2384 					     &vddc) == 0)
2385 			rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage = vddc;
2386 		break;
2387 	default:
2388 		break;
2389 	}
2390 
2391 	if (rdev->flags & RADEON_IS_IGP) {
2392 		/* skip invalid modes */
2393 		if (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0)
2394 			return false;
2395 	} else {
2396 		/* skip invalid modes */
2397 		if ((rdev->pm.power_state[state_index].clock_info[mode_index].mclk == 0) ||
2398 		    (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0))
2399 			return false;
2400 	}
2401 	return true;
2402 }
2403 
2404 static int radeon_atombios_parse_power_table_4_5(struct radeon_device *rdev)
2405 {
2406 	struct radeon_mode_info *mode_info = &rdev->mode_info;
2407 	struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
2408 	union pplib_power_state *power_state;
2409 	int i, j;
2410 	int state_index = 0, mode_index = 0;
2411 	union pplib_clock_info *clock_info;
2412 	bool valid;
2413 	union power_info *power_info;
2414 	int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2415         u16 data_offset;
2416 	u8 frev, crev;
2417 
2418 	if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2419 				   &frev, &crev, &data_offset))
2420 		return state_index;
2421 	power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2422 
2423 	radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
2424 	rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
2425 				       power_info->pplib.ucNumStates, GFP_KERNEL);
2426 	if (!rdev->pm.power_state)
2427 		return state_index;
2428 	/* first mode is usually default, followed by low to high */
2429 	for (i = 0; i < power_info->pplib.ucNumStates; i++) {
2430 		mode_index = 0;
2431 		power_state = (union pplib_power_state *)
2432 			(mode_info->atom_context->bios + data_offset +
2433 			 le16_to_cpu(power_info->pplib.usStateArrayOffset) +
2434 			 i * power_info->pplib.ucStateEntrySize);
2435 		non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
2436 			(mode_info->atom_context->bios + data_offset +
2437 			 le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset) +
2438 			 (power_state->v1.ucNonClockStateIndex *
2439 			  power_info->pplib.ucNonClockSize));
2440 		rdev->pm.power_state[i].clock_info = kzalloc(sizeof(struct radeon_pm_clock_info) *
2441 							     ((power_info->pplib.ucStateEntrySize - 1) ?
2442 							      (power_info->pplib.ucStateEntrySize - 1) : 1),
2443 							     GFP_KERNEL);
2444 		if (!rdev->pm.power_state[i].clock_info)
2445 			return state_index;
2446 		if (power_info->pplib.ucStateEntrySize - 1) {
2447 			for (j = 0; j < (power_info->pplib.ucStateEntrySize - 1); j++) {
2448 				clock_info = (union pplib_clock_info *)
2449 					(mode_info->atom_context->bios + data_offset +
2450 					 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset) +
2451 					 (power_state->v1.ucClockStateIndices[j] *
2452 					  power_info->pplib.ucClockInfoSize));
2453 				valid = radeon_atombios_parse_pplib_clock_info(rdev,
2454 									       state_index, mode_index,
2455 									       clock_info);
2456 				if (valid)
2457 					mode_index++;
2458 			}
2459 		} else {
2460 			rdev->pm.power_state[state_index].clock_info[0].mclk =
2461 				rdev->clock.default_mclk;
2462 			rdev->pm.power_state[state_index].clock_info[0].sclk =
2463 				rdev->clock.default_sclk;
2464 			mode_index++;
2465 		}
2466 		rdev->pm.power_state[state_index].num_clock_modes = mode_index;
2467 		if (mode_index) {
2468 			radeon_atombios_parse_pplib_non_clock_info(rdev, state_index, mode_index,
2469 								   non_clock_info);
2470 			state_index++;
2471 		}
2472 	}
2473 	/* if multiple clock modes, mark the lowest as no display */
2474 	for (i = 0; i < state_index; i++) {
2475 		if (rdev->pm.power_state[i].num_clock_modes > 1)
2476 			rdev->pm.power_state[i].clock_info[0].flags |=
2477 				RADEON_PM_MODE_NO_DISPLAY;
2478 	}
2479 	/* first mode is usually default */
2480 	if (rdev->pm.default_power_state_index == -1) {
2481 		rdev->pm.power_state[0].type =
2482 			POWER_STATE_TYPE_DEFAULT;
2483 		rdev->pm.default_power_state_index = 0;
2484 		rdev->pm.power_state[0].default_clock_mode =
2485 			&rdev->pm.power_state[0].clock_info[0];
2486 	}
2487 	return state_index;
2488 }
2489 
2490 static int radeon_atombios_parse_power_table_6(struct radeon_device *rdev)
2491 {
2492 	struct radeon_mode_info *mode_info = &rdev->mode_info;
2493 	struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
2494 	union pplib_power_state *power_state;
2495 	int i, j, non_clock_array_index, clock_array_index;
2496 	int state_index = 0, mode_index = 0;
2497 	union pplib_clock_info *clock_info;
2498 	struct _StateArray *state_array;
2499 	struct _ClockInfoArray *clock_info_array;
2500 	struct _NonClockInfoArray *non_clock_info_array;
2501 	bool valid;
2502 	union power_info *power_info;
2503 	int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2504         u16 data_offset;
2505 	u8 frev, crev;
2506 
2507 	if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2508 				   &frev, &crev, &data_offset))
2509 		return state_index;
2510 	power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2511 
2512 	radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
2513 	state_array = (struct _StateArray *)
2514 		(mode_info->atom_context->bios + data_offset +
2515 		 le16_to_cpu(power_info->pplib.usStateArrayOffset));
2516 	clock_info_array = (struct _ClockInfoArray *)
2517 		(mode_info->atom_context->bios + data_offset +
2518 		 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset));
2519 	non_clock_info_array = (struct _NonClockInfoArray *)
2520 		(mode_info->atom_context->bios + data_offset +
2521 		 le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset));
2522 	rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
2523 				       state_array->ucNumEntries, GFP_KERNEL);
2524 	if (!rdev->pm.power_state)
2525 		return state_index;
2526 	for (i = 0; i < state_array->ucNumEntries; i++) {
2527 		mode_index = 0;
2528 		power_state = (union pplib_power_state *)&state_array->states[i];
2529 		/* XXX this might be an inagua bug... */
2530 		non_clock_array_index = i; /* power_state->v2.nonClockInfoIndex */
2531 		non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
2532 			&non_clock_info_array->nonClockInfo[non_clock_array_index];
2533 		rdev->pm.power_state[i].clock_info = kzalloc(sizeof(struct radeon_pm_clock_info) *
2534 							     (power_state->v2.ucNumDPMLevels ?
2535 							      power_state->v2.ucNumDPMLevels : 1),
2536 							     GFP_KERNEL);
2537 		if (!rdev->pm.power_state[i].clock_info)
2538 			return state_index;
2539 		if (power_state->v2.ucNumDPMLevels) {
2540 			for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) {
2541 				clock_array_index = power_state->v2.clockInfoIndex[j];
2542 				/* XXX this might be an inagua bug... */
2543 				if (clock_array_index >= clock_info_array->ucNumEntries)
2544 					continue;
2545 				clock_info = (union pplib_clock_info *)
2546 					&clock_info_array->clockInfo[clock_array_index * clock_info_array->ucEntrySize];
2547 				valid = radeon_atombios_parse_pplib_clock_info(rdev,
2548 									       state_index, mode_index,
2549 									       clock_info);
2550 				if (valid)
2551 					mode_index++;
2552 			}
2553 		} else {
2554 			rdev->pm.power_state[state_index].clock_info[0].mclk =
2555 				rdev->clock.default_mclk;
2556 			rdev->pm.power_state[state_index].clock_info[0].sclk =
2557 				rdev->clock.default_sclk;
2558 			mode_index++;
2559 		}
2560 		rdev->pm.power_state[state_index].num_clock_modes = mode_index;
2561 		if (mode_index) {
2562 			radeon_atombios_parse_pplib_non_clock_info(rdev, state_index, mode_index,
2563 								   non_clock_info);
2564 			state_index++;
2565 		}
2566 	}
2567 	/* if multiple clock modes, mark the lowest as no display */
2568 	for (i = 0; i < state_index; i++) {
2569 		if (rdev->pm.power_state[i].num_clock_modes > 1)
2570 			rdev->pm.power_state[i].clock_info[0].flags |=
2571 				RADEON_PM_MODE_NO_DISPLAY;
2572 	}
2573 	/* first mode is usually default */
2574 	if (rdev->pm.default_power_state_index == -1) {
2575 		rdev->pm.power_state[0].type =
2576 			POWER_STATE_TYPE_DEFAULT;
2577 		rdev->pm.default_power_state_index = 0;
2578 		rdev->pm.power_state[0].default_clock_mode =
2579 			&rdev->pm.power_state[0].clock_info[0];
2580 	}
2581 	return state_index;
2582 }
2583 
2584 void radeon_atombios_get_power_modes(struct radeon_device *rdev)
2585 {
2586 	struct radeon_mode_info *mode_info = &rdev->mode_info;
2587 	int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2588 	u16 data_offset;
2589 	u8 frev, crev;
2590 	int state_index = 0;
2591 
2592 	rdev->pm.default_power_state_index = -1;
2593 
2594 	if (atom_parse_data_header(mode_info->atom_context, index, NULL,
2595 				   &frev, &crev, &data_offset)) {
2596 		switch (frev) {
2597 		case 1:
2598 		case 2:
2599 		case 3:
2600 			state_index = radeon_atombios_parse_power_table_1_3(rdev);
2601 			break;
2602 		case 4:
2603 		case 5:
2604 			state_index = radeon_atombios_parse_power_table_4_5(rdev);
2605 			break;
2606 		case 6:
2607 			state_index = radeon_atombios_parse_power_table_6(rdev);
2608 			break;
2609 		default:
2610 			break;
2611 		}
2612 	} else {
2613 		rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state), GFP_KERNEL);
2614 		if (rdev->pm.power_state) {
2615 			rdev->pm.power_state[0].clock_info =
2616 				kzalloc(sizeof(struct radeon_pm_clock_info) * 1, GFP_KERNEL);
2617 			if (rdev->pm.power_state[0].clock_info) {
2618 				/* add the default mode */
2619 				rdev->pm.power_state[state_index].type =
2620 					POWER_STATE_TYPE_DEFAULT;
2621 				rdev->pm.power_state[state_index].num_clock_modes = 1;
2622 				rdev->pm.power_state[state_index].clock_info[0].mclk = rdev->clock.default_mclk;
2623 				rdev->pm.power_state[state_index].clock_info[0].sclk = rdev->clock.default_sclk;
2624 				rdev->pm.power_state[state_index].default_clock_mode =
2625 					&rdev->pm.power_state[state_index].clock_info[0];
2626 				rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
2627 				rdev->pm.power_state[state_index].pcie_lanes = 16;
2628 				rdev->pm.default_power_state_index = state_index;
2629 				rdev->pm.power_state[state_index].flags = 0;
2630 				state_index++;
2631 			}
2632 		}
2633 	}
2634 
2635 	rdev->pm.num_power_states = state_index;
2636 
2637 	rdev->pm.current_power_state_index = rdev->pm.default_power_state_index;
2638 	rdev->pm.current_clock_mode_index = 0;
2639 	if (rdev->pm.default_power_state_index >= 0)
2640 		rdev->pm.current_vddc =
2641 			rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage;
2642 	else
2643 		rdev->pm.current_vddc = 0;
2644 }
2645 
2646 void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable)
2647 {
2648 	DYNAMIC_CLOCK_GATING_PS_ALLOCATION args;
2649 	int index = GetIndexIntoMasterTable(COMMAND, DynamicClockGating);
2650 
2651 	args.ucEnable = enable;
2652 
2653 	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2654 }
2655 
2656 uint32_t radeon_atom_get_engine_clock(struct radeon_device *rdev)
2657 {
2658 	GET_ENGINE_CLOCK_PS_ALLOCATION args;
2659 	int index = GetIndexIntoMasterTable(COMMAND, GetEngineClock);
2660 
2661 	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2662 	return le32_to_cpu(args.ulReturnEngineClock);
2663 }
2664 
2665 uint32_t radeon_atom_get_memory_clock(struct radeon_device *rdev)
2666 {
2667 	GET_MEMORY_CLOCK_PS_ALLOCATION args;
2668 	int index = GetIndexIntoMasterTable(COMMAND, GetMemoryClock);
2669 
2670 	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2671 	return le32_to_cpu(args.ulReturnMemoryClock);
2672 }
2673 
2674 void radeon_atom_set_engine_clock(struct radeon_device *rdev,
2675 				  uint32_t eng_clock)
2676 {
2677 	SET_ENGINE_CLOCK_PS_ALLOCATION args;
2678 	int index = GetIndexIntoMasterTable(COMMAND, SetEngineClock);
2679 
2680 	args.ulTargetEngineClock = cpu_to_le32(eng_clock);	/* 10 khz */
2681 
2682 	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2683 }
2684 
2685 void radeon_atom_set_memory_clock(struct radeon_device *rdev,
2686 				  uint32_t mem_clock)
2687 {
2688 	SET_MEMORY_CLOCK_PS_ALLOCATION args;
2689 	int index = GetIndexIntoMasterTable(COMMAND, SetMemoryClock);
2690 
2691 	if (rdev->flags & RADEON_IS_IGP)
2692 		return;
2693 
2694 	args.ulTargetMemoryClock = cpu_to_le32(mem_clock);	/* 10 khz */
2695 
2696 	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2697 }
2698 
2699 union set_voltage {
2700 	struct _SET_VOLTAGE_PS_ALLOCATION alloc;
2701 	struct _SET_VOLTAGE_PARAMETERS v1;
2702 	struct _SET_VOLTAGE_PARAMETERS_V2 v2;
2703 	struct _SET_VOLTAGE_PARAMETERS_V1_3 v3;
2704 };
2705 
2706 void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type)
2707 {
2708 	union set_voltage args;
2709 	int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
2710 	u8 frev, crev, volt_index = voltage_level;
2711 
2712 	if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
2713 		return;
2714 
2715 	/* 0xff01 is a flag rather then an actual voltage */
2716 	if (voltage_level == 0xff01)
2717 		return;
2718 
2719 	switch (crev) {
2720 	case 1:
2721 		args.v1.ucVoltageType = voltage_type;
2722 		args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE;
2723 		args.v1.ucVoltageIndex = volt_index;
2724 		break;
2725 	case 2:
2726 		args.v2.ucVoltageType = voltage_type;
2727 		args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE;
2728 		args.v2.usVoltageLevel = cpu_to_le16(voltage_level);
2729 		break;
2730 	case 3:
2731 		args.v3.ucVoltageType = voltage_type;
2732 		args.v3.ucVoltageMode = ATOM_SET_VOLTAGE;
2733 		args.v3.usVoltageLevel = cpu_to_le16(voltage_level);
2734 		break;
2735 	default:
2736 		DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
2737 		return;
2738 	}
2739 
2740 	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2741 }
2742 
2743 static int radeon_atom_get_max_vddc(struct radeon_device *rdev, u8 voltage_type,
2744 				    u16 voltage_id, u16 *voltage)
2745 {
2746 	union set_voltage args;
2747 	int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
2748 	u8 frev, crev;
2749 
2750 	if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
2751 		return -EINVAL;
2752 
2753 	switch (crev) {
2754 	case 1:
2755 		return -EINVAL;
2756 	case 2:
2757 		args.v2.ucVoltageType = SET_VOLTAGE_GET_MAX_VOLTAGE;
2758 		args.v2.ucVoltageMode = 0;
2759 		args.v2.usVoltageLevel = 0;
2760 
2761 		atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2762 
2763 		*voltage = le16_to_cpu(args.v2.usVoltageLevel);
2764 		break;
2765 	case 3:
2766 		args.v3.ucVoltageType = voltage_type;
2767 		args.v3.ucVoltageMode = ATOM_GET_VOLTAGE_LEVEL;
2768 		args.v3.usVoltageLevel = cpu_to_le16(voltage_id);
2769 
2770 		atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2771 
2772 		*voltage = le16_to_cpu(args.v3.usVoltageLevel);
2773 		break;
2774 	default:
2775 		DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
2776 		return -EINVAL;
2777 	}
2778 
2779 	return 0;
2780 }
2781 
2782 void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
2783 {
2784 	struct radeon_device *rdev = dev->dev_private;
2785 	uint32_t bios_2_scratch, bios_6_scratch;
2786 
2787 	if (rdev->family >= CHIP_R600) {
2788 		bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH);
2789 		bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
2790 	} else {
2791 		bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH);
2792 		bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
2793 	}
2794 
2795 	/* let the bios control the backlight */
2796 	bios_2_scratch &= ~ATOM_S2_VRI_BRIGHT_ENABLE;
2797 
2798 	/* tell the bios not to handle mode switching */
2799 	bios_6_scratch |= ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH;
2800 
2801 	if (rdev->family >= CHIP_R600) {
2802 		WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
2803 		WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
2804 	} else {
2805 		WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
2806 		WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
2807 	}
2808 
2809 }
2810 
2811 void radeon_save_bios_scratch_regs(struct radeon_device *rdev)
2812 {
2813 	uint32_t scratch_reg;
2814 	int i;
2815 
2816 	if (rdev->family >= CHIP_R600)
2817 		scratch_reg = R600_BIOS_0_SCRATCH;
2818 	else
2819 		scratch_reg = RADEON_BIOS_0_SCRATCH;
2820 
2821 	for (i = 0; i < RADEON_BIOS_NUM_SCRATCH; i++)
2822 		rdev->bios_scratch[i] = RREG32(scratch_reg + (i * 4));
2823 }
2824 
2825 void radeon_restore_bios_scratch_regs(struct radeon_device *rdev)
2826 {
2827 	uint32_t scratch_reg;
2828 	int i;
2829 
2830 	if (rdev->family >= CHIP_R600)
2831 		scratch_reg = R600_BIOS_0_SCRATCH;
2832 	else
2833 		scratch_reg = RADEON_BIOS_0_SCRATCH;
2834 
2835 	for (i = 0; i < RADEON_BIOS_NUM_SCRATCH; i++)
2836 		WREG32(scratch_reg + (i * 4), rdev->bios_scratch[i]);
2837 }
2838 
2839 void radeon_atom_output_lock(struct drm_encoder *encoder, bool lock)
2840 {
2841 	struct drm_device *dev = encoder->dev;
2842 	struct radeon_device *rdev = dev->dev_private;
2843 	uint32_t bios_6_scratch;
2844 
2845 	if (rdev->family >= CHIP_R600)
2846 		bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
2847 	else
2848 		bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
2849 
2850 	if (lock) {
2851 		bios_6_scratch |= ATOM_S6_CRITICAL_STATE;
2852 		bios_6_scratch &= ~ATOM_S6_ACC_MODE;
2853 	} else {
2854 		bios_6_scratch &= ~ATOM_S6_CRITICAL_STATE;
2855 		bios_6_scratch |= ATOM_S6_ACC_MODE;
2856 	}
2857 
2858 	if (rdev->family >= CHIP_R600)
2859 		WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
2860 	else
2861 		WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
2862 }
2863 
2864 /* at some point we may want to break this out into individual functions */
2865 void
2866 radeon_atombios_connected_scratch_regs(struct drm_connector *connector,
2867 				       struct drm_encoder *encoder,
2868 				       bool connected)
2869 {
2870 	struct drm_device *dev = connector->dev;
2871 	struct radeon_device *rdev = dev->dev_private;
2872 	struct radeon_connector *radeon_connector =
2873 	    to_radeon_connector(connector);
2874 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2875 	uint32_t bios_0_scratch, bios_3_scratch, bios_6_scratch;
2876 
2877 	if (rdev->family >= CHIP_R600) {
2878 		bios_0_scratch = RREG32(R600_BIOS_0_SCRATCH);
2879 		bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH);
2880 		bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
2881 	} else {
2882 		bios_0_scratch = RREG32(RADEON_BIOS_0_SCRATCH);
2883 		bios_3_scratch = RREG32(RADEON_BIOS_3_SCRATCH);
2884 		bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
2885 	}
2886 
2887 	if ((radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) &&
2888 	    (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT)) {
2889 		if (connected) {
2890 			DRM_DEBUG_KMS("TV1 connected\n");
2891 			bios_3_scratch |= ATOM_S3_TV1_ACTIVE;
2892 			bios_6_scratch |= ATOM_S6_ACC_REQ_TV1;
2893 		} else {
2894 			DRM_DEBUG_KMS("TV1 disconnected\n");
2895 			bios_0_scratch &= ~ATOM_S0_TV1_MASK;
2896 			bios_3_scratch &= ~ATOM_S3_TV1_ACTIVE;
2897 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_TV1;
2898 		}
2899 	}
2900 	if ((radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) &&
2901 	    (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT)) {
2902 		if (connected) {
2903 			DRM_DEBUG_KMS("CV connected\n");
2904 			bios_3_scratch |= ATOM_S3_CV_ACTIVE;
2905 			bios_6_scratch |= ATOM_S6_ACC_REQ_CV;
2906 		} else {
2907 			DRM_DEBUG_KMS("CV disconnected\n");
2908 			bios_0_scratch &= ~ATOM_S0_CV_MASK;
2909 			bios_3_scratch &= ~ATOM_S3_CV_ACTIVE;
2910 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_CV;
2911 		}
2912 	}
2913 	if ((radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) &&
2914 	    (radeon_connector->devices & ATOM_DEVICE_LCD1_SUPPORT)) {
2915 		if (connected) {
2916 			DRM_DEBUG_KMS("LCD1 connected\n");
2917 			bios_0_scratch |= ATOM_S0_LCD1;
2918 			bios_3_scratch |= ATOM_S3_LCD1_ACTIVE;
2919 			bios_6_scratch |= ATOM_S6_ACC_REQ_LCD1;
2920 		} else {
2921 			DRM_DEBUG_KMS("LCD1 disconnected\n");
2922 			bios_0_scratch &= ~ATOM_S0_LCD1;
2923 			bios_3_scratch &= ~ATOM_S3_LCD1_ACTIVE;
2924 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_LCD1;
2925 		}
2926 	}
2927 	if ((radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) &&
2928 	    (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT)) {
2929 		if (connected) {
2930 			DRM_DEBUG_KMS("CRT1 connected\n");
2931 			bios_0_scratch |= ATOM_S0_CRT1_COLOR;
2932 			bios_3_scratch |= ATOM_S3_CRT1_ACTIVE;
2933 			bios_6_scratch |= ATOM_S6_ACC_REQ_CRT1;
2934 		} else {
2935 			DRM_DEBUG_KMS("CRT1 disconnected\n");
2936 			bios_0_scratch &= ~ATOM_S0_CRT1_MASK;
2937 			bios_3_scratch &= ~ATOM_S3_CRT1_ACTIVE;
2938 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT1;
2939 		}
2940 	}
2941 	if ((radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) &&
2942 	    (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT)) {
2943 		if (connected) {
2944 			DRM_DEBUG_KMS("CRT2 connected\n");
2945 			bios_0_scratch |= ATOM_S0_CRT2_COLOR;
2946 			bios_3_scratch |= ATOM_S3_CRT2_ACTIVE;
2947 			bios_6_scratch |= ATOM_S6_ACC_REQ_CRT2;
2948 		} else {
2949 			DRM_DEBUG_KMS("CRT2 disconnected\n");
2950 			bios_0_scratch &= ~ATOM_S0_CRT2_MASK;
2951 			bios_3_scratch &= ~ATOM_S3_CRT2_ACTIVE;
2952 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT2;
2953 		}
2954 	}
2955 	if ((radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) &&
2956 	    (radeon_connector->devices & ATOM_DEVICE_DFP1_SUPPORT)) {
2957 		if (connected) {
2958 			DRM_DEBUG_KMS("DFP1 connected\n");
2959 			bios_0_scratch |= ATOM_S0_DFP1;
2960 			bios_3_scratch |= ATOM_S3_DFP1_ACTIVE;
2961 			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP1;
2962 		} else {
2963 			DRM_DEBUG_KMS("DFP1 disconnected\n");
2964 			bios_0_scratch &= ~ATOM_S0_DFP1;
2965 			bios_3_scratch &= ~ATOM_S3_DFP1_ACTIVE;
2966 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP1;
2967 		}
2968 	}
2969 	if ((radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) &&
2970 	    (radeon_connector->devices & ATOM_DEVICE_DFP2_SUPPORT)) {
2971 		if (connected) {
2972 			DRM_DEBUG_KMS("DFP2 connected\n");
2973 			bios_0_scratch |= ATOM_S0_DFP2;
2974 			bios_3_scratch |= ATOM_S3_DFP2_ACTIVE;
2975 			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP2;
2976 		} else {
2977 			DRM_DEBUG_KMS("DFP2 disconnected\n");
2978 			bios_0_scratch &= ~ATOM_S0_DFP2;
2979 			bios_3_scratch &= ~ATOM_S3_DFP2_ACTIVE;
2980 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP2;
2981 		}
2982 	}
2983 	if ((radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) &&
2984 	    (radeon_connector->devices & ATOM_DEVICE_DFP3_SUPPORT)) {
2985 		if (connected) {
2986 			DRM_DEBUG_KMS("DFP3 connected\n");
2987 			bios_0_scratch |= ATOM_S0_DFP3;
2988 			bios_3_scratch |= ATOM_S3_DFP3_ACTIVE;
2989 			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP3;
2990 		} else {
2991 			DRM_DEBUG_KMS("DFP3 disconnected\n");
2992 			bios_0_scratch &= ~ATOM_S0_DFP3;
2993 			bios_3_scratch &= ~ATOM_S3_DFP3_ACTIVE;
2994 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP3;
2995 		}
2996 	}
2997 	if ((radeon_encoder->devices & ATOM_DEVICE_DFP4_SUPPORT) &&
2998 	    (radeon_connector->devices & ATOM_DEVICE_DFP4_SUPPORT)) {
2999 		if (connected) {
3000 			DRM_DEBUG_KMS("DFP4 connected\n");
3001 			bios_0_scratch |= ATOM_S0_DFP4;
3002 			bios_3_scratch |= ATOM_S3_DFP4_ACTIVE;
3003 			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP4;
3004 		} else {
3005 			DRM_DEBUG_KMS("DFP4 disconnected\n");
3006 			bios_0_scratch &= ~ATOM_S0_DFP4;
3007 			bios_3_scratch &= ~ATOM_S3_DFP4_ACTIVE;
3008 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP4;
3009 		}
3010 	}
3011 	if ((radeon_encoder->devices & ATOM_DEVICE_DFP5_SUPPORT) &&
3012 	    (radeon_connector->devices & ATOM_DEVICE_DFP5_SUPPORT)) {
3013 		if (connected) {
3014 			DRM_DEBUG_KMS("DFP5 connected\n");
3015 			bios_0_scratch |= ATOM_S0_DFP5;
3016 			bios_3_scratch |= ATOM_S3_DFP5_ACTIVE;
3017 			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP5;
3018 		} else {
3019 			DRM_DEBUG_KMS("DFP5 disconnected\n");
3020 			bios_0_scratch &= ~ATOM_S0_DFP5;
3021 			bios_3_scratch &= ~ATOM_S3_DFP5_ACTIVE;
3022 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP5;
3023 		}
3024 	}
3025 	if ((radeon_encoder->devices & ATOM_DEVICE_DFP6_SUPPORT) &&
3026 	    (radeon_connector->devices & ATOM_DEVICE_DFP6_SUPPORT)) {
3027 		if (connected) {
3028 			DRM_DEBUG_KMS("DFP6 connected\n");
3029 			bios_0_scratch |= ATOM_S0_DFP6;
3030 			bios_3_scratch |= ATOM_S3_DFP6_ACTIVE;
3031 			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP6;
3032 		} else {
3033 			DRM_DEBUG_KMS("DFP6 disconnected\n");
3034 			bios_0_scratch &= ~ATOM_S0_DFP6;
3035 			bios_3_scratch &= ~ATOM_S3_DFP6_ACTIVE;
3036 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP6;
3037 		}
3038 	}
3039 
3040 	if (rdev->family >= CHIP_R600) {
3041 		WREG32(R600_BIOS_0_SCRATCH, bios_0_scratch);
3042 		WREG32(R600_BIOS_3_SCRATCH, bios_3_scratch);
3043 		WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
3044 	} else {
3045 		WREG32(RADEON_BIOS_0_SCRATCH, bios_0_scratch);
3046 		WREG32(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
3047 		WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
3048 	}
3049 }
3050 
3051 void
3052 radeon_atombios_encoder_crtc_scratch_regs(struct drm_encoder *encoder, int crtc)
3053 {
3054 	struct drm_device *dev = encoder->dev;
3055 	struct radeon_device *rdev = dev->dev_private;
3056 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
3057 	uint32_t bios_3_scratch;
3058 
3059 	if (ASIC_IS_DCE4(rdev))
3060 		return;
3061 
3062 	if (rdev->family >= CHIP_R600)
3063 		bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH);
3064 	else
3065 		bios_3_scratch = RREG32(RADEON_BIOS_3_SCRATCH);
3066 
3067 	if (radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) {
3068 		bios_3_scratch &= ~ATOM_S3_TV1_CRTC_ACTIVE;
3069 		bios_3_scratch |= (crtc << 18);
3070 	}
3071 	if (radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) {
3072 		bios_3_scratch &= ~ATOM_S3_CV_CRTC_ACTIVE;
3073 		bios_3_scratch |= (crtc << 24);
3074 	}
3075 	if (radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) {
3076 		bios_3_scratch &= ~ATOM_S3_CRT1_CRTC_ACTIVE;
3077 		bios_3_scratch |= (crtc << 16);
3078 	}
3079 	if (radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) {
3080 		bios_3_scratch &= ~ATOM_S3_CRT2_CRTC_ACTIVE;
3081 		bios_3_scratch |= (crtc << 20);
3082 	}
3083 	if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) {
3084 		bios_3_scratch &= ~ATOM_S3_LCD1_CRTC_ACTIVE;
3085 		bios_3_scratch |= (crtc << 17);
3086 	}
3087 	if (radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) {
3088 		bios_3_scratch &= ~ATOM_S3_DFP1_CRTC_ACTIVE;
3089 		bios_3_scratch |= (crtc << 19);
3090 	}
3091 	if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) {
3092 		bios_3_scratch &= ~ATOM_S3_DFP2_CRTC_ACTIVE;
3093 		bios_3_scratch |= (crtc << 23);
3094 	}
3095 	if (radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) {
3096 		bios_3_scratch &= ~ATOM_S3_DFP3_CRTC_ACTIVE;
3097 		bios_3_scratch |= (crtc << 25);
3098 	}
3099 
3100 	if (rdev->family >= CHIP_R600)
3101 		WREG32(R600_BIOS_3_SCRATCH, bios_3_scratch);
3102 	else
3103 		WREG32(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
3104 }
3105 
3106 void
3107 radeon_atombios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on)
3108 {
3109 	struct drm_device *dev = encoder->dev;
3110 	struct radeon_device *rdev = dev->dev_private;
3111 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
3112 	uint32_t bios_2_scratch;
3113 
3114 	if (ASIC_IS_DCE4(rdev))
3115 		return;
3116 
3117 	if (rdev->family >= CHIP_R600)
3118 		bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH);
3119 	else
3120 		bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH);
3121 
3122 	if (radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) {
3123 		if (on)
3124 			bios_2_scratch &= ~ATOM_S2_TV1_DPMS_STATE;
3125 		else
3126 			bios_2_scratch |= ATOM_S2_TV1_DPMS_STATE;
3127 	}
3128 	if (radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) {
3129 		if (on)
3130 			bios_2_scratch &= ~ATOM_S2_CV_DPMS_STATE;
3131 		else
3132 			bios_2_scratch |= ATOM_S2_CV_DPMS_STATE;
3133 	}
3134 	if (radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) {
3135 		if (on)
3136 			bios_2_scratch &= ~ATOM_S2_CRT1_DPMS_STATE;
3137 		else
3138 			bios_2_scratch |= ATOM_S2_CRT1_DPMS_STATE;
3139 	}
3140 	if (radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) {
3141 		if (on)
3142 			bios_2_scratch &= ~ATOM_S2_CRT2_DPMS_STATE;
3143 		else
3144 			bios_2_scratch |= ATOM_S2_CRT2_DPMS_STATE;
3145 	}
3146 	if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) {
3147 		if (on)
3148 			bios_2_scratch &= ~ATOM_S2_LCD1_DPMS_STATE;
3149 		else
3150 			bios_2_scratch |= ATOM_S2_LCD1_DPMS_STATE;
3151 	}
3152 	if (radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) {
3153 		if (on)
3154 			bios_2_scratch &= ~ATOM_S2_DFP1_DPMS_STATE;
3155 		else
3156 			bios_2_scratch |= ATOM_S2_DFP1_DPMS_STATE;
3157 	}
3158 	if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) {
3159 		if (on)
3160 			bios_2_scratch &= ~ATOM_S2_DFP2_DPMS_STATE;
3161 		else
3162 			bios_2_scratch |= ATOM_S2_DFP2_DPMS_STATE;
3163 	}
3164 	if (radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) {
3165 		if (on)
3166 			bios_2_scratch &= ~ATOM_S2_DFP3_DPMS_STATE;
3167 		else
3168 			bios_2_scratch |= ATOM_S2_DFP3_DPMS_STATE;
3169 	}
3170 	if (radeon_encoder->devices & ATOM_DEVICE_DFP4_SUPPORT) {
3171 		if (on)
3172 			bios_2_scratch &= ~ATOM_S2_DFP4_DPMS_STATE;
3173 		else
3174 			bios_2_scratch |= ATOM_S2_DFP4_DPMS_STATE;
3175 	}
3176 	if (radeon_encoder->devices & ATOM_DEVICE_DFP5_SUPPORT) {
3177 		if (on)
3178 			bios_2_scratch &= ~ATOM_S2_DFP5_DPMS_STATE;
3179 		else
3180 			bios_2_scratch |= ATOM_S2_DFP5_DPMS_STATE;
3181 	}
3182 
3183 	if (rdev->family >= CHIP_R600)
3184 		WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
3185 	else
3186 		WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
3187 }
3188