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