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