1 /*
2  * Copyright 2007-8 Advanced Micro Devices, Inc.
3  * Copyright 2008 Red Hat Inc.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21  * OTHER DEALINGS IN THE SOFTWARE.
22  *
23  * Authors: Dave Airlie
24  *          Alex Deucher
25  */
26 #include <drm/drmP.h>
27 #include <drm/radeon_drm.h>
28 #include "radeon.h"
29 
30 #include "atom.h"
31 #include "atom-bits.h"
32 
33 /* from radeon_encoder.c */
34 extern uint32_t
35 radeon_get_encoder_enum(struct drm_device *dev, uint32_t supported_device,
36 			uint8_t dac);
37 extern void radeon_link_encoder_connector(struct drm_device *dev);
38 extern void
39 radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_enum,
40 			uint32_t supported_device, u16 caps);
41 
42 /* from radeon_connector.c */
43 extern void
44 radeon_add_atom_connector(struct drm_device *dev,
45 			  uint32_t connector_id,
46 			  uint32_t supported_device,
47 			  int connector_type,
48 			  struct radeon_i2c_bus_rec *i2c_bus,
49 			  uint32_t igp_lane_info,
50 			  uint16_t connector_object_id,
51 			  struct radeon_hpd *hpd,
52 			  struct radeon_router *router);
53 
54 /* from radeon_legacy_encoder.c */
55 extern void
56 radeon_add_legacy_encoder(struct drm_device *dev, uint32_t encoder_enum,
57 			  uint32_t supported_device);
58 
59 union atom_supported_devices {
60 	struct _ATOM_SUPPORTED_DEVICES_INFO info;
61 	struct _ATOM_SUPPORTED_DEVICES_INFO_2 info_2;
62 	struct _ATOM_SUPPORTED_DEVICES_INFO_2d1 info_2d1;
63 };
64 
65 static void radeon_lookup_i2c_gpio_quirks(struct radeon_device *rdev,
66 					  ATOM_GPIO_I2C_ASSIGMENT *gpio,
67 					  u8 index)
68 {
69 	/* r4xx mask is technically not used by the hw, so patch in the legacy mask bits */
70 	if ((rdev->family == CHIP_R420) ||
71 	    (rdev->family == CHIP_R423) ||
72 	    (rdev->family == CHIP_RV410)) {
73 		if ((le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x0018) ||
74 		    (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x0019) ||
75 		    (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x001a)) {
76 			gpio->ucClkMaskShift = 0x19;
77 			gpio->ucDataMaskShift = 0x18;
78 		}
79 	}
80 
81 	/* some evergreen boards have bad data for this entry */
82 	if (ASIC_IS_DCE4(rdev)) {
83 		if ((index == 7) &&
84 		    (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1936) &&
85 		    (gpio->sucI2cId.ucAccess == 0)) {
86 			gpio->sucI2cId.ucAccess = 0x97;
87 			gpio->ucDataMaskShift = 8;
88 			gpio->ucDataEnShift = 8;
89 			gpio->ucDataY_Shift = 8;
90 			gpio->ucDataA_Shift = 8;
91 		}
92 	}
93 
94 	/* some DCE3 boards have bad data for this entry */
95 	if (ASIC_IS_DCE3(rdev)) {
96 		if ((index == 4) &&
97 		    (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1fda) &&
98 		    (gpio->sucI2cId.ucAccess == 0x94))
99 			gpio->sucI2cId.ucAccess = 0x14;
100 	}
101 }
102 
103 static struct radeon_i2c_bus_rec radeon_get_bus_rec_for_i2c_gpio(ATOM_GPIO_I2C_ASSIGMENT *gpio)
104 {
105 	struct radeon_i2c_bus_rec i2c;
106 
107 	memset(&i2c, 0, sizeof(struct radeon_i2c_bus_rec));
108 
109 	i2c.mask_clk_reg = le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4;
110 	i2c.mask_data_reg = le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4;
111 	i2c.en_clk_reg = le16_to_cpu(gpio->usClkEnRegisterIndex) * 4;
112 	i2c.en_data_reg = le16_to_cpu(gpio->usDataEnRegisterIndex) * 4;
113 	i2c.y_clk_reg = le16_to_cpu(gpio->usClkY_RegisterIndex) * 4;
114 	i2c.y_data_reg = le16_to_cpu(gpio->usDataY_RegisterIndex) * 4;
115 	i2c.a_clk_reg = le16_to_cpu(gpio->usClkA_RegisterIndex) * 4;
116 	i2c.a_data_reg = le16_to_cpu(gpio->usDataA_RegisterIndex) * 4;
117 	i2c.mask_clk_mask = (1 << gpio->ucClkMaskShift);
118 	i2c.mask_data_mask = (1 << gpio->ucDataMaskShift);
119 	i2c.en_clk_mask = (1 << gpio->ucClkEnShift);
120 	i2c.en_data_mask = (1 << gpio->ucDataEnShift);
121 	i2c.y_clk_mask = (1 << gpio->ucClkY_Shift);
122 	i2c.y_data_mask = (1 << gpio->ucDataY_Shift);
123 	i2c.a_clk_mask = (1 << gpio->ucClkA_Shift);
124 	i2c.a_data_mask = (1 << gpio->ucDataA_Shift);
125 
126 	if (gpio->sucI2cId.sbfAccess.bfHW_Capable)
127 		i2c.hw_capable = true;
128 	else
129 		i2c.hw_capable = false;
130 
131 	if (gpio->sucI2cId.ucAccess == 0xa0)
132 		i2c.mm_i2c = true;
133 	else
134 		i2c.mm_i2c = false;
135 
136 	i2c.i2c_id = gpio->sucI2cId.ucAccess;
137 
138 	if (i2c.mask_clk_reg)
139 		i2c.valid = true;
140 	else
141 		i2c.valid = false;
142 
143 	return i2c;
144 }
145 
146 static struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_device *rdev,
147 							       uint8_t id)
148 {
149 	struct atom_context *ctx = rdev->mode_info.atom_context;
150 	ATOM_GPIO_I2C_ASSIGMENT *gpio;
151 	struct radeon_i2c_bus_rec i2c;
152 	int index = GetIndexIntoMasterTable(DATA, GPIO_I2C_Info);
153 	struct _ATOM_GPIO_I2C_INFO *i2c_info;
154 	uint16_t data_offset, size;
155 	int i, num_indices;
156 
157 	memset(&i2c, 0, sizeof(struct radeon_i2c_bus_rec));
158 	i2c.valid = false;
159 
160 	if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) {
161 		i2c_info = (struct _ATOM_GPIO_I2C_INFO *)(ctx->bios + data_offset);
162 
163 		num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
164 			sizeof(ATOM_GPIO_I2C_ASSIGMENT);
165 
166 		for (i = 0; i < num_indices; i++) {
167 			gpio = &i2c_info->asGPIO_Info[i];
168 
169 			radeon_lookup_i2c_gpio_quirks(rdev, gpio, i);
170 
171 			if (gpio->sucI2cId.ucAccess == id) {
172 				i2c = radeon_get_bus_rec_for_i2c_gpio(gpio);
173 				break;
174 			}
175 		}
176 	}
177 
178 	return i2c;
179 }
180 
181 void radeon_atombios_i2c_init(struct radeon_device *rdev)
182 {
183 	struct atom_context *ctx = rdev->mode_info.atom_context;
184 	ATOM_GPIO_I2C_ASSIGMENT *gpio;
185 	struct radeon_i2c_bus_rec i2c;
186 	int index = GetIndexIntoMasterTable(DATA, GPIO_I2C_Info);
187 	struct _ATOM_GPIO_I2C_INFO *i2c_info;
188 	uint16_t data_offset, size;
189 	int i, num_indices;
190 	char stmp[32];
191 
192 	if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) {
193 		i2c_info = (struct _ATOM_GPIO_I2C_INFO *)(ctx->bios + data_offset);
194 
195 		num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
196 			sizeof(ATOM_GPIO_I2C_ASSIGMENT);
197 
198 		for (i = 0; i < num_indices; i++) {
199 			gpio = &i2c_info->asGPIO_Info[i];
200 
201 			radeon_lookup_i2c_gpio_quirks(rdev, gpio, i);
202 
203 			i2c = radeon_get_bus_rec_for_i2c_gpio(gpio);
204 
205 			if (i2c.valid) {
206 				sprintf(stmp, "0x%x", i2c.i2c_id);
207 				rdev->i2c_bus[i] = radeon_i2c_create(rdev->ddev, &i2c, stmp);
208 			}
209 		}
210 	}
211 }
212 
213 static struct radeon_gpio_rec radeon_lookup_gpio(struct radeon_device *rdev,
214 							u8 id)
215 {
216 	struct atom_context *ctx = rdev->mode_info.atom_context;
217 	struct radeon_gpio_rec gpio;
218 	int index = GetIndexIntoMasterTable(DATA, GPIO_Pin_LUT);
219 	struct _ATOM_GPIO_PIN_LUT *gpio_info;
220 	ATOM_GPIO_PIN_ASSIGNMENT *pin;
221 	u16 data_offset, size;
222 	int i, num_indices;
223 
224 	memset(&gpio, 0, sizeof(struct radeon_gpio_rec));
225 	gpio.valid = false;
226 
227 	if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) {
228 		gpio_info = (struct _ATOM_GPIO_PIN_LUT *)(ctx->bios + data_offset);
229 
230 		num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
231 			sizeof(ATOM_GPIO_PIN_ASSIGNMENT);
232 
233 		for (i = 0; i < num_indices; i++) {
234 			pin = &gpio_info->asGPIO_Pin[i];
235 			if (id == pin->ucGPIO_ID) {
236 				gpio.id = pin->ucGPIO_ID;
237 				gpio.reg = le16_to_cpu(pin->usGpioPin_AIndex) * 4;
238 				gpio.mask = (1 << pin->ucGpioPinBitShift);
239 				gpio.valid = true;
240 				break;
241 			}
242 		}
243 	}
244 
245 	return gpio;
246 }
247 
248 static struct radeon_hpd radeon_atom_get_hpd_info_from_gpio(struct radeon_device *rdev,
249 							    struct radeon_gpio_rec *gpio)
250 {
251 	struct radeon_hpd hpd;
252 	u32 reg;
253 
254 	memset(&hpd, 0, sizeof(struct radeon_hpd));
255 
256 	if (ASIC_IS_DCE6(rdev))
257 		reg = SI_DC_GPIO_HPD_A;
258 	else if (ASIC_IS_DCE4(rdev))
259 		reg = EVERGREEN_DC_GPIO_HPD_A;
260 	else
261 		reg = AVIVO_DC_GPIO_HPD_A;
262 
263 	hpd.gpio = *gpio;
264 	if (gpio->reg == reg) {
265 		switch(gpio->mask) {
266 		case (1 << 0):
267 			hpd.hpd = RADEON_HPD_1;
268 			break;
269 		case (1 << 8):
270 			hpd.hpd = RADEON_HPD_2;
271 			break;
272 		case (1 << 16):
273 			hpd.hpd = RADEON_HPD_3;
274 			break;
275 		case (1 << 24):
276 			hpd.hpd = RADEON_HPD_4;
277 			break;
278 		case (1 << 26):
279 			hpd.hpd = RADEON_HPD_5;
280 			break;
281 		case (1 << 28):
282 			hpd.hpd = RADEON_HPD_6;
283 			break;
284 		default:
285 			hpd.hpd = RADEON_HPD_NONE;
286 			break;
287 		}
288 	} else
289 		hpd.hpd = RADEON_HPD_NONE;
290 	return hpd;
291 }
292 
293 static bool radeon_atom_apply_quirks(struct drm_device *dev,
294 				     uint32_t supported_device,
295 				     int *connector_type,
296 				     struct radeon_i2c_bus_rec *i2c_bus,
297 				     uint16_t *line_mux,
298 				     struct radeon_hpd *hpd)
299 {
300 
301 	/* Asus M2A-VM HDMI board lists the DVI port as HDMI */
302 	if ((dev->pdev->device == 0x791e) &&
303 	    (dev->pdev->subsystem_vendor == 0x1043) &&
304 	    (dev->pdev->subsystem_device == 0x826d)) {
305 		if ((*connector_type == DRM_MODE_CONNECTOR_HDMIA) &&
306 		    (supported_device == ATOM_DEVICE_DFP3_SUPPORT))
307 			*connector_type = DRM_MODE_CONNECTOR_DVID;
308 	}
309 
310 	/* Asrock RS600 board lists the DVI port as HDMI */
311 	if ((dev->pdev->device == 0x7941) &&
312 	    (dev->pdev->subsystem_vendor == 0x1849) &&
313 	    (dev->pdev->subsystem_device == 0x7941)) {
314 		if ((*connector_type == DRM_MODE_CONNECTOR_HDMIA) &&
315 		    (supported_device == ATOM_DEVICE_DFP3_SUPPORT))
316 			*connector_type = DRM_MODE_CONNECTOR_DVID;
317 	}
318 
319 	/* MSI K9A2GM V2/V3 board has no HDMI or DVI */
320 	if ((dev->pdev->device == 0x796e) &&
321 	    (dev->pdev->subsystem_vendor == 0x1462) &&
322 	    (dev->pdev->subsystem_device == 0x7302)) {
323 		if ((supported_device == ATOM_DEVICE_DFP2_SUPPORT) ||
324 		    (supported_device == ATOM_DEVICE_DFP3_SUPPORT))
325 			return false;
326 	}
327 
328 	/* a-bit f-i90hd - ciaranm on #radeonhd - this board has no DVI */
329 	if ((dev->pdev->device == 0x7941) &&
330 	    (dev->pdev->subsystem_vendor == 0x147b) &&
331 	    (dev->pdev->subsystem_device == 0x2412)) {
332 		if (*connector_type == DRM_MODE_CONNECTOR_DVII)
333 			return false;
334 	}
335 
336 	/* Falcon NW laptop lists vga ddc line for LVDS */
337 	if ((dev->pdev->device == 0x5653) &&
338 	    (dev->pdev->subsystem_vendor == 0x1462) &&
339 	    (dev->pdev->subsystem_device == 0x0291)) {
340 		if (*connector_type == DRM_MODE_CONNECTOR_LVDS) {
341 			i2c_bus->valid = false;
342 			*line_mux = 53;
343 		}
344 	}
345 
346 	/* HIS X1300 is DVI+VGA, not DVI+DVI */
347 	if ((dev->pdev->device == 0x7146) &&
348 	    (dev->pdev->subsystem_vendor == 0x17af) &&
349 	    (dev->pdev->subsystem_device == 0x2058)) {
350 		if (supported_device == ATOM_DEVICE_DFP1_SUPPORT)
351 			return false;
352 	}
353 
354 	/* Gigabyte X1300 is DVI+VGA, not DVI+DVI */
355 	if ((dev->pdev->device == 0x7142) &&
356 	    (dev->pdev->subsystem_vendor == 0x1458) &&
357 	    (dev->pdev->subsystem_device == 0x2134)) {
358 		if (supported_device == ATOM_DEVICE_DFP1_SUPPORT)
359 			return false;
360 	}
361 
362 
363 	/* Funky macbooks */
364 	if ((dev->pdev->device == 0x71C5) &&
365 	    (dev->pdev->subsystem_vendor == 0x106b) &&
366 	    (dev->pdev->subsystem_device == 0x0080)) {
367 		if ((supported_device == ATOM_DEVICE_CRT1_SUPPORT) ||
368 		    (supported_device == ATOM_DEVICE_DFP2_SUPPORT))
369 			return false;
370 		if (supported_device == ATOM_DEVICE_CRT2_SUPPORT)
371 			*line_mux = 0x90;
372 	}
373 
374 	/* mac rv630, rv730, others */
375 	if ((supported_device == ATOM_DEVICE_TV1_SUPPORT) &&
376 	    (*connector_type == DRM_MODE_CONNECTOR_DVII)) {
377 		*connector_type = DRM_MODE_CONNECTOR_9PinDIN;
378 		*line_mux = CONNECTOR_7PIN_DIN_ENUM_ID1;
379 	}
380 
381 	/* ASUS HD 3600 XT board lists the DVI port as HDMI */
382 	if ((dev->pdev->device == 0x9598) &&
383 	    (dev->pdev->subsystem_vendor == 0x1043) &&
384 	    (dev->pdev->subsystem_device == 0x01da)) {
385 		if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
386 			*connector_type = DRM_MODE_CONNECTOR_DVII;
387 		}
388 	}
389 
390 	/* ASUS HD 3600 board lists the DVI port as HDMI */
391 	if ((dev->pdev->device == 0x9598) &&
392 	    (dev->pdev->subsystem_vendor == 0x1043) &&
393 	    (dev->pdev->subsystem_device == 0x01e4)) {
394 		if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
395 			*connector_type = DRM_MODE_CONNECTOR_DVII;
396 		}
397 	}
398 
399 	/* ASUS HD 3450 board lists the DVI port as HDMI */
400 	if ((dev->pdev->device == 0x95C5) &&
401 	    (dev->pdev->subsystem_vendor == 0x1043) &&
402 	    (dev->pdev->subsystem_device == 0x01e2)) {
403 		if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
404 			*connector_type = DRM_MODE_CONNECTOR_DVII;
405 		}
406 	}
407 
408 	/* some BIOSes seem to report DAC on HDMI - usually this is a board with
409 	 * HDMI + VGA reporting as HDMI
410 	 */
411 	if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
412 		if (supported_device & (ATOM_DEVICE_CRT_SUPPORT)) {
413 			*connector_type = DRM_MODE_CONNECTOR_VGA;
414 			*line_mux = 0;
415 		}
416 	}
417 
418 	/* Acer laptop (Acer TravelMate 5730/5730G) has an HDMI port
419 	 * on the laptop and a DVI port on the docking station and
420 	 * both share the same encoder, hpd pin, and ddc line.
421 	 * So while the bios table is technically correct,
422 	 * we drop the DVI port here since xrandr has no concept of
423 	 * encoders and will try and drive both connectors
424 	 * with different crtcs which isn't possible on the hardware
425 	 * side and leaves no crtcs for LVDS or VGA.
426 	 */
427 	if (((dev->pdev->device == 0x95c4) || (dev->pdev->device == 0x9591)) &&
428 	    (dev->pdev->subsystem_vendor == 0x1025) &&
429 	    (dev->pdev->subsystem_device == 0x013c)) {
430 		if ((*connector_type == DRM_MODE_CONNECTOR_DVII) &&
431 		    (supported_device == ATOM_DEVICE_DFP1_SUPPORT)) {
432 			/* actually it's a DVI-D port not DVI-I */
433 			*connector_type = DRM_MODE_CONNECTOR_DVID;
434 			return false;
435 		}
436 	}
437 
438 	/* XFX Pine Group device rv730 reports no VGA DDC lines
439 	 * even though they are wired up to record 0x93
440 	 */
441 	if ((dev->pdev->device == 0x9498) &&
442 	    (dev->pdev->subsystem_vendor == 0x1682) &&
443 	    (dev->pdev->subsystem_device == 0x2452) &&
444 	    (i2c_bus->valid == false) &&
445 	    !(supported_device & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT))) {
446 		struct radeon_device *rdev = dev->dev_private;
447 		*i2c_bus = radeon_lookup_i2c_gpio(rdev, 0x93);
448 	}
449 
450 	/* Fujitsu D3003-S2 board lists DVI-I as DVI-D and VGA */
451 	if (((dev->pdev->device == 0x9802) || (dev->pdev->device == 0x9806)) &&
452 	    (dev->pdev->subsystem_vendor == 0x1734) &&
453 	    (dev->pdev->subsystem_device == 0x11bd)) {
454 		if (*connector_type == DRM_MODE_CONNECTOR_VGA) {
455 			*connector_type = DRM_MODE_CONNECTOR_DVII;
456 			*line_mux = 0x3103;
457 		} else if (*connector_type == DRM_MODE_CONNECTOR_DVID) {
458 			*connector_type = DRM_MODE_CONNECTOR_DVII;
459 		}
460 	}
461 
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 			rdev->clock.current_dispclk = rdev->clock.default_dispclk;
1247 		}
1248 		*dcpll = *p1pll;
1249 
1250 		rdev->clock.max_pixel_clock = le16_to_cpu(firmware_info->info.usMaxPixelClock);
1251 		if (rdev->clock.max_pixel_clock == 0)
1252 			rdev->clock.max_pixel_clock = 40000;
1253 
1254 		/* not technically a clock, but... */
1255 		rdev->mode_info.firmware_flags =
1256 			le16_to_cpu(firmware_info->info.usFirmwareCapability.susAccess);
1257 
1258 		return true;
1259 	}
1260 
1261 	return false;
1262 }
1263 
1264 union igp_info {
1265 	struct _ATOM_INTEGRATED_SYSTEM_INFO info;
1266 	struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2;
1267 	struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 info_6;
1268 	struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_7 info_7;
1269 	struct _ATOM_INTEGRATED_SYSTEM_INFO_V1_8 info_8;
1270 };
1271 
1272 bool radeon_atombios_sideport_present(struct radeon_device *rdev)
1273 {
1274 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1275 	int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo);
1276 	union igp_info *igp_info;
1277 	u8 frev, crev;
1278 	u16 data_offset;
1279 
1280 	/* sideport is AMD only */
1281 	if (rdev->family == CHIP_RS600)
1282 		return false;
1283 
1284 	if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1285 				   &frev, &crev, &data_offset)) {
1286 		igp_info = (union igp_info *)(mode_info->atom_context->bios +
1287 				      data_offset);
1288 		switch (crev) {
1289 		case 1:
1290 			if (le32_to_cpu(igp_info->info.ulBootUpMemoryClock))
1291 				return true;
1292 			break;
1293 		case 2:
1294 			if (le32_to_cpu(igp_info->info_2.ulBootUpSidePortClock))
1295 				return true;
1296 			break;
1297 		default:
1298 			DRM_ERROR("Unsupported IGP table: %d %d\n", frev, crev);
1299 			break;
1300 		}
1301 	}
1302 	return false;
1303 }
1304 
1305 bool radeon_atombios_get_tmds_info(struct radeon_encoder *encoder,
1306 				   struct radeon_encoder_int_tmds *tmds)
1307 {
1308 	struct drm_device *dev = encoder->base.dev;
1309 	struct radeon_device *rdev = dev->dev_private;
1310 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1311 	int index = GetIndexIntoMasterTable(DATA, TMDS_Info);
1312 	uint16_t data_offset;
1313 	struct _ATOM_TMDS_INFO *tmds_info;
1314 	uint8_t frev, crev;
1315 	uint16_t maxfreq;
1316 	int i;
1317 
1318 	if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1319 				   &frev, &crev, &data_offset)) {
1320 		tmds_info =
1321 			(struct _ATOM_TMDS_INFO *)(mode_info->atom_context->bios +
1322 						   data_offset);
1323 
1324 		maxfreq = le16_to_cpu(tmds_info->usMaxFrequency);
1325 		for (i = 0; i < 4; i++) {
1326 			tmds->tmds_pll[i].freq =
1327 			    le16_to_cpu(tmds_info->asMiscInfo[i].usFrequency);
1328 			tmds->tmds_pll[i].value =
1329 			    tmds_info->asMiscInfo[i].ucPLL_ChargePump & 0x3f;
1330 			tmds->tmds_pll[i].value |=
1331 			    (tmds_info->asMiscInfo[i].
1332 			     ucPLL_VCO_Gain & 0x3f) << 6;
1333 			tmds->tmds_pll[i].value |=
1334 			    (tmds_info->asMiscInfo[i].
1335 			     ucPLL_DutyCycle & 0xf) << 12;
1336 			tmds->tmds_pll[i].value |=
1337 			    (tmds_info->asMiscInfo[i].
1338 			     ucPLL_VoltageSwing & 0xf) << 16;
1339 
1340 			DRM_DEBUG_KMS("TMDS PLL From ATOMBIOS %u %x\n",
1341 				  tmds->tmds_pll[i].freq,
1342 				  tmds->tmds_pll[i].value);
1343 
1344 			if (maxfreq == tmds->tmds_pll[i].freq) {
1345 				tmds->tmds_pll[i].freq = 0xffffffff;
1346 				break;
1347 			}
1348 		}
1349 		return true;
1350 	}
1351 	return false;
1352 }
1353 
1354 bool radeon_atombios_get_ppll_ss_info(struct radeon_device *rdev,
1355 				      struct radeon_atom_ss *ss,
1356 				      int id)
1357 {
1358 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1359 	int index = GetIndexIntoMasterTable(DATA, PPLL_SS_Info);
1360 	uint16_t data_offset, size;
1361 	struct _ATOM_SPREAD_SPECTRUM_INFO *ss_info;
1362 	uint8_t frev, crev;
1363 	int i, num_indices;
1364 
1365 	memset(ss, 0, sizeof(struct radeon_atom_ss));
1366 	if (atom_parse_data_header(mode_info->atom_context, index, &size,
1367 				   &frev, &crev, &data_offset)) {
1368 		ss_info =
1369 			(struct _ATOM_SPREAD_SPECTRUM_INFO *)(mode_info->atom_context->bios + data_offset);
1370 
1371 		num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1372 			sizeof(ATOM_SPREAD_SPECTRUM_ASSIGNMENT);
1373 
1374 		for (i = 0; i < num_indices; i++) {
1375 			if (ss_info->asSS_Info[i].ucSS_Id == id) {
1376 				ss->percentage =
1377 					le16_to_cpu(ss_info->asSS_Info[i].usSpreadSpectrumPercentage);
1378 				ss->type = ss_info->asSS_Info[i].ucSpreadSpectrumType;
1379 				ss->step = ss_info->asSS_Info[i].ucSS_Step;
1380 				ss->delay = ss_info->asSS_Info[i].ucSS_Delay;
1381 				ss->range = ss_info->asSS_Info[i].ucSS_Range;
1382 				ss->refdiv = ss_info->asSS_Info[i].ucRecommendedRef_Div;
1383 				return true;
1384 			}
1385 		}
1386 	}
1387 	return false;
1388 }
1389 
1390 static void radeon_atombios_get_igp_ss_overrides(struct radeon_device *rdev,
1391 						 struct radeon_atom_ss *ss,
1392 						 int id)
1393 {
1394 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1395 	int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo);
1396 	u16 data_offset, size;
1397 	union igp_info *igp_info;
1398 	u8 frev, crev;
1399 	u16 percentage = 0, rate = 0;
1400 
1401 	/* get any igp specific overrides */
1402 	if (atom_parse_data_header(mode_info->atom_context, index, &size,
1403 				   &frev, &crev, &data_offset)) {
1404 		igp_info = (union igp_info *)
1405 			(mode_info->atom_context->bios + data_offset);
1406 		switch (crev) {
1407 		case 6:
1408 			switch (id) {
1409 			case ASIC_INTERNAL_SS_ON_TMDS:
1410 				percentage = le16_to_cpu(igp_info->info_6.usDVISSPercentage);
1411 				rate = le16_to_cpu(igp_info->info_6.usDVISSpreadRateIn10Hz);
1412 				break;
1413 			case ASIC_INTERNAL_SS_ON_HDMI:
1414 				percentage = le16_to_cpu(igp_info->info_6.usHDMISSPercentage);
1415 				rate = le16_to_cpu(igp_info->info_6.usHDMISSpreadRateIn10Hz);
1416 				break;
1417 			case ASIC_INTERNAL_SS_ON_LVDS:
1418 				percentage = le16_to_cpu(igp_info->info_6.usLvdsSSPercentage);
1419 				rate = le16_to_cpu(igp_info->info_6.usLvdsSSpreadRateIn10Hz);
1420 				break;
1421 			}
1422 			break;
1423 		case 7:
1424 			switch (id) {
1425 			case ASIC_INTERNAL_SS_ON_TMDS:
1426 				percentage = le16_to_cpu(igp_info->info_7.usDVISSPercentage);
1427 				rate = le16_to_cpu(igp_info->info_7.usDVISSpreadRateIn10Hz);
1428 				break;
1429 			case ASIC_INTERNAL_SS_ON_HDMI:
1430 				percentage = le16_to_cpu(igp_info->info_7.usHDMISSPercentage);
1431 				rate = le16_to_cpu(igp_info->info_7.usHDMISSpreadRateIn10Hz);
1432 				break;
1433 			case ASIC_INTERNAL_SS_ON_LVDS:
1434 				percentage = le16_to_cpu(igp_info->info_7.usLvdsSSPercentage);
1435 				rate = le16_to_cpu(igp_info->info_7.usLvdsSSpreadRateIn10Hz);
1436 				break;
1437 			}
1438 			break;
1439 		case 8:
1440 			switch (id) {
1441 			case ASIC_INTERNAL_SS_ON_TMDS:
1442 				percentage = le16_to_cpu(igp_info->info_8.usDVISSPercentage);
1443 				rate = le16_to_cpu(igp_info->info_8.usDVISSpreadRateIn10Hz);
1444 				break;
1445 			case ASIC_INTERNAL_SS_ON_HDMI:
1446 				percentage = le16_to_cpu(igp_info->info_8.usHDMISSPercentage);
1447 				rate = le16_to_cpu(igp_info->info_8.usHDMISSpreadRateIn10Hz);
1448 				break;
1449 			case ASIC_INTERNAL_SS_ON_LVDS:
1450 				percentage = le16_to_cpu(igp_info->info_8.usLvdsSSPercentage);
1451 				rate = le16_to_cpu(igp_info->info_8.usLvdsSSpreadRateIn10Hz);
1452 				break;
1453 			}
1454 			break;
1455 		default:
1456 			DRM_ERROR("Unsupported IGP table: %d %d\n", frev, crev);
1457 			break;
1458 		}
1459 		if (percentage)
1460 			ss->percentage = percentage;
1461 		if (rate)
1462 			ss->rate = rate;
1463 	}
1464 }
1465 
1466 union asic_ss_info {
1467 	struct _ATOM_ASIC_INTERNAL_SS_INFO info;
1468 	struct _ATOM_ASIC_INTERNAL_SS_INFO_V2 info_2;
1469 	struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 info_3;
1470 };
1471 
1472 bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev,
1473 				      struct radeon_atom_ss *ss,
1474 				      int id, u32 clock)
1475 {
1476 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1477 	int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info);
1478 	uint16_t data_offset, size;
1479 	union asic_ss_info *ss_info;
1480 	uint8_t frev, crev;
1481 	int i, num_indices;
1482 
1483 	memset(ss, 0, sizeof(struct radeon_atom_ss));
1484 	if (atom_parse_data_header(mode_info->atom_context, index, &size,
1485 				   &frev, &crev, &data_offset)) {
1486 
1487 		ss_info =
1488 			(union asic_ss_info *)(mode_info->atom_context->bios + data_offset);
1489 
1490 		switch (frev) {
1491 		case 1:
1492 			num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1493 				sizeof(ATOM_ASIC_SS_ASSIGNMENT);
1494 
1495 			for (i = 0; i < num_indices; i++) {
1496 				if ((ss_info->info.asSpreadSpectrum[i].ucClockIndication == id) &&
1497 				    (clock <= le32_to_cpu(ss_info->info.asSpreadSpectrum[i].ulTargetClockRange))) {
1498 					ss->percentage =
1499 						le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1500 					ss->type = ss_info->info.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1501 					ss->rate = le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadRateInKhz);
1502 					return true;
1503 				}
1504 			}
1505 			break;
1506 		case 2:
1507 			num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1508 				sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2);
1509 			for (i = 0; i < num_indices; i++) {
1510 				if ((ss_info->info_2.asSpreadSpectrum[i].ucClockIndication == id) &&
1511 				    (clock <= le32_to_cpu(ss_info->info_2.asSpreadSpectrum[i].ulTargetClockRange))) {
1512 					ss->percentage =
1513 						le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1514 					ss->type = ss_info->info_2.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1515 					ss->rate = le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadRateIn10Hz);
1516 					if ((crev == 2) &&
1517 					    ((id == ASIC_INTERNAL_ENGINE_SS) ||
1518 					     (id == ASIC_INTERNAL_MEMORY_SS)))
1519 						ss->rate /= 100;
1520 					return true;
1521 				}
1522 			}
1523 			break;
1524 		case 3:
1525 			num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1526 				sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3);
1527 			for (i = 0; i < num_indices; i++) {
1528 				if ((ss_info->info_3.asSpreadSpectrum[i].ucClockIndication == id) &&
1529 				    (clock <= le32_to_cpu(ss_info->info_3.asSpreadSpectrum[i].ulTargetClockRange))) {
1530 					ss->percentage =
1531 						le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1532 					ss->type = ss_info->info_3.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1533 					ss->rate = le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadRateIn10Hz);
1534 					if ((id == ASIC_INTERNAL_ENGINE_SS) ||
1535 					    (id == ASIC_INTERNAL_MEMORY_SS))
1536 						ss->rate /= 100;
1537 					if (rdev->flags & RADEON_IS_IGP)
1538 						radeon_atombios_get_igp_ss_overrides(rdev, ss, id);
1539 					return true;
1540 				}
1541 			}
1542 			break;
1543 		default:
1544 			DRM_ERROR("Unsupported ASIC_InternalSS_Info table: %d %d\n", frev, crev);
1545 			break;
1546 		}
1547 
1548 	}
1549 	return false;
1550 }
1551 
1552 union lvds_info {
1553 	struct _ATOM_LVDS_INFO info;
1554 	struct _ATOM_LVDS_INFO_V12 info_12;
1555 };
1556 
1557 struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct
1558 							      radeon_encoder
1559 							      *encoder)
1560 {
1561 	struct drm_device *dev = encoder->base.dev;
1562 	struct radeon_device *rdev = dev->dev_private;
1563 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1564 	int index = GetIndexIntoMasterTable(DATA, LVDS_Info);
1565 	uint16_t data_offset, misc;
1566 	union lvds_info *lvds_info;
1567 	uint8_t frev, crev;
1568 	struct radeon_encoder_atom_dig *lvds = NULL;
1569 	int encoder_enum = (encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
1570 
1571 	if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1572 				   &frev, &crev, &data_offset)) {
1573 		lvds_info =
1574 			(union lvds_info *)(mode_info->atom_context->bios + data_offset);
1575 		lvds =
1576 		    kzalloc(sizeof(struct radeon_encoder_atom_dig), GFP_KERNEL);
1577 
1578 		if (!lvds)
1579 			return NULL;
1580 
1581 		lvds->native_mode.clock =
1582 		    le16_to_cpu(lvds_info->info.sLCDTiming.usPixClk) * 10;
1583 		lvds->native_mode.hdisplay =
1584 		    le16_to_cpu(lvds_info->info.sLCDTiming.usHActive);
1585 		lvds->native_mode.vdisplay =
1586 		    le16_to_cpu(lvds_info->info.sLCDTiming.usVActive);
1587 		lvds->native_mode.htotal = lvds->native_mode.hdisplay +
1588 			le16_to_cpu(lvds_info->info.sLCDTiming.usHBlanking_Time);
1589 		lvds->native_mode.hsync_start = lvds->native_mode.hdisplay +
1590 			le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncOffset);
1591 		lvds->native_mode.hsync_end = lvds->native_mode.hsync_start +
1592 			le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncWidth);
1593 		lvds->native_mode.vtotal = lvds->native_mode.vdisplay +
1594 			le16_to_cpu(lvds_info->info.sLCDTiming.usVBlanking_Time);
1595 		lvds->native_mode.vsync_start = lvds->native_mode.vdisplay +
1596 			le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncOffset);
1597 		lvds->native_mode.vsync_end = lvds->native_mode.vsync_start +
1598 			le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncWidth);
1599 		lvds->panel_pwr_delay =
1600 		    le16_to_cpu(lvds_info->info.usOffDelayInMs);
1601 		lvds->lcd_misc = lvds_info->info.ucLVDS_Misc;
1602 
1603 		misc = le16_to_cpu(lvds_info->info.sLCDTiming.susModeMiscInfo.usAccess);
1604 		if (misc & ATOM_VSYNC_POLARITY)
1605 			lvds->native_mode.flags |= DRM_MODE_FLAG_NVSYNC;
1606 		if (misc & ATOM_HSYNC_POLARITY)
1607 			lvds->native_mode.flags |= DRM_MODE_FLAG_NHSYNC;
1608 		if (misc & ATOM_COMPOSITESYNC)
1609 			lvds->native_mode.flags |= DRM_MODE_FLAG_CSYNC;
1610 		if (misc & ATOM_INTERLACE)
1611 			lvds->native_mode.flags |= DRM_MODE_FLAG_INTERLACE;
1612 		if (misc & ATOM_DOUBLE_CLOCK_MODE)
1613 			lvds->native_mode.flags |= DRM_MODE_FLAG_DBLSCAN;
1614 
1615 		lvds->native_mode.width_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageHSize);
1616 		lvds->native_mode.height_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageVSize);
1617 
1618 		/* set crtc values */
1619 		drm_mode_set_crtcinfo(&lvds->native_mode, CRTC_INTERLACE_HALVE_V);
1620 
1621 		lvds->lcd_ss_id = lvds_info->info.ucSS_Id;
1622 
1623 		encoder->native_mode = lvds->native_mode;
1624 
1625 		if (encoder_enum == 2)
1626 			lvds->linkb = true;
1627 		else
1628 			lvds->linkb = false;
1629 
1630 		/* parse the lcd record table */
1631 		if (le16_to_cpu(lvds_info->info.usModePatchTableOffset)) {
1632 			ATOM_FAKE_EDID_PATCH_RECORD *fake_edid_record;
1633 			ATOM_PANEL_RESOLUTION_PATCH_RECORD *panel_res_record;
1634 			bool bad_record = false;
1635 			u8 *record;
1636 
1637 			if ((frev == 1) && (crev < 2))
1638 				/* absolute */
1639 				record = (u8 *)(mode_info->atom_context->bios +
1640 						le16_to_cpu(lvds_info->info.usModePatchTableOffset));
1641 			else
1642 				/* relative */
1643 				record = (u8 *)(mode_info->atom_context->bios +
1644 						data_offset +
1645 						le16_to_cpu(lvds_info->info.usModePatchTableOffset));
1646 			while (*record != ATOM_RECORD_END_TYPE) {
1647 				switch (*record) {
1648 				case LCD_MODE_PATCH_RECORD_MODE_TYPE:
1649 					record += sizeof(ATOM_PATCH_RECORD_MODE);
1650 					break;
1651 				case LCD_RTS_RECORD_TYPE:
1652 					record += sizeof(ATOM_LCD_RTS_RECORD);
1653 					break;
1654 				case LCD_CAP_RECORD_TYPE:
1655 					record += sizeof(ATOM_LCD_MODE_CONTROL_CAP);
1656 					break;
1657 				case LCD_FAKE_EDID_PATCH_RECORD_TYPE:
1658 					fake_edid_record = (ATOM_FAKE_EDID_PATCH_RECORD *)record;
1659 					if (fake_edid_record->ucFakeEDIDLength) {
1660 						struct edid *edid;
1661 						int edid_size =
1662 							max((int)EDID_LENGTH, (int)fake_edid_record->ucFakeEDIDLength);
1663 						edid = kmalloc(edid_size, GFP_KERNEL);
1664 						if (edid) {
1665 							memcpy((u8 *)edid, (u8 *)&fake_edid_record->ucFakeEDIDString[0],
1666 							       fake_edid_record->ucFakeEDIDLength);
1667 
1668 							if (drm_edid_is_valid(edid)) {
1669 								rdev->mode_info.bios_hardcoded_edid = edid;
1670 								rdev->mode_info.bios_hardcoded_edid_size = edid_size;
1671 							} else
1672 								kfree(edid);
1673 						}
1674 					}
1675 					record += sizeof(ATOM_FAKE_EDID_PATCH_RECORD);
1676 					break;
1677 				case LCD_PANEL_RESOLUTION_RECORD_TYPE:
1678 					panel_res_record = (ATOM_PANEL_RESOLUTION_PATCH_RECORD *)record;
1679 					lvds->native_mode.width_mm = panel_res_record->usHSize;
1680 					lvds->native_mode.height_mm = panel_res_record->usVSize;
1681 					record += sizeof(ATOM_PANEL_RESOLUTION_PATCH_RECORD);
1682 					break;
1683 				default:
1684 					DRM_ERROR("Bad LCD record %d\n", *record);
1685 					bad_record = true;
1686 					break;
1687 				}
1688 				if (bad_record)
1689 					break;
1690 			}
1691 		}
1692 	}
1693 	return lvds;
1694 }
1695 
1696 struct radeon_encoder_primary_dac *
1697 radeon_atombios_get_primary_dac_info(struct radeon_encoder *encoder)
1698 {
1699 	struct drm_device *dev = encoder->base.dev;
1700 	struct radeon_device *rdev = dev->dev_private;
1701 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1702 	int index = GetIndexIntoMasterTable(DATA, CompassionateData);
1703 	uint16_t data_offset;
1704 	struct _COMPASSIONATE_DATA *dac_info;
1705 	uint8_t frev, crev;
1706 	uint8_t bg, dac;
1707 	struct radeon_encoder_primary_dac *p_dac = NULL;
1708 
1709 	if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1710 				   &frev, &crev, &data_offset)) {
1711 		dac_info = (struct _COMPASSIONATE_DATA *)
1712 			(mode_info->atom_context->bios + data_offset);
1713 
1714 		p_dac = kzalloc(sizeof(struct radeon_encoder_primary_dac), GFP_KERNEL);
1715 
1716 		if (!p_dac)
1717 			return NULL;
1718 
1719 		bg = dac_info->ucDAC1_BG_Adjustment;
1720 		dac = dac_info->ucDAC1_DAC_Adjustment;
1721 		p_dac->ps2_pdac_adj = (bg << 8) | (dac);
1722 
1723 	}
1724 	return p_dac;
1725 }
1726 
1727 bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index,
1728 				struct drm_display_mode *mode)
1729 {
1730 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1731 	ATOM_ANALOG_TV_INFO *tv_info;
1732 	ATOM_ANALOG_TV_INFO_V1_2 *tv_info_v1_2;
1733 	ATOM_DTD_FORMAT *dtd_timings;
1734 	int data_index = GetIndexIntoMasterTable(DATA, AnalogTV_Info);
1735 	u8 frev, crev;
1736 	u16 data_offset, misc;
1737 
1738 	if (!atom_parse_data_header(mode_info->atom_context, data_index, NULL,
1739 				    &frev, &crev, &data_offset))
1740 		return false;
1741 
1742 	switch (crev) {
1743 	case 1:
1744 		tv_info = (ATOM_ANALOG_TV_INFO *)(mode_info->atom_context->bios + data_offset);
1745 		if (index >= MAX_SUPPORTED_TV_TIMING)
1746 			return false;
1747 
1748 		mode->crtc_htotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Total);
1749 		mode->crtc_hdisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Disp);
1750 		mode->crtc_hsync_start = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart);
1751 		mode->crtc_hsync_end = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart) +
1752 			le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncWidth);
1753 
1754 		mode->crtc_vtotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Total);
1755 		mode->crtc_vdisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Disp);
1756 		mode->crtc_vsync_start = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart);
1757 		mode->crtc_vsync_end = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart) +
1758 			le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncWidth);
1759 
1760 		mode->flags = 0;
1761 		misc = le16_to_cpu(tv_info->aModeTimings[index].susModeMiscInfo.usAccess);
1762 		if (misc & ATOM_VSYNC_POLARITY)
1763 			mode->flags |= DRM_MODE_FLAG_NVSYNC;
1764 		if (misc & ATOM_HSYNC_POLARITY)
1765 			mode->flags |= DRM_MODE_FLAG_NHSYNC;
1766 		if (misc & ATOM_COMPOSITESYNC)
1767 			mode->flags |= DRM_MODE_FLAG_CSYNC;
1768 		if (misc & ATOM_INTERLACE)
1769 			mode->flags |= DRM_MODE_FLAG_INTERLACE;
1770 		if (misc & ATOM_DOUBLE_CLOCK_MODE)
1771 			mode->flags |= DRM_MODE_FLAG_DBLSCAN;
1772 
1773 		mode->clock = le16_to_cpu(tv_info->aModeTimings[index].usPixelClock) * 10;
1774 
1775 		if (index == 1) {
1776 			/* PAL timings appear to have wrong values for totals */
1777 			mode->crtc_htotal -= 1;
1778 			mode->crtc_vtotal -= 1;
1779 		}
1780 		break;
1781 	case 2:
1782 		tv_info_v1_2 = (ATOM_ANALOG_TV_INFO_V1_2 *)(mode_info->atom_context->bios + data_offset);
1783 		if (index >= MAX_SUPPORTED_TV_TIMING_V1_2)
1784 			return false;
1785 
1786 		dtd_timings = &tv_info_v1_2->aModeTimings[index];
1787 		mode->crtc_htotal = le16_to_cpu(dtd_timings->usHActive) +
1788 			le16_to_cpu(dtd_timings->usHBlanking_Time);
1789 		mode->crtc_hdisplay = le16_to_cpu(dtd_timings->usHActive);
1790 		mode->crtc_hsync_start = le16_to_cpu(dtd_timings->usHActive) +
1791 			le16_to_cpu(dtd_timings->usHSyncOffset);
1792 		mode->crtc_hsync_end = mode->crtc_hsync_start +
1793 			le16_to_cpu(dtd_timings->usHSyncWidth);
1794 
1795 		mode->crtc_vtotal = le16_to_cpu(dtd_timings->usVActive) +
1796 			le16_to_cpu(dtd_timings->usVBlanking_Time);
1797 		mode->crtc_vdisplay = le16_to_cpu(dtd_timings->usVActive);
1798 		mode->crtc_vsync_start = le16_to_cpu(dtd_timings->usVActive) +
1799 			le16_to_cpu(dtd_timings->usVSyncOffset);
1800 		mode->crtc_vsync_end = mode->crtc_vsync_start +
1801 			le16_to_cpu(dtd_timings->usVSyncWidth);
1802 
1803 		mode->flags = 0;
1804 		misc = le16_to_cpu(dtd_timings->susModeMiscInfo.usAccess);
1805 		if (misc & ATOM_VSYNC_POLARITY)
1806 			mode->flags |= DRM_MODE_FLAG_NVSYNC;
1807 		if (misc & ATOM_HSYNC_POLARITY)
1808 			mode->flags |= DRM_MODE_FLAG_NHSYNC;
1809 		if (misc & ATOM_COMPOSITESYNC)
1810 			mode->flags |= DRM_MODE_FLAG_CSYNC;
1811 		if (misc & ATOM_INTERLACE)
1812 			mode->flags |= DRM_MODE_FLAG_INTERLACE;
1813 		if (misc & ATOM_DOUBLE_CLOCK_MODE)
1814 			mode->flags |= DRM_MODE_FLAG_DBLSCAN;
1815 
1816 		mode->clock = le16_to_cpu(dtd_timings->usPixClk) * 10;
1817 		break;
1818 	}
1819 	return true;
1820 }
1821 
1822 enum radeon_tv_std
1823 radeon_atombios_get_tv_info(struct radeon_device *rdev)
1824 {
1825 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1826 	int index = GetIndexIntoMasterTable(DATA, AnalogTV_Info);
1827 	uint16_t data_offset;
1828 	uint8_t frev, crev;
1829 	struct _ATOM_ANALOG_TV_INFO *tv_info;
1830 	enum radeon_tv_std tv_std = TV_STD_NTSC;
1831 
1832 	if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1833 				   &frev, &crev, &data_offset)) {
1834 
1835 		tv_info = (struct _ATOM_ANALOG_TV_INFO *)
1836 			(mode_info->atom_context->bios + data_offset);
1837 
1838 		switch (tv_info->ucTV_BootUpDefaultStandard) {
1839 		case ATOM_TV_NTSC:
1840 			tv_std = TV_STD_NTSC;
1841 			DRM_DEBUG_KMS("Default TV standard: NTSC\n");
1842 			break;
1843 		case ATOM_TV_NTSCJ:
1844 			tv_std = TV_STD_NTSC_J;
1845 			DRM_DEBUG_KMS("Default TV standard: NTSC-J\n");
1846 			break;
1847 		case ATOM_TV_PAL:
1848 			tv_std = TV_STD_PAL;
1849 			DRM_DEBUG_KMS("Default TV standard: PAL\n");
1850 			break;
1851 		case ATOM_TV_PALM:
1852 			tv_std = TV_STD_PAL_M;
1853 			DRM_DEBUG_KMS("Default TV standard: PAL-M\n");
1854 			break;
1855 		case ATOM_TV_PALN:
1856 			tv_std = TV_STD_PAL_N;
1857 			DRM_DEBUG_KMS("Default TV standard: PAL-N\n");
1858 			break;
1859 		case ATOM_TV_PALCN:
1860 			tv_std = TV_STD_PAL_CN;
1861 			DRM_DEBUG_KMS("Default TV standard: PAL-CN\n");
1862 			break;
1863 		case ATOM_TV_PAL60:
1864 			tv_std = TV_STD_PAL_60;
1865 			DRM_DEBUG_KMS("Default TV standard: PAL-60\n");
1866 			break;
1867 		case ATOM_TV_SECAM:
1868 			tv_std = TV_STD_SECAM;
1869 			DRM_DEBUG_KMS("Default TV standard: SECAM\n");
1870 			break;
1871 		default:
1872 			tv_std = TV_STD_NTSC;
1873 			DRM_DEBUG_KMS("Unknown TV standard; defaulting to NTSC\n");
1874 			break;
1875 		}
1876 	}
1877 	return tv_std;
1878 }
1879 
1880 struct radeon_encoder_tv_dac *
1881 radeon_atombios_get_tv_dac_info(struct radeon_encoder *encoder)
1882 {
1883 	struct drm_device *dev = encoder->base.dev;
1884 	struct radeon_device *rdev = dev->dev_private;
1885 	struct radeon_mode_info *mode_info = &rdev->mode_info;
1886 	int index = GetIndexIntoMasterTable(DATA, CompassionateData);
1887 	uint16_t data_offset;
1888 	struct _COMPASSIONATE_DATA *dac_info;
1889 	uint8_t frev, crev;
1890 	uint8_t bg, dac;
1891 	struct radeon_encoder_tv_dac *tv_dac = NULL;
1892 
1893 	if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1894 				   &frev, &crev, &data_offset)) {
1895 
1896 		dac_info = (struct _COMPASSIONATE_DATA *)
1897 			(mode_info->atom_context->bios + data_offset);
1898 
1899 		tv_dac = kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL);
1900 
1901 		if (!tv_dac)
1902 			return NULL;
1903 
1904 		bg = dac_info->ucDAC2_CRT2_BG_Adjustment;
1905 		dac = dac_info->ucDAC2_CRT2_DAC_Adjustment;
1906 		tv_dac->ps2_tvdac_adj = (bg << 16) | (dac << 20);
1907 
1908 		bg = dac_info->ucDAC2_PAL_BG_Adjustment;
1909 		dac = dac_info->ucDAC2_PAL_DAC_Adjustment;
1910 		tv_dac->pal_tvdac_adj = (bg << 16) | (dac << 20);
1911 
1912 		bg = dac_info->ucDAC2_NTSC_BG_Adjustment;
1913 		dac = dac_info->ucDAC2_NTSC_DAC_Adjustment;
1914 		tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20);
1915 
1916 		tv_dac->tv_std = radeon_atombios_get_tv_info(rdev);
1917 	}
1918 	return tv_dac;
1919 }
1920 
1921 static const char *thermal_controller_names[] = {
1922 	"NONE",
1923 	"lm63",
1924 	"adm1032",
1925 	"adm1030",
1926 	"max6649",
1927 	"lm64",
1928 	"f75375",
1929 	"asc7xxx",
1930 };
1931 
1932 static const char *pp_lib_thermal_controller_names[] = {
1933 	"NONE",
1934 	"lm63",
1935 	"adm1032",
1936 	"adm1030",
1937 	"max6649",
1938 	"lm64",
1939 	"f75375",
1940 	"RV6xx",
1941 	"RV770",
1942 	"adt7473",
1943 	"NONE",
1944 	"External GPIO",
1945 	"Evergreen",
1946 	"emc2103",
1947 	"Sumo",
1948 	"Northern Islands",
1949 	"Southern Islands",
1950 	"lm96163",
1951 	"Sea Islands",
1952 };
1953 
1954 union power_info {
1955 	struct _ATOM_POWERPLAY_INFO info;
1956 	struct _ATOM_POWERPLAY_INFO_V2 info_2;
1957 	struct _ATOM_POWERPLAY_INFO_V3 info_3;
1958 	struct _ATOM_PPLIB_POWERPLAYTABLE pplib;
1959 	struct _ATOM_PPLIB_POWERPLAYTABLE2 pplib2;
1960 	struct _ATOM_PPLIB_POWERPLAYTABLE3 pplib3;
1961 };
1962 
1963 union pplib_clock_info {
1964 	struct _ATOM_PPLIB_R600_CLOCK_INFO r600;
1965 	struct _ATOM_PPLIB_RS780_CLOCK_INFO rs780;
1966 	struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO evergreen;
1967 	struct _ATOM_PPLIB_SUMO_CLOCK_INFO sumo;
1968 	struct _ATOM_PPLIB_SI_CLOCK_INFO si;
1969 	struct _ATOM_PPLIB_CI_CLOCK_INFO ci;
1970 };
1971 
1972 union pplib_power_state {
1973 	struct _ATOM_PPLIB_STATE v1;
1974 	struct _ATOM_PPLIB_STATE_V2 v2;
1975 };
1976 
1977 static void radeon_atombios_parse_misc_flags_1_3(struct radeon_device *rdev,
1978 						 int state_index,
1979 						 u32 misc, u32 misc2)
1980 {
1981 	rdev->pm.power_state[state_index].misc = misc;
1982 	rdev->pm.power_state[state_index].misc2 = misc2;
1983 	/* order matters! */
1984 	if (misc & ATOM_PM_MISCINFO_POWER_SAVING_MODE)
1985 		rdev->pm.power_state[state_index].type =
1986 			POWER_STATE_TYPE_POWERSAVE;
1987 	if (misc & ATOM_PM_MISCINFO_DEFAULT_DC_STATE_ENTRY_TRUE)
1988 		rdev->pm.power_state[state_index].type =
1989 			POWER_STATE_TYPE_BATTERY;
1990 	if (misc & ATOM_PM_MISCINFO_DEFAULT_LOW_DC_STATE_ENTRY_TRUE)
1991 		rdev->pm.power_state[state_index].type =
1992 			POWER_STATE_TYPE_BATTERY;
1993 	if (misc & ATOM_PM_MISCINFO_LOAD_BALANCE_EN)
1994 		rdev->pm.power_state[state_index].type =
1995 			POWER_STATE_TYPE_BALANCED;
1996 	if (misc & ATOM_PM_MISCINFO_3D_ACCELERATION_EN) {
1997 		rdev->pm.power_state[state_index].type =
1998 			POWER_STATE_TYPE_PERFORMANCE;
1999 		rdev->pm.power_state[state_index].flags &=
2000 			~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2001 	}
2002 	if (misc2 & ATOM_PM_MISCINFO2_SYSTEM_AC_LITE_MODE)
2003 		rdev->pm.power_state[state_index].type =
2004 			POWER_STATE_TYPE_BALANCED;
2005 	if (misc & ATOM_PM_MISCINFO_DRIVER_DEFAULT_MODE) {
2006 		rdev->pm.power_state[state_index].type =
2007 			POWER_STATE_TYPE_DEFAULT;
2008 		rdev->pm.default_power_state_index = state_index;
2009 		rdev->pm.power_state[state_index].default_clock_mode =
2010 			&rdev->pm.power_state[state_index].clock_info[0];
2011 	} else if (state_index == 0) {
2012 		rdev->pm.power_state[state_index].clock_info[0].flags |=
2013 			RADEON_PM_MODE_NO_DISPLAY;
2014 	}
2015 }
2016 
2017 static int radeon_atombios_parse_power_table_1_3(struct radeon_device *rdev)
2018 {
2019 	struct radeon_mode_info *mode_info = &rdev->mode_info;
2020 	u32 misc, misc2 = 0;
2021 	int num_modes = 0, i;
2022 	int state_index = 0;
2023 	struct radeon_i2c_bus_rec i2c_bus;
2024 	union power_info *power_info;
2025 	int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2026         u16 data_offset;
2027 	u8 frev, crev;
2028 
2029 	if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2030 				   &frev, &crev, &data_offset))
2031 		return state_index;
2032 	power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2033 
2034 	/* add the i2c bus for thermal/fan chip */
2035 	if ((power_info->info.ucOverdriveThermalController > 0) &&
2036 	    (power_info->info.ucOverdriveThermalController < ARRAY_SIZE(thermal_controller_names))) {
2037 		DRM_INFO("Possible %s thermal controller at 0x%02x\n",
2038 			 thermal_controller_names[power_info->info.ucOverdriveThermalController],
2039 			 power_info->info.ucOverdriveControllerAddress >> 1);
2040 		i2c_bus = radeon_lookup_i2c_gpio(rdev, power_info->info.ucOverdriveI2cLine);
2041 		rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
2042 		if (rdev->pm.i2c_bus) {
2043 			struct i2c_board_info info = { };
2044 			const char *name = thermal_controller_names[power_info->info.
2045 								    ucOverdriveThermalController];
2046 			info.addr = power_info->info.ucOverdriveControllerAddress >> 1;
2047 			strlcpy(info.type, name, sizeof(info.type));
2048 			i2c_new_device(&rdev->pm.i2c_bus->adapter, &info);
2049 		}
2050 	}
2051 	num_modes = power_info->info.ucNumOfPowerModeEntries;
2052 	if (num_modes > ATOM_MAX_NUMBEROF_POWER_BLOCK)
2053 		num_modes = ATOM_MAX_NUMBEROF_POWER_BLOCK;
2054 	if (num_modes == 0)
2055 		return state_index;
2056 	rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) * num_modes, GFP_KERNEL);
2057 	if (!rdev->pm.power_state)
2058 		return state_index;
2059 	/* last mode is usually default, array is low to high */
2060 	for (i = 0; i < num_modes; i++) {
2061 		rdev->pm.power_state[state_index].clock_info =
2062 			kzalloc(sizeof(struct radeon_pm_clock_info) * 1, GFP_KERNEL);
2063 		if (!rdev->pm.power_state[state_index].clock_info)
2064 			return state_index;
2065 		rdev->pm.power_state[state_index].num_clock_modes = 1;
2066 		rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
2067 		switch (frev) {
2068 		case 1:
2069 			rdev->pm.power_state[state_index].clock_info[0].mclk =
2070 				le16_to_cpu(power_info->info.asPowerPlayInfo[i].usMemoryClock);
2071 			rdev->pm.power_state[state_index].clock_info[0].sclk =
2072 				le16_to_cpu(power_info->info.asPowerPlayInfo[i].usEngineClock);
2073 			/* skip invalid modes */
2074 			if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2075 			    (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2076 				continue;
2077 			rdev->pm.power_state[state_index].pcie_lanes =
2078 				power_info->info.asPowerPlayInfo[i].ucNumPciELanes;
2079 			misc = le32_to_cpu(power_info->info.asPowerPlayInfo[i].ulMiscInfo);
2080 			if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2081 			    (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2082 				rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2083 					VOLTAGE_GPIO;
2084 				rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2085 					radeon_lookup_gpio(rdev,
2086 							   power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex);
2087 				if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2088 					rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2089 						true;
2090 				else
2091 					rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2092 						false;
2093 			} else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2094 				rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2095 					VOLTAGE_VDDC;
2096 				rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2097 					power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex;
2098 			}
2099 			rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2100 			radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, 0);
2101 			state_index++;
2102 			break;
2103 		case 2:
2104 			rdev->pm.power_state[state_index].clock_info[0].mclk =
2105 				le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMemoryClock);
2106 			rdev->pm.power_state[state_index].clock_info[0].sclk =
2107 				le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulEngineClock);
2108 			/* skip invalid modes */
2109 			if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2110 			    (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2111 				continue;
2112 			rdev->pm.power_state[state_index].pcie_lanes =
2113 				power_info->info_2.asPowerPlayInfo[i].ucNumPciELanes;
2114 			misc = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo);
2115 			misc2 = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo2);
2116 			if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2117 			    (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2118 				rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2119 					VOLTAGE_GPIO;
2120 				rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2121 					radeon_lookup_gpio(rdev,
2122 							   power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex);
2123 				if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2124 					rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2125 						true;
2126 				else
2127 					rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2128 						false;
2129 			} else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2130 				rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2131 					VOLTAGE_VDDC;
2132 				rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2133 					power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex;
2134 			}
2135 			rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2136 			radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, misc2);
2137 			state_index++;
2138 			break;
2139 		case 3:
2140 			rdev->pm.power_state[state_index].clock_info[0].mclk =
2141 				le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMemoryClock);
2142 			rdev->pm.power_state[state_index].clock_info[0].sclk =
2143 				le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulEngineClock);
2144 			/* skip invalid modes */
2145 			if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2146 			    (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2147 				continue;
2148 			rdev->pm.power_state[state_index].pcie_lanes =
2149 				power_info->info_3.asPowerPlayInfo[i].ucNumPciELanes;
2150 			misc = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo);
2151 			misc2 = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo2);
2152 			if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2153 			    (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2154 				rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2155 					VOLTAGE_GPIO;
2156 				rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2157 					radeon_lookup_gpio(rdev,
2158 							   power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex);
2159 				if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2160 					rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2161 						true;
2162 				else
2163 					rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2164 						false;
2165 			} else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2166 				rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2167 					VOLTAGE_VDDC;
2168 				rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2169 					power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex;
2170 				if (misc2 & ATOM_PM_MISCINFO2_VDDCI_DYNAMIC_VOLTAGE_EN) {
2171 					rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_enabled =
2172 						true;
2173 					rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_id =
2174 						power_info->info_3.asPowerPlayInfo[i].ucVDDCI_VoltageDropIndex;
2175 				}
2176 			}
2177 			rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2178 			radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, misc2);
2179 			state_index++;
2180 			break;
2181 		}
2182 	}
2183 	/* last mode is usually default */
2184 	if (rdev->pm.default_power_state_index == -1) {
2185 		rdev->pm.power_state[state_index - 1].type =
2186 			POWER_STATE_TYPE_DEFAULT;
2187 		rdev->pm.default_power_state_index = state_index - 1;
2188 		rdev->pm.power_state[state_index - 1].default_clock_mode =
2189 			&rdev->pm.power_state[state_index - 1].clock_info[0];
2190 		rdev->pm.power_state[state_index].flags &=
2191 			~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2192 		rdev->pm.power_state[state_index].misc = 0;
2193 		rdev->pm.power_state[state_index].misc2 = 0;
2194 	}
2195 	return state_index;
2196 }
2197 
2198 static void radeon_atombios_add_pplib_thermal_controller(struct radeon_device *rdev,
2199 							 ATOM_PPLIB_THERMALCONTROLLER *controller)
2200 {
2201 	struct radeon_i2c_bus_rec i2c_bus;
2202 
2203 	/* add the i2c bus for thermal/fan chip */
2204 	if (controller->ucType > 0) {
2205 		if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV6xx) {
2206 			DRM_INFO("Internal thermal controller %s fan control\n",
2207 				 (controller->ucFanParameters &
2208 				  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2209 			rdev->pm.int_thermal_type = THERMAL_TYPE_RV6XX;
2210 		} else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV770) {
2211 			DRM_INFO("Internal thermal controller %s fan control\n",
2212 				 (controller->ucFanParameters &
2213 				  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2214 			rdev->pm.int_thermal_type = THERMAL_TYPE_RV770;
2215 		} else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_EVERGREEN) {
2216 			DRM_INFO("Internal thermal controller %s fan control\n",
2217 				 (controller->ucFanParameters &
2218 				  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2219 			rdev->pm.int_thermal_type = THERMAL_TYPE_EVERGREEN;
2220 		} else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_SUMO) {
2221 			DRM_INFO("Internal thermal controller %s fan control\n",
2222 				 (controller->ucFanParameters &
2223 				  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2224 			rdev->pm.int_thermal_type = THERMAL_TYPE_SUMO;
2225 		} else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_NISLANDS) {
2226 			DRM_INFO("Internal thermal controller %s fan control\n",
2227 				 (controller->ucFanParameters &
2228 				  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2229 			rdev->pm.int_thermal_type = THERMAL_TYPE_NI;
2230 		} else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_SISLANDS) {
2231 			DRM_INFO("Internal thermal controller %s fan control\n",
2232 				 (controller->ucFanParameters &
2233 				  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2234 			rdev->pm.int_thermal_type = THERMAL_TYPE_SI;
2235 		} else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_CISLANDS) {
2236 			DRM_INFO("Internal thermal controller %s fan control\n",
2237 				 (controller->ucFanParameters &
2238 				  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2239 			rdev->pm.int_thermal_type = THERMAL_TYPE_CI;
2240 		} else if ((controller->ucType ==
2241 			    ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO) ||
2242 			   (controller->ucType ==
2243 			    ATOM_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL) ||
2244 			   (controller->ucType ==
2245 			    ATOM_PP_THERMALCONTROLLER_EMC2103_WITH_INTERNAL)) {
2246 			DRM_INFO("Special thermal controller config\n");
2247 		} else if (controller->ucType < ARRAY_SIZE(pp_lib_thermal_controller_names)) {
2248 			DRM_INFO("Possible %s thermal controller at 0x%02x %s fan control\n",
2249 				 pp_lib_thermal_controller_names[controller->ucType],
2250 				 controller->ucI2cAddress >> 1,
2251 				 (controller->ucFanParameters &
2252 				  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2253 			i2c_bus = radeon_lookup_i2c_gpio(rdev, controller->ucI2cLine);
2254 			rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
2255 			if (rdev->pm.i2c_bus) {
2256 				struct i2c_board_info info = { };
2257 				const char *name = pp_lib_thermal_controller_names[controller->ucType];
2258 				info.addr = controller->ucI2cAddress >> 1;
2259 				strlcpy(info.type, name, sizeof(info.type));
2260 				i2c_new_device(&rdev->pm.i2c_bus->adapter, &info);
2261 			}
2262 		} else {
2263 			DRM_INFO("Unknown thermal controller type %d at 0x%02x %s fan control\n",
2264 				 controller->ucType,
2265 				 controller->ucI2cAddress >> 1,
2266 				 (controller->ucFanParameters &
2267 				  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2268 		}
2269 	}
2270 }
2271 
2272 void radeon_atombios_get_default_voltages(struct radeon_device *rdev,
2273 					  u16 *vddc, u16 *vddci, u16 *mvdd)
2274 {
2275 	struct radeon_mode_info *mode_info = &rdev->mode_info;
2276 	int index = GetIndexIntoMasterTable(DATA, FirmwareInfo);
2277 	u8 frev, crev;
2278 	u16 data_offset;
2279 	union firmware_info *firmware_info;
2280 
2281 	*vddc = 0;
2282 	*vddci = 0;
2283 	*mvdd = 0;
2284 
2285 	if (atom_parse_data_header(mode_info->atom_context, index, NULL,
2286 				   &frev, &crev, &data_offset)) {
2287 		firmware_info =
2288 			(union firmware_info *)(mode_info->atom_context->bios +
2289 						data_offset);
2290 		*vddc = le16_to_cpu(firmware_info->info_14.usBootUpVDDCVoltage);
2291 		if ((frev == 2) && (crev >= 2)) {
2292 			*vddci = le16_to_cpu(firmware_info->info_22.usBootUpVDDCIVoltage);
2293 			*mvdd = le16_to_cpu(firmware_info->info_22.usBootUpMVDDCVoltage);
2294 		}
2295 	}
2296 }
2297 
2298 static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rdev,
2299 						       int state_index, int mode_index,
2300 						       struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info)
2301 {
2302 	int j;
2303 	u32 misc = le32_to_cpu(non_clock_info->ulCapsAndSettings);
2304 	u32 misc2 = le16_to_cpu(non_clock_info->usClassification);
2305 	u16 vddc, vddci, mvdd;
2306 
2307 	radeon_atombios_get_default_voltages(rdev, &vddc, &vddci, &mvdd);
2308 
2309 	rdev->pm.power_state[state_index].misc = misc;
2310 	rdev->pm.power_state[state_index].misc2 = misc2;
2311 	rdev->pm.power_state[state_index].pcie_lanes =
2312 		((misc & ATOM_PPLIB_PCIE_LINK_WIDTH_MASK) >>
2313 		 ATOM_PPLIB_PCIE_LINK_WIDTH_SHIFT) + 1;
2314 	switch (misc2 & ATOM_PPLIB_CLASSIFICATION_UI_MASK) {
2315 	case ATOM_PPLIB_CLASSIFICATION_UI_BATTERY:
2316 		rdev->pm.power_state[state_index].type =
2317 			POWER_STATE_TYPE_BATTERY;
2318 		break;
2319 	case ATOM_PPLIB_CLASSIFICATION_UI_BALANCED:
2320 		rdev->pm.power_state[state_index].type =
2321 			POWER_STATE_TYPE_BALANCED;
2322 		break;
2323 	case ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE:
2324 		rdev->pm.power_state[state_index].type =
2325 			POWER_STATE_TYPE_PERFORMANCE;
2326 		break;
2327 	case ATOM_PPLIB_CLASSIFICATION_UI_NONE:
2328 		if (misc2 & ATOM_PPLIB_CLASSIFICATION_3DPERFORMANCE)
2329 			rdev->pm.power_state[state_index].type =
2330 				POWER_STATE_TYPE_PERFORMANCE;
2331 		break;
2332 	}
2333 	rdev->pm.power_state[state_index].flags = 0;
2334 	if (misc & ATOM_PPLIB_SINGLE_DISPLAY_ONLY)
2335 		rdev->pm.power_state[state_index].flags |=
2336 			RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2337 	if (misc2 & ATOM_PPLIB_CLASSIFICATION_BOOT) {
2338 		rdev->pm.power_state[state_index].type =
2339 			POWER_STATE_TYPE_DEFAULT;
2340 		rdev->pm.default_power_state_index = state_index;
2341 		rdev->pm.power_state[state_index].default_clock_mode =
2342 			&rdev->pm.power_state[state_index].clock_info[mode_index - 1];
2343 		if ((rdev->family >= CHIP_BARTS) && !(rdev->flags & RADEON_IS_IGP)) {
2344 			/* NI chips post without MC ucode, so default clocks are strobe mode only */
2345 			rdev->pm.default_sclk = rdev->pm.power_state[state_index].clock_info[0].sclk;
2346 			rdev->pm.default_mclk = rdev->pm.power_state[state_index].clock_info[0].mclk;
2347 			rdev->pm.default_vddc = rdev->pm.power_state[state_index].clock_info[0].voltage.voltage;
2348 			rdev->pm.default_vddci = rdev->pm.power_state[state_index].clock_info[0].voltage.vddci;
2349 		} else {
2350 			u16 max_vddci = 0;
2351 
2352 			if (ASIC_IS_DCE4(rdev))
2353 				radeon_atom_get_max_voltage(rdev,
2354 							    SET_VOLTAGE_TYPE_ASIC_VDDCI,
2355 							    &max_vddci);
2356 			/* patch the table values with the default sclk/mclk from firmware info */
2357 			for (j = 0; j < mode_index; j++) {
2358 				rdev->pm.power_state[state_index].clock_info[j].mclk =
2359 					rdev->clock.default_mclk;
2360 				rdev->pm.power_state[state_index].clock_info[j].sclk =
2361 					rdev->clock.default_sclk;
2362 				if (vddc)
2363 					rdev->pm.power_state[state_index].clock_info[j].voltage.voltage =
2364 						vddc;
2365 				if (max_vddci)
2366 					rdev->pm.power_state[state_index].clock_info[j].voltage.vddci =
2367 						max_vddci;
2368 			}
2369 		}
2370 	}
2371 }
2372 
2373 static bool radeon_atombios_parse_pplib_clock_info(struct radeon_device *rdev,
2374 						   int state_index, int mode_index,
2375 						   union pplib_clock_info *clock_info)
2376 {
2377 	u32 sclk, mclk;
2378 	u16 vddc;
2379 
2380 	if (rdev->flags & RADEON_IS_IGP) {
2381 		if (rdev->family >= CHIP_PALM) {
2382 			sclk = le16_to_cpu(clock_info->sumo.usEngineClockLow);
2383 			sclk |= clock_info->sumo.ucEngineClockHigh << 16;
2384 			rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2385 		} else {
2386 			sclk = le16_to_cpu(clock_info->rs780.usLowEngineClockLow);
2387 			sclk |= clock_info->rs780.ucLowEngineClockHigh << 16;
2388 			rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2389 		}
2390 	} else if (rdev->family >= CHIP_BONAIRE) {
2391 		sclk = le16_to_cpu(clock_info->ci.usEngineClockLow);
2392 		sclk |= clock_info->ci.ucEngineClockHigh << 16;
2393 		mclk = le16_to_cpu(clock_info->ci.usMemoryClockLow);
2394 		mclk |= clock_info->ci.ucMemoryClockHigh << 16;
2395 		rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk;
2396 		rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2397 		rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2398 			VOLTAGE_NONE;
2399 	} else if (rdev->family >= CHIP_TAHITI) {
2400 		sclk = le16_to_cpu(clock_info->si.usEngineClockLow);
2401 		sclk |= clock_info->si.ucEngineClockHigh << 16;
2402 		mclk = le16_to_cpu(clock_info->si.usMemoryClockLow);
2403 		mclk |= clock_info->si.ucMemoryClockHigh << 16;
2404 		rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk;
2405 		rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2406 		rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2407 			VOLTAGE_SW;
2408 		rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
2409 			le16_to_cpu(clock_info->si.usVDDC);
2410 		rdev->pm.power_state[state_index].clock_info[mode_index].voltage.vddci =
2411 			le16_to_cpu(clock_info->si.usVDDCI);
2412 	} else if (rdev->family >= CHIP_CEDAR) {
2413 		sclk = le16_to_cpu(clock_info->evergreen.usEngineClockLow);
2414 		sclk |= clock_info->evergreen.ucEngineClockHigh << 16;
2415 		mclk = le16_to_cpu(clock_info->evergreen.usMemoryClockLow);
2416 		mclk |= clock_info->evergreen.ucMemoryClockHigh << 16;
2417 		rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk;
2418 		rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2419 		rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2420 			VOLTAGE_SW;
2421 		rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
2422 			le16_to_cpu(clock_info->evergreen.usVDDC);
2423 		rdev->pm.power_state[state_index].clock_info[mode_index].voltage.vddci =
2424 			le16_to_cpu(clock_info->evergreen.usVDDCI);
2425 	} else {
2426 		sclk = le16_to_cpu(clock_info->r600.usEngineClockLow);
2427 		sclk |= clock_info->r600.ucEngineClockHigh << 16;
2428 		mclk = le16_to_cpu(clock_info->r600.usMemoryClockLow);
2429 		mclk |= clock_info->r600.ucMemoryClockHigh << 16;
2430 		rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk;
2431 		rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2432 		rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2433 			VOLTAGE_SW;
2434 		rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
2435 			le16_to_cpu(clock_info->r600.usVDDC);
2436 	}
2437 
2438 	/* patch up vddc if necessary */
2439 	switch (rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage) {
2440 	case ATOM_VIRTUAL_VOLTAGE_ID0:
2441 	case ATOM_VIRTUAL_VOLTAGE_ID1:
2442 	case ATOM_VIRTUAL_VOLTAGE_ID2:
2443 	case ATOM_VIRTUAL_VOLTAGE_ID3:
2444 	case ATOM_VIRTUAL_VOLTAGE_ID4:
2445 	case ATOM_VIRTUAL_VOLTAGE_ID5:
2446 	case ATOM_VIRTUAL_VOLTAGE_ID6:
2447 	case ATOM_VIRTUAL_VOLTAGE_ID7:
2448 		if (radeon_atom_get_max_vddc(rdev, VOLTAGE_TYPE_VDDC,
2449 					     rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage,
2450 					     &vddc) == 0)
2451 			rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage = vddc;
2452 		break;
2453 	default:
2454 		break;
2455 	}
2456 
2457 	if (rdev->flags & RADEON_IS_IGP) {
2458 		/* skip invalid modes */
2459 		if (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0)
2460 			return false;
2461 	} else {
2462 		/* skip invalid modes */
2463 		if ((rdev->pm.power_state[state_index].clock_info[mode_index].mclk == 0) ||
2464 		    (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0))
2465 			return false;
2466 	}
2467 	return true;
2468 }
2469 
2470 static int radeon_atombios_parse_power_table_4_5(struct radeon_device *rdev)
2471 {
2472 	struct radeon_mode_info *mode_info = &rdev->mode_info;
2473 	struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
2474 	union pplib_power_state *power_state;
2475 	int i, j;
2476 	int state_index = 0, mode_index = 0;
2477 	union pplib_clock_info *clock_info;
2478 	bool valid;
2479 	union power_info *power_info;
2480 	int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2481         u16 data_offset;
2482 	u8 frev, crev;
2483 
2484 	if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2485 				   &frev, &crev, &data_offset))
2486 		return state_index;
2487 	power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2488 
2489 	radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
2490 	if (power_info->pplib.ucNumStates == 0)
2491 		return state_index;
2492 	rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
2493 				       power_info->pplib.ucNumStates, GFP_KERNEL);
2494 	if (!rdev->pm.power_state)
2495 		return state_index;
2496 	/* first mode is usually default, followed by low to high */
2497 	for (i = 0; i < power_info->pplib.ucNumStates; i++) {
2498 		mode_index = 0;
2499 		power_state = (union pplib_power_state *)
2500 			(mode_info->atom_context->bios + data_offset +
2501 			 le16_to_cpu(power_info->pplib.usStateArrayOffset) +
2502 			 i * power_info->pplib.ucStateEntrySize);
2503 		non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
2504 			(mode_info->atom_context->bios + data_offset +
2505 			 le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset) +
2506 			 (power_state->v1.ucNonClockStateIndex *
2507 			  power_info->pplib.ucNonClockSize));
2508 		rdev->pm.power_state[i].clock_info = kzalloc(sizeof(struct radeon_pm_clock_info) *
2509 							     ((power_info->pplib.ucStateEntrySize - 1) ?
2510 							      (power_info->pplib.ucStateEntrySize - 1) : 1),
2511 							     GFP_KERNEL);
2512 		if (!rdev->pm.power_state[i].clock_info)
2513 			return state_index;
2514 		if (power_info->pplib.ucStateEntrySize - 1) {
2515 			for (j = 0; j < (power_info->pplib.ucStateEntrySize - 1); j++) {
2516 				clock_info = (union pplib_clock_info *)
2517 					(mode_info->atom_context->bios + data_offset +
2518 					 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset) +
2519 					 (power_state->v1.ucClockStateIndices[j] *
2520 					  power_info->pplib.ucClockInfoSize));
2521 				valid = radeon_atombios_parse_pplib_clock_info(rdev,
2522 									       state_index, mode_index,
2523 									       clock_info);
2524 				if (valid)
2525 					mode_index++;
2526 			}
2527 		} else {
2528 			rdev->pm.power_state[state_index].clock_info[0].mclk =
2529 				rdev->clock.default_mclk;
2530 			rdev->pm.power_state[state_index].clock_info[0].sclk =
2531 				rdev->clock.default_sclk;
2532 			mode_index++;
2533 		}
2534 		rdev->pm.power_state[state_index].num_clock_modes = mode_index;
2535 		if (mode_index) {
2536 			radeon_atombios_parse_pplib_non_clock_info(rdev, state_index, mode_index,
2537 								   non_clock_info);
2538 			state_index++;
2539 		}
2540 	}
2541 	/* if multiple clock modes, mark the lowest as no display */
2542 	for (i = 0; i < state_index; i++) {
2543 		if (rdev->pm.power_state[i].num_clock_modes > 1)
2544 			rdev->pm.power_state[i].clock_info[0].flags |=
2545 				RADEON_PM_MODE_NO_DISPLAY;
2546 	}
2547 	/* first mode is usually default */
2548 	if (rdev->pm.default_power_state_index == -1) {
2549 		rdev->pm.power_state[0].type =
2550 			POWER_STATE_TYPE_DEFAULT;
2551 		rdev->pm.default_power_state_index = 0;
2552 		rdev->pm.power_state[0].default_clock_mode =
2553 			&rdev->pm.power_state[0].clock_info[0];
2554 	}
2555 	return state_index;
2556 }
2557 
2558 static int radeon_atombios_parse_power_table_6(struct radeon_device *rdev)
2559 {
2560 	struct radeon_mode_info *mode_info = &rdev->mode_info;
2561 	struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
2562 	union pplib_power_state *power_state;
2563 	int i, j, non_clock_array_index, clock_array_index;
2564 	int state_index = 0, mode_index = 0;
2565 	union pplib_clock_info *clock_info;
2566 	struct _StateArray *state_array;
2567 	struct _ClockInfoArray *clock_info_array;
2568 	struct _NonClockInfoArray *non_clock_info_array;
2569 	bool valid;
2570 	union power_info *power_info;
2571 	int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2572         u16 data_offset;
2573 	u8 frev, crev;
2574 	u8 *power_state_offset;
2575 
2576 	if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2577 				   &frev, &crev, &data_offset))
2578 		return state_index;
2579 	power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2580 
2581 	radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
2582 	state_array = (struct _StateArray *)
2583 		(mode_info->atom_context->bios + data_offset +
2584 		 le16_to_cpu(power_info->pplib.usStateArrayOffset));
2585 	clock_info_array = (struct _ClockInfoArray *)
2586 		(mode_info->atom_context->bios + data_offset +
2587 		 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset));
2588 	non_clock_info_array = (struct _NonClockInfoArray *)
2589 		(mode_info->atom_context->bios + data_offset +
2590 		 le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset));
2591 	if (state_array->ucNumEntries == 0)
2592 		return state_index;
2593 	rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
2594 				       state_array->ucNumEntries, GFP_KERNEL);
2595 	if (!rdev->pm.power_state)
2596 		return state_index;
2597 	power_state_offset = (u8 *)state_array->states;
2598 	for (i = 0; i < state_array->ucNumEntries; i++) {
2599 		mode_index = 0;
2600 		power_state = (union pplib_power_state *)power_state_offset;
2601 		non_clock_array_index = power_state->v2.nonClockInfoIndex;
2602 		non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
2603 			&non_clock_info_array->nonClockInfo[non_clock_array_index];
2604 		rdev->pm.power_state[i].clock_info = kzalloc(sizeof(struct radeon_pm_clock_info) *
2605 							     (power_state->v2.ucNumDPMLevels ?
2606 							      power_state->v2.ucNumDPMLevels : 1),
2607 							     GFP_KERNEL);
2608 		if (!rdev->pm.power_state[i].clock_info)
2609 			return state_index;
2610 		if (power_state->v2.ucNumDPMLevels) {
2611 			for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) {
2612 				clock_array_index = power_state->v2.clockInfoIndex[j];
2613 				clock_info = (union pplib_clock_info *)
2614 					&clock_info_array->clockInfo[clock_array_index * clock_info_array->ucEntrySize];
2615 				valid = radeon_atombios_parse_pplib_clock_info(rdev,
2616 									       state_index, mode_index,
2617 									       clock_info);
2618 				if (valid)
2619 					mode_index++;
2620 			}
2621 		} else {
2622 			rdev->pm.power_state[state_index].clock_info[0].mclk =
2623 				rdev->clock.default_mclk;
2624 			rdev->pm.power_state[state_index].clock_info[0].sclk =
2625 				rdev->clock.default_sclk;
2626 			mode_index++;
2627 		}
2628 		rdev->pm.power_state[state_index].num_clock_modes = mode_index;
2629 		if (mode_index) {
2630 			radeon_atombios_parse_pplib_non_clock_info(rdev, state_index, mode_index,
2631 								   non_clock_info);
2632 			state_index++;
2633 		}
2634 		power_state_offset += 2 + power_state->v2.ucNumDPMLevels;
2635 	}
2636 	/* if multiple clock modes, mark the lowest as no display */
2637 	for (i = 0; i < state_index; i++) {
2638 		if (rdev->pm.power_state[i].num_clock_modes > 1)
2639 			rdev->pm.power_state[i].clock_info[0].flags |=
2640 				RADEON_PM_MODE_NO_DISPLAY;
2641 	}
2642 	/* first mode is usually default */
2643 	if (rdev->pm.default_power_state_index == -1) {
2644 		rdev->pm.power_state[0].type =
2645 			POWER_STATE_TYPE_DEFAULT;
2646 		rdev->pm.default_power_state_index = 0;
2647 		rdev->pm.power_state[0].default_clock_mode =
2648 			&rdev->pm.power_state[0].clock_info[0];
2649 	}
2650 	return state_index;
2651 }
2652 
2653 void radeon_atombios_get_power_modes(struct radeon_device *rdev)
2654 {
2655 	struct radeon_mode_info *mode_info = &rdev->mode_info;
2656 	int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2657 	u16 data_offset;
2658 	u8 frev, crev;
2659 	int state_index = 0;
2660 
2661 	rdev->pm.default_power_state_index = -1;
2662 
2663 	if (atom_parse_data_header(mode_info->atom_context, index, NULL,
2664 				   &frev, &crev, &data_offset)) {
2665 		switch (frev) {
2666 		case 1:
2667 		case 2:
2668 		case 3:
2669 			state_index = radeon_atombios_parse_power_table_1_3(rdev);
2670 			break;
2671 		case 4:
2672 		case 5:
2673 			state_index = radeon_atombios_parse_power_table_4_5(rdev);
2674 			break;
2675 		case 6:
2676 			state_index = radeon_atombios_parse_power_table_6(rdev);
2677 			break;
2678 		default:
2679 			break;
2680 		}
2681 	}
2682 
2683 	if (state_index == 0) {
2684 		rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state), GFP_KERNEL);
2685 		if (rdev->pm.power_state) {
2686 			rdev->pm.power_state[0].clock_info =
2687 				kzalloc(sizeof(struct radeon_pm_clock_info) * 1, GFP_KERNEL);
2688 			if (rdev->pm.power_state[0].clock_info) {
2689 				/* add the default mode */
2690 				rdev->pm.power_state[state_index].type =
2691 					POWER_STATE_TYPE_DEFAULT;
2692 				rdev->pm.power_state[state_index].num_clock_modes = 1;
2693 				rdev->pm.power_state[state_index].clock_info[0].mclk = rdev->clock.default_mclk;
2694 				rdev->pm.power_state[state_index].clock_info[0].sclk = rdev->clock.default_sclk;
2695 				rdev->pm.power_state[state_index].default_clock_mode =
2696 					&rdev->pm.power_state[state_index].clock_info[0];
2697 				rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
2698 				rdev->pm.power_state[state_index].pcie_lanes = 16;
2699 				rdev->pm.default_power_state_index = state_index;
2700 				rdev->pm.power_state[state_index].flags = 0;
2701 				state_index++;
2702 			}
2703 		}
2704 	}
2705 
2706 	rdev->pm.num_power_states = state_index;
2707 
2708 	rdev->pm.current_power_state_index = rdev->pm.default_power_state_index;
2709 	rdev->pm.current_clock_mode_index = 0;
2710 	if (rdev->pm.default_power_state_index >= 0)
2711 		rdev->pm.current_vddc =
2712 			rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage;
2713 	else
2714 		rdev->pm.current_vddc = 0;
2715 }
2716 
2717 union get_clock_dividers {
2718 	struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS v1;
2719 	struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V2 v2;
2720 	struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V3 v3;
2721 	struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V4 v4;
2722 	struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V5 v5;
2723 	struct _COMPUTE_GPU_CLOCK_INPUT_PARAMETERS_V1_6 v6_in;
2724 	struct _COMPUTE_GPU_CLOCK_OUTPUT_PARAMETERS_V1_6 v6_out;
2725 };
2726 
2727 int radeon_atom_get_clock_dividers(struct radeon_device *rdev,
2728 				   u8 clock_type,
2729 				   u32 clock,
2730 				   bool strobe_mode,
2731 				   struct atom_clock_dividers *dividers)
2732 {
2733 	union get_clock_dividers args;
2734 	int index = GetIndexIntoMasterTable(COMMAND, ComputeMemoryEnginePLL);
2735 	u8 frev, crev;
2736 
2737 	memset(&args, 0, sizeof(args));
2738 	memset(dividers, 0, sizeof(struct atom_clock_dividers));
2739 
2740 	if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
2741 		return -EINVAL;
2742 
2743 	switch (crev) {
2744 	case 1:
2745 		/* r4xx, r5xx */
2746 		args.v1.ucAction = clock_type;
2747 		args.v1.ulClock = cpu_to_le32(clock);	/* 10 khz */
2748 
2749 		atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2750 
2751 		dividers->post_div = args.v1.ucPostDiv;
2752 		dividers->fb_div = args.v1.ucFbDiv;
2753 		dividers->enable_post_div = true;
2754 		break;
2755 	case 2:
2756 	case 3:
2757 	case 5:
2758 		/* r6xx, r7xx, evergreen, ni, si */
2759 		if (rdev->family <= CHIP_RV770) {
2760 			args.v2.ucAction = clock_type;
2761 			args.v2.ulClock = cpu_to_le32(clock);	/* 10 khz */
2762 
2763 			atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2764 
2765 			dividers->post_div = args.v2.ucPostDiv;
2766 			dividers->fb_div = le16_to_cpu(args.v2.usFbDiv);
2767 			dividers->ref_div = args.v2.ucAction;
2768 			if (rdev->family == CHIP_RV770) {
2769 				dividers->enable_post_div = (le32_to_cpu(args.v2.ulClock) & (1 << 24)) ?
2770 					true : false;
2771 				dividers->vco_mode = (le32_to_cpu(args.v2.ulClock) & (1 << 25)) ? 1 : 0;
2772 			} else
2773 				dividers->enable_post_div = (dividers->fb_div & 1) ? true : false;
2774 		} else {
2775 			if (clock_type == COMPUTE_ENGINE_PLL_PARAM) {
2776 				args.v3.ulClockParams = cpu_to_le32((clock_type << 24) | clock);
2777 
2778 				atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2779 
2780 				dividers->post_div = args.v3.ucPostDiv;
2781 				dividers->enable_post_div = (args.v3.ucCntlFlag &
2782 							     ATOM_PLL_CNTL_FLAG_PLL_POST_DIV_EN) ? true : false;
2783 				dividers->enable_dithen = (args.v3.ucCntlFlag &
2784 							   ATOM_PLL_CNTL_FLAG_FRACTION_DISABLE) ? false : true;
2785 				dividers->whole_fb_div = le16_to_cpu(args.v3.ulFbDiv.usFbDiv);
2786 				dividers->frac_fb_div = le16_to_cpu(args.v3.ulFbDiv.usFbDivFrac);
2787 				dividers->ref_div = args.v3.ucRefDiv;
2788 				dividers->vco_mode = (args.v3.ucCntlFlag &
2789 						      ATOM_PLL_CNTL_FLAG_MPLL_VCO_MODE) ? 1 : 0;
2790 			} else {
2791 				/* for SI we use ComputeMemoryClockParam for memory plls */
2792 				if (rdev->family >= CHIP_TAHITI)
2793 					return -EINVAL;
2794 				args.v5.ulClockParams = cpu_to_le32((clock_type << 24) | clock);
2795 				if (strobe_mode)
2796 					args.v5.ucInputFlag = ATOM_PLL_INPUT_FLAG_PLL_STROBE_MODE_EN;
2797 
2798 				atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2799 
2800 				dividers->post_div = args.v5.ucPostDiv;
2801 				dividers->enable_post_div = (args.v5.ucCntlFlag &
2802 							     ATOM_PLL_CNTL_FLAG_PLL_POST_DIV_EN) ? true : false;
2803 				dividers->enable_dithen = (args.v5.ucCntlFlag &
2804 							   ATOM_PLL_CNTL_FLAG_FRACTION_DISABLE) ? false : true;
2805 				dividers->whole_fb_div = le16_to_cpu(args.v5.ulFbDiv.usFbDiv);
2806 				dividers->frac_fb_div = le16_to_cpu(args.v5.ulFbDiv.usFbDivFrac);
2807 				dividers->ref_div = args.v5.ucRefDiv;
2808 				dividers->vco_mode = (args.v5.ucCntlFlag &
2809 						      ATOM_PLL_CNTL_FLAG_MPLL_VCO_MODE) ? 1 : 0;
2810 			}
2811 		}
2812 		break;
2813 	case 4:
2814 		/* fusion */
2815 		args.v4.ulClock = cpu_to_le32(clock);	/* 10 khz */
2816 
2817 		atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2818 
2819 		dividers->post_divider = dividers->post_div = args.v4.ucPostDiv;
2820 		dividers->real_clock = le32_to_cpu(args.v4.ulClock);
2821 		break;
2822 	case 6:
2823 		/* CI */
2824 		/* COMPUTE_GPUCLK_INPUT_FLAG_DEFAULT_GPUCLK, COMPUTE_GPUCLK_INPUT_FLAG_SCLK */
2825 		args.v6_in.ulClock.ulComputeClockFlag = clock_type;
2826 		args.v6_in.ulClock.ulClockFreq = cpu_to_le32(clock);	/* 10 khz */
2827 
2828 		atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2829 
2830 		dividers->whole_fb_div = le16_to_cpu(args.v6_out.ulFbDiv.usFbDiv);
2831 		dividers->frac_fb_div = le16_to_cpu(args.v6_out.ulFbDiv.usFbDivFrac);
2832 		dividers->ref_div = args.v6_out.ucPllRefDiv;
2833 		dividers->post_div = args.v6_out.ucPllPostDiv;
2834 		dividers->flags = args.v6_out.ucPllCntlFlag;
2835 		dividers->real_clock = le32_to_cpu(args.v6_out.ulClock.ulClock);
2836 		dividers->post_divider = args.v6_out.ulClock.ucPostDiv;
2837 		break;
2838 	default:
2839 		return -EINVAL;
2840 	}
2841 	return 0;
2842 }
2843 
2844 int radeon_atom_get_memory_pll_dividers(struct radeon_device *rdev,
2845 					u32 clock,
2846 					bool strobe_mode,
2847 					struct atom_mpll_param *mpll_param)
2848 {
2849 	COMPUTE_MEMORY_CLOCK_PARAM_PARAMETERS_V2_1 args;
2850 	int index = GetIndexIntoMasterTable(COMMAND, ComputeMemoryClockParam);
2851 	u8 frev, crev;
2852 
2853 	memset(&args, 0, sizeof(args));
2854 	memset(mpll_param, 0, sizeof(struct atom_mpll_param));
2855 
2856 	if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
2857 		return -EINVAL;
2858 
2859 	switch (frev) {
2860 	case 2:
2861 		switch (crev) {
2862 		case 1:
2863 			/* SI */
2864 			args.ulClock = cpu_to_le32(clock);	/* 10 khz */
2865 			args.ucInputFlag = 0;
2866 			if (strobe_mode)
2867 				args.ucInputFlag |= MPLL_INPUT_FLAG_STROBE_MODE_EN;
2868 
2869 			atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2870 
2871 			mpll_param->clkfrac = le16_to_cpu(args.ulFbDiv.usFbDivFrac);
2872 			mpll_param->clkf = le16_to_cpu(args.ulFbDiv.usFbDiv);
2873 			mpll_param->post_div = args.ucPostDiv;
2874 			mpll_param->dll_speed = args.ucDllSpeed;
2875 			mpll_param->bwcntl = args.ucBWCntl;
2876 			mpll_param->vco_mode =
2877 				(args.ucPllCntlFlag & MPLL_CNTL_FLAG_VCO_MODE_MASK) ? 1 : 0;
2878 			mpll_param->yclk_sel =
2879 				(args.ucPllCntlFlag & MPLL_CNTL_FLAG_BYPASS_DQ_PLL) ? 1 : 0;
2880 			mpll_param->qdr =
2881 				(args.ucPllCntlFlag & MPLL_CNTL_FLAG_QDR_ENABLE) ? 1 : 0;
2882 			mpll_param->half_rate =
2883 				(args.ucPllCntlFlag & MPLL_CNTL_FLAG_AD_HALF_RATE) ? 1 : 0;
2884 			break;
2885 		default:
2886 			return -EINVAL;
2887 		}
2888 		break;
2889 	default:
2890 		return -EINVAL;
2891 	}
2892 	return 0;
2893 }
2894 
2895 void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable)
2896 {
2897 	DYNAMIC_CLOCK_GATING_PS_ALLOCATION args;
2898 	int index = GetIndexIntoMasterTable(COMMAND, DynamicClockGating);
2899 
2900 	args.ucEnable = enable;
2901 
2902 	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2903 }
2904 
2905 uint32_t radeon_atom_get_engine_clock(struct radeon_device *rdev)
2906 {
2907 	GET_ENGINE_CLOCK_PS_ALLOCATION args;
2908 	int index = GetIndexIntoMasterTable(COMMAND, GetEngineClock);
2909 
2910 	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2911 	return le32_to_cpu(args.ulReturnEngineClock);
2912 }
2913 
2914 uint32_t radeon_atom_get_memory_clock(struct radeon_device *rdev)
2915 {
2916 	GET_MEMORY_CLOCK_PS_ALLOCATION args;
2917 	int index = GetIndexIntoMasterTable(COMMAND, GetMemoryClock);
2918 
2919 	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2920 	return le32_to_cpu(args.ulReturnMemoryClock);
2921 }
2922 
2923 void radeon_atom_set_engine_clock(struct radeon_device *rdev,
2924 				  uint32_t eng_clock)
2925 {
2926 	SET_ENGINE_CLOCK_PS_ALLOCATION args;
2927 	int index = GetIndexIntoMasterTable(COMMAND, SetEngineClock);
2928 
2929 	args.ulTargetEngineClock = cpu_to_le32(eng_clock);	/* 10 khz */
2930 
2931 	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2932 }
2933 
2934 void radeon_atom_set_memory_clock(struct radeon_device *rdev,
2935 				  uint32_t mem_clock)
2936 {
2937 	SET_MEMORY_CLOCK_PS_ALLOCATION args;
2938 	int index = GetIndexIntoMasterTable(COMMAND, SetMemoryClock);
2939 
2940 	if (rdev->flags & RADEON_IS_IGP)
2941 		return;
2942 
2943 	args.ulTargetMemoryClock = cpu_to_le32(mem_clock);	/* 10 khz */
2944 
2945 	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2946 }
2947 
2948 void radeon_atom_set_engine_dram_timings(struct radeon_device *rdev,
2949 					 u32 eng_clock, u32 mem_clock)
2950 {
2951 	SET_ENGINE_CLOCK_PS_ALLOCATION args;
2952 	int index = GetIndexIntoMasterTable(COMMAND, DynamicMemorySettings);
2953 	u32 tmp;
2954 
2955 	memset(&args, 0, sizeof(args));
2956 
2957 	tmp = eng_clock & SET_CLOCK_FREQ_MASK;
2958 	tmp |= (COMPUTE_ENGINE_PLL_PARAM << 24);
2959 
2960 	args.ulTargetEngineClock = cpu_to_le32(tmp);
2961 	if (mem_clock)
2962 		args.sReserved.ulClock = cpu_to_le32(mem_clock & SET_CLOCK_FREQ_MASK);
2963 
2964 	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2965 }
2966 
2967 void radeon_atom_update_memory_dll(struct radeon_device *rdev,
2968 				   u32 mem_clock)
2969 {
2970 	u32 args;
2971 	int index = GetIndexIntoMasterTable(COMMAND, DynamicMemorySettings);
2972 
2973 	args = cpu_to_le32(mem_clock);	/* 10 khz */
2974 
2975 	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2976 }
2977 
2978 void radeon_atom_set_ac_timing(struct radeon_device *rdev,
2979 			       u32 mem_clock)
2980 {
2981 	SET_MEMORY_CLOCK_PS_ALLOCATION args;
2982 	int index = GetIndexIntoMasterTable(COMMAND, DynamicMemorySettings);
2983 	u32 tmp = mem_clock | (COMPUTE_MEMORY_PLL_PARAM << 24);
2984 
2985 	args.ulTargetMemoryClock = cpu_to_le32(tmp);	/* 10 khz */
2986 
2987 	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2988 }
2989 
2990 union set_voltage {
2991 	struct _SET_VOLTAGE_PS_ALLOCATION alloc;
2992 	struct _SET_VOLTAGE_PARAMETERS v1;
2993 	struct _SET_VOLTAGE_PARAMETERS_V2 v2;
2994 	struct _SET_VOLTAGE_PARAMETERS_V1_3 v3;
2995 };
2996 
2997 void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type)
2998 {
2999 	union set_voltage args;
3000 	int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
3001 	u8 frev, crev, volt_index = voltage_level;
3002 
3003 	if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
3004 		return;
3005 
3006 	/* 0xff01 is a flag rather then an actual voltage */
3007 	if (voltage_level == 0xff01)
3008 		return;
3009 
3010 	switch (crev) {
3011 	case 1:
3012 		args.v1.ucVoltageType = voltage_type;
3013 		args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE;
3014 		args.v1.ucVoltageIndex = volt_index;
3015 		break;
3016 	case 2:
3017 		args.v2.ucVoltageType = voltage_type;
3018 		args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE;
3019 		args.v2.usVoltageLevel = cpu_to_le16(voltage_level);
3020 		break;
3021 	case 3:
3022 		args.v3.ucVoltageType = voltage_type;
3023 		args.v3.ucVoltageMode = ATOM_SET_VOLTAGE;
3024 		args.v3.usVoltageLevel = cpu_to_le16(voltage_level);
3025 		break;
3026 	default:
3027 		DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
3028 		return;
3029 	}
3030 
3031 	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
3032 }
3033 
3034 int radeon_atom_get_max_vddc(struct radeon_device *rdev, u8 voltage_type,
3035 			     u16 voltage_id, u16 *voltage)
3036 {
3037 	union set_voltage args;
3038 	int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
3039 	u8 frev, crev;
3040 
3041 	if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
3042 		return -EINVAL;
3043 
3044 	switch (crev) {
3045 	case 1:
3046 		return -EINVAL;
3047 	case 2:
3048 		args.v2.ucVoltageType = SET_VOLTAGE_GET_MAX_VOLTAGE;
3049 		args.v2.ucVoltageMode = 0;
3050 		args.v2.usVoltageLevel = 0;
3051 
3052 		atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
3053 
3054 		*voltage = le16_to_cpu(args.v2.usVoltageLevel);
3055 		break;
3056 	case 3:
3057 		args.v3.ucVoltageType = voltage_type;
3058 		args.v3.ucVoltageMode = ATOM_GET_VOLTAGE_LEVEL;
3059 		args.v3.usVoltageLevel = cpu_to_le16(voltage_id);
3060 
3061 		atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
3062 
3063 		*voltage = le16_to_cpu(args.v3.usVoltageLevel);
3064 		break;
3065 	default:
3066 		DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
3067 		return -EINVAL;
3068 	}
3069 
3070 	return 0;
3071 }
3072 
3073 int radeon_atom_get_leakage_vddc_based_on_leakage_idx(struct radeon_device *rdev,
3074 						      u16 *voltage,
3075 						      u16 leakage_idx)
3076 {
3077 	return radeon_atom_get_max_vddc(rdev, VOLTAGE_TYPE_VDDC, leakage_idx, voltage);
3078 }
3079 
3080 int radeon_atom_get_voltage_gpio_settings(struct radeon_device *rdev,
3081 					  u16 voltage_level, u8 voltage_type,
3082 					  u32 *gpio_value, u32 *gpio_mask)
3083 {
3084 	union set_voltage args;
3085 	int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
3086 	u8 frev, crev;
3087 
3088 	if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
3089 		return -EINVAL;
3090 
3091 	switch (crev) {
3092 	case 1:
3093 		return -EINVAL;
3094 	case 2:
3095 		args.v2.ucVoltageType = voltage_type;
3096 		args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_GET_GPIOMASK;
3097 		args.v2.usVoltageLevel = cpu_to_le16(voltage_level);
3098 
3099 		atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
3100 
3101 		*gpio_mask = le32_to_cpu(*(u32 *)&args.v2);
3102 
3103 		args.v2.ucVoltageType = voltage_type;
3104 		args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_GET_GPIOVAL;
3105 		args.v2.usVoltageLevel = cpu_to_le16(voltage_level);
3106 
3107 		atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
3108 
3109 		*gpio_value = le32_to_cpu(*(u32 *)&args.v2);
3110 		break;
3111 	default:
3112 		DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
3113 		return -EINVAL;
3114 	}
3115 
3116 	return 0;
3117 }
3118 
3119 union voltage_object_info {
3120 	struct _ATOM_VOLTAGE_OBJECT_INFO v1;
3121 	struct _ATOM_VOLTAGE_OBJECT_INFO_V2 v2;
3122 	struct _ATOM_VOLTAGE_OBJECT_INFO_V3_1 v3;
3123 };
3124 
3125 union voltage_object {
3126 	struct _ATOM_VOLTAGE_OBJECT v1;
3127 	struct _ATOM_VOLTAGE_OBJECT_V2 v2;
3128 	union _ATOM_VOLTAGE_OBJECT_V3 v3;
3129 };
3130 
3131 static ATOM_VOLTAGE_OBJECT *atom_lookup_voltage_object_v1(ATOM_VOLTAGE_OBJECT_INFO *v1,
3132 							  u8 voltage_type)
3133 {
3134 	u32 size = le16_to_cpu(v1->sHeader.usStructureSize);
3135 	u32 offset = offsetof(ATOM_VOLTAGE_OBJECT_INFO, asVoltageObj[0]);
3136 	u8 *start = (u8 *)v1;
3137 
3138 	while (offset < size) {
3139 		ATOM_VOLTAGE_OBJECT *vo = (ATOM_VOLTAGE_OBJECT *)(start + offset);
3140 		if (vo->ucVoltageType == voltage_type)
3141 			return vo;
3142 		offset += offsetof(ATOM_VOLTAGE_OBJECT, asFormula.ucVIDAdjustEntries) +
3143 			vo->asFormula.ucNumOfVoltageEntries;
3144 	}
3145 	return NULL;
3146 }
3147 
3148 static ATOM_VOLTAGE_OBJECT_V2 *atom_lookup_voltage_object_v2(ATOM_VOLTAGE_OBJECT_INFO_V2 *v2,
3149 							     u8 voltage_type)
3150 {
3151 	u32 size = le16_to_cpu(v2->sHeader.usStructureSize);
3152 	u32 offset = offsetof(ATOM_VOLTAGE_OBJECT_INFO_V2, asVoltageObj[0]);
3153 	u8 *start = (u8*)v2;
3154 
3155 	while (offset < size) {
3156 		ATOM_VOLTAGE_OBJECT_V2 *vo = (ATOM_VOLTAGE_OBJECT_V2 *)(start + offset);
3157 		if (vo->ucVoltageType == voltage_type)
3158 			return vo;
3159 		offset += offsetof(ATOM_VOLTAGE_OBJECT_V2, asFormula.asVIDAdjustEntries) +
3160 			(vo->asFormula.ucNumOfVoltageEntries * sizeof(VOLTAGE_LUT_ENTRY));
3161 	}
3162 	return NULL;
3163 }
3164 
3165 static ATOM_VOLTAGE_OBJECT_V3 *atom_lookup_voltage_object_v3(ATOM_VOLTAGE_OBJECT_INFO_V3_1 *v3,
3166 							     u8 voltage_type, u8 voltage_mode)
3167 {
3168 	u32 size = le16_to_cpu(v3->sHeader.usStructureSize);
3169 	u32 offset = offsetof(ATOM_VOLTAGE_OBJECT_INFO_V3_1, asVoltageObj[0]);
3170 	u8 *start = (u8*)v3;
3171 
3172 	while (offset < size) {
3173 		ATOM_VOLTAGE_OBJECT_V3 *vo = (ATOM_VOLTAGE_OBJECT_V3 *)(start + offset);
3174 		if ((vo->asGpioVoltageObj.sHeader.ucVoltageType == voltage_type) &&
3175 		    (vo->asGpioVoltageObj.sHeader.ucVoltageMode == voltage_mode))
3176 			return vo;
3177 		offset += le16_to_cpu(vo->asGpioVoltageObj.sHeader.usSize);
3178 	}
3179 	return NULL;
3180 }
3181 
3182 bool
3183 radeon_atom_is_voltage_gpio(struct radeon_device *rdev,
3184 			    u8 voltage_type, u8 voltage_mode)
3185 {
3186 	int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo);
3187 	u8 frev, crev;
3188 	u16 data_offset, size;
3189 	union voltage_object_info *voltage_info;
3190 	union voltage_object *voltage_object = NULL;
3191 
3192 	if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size,
3193 				   &frev, &crev, &data_offset)) {
3194 		voltage_info = (union voltage_object_info *)
3195 			(rdev->mode_info.atom_context->bios + data_offset);
3196 
3197 		switch (frev) {
3198 		case 1:
3199 		case 2:
3200 			switch (crev) {
3201 			case 1:
3202 				voltage_object = (union voltage_object *)
3203 					atom_lookup_voltage_object_v1(&voltage_info->v1, voltage_type);
3204 				if (voltage_object &&
3205 				    (voltage_object->v1.asControl.ucVoltageControlId == VOLTAGE_CONTROLLED_BY_GPIO))
3206 					return true;
3207 				break;
3208 			case 2:
3209 				voltage_object = (union voltage_object *)
3210 					atom_lookup_voltage_object_v2(&voltage_info->v2, voltage_type);
3211 				if (voltage_object &&
3212 				    (voltage_object->v2.asControl.ucVoltageControlId == VOLTAGE_CONTROLLED_BY_GPIO))
3213 					return true;
3214 				break;
3215 			default:
3216 				DRM_ERROR("unknown voltage object table\n");
3217 				return false;
3218 			}
3219 			break;
3220 		case 3:
3221 			switch (crev) {
3222 			case 1:
3223 				if (atom_lookup_voltage_object_v3(&voltage_info->v3,
3224 								  voltage_type, voltage_mode))
3225 					return true;
3226 				break;
3227 			default:
3228 				DRM_ERROR("unknown voltage object table\n");
3229 				return false;
3230 			}
3231 			break;
3232 		default:
3233 			DRM_ERROR("unknown voltage object table\n");
3234 			return false;
3235 		}
3236 
3237 	}
3238 	return false;
3239 }
3240 
3241 int radeon_atom_get_max_voltage(struct radeon_device *rdev,
3242 				u8 voltage_type, u16 *max_voltage)
3243 {
3244 	int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo);
3245 	u8 frev, crev;
3246 	u16 data_offset, size;
3247 	union voltage_object_info *voltage_info;
3248 	union voltage_object *voltage_object = NULL;
3249 
3250 	if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size,
3251 				   &frev, &crev, &data_offset)) {
3252 		voltage_info = (union voltage_object_info *)
3253 			(rdev->mode_info.atom_context->bios + data_offset);
3254 
3255 		switch (crev) {
3256 		case 1:
3257 			voltage_object = (union voltage_object *)
3258 				atom_lookup_voltage_object_v1(&voltage_info->v1, voltage_type);
3259 			if (voltage_object) {
3260 				ATOM_VOLTAGE_FORMULA *formula =
3261 					&voltage_object->v1.asFormula;
3262 				if (formula->ucFlag & 1)
3263 					*max_voltage =
3264 						le16_to_cpu(formula->usVoltageBaseLevel) +
3265 						formula->ucNumOfVoltageEntries / 2 *
3266 						le16_to_cpu(formula->usVoltageStep);
3267 				else
3268 					*max_voltage =
3269 						le16_to_cpu(formula->usVoltageBaseLevel) +
3270 						(formula->ucNumOfVoltageEntries - 1) *
3271 						le16_to_cpu(formula->usVoltageStep);
3272 				return 0;
3273 			}
3274 			break;
3275 		case 2:
3276 			voltage_object = (union voltage_object *)
3277 				atom_lookup_voltage_object_v2(&voltage_info->v2, voltage_type);
3278 			if (voltage_object) {
3279 				ATOM_VOLTAGE_FORMULA_V2 *formula =
3280 					&voltage_object->v2.asFormula;
3281 				if (formula->ucNumOfVoltageEntries) {
3282 					*max_voltage =
3283 						le16_to_cpu(formula->asVIDAdjustEntries[
3284 								    formula->ucNumOfVoltageEntries - 1
3285 								    ].usVoltageValue);
3286 					return 0;
3287 				}
3288 			}
3289 			break;
3290 		default:
3291 			DRM_ERROR("unknown voltage object table\n");
3292 			return -EINVAL;
3293 		}
3294 
3295 	}
3296 	return -EINVAL;
3297 }
3298 
3299 int radeon_atom_get_min_voltage(struct radeon_device *rdev,
3300 				u8 voltage_type, u16 *min_voltage)
3301 {
3302 	int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo);
3303 	u8 frev, crev;
3304 	u16 data_offset, size;
3305 	union voltage_object_info *voltage_info;
3306 	union voltage_object *voltage_object = NULL;
3307 
3308 	if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size,
3309 				   &frev, &crev, &data_offset)) {
3310 		voltage_info = (union voltage_object_info *)
3311 			(rdev->mode_info.atom_context->bios + data_offset);
3312 
3313 		switch (crev) {
3314 		case 1:
3315 			voltage_object = (union voltage_object *)
3316 				atom_lookup_voltage_object_v1(&voltage_info->v1, voltage_type);
3317 			if (voltage_object) {
3318 				ATOM_VOLTAGE_FORMULA *formula =
3319 					&voltage_object->v1.asFormula;
3320 				*min_voltage =
3321 					le16_to_cpu(formula->usVoltageBaseLevel);
3322 				return 0;
3323 			}
3324 			break;
3325 		case 2:
3326 			voltage_object = (union voltage_object *)
3327 				atom_lookup_voltage_object_v2(&voltage_info->v2, voltage_type);
3328 			if (voltage_object) {
3329 				ATOM_VOLTAGE_FORMULA_V2 *formula =
3330 					&voltage_object->v2.asFormula;
3331 				if (formula->ucNumOfVoltageEntries) {
3332 					*min_voltage =
3333 						le16_to_cpu(formula->asVIDAdjustEntries[
3334 								    0
3335 								    ].usVoltageValue);
3336 					return 0;
3337 				}
3338 			}
3339 			break;
3340 		default:
3341 			DRM_ERROR("unknown voltage object table\n");
3342 			return -EINVAL;
3343 		}
3344 
3345 	}
3346 	return -EINVAL;
3347 }
3348 
3349 int radeon_atom_get_voltage_step(struct radeon_device *rdev,
3350 				 u8 voltage_type, u16 *voltage_step)
3351 {
3352 	int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo);
3353 	u8 frev, crev;
3354 	u16 data_offset, size;
3355 	union voltage_object_info *voltage_info;
3356 	union voltage_object *voltage_object = NULL;
3357 
3358 	if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size,
3359 				   &frev, &crev, &data_offset)) {
3360 		voltage_info = (union voltage_object_info *)
3361 			(rdev->mode_info.atom_context->bios + data_offset);
3362 
3363 		switch (crev) {
3364 		case 1:
3365 			voltage_object = (union voltage_object *)
3366 				atom_lookup_voltage_object_v1(&voltage_info->v1, voltage_type);
3367 			if (voltage_object) {
3368 				ATOM_VOLTAGE_FORMULA *formula =
3369 					&voltage_object->v1.asFormula;
3370 				if (formula->ucFlag & 1)
3371 					*voltage_step =
3372 						(le16_to_cpu(formula->usVoltageStep) + 1) / 2;
3373 				else
3374 					*voltage_step =
3375 						le16_to_cpu(formula->usVoltageStep);
3376 				return 0;
3377 			}
3378 			break;
3379 		case 2:
3380 			return -EINVAL;
3381 		default:
3382 			DRM_ERROR("unknown voltage object table\n");
3383 			return -EINVAL;
3384 		}
3385 
3386 	}
3387 	return -EINVAL;
3388 }
3389 
3390 int radeon_atom_round_to_true_voltage(struct radeon_device *rdev,
3391 				      u8 voltage_type,
3392 				      u16 nominal_voltage,
3393 				      u16 *true_voltage)
3394 {
3395 	u16 min_voltage, max_voltage, voltage_step;
3396 
3397 	if (radeon_atom_get_max_voltage(rdev, voltage_type, &max_voltage))
3398 		return -EINVAL;
3399 	if (radeon_atom_get_min_voltage(rdev, voltage_type, &min_voltage))
3400 		return -EINVAL;
3401 	if (radeon_atom_get_voltage_step(rdev, voltage_type, &voltage_step))
3402 		return -EINVAL;
3403 
3404 	if (nominal_voltage <= min_voltage)
3405 		*true_voltage = min_voltage;
3406 	else if (nominal_voltage >= max_voltage)
3407 		*true_voltage = max_voltage;
3408 	else
3409 		*true_voltage = min_voltage +
3410 			((nominal_voltage - min_voltage) / voltage_step) *
3411 			voltage_step;
3412 
3413 	return 0;
3414 }
3415 
3416 int radeon_atom_get_voltage_table(struct radeon_device *rdev,
3417 				  u8 voltage_type, u8 voltage_mode,
3418 				  struct atom_voltage_table *voltage_table)
3419 {
3420 	int index = GetIndexIntoMasterTable(DATA, VoltageObjectInfo);
3421 	u8 frev, crev;
3422 	u16 data_offset, size;
3423 	int i, ret;
3424 	union voltage_object_info *voltage_info;
3425 	union voltage_object *voltage_object = NULL;
3426 
3427 	if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size,
3428 				   &frev, &crev, &data_offset)) {
3429 		voltage_info = (union voltage_object_info *)
3430 			(rdev->mode_info.atom_context->bios + data_offset);
3431 
3432 		switch (frev) {
3433 		case 1:
3434 		case 2:
3435 			switch (crev) {
3436 			case 1:
3437 				DRM_ERROR("old table version %d, %d\n", frev, crev);
3438 				return -EINVAL;
3439 			case 2:
3440 				voltage_object = (union voltage_object *)
3441 					atom_lookup_voltage_object_v2(&voltage_info->v2, voltage_type);
3442 				if (voltage_object) {
3443 					ATOM_VOLTAGE_FORMULA_V2 *formula =
3444 						&voltage_object->v2.asFormula;
3445 					if (formula->ucNumOfVoltageEntries > MAX_VOLTAGE_ENTRIES)
3446 						return -EINVAL;
3447 					for (i = 0; i < formula->ucNumOfVoltageEntries; i++) {
3448 						voltage_table->entries[i].value =
3449 							le16_to_cpu(formula->asVIDAdjustEntries[i].usVoltageValue);
3450 						ret = radeon_atom_get_voltage_gpio_settings(rdev,
3451 											    voltage_table->entries[i].value,
3452 											    voltage_type,
3453 											    &voltage_table->entries[i].smio_low,
3454 											    &voltage_table->mask_low);
3455 						if (ret)
3456 							return ret;
3457 					}
3458 					voltage_table->count = formula->ucNumOfVoltageEntries;
3459 					return 0;
3460 				}
3461 				break;
3462 			default:
3463 				DRM_ERROR("unknown voltage object table\n");
3464 				return -EINVAL;
3465 			}
3466 			break;
3467 		case 3:
3468 			switch (crev) {
3469 			case 1:
3470 				voltage_object = (union voltage_object *)
3471 					atom_lookup_voltage_object_v3(&voltage_info->v3,
3472 								      voltage_type, voltage_mode);
3473 				if (voltage_object) {
3474 					ATOM_GPIO_VOLTAGE_OBJECT_V3 *gpio =
3475 						&voltage_object->v3.asGpioVoltageObj;
3476 					if (gpio->ucGpioEntryNum > MAX_VOLTAGE_ENTRIES)
3477 						return -EINVAL;
3478 					for (i = 0; i < gpio->ucGpioEntryNum; i++) {
3479 						voltage_table->entries[i].value =
3480 							le16_to_cpu(gpio->asVolGpioLut[i].usVoltageValue);
3481 						voltage_table->entries[i].smio_low =
3482 							le32_to_cpu(gpio->asVolGpioLut[i].ulVoltageId);
3483 					}
3484 					voltage_table->mask_low = le32_to_cpu(gpio->ulGpioMaskVal);
3485 					voltage_table->count = gpio->ucGpioEntryNum;
3486 					voltage_table->phase_delay = gpio->ucPhaseDelay;
3487 					return 0;
3488 				}
3489 				break;
3490 			default:
3491 				DRM_ERROR("unknown voltage object table\n");
3492 				return -EINVAL;
3493 			}
3494 			break;
3495 		default:
3496 			DRM_ERROR("unknown voltage object table\n");
3497 			return -EINVAL;
3498 		}
3499 	}
3500 	return -EINVAL;
3501 }
3502 
3503 union vram_info {
3504 	struct _ATOM_VRAM_INFO_V3 v1_3;
3505 	struct _ATOM_VRAM_INFO_V4 v1_4;
3506 	struct _ATOM_VRAM_INFO_HEADER_V2_1 v2_1;
3507 };
3508 
3509 int radeon_atom_get_memory_info(struct radeon_device *rdev,
3510 				u8 module_index, struct atom_memory_info *mem_info)
3511 {
3512 	int index = GetIndexIntoMasterTable(DATA, VRAM_Info);
3513 	u8 frev, crev, i;
3514 	u16 data_offset, size;
3515 	union vram_info *vram_info;
3516 
3517 	memset(mem_info, 0, sizeof(struct atom_memory_info));
3518 
3519 	if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size,
3520 				   &frev, &crev, &data_offset)) {
3521 		vram_info = (union vram_info *)
3522 			(rdev->mode_info.atom_context->bios + data_offset);
3523 		switch (frev) {
3524 		case 1:
3525 			switch (crev) {
3526 			case 3:
3527 				/* r6xx */
3528 				if (module_index < vram_info->v1_3.ucNumOfVRAMModule) {
3529 					ATOM_VRAM_MODULE_V3 *vram_module =
3530 						(ATOM_VRAM_MODULE_V3 *)vram_info->v1_3.aVramInfo;
3531 
3532 					for (i = 0; i < module_index; i++) {
3533 						if (le16_to_cpu(vram_module->usSize) == 0)
3534 							return -EINVAL;
3535 						vram_module = (ATOM_VRAM_MODULE_V3 *)
3536 							((u8 *)vram_module + le16_to_cpu(vram_module->usSize));
3537 					}
3538 					mem_info->mem_vendor = vram_module->asMemory.ucMemoryVenderID & 0xf;
3539 					mem_info->mem_type = vram_module->asMemory.ucMemoryType & 0xf0;
3540 				} else
3541 					return -EINVAL;
3542 				break;
3543 			case 4:
3544 				/* r7xx, evergreen */
3545 				if (module_index < vram_info->v1_4.ucNumOfVRAMModule) {
3546 					ATOM_VRAM_MODULE_V4 *vram_module =
3547 						(ATOM_VRAM_MODULE_V4 *)vram_info->v1_4.aVramInfo;
3548 
3549 					for (i = 0; i < module_index; i++) {
3550 						if (le16_to_cpu(vram_module->usModuleSize) == 0)
3551 							return -EINVAL;
3552 						vram_module = (ATOM_VRAM_MODULE_V4 *)
3553 							((u8 *)vram_module + le16_to_cpu(vram_module->usModuleSize));
3554 					}
3555 					mem_info->mem_vendor = vram_module->ucMemoryVenderID & 0xf;
3556 					mem_info->mem_type = vram_module->ucMemoryType & 0xf0;
3557 				} else
3558 					return -EINVAL;
3559 				break;
3560 			default:
3561 				DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
3562 				return -EINVAL;
3563 			}
3564 			break;
3565 		case 2:
3566 			switch (crev) {
3567 			case 1:
3568 				/* ni */
3569 				if (module_index < vram_info->v2_1.ucNumOfVRAMModule) {
3570 					ATOM_VRAM_MODULE_V7 *vram_module =
3571 						(ATOM_VRAM_MODULE_V7 *)vram_info->v2_1.aVramInfo;
3572 
3573 					for (i = 0; i < module_index; i++) {
3574 						if (le16_to_cpu(vram_module->usModuleSize) == 0)
3575 							return -EINVAL;
3576 						vram_module = (ATOM_VRAM_MODULE_V7 *)
3577 							((u8 *)vram_module + le16_to_cpu(vram_module->usModuleSize));
3578 					}
3579 					mem_info->mem_vendor = vram_module->ucMemoryVenderID & 0xf;
3580 					mem_info->mem_type = vram_module->ucMemoryType & 0xf0;
3581 				} else
3582 					return -EINVAL;
3583 				break;
3584 			default:
3585 				DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
3586 				return -EINVAL;
3587 			}
3588 			break;
3589 		default:
3590 			DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
3591 			return -EINVAL;
3592 		}
3593 		return 0;
3594 	}
3595 	return -EINVAL;
3596 }
3597 
3598 int radeon_atom_get_mclk_range_table(struct radeon_device *rdev,
3599 				     bool gddr5, u8 module_index,
3600 				     struct atom_memory_clock_range_table *mclk_range_table)
3601 {
3602 	int index = GetIndexIntoMasterTable(DATA, VRAM_Info);
3603 	u8 frev, crev, i;
3604 	u16 data_offset, size;
3605 	union vram_info *vram_info;
3606 	u32 mem_timing_size = gddr5 ?
3607 		sizeof(ATOM_MEMORY_TIMING_FORMAT_V2) : sizeof(ATOM_MEMORY_TIMING_FORMAT);
3608 	u8 *p;
3609 
3610 	memset(mclk_range_table, 0, sizeof(struct atom_memory_clock_range_table));
3611 
3612 	if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size,
3613 				   &frev, &crev, &data_offset)) {
3614 		vram_info = (union vram_info *)
3615 			(rdev->mode_info.atom_context->bios + data_offset);
3616 		switch (frev) {
3617 		case 1:
3618 			switch (crev) {
3619 			case 3:
3620 				DRM_ERROR("old table version %d, %d\n", frev, crev);
3621 				return -EINVAL;
3622 			case 4:
3623 				/* r7xx, evergreen */
3624 				if (module_index < vram_info->v1_4.ucNumOfVRAMModule) {
3625 					ATOM_VRAM_MODULE_V4 *vram_module =
3626 						(ATOM_VRAM_MODULE_V4 *)vram_info->v1_4.aVramInfo;
3627 
3628 					for (i = 0; i < module_index; i++) {
3629 						if (le16_to_cpu(vram_module->usModuleSize) == 0)
3630 							return -EINVAL;
3631 						vram_module = (ATOM_VRAM_MODULE_V4 *)
3632 							((u8 *)vram_module + le16_to_cpu(vram_module->usModuleSize));
3633 					}
3634 					mclk_range_table->num_entries = (u8)
3635 						((le16_to_cpu(vram_module->usModuleSize) - offsetof(ATOM_VRAM_MODULE_V4, asMemTiming)) /
3636 						 mem_timing_size);
3637 					p = (u8 *)&vram_module->asMemTiming[0];
3638 					for (i = 0; i < mclk_range_table->num_entries; i++) {
3639 						ATOM_MEMORY_TIMING_FORMAT *format = (ATOM_MEMORY_TIMING_FORMAT *)p;
3640 						mclk_range_table->mclk[i] = le32_to_cpu(format->ulClkRange);
3641 						p += mem_timing_size;
3642 					}
3643 				} else
3644 					return -EINVAL;
3645 				break;
3646 			default:
3647 				DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
3648 				return -EINVAL;
3649 			}
3650 			break;
3651 		case 2:
3652 			DRM_ERROR("new table version %d, %d\n", frev, crev);
3653 			return -EINVAL;
3654 		default:
3655 			DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
3656 			return -EINVAL;
3657 		}
3658 		return 0;
3659 	}
3660 	return -EINVAL;
3661 }
3662 
3663 #define MEM_ID_MASK           0xff000000
3664 #define MEM_ID_SHIFT          24
3665 #define CLOCK_RANGE_MASK      0x00ffffff
3666 #define CLOCK_RANGE_SHIFT     0
3667 #define LOW_NIBBLE_MASK       0xf
3668 #define DATA_EQU_PREV         0
3669 #define DATA_FROM_TABLE       4
3670 
3671 int radeon_atom_init_mc_reg_table(struct radeon_device *rdev,
3672 				  u8 module_index,
3673 				  struct atom_mc_reg_table *reg_table)
3674 {
3675 	int index = GetIndexIntoMasterTable(DATA, VRAM_Info);
3676 	u8 frev, crev, num_entries, t_mem_id, num_ranges = 0;
3677 	u32 i = 0, j;
3678 	u16 data_offset, size;
3679 	union vram_info *vram_info;
3680 
3681 	memset(reg_table, 0, sizeof(struct atom_mc_reg_table));
3682 
3683 	if (atom_parse_data_header(rdev->mode_info.atom_context, index, &size,
3684 				   &frev, &crev, &data_offset)) {
3685 		vram_info = (union vram_info *)
3686 			(rdev->mode_info.atom_context->bios + data_offset);
3687 		switch (frev) {
3688 		case 1:
3689 			DRM_ERROR("old table version %d, %d\n", frev, crev);
3690 			return -EINVAL;
3691 		case 2:
3692 			switch (crev) {
3693 			case 1:
3694 				if (module_index < vram_info->v2_1.ucNumOfVRAMModule) {
3695 					ATOM_INIT_REG_BLOCK *reg_block =
3696 						(ATOM_INIT_REG_BLOCK *)
3697 						((u8 *)vram_info + le16_to_cpu(vram_info->v2_1.usMemClkPatchTblOffset));
3698 					ATOM_MEMORY_SETTING_DATA_BLOCK *reg_data =
3699 						(ATOM_MEMORY_SETTING_DATA_BLOCK *)
3700 						((u8 *)reg_block + (2 * sizeof(u16)) +
3701 						 le16_to_cpu(reg_block->usRegIndexTblSize));
3702 					ATOM_INIT_REG_INDEX_FORMAT *format = &reg_block->asRegIndexBuf[0];
3703 					num_entries = (u8)((le16_to_cpu(reg_block->usRegIndexTblSize)) /
3704 							   sizeof(ATOM_INIT_REG_INDEX_FORMAT)) - 1;
3705 					if (num_entries > VBIOS_MC_REGISTER_ARRAY_SIZE)
3706 						return -EINVAL;
3707 					while (i < num_entries) {
3708 						if (format->ucPreRegDataLength & ACCESS_PLACEHOLDER)
3709 							break;
3710 						reg_table->mc_reg_address[i].s1 =
3711 							(u16)(le16_to_cpu(format->usRegIndex));
3712 						reg_table->mc_reg_address[i].pre_reg_data =
3713 							(u8)(format->ucPreRegDataLength);
3714 						i++;
3715 						format = (ATOM_INIT_REG_INDEX_FORMAT *)
3716 							((u8 *)format + sizeof(ATOM_INIT_REG_INDEX_FORMAT));
3717 					}
3718 					reg_table->last = i;
3719 					while ((*(u32 *)reg_data != END_OF_REG_DATA_BLOCK) &&
3720 					       (num_ranges < VBIOS_MAX_AC_TIMING_ENTRIES)) {
3721 						t_mem_id = (u8)((*(u32 *)reg_data & MEM_ID_MASK) >> MEM_ID_SHIFT);
3722 						if (module_index == t_mem_id) {
3723 							reg_table->mc_reg_table_entry[num_ranges].mclk_max =
3724 								(u32)((*(u32 *)reg_data & CLOCK_RANGE_MASK) >> CLOCK_RANGE_SHIFT);
3725 							for (i = 0, j = 1; i < reg_table->last; i++) {
3726 								if ((reg_table->mc_reg_address[i].pre_reg_data & LOW_NIBBLE_MASK) == DATA_FROM_TABLE) {
3727 									reg_table->mc_reg_table_entry[num_ranges].mc_data[i] =
3728 										(u32)*((u32 *)reg_data + j);
3729 									j++;
3730 								} else if ((reg_table->mc_reg_address[i].pre_reg_data & LOW_NIBBLE_MASK) == DATA_EQU_PREV) {
3731 									reg_table->mc_reg_table_entry[num_ranges].mc_data[i] =
3732 										reg_table->mc_reg_table_entry[num_ranges].mc_data[i - 1];
3733 								}
3734 							}
3735 							num_ranges++;
3736 						}
3737 						reg_data = (ATOM_MEMORY_SETTING_DATA_BLOCK *)
3738 							((u8 *)reg_data + le16_to_cpu(reg_block->usRegDataBlkSize));
3739 					}
3740 					if (*(u32 *)reg_data != END_OF_REG_DATA_BLOCK)
3741 						return -EINVAL;
3742 					reg_table->num_entries = num_ranges;
3743 				} else
3744 					return -EINVAL;
3745 				break;
3746 			default:
3747 				DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
3748 				return -EINVAL;
3749 			}
3750 			break;
3751 		default:
3752 			DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
3753 			return -EINVAL;
3754 		}
3755 		return 0;
3756 	}
3757 	return -EINVAL;
3758 }
3759 
3760 void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
3761 {
3762 	struct radeon_device *rdev = dev->dev_private;
3763 	uint32_t bios_2_scratch, bios_6_scratch;
3764 
3765 	if (rdev->family >= CHIP_R600) {
3766 		bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH);
3767 		bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
3768 	} else {
3769 		bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH);
3770 		bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
3771 	}
3772 
3773 	/* let the bios control the backlight */
3774 	bios_2_scratch &= ~ATOM_S2_VRI_BRIGHT_ENABLE;
3775 
3776 	/* tell the bios not to handle mode switching */
3777 	bios_6_scratch |= ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH;
3778 
3779 	if (rdev->family >= CHIP_R600) {
3780 		WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
3781 		WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
3782 	} else {
3783 		WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
3784 		WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
3785 	}
3786 
3787 }
3788 
3789 void radeon_save_bios_scratch_regs(struct radeon_device *rdev)
3790 {
3791 	uint32_t scratch_reg;
3792 	int i;
3793 
3794 	if (rdev->family >= CHIP_R600)
3795 		scratch_reg = R600_BIOS_0_SCRATCH;
3796 	else
3797 		scratch_reg = RADEON_BIOS_0_SCRATCH;
3798 
3799 	for (i = 0; i < RADEON_BIOS_NUM_SCRATCH; i++)
3800 		rdev->bios_scratch[i] = RREG32(scratch_reg + (i * 4));
3801 }
3802 
3803 void radeon_restore_bios_scratch_regs(struct radeon_device *rdev)
3804 {
3805 	uint32_t scratch_reg;
3806 	int i;
3807 
3808 	if (rdev->family >= CHIP_R600)
3809 		scratch_reg = R600_BIOS_0_SCRATCH;
3810 	else
3811 		scratch_reg = RADEON_BIOS_0_SCRATCH;
3812 
3813 	for (i = 0; i < RADEON_BIOS_NUM_SCRATCH; i++)
3814 		WREG32(scratch_reg + (i * 4), rdev->bios_scratch[i]);
3815 }
3816 
3817 void radeon_atom_output_lock(struct drm_encoder *encoder, bool lock)
3818 {
3819 	struct drm_device *dev = encoder->dev;
3820 	struct radeon_device *rdev = dev->dev_private;
3821 	uint32_t bios_6_scratch;
3822 
3823 	if (rdev->family >= CHIP_R600)
3824 		bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
3825 	else
3826 		bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
3827 
3828 	if (lock) {
3829 		bios_6_scratch |= ATOM_S6_CRITICAL_STATE;
3830 		bios_6_scratch &= ~ATOM_S6_ACC_MODE;
3831 	} else {
3832 		bios_6_scratch &= ~ATOM_S6_CRITICAL_STATE;
3833 		bios_6_scratch |= ATOM_S6_ACC_MODE;
3834 	}
3835 
3836 	if (rdev->family >= CHIP_R600)
3837 		WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
3838 	else
3839 		WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
3840 }
3841 
3842 /* at some point we may want to break this out into individual functions */
3843 void
3844 radeon_atombios_connected_scratch_regs(struct drm_connector *connector,
3845 				       struct drm_encoder *encoder,
3846 				       bool connected)
3847 {
3848 	struct drm_device *dev = connector->dev;
3849 	struct radeon_device *rdev = dev->dev_private;
3850 	struct radeon_connector *radeon_connector =
3851 	    to_radeon_connector(connector);
3852 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
3853 	uint32_t bios_0_scratch, bios_3_scratch, bios_6_scratch;
3854 
3855 	if (rdev->family >= CHIP_R600) {
3856 		bios_0_scratch = RREG32(R600_BIOS_0_SCRATCH);
3857 		bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH);
3858 		bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
3859 	} else {
3860 		bios_0_scratch = RREG32(RADEON_BIOS_0_SCRATCH);
3861 		bios_3_scratch = RREG32(RADEON_BIOS_3_SCRATCH);
3862 		bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
3863 	}
3864 
3865 	if ((radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) &&
3866 	    (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT)) {
3867 		if (connected) {
3868 			DRM_DEBUG_KMS("TV1 connected\n");
3869 			bios_3_scratch |= ATOM_S3_TV1_ACTIVE;
3870 			bios_6_scratch |= ATOM_S6_ACC_REQ_TV1;
3871 		} else {
3872 			DRM_DEBUG_KMS("TV1 disconnected\n");
3873 			bios_0_scratch &= ~ATOM_S0_TV1_MASK;
3874 			bios_3_scratch &= ~ATOM_S3_TV1_ACTIVE;
3875 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_TV1;
3876 		}
3877 	}
3878 	if ((radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) &&
3879 	    (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT)) {
3880 		if (connected) {
3881 			DRM_DEBUG_KMS("CV connected\n");
3882 			bios_3_scratch |= ATOM_S3_CV_ACTIVE;
3883 			bios_6_scratch |= ATOM_S6_ACC_REQ_CV;
3884 		} else {
3885 			DRM_DEBUG_KMS("CV disconnected\n");
3886 			bios_0_scratch &= ~ATOM_S0_CV_MASK;
3887 			bios_3_scratch &= ~ATOM_S3_CV_ACTIVE;
3888 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_CV;
3889 		}
3890 	}
3891 	if ((radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) &&
3892 	    (radeon_connector->devices & ATOM_DEVICE_LCD1_SUPPORT)) {
3893 		if (connected) {
3894 			DRM_DEBUG_KMS("LCD1 connected\n");
3895 			bios_0_scratch |= ATOM_S0_LCD1;
3896 			bios_3_scratch |= ATOM_S3_LCD1_ACTIVE;
3897 			bios_6_scratch |= ATOM_S6_ACC_REQ_LCD1;
3898 		} else {
3899 			DRM_DEBUG_KMS("LCD1 disconnected\n");
3900 			bios_0_scratch &= ~ATOM_S0_LCD1;
3901 			bios_3_scratch &= ~ATOM_S3_LCD1_ACTIVE;
3902 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_LCD1;
3903 		}
3904 	}
3905 	if ((radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) &&
3906 	    (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT)) {
3907 		if (connected) {
3908 			DRM_DEBUG_KMS("CRT1 connected\n");
3909 			bios_0_scratch |= ATOM_S0_CRT1_COLOR;
3910 			bios_3_scratch |= ATOM_S3_CRT1_ACTIVE;
3911 			bios_6_scratch |= ATOM_S6_ACC_REQ_CRT1;
3912 		} else {
3913 			DRM_DEBUG_KMS("CRT1 disconnected\n");
3914 			bios_0_scratch &= ~ATOM_S0_CRT1_MASK;
3915 			bios_3_scratch &= ~ATOM_S3_CRT1_ACTIVE;
3916 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT1;
3917 		}
3918 	}
3919 	if ((radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) &&
3920 	    (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT)) {
3921 		if (connected) {
3922 			DRM_DEBUG_KMS("CRT2 connected\n");
3923 			bios_0_scratch |= ATOM_S0_CRT2_COLOR;
3924 			bios_3_scratch |= ATOM_S3_CRT2_ACTIVE;
3925 			bios_6_scratch |= ATOM_S6_ACC_REQ_CRT2;
3926 		} else {
3927 			DRM_DEBUG_KMS("CRT2 disconnected\n");
3928 			bios_0_scratch &= ~ATOM_S0_CRT2_MASK;
3929 			bios_3_scratch &= ~ATOM_S3_CRT2_ACTIVE;
3930 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT2;
3931 		}
3932 	}
3933 	if ((radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) &&
3934 	    (radeon_connector->devices & ATOM_DEVICE_DFP1_SUPPORT)) {
3935 		if (connected) {
3936 			DRM_DEBUG_KMS("DFP1 connected\n");
3937 			bios_0_scratch |= ATOM_S0_DFP1;
3938 			bios_3_scratch |= ATOM_S3_DFP1_ACTIVE;
3939 			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP1;
3940 		} else {
3941 			DRM_DEBUG_KMS("DFP1 disconnected\n");
3942 			bios_0_scratch &= ~ATOM_S0_DFP1;
3943 			bios_3_scratch &= ~ATOM_S3_DFP1_ACTIVE;
3944 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP1;
3945 		}
3946 	}
3947 	if ((radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) &&
3948 	    (radeon_connector->devices & ATOM_DEVICE_DFP2_SUPPORT)) {
3949 		if (connected) {
3950 			DRM_DEBUG_KMS("DFP2 connected\n");
3951 			bios_0_scratch |= ATOM_S0_DFP2;
3952 			bios_3_scratch |= ATOM_S3_DFP2_ACTIVE;
3953 			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP2;
3954 		} else {
3955 			DRM_DEBUG_KMS("DFP2 disconnected\n");
3956 			bios_0_scratch &= ~ATOM_S0_DFP2;
3957 			bios_3_scratch &= ~ATOM_S3_DFP2_ACTIVE;
3958 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP2;
3959 		}
3960 	}
3961 	if ((radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) &&
3962 	    (radeon_connector->devices & ATOM_DEVICE_DFP3_SUPPORT)) {
3963 		if (connected) {
3964 			DRM_DEBUG_KMS("DFP3 connected\n");
3965 			bios_0_scratch |= ATOM_S0_DFP3;
3966 			bios_3_scratch |= ATOM_S3_DFP3_ACTIVE;
3967 			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP3;
3968 		} else {
3969 			DRM_DEBUG_KMS("DFP3 disconnected\n");
3970 			bios_0_scratch &= ~ATOM_S0_DFP3;
3971 			bios_3_scratch &= ~ATOM_S3_DFP3_ACTIVE;
3972 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP3;
3973 		}
3974 	}
3975 	if ((radeon_encoder->devices & ATOM_DEVICE_DFP4_SUPPORT) &&
3976 	    (radeon_connector->devices & ATOM_DEVICE_DFP4_SUPPORT)) {
3977 		if (connected) {
3978 			DRM_DEBUG_KMS("DFP4 connected\n");
3979 			bios_0_scratch |= ATOM_S0_DFP4;
3980 			bios_3_scratch |= ATOM_S3_DFP4_ACTIVE;
3981 			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP4;
3982 		} else {
3983 			DRM_DEBUG_KMS("DFP4 disconnected\n");
3984 			bios_0_scratch &= ~ATOM_S0_DFP4;
3985 			bios_3_scratch &= ~ATOM_S3_DFP4_ACTIVE;
3986 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP4;
3987 		}
3988 	}
3989 	if ((radeon_encoder->devices & ATOM_DEVICE_DFP5_SUPPORT) &&
3990 	    (radeon_connector->devices & ATOM_DEVICE_DFP5_SUPPORT)) {
3991 		if (connected) {
3992 			DRM_DEBUG_KMS("DFP5 connected\n");
3993 			bios_0_scratch |= ATOM_S0_DFP5;
3994 			bios_3_scratch |= ATOM_S3_DFP5_ACTIVE;
3995 			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP5;
3996 		} else {
3997 			DRM_DEBUG_KMS("DFP5 disconnected\n");
3998 			bios_0_scratch &= ~ATOM_S0_DFP5;
3999 			bios_3_scratch &= ~ATOM_S3_DFP5_ACTIVE;
4000 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP5;
4001 		}
4002 	}
4003 	if ((radeon_encoder->devices & ATOM_DEVICE_DFP6_SUPPORT) &&
4004 	    (radeon_connector->devices & ATOM_DEVICE_DFP6_SUPPORT)) {
4005 		if (connected) {
4006 			DRM_DEBUG_KMS("DFP6 connected\n");
4007 			bios_0_scratch |= ATOM_S0_DFP6;
4008 			bios_3_scratch |= ATOM_S3_DFP6_ACTIVE;
4009 			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP6;
4010 		} else {
4011 			DRM_DEBUG_KMS("DFP6 disconnected\n");
4012 			bios_0_scratch &= ~ATOM_S0_DFP6;
4013 			bios_3_scratch &= ~ATOM_S3_DFP6_ACTIVE;
4014 			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP6;
4015 		}
4016 	}
4017 
4018 	if (rdev->family >= CHIP_R600) {
4019 		WREG32(R600_BIOS_0_SCRATCH, bios_0_scratch);
4020 		WREG32(R600_BIOS_3_SCRATCH, bios_3_scratch);
4021 		WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
4022 	} else {
4023 		WREG32(RADEON_BIOS_0_SCRATCH, bios_0_scratch);
4024 		WREG32(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
4025 		WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
4026 	}
4027 }
4028 
4029 void
4030 radeon_atombios_encoder_crtc_scratch_regs(struct drm_encoder *encoder, int crtc)
4031 {
4032 	struct drm_device *dev = encoder->dev;
4033 	struct radeon_device *rdev = dev->dev_private;
4034 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
4035 	uint32_t bios_3_scratch;
4036 
4037 	if (ASIC_IS_DCE4(rdev))
4038 		return;
4039 
4040 	if (rdev->family >= CHIP_R600)
4041 		bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH);
4042 	else
4043 		bios_3_scratch = RREG32(RADEON_BIOS_3_SCRATCH);
4044 
4045 	if (radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) {
4046 		bios_3_scratch &= ~ATOM_S3_TV1_CRTC_ACTIVE;
4047 		bios_3_scratch |= (crtc << 18);
4048 	}
4049 	if (radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) {
4050 		bios_3_scratch &= ~ATOM_S3_CV_CRTC_ACTIVE;
4051 		bios_3_scratch |= (crtc << 24);
4052 	}
4053 	if (radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) {
4054 		bios_3_scratch &= ~ATOM_S3_CRT1_CRTC_ACTIVE;
4055 		bios_3_scratch |= (crtc << 16);
4056 	}
4057 	if (radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) {
4058 		bios_3_scratch &= ~ATOM_S3_CRT2_CRTC_ACTIVE;
4059 		bios_3_scratch |= (crtc << 20);
4060 	}
4061 	if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) {
4062 		bios_3_scratch &= ~ATOM_S3_LCD1_CRTC_ACTIVE;
4063 		bios_3_scratch |= (crtc << 17);
4064 	}
4065 	if (radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) {
4066 		bios_3_scratch &= ~ATOM_S3_DFP1_CRTC_ACTIVE;
4067 		bios_3_scratch |= (crtc << 19);
4068 	}
4069 	if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) {
4070 		bios_3_scratch &= ~ATOM_S3_DFP2_CRTC_ACTIVE;
4071 		bios_3_scratch |= (crtc << 23);
4072 	}
4073 	if (radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) {
4074 		bios_3_scratch &= ~ATOM_S3_DFP3_CRTC_ACTIVE;
4075 		bios_3_scratch |= (crtc << 25);
4076 	}
4077 
4078 	if (rdev->family >= CHIP_R600)
4079 		WREG32(R600_BIOS_3_SCRATCH, bios_3_scratch);
4080 	else
4081 		WREG32(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
4082 }
4083 
4084 void
4085 radeon_atombios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on)
4086 {
4087 	struct drm_device *dev = encoder->dev;
4088 	struct radeon_device *rdev = dev->dev_private;
4089 	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
4090 	uint32_t bios_2_scratch;
4091 
4092 	if (ASIC_IS_DCE4(rdev))
4093 		return;
4094 
4095 	if (rdev->family >= CHIP_R600)
4096 		bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH);
4097 	else
4098 		bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH);
4099 
4100 	if (radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) {
4101 		if (on)
4102 			bios_2_scratch &= ~ATOM_S2_TV1_DPMS_STATE;
4103 		else
4104 			bios_2_scratch |= ATOM_S2_TV1_DPMS_STATE;
4105 	}
4106 	if (radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) {
4107 		if (on)
4108 			bios_2_scratch &= ~ATOM_S2_CV_DPMS_STATE;
4109 		else
4110 			bios_2_scratch |= ATOM_S2_CV_DPMS_STATE;
4111 	}
4112 	if (radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) {
4113 		if (on)
4114 			bios_2_scratch &= ~ATOM_S2_CRT1_DPMS_STATE;
4115 		else
4116 			bios_2_scratch |= ATOM_S2_CRT1_DPMS_STATE;
4117 	}
4118 	if (radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) {
4119 		if (on)
4120 			bios_2_scratch &= ~ATOM_S2_CRT2_DPMS_STATE;
4121 		else
4122 			bios_2_scratch |= ATOM_S2_CRT2_DPMS_STATE;
4123 	}
4124 	if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) {
4125 		if (on)
4126 			bios_2_scratch &= ~ATOM_S2_LCD1_DPMS_STATE;
4127 		else
4128 			bios_2_scratch |= ATOM_S2_LCD1_DPMS_STATE;
4129 	}
4130 	if (radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) {
4131 		if (on)
4132 			bios_2_scratch &= ~ATOM_S2_DFP1_DPMS_STATE;
4133 		else
4134 			bios_2_scratch |= ATOM_S2_DFP1_DPMS_STATE;
4135 	}
4136 	if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) {
4137 		if (on)
4138 			bios_2_scratch &= ~ATOM_S2_DFP2_DPMS_STATE;
4139 		else
4140 			bios_2_scratch |= ATOM_S2_DFP2_DPMS_STATE;
4141 	}
4142 	if (radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) {
4143 		if (on)
4144 			bios_2_scratch &= ~ATOM_S2_DFP3_DPMS_STATE;
4145 		else
4146 			bios_2_scratch |= ATOM_S2_DFP3_DPMS_STATE;
4147 	}
4148 	if (radeon_encoder->devices & ATOM_DEVICE_DFP4_SUPPORT) {
4149 		if (on)
4150 			bios_2_scratch &= ~ATOM_S2_DFP4_DPMS_STATE;
4151 		else
4152 			bios_2_scratch |= ATOM_S2_DFP4_DPMS_STATE;
4153 	}
4154 	if (radeon_encoder->devices & ATOM_DEVICE_DFP5_SUPPORT) {
4155 		if (on)
4156 			bios_2_scratch &= ~ATOM_S2_DFP5_DPMS_STATE;
4157 		else
4158 			bios_2_scratch |= ATOM_S2_DFP5_DPMS_STATE;
4159 	}
4160 
4161 	if (rdev->family >= CHIP_R600)
4162 		WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
4163 	else
4164 		WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
4165 }
4166