2 * Copyright © 2006,2009 Intel Corporation
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 * Eric Anholt <eric@anholt.net>
36 #include "intel_gpu_tools.h"
38 static uint32_t devid = 0;
40 #define DEBUGSTRING(func) static void func(char *result, int len, int reg, uint32_t val)
42 DEBUGSTRING(i830_16bit_func)
44 snprintf(result, len, "0x%04x", (uint16_t) val);
47 DEBUGSTRING(i830_debug_dcc)
49 const char *addressing = NULL;
51 if (!IS_MOBILE(devid))
56 addressing = "dual channel interleaved";
58 addressing = "single or dual channel asymmetric";
62 addressing = "single channel";
65 addressing = "dual channel asymmetric";
68 addressing = "dual channel interleaved";
71 addressing = "unknown channel layout";
76 snprintf(result, len, "%s, XOR randomization: %sabled, XOR bit: %d",
78 (val & (1 << 10)) ? "dis" : "en",
79 (val & (1 << 9)) ? 17 : 11);
82 DEBUGSTRING(i830_debug_chdecmisc)
84 const char *enhmodesel = NULL;
86 switch ((val >> 5) & 3) {
88 enhmodesel = "XOR bank/rank";
91 enhmodesel = "swap bank";
94 enhmodesel = "XOR bank";
101 snprintf(result, len,
102 "%s, ch2 enh %sabled, ch1 enh %sabled, "
104 "flex %sabled, ep %spresent", enhmodesel,
105 (val & (1 << 4)) ? "en" : "dis",
106 (val & (1 << 3)) ? "en" : "dis",
107 (val & (1 << 2)) ? "en" : "dis",
108 (val & (1 << 1)) ? "en" : "dis",
109 (val & (1 << 0)) ? "" : "not ");
112 DEBUGSTRING(i830_debug_xyminus1)
114 snprintf(result, len, "%d, %d", (val & 0xffff) + 1,
115 ((val & 0xffff0000) >> 16) + 1);
118 DEBUGSTRING(i830_debug_yxminus1)
120 snprintf(result, len, "%d, %d", ((val & 0xffff0000) >> 16) + 1,
124 DEBUGSTRING(i830_debug_xy)
126 snprintf(result, len, "%d, %d", (val & 0xffff), ((val & 0xffff0000) >> 16));
129 DEBUGSTRING(i830_debug_dspstride)
131 snprintf(result, len, "%d bytes", val);
134 DEBUGSTRING(i830_debug_dspcntr)
136 const char *enabled = val & DISPLAY_PLANE_ENABLE ? "enabled" : "disabled";
137 char plane = val & DISPPLANE_SEL_PIPE_B ? 'B' : 'A';
138 if (HAS_PCH_SPLIT(devid))
139 snprintf(result, len, "%s", enabled);
141 snprintf(result, len, "%s, pipe %c", enabled, plane);
144 DEBUGSTRING(i830_debug_pipeconf)
146 const char *enabled = val & PIPEACONF_ENABLE ? "enabled" : "disabled";
147 const char *bit30, *interlace;
150 bit30 = val & I965_PIPECONF_ACTIVE ? "active" : "inactive";
153 val & PIPEACONF_DOUBLE_WIDE ? "double-wide" : "single-wide";
155 if (HAS_PCH_SPLIT(devid)) {
156 const char *bpc, *rotation;
158 switch ((val >> 21) & 7) {
169 interlace = "if-id-dbl";
172 interlace = "pf-id-dbl";
179 switch ((val >> 14) & 3) {
181 rotation = "rotate 0";
184 rotation = "rotate 90";
187 rotation = "rotate 180";
190 rotation = "rotate 270";
194 switch (val & (7 << 5)) {
211 snprintf(result, len, "%s, %s, %s, %s, %s", enabled, bit30,
212 interlace, rotation, bpc);
213 } else if (IS_GEN4(devid)) {
214 switch ((val >> 21) & 7) {
219 interlace = "progressive";
222 interlace = "interlaced embedded";
225 interlace = "interlaced";
228 interlace = "interlaced sdvo";
231 interlace = "interlaced legacy";
234 snprintf(result, len, "%s, %s, %s", enabled, bit30, interlace);
236 snprintf(result, len, "%s, %s", enabled, bit30);
239 DEBUGSTRING(i830_debug_pipestat)
241 const char *_FIFO_UNDERRUN = val & FIFO_UNDERRUN ? " FIFO_UNDERRUN" : "";
242 const char *_CRC_ERROR_ENABLE =
243 val & CRC_ERROR_ENABLE ? " CRC_ERROR_ENABLE" : "";
244 const char *_CRC_DONE_ENABLE =
245 val & CRC_DONE_ENABLE ? " CRC_DONE_ENABLE" : "";
246 const char *_GMBUS_EVENT_ENABLE =
247 val & GMBUS_EVENT_ENABLE ? " GMBUS_EVENT_ENABLE" : "";
248 const char *_VSYNC_INT_ENABLE =
249 val & VSYNC_INT_ENABLE ? " VSYNC_INT_ENABLE" : "";
250 const char *_DLINE_COMPARE_ENABLE =
251 val & DLINE_COMPARE_ENABLE ? " DLINE_COMPARE_ENABLE" : "";
252 const char *_DPST_EVENT_ENABLE =
253 val & DPST_EVENT_ENABLE ? " DPST_EVENT_ENABLE" : "";
254 const char *_LBLC_EVENT_ENABLE =
255 val & LBLC_EVENT_ENABLE ? " LBLC_EVENT_ENABLE" : "";
256 const char *_OFIELD_INT_ENABLE =
257 val & OFIELD_INT_ENABLE ? " OFIELD_INT_ENABLE" : "";
258 const char *_EFIELD_INT_ENABLE =
259 val & EFIELD_INT_ENABLE ? " EFIELD_INT_ENABLE" : "";
260 const char *_SVBLANK_INT_ENABLE =
261 val & SVBLANK_INT_ENABLE ? " SVBLANK_INT_ENABLE" : "";
262 const char *_VBLANK_INT_ENABLE =
263 val & VBLANK_INT_ENABLE ? " VBLANK_INT_ENABLE" : "";
264 const char *_OREG_UPDATE_ENABLE =
265 val & OREG_UPDATE_ENABLE ? " OREG_UPDATE_ENABLE" : "";
266 const char *_CRC_ERROR_INT_STATUS =
267 val & CRC_ERROR_INT_STATUS ? " CRC_ERROR_INT_STATUS" : "";
268 const char *_CRC_DONE_INT_STATUS =
269 val & CRC_DONE_INT_STATUS ? " CRC_DONE_INT_STATUS" : "";
270 const char *_GMBUS_INT_STATUS =
271 val & GMBUS_INT_STATUS ? " GMBUS_INT_STATUS" : "";
272 const char *_VSYNC_INT_STATUS =
273 val & VSYNC_INT_STATUS ? " VSYNC_INT_STATUS" : "";
274 const char *_DLINE_COMPARE_STATUS =
275 val & DLINE_COMPARE_STATUS ? " DLINE_COMPARE_STATUS" : "";
276 const char *_DPST_EVENT_STATUS =
277 val & DPST_EVENT_STATUS ? " DPST_EVENT_STATUS" : "";
278 const char *_LBLC_EVENT_STATUS =
279 val & LBLC_EVENT_STATUS ? " LBLC_EVENT_STATUS" : "";
280 const char *_OFIELD_INT_STATUS =
281 val & OFIELD_INT_STATUS ? " OFIELD_INT_STATUS" : "";
282 const char *_EFIELD_INT_STATUS =
283 val & EFIELD_INT_STATUS ? " EFIELD_INT_STATUS" : "";
284 const char *_SVBLANK_INT_STATUS =
285 val & SVBLANK_INT_STATUS ? " SVBLANK_INT_STATUS" : "";
286 const char *_VBLANK_INT_STATUS =
287 val & VBLANK_INT_STATUS ? " VBLANK_INT_STATUS" : "";
288 const char *_OREG_UPDATE_STATUS =
289 val & OREG_UPDATE_STATUS ? " OREG_UPDATE_STATUS" : "";
290 snprintf(result, len,
291 "status:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
297 _DLINE_COMPARE_ENABLE,
305 _CRC_ERROR_INT_STATUS,
306 _CRC_DONE_INT_STATUS,
309 _DLINE_COMPARE_STATUS,
316 _OREG_UPDATE_STATUS);
319 DEBUGSTRING(ivb_debug_port)
321 const char *drrs = NULL;
322 switch (val & (2 << 30)) {
323 case PORT_DBG_DRRS_HW_STATE_OFF:
326 case PORT_DBG_DRRS_HW_STATE_LOW:
329 case PORT_DBG_DRRS_HW_STATE_HIGH:
333 snprintf(result, len, "HW DRRS %s",
337 DEBUGSTRING(i830_debug_hvtotal)
339 snprintf(result, len, "%d active, %d total",
341 ((val & 0xffff0000) >> 16) + 1);
344 DEBUGSTRING(i830_debug_hvsyncblank)
346 snprintf(result, len, "%d start, %d end",
348 ((val & 0xffff0000) >> 16) + 1);
351 DEBUGSTRING(i830_debug_vgacntrl)
353 snprintf(result, len, "%s",
354 val & VGA_DISP_DISABLE ? "disabled" : "enabled");
357 DEBUGSTRING(i830_debug_fp)
360 snprintf(result, len, "n = %d, m1 = %d, m2 = %d",
361 ffs((val & FP_N_IGD_DIV_MASK) >>
363 ((val & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT),
364 ((val & FP_M2_IGD_DIV_MASK) >>
367 snprintf(result, len, "n = %d, m1 = %d, m2 = %d",
368 ((val & FP_N_DIV_MASK) >> FP_N_DIV_SHIFT),
369 ((val & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT),
370 ((val & FP_M2_DIV_MASK) >> FP_M2_DIV_SHIFT));
373 DEBUGSTRING(i830_debug_vga_pd)
375 int vga0_p1, vga0_p2, vga1_p1, vga1_p2;
377 /* XXX: i9xx version */
379 if (val & VGA0_PD_P1_DIV_2)
382 vga0_p1 = ((val & VGA0_PD_P1_MASK) >> VGA0_PD_P1_SHIFT) + 2;
383 vga0_p2 = (val & VGA0_PD_P2_DIV_4) ? 4 : 2;
385 if (val & VGA1_PD_P1_DIV_2)
388 vga1_p1 = ((val & VGA1_PD_P1_MASK) >> VGA1_PD_P1_SHIFT) + 2;
389 vga1_p2 = (val & VGA1_PD_P2_DIV_4) ? 4 : 2;
391 snprintf(result, len, "vga0 p1 = %d, p2 = %d, vga1 p1 = %d, p2 = %d",
392 vga0_p1, vga0_p2, vga1_p1, vga1_p2);
395 DEBUGSTRING(i830_debug_pp_status)
397 const char *status = val & PP_ON ? "on" : "off";
398 const char *ready = val & PP_READY ? "ready" : "not ready";
399 const char *seq = "unknown";
401 switch (val & PP_SEQUENCE_MASK) {
402 case PP_SEQUENCE_NONE:
408 case PP_SEQUENCE_OFF:
413 snprintf(result, len, "%s, %s, sequencing %s", status, ready, seq);
416 DEBUGSTRING(i830_debug_pp_control)
418 snprintf(result, len, "power target: %s",
419 val & POWER_TARGET_ON ? "on" : "off");
422 DEBUGSTRING(i830_debug_dpll)
424 const char *enabled = val & DPLL_VCO_ENABLE ? "enabled" : "disabled";
425 const char *dvomode = val & DPLL_DVO_HIGH_SPEED ? "dvo" : "non-dvo";
426 const char *vgamode = val & DPLL_VGA_MODE_DIS ? "" : ", VGA";
427 const char *mode = "unknown";
428 const char *clock = "unknown";
429 const char *fpextra = val & DISPLAY_RATE_SELECT_FPA1 ? ", using FPx1!" : "";
433 if (IS_GEN2(devid)) {
434 char is_lvds = (INREG(LVDS) & LVDS_PORT_EN) && (reg == DPLL_B);
438 p1 = ffs((val & DPLL_FPA01_P1_POST_DIV_MASK_I830_LVDS)
439 >> DPLL_FPA01_P1_POST_DIV_SHIFT);
440 if ((INREG(LVDS) & LVDS_CLKB_POWER_MASK) ==
448 if (val & PLL_P1_DIVIDE_BY_TWO) {
451 /* Map the number in the field to (3, 33) */
452 p1 = ((val & DPLL_FPA01_P1_POST_DIV_MASK_I830)
453 >> DPLL_FPA01_P1_POST_DIV_SHIFT) + 2;
455 if (val & PLL_P2_DIVIDE_BY_4)
462 p1 = ffs((val & DPLL_FPA01_P1_POST_DIV_MASK_IGD) >>
463 DPLL_FPA01_P1_POST_DIV_SHIFT_IGD);
465 p1 = ffs((val & DPLL_FPA01_P1_POST_DIV_MASK) >>
466 DPLL_FPA01_P1_POST_DIV_SHIFT);
468 switch (val & DPLL_MODE_MASK) {
469 case DPLLB_MODE_DAC_SERIAL:
471 p2 = val & DPLL_DAC_SERIAL_P2_CLOCK_DIV_5 ? 5 : 10;
473 case DPLLB_MODE_LVDS:
475 p2 = val & DPLLB_LVDS_P2_CLOCK_DIV_7 ? 7 : 14;
480 switch (val & PLL_REF_INPUT_MASK) {
481 case PLL_REF_INPUT_DREFCLK:
484 case PLL_REF_INPUT_TVCLKINA:
487 case PLL_REF_INPUT_TVCLKINBC:
490 case PLLB_REF_INPUT_SPREADSPECTRUMIN:
492 clock = "spread spectrum";
497 sprintf(sdvoextra, ", SDVO mult %d",
498 (int)((val & SDVO_MULTIPLIER_MASK) >>
499 SDVO_MULTIPLIER_SHIFT_HIRES) + 1);
504 snprintf(result, len, "%s, %s%s, %s clock, %s mode, p1 = %d, "
506 enabled, dvomode, vgamode, clock, mode, p1, p2,
510 DEBUGSTRING(i830_debug_dpll_test)
512 const char *dpllandiv = val & DPLLA_TEST_N_BYPASS ? ", DPLLA N bypassed" : "";
513 const char *dpllamdiv = val & DPLLA_TEST_M_BYPASS ? ", DPLLA M bypassed" : "";
514 const char *dpllainput = val & DPLLA_INPUT_BUFFER_ENABLE ?
515 "" : ", DPLLA input buffer disabled";
516 const char *dpllbndiv = val & DPLLB_TEST_N_BYPASS ? ", DPLLB N bypassed" : "";
517 const char *dpllbmdiv = val & DPLLB_TEST_M_BYPASS ? ", DPLLB M bypassed" : "";
518 const char *dpllbinput = val & DPLLB_INPUT_BUFFER_ENABLE ?
519 "" : ", DPLLB input buffer disabled";
521 snprintf(result, len, "%s%s%s%s%s%s",
522 dpllandiv, dpllamdiv, dpllainput,
523 dpllbndiv, dpllbmdiv, dpllbinput);
526 DEBUGSTRING(i830_debug_adpa)
528 char disp_pipe = (val & ADPA_PIPE_B_SELECT) ? 'B' : 'A';
529 const char *enable = (val & ADPA_DAC_ENABLE) ? "enabled" : "disabled";
530 char hsync = (val & ADPA_HSYNC_ACTIVE_HIGH) ? '+' : '-';
531 char vsync = (val & ADPA_VSYNC_ACTIVE_HIGH) ? '+' : '-';
534 disp_pipe = val & (1<<29) ? 'B' : 'A';
536 if (HAS_PCH_SPLIT(devid))
537 snprintf(result, len, "%s, transcoder %c, %chsync, %cvsync",
538 enable, disp_pipe, hsync, vsync);
540 snprintf(result, len, "%s, pipe %c, %chsync, %cvsync",
541 enable, disp_pipe, hsync, vsync);
544 DEBUGSTRING(i830_debug_lvds)
546 char disp_pipe = val & LVDS_PIPEB_SELECT ? 'B' : 'A';
547 const char *enable = val & LVDS_PORT_EN ? "enabled" : "disabled";
549 const char *channels;
551 if ((val & LVDS_A3_POWER_MASK) == LVDS_A3_POWER_UP)
555 if ((val & LVDS_B0B3_POWER_MASK) == LVDS_B0B3_POWER_UP)
556 channels = "2 channels";
558 channels = "1 channel";
561 disp_pipe = val & (1<<29) ? 'B' : 'A';
563 snprintf(result, len, "%s, pipe %c, %d bit, %s",
564 enable, disp_pipe, depth, channels);
567 DEBUGSTRING(i830_debug_dvo)
569 const char *enable = val & DVO_ENABLE ? "enabled" : "disabled";
570 char disp_pipe = val & DVO_PIPE_B_SELECT ? 'B' : 'A';
572 char hsync = val & DVO_HSYNC_ACTIVE_HIGH ? '+' : '-';
573 char vsync = val & DVO_VSYNC_ACTIVE_HIGH ? '+' : '-';
575 switch (val & DVO_PIPE_STALL_MASK) {
576 case DVO_PIPE_STALL_UNUSED:
582 case DVO_PIPE_STALL_TV:
586 stall = "unknown stall";
590 snprintf(result, len, "%s, pipe %c, %s, %chsync, %cvsync",
591 enable, disp_pipe, stall, hsync, vsync);
594 DEBUGSTRING(i830_debug_sdvo)
596 const char *enable = val & SDVO_ENABLE ? "enabled" : "disabled";
597 char disp_pipe = val & SDVO_PIPE_B_SELECT ? 'B' : 'A';
598 const char *stall = val & SDVO_STALL_SELECT ? "enabled" : "disabled";
599 const char *detected = val & SDVO_DETECTED ? "" : "not ";
600 const char *gang = val & SDVOC_GANG_MODE ? ", gang mode" : "";
604 sprintf(sdvoextra, ", SDVO mult %d",
605 (int)((val & SDVO_PORT_MULTIPLY_MASK) >>
606 SDVO_PORT_MULTIPLY_SHIFT) + 1);
611 snprintf(result, len, "%s, pipe %c, stall %s, %sdetected%s%s",
612 enable, disp_pipe, stall, detected, sdvoextra, gang);
615 DEBUGSTRING(i830_debug_dspclk_gate_d)
617 const char *DPUNIT_B = val & DPUNIT_B_CLOCK_GATE_DISABLE ? " DPUNIT_B" : "";
618 const char *VSUNIT = val & VSUNIT_CLOCK_GATE_DISABLE ? " VSUNIT" : "";
619 const char *VRHUNIT = val & VRHUNIT_CLOCK_GATE_DISABLE ? " VRHUNIT" : "";
620 const char *VRDUNIT = val & VRDUNIT_CLOCK_GATE_DISABLE ? " VRDUNIT" : "";
621 const char *AUDUNIT = val & AUDUNIT_CLOCK_GATE_DISABLE ? " AUDUNIT" : "";
622 const char *DPUNIT_A = val & DPUNIT_A_CLOCK_GATE_DISABLE ? " DPUNIT_A" : "";
623 const char *DPCUNIT = val & DPCUNIT_CLOCK_GATE_DISABLE ? " DPCUNIT" : "";
624 const char *TVRUNIT = val & TVRUNIT_CLOCK_GATE_DISABLE ? " TVRUNIT" : "";
625 const char *TVCUNIT = val & TVCUNIT_CLOCK_GATE_DISABLE ? " TVCUNIT" : "";
626 const char *TVFUNIT = val & TVFUNIT_CLOCK_GATE_DISABLE ? " TVFUNIT" : "";
627 const char *TVEUNIT = val & TVEUNIT_CLOCK_GATE_DISABLE ? " TVEUNIT" : "";
628 const char *DVSUNIT = val & DVSUNIT_CLOCK_GATE_DISABLE ? " DVSUNIT" : "";
629 const char *DSSUNIT = val & DSSUNIT_CLOCK_GATE_DISABLE ? " DSSUNIT" : "";
630 const char *DDBUNIT = val & DDBUNIT_CLOCK_GATE_DISABLE ? " DDBUNIT" : "";
631 const char *DPRUNIT = val & DPRUNIT_CLOCK_GATE_DISABLE ? " DPRUNIT" : "";
632 const char *DPFUNIT = val & DPFUNIT_CLOCK_GATE_DISABLE ? " DPFUNIT" : "";
633 const char *DPBMUNIT = val & DPBMUNIT_CLOCK_GATE_DISABLE ? " DPBMUNIT" : "";
634 const char *DPLSUNIT = val & DPLSUNIT_CLOCK_GATE_DISABLE ? " DPLSUNIT" : "";
635 const char *DPLUNIT = val & DPLUNIT_CLOCK_GATE_DISABLE ? " DPLUNIT" : "";
636 const char *DPOUNIT = val & DPOUNIT_CLOCK_GATE_DISABLE ? " DPOUNIT" : "";
637 const char *DPBUNIT = val & DPBUNIT_CLOCK_GATE_DISABLE ? " DPBUNIT" : "";
638 const char *DCUNIT = val & DCUNIT_CLOCK_GATE_DISABLE ? " DCUNIT" : "";
639 const char *DPUNIT = val & DPUNIT_CLOCK_GATE_DISABLE ? " DPUNIT" : "";
640 const char *VRUNIT = val & VRUNIT_CLOCK_GATE_DISABLE ? " VRUNIT" : "";
641 const char *OVHUNIT = val & OVHUNIT_CLOCK_GATE_DISABLE ? " OVHUNIT" : "";
642 const char *DPIOUNIT = val & DPIOUNIT_CLOCK_GATE_DISABLE ? " DPIOUNIT" : "";
643 const char *OVFUNIT = val & OVFUNIT_CLOCK_GATE_DISABLE ? " OVFUNIT" : "";
644 const char *OVBUNIT = val & OVBUNIT_CLOCK_GATE_DISABLE ? " OVBUNIT" : "";
645 const char *OVRUNIT = val & OVRUNIT_CLOCK_GATE_DISABLE ? " OVRUNIT" : "";
646 const char *OVCUNIT = val & OVCUNIT_CLOCK_GATE_DISABLE ? " OVCUNIT" : "";
647 const char *OVUUNIT = val & OVUUNIT_CLOCK_GATE_DISABLE ? " OVUUNIT" : "";
648 const char *OVLUNIT = val & OVLUNIT_CLOCK_GATE_DISABLE ? " OVLUNIT" : "";
650 snprintf(result, len,
651 "clock gates disabled:%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
652 DPUNIT_B, VSUNIT, VRHUNIT, VRDUNIT, AUDUNIT, DPUNIT_A, DPCUNIT,
653 TVRUNIT, TVCUNIT, TVFUNIT, TVEUNIT, DVSUNIT, DSSUNIT, DDBUNIT,
654 DPRUNIT, DPFUNIT, DPBMUNIT, DPLSUNIT, DPLUNIT, DPOUNIT, DPBUNIT,
655 DCUNIT, DPUNIT, VRUNIT, OVHUNIT, DPIOUNIT, OVFUNIT, OVBUNIT,
656 OVRUNIT, OVCUNIT, OVUUNIT, OVLUNIT);
659 DEBUGSTRING(i810_debug_915_fence)
661 char format = (val & 1 << 12) ? 'Y' : 'X';
662 int pitch = 128 << ((val & 0x70) >> 4);
663 unsigned int offset = val & 0x0ff00000;
664 int size = (1024 * 1024) << ((val & 0x700) >> 8);
666 if (IS_965(devid) || (IS_915(devid) && reg >= FENCE_NEW))
672 snprintf(result, len, "enabled, %c tiled, %4d pitch, 0x%08x - 0x%08x (%dkb)",
673 format, pitch, offset, offset + size,
676 snprintf(result, len, "disabled");
680 DEBUGSTRING(i810_debug_965_fence_start)
682 const char *enable = (val & FENCE_VALID) ? " enabled" : "disabled";
683 char format = (val & I965_FENCE_Y_MAJOR) ? 'Y' : 'X';
684 int pitch = ((val & 0xffc) >> 2) * 128 + 128;
685 unsigned int offset = val & 0xfffff000;
690 snprintf(result, len, "%s, %c tile walk, %4d pitch, 0x%08x start",
691 enable, format, pitch, offset);
694 DEBUGSTRING(i810_debug_965_fence_end)
696 unsigned int end = val & 0xfffff000;
701 snprintf(result, len, " 0x%08x end", end);
704 #define DEFINEREG(reg) \
705 { reg, #reg, NULL, 0 }
706 #define DEFINEREG_16BIT(reg) \
707 { reg, #reg, i830_16bit_func, 0 }
708 #define DEFINEREG2(reg, func) \
709 { reg, #reg, func, 0 }
714 void (*debug_output) (char *result, int len, int reg, uint32_t val);
718 static struct reg_debug intel_debug_regs[] = {
719 DEFINEREG2(DCC, i830_debug_dcc),
720 DEFINEREG2(CHDECMISC, i830_debug_chdecmisc),
721 DEFINEREG_16BIT(C0DRB0),
722 DEFINEREG_16BIT(C0DRB1),
723 DEFINEREG_16BIT(C0DRB2),
724 DEFINEREG_16BIT(C0DRB3),
725 DEFINEREG_16BIT(C1DRB0),
726 DEFINEREG_16BIT(C1DRB1),
727 DEFINEREG_16BIT(C1DRB2),
728 DEFINEREG_16BIT(C1DRB3),
729 DEFINEREG_16BIT(C0DRA01),
730 DEFINEREG_16BIT(C0DRA23),
731 DEFINEREG_16BIT(C1DRA01),
732 DEFINEREG_16BIT(C1DRA23),
734 DEFINEREG(PGETBL_CTL),
736 DEFINEREG2(VCLK_DIVISOR_VGA0, i830_debug_fp),
737 DEFINEREG2(VCLK_DIVISOR_VGA1, i830_debug_fp),
738 DEFINEREG2(VCLK_POST_DIV, i830_debug_vga_pd),
739 DEFINEREG2(DPLL_TEST, i830_debug_dpll_test),
740 DEFINEREG(CACHE_MODE_0),
742 DEFINEREG2(DSPCLK_GATE_D, i830_debug_dspclk_gate_d),
743 DEFINEREG(RENCLK_GATE_D1),
744 DEFINEREG(RENCLK_GATE_D2),
745 /* DEFINEREG(RAMCLK_GATE_D), CRL only */
746 DEFINEREG2(SDVOB, i830_debug_sdvo),
747 DEFINEREG2(SDVOC, i830_debug_sdvo),
748 /* DEFINEREG(UDIB_SVB_SHB_CODES), CRL only */
749 /* DEFINEREG(UDIB_SHA_BLANK_CODES), CRL only */
756 DEFINEREG2(ADPA, i830_debug_adpa),
757 DEFINEREG2(LVDS, i830_debug_lvds),
758 DEFINEREG2(DVOA, i830_debug_dvo),
759 DEFINEREG2(DVOB, i830_debug_dvo),
760 DEFINEREG2(DVOC, i830_debug_dvo),
761 DEFINEREG(DVOA_SRCDIM),
762 DEFINEREG(DVOB_SRCDIM),
763 DEFINEREG(DVOC_SRCDIM),
765 DEFINEREG(BLC_PWM_CTL),
766 DEFINEREG(BLC_PWM_CTL2),
768 DEFINEREG2(PP_CONTROL, i830_debug_pp_control),
769 DEFINEREG2(PP_STATUS, i830_debug_pp_status),
770 DEFINEREG(PP_ON_DELAYS),
771 DEFINEREG(PP_OFF_DELAYS),
772 DEFINEREG(PP_DIVISOR),
773 DEFINEREG(PFIT_CONTROL),
774 DEFINEREG(PFIT_PGM_RATIOS),
775 DEFINEREG(PORT_HOTPLUG_EN),
776 DEFINEREG(PORT_HOTPLUG_STAT),
778 DEFINEREG2(DSPACNTR, i830_debug_dspcntr),
779 DEFINEREG2(DSPASTRIDE, i830_debug_dspstride),
780 DEFINEREG2(DSPAPOS, i830_debug_xy),
781 DEFINEREG2(DSPASIZE, i830_debug_xyminus1),
784 DEFINEREG(DSPATILEOFF),
785 DEFINEREG2(PIPEACONF, i830_debug_pipeconf),
786 DEFINEREG2(PIPEASRC, i830_debug_yxminus1),
787 DEFINEREG2(PIPEASTAT, i830_debug_pipestat),
788 DEFINEREG(PIPEA_GMCH_DATA_M),
789 DEFINEREG(PIPEA_GMCH_DATA_N),
790 DEFINEREG(PIPEA_DP_LINK_M),
791 DEFINEREG(PIPEA_DP_LINK_N),
792 DEFINEREG(CURSOR_A_BASE),
793 DEFINEREG(CURSOR_A_CONTROL),
794 DEFINEREG(CURSOR_A_POSITION),
796 DEFINEREG2(FPA0, i830_debug_fp),
797 DEFINEREG2(FPA1, i830_debug_fp),
798 DEFINEREG2(DPLL_A, i830_debug_dpll),
799 DEFINEREG(DPLL_A_MD),
800 DEFINEREG2(HTOTAL_A, i830_debug_hvtotal),
801 DEFINEREG2(HBLANK_A, i830_debug_hvsyncblank),
802 DEFINEREG2(HSYNC_A, i830_debug_hvsyncblank),
803 DEFINEREG2(VTOTAL_A, i830_debug_hvtotal),
804 DEFINEREG2(VBLANK_A, i830_debug_hvsyncblank),
805 DEFINEREG2(VSYNC_A, i830_debug_hvsyncblank),
806 DEFINEREG(BCLRPAT_A),
807 DEFINEREG(VSYNCSHIFT_A),
809 DEFINEREG2(DSPBCNTR, i830_debug_dspcntr),
810 DEFINEREG2(DSPBSTRIDE, i830_debug_dspstride),
811 DEFINEREG2(DSPBPOS, i830_debug_xy),
812 DEFINEREG2(DSPBSIZE, i830_debug_xyminus1),
815 DEFINEREG(DSPBTILEOFF),
816 DEFINEREG2(PIPEBCONF, i830_debug_pipeconf),
817 DEFINEREG2(PIPEBSRC, i830_debug_yxminus1),
818 DEFINEREG2(PIPEBSTAT, i830_debug_pipestat),
819 DEFINEREG(PIPEB_GMCH_DATA_M),
820 DEFINEREG(PIPEB_GMCH_DATA_N),
821 DEFINEREG(PIPEB_DP_LINK_M),
822 DEFINEREG(PIPEB_DP_LINK_N),
823 DEFINEREG(CURSOR_B_BASE),
824 DEFINEREG(CURSOR_B_CONTROL),
825 DEFINEREG(CURSOR_B_POSITION),
827 DEFINEREG2(FPB0, i830_debug_fp),
828 DEFINEREG2(FPB1, i830_debug_fp),
829 DEFINEREG2(DPLL_B, i830_debug_dpll),
830 DEFINEREG(DPLL_B_MD),
831 DEFINEREG2(HTOTAL_B, i830_debug_hvtotal),
832 DEFINEREG2(HBLANK_B, i830_debug_hvsyncblank),
833 DEFINEREG2(HSYNC_B, i830_debug_hvsyncblank),
834 DEFINEREG2(VTOTAL_B, i830_debug_hvtotal),
835 DEFINEREG2(VBLANK_B, i830_debug_hvsyncblank),
836 DEFINEREG2(VSYNC_B, i830_debug_hvsyncblank),
837 DEFINEREG(BCLRPAT_B),
838 DEFINEREG(VSYNCSHIFT_B),
840 DEFINEREG(VCLK_DIVISOR_VGA0),
841 DEFINEREG(VCLK_DIVISOR_VGA1),
842 DEFINEREG(VCLK_POST_DIV),
843 DEFINEREG2(VGACNTRL, i830_debug_vgacntrl),
848 DEFINEREG(TV_CSC_Y2),
850 DEFINEREG(TV_CSC_U2),
852 DEFINEREG(TV_CSC_V2),
853 DEFINEREG(TV_CLR_KNOBS),
854 DEFINEREG(TV_CLR_LEVEL),
855 DEFINEREG(TV_H_CTL_1),
856 DEFINEREG(TV_H_CTL_2),
857 DEFINEREG(TV_H_CTL_3),
858 DEFINEREG(TV_V_CTL_1),
859 DEFINEREG(TV_V_CTL_2),
860 DEFINEREG(TV_V_CTL_3),
861 DEFINEREG(TV_V_CTL_4),
862 DEFINEREG(TV_V_CTL_5),
863 DEFINEREG(TV_V_CTL_6),
864 DEFINEREG(TV_V_CTL_7),
865 DEFINEREG(TV_SC_CTL_1),
866 DEFINEREG(TV_SC_CTL_2),
867 DEFINEREG(TV_SC_CTL_3),
868 DEFINEREG(TV_WIN_POS),
869 DEFINEREG(TV_WIN_SIZE),
870 DEFINEREG(TV_FILTER_CTL_1),
871 DEFINEREG(TV_FILTER_CTL_2),
872 DEFINEREG(TV_FILTER_CTL_3),
873 DEFINEREG(TV_CC_CONTROL),
874 DEFINEREG(TV_CC_DATA),
875 DEFINEREG(TV_H_LUMA_0),
876 DEFINEREG(TV_H_LUMA_59),
877 DEFINEREG(TV_H_CHROMA_0),
878 DEFINEREG(TV_H_CHROMA_59),
880 DEFINEREG(FBC_CFB_BASE),
881 DEFINEREG(FBC_LL_BASE),
882 DEFINEREG(FBC_CONTROL),
883 DEFINEREG(FBC_COMMAND),
884 DEFINEREG(FBC_STATUS),
885 DEFINEREG(FBC_CONTROL2),
886 DEFINEREG(FBC_FENCE_OFF),
887 DEFINEREG(FBC_MOD_NUM),
890 /* DEFINEREG(MI_DISPLAY_POWER_DOWN), CRL only */
891 DEFINEREG(MI_ARB_STATE),
892 DEFINEREG(MI_RDRET_STATE),
896 DEFINEREG(DPB_AUX_CH_CTL),
897 DEFINEREG(DPB_AUX_CH_DATA1),
898 DEFINEREG(DPB_AUX_CH_DATA2),
899 DEFINEREG(DPB_AUX_CH_DATA3),
900 DEFINEREG(DPB_AUX_CH_DATA4),
901 DEFINEREG(DPB_AUX_CH_DATA5),
904 DEFINEREG(DPC_AUX_CH_CTL),
905 DEFINEREG(DPC_AUX_CH_DATA1),
906 DEFINEREG(DPC_AUX_CH_DATA2),
907 DEFINEREG(DPC_AUX_CH_DATA3),
908 DEFINEREG(DPC_AUX_CH_DATA4),
909 DEFINEREG(DPC_AUX_CH_DATA5),
912 DEFINEREG(DPD_AUX_CH_CTL),
913 DEFINEREG(DPD_AUX_CH_DATA1),
914 DEFINEREG(DPD_AUX_CH_DATA2),
915 DEFINEREG(DPD_AUX_CH_DATA3),
916 DEFINEREG(DPD_AUX_CH_DATA4),
917 DEFINEREG(DPD_AUX_CH_DATA5),
919 DEFINEREG(AUD_CONFIG),
920 DEFINEREG(AUD_HDMIW_STATUS),
921 DEFINEREG(AUD_CONV_CHCNT),
922 DEFINEREG(VIDEO_DIP_CTL),
923 DEFINEREG(AUD_PINW_CNTR),
924 DEFINEREG(AUD_CNTL_ST),
925 DEFINEREG(AUD_PIN_CAP),
926 DEFINEREG(AUD_PINW_CAP),
927 DEFINEREG(AUD_PINW_UNSOLRESP),
928 DEFINEREG(AUD_OUT_DIG_CNVT),
929 DEFINEREG(AUD_OUT_CWCAP),
930 DEFINEREG(AUD_GRP_CAP),
932 #define DEFINEFENCE_915(i) \
933 { FENCE+i*4, "FENCE " #i, i810_debug_915_fence, 0 }
934 #define DEFINEFENCE_945(i) \
935 { FENCE_NEW+(i - 8) * 4, "FENCE " #i, i810_debug_915_fence, 0 }
954 #define DEFINEFENCE_965(i) \
955 { FENCE_NEW+i*8, "FENCE START " #i, i810_debug_965_fence_start, 0 }, \
956 { FENCE_NEW+i*8+4, "FENCE END " #i, i810_debug_965_fence_end, 0 }
978 DEBUGSTRING(ironlake_debug_rr_hw_ctl)
980 snprintf(result, len, "low %d, high %d", val & RR_HW_LOW_POWER_FRAMES_MASK,
981 (val & RR_HW_HIGH_POWER_FRAMES_MASK) >> 8);
984 DEBUGSTRING(ironlake_debug_m_tu)
986 snprintf(result, len, "TU %d, val 0x%x %d", (val >> 25) + 1, val & 0xffffff,
990 DEBUGSTRING(ironlake_debug_n)
992 snprintf(result, len, "val 0x%x %d", val & 0xffffff, val & 0xffffff);
995 DEBUGSTRING(ironlake_debug_fdi_tx_ctl)
997 const char *train = NULL, *voltage = NULL, *pre_emphasis = NULL, *portw =
1000 switch (val & FDI_LINK_TRAIN_NONE) {
1001 case FDI_LINK_TRAIN_PATTERN_1:
1002 train = "pattern_1";
1004 case FDI_LINK_TRAIN_PATTERN_2:
1005 train = "pattern_2";
1007 case FDI_LINK_TRAIN_PATTERN_IDLE:
1008 train = "pattern_idle";
1010 case FDI_LINK_TRAIN_NONE:
1011 train = "not train";
1017 switch (val & (0x3f << 22)) {
1018 case FDI_LINK_TRAIN_400MV_0DB_SNB_B:
1020 pre_emphasis = "0dB";
1022 case FDI_LINK_TRAIN_400MV_6DB_SNB_B:
1024 pre_emphasis = "6dB";
1026 case FDI_LINK_TRAIN_600MV_3_5DB_SNB_B:
1028 pre_emphasis = "3.5dB";
1030 case FDI_LINK_TRAIN_800MV_0DB_SNB_B:
1032 pre_emphasis = "0dB";
1038 switch (val & (7 << 25)) {
1039 case FDI_LINK_TRAIN_VOLTAGE_0_4V:
1042 case FDI_LINK_TRAIN_VOLTAGE_0_6V:
1045 case FDI_LINK_TRAIN_VOLTAGE_0_8V:
1048 case FDI_LINK_TRAIN_VOLTAGE_1_2V:
1052 voltage = "reserved";
1055 switch (val & (7 << 22)) {
1056 case FDI_LINK_TRAIN_PRE_EMPHASIS_NONE:
1057 pre_emphasis = "none";
1059 case FDI_LINK_TRAIN_PRE_EMPHASIS_1_5X:
1060 pre_emphasis = "1.5x";
1062 case FDI_LINK_TRAIN_PRE_EMPHASIS_2X:
1063 pre_emphasis = "2x";
1065 case FDI_LINK_TRAIN_PRE_EMPHASIS_3X:
1066 pre_emphasis = "3x";
1069 pre_emphasis = "reserved";
1074 switch (val & (7 << 19)) {
1075 case FDI_DP_PORT_WIDTH_X1:
1078 case FDI_DP_PORT_WIDTH_X2:
1081 case FDI_DP_PORT_WIDTH_X3:
1084 case FDI_DP_PORT_WIDTH_X4:
1089 snprintf(result, len, "%s, train pattern %s, voltage swing %s,"
1090 "pre-emphasis %s, port width %s, enhanced framing %s, FDI PLL %s, scrambing %s, master mode %s",
1091 val & FDI_TX_ENABLE ? "enable" : "disable",
1092 train, voltage, pre_emphasis, portw,
1093 val & FDI_TX_ENHANCE_FRAME_ENABLE ? "enable" :
1095 val & FDI_TX_PLL_ENABLE ? "enable" : "disable",
1096 val & (1 << 7) ? "disable" : "enable",
1097 val & (1 << 0) ? "enable" : "disable");
1100 DEBUGSTRING(ironlake_debug_fdi_rx_ctl)
1102 const char *train = NULL, *portw = NULL, *bpc = NULL;
1105 switch (val & FDI_LINK_TRAIN_PATTERN_MASK_CPT) {
1106 case FDI_LINK_TRAIN_PATTERN_1_CPT:
1107 train = "pattern_1";
1109 case FDI_LINK_TRAIN_PATTERN_2_CPT:
1110 train = "pattern_2";
1112 case FDI_LINK_TRAIN_PATTERN_IDLE_CPT:
1113 train = "pattern_idle";
1115 case FDI_LINK_TRAIN_NORMAL_CPT:
1116 train = "not train";
1120 switch (val & FDI_LINK_TRAIN_NONE) {
1121 case FDI_LINK_TRAIN_PATTERN_1:
1122 train = "pattern_1";
1124 case FDI_LINK_TRAIN_PATTERN_2:
1125 train = "pattern_2";
1127 case FDI_LINK_TRAIN_PATTERN_IDLE:
1128 train = "pattern_idle";
1130 case FDI_LINK_TRAIN_NONE:
1131 train = "not train";
1136 switch (val & (7 << 19)) {
1137 case FDI_DP_PORT_WIDTH_X1:
1140 case FDI_DP_PORT_WIDTH_X2:
1143 case FDI_DP_PORT_WIDTH_X3:
1146 case FDI_DP_PORT_WIDTH_X4:
1151 switch (val & (7 << 16)) {
1166 snprintf(result, len, "%s, train pattern %s, port width %s, %s,"
1167 "link_reverse_strap_overwrite %s, dmi_link_reverse %s, FDI PLL %s,"
1168 "FS ecc %s, FE ecc %s, FS err report %s, FE err report %s,"
1169 "scrambing %s, enhanced framing %s, %s",
1170 val & FDI_RX_ENABLE ? "enable" : "disable",
1172 val & FDI_LINK_REVERSE_OVERWRITE ? "yes" : "no",
1173 val & FDI_DMI_LINK_REVERSE_MASK ? "yes" : "no",
1174 val & FDI_RX_PLL_ENABLE ? "enable" : "disable",
1175 val & FDI_FS_ERR_CORRECT_ENABLE ? "enable" : "disable",
1176 val & FDI_FE_ERR_CORRECT_ENABLE ? "enable" : "disable",
1177 val & FDI_FS_ERR_REPORT_ENABLE ? "enable" : "disable",
1178 val & FDI_FE_ERR_REPORT_ENABLE ? "enable" : "disable",
1179 val & (1 << 7) ? "disable" : "enable",
1180 val & FDI_RX_ENHANCE_FRAME_ENABLE ? "enable" :
1181 "disable", val & FDI_SEL_PCDCLK ? "PCDClk" : "RawClk");
1184 DEBUGSTRING(ironlake_debug_dspstride)
1186 snprintf(result, len, "%d", val >> 6);
1189 DEBUGSTRING(ironlake_debug_pch_dpll)
1191 const char *enable = val & DPLL_VCO_ENABLE ? "enable" : "disable";
1192 const char *highspeed = val & DPLL_DVO_HIGH_SPEED ? "yes" : "no";
1193 const char *mode = NULL;
1194 const char *p2 = NULL;
1195 int fpa0_p1, fpa1_p1;
1196 const char *refclk = NULL;
1199 if ((val & DPLLB_MODE_LVDS) == DPLLB_MODE_LVDS) {
1201 if (val & DPLLB_LVDS_P2_CLOCK_DIV_7)
1205 } else if ((val & DPLLB_MODE_LVDS) == DPLLB_MODE_DAC_SERIAL) {
1207 if (val & DPLL_DAC_SERIAL_P2_CLOCK_DIV_5)
1212 fpa0_p1 = ffs((val & DPLL_FPA01_P1_POST_DIV_MASK) >> 16);
1213 fpa1_p1 = ffs((val & DPLL_FPA1_P1_POST_DIV_MASK));
1215 switch (val & PLL_REF_INPUT_MASK) {
1216 case PLL_REF_INPUT_DREFCLK:
1217 refclk = "default 120Mhz";
1219 case PLL_REF_INPUT_SUPER_SSC:
1220 refclk = "SuperSSC 120Mhz";
1222 case PLL_REF_INPUT_TVCLKINBC:
1223 refclk = "SDVO TVClkIn";
1225 case PLLB_REF_INPUT_SPREADSPECTRUMIN:
1228 case PLL_REF_INPUT_DMICLK:
1229 refclk = "DMI RefCLK";
1233 sdvo_mul = ((val & PLL_REF_SDVO_HDMI_MULTIPLIER_MASK) >> 9) + 1;
1235 snprintf(result, len, "%s, sdvo high speed %s, mode %s, p2 %s, "
1236 "FPA0 P1 %d, FPA1 P1 %d, refclk %s, sdvo/hdmi mul %d",
1237 enable, highspeed, mode, p2, fpa0_p1, fpa1_p1, refclk,
1241 DEBUGSTRING(ironlake_debug_dref_ctl)
1243 const char *cpu_source;
1244 const char *ssc_source = val & DREF_SSC_SOURCE_ENABLE ? "enable" : "disable";
1245 const char *nonspread_source =
1246 val & DREF_NONSPREAD_SOURCE_ENABLE ? "enable" : "disable";
1247 const char *superspread_source =
1248 val & DREF_SUPERSPREAD_SOURCE_ENABLE ? "enable" : "disable";
1249 const char *ssc4_mode =
1250 val & DREF_SSC4_CENTERSPREAD ? "centerspread" : "downspread";
1251 const char *ssc1 = val & DREF_SSC1_ENABLE ? "enable" : "disable";
1252 const char *ssc4 = val & DREF_SSC4_ENABLE ? "enable" : "disable";
1254 switch (val & DREF_CPU_SOURCE_OUTPUT_NONSPREAD) {
1255 case DREF_CPU_SOURCE_OUTPUT_DISABLE:
1256 cpu_source = "disable";
1258 case DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD:
1259 cpu_source = "downspread";
1261 case DREF_CPU_SOURCE_OUTPUT_NONSPREAD:
1262 cpu_source = "nonspread";
1265 cpu_source = "reserved";
1267 snprintf(result, len, "cpu source %s, ssc_source %s, nonspread_source %s, "
1268 "superspread_source %s, ssc4_mode %s, ssc1 %s, ssc4 %s",
1269 cpu_source, ssc_source, nonspread_source,
1270 superspread_source, ssc4_mode, ssc1, ssc4);
1273 DEBUGSTRING(ironlake_debug_rawclk_freq)
1275 const char *tp1 = NULL, *tp2 = NULL;
1277 switch (val & FDL_TP1_TIMER_MASK) {
1291 switch (val & FDL_TP2_TIMER_MASK) {
1305 snprintf(result, len, "FDL_TP1 timer %s, FDL_TP2 timer %s, freq %d",
1306 tp1, tp2, val & RAWCLK_FREQ_MASK);
1310 DEBUGSTRING(ironlake_debug_fdi_rx_misc)
1312 snprintf(result, len, "FDI Delay %d", val & ((1 << 13) - 1));
1315 DEBUGSTRING(ironlake_debug_transconf)
1317 const char *enable = val & TRANS_ENABLE ? "enable" : "disable";
1318 const char *state = val & TRANS_STATE_ENABLE ? "active" : "inactive";
1319 const char *interlace;
1321 switch ((val >> 21) & 7) {
1323 interlace = "progressive";
1327 interlace = "interlaced sdvo";
1332 interlace = "interlaced";
1338 snprintf(result, len, "%s, %s, %s", enable, state, interlace);
1341 DEBUGSTRING(ironlake_debug_panel_fitting)
1343 const char *vadapt = NULL, *filter_sel = NULL;
1345 switch (val & (3 << 25)) {
1350 vadapt = "moderate";
1353 vadapt = "reserved";
1360 switch (val & (3 << 23)) {
1362 filter_sel = "programmed";
1365 filter_sel = "hardcoded";
1368 filter_sel = "edge_enhance";
1371 filter_sel = "edge_soften";
1375 snprintf(result, len,
1376 "%s, auto_scale %s, auto_scale_cal %s, v_filter %s, vadapt %s, mode %s, filter_sel %s,"
1377 "chroma pre-filter %s, vert3tap %s, v_inter_invert %s",
1378 val & PF_ENABLE ? "enable" : "disable",
1379 val & (1 << 30) ? "no" : "yes",
1380 val & (1 << 29) ? "yes" : "no",
1381 val & (1 << 28) ? "bypass" : "enable",
1382 val & (1 << 27) ? "enable" : "disable",
1385 val & (1 << 22) ? "enable" : "disable",
1386 val & (1 << 21) ? "force" : "auto",
1387 val & (1 << 20) ? "field 0" : "field 1");
1390 DEBUGSTRING(ironlake_debug_panel_fitting_2)
1392 snprintf(result, len,
1394 val / (float) (1<<15));
1397 DEBUGSTRING(ironlake_debug_panel_fitting_3)
1399 snprintf(result, len,
1400 "vscale initial phase %f",
1401 val / (float) (1<<15));
1404 DEBUGSTRING(ironlake_debug_panel_fitting_4)
1406 snprintf(result, len,
1408 val / (float) (1<<15));
1411 DEBUGSTRING(ironlake_debug_pf_win)
1415 a = (val >> 16) & 0x1fff;
1418 snprintf(result, len, "%d, %d", a, b);
1421 DEBUGSTRING(ironlake_debug_hdmi)
1424 const char *enable, *bpc = NULL, *encoding;
1425 const char *mode, *audio, *vsync, *hsync, *detect;
1427 if (val & PORT_ENABLE)
1430 enable = "disabled";
1433 disp_pipe = (val & (3<<29)) >> 29;
1435 disp_pipe = (val & TRANSCODER_B) >> 29;
1437 switch (val & (7 << 26)) {
1438 case COLOR_FORMAT_8bpc:
1441 case COLOR_FORMAT_12bpc:
1446 if ((val & (3 << 10)) == TMDS_ENCODING)
1456 if (val & AUDIO_ENABLE)
1461 if (val & VSYNC_ACTIVE_HIGH)
1466 if (val & HSYNC_ACTIVE_HIGH)
1471 if (val & PORT_DETECTED)
1472 detect = "detected";
1474 detect = "non-detected";
1476 snprintf(result, len, "%s pipe %c %s %s %s audio %s %s %s %s",
1477 enable, disp_pipe + 'A', bpc, encoding, mode, audio, vsync, hsync, detect);
1480 DEBUGSTRING(snb_debug_dpll_sel)
1482 const char *transa, *transb;
1483 const char *dplla = NULL, *dpllb = NULL;
1488 if (val & TRANSA_DPLL_ENABLE) {
1490 if (val & TRANSA_DPLLB_SEL)
1497 if (val & TRANSB_DPLL_ENABLE) {
1499 if (val & TRANSB_DPLLB_SEL)
1506 snprintf(result, len, "TransA DPLL %s (DPLL %s), TransB DPLL %s (DPLL %s)",
1507 transa, dplla, transb, dpllb);
1510 DEBUGSTRING(snb_debug_trans_dp_ctl)
1512 const char *enable, *port = NULL, *bpc = NULL, *vsync, *hsync;
1517 if (val & TRANS_DP_OUTPUT_ENABLE)
1522 switch (val & TRANS_DP_PORT_SEL_MASK) {
1523 case TRANS_DP_PORT_SEL_B:
1526 case TRANS_DP_PORT_SEL_C:
1529 case TRANS_DP_PORT_SEL_D:
1537 switch (val & (7<<9)) {
1541 case TRANS_DP_10BPC:
1547 case TRANS_DP_12BPC:
1552 if (val & TRANS_DP_VSYNC_ACTIVE_HIGH)
1557 if (val & TRANS_DP_HSYNC_ACTIVE_HIGH)
1562 snprintf(result, len, "%s port %s %s %s %s",
1563 enable, port, bpc, vsync, hsync);
1566 DEBUGSTRING(ilk_debug_pp_control)
1568 snprintf(result, len, "blacklight %s, %spower down on reset, panel %s",
1569 (val & (1 << 2)) ? "enabled" : "disabled",
1570 (val & (1 << 1)) ? "" : "do not ",
1571 (val & (1 << 0)) ? "on" : "off");
1574 static struct reg_debug ironlake_debug_regs[] = {
1575 DEFINEREG(PGETBL_CTL),
1576 DEFINEREG(GEN6_INSTDONE_1),
1577 DEFINEREG(GEN6_INSTDONE_2),
1578 DEFINEREG2(CPU_VGACNTRL, i830_debug_vgacntrl),
1579 DEFINEREG(DIGITAL_PORT_HOTPLUG_CNTRL),
1581 DEFINEREG2(RR_HW_CTL, ironlake_debug_rr_hw_ctl),
1583 DEFINEREG(FDI_PLL_BIOS_0),
1584 DEFINEREG(FDI_PLL_BIOS_1),
1585 DEFINEREG(FDI_PLL_BIOS_2),
1587 DEFINEREG(DISPLAY_PORT_PLL_BIOS_0),
1588 DEFINEREG(DISPLAY_PORT_PLL_BIOS_1),
1589 DEFINEREG(DISPLAY_PORT_PLL_BIOS_2),
1591 DEFINEREG(FDI_PLL_FREQ_CTL),
1595 DEFINEREG2(PIPEACONF, i830_debug_pipeconf),
1597 DEFINEREG2(HTOTAL_A, i830_debug_hvtotal),
1598 DEFINEREG2(HBLANK_A, i830_debug_hvsyncblank),
1599 DEFINEREG2(HSYNC_A, i830_debug_hvsyncblank),
1600 DEFINEREG2(VTOTAL_A, i830_debug_hvtotal),
1601 DEFINEREG2(VBLANK_A, i830_debug_hvsyncblank),
1602 DEFINEREG2(VSYNC_A, i830_debug_hvsyncblank),
1603 DEFINEREG(VSYNCSHIFT_A),
1604 DEFINEREG2(PIPEASRC, i830_debug_yxminus1),
1606 DEFINEREG2(PIPEA_DATA_M1, ironlake_debug_m_tu),
1607 DEFINEREG2(PIPEA_DATA_N1, ironlake_debug_n),
1608 DEFINEREG2(PIPEA_DATA_M2, ironlake_debug_m_tu),
1609 DEFINEREG2(PIPEA_DATA_N2, ironlake_debug_n),
1611 DEFINEREG2(PIPEA_LINK_M1, ironlake_debug_n),
1612 DEFINEREG2(PIPEA_LINK_N1, ironlake_debug_n),
1613 DEFINEREG2(PIPEA_LINK_M2, ironlake_debug_n),
1614 DEFINEREG2(PIPEA_LINK_N2, ironlake_debug_n),
1616 DEFINEREG2(DSPACNTR, i830_debug_dspcntr),
1617 DEFINEREG(DSPABASE),
1618 DEFINEREG2(DSPASTRIDE, ironlake_debug_dspstride),
1619 DEFINEREG(DSPASURF),
1620 DEFINEREG2(DSPATILEOFF, i830_debug_xy),
1624 DEFINEREG2(PIPEBCONF, i830_debug_pipeconf),
1626 DEFINEREG2(HTOTAL_B, i830_debug_hvtotal),
1627 DEFINEREG2(HBLANK_B, i830_debug_hvsyncblank),
1628 DEFINEREG2(HSYNC_B, i830_debug_hvsyncblank),
1629 DEFINEREG2(VTOTAL_B, i830_debug_hvtotal),
1630 DEFINEREG2(VBLANK_B, i830_debug_hvsyncblank),
1631 DEFINEREG2(VSYNC_B, i830_debug_hvsyncblank),
1632 DEFINEREG(VSYNCSHIFT_B),
1633 DEFINEREG2(PIPEBSRC, i830_debug_yxminus1),
1635 DEFINEREG2(PIPEB_DATA_M1, ironlake_debug_m_tu),
1636 DEFINEREG2(PIPEB_DATA_N1, ironlake_debug_n),
1637 DEFINEREG2(PIPEB_DATA_M2, ironlake_debug_m_tu),
1638 DEFINEREG2(PIPEB_DATA_N2, ironlake_debug_n),
1640 DEFINEREG2(PIPEB_LINK_M1, ironlake_debug_n),
1641 DEFINEREG2(PIPEB_LINK_N1, ironlake_debug_n),
1642 DEFINEREG2(PIPEB_LINK_M2, ironlake_debug_n),
1643 DEFINEREG2(PIPEB_LINK_N2, ironlake_debug_n),
1645 DEFINEREG2(DSPBCNTR, i830_debug_dspcntr),
1646 DEFINEREG(DSPBBASE),
1647 DEFINEREG2(DSPBSTRIDE, ironlake_debug_dspstride),
1648 DEFINEREG(DSPBSURF),
1649 DEFINEREG2(DSPBTILEOFF, i830_debug_xy),
1653 DEFINEREG2(PIPECCONF, i830_debug_pipeconf),
1655 DEFINEREG2(HTOTAL_C, i830_debug_hvtotal),
1656 DEFINEREG2(HBLANK_C, i830_debug_hvsyncblank),
1657 DEFINEREG2(HSYNC_C, i830_debug_hvsyncblank),
1658 DEFINEREG2(VTOTAL_C, i830_debug_hvtotal),
1659 DEFINEREG2(VBLANK_C, i830_debug_hvsyncblank),
1660 DEFINEREG2(VSYNC_C, i830_debug_hvsyncblank),
1661 DEFINEREG(VSYNCSHIFT_C),
1662 DEFINEREG2(PIPECSRC, i830_debug_yxminus1),
1664 DEFINEREG2(PIPEC_DATA_M1, ironlake_debug_m_tu),
1665 DEFINEREG2(PIPEC_DATA_N1, ironlake_debug_n),
1666 DEFINEREG2(PIPEC_DATA_M2, ironlake_debug_m_tu),
1667 DEFINEREG2(PIPEC_DATA_N2, ironlake_debug_n),
1669 DEFINEREG2(PIPEC_LINK_M1, ironlake_debug_n),
1670 DEFINEREG2(PIPEC_LINK_N1, ironlake_debug_n),
1671 DEFINEREG2(PIPEC_LINK_M2, ironlake_debug_n),
1672 DEFINEREG2(PIPEC_LINK_N2, ironlake_debug_n),
1674 DEFINEREG2(DSPCCNTR, i830_debug_dspcntr),
1675 DEFINEREG(DSPCBASE),
1676 DEFINEREG2(DSPCSTRIDE, ironlake_debug_dspstride),
1677 DEFINEREG(DSPCSURF),
1678 DEFINEREG2(DSPCTILEOFF, i830_debug_xy),
1682 DEFINEREG2(PFA_CTL_1, ironlake_debug_panel_fitting),
1683 DEFINEREG2(PFA_CTL_2, ironlake_debug_panel_fitting_2),
1684 DEFINEREG2(PFA_CTL_3, ironlake_debug_panel_fitting_3),
1685 DEFINEREG2(PFA_CTL_4, ironlake_debug_panel_fitting_4),
1686 DEFINEREG2(PFA_WIN_POS, ironlake_debug_pf_win),
1687 DEFINEREG2(PFA_WIN_SIZE, ironlake_debug_pf_win),
1688 DEFINEREG2(PFB_CTL_1, ironlake_debug_panel_fitting),
1689 DEFINEREG2(PFB_CTL_2, ironlake_debug_panel_fitting_2),
1690 DEFINEREG2(PFB_CTL_3, ironlake_debug_panel_fitting_3),
1691 DEFINEREG2(PFB_CTL_4, ironlake_debug_panel_fitting_4),
1692 DEFINEREG2(PFB_WIN_POS, ironlake_debug_pf_win),
1693 DEFINEREG2(PFB_WIN_SIZE, ironlake_debug_pf_win),
1694 DEFINEREG2(PFC_CTL_1, ironlake_debug_panel_fitting),
1695 DEFINEREG2(PFC_CTL_2, ironlake_debug_panel_fitting_2),
1696 DEFINEREG2(PFC_CTL_3, ironlake_debug_panel_fitting_3),
1697 DEFINEREG2(PFC_CTL_4, ironlake_debug_panel_fitting_4),
1698 DEFINEREG2(PFC_WIN_POS, ironlake_debug_pf_win),
1699 DEFINEREG2(PFC_WIN_SIZE, ironlake_debug_pf_win),
1703 DEFINEREG2(PCH_DREF_CONTROL, ironlake_debug_dref_ctl),
1704 DEFINEREG2(PCH_RAWCLK_FREQ, ironlake_debug_rawclk_freq),
1705 DEFINEREG(PCH_DPLL_TMR_CFG),
1706 DEFINEREG(PCH_SSC4_PARMS),
1707 DEFINEREG(PCH_SSC4_AUX_PARMS),
1708 DEFINEREG2(PCH_DPLL_SEL, snb_debug_dpll_sel),
1709 DEFINEREG(PCH_DPLL_ANALOG_CTL),
1711 DEFINEREG2(PCH_DPLL_A, ironlake_debug_pch_dpll),
1712 DEFINEREG2(PCH_DPLL_B, ironlake_debug_pch_dpll),
1713 DEFINEREG2(PCH_FPA0, i830_debug_fp),
1714 DEFINEREG2(PCH_FPA1, i830_debug_fp),
1715 DEFINEREG2(PCH_FPB0, i830_debug_fp),
1716 DEFINEREG2(PCH_FPB1, i830_debug_fp),
1718 DEFINEREG2(TRANS_HTOTAL_A, i830_debug_hvtotal),
1719 DEFINEREG2(TRANS_HBLANK_A, i830_debug_hvsyncblank),
1720 DEFINEREG2(TRANS_HSYNC_A, i830_debug_hvsyncblank),
1721 DEFINEREG2(TRANS_VTOTAL_A, i830_debug_hvtotal),
1722 DEFINEREG2(TRANS_VBLANK_A, i830_debug_hvsyncblank),
1723 DEFINEREG2(TRANS_VSYNC_A, i830_debug_hvsyncblank),
1724 DEFINEREG(TRANS_VSYNCSHIFT_A),
1726 DEFINEREG2(TRANSA_DATA_M1, ironlake_debug_m_tu),
1727 DEFINEREG2(TRANSA_DATA_N1, ironlake_debug_n),
1728 DEFINEREG2(TRANSA_DATA_M2, ironlake_debug_m_tu),
1729 DEFINEREG2(TRANSA_DATA_N2, ironlake_debug_n),
1730 DEFINEREG2(TRANSA_DP_LINK_M1, ironlake_debug_n),
1731 DEFINEREG2(TRANSA_DP_LINK_N1, ironlake_debug_n),
1732 DEFINEREG2(TRANSA_DP_LINK_M2, ironlake_debug_n),
1733 DEFINEREG2(TRANSA_DP_LINK_N2, ironlake_debug_n),
1735 DEFINEREG2(TRANS_HTOTAL_B, i830_debug_hvtotal),
1736 DEFINEREG2(TRANS_HBLANK_B, i830_debug_hvsyncblank),
1737 DEFINEREG2(TRANS_HSYNC_B, i830_debug_hvsyncblank),
1738 DEFINEREG2(TRANS_VTOTAL_B, i830_debug_hvtotal),
1739 DEFINEREG2(TRANS_VBLANK_B, i830_debug_hvsyncblank),
1740 DEFINEREG2(TRANS_VSYNC_B, i830_debug_hvsyncblank),
1741 DEFINEREG(TRANS_VSYNCSHIFT_B),
1743 DEFINEREG2(TRANSB_DATA_M1, ironlake_debug_m_tu),
1744 DEFINEREG2(TRANSB_DATA_N1, ironlake_debug_n),
1745 DEFINEREG2(TRANSB_DATA_M2, ironlake_debug_m_tu),
1746 DEFINEREG2(TRANSB_DATA_N2, ironlake_debug_n),
1747 DEFINEREG2(TRANSB_DP_LINK_M1, ironlake_debug_n),
1748 DEFINEREG2(TRANSB_DP_LINK_N1, ironlake_debug_n),
1749 DEFINEREG2(TRANSB_DP_LINK_M2, ironlake_debug_n),
1750 DEFINEREG2(TRANSB_DP_LINK_N2, ironlake_debug_n),
1752 DEFINEREG2(TRANS_HTOTAL_C, i830_debug_hvtotal),
1753 DEFINEREG2(TRANS_HBLANK_C, i830_debug_hvsyncblank),
1754 DEFINEREG2(TRANS_HSYNC_C, i830_debug_hvsyncblank),
1755 DEFINEREG2(TRANS_VTOTAL_C, i830_debug_hvtotal),
1756 DEFINEREG2(TRANS_VBLANK_C, i830_debug_hvsyncblank),
1757 DEFINEREG2(TRANS_VSYNC_C, i830_debug_hvsyncblank),
1758 DEFINEREG(TRANS_VSYNCSHIFT_C),
1760 DEFINEREG2(TRANSC_DATA_M1, ironlake_debug_m_tu),
1761 DEFINEREG2(TRANSC_DATA_N1, ironlake_debug_n),
1762 DEFINEREG2(TRANSC_DATA_M2, ironlake_debug_m_tu),
1763 DEFINEREG2(TRANSC_DATA_N2, ironlake_debug_n),
1764 DEFINEREG2(TRANSC_DP_LINK_M1, ironlake_debug_n),
1765 DEFINEREG2(TRANSC_DP_LINK_N1, ironlake_debug_n),
1766 DEFINEREG2(TRANSC_DP_LINK_M2, ironlake_debug_n),
1767 DEFINEREG2(TRANSC_DP_LINK_N2, ironlake_debug_n),
1769 DEFINEREG2(TRANSACONF, ironlake_debug_transconf),
1770 DEFINEREG2(TRANSBCONF, ironlake_debug_transconf),
1771 DEFINEREG2(TRANSCCONF, ironlake_debug_transconf),
1773 DEFINEREG2(FDI_TXA_CTL, ironlake_debug_fdi_tx_ctl),
1774 DEFINEREG2(FDI_TXB_CTL, ironlake_debug_fdi_tx_ctl),
1775 DEFINEREG2(FDI_TXC_CTL, ironlake_debug_fdi_tx_ctl),
1776 DEFINEREG2(FDI_RXA_CTL, ironlake_debug_fdi_rx_ctl),
1777 DEFINEREG2(FDI_RXB_CTL, ironlake_debug_fdi_rx_ctl),
1778 DEFINEREG2(FDI_RXC_CTL, ironlake_debug_fdi_rx_ctl),
1780 DEFINEREG2(FDI_RXA_MISC, ironlake_debug_fdi_rx_misc),
1781 DEFINEREG2(FDI_RXB_MISC, ironlake_debug_fdi_rx_misc),
1782 DEFINEREG2(FDI_RXC_MISC, ironlake_debug_fdi_rx_misc),
1783 DEFINEREG(FDI_RXA_TUSIZE1),
1784 DEFINEREG(FDI_RXA_TUSIZE2),
1785 DEFINEREG(FDI_RXB_TUSIZE1),
1786 DEFINEREG(FDI_RXB_TUSIZE2),
1787 DEFINEREG(FDI_RXC_TUSIZE1),
1788 DEFINEREG(FDI_RXC_TUSIZE2),
1790 DEFINEREG(FDI_PLL_CTL_1),
1791 DEFINEREG(FDI_PLL_CTL_2),
1793 DEFINEREG(FDI_RXA_IIR),
1794 DEFINEREG(FDI_RXA_IMR),
1795 DEFINEREG(FDI_RXB_IIR),
1796 DEFINEREG(FDI_RXB_IMR),
1798 DEFINEREG2(PCH_ADPA, i830_debug_adpa),
1799 DEFINEREG2(HDMIB, ironlake_debug_hdmi),
1800 DEFINEREG2(HDMIC, ironlake_debug_hdmi),
1801 DEFINEREG2(HDMID, ironlake_debug_hdmi),
1802 DEFINEREG2(PCH_LVDS, i830_debug_lvds),
1803 DEFINEREG(CPU_eDP_A),
1804 DEFINEREG(PCH_DP_B),
1805 DEFINEREG(PCH_DP_C),
1806 DEFINEREG(PCH_DP_D),
1807 DEFINEREG2(TRANS_DP_CTL_A, snb_debug_trans_dp_ctl),
1808 DEFINEREG2(TRANS_DP_CTL_B, snb_debug_trans_dp_ctl),
1809 DEFINEREG2(TRANS_DP_CTL_C, snb_debug_trans_dp_ctl),
1811 DEFINEREG(BLC_PWM_CPU_CTL2),
1812 DEFINEREG(BLC_PWM_CPU_CTL),
1813 DEFINEREG(BLC_PWM_PCH_CTL1),
1814 DEFINEREG(BLC_PWM_PCH_CTL2),
1816 DEFINEREG2(PCH_PP_STATUS, i830_debug_pp_status),
1817 DEFINEREG2(PCH_PP_CONTROL, ilk_debug_pp_control),
1818 DEFINEREG(PCH_PP_ON_DELAYS),
1819 DEFINEREG(PCH_PP_OFF_DELAYS),
1820 DEFINEREG(PCH_PP_DIVISOR),
1822 DEFINEREG2(PORT_DBG, ivb_debug_port),
1824 DEFINEREG(RC6_RESIDENCY_TIME),
1825 DEFINEREG(RC6p_RESIDENCY_TIME),
1826 DEFINEREG(RC6pp_RESIDENCY_TIME),
1829 static struct reg_debug haswell_debug_regs[] = {
1831 DEFINEREG(HSW_PWR_WELL_CTL1),
1832 DEFINEREG(HSW_PWR_WELL_CTL2),
1833 DEFINEREG(HSW_PWR_WELL_CTL3),
1834 DEFINEREG(HSW_PWR_WELL_CTL4),
1835 DEFINEREG(HSW_PWR_WELL_CTL5),
1836 DEFINEREG(HSW_PWR_WELL_CTL6),
1838 /* DDI pipe function */
1839 DEFINEREG(PIPE_DDI_FUNC_CTL_A),
1840 DEFINEREG(PIPE_DDI_FUNC_CTL_B),
1841 DEFINEREG(PIPE_DDI_FUNC_CTL_C),
1842 DEFINEREG(PIPE_DDI_FUNC_CTL_EDP),
1844 /* DP transport control */
1845 DEFINEREG(DP_TP_CTL_A),
1846 DEFINEREG(DP_TP_CTL_B),
1847 DEFINEREG(DP_TP_CTL_C),
1848 DEFINEREG(DP_TP_CTL_D),
1849 DEFINEREG(DP_TP_CTL_E),
1852 DEFINEREG(DP_TP_STATUS_A),
1853 DEFINEREG(DP_TP_STATUS_B),
1854 DEFINEREG(DP_TP_STATUS_C),
1855 DEFINEREG(DP_TP_STATUS_D),
1856 DEFINEREG(DP_TP_STATUS_E),
1858 /* DDI buffer control */
1859 DEFINEREG(DDI_BUF_CTL_A),
1860 DEFINEREG(DDI_BUF_CTL_B),
1861 DEFINEREG(DDI_BUF_CTL_C),
1862 DEFINEREG(DDI_BUF_CTL_D),
1863 DEFINEREG(DDI_BUF_CTL_E),
1866 DEFINEREG(PIXCLK_GATE),
1867 DEFINEREG(SPLL_CTL),
1868 DEFINEREG(LCPLL_CTL),
1869 DEFINEREG(WRPLL_CTL1),
1870 DEFINEREG(WRPLL_CTL2),
1872 /* DDI port clock control */
1873 DEFINEREG(PORT_CLK_SEL_A),
1874 DEFINEREG(PORT_CLK_SEL_B),
1875 DEFINEREG(PORT_CLK_SEL_C),
1876 DEFINEREG(PORT_CLK_SEL_D),
1877 DEFINEREG(PORT_CLK_SEL_E),
1879 /* Pipe clock control */
1880 DEFINEREG(PIPE_CLK_SEL_A),
1881 DEFINEREG(PIPE_CLK_SEL_B),
1882 DEFINEREG(PIPE_CLK_SEL_C),
1884 /* Pipe line time */
1885 DEFINEREG(PIPE_WM_LINETIME_A),
1886 DEFINEREG(PIPE_WM_LINETIME_B),
1887 DEFINEREG(PIPE_WM_LINETIME_C),
1890 DEFINEREG(SFUSE_STRAP),
1894 static struct reg_debug i945gm_mi_regs[] = {
1895 DEFINEREG(PGETBL_CTL),
1896 DEFINEREG(PGTBL_ER),
1901 DEFINEREG(INST_DONE),
1917 _intel_dump_reg(struct reg_debug *reg, uint32_t val)
1921 if (reg->debug_output != NULL) {
1922 reg->debug_output(debug, sizeof(debug), reg->reg, val);
1923 printf("%30.30s: 0x%08x (%s)\n",
1924 reg->name, val, debug);
1926 printf("%30.30s: 0x%08x\n", reg->name, val);
1930 #define intel_dump_regs(regs) _intel_dump_regs(regs, ARRAY_SIZE(regs))
1933 _intel_dump_regs(struct reg_debug *regs, int count)
1937 for (i = 0; i < count; i++) {
1938 uint32_t val = INREG(regs[i].reg);
1940 _intel_dump_reg(®s[i], val);
1944 DEBUGSTRING(gen6_rp_control)
1946 snprintf(result, len, "%s",
1947 (val & (1 << 7)) ? "enabled" : "disabled");
1950 static struct reg_debug gen6_rp_debug_regs[] = {
1951 DEFINEREG2(GEN6_RP_CONTROL, gen6_rp_control),
1952 DEFINEREG(GEN6_RPNSWREQ),
1953 DEFINEREG(GEN6_RP_DOWN_TIMEOUT),
1954 DEFINEREG(GEN6_RP_INTERRUPT_LIMITS),
1955 DEFINEREG(GEN6_RP_UP_THRESHOLD),
1956 DEFINEREG(GEN6_RP_UP_EI),
1957 DEFINEREG(GEN6_RP_DOWN_EI),
1958 DEFINEREG(GEN6_RP_IDLE_HYSTERSIS),
1959 DEFINEREG(GEN6_RC_STATE),
1960 DEFINEREG(GEN6_RC_CONTROL),
1961 DEFINEREG(GEN6_RC1_WAKE_RATE_LIMIT),
1962 DEFINEREG(GEN6_RC6_WAKE_RATE_LIMIT),
1963 DEFINEREG(GEN6_RC_EVALUATION_INTERVAL),
1964 DEFINEREG(GEN6_RC_IDLE_HYSTERSIS),
1965 DEFINEREG(GEN6_RC_SLEEP),
1966 DEFINEREG(GEN6_RC1e_THRESHOLD),
1967 DEFINEREG(GEN6_RC6_THRESHOLD),
1968 DEFINEREG(GEN6_RC_VIDEO_FREQ),
1969 DEFINEREG(GEN6_PMIER),
1970 DEFINEREG(GEN6_PMIMR),
1971 DEFINEREG(GEN6_PMINTRMSK),
1974 #define DECLARE_REGS(d,r) \
1975 { .description = d, .regs = r, .count = ARRAY_SIZE(r) }
1977 const char *description;
1978 struct reg_debug *regs;
1980 } known_registers[] = {
1981 DECLARE_REGS("Gen5", ironlake_debug_regs),
1982 DECLARE_REGS("i945GM", i945gm_mi_regs),
1983 DECLARE_REGS("Gen2", intel_debug_regs),
1984 DECLARE_REGS("Gen6", gen6_rp_debug_regs),
1985 DECLARE_REGS("Gen7.5", haswell_debug_regs)
1990 dump_reg(struct reg_debug *reg, uint32_t val, const char *prefix)
1994 if (reg->debug_output != NULL) {
1995 reg->debug_output(debug, sizeof(debug), reg->reg, val);
1996 printf("%s: %s (0x%x): 0x%08x (%s)\n",
1997 prefix, reg->name, reg->reg, val, debug);
1999 printf("%s: %s (0x%x): 0x%08x\n",
2000 prefix, reg->name, reg->reg, val);
2005 str_to_upper(char *str)
2008 *str = toupper(*str);
2014 decode_register_name(char *name, uint32_t val)
2020 for (i = 0; i < ARRAY_SIZE(known_registers); i++) {
2021 struct reg_debug *regs = known_registers[i].regs;
2023 for (j = 0; j < known_registers[i].count; j++)
2024 if (strstr(regs[j].name, name))
2025 dump_reg(®s[j], val,
2026 known_registers[i].description);
2031 decode_register_address(int address, uint32_t val)
2035 for (i = 0; i < ARRAY_SIZE(known_registers); i++) {
2036 struct reg_debug *regs = known_registers[i].regs;
2038 for (j = 0; j < known_registers[i].count; j++)
2039 if (regs[j].reg == address)
2040 dump_reg(®s[j], val,
2041 known_registers[i].description);
2046 decode_register(char *name, uint32_t val)
2051 address = strtoul(name, &end, 0);
2053 /* found a register address */
2054 if (address && *end == '\0')
2055 decode_register_address(address, val);
2057 decode_register_name(name, val);
2061 intel_dump_other_regs(void)
2066 int n, m1, m2, m, p1, p2;
2076 i830DumpIndexed(pScrn, "SR", 0x3c4, 0x3c5, 0, 7);
2077 msr = INREG8(0x3cc);
2078 printf("%20.20s: 0x%02x\n",
2079 "MSR", (unsigned int)msr);
2086 i830DumpIndexed(pScrn, "CR", crt + 4, crt + 5, 0, 0x24);
2088 for (disp_pipe = 0; disp_pipe <= 1; disp_pipe++) {
2089 fp = INREG(disp_pipe == 0 ? FPA0 : FPB0);
2090 dpll = INREG(disp_pipe == 0 ? DPLL_A : DPLL_B);
2091 if (IS_GEN2(devid)) {
2092 uint32_t lvds = INREG(LVDS);
2093 if (devid == PCI_CHIP_I855_GM &&
2094 (lvds & LVDS_PORT_EN) &&
2095 (lvds & LVDS_PIPEB_SELECT) == (disp_pipe << 30)) {
2096 if ((lvds & LVDS_CLKB_POWER_MASK) ==
2101 switch ((dpll >> 16) & 0x3f) {
2122 printf("LVDS P1 0x%x invalid encoding\n",
2123 (dpll >> 16) & 0x3f);
2127 if (dpll & (1 << 23))
2131 if (dpll & PLL_P1_DIVIDE_BY_TWO)
2134 p1 = ((dpll >> 16) & 0x3f) + 2;
2137 switch ((dpll >> 13) & 0x3) {
2146 printf("ref out of range\n");
2150 uint32_t lvds = INREG(LVDS);
2151 if ((lvds & LVDS_PORT_EN) &&
2152 (lvds & LVDS_PIPEB_SELECT) == (disp_pipe << 30)) {
2153 if ((lvds & LVDS_CLKB_POWER_MASK) ==
2159 switch ((dpll >> 24) & 0x3) {
2168 printf("p2 out of range\n");
2173 i = (dpll >> DPLL_FPA01_P1_POST_DIV_SHIFT_IGD) &
2176 i = (dpll >> DPLL_FPA01_P1_POST_DIV_SHIFT) &
2204 if (IS_IGD(devid)) {
2210 printf("p1 out of range\n");
2214 switch ((dpll >> 13) & 0x3) {
2223 printf("ref out of range\n");
2227 if (IS_965(devid)) {
2228 phase = (dpll >> 9) & 0xf;
2233 printf("SDVO phase shift %d out of range -- probobly not "
2234 "an issue.\n", phase);
2238 switch ((dpll >> 8) & 1) {
2242 printf("fp select out of range\n");
2245 m1 = ((fp >> 8) & 0x3f);
2246 if (IS_IGD(devid)) {
2247 n = ffs((fp & FP_N_IGD_DIV_MASK) >> FP_N_DIV_SHIFT) - 1;
2248 m2 = (fp & FP_M2_IGD_DIV_MASK) >> FP_M2_DIV_SHIFT;
2250 dot = (ref * m) / n / (p1 * p2);
2252 n = ((fp >> 16) & 0x3f);
2253 m2 = ((fp >> 0) & 0x3f);
2254 //m = 5 * (m1 + 2) + (m2 + 2);
2256 (ref * (5 * (m1 + 2) + (m2 + 2)) / (n + 2)) / (p1 *
2260 printf("pipe %s dot %d n %d m1 %d m2 %d p1 %d p2 %d\n",
2261 disp_pipe == 0 ? "A" : "B", dot, n, m1, m2, p1, p2);
2265 static void print_usage(void)
2267 printf("Usage: intel_reg_dumper [options] [file]\n"
2268 " intel_reg_dumper [options] register value\n"
2270 " -d id when a dump file is used, use 'id' as device id (in "
2272 " -h prints this help\n");
2275 int main(int argc, char** argv)
2277 struct pci_device *pci_dev;
2279 char *file = NULL, *reg_name = NULL;
2282 while ((opt = getopt(argc, argv, "d:h")) != -1) {
2285 devid = strtol(optarg, NULL, 16);
2296 n_args = argc - optind;
2298 file = argv[optind];
2299 } else if (n_args == 2) {
2300 reg_name = argv[optind];
2301 reg_val = strtoul(argv[optind + 1], NULL, 0);
2302 } else if (n_args) {
2307 /* the tool operates in "single" mode, decode a single register given
2308 * on the command line: intel_reg_dumper PCH_PP_CONTROL 0xabcd0002 */
2310 decode_register(reg_name, reg_val);
2315 intel_map_file(file);
2322 printf("Dumping from file without -d argument. "
2323 "Assuming Ironlake machine.\n");
2328 pci_dev = intel_get_pci_device();
2329 devid = pci_dev->device_id;
2331 intel_register_access_init(pci_dev, 1);
2333 if (HAS_PCH_SPLIT(devid))
2337 if (HAS_PCH_SPLIT(devid)) {
2338 intel_dump_regs(ironlake_debug_regs);
2339 } else if (IS_945GM(devid)) {
2340 intel_dump_regs(i945gm_mi_regs);
2341 intel_dump_regs(intel_debug_regs);
2342 intel_dump_other_regs();
2344 intel_dump_regs(intel_debug_regs);
2345 intel_dump_other_regs();
2348 if (IS_GEN6(devid) || IS_GEN7(devid))
2349 intel_dump_regs(gen6_rp_debug_regs);
2351 if (IS_HASWELL(devid))
2352 intel_dump_regs(haswell_debug_regs);
2355 intel_register_access_fini();