| From c93c0760b4b29502316c5e76138699cdb6e5644e Mon Sep 17 00:00:00 2001 |
| From: Daniel Vetter <daniel.vetter@ffwll.ch> |
| Date: Tue, 28 May 2013 12:05:54 +0200 |
| Subject: drm/i915: add basic pipe config dump support |
| |
| All this pipe config abstraction adds another layer of complexity, so |
| it's good to have better visibility into what's going on exactly. |
| Doesn't dump out everything yet, and some bits are a bit duplicated |
| but this should be a good start. |
| |
| Note that at boot-up a lot of the fields are 0 even for enabled pipes, |
| this is simply because our hw state readout code doesn't support |
| everything. |
| |
| v2: Remove a few more now redudant debug output lines. |
| |
| v3: Review from Paulo |
| - use transcoder_name |
| - fix up format specifiers |
| - add missing ':' in debug output |
| |
| Cc: Paulo Zanoni <przanoni@gmail.com> |
| Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit c0b0341121f2e2b329e60986aee766e4d1d80fde) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/intel_display.c | 74 ++++++++++++++++++++--------------- |
| 1 file changed, 44 insertions(+), 30 deletions(-) |
| |
| --- a/drivers/gpu/drm/i915/intel_display.c |
| +++ b/drivers/gpu/drm/i915/intel_display.c |
| @@ -3523,18 +3523,12 @@ static void i9xx_pfit_enable(struct inte |
| if (!crtc->config.gmch_pfit.control) |
| return; |
| |
| - WARN_ON(I915_READ(PFIT_CONTROL) & PFIT_ENABLE); |
| - assert_pipe_disabled(dev_priv, crtc->pipe); |
| - |
| /* |
| - * Enable automatic panel scaling so that non-native modes |
| - * fill the screen. The panel fitter should only be |
| - * adjusted whilst the pipe is disabled, according to |
| - * register description and PRM. |
| + * The panel fitter should only be adjusted whilst the pipe is disabled, |
| + * according to register description and PRM. |
| */ |
| - DRM_DEBUG_KMS("applying panel-fitter: %x, %x\n", |
| - pipe_config->gmch_pfit.control, |
| - pipe_config->gmch_pfit.pgm_ratios); |
| + WARN_ON(I915_READ(PFIT_CONTROL) & PFIT_ENABLE); |
| + assert_pipe_disabled(dev_priv, crtc->pipe); |
| |
| I915_WRITE(PFIT_PGM_RATIOS, pipe_config->gmch_pfit.pgm_ratios); |
| I915_WRITE(PFIT_CONTROL, pipe_config->gmch_pfit.control); |
| @@ -4857,9 +4851,6 @@ static int i9xx_crtc_mode_set(struct drm |
| dspcntr |= DISPPLANE_SEL_PIPE_B; |
| } |
| |
| - DRM_DEBUG_KMS("Mode for pipe %c:\n", pipe_name(pipe)); |
| - drm_mode_debug_printmodeline(mode); |
| - |
| intel_set_pipe_timings(intel_crtc, mode, adjusted_mode); |
| |
| /* pipesrc and dspsize control the size that is scaled from, |
| @@ -5661,9 +5652,6 @@ static int ironlake_crtc_mode_set(struct |
| /* Ensure that the cursor is valid for the new mode before changing... */ |
| intel_crtc_update_cursor(crtc, true); |
| |
| - DRM_DEBUG_KMS("Mode for pipe %c:\n", pipe_name(pipe)); |
| - drm_mode_debug_printmodeline(mode); |
| - |
| /* CPU eDP is the only output that doesn't need a PCH PLL of its own. */ |
| if (intel_crtc->config.has_pch_encoder) { |
| struct intel_pch_pll *pll; |
| @@ -5874,9 +5862,6 @@ static int haswell_crtc_mode_set(struct |
| /* Ensure that the cursor is valid for the new mode before changing... */ |
| intel_crtc_update_cursor(crtc, true); |
| |
| - DRM_DEBUG_KMS("Mode for pipe %c:\n", pipe_name(pipe)); |
| - drm_mode_debug_printmodeline(mode); |
| - |
| if (intel_crtc->config.has_dp_encoder) |
| intel_dp_set_m_n(intel_crtc); |
| |
| @@ -7689,6 +7674,35 @@ pipe_config_set_bpp(struct drm_crtc *crt |
| return bpp; |
| } |
| |
| +static void intel_dump_pipe_config(struct intel_crtc *crtc, |
| + struct intel_crtc_config *pipe_config, |
| + const char *context) |
| +{ |
| + DRM_DEBUG_KMS("[CRTC:%d]%s config for pipe %c\n", crtc->base.base.id, |
| + context, pipe_name(crtc->pipe)); |
| + |
| + DRM_DEBUG_KMS("cpu_transcoder: %c\n", transcoder_name(pipe_config->cpu_transcoder)); |
| + DRM_DEBUG_KMS("pipe bpp: %i, dithering: %i\n", |
| + pipe_config->pipe_bpp, pipe_config->dither); |
| + DRM_DEBUG_KMS("fdi/pch: %i, lanes: %i, gmch_m: %u, gmch_n: %u, link_m: %u, link_n: %u, tu: %u\n", |
| + pipe_config->has_pch_encoder, |
| + pipe_config->fdi_lanes, |
| + pipe_config->fdi_m_n.gmch_m, pipe_config->fdi_m_n.gmch_n, |
| + pipe_config->fdi_m_n.link_m, pipe_config->fdi_m_n.link_n, |
| + pipe_config->fdi_m_n.tu); |
| + DRM_DEBUG_KMS("requested mode:\n"); |
| + drm_mode_debug_printmodeline(&pipe_config->requested_mode); |
| + DRM_DEBUG_KMS("adjusted mode:\n"); |
| + drm_mode_debug_printmodeline(&pipe_config->adjusted_mode); |
| + DRM_DEBUG_KMS("gmch pfit: control: 0x%08x, ratios: 0x%08x, lvds border: 0x%08x\n", |
| + pipe_config->gmch_pfit.control, |
| + pipe_config->gmch_pfit.pgm_ratios, |
| + pipe_config->gmch_pfit.lvds_border_bits); |
| + DRM_DEBUG_KMS("pch pfit: pos: 0x%08x, size: 0x%08x\n", |
| + pipe_config->pch_pfit.pos, |
| + pipe_config->pch_pfit.size); |
| +} |
| + |
| static struct intel_crtc_config * |
| intel_modeset_pipe_config(struct drm_crtc *crtc, |
| struct drm_framebuffer *fb, |
| @@ -7759,8 +7773,6 @@ encoder_retry: |
| goto encoder_retry; |
| } |
| |
| - DRM_DEBUG_KMS("[CRTC:%d]\n", crtc->base.id); |
| - |
| pipe_config->dither = pipe_config->pipe_bpp != plane_bpp; |
| DRM_DEBUG_KMS("plane bpp: %i, pipe bpp: %i, dithering: %i\n", |
| plane_bpp, pipe_config->pipe_bpp, pipe_config->dither); |
| @@ -8122,9 +8134,14 @@ intel_modeset_check_state(struct drm_dev |
| "crtc active state doesn't match with hw state " |
| "(expected %i, found %i)\n", crtc->active, active); |
| |
| - WARN(active && |
| - !intel_pipe_config_compare(dev, &crtc->config, &pipe_config), |
| - "pipe state doesn't match!\n"); |
| + if (active && |
| + !intel_pipe_config_compare(dev, &crtc->config, &pipe_config)) { |
| + WARN(1, "pipe state doesn't match!\n"); |
| + intel_dump_pipe_config(crtc, &pipe_config, |
| + "[hw state]"); |
| + intel_dump_pipe_config(crtc, &crtc->config, |
| + "[sw state]"); |
| + } |
| } |
| } |
| |
| @@ -8164,6 +8181,8 @@ static int __intel_set_mode(struct drm_c |
| |
| goto out; |
| } |
| + intel_dump_pipe_config(to_intel_crtc(crtc), pipe_config, |
| + "[modeset]"); |
| } |
| |
| for_each_intel_crtc_masked(dev, disable_pipes, intel_crtc) |
| @@ -8523,12 +8542,6 @@ static int intel_crtc_set_config(struct |
| goto fail; |
| |
| if (config->mode_changed) { |
| - if (set->mode) { |
| - DRM_DEBUG_KMS("attempting to set mode from" |
| - " userspace\n"); |
| - drm_mode_debug_printmodeline(set->mode); |
| - } |
| - |
| ret = intel_set_mode(set->crtc, set->mode, |
| set->x, set->y, set->fb); |
| } else if (config->fb_changed) { |
| @@ -9565,6 +9578,7 @@ void intel_modeset_setup_hw_state(struct |
| for_each_pipe(pipe) { |
| crtc = to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]); |
| intel_sanitize_crtc(crtc); |
| + intel_dump_pipe_config(crtc, &crtc->config, "[setup_hw_state]"); |
| } |
| |
| if (force_restore) { |