1 /*
2 * Copyright 2007-8 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21 * OTHER DEALINGS IN THE SOFTWARE.
22 *
23 * Authors: Dave Airlie
24 * Alex Deucher
25 */
26 #include "drmP.h"
27 #include "radeon_drm.h"
28 #include "radeon.h"
29
30 #include "atom.h"
31 #include "atom-bits.h"
32
33 /* from radeon_encoder.c */
34 extern uint32_t
35 radeon_get_encoder_enum(struct drm_device *dev, uint32_t supported_device,
36 uint8_t dac);
37 extern void radeon_link_encoder_connector(struct drm_device *dev);
38 extern void
39 radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_enum,
40 uint32_t supported_device, u16 caps);
41
42 /* from radeon_connector.c */
43 extern void
44 radeon_add_atom_connector(struct drm_device *dev,
45 uint32_t connector_id,
46 uint32_t supported_device,
47 int connector_type,
48 struct radeon_i2c_bus_rec *i2c_bus,
49 uint32_t igp_lane_info,
50 uint16_t connector_object_id,
51 struct radeon_hpd *hpd,
52 struct radeon_router *router);
53
54 /* from radeon_legacy_encoder.c */
55 extern void
56 radeon_add_legacy_encoder(struct drm_device *dev, uint32_t encoder_enum,
57 uint32_t supported_device);
58
59 union atom_supported_devices {
60 struct _ATOM_SUPPORTED_DEVICES_INFO info;
61 struct _ATOM_SUPPORTED_DEVICES_INFO_2 info_2;
62 struct _ATOM_SUPPORTED_DEVICES_INFO_2d1 info_2d1;
63 };
64
radeon_lookup_i2c_gpio(struct radeon_device * rdev,uint8_t id)65 static inline struct radeon_i2c_bus_rec radeon_lookup_i2c_gpio(struct radeon_device *rdev,
66 uint8_t id)
67 {
68 struct atom_context *ctx = rdev->mode_info.atom_context;
69 ATOM_GPIO_I2C_ASSIGMENT *gpio;
70 struct radeon_i2c_bus_rec i2c;
71 int index = GetIndexIntoMasterTable(DATA, GPIO_I2C_Info);
72 struct _ATOM_GPIO_I2C_INFO *i2c_info;
73 uint16_t data_offset, size;
74 int i, num_indices;
75
76 memset(&i2c, 0, sizeof(struct radeon_i2c_bus_rec));
77 i2c.valid = false;
78
79 if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) {
80 i2c_info = (struct _ATOM_GPIO_I2C_INFO *)(ctx->bios + data_offset);
81
82 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
83 sizeof(ATOM_GPIO_I2C_ASSIGMENT);
84
85 for (i = 0; i < num_indices; i++) {
86 gpio = &i2c_info->asGPIO_Info[i];
87
88 /* some evergreen boards have bad data for this entry */
89 if (ASIC_IS_DCE4(rdev)) {
90 if ((i == 7) &&
91 (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1936) &&
92 (gpio->sucI2cId.ucAccess == 0)) {
93 gpio->sucI2cId.ucAccess = 0x97;
94 gpio->ucDataMaskShift = 8;
95 gpio->ucDataEnShift = 8;
96 gpio->ucDataY_Shift = 8;
97 gpio->ucDataA_Shift = 8;
98 }
99 }
100
101 /* some DCE3 boards have bad data for this entry */
102 if (ASIC_IS_DCE3(rdev)) {
103 if ((i == 4) &&
104 (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1fda) &&
105 (gpio->sucI2cId.ucAccess == 0x94))
106 gpio->sucI2cId.ucAccess = 0x14;
107 }
108
109 if (gpio->sucI2cId.ucAccess == id) {
110 i2c.mask_clk_reg = le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4;
111 i2c.mask_data_reg = le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4;
112 i2c.en_clk_reg = le16_to_cpu(gpio->usClkEnRegisterIndex) * 4;
113 i2c.en_data_reg = le16_to_cpu(gpio->usDataEnRegisterIndex) * 4;
114 i2c.y_clk_reg = le16_to_cpu(gpio->usClkY_RegisterIndex) * 4;
115 i2c.y_data_reg = le16_to_cpu(gpio->usDataY_RegisterIndex) * 4;
116 i2c.a_clk_reg = le16_to_cpu(gpio->usClkA_RegisterIndex) * 4;
117 i2c.a_data_reg = le16_to_cpu(gpio->usDataA_RegisterIndex) * 4;
118 i2c.mask_clk_mask = (1 << gpio->ucClkMaskShift);
119 i2c.mask_data_mask = (1 << gpio->ucDataMaskShift);
120 i2c.en_clk_mask = (1 << gpio->ucClkEnShift);
121 i2c.en_data_mask = (1 << gpio->ucDataEnShift);
122 i2c.y_clk_mask = (1 << gpio->ucClkY_Shift);
123 i2c.y_data_mask = (1 << gpio->ucDataY_Shift);
124 i2c.a_clk_mask = (1 << gpio->ucClkA_Shift);
125 i2c.a_data_mask = (1 << gpio->ucDataA_Shift);
126
127 if (gpio->sucI2cId.sbfAccess.bfHW_Capable)
128 i2c.hw_capable = true;
129 else
130 i2c.hw_capable = false;
131
132 if (gpio->sucI2cId.ucAccess == 0xa0)
133 i2c.mm_i2c = true;
134 else
135 i2c.mm_i2c = false;
136
137 i2c.i2c_id = gpio->sucI2cId.ucAccess;
138
139 if (i2c.mask_clk_reg)
140 i2c.valid = true;
141 break;
142 }
143 }
144 }
145
146 return i2c;
147 }
148
radeon_atombios_i2c_init(struct radeon_device * rdev)149 void radeon_atombios_i2c_init(struct radeon_device *rdev)
150 {
151 struct atom_context *ctx = rdev->mode_info.atom_context;
152 ATOM_GPIO_I2C_ASSIGMENT *gpio;
153 struct radeon_i2c_bus_rec i2c;
154 int index = GetIndexIntoMasterTable(DATA, GPIO_I2C_Info);
155 struct _ATOM_GPIO_I2C_INFO *i2c_info;
156 uint16_t data_offset, size;
157 int i, num_indices;
158 char stmp[32];
159
160 memset(&i2c, 0, sizeof(struct radeon_i2c_bus_rec));
161
162 if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) {
163 i2c_info = (struct _ATOM_GPIO_I2C_INFO *)(ctx->bios + data_offset);
164
165 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
166 sizeof(ATOM_GPIO_I2C_ASSIGMENT);
167
168 for (i = 0; i < num_indices; i++) {
169 gpio = &i2c_info->asGPIO_Info[i];
170 i2c.valid = false;
171
172 /* some evergreen boards have bad data for this entry */
173 if (ASIC_IS_DCE4(rdev)) {
174 if ((i == 7) &&
175 (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1936) &&
176 (gpio->sucI2cId.ucAccess == 0)) {
177 gpio->sucI2cId.ucAccess = 0x97;
178 gpio->ucDataMaskShift = 8;
179 gpio->ucDataEnShift = 8;
180 gpio->ucDataY_Shift = 8;
181 gpio->ucDataA_Shift = 8;
182 }
183 }
184
185 /* some DCE3 boards have bad data for this entry */
186 if (ASIC_IS_DCE3(rdev)) {
187 if ((i == 4) &&
188 (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1fda) &&
189 (gpio->sucI2cId.ucAccess == 0x94))
190 gpio->sucI2cId.ucAccess = 0x14;
191 }
192
193 i2c.mask_clk_reg = le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4;
194 i2c.mask_data_reg = le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4;
195 i2c.en_clk_reg = le16_to_cpu(gpio->usClkEnRegisterIndex) * 4;
196 i2c.en_data_reg = le16_to_cpu(gpio->usDataEnRegisterIndex) * 4;
197 i2c.y_clk_reg = le16_to_cpu(gpio->usClkY_RegisterIndex) * 4;
198 i2c.y_data_reg = le16_to_cpu(gpio->usDataY_RegisterIndex) * 4;
199 i2c.a_clk_reg = le16_to_cpu(gpio->usClkA_RegisterIndex) * 4;
200 i2c.a_data_reg = le16_to_cpu(gpio->usDataA_RegisterIndex) * 4;
201 i2c.mask_clk_mask = (1 << gpio->ucClkMaskShift);
202 i2c.mask_data_mask = (1 << gpio->ucDataMaskShift);
203 i2c.en_clk_mask = (1 << gpio->ucClkEnShift);
204 i2c.en_data_mask = (1 << gpio->ucDataEnShift);
205 i2c.y_clk_mask = (1 << gpio->ucClkY_Shift);
206 i2c.y_data_mask = (1 << gpio->ucDataY_Shift);
207 i2c.a_clk_mask = (1 << gpio->ucClkA_Shift);
208 i2c.a_data_mask = (1 << gpio->ucDataA_Shift);
209
210 if (gpio->sucI2cId.sbfAccess.bfHW_Capable)
211 i2c.hw_capable = true;
212 else
213 i2c.hw_capable = false;
214
215 if (gpio->sucI2cId.ucAccess == 0xa0)
216 i2c.mm_i2c = true;
217 else
218 i2c.mm_i2c = false;
219
220 i2c.i2c_id = gpio->sucI2cId.ucAccess;
221
222 if (i2c.mask_clk_reg) {
223 i2c.valid = true;
224 sprintf(stmp, "0x%x", i2c.i2c_id);
225 rdev->i2c_bus[i] = radeon_i2c_create(rdev->ddev, &i2c, stmp);
226 }
227 }
228 }
229 }
230
radeon_lookup_gpio(struct radeon_device * rdev,u8 id)231 static inline struct radeon_gpio_rec radeon_lookup_gpio(struct radeon_device *rdev,
232 u8 id)
233 {
234 struct atom_context *ctx = rdev->mode_info.atom_context;
235 struct radeon_gpio_rec gpio;
236 int index = GetIndexIntoMasterTable(DATA, GPIO_Pin_LUT);
237 struct _ATOM_GPIO_PIN_LUT *gpio_info;
238 ATOM_GPIO_PIN_ASSIGNMENT *pin;
239 u16 data_offset, size;
240 int i, num_indices;
241
242 memset(&gpio, 0, sizeof(struct radeon_gpio_rec));
243 gpio.valid = false;
244
245 if (atom_parse_data_header(ctx, index, &size, NULL, NULL, &data_offset)) {
246 gpio_info = (struct _ATOM_GPIO_PIN_LUT *)(ctx->bios + data_offset);
247
248 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
249 sizeof(ATOM_GPIO_PIN_ASSIGNMENT);
250
251 for (i = 0; i < num_indices; i++) {
252 pin = &gpio_info->asGPIO_Pin[i];
253 if (id == pin->ucGPIO_ID) {
254 gpio.id = pin->ucGPIO_ID;
255 gpio.reg = le16_to_cpu(pin->usGpioPin_AIndex) * 4;
256 gpio.mask = (1 << pin->ucGpioPinBitShift);
257 gpio.valid = true;
258 break;
259 }
260 }
261 }
262
263 return gpio;
264 }
265
radeon_atom_get_hpd_info_from_gpio(struct radeon_device * rdev,struct radeon_gpio_rec * gpio)266 static struct radeon_hpd radeon_atom_get_hpd_info_from_gpio(struct radeon_device *rdev,
267 struct radeon_gpio_rec *gpio)
268 {
269 struct radeon_hpd hpd;
270 u32 reg;
271
272 memset(&hpd, 0, sizeof(struct radeon_hpd));
273
274 if (ASIC_IS_DCE4(rdev))
275 reg = EVERGREEN_DC_GPIO_HPD_A;
276 else
277 reg = AVIVO_DC_GPIO_HPD_A;
278
279 hpd.gpio = *gpio;
280 if (gpio->reg == reg) {
281 switch(gpio->mask) {
282 case (1 << 0):
283 hpd.hpd = RADEON_HPD_1;
284 break;
285 case (1 << 8):
286 hpd.hpd = RADEON_HPD_2;
287 break;
288 case (1 << 16):
289 hpd.hpd = RADEON_HPD_3;
290 break;
291 case (1 << 24):
292 hpd.hpd = RADEON_HPD_4;
293 break;
294 case (1 << 26):
295 hpd.hpd = RADEON_HPD_5;
296 break;
297 case (1 << 28):
298 hpd.hpd = RADEON_HPD_6;
299 break;
300 default:
301 hpd.hpd = RADEON_HPD_NONE;
302 break;
303 }
304 } else
305 hpd.hpd = RADEON_HPD_NONE;
306 return hpd;
307 }
308
radeon_atom_apply_quirks(struct drm_device * dev,uint32_t supported_device,int * connector_type,struct radeon_i2c_bus_rec * i2c_bus,uint16_t * line_mux,struct radeon_hpd * hpd)309 static bool radeon_atom_apply_quirks(struct drm_device *dev,
310 uint32_t supported_device,
311 int *connector_type,
312 struct radeon_i2c_bus_rec *i2c_bus,
313 uint16_t *line_mux,
314 struct radeon_hpd *hpd)
315 {
316
317 /* Asus M2A-VM HDMI board lists the DVI port as HDMI */
318 if ((dev->pdev->device == 0x791e) &&
319 (dev->pdev->subsystem_vendor == 0x1043) &&
320 (dev->pdev->subsystem_device == 0x826d)) {
321 if ((*connector_type == DRM_MODE_CONNECTOR_HDMIA) &&
322 (supported_device == ATOM_DEVICE_DFP3_SUPPORT))
323 *connector_type = DRM_MODE_CONNECTOR_DVID;
324 }
325
326 /* Asrock RS600 board lists the DVI port as HDMI */
327 if ((dev->pdev->device == 0x7941) &&
328 (dev->pdev->subsystem_vendor == 0x1849) &&
329 (dev->pdev->subsystem_device == 0x7941)) {
330 if ((*connector_type == DRM_MODE_CONNECTOR_HDMIA) &&
331 (supported_device == ATOM_DEVICE_DFP3_SUPPORT))
332 *connector_type = DRM_MODE_CONNECTOR_DVID;
333 }
334
335 /* MSI K9A2GM V2/V3 board has no HDMI or DVI */
336 if ((dev->pdev->device == 0x796e) &&
337 (dev->pdev->subsystem_vendor == 0x1462) &&
338 (dev->pdev->subsystem_device == 0x7302)) {
339 if ((supported_device == ATOM_DEVICE_DFP2_SUPPORT) ||
340 (supported_device == ATOM_DEVICE_DFP3_SUPPORT))
341 return false;
342 }
343
344 /* a-bit f-i90hd - ciaranm on #radeonhd - this board has no DVI */
345 if ((dev->pdev->device == 0x7941) &&
346 (dev->pdev->subsystem_vendor == 0x147b) &&
347 (dev->pdev->subsystem_device == 0x2412)) {
348 if (*connector_type == DRM_MODE_CONNECTOR_DVII)
349 return false;
350 }
351
352 /* Falcon NW laptop lists vga ddc line for LVDS */
353 if ((dev->pdev->device == 0x5653) &&
354 (dev->pdev->subsystem_vendor == 0x1462) &&
355 (dev->pdev->subsystem_device == 0x0291)) {
356 if (*connector_type == DRM_MODE_CONNECTOR_LVDS) {
357 i2c_bus->valid = false;
358 *line_mux = 53;
359 }
360 }
361
362 /* HIS X1300 is DVI+VGA, not DVI+DVI */
363 if ((dev->pdev->device == 0x7146) &&
364 (dev->pdev->subsystem_vendor == 0x17af) &&
365 (dev->pdev->subsystem_device == 0x2058)) {
366 if (supported_device == ATOM_DEVICE_DFP1_SUPPORT)
367 return false;
368 }
369
370 /* Gigabyte X1300 is DVI+VGA, not DVI+DVI */
371 if ((dev->pdev->device == 0x7142) &&
372 (dev->pdev->subsystem_vendor == 0x1458) &&
373 (dev->pdev->subsystem_device == 0x2134)) {
374 if (supported_device == ATOM_DEVICE_DFP1_SUPPORT)
375 return false;
376 }
377
378
379 /* Funky macbooks */
380 if ((dev->pdev->device == 0x71C5) &&
381 (dev->pdev->subsystem_vendor == 0x106b) &&
382 (dev->pdev->subsystem_device == 0x0080)) {
383 if ((supported_device == ATOM_DEVICE_CRT1_SUPPORT) ||
384 (supported_device == ATOM_DEVICE_DFP2_SUPPORT))
385 return false;
386 if (supported_device == ATOM_DEVICE_CRT2_SUPPORT)
387 *line_mux = 0x90;
388 }
389
390 /* mac rv630, rv730, others */
391 if ((supported_device == ATOM_DEVICE_TV1_SUPPORT) &&
392 (*connector_type == DRM_MODE_CONNECTOR_DVII)) {
393 *connector_type = DRM_MODE_CONNECTOR_9PinDIN;
394 *line_mux = CONNECTOR_7PIN_DIN_ENUM_ID1;
395 }
396
397 /* ASUS HD 3600 XT board lists the DVI port as HDMI */
398 if ((dev->pdev->device == 0x9598) &&
399 (dev->pdev->subsystem_vendor == 0x1043) &&
400 (dev->pdev->subsystem_device == 0x01da)) {
401 if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
402 *connector_type = DRM_MODE_CONNECTOR_DVII;
403 }
404 }
405
406 /* ASUS HD 3600 board lists the DVI port as HDMI */
407 if ((dev->pdev->device == 0x9598) &&
408 (dev->pdev->subsystem_vendor == 0x1043) &&
409 (dev->pdev->subsystem_device == 0x01e4)) {
410 if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
411 *connector_type = DRM_MODE_CONNECTOR_DVII;
412 }
413 }
414
415 /* ASUS HD 3450 board lists the DVI port as HDMI */
416 if ((dev->pdev->device == 0x95C5) &&
417 (dev->pdev->subsystem_vendor == 0x1043) &&
418 (dev->pdev->subsystem_device == 0x01e2)) {
419 if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
420 *connector_type = DRM_MODE_CONNECTOR_DVII;
421 }
422 }
423
424 /* some BIOSes seem to report DAC on HDMI - usually this is a board with
425 * HDMI + VGA reporting as HDMI
426 */
427 if (*connector_type == DRM_MODE_CONNECTOR_HDMIA) {
428 if (supported_device & (ATOM_DEVICE_CRT_SUPPORT)) {
429 *connector_type = DRM_MODE_CONNECTOR_VGA;
430 *line_mux = 0;
431 }
432 }
433
434 /* Acer laptop (Acer TravelMate 5730/5730G) has an HDMI port
435 * on the laptop and a DVI port on the docking station and
436 * both share the same encoder, hpd pin, and ddc line.
437 * So while the bios table is technically correct,
438 * we drop the DVI port here since xrandr has no concept of
439 * encoders and will try and drive both connectors
440 * with different crtcs which isn't possible on the hardware
441 * side and leaves no crtcs for LVDS or VGA.
442 */
443 if (((dev->pdev->device == 0x95c4) || (dev->pdev->device == 0x9591)) &&
444 (dev->pdev->subsystem_vendor == 0x1025) &&
445 (dev->pdev->subsystem_device == 0x013c)) {
446 if ((*connector_type == DRM_MODE_CONNECTOR_DVII) &&
447 (supported_device == ATOM_DEVICE_DFP1_SUPPORT)) {
448 /* actually it's a DVI-D port not DVI-I */
449 *connector_type = DRM_MODE_CONNECTOR_DVID;
450 return false;
451 }
452 }
453
454 /* XFX Pine Group device rv730 reports no VGA DDC lines
455 * even though they are wired up to record 0x93
456 */
457 if ((dev->pdev->device == 0x9498) &&
458 (dev->pdev->subsystem_vendor == 0x1682) &&
459 (dev->pdev->subsystem_device == 0x2452)) {
460 struct radeon_device *rdev = dev->dev_private;
461 *i2c_bus = radeon_lookup_i2c_gpio(rdev, 0x93);
462 }
463 return true;
464 }
465
466 const int supported_devices_connector_convert[] = {
467 DRM_MODE_CONNECTOR_Unknown,
468 DRM_MODE_CONNECTOR_VGA,
469 DRM_MODE_CONNECTOR_DVII,
470 DRM_MODE_CONNECTOR_DVID,
471 DRM_MODE_CONNECTOR_DVIA,
472 DRM_MODE_CONNECTOR_SVIDEO,
473 DRM_MODE_CONNECTOR_Composite,
474 DRM_MODE_CONNECTOR_LVDS,
475 DRM_MODE_CONNECTOR_Unknown,
476 DRM_MODE_CONNECTOR_Unknown,
477 DRM_MODE_CONNECTOR_HDMIA,
478 DRM_MODE_CONNECTOR_HDMIB,
479 DRM_MODE_CONNECTOR_Unknown,
480 DRM_MODE_CONNECTOR_Unknown,
481 DRM_MODE_CONNECTOR_9PinDIN,
482 DRM_MODE_CONNECTOR_DisplayPort
483 };
484
485 const uint16_t supported_devices_connector_object_id_convert[] = {
486 CONNECTOR_OBJECT_ID_NONE,
487 CONNECTOR_OBJECT_ID_VGA,
488 CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I, /* not all boards support DL */
489 CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D, /* not all boards support DL */
490 CONNECTOR_OBJECT_ID_VGA, /* technically DVI-A */
491 CONNECTOR_OBJECT_ID_COMPOSITE,
492 CONNECTOR_OBJECT_ID_SVIDEO,
493 CONNECTOR_OBJECT_ID_LVDS,
494 CONNECTOR_OBJECT_ID_9PIN_DIN,
495 CONNECTOR_OBJECT_ID_9PIN_DIN,
496 CONNECTOR_OBJECT_ID_DISPLAYPORT,
497 CONNECTOR_OBJECT_ID_HDMI_TYPE_A,
498 CONNECTOR_OBJECT_ID_HDMI_TYPE_B,
499 CONNECTOR_OBJECT_ID_SVIDEO
500 };
501
502 const int object_connector_convert[] = {
503 DRM_MODE_CONNECTOR_Unknown,
504 DRM_MODE_CONNECTOR_DVII,
505 DRM_MODE_CONNECTOR_DVII,
506 DRM_MODE_CONNECTOR_DVID,
507 DRM_MODE_CONNECTOR_DVID,
508 DRM_MODE_CONNECTOR_VGA,
509 DRM_MODE_CONNECTOR_Composite,
510 DRM_MODE_CONNECTOR_SVIDEO,
511 DRM_MODE_CONNECTOR_Unknown,
512 DRM_MODE_CONNECTOR_Unknown,
513 DRM_MODE_CONNECTOR_9PinDIN,
514 DRM_MODE_CONNECTOR_Unknown,
515 DRM_MODE_CONNECTOR_HDMIA,
516 DRM_MODE_CONNECTOR_HDMIB,
517 DRM_MODE_CONNECTOR_LVDS,
518 DRM_MODE_CONNECTOR_9PinDIN,
519 DRM_MODE_CONNECTOR_Unknown,
520 DRM_MODE_CONNECTOR_Unknown,
521 DRM_MODE_CONNECTOR_Unknown,
522 DRM_MODE_CONNECTOR_DisplayPort,
523 DRM_MODE_CONNECTOR_eDP,
524 DRM_MODE_CONNECTOR_Unknown
525 };
526
radeon_get_atom_connector_info_from_object_table(struct drm_device * dev)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
atombios_get_connector_object_id(struct drm_device * dev,int connector_type,uint16_t devices)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
radeon_get_atom_connector_info_from_supported_devices_table(struct drm_device * dev)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
radeon_atom_get_clock_info(struct drm_device * dev)1115 bool radeon_atom_get_clock_info(struct drm_device *dev)
1116 {
1117 struct radeon_device *rdev = dev->dev_private;
1118 struct radeon_mode_info *mode_info = &rdev->mode_info;
1119 int index = GetIndexIntoMasterTable(DATA, FirmwareInfo);
1120 union firmware_info *firmware_info;
1121 uint8_t frev, crev;
1122 struct radeon_pll *p1pll = &rdev->clock.p1pll;
1123 struct radeon_pll *p2pll = &rdev->clock.p2pll;
1124 struct radeon_pll *dcpll = &rdev->clock.dcpll;
1125 struct radeon_pll *spll = &rdev->clock.spll;
1126 struct radeon_pll *mpll = &rdev->clock.mpll;
1127 uint16_t data_offset;
1128
1129 if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1130 &frev, &crev, &data_offset)) {
1131 firmware_info =
1132 (union firmware_info *)(mode_info->atom_context->bios +
1133 data_offset);
1134 /* pixel clocks */
1135 p1pll->reference_freq =
1136 le16_to_cpu(firmware_info->info.usReferenceClock);
1137 p1pll->reference_div = 0;
1138
1139 if (crev < 2)
1140 p1pll->pll_out_min =
1141 le16_to_cpu(firmware_info->info.usMinPixelClockPLL_Output);
1142 else
1143 p1pll->pll_out_min =
1144 le32_to_cpu(firmware_info->info_12.ulMinPixelClockPLL_Output);
1145 p1pll->pll_out_max =
1146 le32_to_cpu(firmware_info->info.ulMaxPixelClockPLL_Output);
1147
1148 if (crev >= 4) {
1149 p1pll->lcd_pll_out_min =
1150 le16_to_cpu(firmware_info->info_14.usLcdMinPixelClockPLL_Output) * 100;
1151 if (p1pll->lcd_pll_out_min == 0)
1152 p1pll->lcd_pll_out_min = p1pll->pll_out_min;
1153 p1pll->lcd_pll_out_max =
1154 le16_to_cpu(firmware_info->info_14.usLcdMaxPixelClockPLL_Output) * 100;
1155 if (p1pll->lcd_pll_out_max == 0)
1156 p1pll->lcd_pll_out_max = p1pll->pll_out_max;
1157 } else {
1158 p1pll->lcd_pll_out_min = p1pll->pll_out_min;
1159 p1pll->lcd_pll_out_max = p1pll->pll_out_max;
1160 }
1161
1162 if (p1pll->pll_out_min == 0) {
1163 if (ASIC_IS_AVIVO(rdev))
1164 p1pll->pll_out_min = 64800;
1165 else
1166 p1pll->pll_out_min = 20000;
1167 }
1168
1169 p1pll->pll_in_min =
1170 le16_to_cpu(firmware_info->info.usMinPixelClockPLL_Input);
1171 p1pll->pll_in_max =
1172 le16_to_cpu(firmware_info->info.usMaxPixelClockPLL_Input);
1173
1174 *p2pll = *p1pll;
1175
1176 /* system clock */
1177 if (ASIC_IS_DCE4(rdev))
1178 spll->reference_freq =
1179 le16_to_cpu(firmware_info->info_21.usCoreReferenceClock);
1180 else
1181 spll->reference_freq =
1182 le16_to_cpu(firmware_info->info.usReferenceClock);
1183 spll->reference_div = 0;
1184
1185 spll->pll_out_min =
1186 le16_to_cpu(firmware_info->info.usMinEngineClockPLL_Output);
1187 spll->pll_out_max =
1188 le32_to_cpu(firmware_info->info.ulMaxEngineClockPLL_Output);
1189
1190 /* ??? */
1191 if (spll->pll_out_min == 0) {
1192 if (ASIC_IS_AVIVO(rdev))
1193 spll->pll_out_min = 64800;
1194 else
1195 spll->pll_out_min = 20000;
1196 }
1197
1198 spll->pll_in_min =
1199 le16_to_cpu(firmware_info->info.usMinEngineClockPLL_Input);
1200 spll->pll_in_max =
1201 le16_to_cpu(firmware_info->info.usMaxEngineClockPLL_Input);
1202
1203 /* memory clock */
1204 if (ASIC_IS_DCE4(rdev))
1205 mpll->reference_freq =
1206 le16_to_cpu(firmware_info->info_21.usMemoryReferenceClock);
1207 else
1208 mpll->reference_freq =
1209 le16_to_cpu(firmware_info->info.usReferenceClock);
1210 mpll->reference_div = 0;
1211
1212 mpll->pll_out_min =
1213 le16_to_cpu(firmware_info->info.usMinMemoryClockPLL_Output);
1214 mpll->pll_out_max =
1215 le32_to_cpu(firmware_info->info.ulMaxMemoryClockPLL_Output);
1216
1217 /* ??? */
1218 if (mpll->pll_out_min == 0) {
1219 if (ASIC_IS_AVIVO(rdev))
1220 mpll->pll_out_min = 64800;
1221 else
1222 mpll->pll_out_min = 20000;
1223 }
1224
1225 mpll->pll_in_min =
1226 le16_to_cpu(firmware_info->info.usMinMemoryClockPLL_Input);
1227 mpll->pll_in_max =
1228 le16_to_cpu(firmware_info->info.usMaxMemoryClockPLL_Input);
1229
1230 rdev->clock.default_sclk =
1231 le32_to_cpu(firmware_info->info.ulDefaultEngineClock);
1232 rdev->clock.default_mclk =
1233 le32_to_cpu(firmware_info->info.ulDefaultMemoryClock);
1234
1235 if (ASIC_IS_DCE4(rdev)) {
1236 rdev->clock.default_dispclk =
1237 le32_to_cpu(firmware_info->info_21.ulDefaultDispEngineClkFreq);
1238 if (rdev->clock.default_dispclk == 0) {
1239 if (ASIC_IS_DCE5(rdev))
1240 rdev->clock.default_dispclk = 54000; /* 540 Mhz */
1241 else
1242 rdev->clock.default_dispclk = 60000; /* 600 Mhz */
1243 }
1244 rdev->clock.dp_extclk =
1245 le16_to_cpu(firmware_info->info_21.usUniphyDPModeExtClkFreq);
1246 }
1247 *dcpll = *p1pll;
1248
1249 return true;
1250 }
1251
1252 return false;
1253 }
1254
1255 union igp_info {
1256 struct _ATOM_INTEGRATED_SYSTEM_INFO info;
1257 struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 info_2;
1258 };
1259
radeon_atombios_sideport_present(struct radeon_device * rdev)1260 bool radeon_atombios_sideport_present(struct radeon_device *rdev)
1261 {
1262 struct radeon_mode_info *mode_info = &rdev->mode_info;
1263 int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo);
1264 union igp_info *igp_info;
1265 u8 frev, crev;
1266 u16 data_offset;
1267
1268 /* sideport is AMD only */
1269 if (rdev->family == CHIP_RS600)
1270 return false;
1271
1272 if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1273 &frev, &crev, &data_offset)) {
1274 igp_info = (union igp_info *)(mode_info->atom_context->bios +
1275 data_offset);
1276 switch (crev) {
1277 case 1:
1278 if (le32_to_cpu(igp_info->info.ulBootUpMemoryClock))
1279 return true;
1280 break;
1281 case 2:
1282 if (le32_to_cpu(igp_info->info_2.ulBootUpSidePortClock))
1283 return true;
1284 break;
1285 default:
1286 DRM_ERROR("Unsupported IGP table: %d %d\n", frev, crev);
1287 break;
1288 }
1289 }
1290 return false;
1291 }
1292
radeon_atombios_get_tmds_info(struct radeon_encoder * encoder,struct radeon_encoder_int_tmds * tmds)1293 bool radeon_atombios_get_tmds_info(struct radeon_encoder *encoder,
1294 struct radeon_encoder_int_tmds *tmds)
1295 {
1296 struct drm_device *dev = encoder->base.dev;
1297 struct radeon_device *rdev = dev->dev_private;
1298 struct radeon_mode_info *mode_info = &rdev->mode_info;
1299 int index = GetIndexIntoMasterTable(DATA, TMDS_Info);
1300 uint16_t data_offset;
1301 struct _ATOM_TMDS_INFO *tmds_info;
1302 uint8_t frev, crev;
1303 uint16_t maxfreq;
1304 int i;
1305
1306 if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1307 &frev, &crev, &data_offset)) {
1308 tmds_info =
1309 (struct _ATOM_TMDS_INFO *)(mode_info->atom_context->bios +
1310 data_offset);
1311
1312 maxfreq = le16_to_cpu(tmds_info->usMaxFrequency);
1313 for (i = 0; i < 4; i++) {
1314 tmds->tmds_pll[i].freq =
1315 le16_to_cpu(tmds_info->asMiscInfo[i].usFrequency);
1316 tmds->tmds_pll[i].value =
1317 tmds_info->asMiscInfo[i].ucPLL_ChargePump & 0x3f;
1318 tmds->tmds_pll[i].value |=
1319 (tmds_info->asMiscInfo[i].
1320 ucPLL_VCO_Gain & 0x3f) << 6;
1321 tmds->tmds_pll[i].value |=
1322 (tmds_info->asMiscInfo[i].
1323 ucPLL_DutyCycle & 0xf) << 12;
1324 tmds->tmds_pll[i].value |=
1325 (tmds_info->asMiscInfo[i].
1326 ucPLL_VoltageSwing & 0xf) << 16;
1327
1328 DRM_DEBUG_KMS("TMDS PLL From ATOMBIOS %u %x\n",
1329 tmds->tmds_pll[i].freq,
1330 tmds->tmds_pll[i].value);
1331
1332 if (maxfreq == tmds->tmds_pll[i].freq) {
1333 tmds->tmds_pll[i].freq = 0xffffffff;
1334 break;
1335 }
1336 }
1337 return true;
1338 }
1339 return false;
1340 }
1341
radeon_atombios_get_ppll_ss_info(struct radeon_device * rdev,struct radeon_atom_ss * ss,int id)1342 bool radeon_atombios_get_ppll_ss_info(struct radeon_device *rdev,
1343 struct radeon_atom_ss *ss,
1344 int id)
1345 {
1346 struct radeon_mode_info *mode_info = &rdev->mode_info;
1347 int index = GetIndexIntoMasterTable(DATA, PPLL_SS_Info);
1348 uint16_t data_offset, size;
1349 struct _ATOM_SPREAD_SPECTRUM_INFO *ss_info;
1350 uint8_t frev, crev;
1351 int i, num_indices;
1352
1353 memset(ss, 0, sizeof(struct radeon_atom_ss));
1354 if (atom_parse_data_header(mode_info->atom_context, index, &size,
1355 &frev, &crev, &data_offset)) {
1356 ss_info =
1357 (struct _ATOM_SPREAD_SPECTRUM_INFO *)(mode_info->atom_context->bios + data_offset);
1358
1359 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1360 sizeof(ATOM_SPREAD_SPECTRUM_ASSIGNMENT);
1361
1362 for (i = 0; i < num_indices; i++) {
1363 if (ss_info->asSS_Info[i].ucSS_Id == id) {
1364 ss->percentage =
1365 le16_to_cpu(ss_info->asSS_Info[i].usSpreadSpectrumPercentage);
1366 ss->type = ss_info->asSS_Info[i].ucSpreadSpectrumType;
1367 ss->step = ss_info->asSS_Info[i].ucSS_Step;
1368 ss->delay = ss_info->asSS_Info[i].ucSS_Delay;
1369 ss->range = ss_info->asSS_Info[i].ucSS_Range;
1370 ss->refdiv = ss_info->asSS_Info[i].ucRecommendedRef_Div;
1371 return true;
1372 }
1373 }
1374 }
1375 return false;
1376 }
1377
radeon_atombios_get_igp_ss_overrides(struct radeon_device * rdev,struct radeon_atom_ss * ss,int id)1378 static void radeon_atombios_get_igp_ss_overrides(struct radeon_device *rdev,
1379 struct radeon_atom_ss *ss,
1380 int id)
1381 {
1382 struct radeon_mode_info *mode_info = &rdev->mode_info;
1383 int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo);
1384 u16 data_offset, size;
1385 struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 *igp_info;
1386 u8 frev, crev;
1387 u16 percentage = 0, rate = 0;
1388
1389 /* get any igp specific overrides */
1390 if (atom_parse_data_header(mode_info->atom_context, index, &size,
1391 &frev, &crev, &data_offset)) {
1392 igp_info = (struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 *)
1393 (mode_info->atom_context->bios + data_offset);
1394 switch (id) {
1395 case ASIC_INTERNAL_SS_ON_TMDS:
1396 percentage = le16_to_cpu(igp_info->usDVISSPercentage);
1397 rate = le16_to_cpu(igp_info->usDVISSpreadRateIn10Hz);
1398 break;
1399 case ASIC_INTERNAL_SS_ON_HDMI:
1400 percentage = le16_to_cpu(igp_info->usHDMISSPercentage);
1401 rate = le16_to_cpu(igp_info->usHDMISSpreadRateIn10Hz);
1402 break;
1403 case ASIC_INTERNAL_SS_ON_LVDS:
1404 percentage = le16_to_cpu(igp_info->usLvdsSSPercentage);
1405 rate = le16_to_cpu(igp_info->usLvdsSSpreadRateIn10Hz);
1406 break;
1407 }
1408 if (percentage)
1409 ss->percentage = percentage;
1410 if (rate)
1411 ss->rate = rate;
1412 }
1413 }
1414
1415 union asic_ss_info {
1416 struct _ATOM_ASIC_INTERNAL_SS_INFO info;
1417 struct _ATOM_ASIC_INTERNAL_SS_INFO_V2 info_2;
1418 struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 info_3;
1419 };
1420
radeon_atombios_get_asic_ss_info(struct radeon_device * rdev,struct radeon_atom_ss * ss,int id,u32 clock)1421 bool radeon_atombios_get_asic_ss_info(struct radeon_device *rdev,
1422 struct radeon_atom_ss *ss,
1423 int id, u32 clock)
1424 {
1425 struct radeon_mode_info *mode_info = &rdev->mode_info;
1426 int index = GetIndexIntoMasterTable(DATA, ASIC_InternalSS_Info);
1427 uint16_t data_offset, size;
1428 union asic_ss_info *ss_info;
1429 uint8_t frev, crev;
1430 int i, num_indices;
1431
1432 memset(ss, 0, sizeof(struct radeon_atom_ss));
1433 if (atom_parse_data_header(mode_info->atom_context, index, &size,
1434 &frev, &crev, &data_offset)) {
1435
1436 ss_info =
1437 (union asic_ss_info *)(mode_info->atom_context->bios + data_offset);
1438
1439 switch (frev) {
1440 case 1:
1441 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1442 sizeof(ATOM_ASIC_SS_ASSIGNMENT);
1443
1444 for (i = 0; i < num_indices; i++) {
1445 if ((ss_info->info.asSpreadSpectrum[i].ucClockIndication == id) &&
1446 (clock <= le32_to_cpu(ss_info->info.asSpreadSpectrum[i].ulTargetClockRange))) {
1447 ss->percentage =
1448 le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1449 ss->type = ss_info->info.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1450 ss->rate = le16_to_cpu(ss_info->info.asSpreadSpectrum[i].usSpreadRateInKhz);
1451 return true;
1452 }
1453 }
1454 break;
1455 case 2:
1456 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1457 sizeof(ATOM_ASIC_SS_ASSIGNMENT_V2);
1458 for (i = 0; i < num_indices; i++) {
1459 if ((ss_info->info_2.asSpreadSpectrum[i].ucClockIndication == id) &&
1460 (clock <= le32_to_cpu(ss_info->info_2.asSpreadSpectrum[i].ulTargetClockRange))) {
1461 ss->percentage =
1462 le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1463 ss->type = ss_info->info_2.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1464 ss->rate = le16_to_cpu(ss_info->info_2.asSpreadSpectrum[i].usSpreadRateIn10Hz);
1465 return true;
1466 }
1467 }
1468 break;
1469 case 3:
1470 num_indices = (size - sizeof(ATOM_COMMON_TABLE_HEADER)) /
1471 sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3);
1472 for (i = 0; i < num_indices; i++) {
1473 if ((ss_info->info_3.asSpreadSpectrum[i].ucClockIndication == id) &&
1474 (clock <= le32_to_cpu(ss_info->info_3.asSpreadSpectrum[i].ulTargetClockRange))) {
1475 ss->percentage =
1476 le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadSpectrumPercentage);
1477 ss->type = ss_info->info_3.asSpreadSpectrum[i].ucSpreadSpectrumMode;
1478 ss->rate = le16_to_cpu(ss_info->info_3.asSpreadSpectrum[i].usSpreadRateIn10Hz);
1479 if (rdev->flags & RADEON_IS_IGP)
1480 radeon_atombios_get_igp_ss_overrides(rdev, ss, id);
1481 return true;
1482 }
1483 }
1484 break;
1485 default:
1486 DRM_ERROR("Unsupported ASIC_InternalSS_Info table: %d %d\n", frev, crev);
1487 break;
1488 }
1489
1490 }
1491 return false;
1492 }
1493
1494 union lvds_info {
1495 struct _ATOM_LVDS_INFO info;
1496 struct _ATOM_LVDS_INFO_V12 info_12;
1497 };
1498
radeon_atombios_get_lvds_info(struct radeon_encoder * encoder)1499 struct radeon_encoder_atom_dig *radeon_atombios_get_lvds_info(struct
1500 radeon_encoder
1501 *encoder)
1502 {
1503 struct drm_device *dev = encoder->base.dev;
1504 struct radeon_device *rdev = dev->dev_private;
1505 struct radeon_mode_info *mode_info = &rdev->mode_info;
1506 int index = GetIndexIntoMasterTable(DATA, LVDS_Info);
1507 uint16_t data_offset, misc;
1508 union lvds_info *lvds_info;
1509 uint8_t frev, crev;
1510 struct radeon_encoder_atom_dig *lvds = NULL;
1511 int encoder_enum = (encoder->encoder_enum & ENUM_ID_MASK) >> ENUM_ID_SHIFT;
1512
1513 if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1514 &frev, &crev, &data_offset)) {
1515 lvds_info =
1516 (union lvds_info *)(mode_info->atom_context->bios + data_offset);
1517 lvds =
1518 kzalloc(sizeof(struct radeon_encoder_atom_dig), GFP_KERNEL);
1519
1520 if (!lvds)
1521 return NULL;
1522
1523 lvds->native_mode.clock =
1524 le16_to_cpu(lvds_info->info.sLCDTiming.usPixClk) * 10;
1525 lvds->native_mode.hdisplay =
1526 le16_to_cpu(lvds_info->info.sLCDTiming.usHActive);
1527 lvds->native_mode.vdisplay =
1528 le16_to_cpu(lvds_info->info.sLCDTiming.usVActive);
1529 lvds->native_mode.htotal = lvds->native_mode.hdisplay +
1530 le16_to_cpu(lvds_info->info.sLCDTiming.usHBlanking_Time);
1531 lvds->native_mode.hsync_start = lvds->native_mode.hdisplay +
1532 le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncOffset);
1533 lvds->native_mode.hsync_end = lvds->native_mode.hsync_start +
1534 le16_to_cpu(lvds_info->info.sLCDTiming.usHSyncWidth);
1535 lvds->native_mode.vtotal = lvds->native_mode.vdisplay +
1536 le16_to_cpu(lvds_info->info.sLCDTiming.usVBlanking_Time);
1537 lvds->native_mode.vsync_start = lvds->native_mode.vdisplay +
1538 le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncOffset);
1539 lvds->native_mode.vsync_end = lvds->native_mode.vsync_start +
1540 le16_to_cpu(lvds_info->info.sLCDTiming.usVSyncWidth);
1541 lvds->panel_pwr_delay =
1542 le16_to_cpu(lvds_info->info.usOffDelayInMs);
1543 lvds->lcd_misc = lvds_info->info.ucLVDS_Misc;
1544
1545 misc = le16_to_cpu(lvds_info->info.sLCDTiming.susModeMiscInfo.usAccess);
1546 if (misc & ATOM_VSYNC_POLARITY)
1547 lvds->native_mode.flags |= DRM_MODE_FLAG_NVSYNC;
1548 if (misc & ATOM_HSYNC_POLARITY)
1549 lvds->native_mode.flags |= DRM_MODE_FLAG_NHSYNC;
1550 if (misc & ATOM_COMPOSITESYNC)
1551 lvds->native_mode.flags |= DRM_MODE_FLAG_CSYNC;
1552 if (misc & ATOM_INTERLACE)
1553 lvds->native_mode.flags |= DRM_MODE_FLAG_INTERLACE;
1554 if (misc & ATOM_DOUBLE_CLOCK_MODE)
1555 lvds->native_mode.flags |= DRM_MODE_FLAG_DBLSCAN;
1556
1557 lvds->native_mode.width_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageHSize);
1558 lvds->native_mode.height_mm = le16_to_cpu(lvds_info->info.sLCDTiming.usImageVSize);
1559
1560 /* set crtc values */
1561 drm_mode_set_crtcinfo(&lvds->native_mode, CRTC_INTERLACE_HALVE_V);
1562
1563 lvds->lcd_ss_id = lvds_info->info.ucSS_Id;
1564
1565 encoder->native_mode = lvds->native_mode;
1566
1567 if (encoder_enum == 2)
1568 lvds->linkb = true;
1569 else
1570 lvds->linkb = false;
1571
1572 /* parse the lcd record table */
1573 if (le16_to_cpu(lvds_info->info.usModePatchTableOffset)) {
1574 ATOM_FAKE_EDID_PATCH_RECORD *fake_edid_record;
1575 ATOM_PANEL_RESOLUTION_PATCH_RECORD *panel_res_record;
1576 bool bad_record = false;
1577 u8 *record;
1578
1579 if ((frev == 1) && (crev < 2))
1580 /* absolute */
1581 record = (u8 *)(mode_info->atom_context->bios +
1582 le16_to_cpu(lvds_info->info.usModePatchTableOffset));
1583 else
1584 /* relative */
1585 record = (u8 *)(mode_info->atom_context->bios +
1586 data_offset +
1587 le16_to_cpu(lvds_info->info.usModePatchTableOffset));
1588 while (*record != ATOM_RECORD_END_TYPE) {
1589 switch (*record) {
1590 case LCD_MODE_PATCH_RECORD_MODE_TYPE:
1591 record += sizeof(ATOM_PATCH_RECORD_MODE);
1592 break;
1593 case LCD_RTS_RECORD_TYPE:
1594 record += sizeof(ATOM_LCD_RTS_RECORD);
1595 break;
1596 case LCD_CAP_RECORD_TYPE:
1597 record += sizeof(ATOM_LCD_MODE_CONTROL_CAP);
1598 break;
1599 case LCD_FAKE_EDID_PATCH_RECORD_TYPE:
1600 fake_edid_record = (ATOM_FAKE_EDID_PATCH_RECORD *)record;
1601 if (fake_edid_record->ucFakeEDIDLength) {
1602 struct edid *edid;
1603 int edid_size =
1604 max((int)EDID_LENGTH, (int)fake_edid_record->ucFakeEDIDLength);
1605 edid = kmalloc(edid_size, GFP_KERNEL);
1606 if (edid) {
1607 memcpy((u8 *)edid, (u8 *)&fake_edid_record->ucFakeEDIDString[0],
1608 fake_edid_record->ucFakeEDIDLength);
1609
1610 if (drm_edid_is_valid(edid)) {
1611 rdev->mode_info.bios_hardcoded_edid = edid;
1612 rdev->mode_info.bios_hardcoded_edid_size = edid_size;
1613 } else
1614 kfree(edid);
1615 }
1616 }
1617 record += sizeof(ATOM_FAKE_EDID_PATCH_RECORD);
1618 break;
1619 case LCD_PANEL_RESOLUTION_RECORD_TYPE:
1620 panel_res_record = (ATOM_PANEL_RESOLUTION_PATCH_RECORD *)record;
1621 lvds->native_mode.width_mm = panel_res_record->usHSize;
1622 lvds->native_mode.height_mm = panel_res_record->usVSize;
1623 record += sizeof(ATOM_PANEL_RESOLUTION_PATCH_RECORD);
1624 break;
1625 default:
1626 DRM_ERROR("Bad LCD record %d\n", *record);
1627 bad_record = true;
1628 break;
1629 }
1630 if (bad_record)
1631 break;
1632 }
1633 }
1634 }
1635 return lvds;
1636 }
1637
1638 struct radeon_encoder_primary_dac *
radeon_atombios_get_primary_dac_info(struct radeon_encoder * encoder)1639 radeon_atombios_get_primary_dac_info(struct radeon_encoder *encoder)
1640 {
1641 struct drm_device *dev = encoder->base.dev;
1642 struct radeon_device *rdev = dev->dev_private;
1643 struct radeon_mode_info *mode_info = &rdev->mode_info;
1644 int index = GetIndexIntoMasterTable(DATA, CompassionateData);
1645 uint16_t data_offset;
1646 struct _COMPASSIONATE_DATA *dac_info;
1647 uint8_t frev, crev;
1648 uint8_t bg, dac;
1649 struct radeon_encoder_primary_dac *p_dac = NULL;
1650
1651 if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1652 &frev, &crev, &data_offset)) {
1653 dac_info = (struct _COMPASSIONATE_DATA *)
1654 (mode_info->atom_context->bios + data_offset);
1655
1656 p_dac = kzalloc(sizeof(struct radeon_encoder_primary_dac), GFP_KERNEL);
1657
1658 if (!p_dac)
1659 return NULL;
1660
1661 bg = dac_info->ucDAC1_BG_Adjustment;
1662 dac = dac_info->ucDAC1_DAC_Adjustment;
1663 p_dac->ps2_pdac_adj = (bg << 8) | (dac);
1664
1665 }
1666 return p_dac;
1667 }
1668
radeon_atom_get_tv_timings(struct radeon_device * rdev,int index,struct drm_display_mode * mode)1669 bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index,
1670 struct drm_display_mode *mode)
1671 {
1672 struct radeon_mode_info *mode_info = &rdev->mode_info;
1673 ATOM_ANALOG_TV_INFO *tv_info;
1674 ATOM_ANALOG_TV_INFO_V1_2 *tv_info_v1_2;
1675 ATOM_DTD_FORMAT *dtd_timings;
1676 int data_index = GetIndexIntoMasterTable(DATA, AnalogTV_Info);
1677 u8 frev, crev;
1678 u16 data_offset, misc;
1679
1680 if (!atom_parse_data_header(mode_info->atom_context, data_index, NULL,
1681 &frev, &crev, &data_offset))
1682 return false;
1683
1684 switch (crev) {
1685 case 1:
1686 tv_info = (ATOM_ANALOG_TV_INFO *)(mode_info->atom_context->bios + data_offset);
1687 if (index >= MAX_SUPPORTED_TV_TIMING)
1688 return false;
1689
1690 mode->crtc_htotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Total);
1691 mode->crtc_hdisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Disp);
1692 mode->crtc_hsync_start = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart);
1693 mode->crtc_hsync_end = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart) +
1694 le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncWidth);
1695
1696 mode->crtc_vtotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Total);
1697 mode->crtc_vdisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Disp);
1698 mode->crtc_vsync_start = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart);
1699 mode->crtc_vsync_end = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart) +
1700 le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncWidth);
1701
1702 mode->flags = 0;
1703 misc = le16_to_cpu(tv_info->aModeTimings[index].susModeMiscInfo.usAccess);
1704 if (misc & ATOM_VSYNC_POLARITY)
1705 mode->flags |= DRM_MODE_FLAG_NVSYNC;
1706 if (misc & ATOM_HSYNC_POLARITY)
1707 mode->flags |= DRM_MODE_FLAG_NHSYNC;
1708 if (misc & ATOM_COMPOSITESYNC)
1709 mode->flags |= DRM_MODE_FLAG_CSYNC;
1710 if (misc & ATOM_INTERLACE)
1711 mode->flags |= DRM_MODE_FLAG_INTERLACE;
1712 if (misc & ATOM_DOUBLE_CLOCK_MODE)
1713 mode->flags |= DRM_MODE_FLAG_DBLSCAN;
1714
1715 mode->clock = le16_to_cpu(tv_info->aModeTimings[index].usPixelClock) * 10;
1716
1717 if (index == 1) {
1718 /* PAL timings appear to have wrong values for totals */
1719 mode->crtc_htotal -= 1;
1720 mode->crtc_vtotal -= 1;
1721 }
1722 break;
1723 case 2:
1724 tv_info_v1_2 = (ATOM_ANALOG_TV_INFO_V1_2 *)(mode_info->atom_context->bios + data_offset);
1725 if (index >= MAX_SUPPORTED_TV_TIMING_V1_2)
1726 return false;
1727
1728 dtd_timings = &tv_info_v1_2->aModeTimings[index];
1729 mode->crtc_htotal = le16_to_cpu(dtd_timings->usHActive) +
1730 le16_to_cpu(dtd_timings->usHBlanking_Time);
1731 mode->crtc_hdisplay = le16_to_cpu(dtd_timings->usHActive);
1732 mode->crtc_hsync_start = le16_to_cpu(dtd_timings->usHActive) +
1733 le16_to_cpu(dtd_timings->usHSyncOffset);
1734 mode->crtc_hsync_end = mode->crtc_hsync_start +
1735 le16_to_cpu(dtd_timings->usHSyncWidth);
1736
1737 mode->crtc_vtotal = le16_to_cpu(dtd_timings->usVActive) +
1738 le16_to_cpu(dtd_timings->usVBlanking_Time);
1739 mode->crtc_vdisplay = le16_to_cpu(dtd_timings->usVActive);
1740 mode->crtc_vsync_start = le16_to_cpu(dtd_timings->usVActive) +
1741 le16_to_cpu(dtd_timings->usVSyncOffset);
1742 mode->crtc_vsync_end = mode->crtc_vsync_start +
1743 le16_to_cpu(dtd_timings->usVSyncWidth);
1744
1745 mode->flags = 0;
1746 misc = le16_to_cpu(dtd_timings->susModeMiscInfo.usAccess);
1747 if (misc & ATOM_VSYNC_POLARITY)
1748 mode->flags |= DRM_MODE_FLAG_NVSYNC;
1749 if (misc & ATOM_HSYNC_POLARITY)
1750 mode->flags |= DRM_MODE_FLAG_NHSYNC;
1751 if (misc & ATOM_COMPOSITESYNC)
1752 mode->flags |= DRM_MODE_FLAG_CSYNC;
1753 if (misc & ATOM_INTERLACE)
1754 mode->flags |= DRM_MODE_FLAG_INTERLACE;
1755 if (misc & ATOM_DOUBLE_CLOCK_MODE)
1756 mode->flags |= DRM_MODE_FLAG_DBLSCAN;
1757
1758 mode->clock = le16_to_cpu(dtd_timings->usPixClk) * 10;
1759 break;
1760 }
1761 return true;
1762 }
1763
1764 enum radeon_tv_std
radeon_atombios_get_tv_info(struct radeon_device * rdev)1765 radeon_atombios_get_tv_info(struct radeon_device *rdev)
1766 {
1767 struct radeon_mode_info *mode_info = &rdev->mode_info;
1768 int index = GetIndexIntoMasterTable(DATA, AnalogTV_Info);
1769 uint16_t data_offset;
1770 uint8_t frev, crev;
1771 struct _ATOM_ANALOG_TV_INFO *tv_info;
1772 enum radeon_tv_std tv_std = TV_STD_NTSC;
1773
1774 if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1775 &frev, &crev, &data_offset)) {
1776
1777 tv_info = (struct _ATOM_ANALOG_TV_INFO *)
1778 (mode_info->atom_context->bios + data_offset);
1779
1780 switch (tv_info->ucTV_BootUpDefaultStandard) {
1781 case ATOM_TV_NTSC:
1782 tv_std = TV_STD_NTSC;
1783 DRM_DEBUG_KMS("Default TV standard: NTSC\n");
1784 break;
1785 case ATOM_TV_NTSCJ:
1786 tv_std = TV_STD_NTSC_J;
1787 DRM_DEBUG_KMS("Default TV standard: NTSC-J\n");
1788 break;
1789 case ATOM_TV_PAL:
1790 tv_std = TV_STD_PAL;
1791 DRM_DEBUG_KMS("Default TV standard: PAL\n");
1792 break;
1793 case ATOM_TV_PALM:
1794 tv_std = TV_STD_PAL_M;
1795 DRM_DEBUG_KMS("Default TV standard: PAL-M\n");
1796 break;
1797 case ATOM_TV_PALN:
1798 tv_std = TV_STD_PAL_N;
1799 DRM_DEBUG_KMS("Default TV standard: PAL-N\n");
1800 break;
1801 case ATOM_TV_PALCN:
1802 tv_std = TV_STD_PAL_CN;
1803 DRM_DEBUG_KMS("Default TV standard: PAL-CN\n");
1804 break;
1805 case ATOM_TV_PAL60:
1806 tv_std = TV_STD_PAL_60;
1807 DRM_DEBUG_KMS("Default TV standard: PAL-60\n");
1808 break;
1809 case ATOM_TV_SECAM:
1810 tv_std = TV_STD_SECAM;
1811 DRM_DEBUG_KMS("Default TV standard: SECAM\n");
1812 break;
1813 default:
1814 tv_std = TV_STD_NTSC;
1815 DRM_DEBUG_KMS("Unknown TV standard; defaulting to NTSC\n");
1816 break;
1817 }
1818 }
1819 return tv_std;
1820 }
1821
1822 struct radeon_encoder_tv_dac *
radeon_atombios_get_tv_dac_info(struct radeon_encoder * encoder)1823 radeon_atombios_get_tv_dac_info(struct radeon_encoder *encoder)
1824 {
1825 struct drm_device *dev = encoder->base.dev;
1826 struct radeon_device *rdev = dev->dev_private;
1827 struct radeon_mode_info *mode_info = &rdev->mode_info;
1828 int index = GetIndexIntoMasterTable(DATA, CompassionateData);
1829 uint16_t data_offset;
1830 struct _COMPASSIONATE_DATA *dac_info;
1831 uint8_t frev, crev;
1832 uint8_t bg, dac;
1833 struct radeon_encoder_tv_dac *tv_dac = NULL;
1834
1835 if (atom_parse_data_header(mode_info->atom_context, index, NULL,
1836 &frev, &crev, &data_offset)) {
1837
1838 dac_info = (struct _COMPASSIONATE_DATA *)
1839 (mode_info->atom_context->bios + data_offset);
1840
1841 tv_dac = kzalloc(sizeof(struct radeon_encoder_tv_dac), GFP_KERNEL);
1842
1843 if (!tv_dac)
1844 return NULL;
1845
1846 bg = dac_info->ucDAC2_CRT2_BG_Adjustment;
1847 dac = dac_info->ucDAC2_CRT2_DAC_Adjustment;
1848 tv_dac->ps2_tvdac_adj = (bg << 16) | (dac << 20);
1849
1850 bg = dac_info->ucDAC2_PAL_BG_Adjustment;
1851 dac = dac_info->ucDAC2_PAL_DAC_Adjustment;
1852 tv_dac->pal_tvdac_adj = (bg << 16) | (dac << 20);
1853
1854 bg = dac_info->ucDAC2_NTSC_BG_Adjustment;
1855 dac = dac_info->ucDAC2_NTSC_DAC_Adjustment;
1856 tv_dac->ntsc_tvdac_adj = (bg << 16) | (dac << 20);
1857
1858 tv_dac->tv_std = radeon_atombios_get_tv_info(rdev);
1859 }
1860 return tv_dac;
1861 }
1862
1863 static const char *thermal_controller_names[] = {
1864 "NONE",
1865 "lm63",
1866 "adm1032",
1867 "adm1030",
1868 "max6649",
1869 "lm64",
1870 "f75375",
1871 "asc7xxx",
1872 };
1873
1874 static const char *pp_lib_thermal_controller_names[] = {
1875 "NONE",
1876 "lm63",
1877 "adm1032",
1878 "adm1030",
1879 "max6649",
1880 "lm64",
1881 "f75375",
1882 "RV6xx",
1883 "RV770",
1884 "adt7473",
1885 "NONE",
1886 "External GPIO",
1887 "Evergreen",
1888 "emc2103",
1889 "Sumo",
1890 "Northern Islands",
1891 };
1892
1893 union power_info {
1894 struct _ATOM_POWERPLAY_INFO info;
1895 struct _ATOM_POWERPLAY_INFO_V2 info_2;
1896 struct _ATOM_POWERPLAY_INFO_V3 info_3;
1897 struct _ATOM_PPLIB_POWERPLAYTABLE pplib;
1898 struct _ATOM_PPLIB_POWERPLAYTABLE2 pplib2;
1899 struct _ATOM_PPLIB_POWERPLAYTABLE3 pplib3;
1900 };
1901
1902 union pplib_clock_info {
1903 struct _ATOM_PPLIB_R600_CLOCK_INFO r600;
1904 struct _ATOM_PPLIB_RS780_CLOCK_INFO rs780;
1905 struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO evergreen;
1906 struct _ATOM_PPLIB_SUMO_CLOCK_INFO sumo;
1907 };
1908
1909 union pplib_power_state {
1910 struct _ATOM_PPLIB_STATE v1;
1911 struct _ATOM_PPLIB_STATE_V2 v2;
1912 };
1913
radeon_atombios_parse_misc_flags_1_3(struct radeon_device * rdev,int state_index,u32 misc,u32 misc2)1914 static void radeon_atombios_parse_misc_flags_1_3(struct radeon_device *rdev,
1915 int state_index,
1916 u32 misc, u32 misc2)
1917 {
1918 rdev->pm.power_state[state_index].misc = misc;
1919 rdev->pm.power_state[state_index].misc2 = misc2;
1920 /* order matters! */
1921 if (misc & ATOM_PM_MISCINFO_POWER_SAVING_MODE)
1922 rdev->pm.power_state[state_index].type =
1923 POWER_STATE_TYPE_POWERSAVE;
1924 if (misc & ATOM_PM_MISCINFO_DEFAULT_DC_STATE_ENTRY_TRUE)
1925 rdev->pm.power_state[state_index].type =
1926 POWER_STATE_TYPE_BATTERY;
1927 if (misc & ATOM_PM_MISCINFO_DEFAULT_LOW_DC_STATE_ENTRY_TRUE)
1928 rdev->pm.power_state[state_index].type =
1929 POWER_STATE_TYPE_BATTERY;
1930 if (misc & ATOM_PM_MISCINFO_LOAD_BALANCE_EN)
1931 rdev->pm.power_state[state_index].type =
1932 POWER_STATE_TYPE_BALANCED;
1933 if (misc & ATOM_PM_MISCINFO_3D_ACCELERATION_EN) {
1934 rdev->pm.power_state[state_index].type =
1935 POWER_STATE_TYPE_PERFORMANCE;
1936 rdev->pm.power_state[state_index].flags &=
1937 ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
1938 }
1939 if (misc2 & ATOM_PM_MISCINFO2_SYSTEM_AC_LITE_MODE)
1940 rdev->pm.power_state[state_index].type =
1941 POWER_STATE_TYPE_BALANCED;
1942 if (misc & ATOM_PM_MISCINFO_DRIVER_DEFAULT_MODE) {
1943 rdev->pm.power_state[state_index].type =
1944 POWER_STATE_TYPE_DEFAULT;
1945 rdev->pm.default_power_state_index = state_index;
1946 rdev->pm.power_state[state_index].default_clock_mode =
1947 &rdev->pm.power_state[state_index].clock_info[0];
1948 } else if (state_index == 0) {
1949 rdev->pm.power_state[state_index].clock_info[0].flags |=
1950 RADEON_PM_MODE_NO_DISPLAY;
1951 }
1952 }
1953
radeon_atombios_parse_power_table_1_3(struct radeon_device * rdev)1954 static int radeon_atombios_parse_power_table_1_3(struct radeon_device *rdev)
1955 {
1956 struct radeon_mode_info *mode_info = &rdev->mode_info;
1957 u32 misc, misc2 = 0;
1958 int num_modes = 0, i;
1959 int state_index = 0;
1960 struct radeon_i2c_bus_rec i2c_bus;
1961 union power_info *power_info;
1962 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
1963 u16 data_offset;
1964 u8 frev, crev;
1965
1966 if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
1967 &frev, &crev, &data_offset))
1968 return state_index;
1969 power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
1970
1971 /* add the i2c bus for thermal/fan chip */
1972 if (power_info->info.ucOverdriveThermalController > 0) {
1973 DRM_INFO("Possible %s thermal controller at 0x%02x\n",
1974 thermal_controller_names[power_info->info.ucOverdriveThermalController],
1975 power_info->info.ucOverdriveControllerAddress >> 1);
1976 i2c_bus = radeon_lookup_i2c_gpio(rdev, power_info->info.ucOverdriveI2cLine);
1977 rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
1978 if (rdev->pm.i2c_bus) {
1979 struct i2c_board_info info = { };
1980 const char *name = thermal_controller_names[power_info->info.
1981 ucOverdriveThermalController];
1982 info.addr = power_info->info.ucOverdriveControllerAddress >> 1;
1983 strlcpy(info.type, name, sizeof(info.type));
1984 i2c_new_device(&rdev->pm.i2c_bus->adapter, &info);
1985 }
1986 }
1987 num_modes = power_info->info.ucNumOfPowerModeEntries;
1988 if (num_modes > ATOM_MAX_NUMBEROF_POWER_BLOCK)
1989 num_modes = ATOM_MAX_NUMBEROF_POWER_BLOCK;
1990 rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) * num_modes, GFP_KERNEL);
1991 if (!rdev->pm.power_state)
1992 return state_index;
1993 /* last mode is usually default, array is low to high */
1994 for (i = 0; i < num_modes; i++) {
1995 rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
1996 switch (frev) {
1997 case 1:
1998 rdev->pm.power_state[state_index].num_clock_modes = 1;
1999 rdev->pm.power_state[state_index].clock_info[0].mclk =
2000 le16_to_cpu(power_info->info.asPowerPlayInfo[i].usMemoryClock);
2001 rdev->pm.power_state[state_index].clock_info[0].sclk =
2002 le16_to_cpu(power_info->info.asPowerPlayInfo[i].usEngineClock);
2003 /* skip invalid modes */
2004 if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2005 (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2006 continue;
2007 rdev->pm.power_state[state_index].pcie_lanes =
2008 power_info->info.asPowerPlayInfo[i].ucNumPciELanes;
2009 misc = le32_to_cpu(power_info->info.asPowerPlayInfo[i].ulMiscInfo);
2010 if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2011 (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2012 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2013 VOLTAGE_GPIO;
2014 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2015 radeon_lookup_gpio(rdev,
2016 power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex);
2017 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2018 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2019 true;
2020 else
2021 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2022 false;
2023 } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2024 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2025 VOLTAGE_VDDC;
2026 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2027 power_info->info.asPowerPlayInfo[i].ucVoltageDropIndex;
2028 }
2029 rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2030 radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, 0);
2031 state_index++;
2032 break;
2033 case 2:
2034 rdev->pm.power_state[state_index].num_clock_modes = 1;
2035 rdev->pm.power_state[state_index].clock_info[0].mclk =
2036 le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMemoryClock);
2037 rdev->pm.power_state[state_index].clock_info[0].sclk =
2038 le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulEngineClock);
2039 /* skip invalid modes */
2040 if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2041 (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2042 continue;
2043 rdev->pm.power_state[state_index].pcie_lanes =
2044 power_info->info_2.asPowerPlayInfo[i].ucNumPciELanes;
2045 misc = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo);
2046 misc2 = le32_to_cpu(power_info->info_2.asPowerPlayInfo[i].ulMiscInfo2);
2047 if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2048 (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2049 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2050 VOLTAGE_GPIO;
2051 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2052 radeon_lookup_gpio(rdev,
2053 power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex);
2054 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2055 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2056 true;
2057 else
2058 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2059 false;
2060 } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2061 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2062 VOLTAGE_VDDC;
2063 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2064 power_info->info_2.asPowerPlayInfo[i].ucVoltageDropIndex;
2065 }
2066 rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2067 radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, misc2);
2068 state_index++;
2069 break;
2070 case 3:
2071 rdev->pm.power_state[state_index].num_clock_modes = 1;
2072 rdev->pm.power_state[state_index].clock_info[0].mclk =
2073 le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMemoryClock);
2074 rdev->pm.power_state[state_index].clock_info[0].sclk =
2075 le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulEngineClock);
2076 /* skip invalid modes */
2077 if ((rdev->pm.power_state[state_index].clock_info[0].mclk == 0) ||
2078 (rdev->pm.power_state[state_index].clock_info[0].sclk == 0))
2079 continue;
2080 rdev->pm.power_state[state_index].pcie_lanes =
2081 power_info->info_3.asPowerPlayInfo[i].ucNumPciELanes;
2082 misc = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo);
2083 misc2 = le32_to_cpu(power_info->info_3.asPowerPlayInfo[i].ulMiscInfo2);
2084 if ((misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT) ||
2085 (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)) {
2086 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2087 VOLTAGE_GPIO;
2088 rdev->pm.power_state[state_index].clock_info[0].voltage.gpio =
2089 radeon_lookup_gpio(rdev,
2090 power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex);
2091 if (misc & ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH)
2092 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2093 true;
2094 else
2095 rdev->pm.power_state[state_index].clock_info[0].voltage.active_high =
2096 false;
2097 } else if (misc & ATOM_PM_MISCINFO_PROGRAM_VOLTAGE) {
2098 rdev->pm.power_state[state_index].clock_info[0].voltage.type =
2099 VOLTAGE_VDDC;
2100 rdev->pm.power_state[state_index].clock_info[0].voltage.vddc_id =
2101 power_info->info_3.asPowerPlayInfo[i].ucVoltageDropIndex;
2102 if (misc2 & ATOM_PM_MISCINFO2_VDDCI_DYNAMIC_VOLTAGE_EN) {
2103 rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_enabled =
2104 true;
2105 rdev->pm.power_state[state_index].clock_info[0].voltage.vddci_id =
2106 power_info->info_3.asPowerPlayInfo[i].ucVDDCI_VoltageDropIndex;
2107 }
2108 }
2109 rdev->pm.power_state[state_index].flags = RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2110 radeon_atombios_parse_misc_flags_1_3(rdev, state_index, misc, misc2);
2111 state_index++;
2112 break;
2113 }
2114 }
2115 /* last mode is usually default */
2116 if (rdev->pm.default_power_state_index == -1) {
2117 rdev->pm.power_state[state_index - 1].type =
2118 POWER_STATE_TYPE_DEFAULT;
2119 rdev->pm.default_power_state_index = state_index - 1;
2120 rdev->pm.power_state[state_index - 1].default_clock_mode =
2121 &rdev->pm.power_state[state_index - 1].clock_info[0];
2122 rdev->pm.power_state[state_index].flags &=
2123 ~RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2124 rdev->pm.power_state[state_index].misc = 0;
2125 rdev->pm.power_state[state_index].misc2 = 0;
2126 }
2127 return state_index;
2128 }
2129
radeon_atombios_add_pplib_thermal_controller(struct radeon_device * rdev,ATOM_PPLIB_THERMALCONTROLLER * controller)2130 static void radeon_atombios_add_pplib_thermal_controller(struct radeon_device *rdev,
2131 ATOM_PPLIB_THERMALCONTROLLER *controller)
2132 {
2133 struct radeon_i2c_bus_rec i2c_bus;
2134
2135 /* add the i2c bus for thermal/fan chip */
2136 if (controller->ucType > 0) {
2137 if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV6xx) {
2138 DRM_INFO("Internal thermal controller %s fan control\n",
2139 (controller->ucFanParameters &
2140 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2141 rdev->pm.int_thermal_type = THERMAL_TYPE_RV6XX;
2142 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV770) {
2143 DRM_INFO("Internal thermal controller %s fan control\n",
2144 (controller->ucFanParameters &
2145 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2146 rdev->pm.int_thermal_type = THERMAL_TYPE_RV770;
2147 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_EVERGREEN) {
2148 DRM_INFO("Internal thermal controller %s fan control\n",
2149 (controller->ucFanParameters &
2150 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2151 rdev->pm.int_thermal_type = THERMAL_TYPE_EVERGREEN;
2152 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_SUMO) {
2153 DRM_INFO("Internal thermal controller %s fan control\n",
2154 (controller->ucFanParameters &
2155 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2156 rdev->pm.int_thermal_type = THERMAL_TYPE_SUMO;
2157 } else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_NISLANDS) {
2158 DRM_INFO("Internal thermal controller %s fan control\n",
2159 (controller->ucFanParameters &
2160 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2161 rdev->pm.int_thermal_type = THERMAL_TYPE_NI;
2162 } else if ((controller->ucType ==
2163 ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO) ||
2164 (controller->ucType ==
2165 ATOM_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL) ||
2166 (controller->ucType ==
2167 ATOM_PP_THERMALCONTROLLER_EMC2103_WITH_INTERNAL)) {
2168 DRM_INFO("Special thermal controller config\n");
2169 } else {
2170 DRM_INFO("Possible %s thermal controller at 0x%02x %s fan control\n",
2171 pp_lib_thermal_controller_names[controller->ucType],
2172 controller->ucI2cAddress >> 1,
2173 (controller->ucFanParameters &
2174 ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with");
2175 i2c_bus = radeon_lookup_i2c_gpio(rdev, controller->ucI2cLine);
2176 rdev->pm.i2c_bus = radeon_i2c_lookup(rdev, &i2c_bus);
2177 if (rdev->pm.i2c_bus) {
2178 struct i2c_board_info info = { };
2179 const char *name = pp_lib_thermal_controller_names[controller->ucType];
2180 info.addr = controller->ucI2cAddress >> 1;
2181 strlcpy(info.type, name, sizeof(info.type));
2182 i2c_new_device(&rdev->pm.i2c_bus->adapter, &info);
2183 }
2184 }
2185 }
2186 }
2187
radeon_atombios_get_default_voltages(struct radeon_device * rdev,u16 * vddc,u16 * vddci)2188 static void radeon_atombios_get_default_voltages(struct radeon_device *rdev,
2189 u16 *vddc, u16 *vddci)
2190 {
2191 struct radeon_mode_info *mode_info = &rdev->mode_info;
2192 int index = GetIndexIntoMasterTable(DATA, FirmwareInfo);
2193 u8 frev, crev;
2194 u16 data_offset;
2195 union firmware_info *firmware_info;
2196
2197 *vddc = 0;
2198 *vddci = 0;
2199
2200 if (atom_parse_data_header(mode_info->atom_context, index, NULL,
2201 &frev, &crev, &data_offset)) {
2202 firmware_info =
2203 (union firmware_info *)(mode_info->atom_context->bios +
2204 data_offset);
2205 *vddc = le16_to_cpu(firmware_info->info_14.usBootUpVDDCVoltage);
2206 if ((frev == 2) && (crev >= 2))
2207 *vddci = le16_to_cpu(firmware_info->info_22.usBootUpVDDCIVoltage);
2208 }
2209 }
2210
radeon_atombios_parse_pplib_non_clock_info(struct radeon_device * rdev,int state_index,int mode_index,struct _ATOM_PPLIB_NONCLOCK_INFO * non_clock_info)2211 static void radeon_atombios_parse_pplib_non_clock_info(struct radeon_device *rdev,
2212 int state_index, int mode_index,
2213 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info)
2214 {
2215 int j;
2216 u32 misc = le32_to_cpu(non_clock_info->ulCapsAndSettings);
2217 u32 misc2 = le16_to_cpu(non_clock_info->usClassification);
2218 u16 vddc, vddci;
2219
2220 radeon_atombios_get_default_voltages(rdev, &vddc, &vddci);
2221
2222 rdev->pm.power_state[state_index].misc = misc;
2223 rdev->pm.power_state[state_index].misc2 = misc2;
2224 rdev->pm.power_state[state_index].pcie_lanes =
2225 ((misc & ATOM_PPLIB_PCIE_LINK_WIDTH_MASK) >>
2226 ATOM_PPLIB_PCIE_LINK_WIDTH_SHIFT) + 1;
2227 switch (misc2 & ATOM_PPLIB_CLASSIFICATION_UI_MASK) {
2228 case ATOM_PPLIB_CLASSIFICATION_UI_BATTERY:
2229 rdev->pm.power_state[state_index].type =
2230 POWER_STATE_TYPE_BATTERY;
2231 break;
2232 case ATOM_PPLIB_CLASSIFICATION_UI_BALANCED:
2233 rdev->pm.power_state[state_index].type =
2234 POWER_STATE_TYPE_BALANCED;
2235 break;
2236 case ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE:
2237 rdev->pm.power_state[state_index].type =
2238 POWER_STATE_TYPE_PERFORMANCE;
2239 break;
2240 case ATOM_PPLIB_CLASSIFICATION_UI_NONE:
2241 if (misc2 & ATOM_PPLIB_CLASSIFICATION_3DPERFORMANCE)
2242 rdev->pm.power_state[state_index].type =
2243 POWER_STATE_TYPE_PERFORMANCE;
2244 break;
2245 }
2246 rdev->pm.power_state[state_index].flags = 0;
2247 if (misc & ATOM_PPLIB_SINGLE_DISPLAY_ONLY)
2248 rdev->pm.power_state[state_index].flags |=
2249 RADEON_PM_STATE_SINGLE_DISPLAY_ONLY;
2250 if (misc2 & ATOM_PPLIB_CLASSIFICATION_BOOT) {
2251 rdev->pm.power_state[state_index].type =
2252 POWER_STATE_TYPE_DEFAULT;
2253 rdev->pm.default_power_state_index = state_index;
2254 rdev->pm.power_state[state_index].default_clock_mode =
2255 &rdev->pm.power_state[state_index].clock_info[mode_index - 1];
2256 if (ASIC_IS_DCE5(rdev)) {
2257 /* NI chips post without MC ucode, so default clocks are strobe mode only */
2258 rdev->pm.default_sclk = rdev->pm.power_state[state_index].clock_info[0].sclk;
2259 rdev->pm.default_mclk = rdev->pm.power_state[state_index].clock_info[0].mclk;
2260 rdev->pm.default_vddc = rdev->pm.power_state[state_index].clock_info[0].voltage.voltage;
2261 rdev->pm.default_vddci = rdev->pm.power_state[state_index].clock_info[0].voltage.vddci;
2262 } else {
2263 /* patch the table values with the default slck/mclk from firmware info */
2264 for (j = 0; j < mode_index; j++) {
2265 rdev->pm.power_state[state_index].clock_info[j].mclk =
2266 rdev->clock.default_mclk;
2267 rdev->pm.power_state[state_index].clock_info[j].sclk =
2268 rdev->clock.default_sclk;
2269 if (vddc)
2270 rdev->pm.power_state[state_index].clock_info[j].voltage.voltage =
2271 vddc;
2272 }
2273 }
2274 }
2275 }
2276
radeon_atombios_parse_pplib_clock_info(struct radeon_device * rdev,int state_index,int mode_index,union pplib_clock_info * clock_info)2277 static bool radeon_atombios_parse_pplib_clock_info(struct radeon_device *rdev,
2278 int state_index, int mode_index,
2279 union pplib_clock_info *clock_info)
2280 {
2281 u32 sclk, mclk;
2282
2283 if (rdev->flags & RADEON_IS_IGP) {
2284 if (rdev->family >= CHIP_PALM) {
2285 sclk = le16_to_cpu(clock_info->sumo.usEngineClockLow);
2286 sclk |= clock_info->sumo.ucEngineClockHigh << 16;
2287 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2288 } else {
2289 sclk = le16_to_cpu(clock_info->rs780.usLowEngineClockLow);
2290 sclk |= clock_info->rs780.ucLowEngineClockHigh << 16;
2291 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2292 }
2293 } else if (ASIC_IS_DCE4(rdev)) {
2294 sclk = le16_to_cpu(clock_info->evergreen.usEngineClockLow);
2295 sclk |= clock_info->evergreen.ucEngineClockHigh << 16;
2296 mclk = le16_to_cpu(clock_info->evergreen.usMemoryClockLow);
2297 mclk |= clock_info->evergreen.ucMemoryClockHigh << 16;
2298 rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk;
2299 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2300 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2301 VOLTAGE_SW;
2302 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
2303 le16_to_cpu(clock_info->evergreen.usVDDC);
2304 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.vddci =
2305 le16_to_cpu(clock_info->evergreen.usVDDCI);
2306 } else {
2307 sclk = le16_to_cpu(clock_info->r600.usEngineClockLow);
2308 sclk |= clock_info->r600.ucEngineClockHigh << 16;
2309 mclk = le16_to_cpu(clock_info->r600.usMemoryClockLow);
2310 mclk |= clock_info->r600.ucMemoryClockHigh << 16;
2311 rdev->pm.power_state[state_index].clock_info[mode_index].mclk = mclk;
2312 rdev->pm.power_state[state_index].clock_info[mode_index].sclk = sclk;
2313 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.type =
2314 VOLTAGE_SW;
2315 rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage =
2316 le16_to_cpu(clock_info->r600.usVDDC);
2317 }
2318
2319 if (rdev->flags & RADEON_IS_IGP) {
2320 /* skip invalid modes */
2321 if (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0)
2322 return false;
2323 } else {
2324 /* skip invalid modes */
2325 if ((rdev->pm.power_state[state_index].clock_info[mode_index].mclk == 0) ||
2326 (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0))
2327 return false;
2328 }
2329 return true;
2330 }
2331
radeon_atombios_parse_power_table_4_5(struct radeon_device * rdev)2332 static int radeon_atombios_parse_power_table_4_5(struct radeon_device *rdev)
2333 {
2334 struct radeon_mode_info *mode_info = &rdev->mode_info;
2335 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
2336 union pplib_power_state *power_state;
2337 int i, j;
2338 int state_index = 0, mode_index = 0;
2339 union pplib_clock_info *clock_info;
2340 bool valid;
2341 union power_info *power_info;
2342 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2343 u16 data_offset;
2344 u8 frev, crev;
2345
2346 if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2347 &frev, &crev, &data_offset))
2348 return state_index;
2349 power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2350
2351 radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
2352 rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
2353 power_info->pplib.ucNumStates, GFP_KERNEL);
2354 if (!rdev->pm.power_state)
2355 return state_index;
2356 /* first mode is usually default, followed by low to high */
2357 for (i = 0; i < power_info->pplib.ucNumStates; i++) {
2358 mode_index = 0;
2359 power_state = (union pplib_power_state *)
2360 (mode_info->atom_context->bios + data_offset +
2361 le16_to_cpu(power_info->pplib.usStateArrayOffset) +
2362 i * power_info->pplib.ucStateEntrySize);
2363 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
2364 (mode_info->atom_context->bios + data_offset +
2365 le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset) +
2366 (power_state->v1.ucNonClockStateIndex *
2367 power_info->pplib.ucNonClockSize));
2368 for (j = 0; j < (power_info->pplib.ucStateEntrySize - 1); j++) {
2369 clock_info = (union pplib_clock_info *)
2370 (mode_info->atom_context->bios + data_offset +
2371 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset) +
2372 (power_state->v1.ucClockStateIndices[j] *
2373 power_info->pplib.ucClockInfoSize));
2374 valid = radeon_atombios_parse_pplib_clock_info(rdev,
2375 state_index, mode_index,
2376 clock_info);
2377 if (valid)
2378 mode_index++;
2379 }
2380 rdev->pm.power_state[state_index].num_clock_modes = mode_index;
2381 if (mode_index) {
2382 radeon_atombios_parse_pplib_non_clock_info(rdev, state_index, mode_index,
2383 non_clock_info);
2384 state_index++;
2385 }
2386 }
2387 /* if multiple clock modes, mark the lowest as no display */
2388 for (i = 0; i < state_index; i++) {
2389 if (rdev->pm.power_state[i].num_clock_modes > 1)
2390 rdev->pm.power_state[i].clock_info[0].flags |=
2391 RADEON_PM_MODE_NO_DISPLAY;
2392 }
2393 /* first mode is usually default */
2394 if (rdev->pm.default_power_state_index == -1) {
2395 rdev->pm.power_state[0].type =
2396 POWER_STATE_TYPE_DEFAULT;
2397 rdev->pm.default_power_state_index = 0;
2398 rdev->pm.power_state[0].default_clock_mode =
2399 &rdev->pm.power_state[0].clock_info[0];
2400 }
2401 return state_index;
2402 }
2403
radeon_atombios_parse_power_table_6(struct radeon_device * rdev)2404 static int radeon_atombios_parse_power_table_6(struct radeon_device *rdev)
2405 {
2406 struct radeon_mode_info *mode_info = &rdev->mode_info;
2407 struct _ATOM_PPLIB_NONCLOCK_INFO *non_clock_info;
2408 union pplib_power_state *power_state;
2409 int i, j, non_clock_array_index, clock_array_index;
2410 int state_index = 0, mode_index = 0;
2411 union pplib_clock_info *clock_info;
2412 struct StateArray *state_array;
2413 struct ClockInfoArray *clock_info_array;
2414 struct NonClockInfoArray *non_clock_info_array;
2415 bool valid;
2416 union power_info *power_info;
2417 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2418 u16 data_offset;
2419 u8 frev, crev;
2420
2421 if (!atom_parse_data_header(mode_info->atom_context, index, NULL,
2422 &frev, &crev, &data_offset))
2423 return state_index;
2424 power_info = (union power_info *)(mode_info->atom_context->bios + data_offset);
2425
2426 radeon_atombios_add_pplib_thermal_controller(rdev, &power_info->pplib.sThermalController);
2427 state_array = (struct StateArray *)
2428 (mode_info->atom_context->bios + data_offset +
2429 le16_to_cpu(power_info->pplib.usStateArrayOffset));
2430 clock_info_array = (struct ClockInfoArray *)
2431 (mode_info->atom_context->bios + data_offset +
2432 le16_to_cpu(power_info->pplib.usClockInfoArrayOffset));
2433 non_clock_info_array = (struct NonClockInfoArray *)
2434 (mode_info->atom_context->bios + data_offset +
2435 le16_to_cpu(power_info->pplib.usNonClockInfoArrayOffset));
2436 rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state) *
2437 state_array->ucNumEntries, GFP_KERNEL);
2438 if (!rdev->pm.power_state)
2439 return state_index;
2440 for (i = 0; i < state_array->ucNumEntries; i++) {
2441 mode_index = 0;
2442 power_state = (union pplib_power_state *)&state_array->states[i];
2443 /* XXX this might be an inagua bug... */
2444 non_clock_array_index = i; /* power_state->v2.nonClockInfoIndex */
2445 non_clock_info = (struct _ATOM_PPLIB_NONCLOCK_INFO *)
2446 &non_clock_info_array->nonClockInfo[non_clock_array_index];
2447 for (j = 0; j < power_state->v2.ucNumDPMLevels; j++) {
2448 clock_array_index = power_state->v2.clockInfoIndex[j];
2449 /* XXX this might be an inagua bug... */
2450 if (clock_array_index >= clock_info_array->ucNumEntries)
2451 continue;
2452 clock_info = (union pplib_clock_info *)
2453 &clock_info_array->clockInfo[clock_array_index];
2454 valid = radeon_atombios_parse_pplib_clock_info(rdev,
2455 state_index, mode_index,
2456 clock_info);
2457 if (valid)
2458 mode_index++;
2459 }
2460 rdev->pm.power_state[state_index].num_clock_modes = mode_index;
2461 if (mode_index) {
2462 radeon_atombios_parse_pplib_non_clock_info(rdev, state_index, mode_index,
2463 non_clock_info);
2464 state_index++;
2465 }
2466 }
2467 /* if multiple clock modes, mark the lowest as no display */
2468 for (i = 0; i < state_index; i++) {
2469 if (rdev->pm.power_state[i].num_clock_modes > 1)
2470 rdev->pm.power_state[i].clock_info[0].flags |=
2471 RADEON_PM_MODE_NO_DISPLAY;
2472 }
2473 /* first mode is usually default */
2474 if (rdev->pm.default_power_state_index == -1) {
2475 rdev->pm.power_state[0].type =
2476 POWER_STATE_TYPE_DEFAULT;
2477 rdev->pm.default_power_state_index = 0;
2478 rdev->pm.power_state[0].default_clock_mode =
2479 &rdev->pm.power_state[0].clock_info[0];
2480 }
2481 return state_index;
2482 }
2483
radeon_atombios_get_power_modes(struct radeon_device * rdev)2484 void radeon_atombios_get_power_modes(struct radeon_device *rdev)
2485 {
2486 struct radeon_mode_info *mode_info = &rdev->mode_info;
2487 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo);
2488 u16 data_offset;
2489 u8 frev, crev;
2490 int state_index = 0;
2491
2492 rdev->pm.default_power_state_index = -1;
2493
2494 if (atom_parse_data_header(mode_info->atom_context, index, NULL,
2495 &frev, &crev, &data_offset)) {
2496 switch (frev) {
2497 case 1:
2498 case 2:
2499 case 3:
2500 state_index = radeon_atombios_parse_power_table_1_3(rdev);
2501 break;
2502 case 4:
2503 case 5:
2504 state_index = radeon_atombios_parse_power_table_4_5(rdev);
2505 break;
2506 case 6:
2507 state_index = radeon_atombios_parse_power_table_6(rdev);
2508 break;
2509 default:
2510 break;
2511 }
2512 } else {
2513 rdev->pm.power_state = kzalloc(sizeof(struct radeon_power_state), GFP_KERNEL);
2514 if (rdev->pm.power_state) {
2515 /* add the default mode */
2516 rdev->pm.power_state[state_index].type =
2517 POWER_STATE_TYPE_DEFAULT;
2518 rdev->pm.power_state[state_index].num_clock_modes = 1;
2519 rdev->pm.power_state[state_index].clock_info[0].mclk = rdev->clock.default_mclk;
2520 rdev->pm.power_state[state_index].clock_info[0].sclk = rdev->clock.default_sclk;
2521 rdev->pm.power_state[state_index].default_clock_mode =
2522 &rdev->pm.power_state[state_index].clock_info[0];
2523 rdev->pm.power_state[state_index].clock_info[0].voltage.type = VOLTAGE_NONE;
2524 rdev->pm.power_state[state_index].pcie_lanes = 16;
2525 rdev->pm.default_power_state_index = state_index;
2526 rdev->pm.power_state[state_index].flags = 0;
2527 state_index++;
2528 }
2529 }
2530
2531 rdev->pm.num_power_states = state_index;
2532
2533 rdev->pm.current_power_state_index = rdev->pm.default_power_state_index;
2534 rdev->pm.current_clock_mode_index = 0;
2535 rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage;
2536 }
2537
radeon_atom_set_clock_gating(struct radeon_device * rdev,int enable)2538 void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable)
2539 {
2540 DYNAMIC_CLOCK_GATING_PS_ALLOCATION args;
2541 int index = GetIndexIntoMasterTable(COMMAND, DynamicClockGating);
2542
2543 args.ucEnable = enable;
2544
2545 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2546 }
2547
radeon_atom_get_engine_clock(struct radeon_device * rdev)2548 uint32_t radeon_atom_get_engine_clock(struct radeon_device *rdev)
2549 {
2550 GET_ENGINE_CLOCK_PS_ALLOCATION args;
2551 int index = GetIndexIntoMasterTable(COMMAND, GetEngineClock);
2552
2553 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2554 return le32_to_cpu(args.ulReturnEngineClock);
2555 }
2556
radeon_atom_get_memory_clock(struct radeon_device * rdev)2557 uint32_t radeon_atom_get_memory_clock(struct radeon_device *rdev)
2558 {
2559 GET_MEMORY_CLOCK_PS_ALLOCATION args;
2560 int index = GetIndexIntoMasterTable(COMMAND, GetMemoryClock);
2561
2562 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2563 return le32_to_cpu(args.ulReturnMemoryClock);
2564 }
2565
radeon_atom_set_engine_clock(struct radeon_device * rdev,uint32_t eng_clock)2566 void radeon_atom_set_engine_clock(struct radeon_device *rdev,
2567 uint32_t eng_clock)
2568 {
2569 SET_ENGINE_CLOCK_PS_ALLOCATION args;
2570 int index = GetIndexIntoMasterTable(COMMAND, SetEngineClock);
2571
2572 args.ulTargetEngineClock = cpu_to_le32(eng_clock); /* 10 khz */
2573
2574 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2575 }
2576
radeon_atom_set_memory_clock(struct radeon_device * rdev,uint32_t mem_clock)2577 void radeon_atom_set_memory_clock(struct radeon_device *rdev,
2578 uint32_t mem_clock)
2579 {
2580 SET_MEMORY_CLOCK_PS_ALLOCATION args;
2581 int index = GetIndexIntoMasterTable(COMMAND, SetMemoryClock);
2582
2583 if (rdev->flags & RADEON_IS_IGP)
2584 return;
2585
2586 args.ulTargetMemoryClock = cpu_to_le32(mem_clock); /* 10 khz */
2587
2588 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2589 }
2590
2591 union set_voltage {
2592 struct _SET_VOLTAGE_PS_ALLOCATION alloc;
2593 struct _SET_VOLTAGE_PARAMETERS v1;
2594 struct _SET_VOLTAGE_PARAMETERS_V2 v2;
2595 };
2596
radeon_atom_set_voltage(struct radeon_device * rdev,u16 voltage_level,u8 voltage_type)2597 void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type)
2598 {
2599 union set_voltage args;
2600 int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
2601 u8 frev, crev, volt_index = voltage_level;
2602
2603 if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
2604 return;
2605
2606 switch (crev) {
2607 case 1:
2608 args.v1.ucVoltageType = voltage_type;
2609 args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE;
2610 args.v1.ucVoltageIndex = volt_index;
2611 break;
2612 case 2:
2613 args.v2.ucVoltageType = voltage_type;
2614 args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE;
2615 args.v2.usVoltageLevel = cpu_to_le16(voltage_level);
2616 break;
2617 default:
2618 DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
2619 return;
2620 }
2621
2622 atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
2623 }
2624
2625
2626
radeon_atom_initialize_bios_scratch_regs(struct drm_device * dev)2627 void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
2628 {
2629 struct radeon_device *rdev = dev->dev_private;
2630 uint32_t bios_2_scratch, bios_6_scratch;
2631
2632 if (rdev->family >= CHIP_R600) {
2633 bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH);
2634 bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
2635 } else {
2636 bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH);
2637 bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
2638 }
2639
2640 /* let the bios control the backlight */
2641 bios_2_scratch &= ~ATOM_S2_VRI_BRIGHT_ENABLE;
2642
2643 /* tell the bios not to handle mode switching */
2644 bios_6_scratch |= ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH;
2645
2646 if (rdev->family >= CHIP_R600) {
2647 WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
2648 WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
2649 } else {
2650 WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
2651 WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
2652 }
2653
2654 }
2655
radeon_save_bios_scratch_regs(struct radeon_device * rdev)2656 void radeon_save_bios_scratch_regs(struct radeon_device *rdev)
2657 {
2658 uint32_t scratch_reg;
2659 int i;
2660
2661 if (rdev->family >= CHIP_R600)
2662 scratch_reg = R600_BIOS_0_SCRATCH;
2663 else
2664 scratch_reg = RADEON_BIOS_0_SCRATCH;
2665
2666 for (i = 0; i < RADEON_BIOS_NUM_SCRATCH; i++)
2667 rdev->bios_scratch[i] = RREG32(scratch_reg + (i * 4));
2668 }
2669
radeon_restore_bios_scratch_regs(struct radeon_device * rdev)2670 void radeon_restore_bios_scratch_regs(struct radeon_device *rdev)
2671 {
2672 uint32_t scratch_reg;
2673 int i;
2674
2675 if (rdev->family >= CHIP_R600)
2676 scratch_reg = R600_BIOS_0_SCRATCH;
2677 else
2678 scratch_reg = RADEON_BIOS_0_SCRATCH;
2679
2680 for (i = 0; i < RADEON_BIOS_NUM_SCRATCH; i++)
2681 WREG32(scratch_reg + (i * 4), rdev->bios_scratch[i]);
2682 }
2683
radeon_atom_output_lock(struct drm_encoder * encoder,bool lock)2684 void radeon_atom_output_lock(struct drm_encoder *encoder, bool lock)
2685 {
2686 struct drm_device *dev = encoder->dev;
2687 struct radeon_device *rdev = dev->dev_private;
2688 uint32_t bios_6_scratch;
2689
2690 if (rdev->family >= CHIP_R600)
2691 bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
2692 else
2693 bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
2694
2695 if (lock) {
2696 bios_6_scratch |= ATOM_S6_CRITICAL_STATE;
2697 bios_6_scratch &= ~ATOM_S6_ACC_MODE;
2698 } else {
2699 bios_6_scratch &= ~ATOM_S6_CRITICAL_STATE;
2700 bios_6_scratch |= ATOM_S6_ACC_MODE;
2701 }
2702
2703 if (rdev->family >= CHIP_R600)
2704 WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
2705 else
2706 WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
2707 }
2708
2709 /* at some point we may want to break this out into individual functions */
2710 void
radeon_atombios_connected_scratch_regs(struct drm_connector * connector,struct drm_encoder * encoder,bool connected)2711 radeon_atombios_connected_scratch_regs(struct drm_connector *connector,
2712 struct drm_encoder *encoder,
2713 bool connected)
2714 {
2715 struct drm_device *dev = connector->dev;
2716 struct radeon_device *rdev = dev->dev_private;
2717 struct radeon_connector *radeon_connector =
2718 to_radeon_connector(connector);
2719 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2720 uint32_t bios_0_scratch, bios_3_scratch, bios_6_scratch;
2721
2722 if (rdev->family >= CHIP_R600) {
2723 bios_0_scratch = RREG32(R600_BIOS_0_SCRATCH);
2724 bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH);
2725 bios_6_scratch = RREG32(R600_BIOS_6_SCRATCH);
2726 } else {
2727 bios_0_scratch = RREG32(RADEON_BIOS_0_SCRATCH);
2728 bios_3_scratch = RREG32(RADEON_BIOS_3_SCRATCH);
2729 bios_6_scratch = RREG32(RADEON_BIOS_6_SCRATCH);
2730 }
2731
2732 if ((radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) &&
2733 (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT)) {
2734 if (connected) {
2735 DRM_DEBUG_KMS("TV1 connected\n");
2736 bios_3_scratch |= ATOM_S3_TV1_ACTIVE;
2737 bios_6_scratch |= ATOM_S6_ACC_REQ_TV1;
2738 } else {
2739 DRM_DEBUG_KMS("TV1 disconnected\n");
2740 bios_0_scratch &= ~ATOM_S0_TV1_MASK;
2741 bios_3_scratch &= ~ATOM_S3_TV1_ACTIVE;
2742 bios_6_scratch &= ~ATOM_S6_ACC_REQ_TV1;
2743 }
2744 }
2745 if ((radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) &&
2746 (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT)) {
2747 if (connected) {
2748 DRM_DEBUG_KMS("CV connected\n");
2749 bios_3_scratch |= ATOM_S3_CV_ACTIVE;
2750 bios_6_scratch |= ATOM_S6_ACC_REQ_CV;
2751 } else {
2752 DRM_DEBUG_KMS("CV disconnected\n");
2753 bios_0_scratch &= ~ATOM_S0_CV_MASK;
2754 bios_3_scratch &= ~ATOM_S3_CV_ACTIVE;
2755 bios_6_scratch &= ~ATOM_S6_ACC_REQ_CV;
2756 }
2757 }
2758 if ((radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) &&
2759 (radeon_connector->devices & ATOM_DEVICE_LCD1_SUPPORT)) {
2760 if (connected) {
2761 DRM_DEBUG_KMS("LCD1 connected\n");
2762 bios_0_scratch |= ATOM_S0_LCD1;
2763 bios_3_scratch |= ATOM_S3_LCD1_ACTIVE;
2764 bios_6_scratch |= ATOM_S6_ACC_REQ_LCD1;
2765 } else {
2766 DRM_DEBUG_KMS("LCD1 disconnected\n");
2767 bios_0_scratch &= ~ATOM_S0_LCD1;
2768 bios_3_scratch &= ~ATOM_S3_LCD1_ACTIVE;
2769 bios_6_scratch &= ~ATOM_S6_ACC_REQ_LCD1;
2770 }
2771 }
2772 if ((radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) &&
2773 (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT)) {
2774 if (connected) {
2775 DRM_DEBUG_KMS("CRT1 connected\n");
2776 bios_0_scratch |= ATOM_S0_CRT1_COLOR;
2777 bios_3_scratch |= ATOM_S3_CRT1_ACTIVE;
2778 bios_6_scratch |= ATOM_S6_ACC_REQ_CRT1;
2779 } else {
2780 DRM_DEBUG_KMS("CRT1 disconnected\n");
2781 bios_0_scratch &= ~ATOM_S0_CRT1_MASK;
2782 bios_3_scratch &= ~ATOM_S3_CRT1_ACTIVE;
2783 bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT1;
2784 }
2785 }
2786 if ((radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) &&
2787 (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT)) {
2788 if (connected) {
2789 DRM_DEBUG_KMS("CRT2 connected\n");
2790 bios_0_scratch |= ATOM_S0_CRT2_COLOR;
2791 bios_3_scratch |= ATOM_S3_CRT2_ACTIVE;
2792 bios_6_scratch |= ATOM_S6_ACC_REQ_CRT2;
2793 } else {
2794 DRM_DEBUG_KMS("CRT2 disconnected\n");
2795 bios_0_scratch &= ~ATOM_S0_CRT2_MASK;
2796 bios_3_scratch &= ~ATOM_S3_CRT2_ACTIVE;
2797 bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT2;
2798 }
2799 }
2800 if ((radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) &&
2801 (radeon_connector->devices & ATOM_DEVICE_DFP1_SUPPORT)) {
2802 if (connected) {
2803 DRM_DEBUG_KMS("DFP1 connected\n");
2804 bios_0_scratch |= ATOM_S0_DFP1;
2805 bios_3_scratch |= ATOM_S3_DFP1_ACTIVE;
2806 bios_6_scratch |= ATOM_S6_ACC_REQ_DFP1;
2807 } else {
2808 DRM_DEBUG_KMS("DFP1 disconnected\n");
2809 bios_0_scratch &= ~ATOM_S0_DFP1;
2810 bios_3_scratch &= ~ATOM_S3_DFP1_ACTIVE;
2811 bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP1;
2812 }
2813 }
2814 if ((radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) &&
2815 (radeon_connector->devices & ATOM_DEVICE_DFP2_SUPPORT)) {
2816 if (connected) {
2817 DRM_DEBUG_KMS("DFP2 connected\n");
2818 bios_0_scratch |= ATOM_S0_DFP2;
2819 bios_3_scratch |= ATOM_S3_DFP2_ACTIVE;
2820 bios_6_scratch |= ATOM_S6_ACC_REQ_DFP2;
2821 } else {
2822 DRM_DEBUG_KMS("DFP2 disconnected\n");
2823 bios_0_scratch &= ~ATOM_S0_DFP2;
2824 bios_3_scratch &= ~ATOM_S3_DFP2_ACTIVE;
2825 bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP2;
2826 }
2827 }
2828 if ((radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) &&
2829 (radeon_connector->devices & ATOM_DEVICE_DFP3_SUPPORT)) {
2830 if (connected) {
2831 DRM_DEBUG_KMS("DFP3 connected\n");
2832 bios_0_scratch |= ATOM_S0_DFP3;
2833 bios_3_scratch |= ATOM_S3_DFP3_ACTIVE;
2834 bios_6_scratch |= ATOM_S6_ACC_REQ_DFP3;
2835 } else {
2836 DRM_DEBUG_KMS("DFP3 disconnected\n");
2837 bios_0_scratch &= ~ATOM_S0_DFP3;
2838 bios_3_scratch &= ~ATOM_S3_DFP3_ACTIVE;
2839 bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP3;
2840 }
2841 }
2842 if ((radeon_encoder->devices & ATOM_DEVICE_DFP4_SUPPORT) &&
2843 (radeon_connector->devices & ATOM_DEVICE_DFP4_SUPPORT)) {
2844 if (connected) {
2845 DRM_DEBUG_KMS("DFP4 connected\n");
2846 bios_0_scratch |= ATOM_S0_DFP4;
2847 bios_3_scratch |= ATOM_S3_DFP4_ACTIVE;
2848 bios_6_scratch |= ATOM_S6_ACC_REQ_DFP4;
2849 } else {
2850 DRM_DEBUG_KMS("DFP4 disconnected\n");
2851 bios_0_scratch &= ~ATOM_S0_DFP4;
2852 bios_3_scratch &= ~ATOM_S3_DFP4_ACTIVE;
2853 bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP4;
2854 }
2855 }
2856 if ((radeon_encoder->devices & ATOM_DEVICE_DFP5_SUPPORT) &&
2857 (radeon_connector->devices & ATOM_DEVICE_DFP5_SUPPORT)) {
2858 if (connected) {
2859 DRM_DEBUG_KMS("DFP5 connected\n");
2860 bios_0_scratch |= ATOM_S0_DFP5;
2861 bios_3_scratch |= ATOM_S3_DFP5_ACTIVE;
2862 bios_6_scratch |= ATOM_S6_ACC_REQ_DFP5;
2863 } else {
2864 DRM_DEBUG_KMS("DFP5 disconnected\n");
2865 bios_0_scratch &= ~ATOM_S0_DFP5;
2866 bios_3_scratch &= ~ATOM_S3_DFP5_ACTIVE;
2867 bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP5;
2868 }
2869 }
2870
2871 if (rdev->family >= CHIP_R600) {
2872 WREG32(R600_BIOS_0_SCRATCH, bios_0_scratch);
2873 WREG32(R600_BIOS_3_SCRATCH, bios_3_scratch);
2874 WREG32(R600_BIOS_6_SCRATCH, bios_6_scratch);
2875 } else {
2876 WREG32(RADEON_BIOS_0_SCRATCH, bios_0_scratch);
2877 WREG32(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
2878 WREG32(RADEON_BIOS_6_SCRATCH, bios_6_scratch);
2879 }
2880 }
2881
2882 void
radeon_atombios_encoder_crtc_scratch_regs(struct drm_encoder * encoder,int crtc)2883 radeon_atombios_encoder_crtc_scratch_regs(struct drm_encoder *encoder, int crtc)
2884 {
2885 struct drm_device *dev = encoder->dev;
2886 struct radeon_device *rdev = dev->dev_private;
2887 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2888 uint32_t bios_3_scratch;
2889
2890 if (rdev->family >= CHIP_R600)
2891 bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH);
2892 else
2893 bios_3_scratch = RREG32(RADEON_BIOS_3_SCRATCH);
2894
2895 if (radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) {
2896 bios_3_scratch &= ~ATOM_S3_TV1_CRTC_ACTIVE;
2897 bios_3_scratch |= (crtc << 18);
2898 }
2899 if (radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) {
2900 bios_3_scratch &= ~ATOM_S3_CV_CRTC_ACTIVE;
2901 bios_3_scratch |= (crtc << 24);
2902 }
2903 if (radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) {
2904 bios_3_scratch &= ~ATOM_S3_CRT1_CRTC_ACTIVE;
2905 bios_3_scratch |= (crtc << 16);
2906 }
2907 if (radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) {
2908 bios_3_scratch &= ~ATOM_S3_CRT2_CRTC_ACTIVE;
2909 bios_3_scratch |= (crtc << 20);
2910 }
2911 if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) {
2912 bios_3_scratch &= ~ATOM_S3_LCD1_CRTC_ACTIVE;
2913 bios_3_scratch |= (crtc << 17);
2914 }
2915 if (radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) {
2916 bios_3_scratch &= ~ATOM_S3_DFP1_CRTC_ACTIVE;
2917 bios_3_scratch |= (crtc << 19);
2918 }
2919 if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) {
2920 bios_3_scratch &= ~ATOM_S3_DFP2_CRTC_ACTIVE;
2921 bios_3_scratch |= (crtc << 23);
2922 }
2923 if (radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) {
2924 bios_3_scratch &= ~ATOM_S3_DFP3_CRTC_ACTIVE;
2925 bios_3_scratch |= (crtc << 25);
2926 }
2927
2928 if (rdev->family >= CHIP_R600)
2929 WREG32(R600_BIOS_3_SCRATCH, bios_3_scratch);
2930 else
2931 WREG32(RADEON_BIOS_3_SCRATCH, bios_3_scratch);
2932 }
2933
2934 void
radeon_atombios_encoder_dpms_scratch_regs(struct drm_encoder * encoder,bool on)2935 radeon_atombios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on)
2936 {
2937 struct drm_device *dev = encoder->dev;
2938 struct radeon_device *rdev = dev->dev_private;
2939 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
2940 uint32_t bios_2_scratch;
2941
2942 if (rdev->family >= CHIP_R600)
2943 bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH);
2944 else
2945 bios_2_scratch = RREG32(RADEON_BIOS_2_SCRATCH);
2946
2947 if (radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) {
2948 if (on)
2949 bios_2_scratch &= ~ATOM_S2_TV1_DPMS_STATE;
2950 else
2951 bios_2_scratch |= ATOM_S2_TV1_DPMS_STATE;
2952 }
2953 if (radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) {
2954 if (on)
2955 bios_2_scratch &= ~ATOM_S2_CV_DPMS_STATE;
2956 else
2957 bios_2_scratch |= ATOM_S2_CV_DPMS_STATE;
2958 }
2959 if (radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) {
2960 if (on)
2961 bios_2_scratch &= ~ATOM_S2_CRT1_DPMS_STATE;
2962 else
2963 bios_2_scratch |= ATOM_S2_CRT1_DPMS_STATE;
2964 }
2965 if (radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) {
2966 if (on)
2967 bios_2_scratch &= ~ATOM_S2_CRT2_DPMS_STATE;
2968 else
2969 bios_2_scratch |= ATOM_S2_CRT2_DPMS_STATE;
2970 }
2971 if (radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) {
2972 if (on)
2973 bios_2_scratch &= ~ATOM_S2_LCD1_DPMS_STATE;
2974 else
2975 bios_2_scratch |= ATOM_S2_LCD1_DPMS_STATE;
2976 }
2977 if (radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) {
2978 if (on)
2979 bios_2_scratch &= ~ATOM_S2_DFP1_DPMS_STATE;
2980 else
2981 bios_2_scratch |= ATOM_S2_DFP1_DPMS_STATE;
2982 }
2983 if (radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) {
2984 if (on)
2985 bios_2_scratch &= ~ATOM_S2_DFP2_DPMS_STATE;
2986 else
2987 bios_2_scratch |= ATOM_S2_DFP2_DPMS_STATE;
2988 }
2989 if (radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) {
2990 if (on)
2991 bios_2_scratch &= ~ATOM_S2_DFP3_DPMS_STATE;
2992 else
2993 bios_2_scratch |= ATOM_S2_DFP3_DPMS_STATE;
2994 }
2995 if (radeon_encoder->devices & ATOM_DEVICE_DFP4_SUPPORT) {
2996 if (on)
2997 bios_2_scratch &= ~ATOM_S2_DFP4_DPMS_STATE;
2998 else
2999 bios_2_scratch |= ATOM_S2_DFP4_DPMS_STATE;
3000 }
3001 if (radeon_encoder->devices & ATOM_DEVICE_DFP5_SUPPORT) {
3002 if (on)
3003 bios_2_scratch &= ~ATOM_S2_DFP5_DPMS_STATE;
3004 else
3005 bios_2_scratch |= ATOM_S2_DFP5_DPMS_STATE;
3006 }
3007
3008 if (rdev->family >= CHIP_R600)
3009 WREG32(R600_BIOS_2_SCRATCH, bios_2_scratch);
3010 else
3011 WREG32(RADEON_BIOS_2_SCRATCH, bios_2_scratch);
3012 }
3013