linux-sg2042/drivers/gpu/drm/i915
Paulo Zanoni 5978118c39 drm/i915: reorganize the unclaimed register detection code
The current code only runs when we do an I915_WRITE operation. It
checks if the unclaimed register flag is set before we do the
operation, and then it checks it again after we do the operation. This
double check allows us to find out if the I915_WRITE operation in
question is the bad one, or if some previous code is the bad one. When
it finds a problem, our code uses DRM_ERROR to signal it.

The good thing about the current code is that it detects the problem,
so at least we can know we did something wrong. The problem is that
even though we find the problem, we don't really have much information
to actually debug it. So whenever I see one of these DRM_ERROR
messages on my systems, the first thing I do is apply a patch to
change the DRM_ERROR to a WARN and also check for unclaimed registers
on I915_READ operations. This local patch makes things even slower,
but it usually helps a lot in finding the bad code.

The first point here is that since the current code is only useful to
detect whether we have a problem or not, but it is not really good to
find the cause of the problem, I don't think we should be checking
both before and after every I915_WRITE operation: just doing the check
once should be enough for us to quickly detect problems. With this
change, the code that runs by default for every single user will only
do 1 read operation for every single I915_WRITE, instead of 2. This
patch does this change.

The second point is that the local patch I have should be upstream,
but since it makes things slower it should be disabled by default. So
I added the i915.mmio_debug option to enable it.

So after this patch, this is what will happen:
 - By default, we will try to detect unclaimed registers once after
   every I915_WRITE operation. Previously we tried twice for every
   I915_WRITE.
 - When we find an unclaimed register we will still print a DRM_ERROR
   message, but we will now tell the user to try again with
   i915.mmio_debug=1.
 - When we use i915.mmio_debug=1 we will try to find unclaimed
   registers both before and after every I915_READ and I915_WRITE
   operation, and we will print stack traces in case we find them.
   This should really help locating the exact point of the bad code
   (or at least finding out that i915.ko is not the problem).

This commit also opens space for really-slow register debugging
operations on other platforms. In theory we can now add lots and lots
of debug code behind i915.mmio_debug, enable this option on our tests,
and catch more problems.

v2: - Remove not-so-useful comments (Daniel)
    - Fix the param definition macros (Rodrigo)

Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>
Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2014-07-23 07:05:36 +02:00
..
Kconfig drm/i915: Introduce mapping of user pages into video memory (userptr) ioctl 2014-05-16 19:31:29 +02:00
Makefile drm/i915: Add support for Generic MIPI panel driver 2014-06-05 08:52:32 +02:00
dvo.h drm/i915: Remove unused mode_fixup() vfunc of struct intel_dvo_dev_ops 2013-09-05 21:39:59 +02:00
dvo_ch7xxx.c drm/i915: Remove spurious semicolons 2014-04-09 21:54:33 +02:00
dvo_ch7017.c
dvo_ivch.c drm/i915: Remove spurious semicolons 2014-04-09 21:54:33 +02:00
dvo_ns2501.c drm/i915: Remove spurious semicolons 2014-04-09 21:54:33 +02:00
dvo_sil164.c drm/i915: Remove spurious semicolons 2014-04-09 21:54:33 +02:00
dvo_tfp410.c drm/i915: Remove spurious semicolons 2014-04-09 21:54:33 +02:00
i915_cmd_parser.c drm/i915: Add some L3 registers to the parser whitelist 2014-06-18 00:48:35 +02:00
i915_debugfs.c drm/i915: add helper for checking whether IRQs are enabled 2014-07-23 07:05:34 +02:00
i915_dma.c drm/i915: clear pm._irqs_disabled field after installing IRQs 2014-07-23 07:05:35 +02:00
i915_drv.c drm/i915: Power gating display wells during i915_pm_suspend 2014-07-23 07:04:54 +02:00
i915_drv.h drm/i915: reorganize the unclaimed register detection code 2014-07-23 07:05:36 +02:00
i915_gem.c drm/i915: add helper for checking whether IRQs are enabled 2014-07-23 07:05:34 +02:00
i915_gem_context.c drm/i915: Emphasize that ctx->id is merely a user handle 2014-07-08 12:30:41 +02:00
i915_gem_debug.c drm/i915: prefer struct drm_i915_private to drm_i915_private_t 2014-03-31 15:34:21 +02:00
i915_gem_dmabuf.c drm/i915: Introduce mapping of user pages into video memory (userptr) ioctl 2014-05-16 19:31:29 +02:00
i915_gem_evict.c drm/i915: Prevent negative relocation deltas from wrapping 2014-05-27 11:18:40 +03:00
i915_gem_execbuffer.c drm/i915: Extract the actual workload submission mechanism from execbuffer 2014-07-08 12:31:06 +02:00
i915_gem_gtt.c drm/i915: Don't disable PPGTT for CHV based in PCI rev 2014-07-11 15:58:33 +02:00
i915_gem_gtt.h drm/i915: Added write-enable pte bit supportt 2014-06-17 09:21:47 +02:00
i915_gem_render_state.c drm/i915: Simplify processing of the golden render context state 2014-06-16 19:53:09 +02:00
i915_gem_stolen.c drm/i915: Try harder to get FBC 2014-07-03 11:27:57 +03:00
i915_gem_tiling.c drm/i915: prefer struct drm_i915_private to drm_i915_private_t 2014-03-31 15:34:21 +02:00
i915_gem_userptr.c drm/i915: Initialise userptr mmu_notifier serial to 1 2014-07-23 07:05:29 +02:00
i915_gpu_error.c drm/i915/bdw: collect semaphore error state 2014-07-07 23:16:54 +02:00
i915_ioc32.c drm: Remove DRM_ARRAY_SIZE() for ARRAY_SIZE() 2014-06-10 09:36:17 +10:00
i915_irq.c drm/i915: set pm._irqs_disabled at IRQ init time 2014-07-23 07:05:34 +02:00
i915_params.c drm/i915: reorganize the unclaimed register detection code 2014-07-23 07:05:36 +02:00
i915_reg.h drm/i915/chv: calculate rc6 residency correctly 2014-07-12 11:13:47 +02:00
i915_suspend.c drm/i915: disable GT power saving early during system suspend 2014-05-22 21:53:27 +02:00
i915_sysfs.c drm/i915/chv: calculate rc6 residency correctly 2014-07-12 11:13:47 +02:00
i915_trace.h drm/i915: s/intel_ring_buffer/intel_engine_cs 2014-05-22 23:01:05 +02:00
i915_trace_points.c
i915_ums.c drm/i915: Only restore backlight combination mode reg for ums 2014-01-24 17:22:45 +01:00
intel_acpi.c Merge branch 'acpi-dsm' 2014-01-12 23:45:52 +01:00
intel_bios.c drm/i915: default to having backlight if VBT not available 2014-06-23 16:08:20 +03:00
intel_bios.h drm/i915: Detect if MIPI panel based on VBT and initialize only if present 2014-06-05 08:52:33 +02:00
intel_crt.c drm/i915: remove useless runtime PM get calls 2014-07-23 07:05:23 +02:00
intel_ddi.c drm/i915: Make the WRPLL names const 2014-07-23 07:05:30 +02:00
intel_display.c drm/i915: mark IRQs as disabled on unload 2014-07-23 07:05:36 +02:00
intel_dp.c drm/i915: remove useless runtime PM get calls 2014-07-23 07:05:23 +02:00
intel_drv.h drm/i915: add helper for checking whether IRQs are enabled 2014-07-23 07:05:34 +02:00
intel_dsi.c drm/i915: Fix memory leak in intel_dsi_init() error path 2014-06-13 22:08:15 +02:00
intel_dsi.h drm/i915: Add support for Generic MIPI panel driver 2014-06-05 08:52:32 +02:00
intel_dsi_cmd.c drm/i915: Send DPI command explicitely in LP mode 2014-04-09 21:54:30 +02:00
intel_dsi_cmd.h drm/i915: Send DPI command explicitely in LP mode 2014-04-09 21:54:30 +02:00
intel_dsi_panel_vbt.c drm/i915: Fix checkpatch errors 2014-06-11 16:57:33 +02:00
intel_dsi_pll.c drm/i915: Try harder to get best m, n, p values with minimal error 2013-12-11 23:52:18 +01:00
intel_dvo.c drm/i915: Don't get hw state from DVO chip unless DVO is enabled 2014-06-13 15:17:37 +02:00
intel_fbdev.c drm/i915: replace ALIGN(PAGE_SIZE) by PAGE_ALIGN 2014-07-02 13:31:32 +03:00
intel_hdmi.c drm/i915: Add aspect ratio property for HDMI 2014-07-23 07:05:26 +02:00
intel_i2c.c drm/i915: Kill duplicated cdclk readout code from i2c 2014-07-07 11:27:52 +02:00
intel_lvds.c drm/i915: don't read LVDS regs at compute_config time 2014-07-10 22:17:57 +02:00
intel_modes.c
intel_opregion.c drm: convert crtc and connection_mutex to ww_mutex (v5) 2014-06-05 09:54:33 +10:00
intel_overlay.c drm/i915: Track frontbuffer invalidation/flushing 2014-06-19 18:14:47 +02:00
intel_panel.c drm/i915: set backlight duty cycle after backlight enable for gen4 2014-06-11 11:06:43 +03:00
intel_pm.c drm/i915: add helper for checking whether IRQs are enabled 2014-07-23 07:05:34 +02:00
intel_renderstate.h drm/i915: Simplify processing of the golden render context state 2014-06-16 19:53:09 +02:00
intel_renderstate_gen6.c drm/i915: Simplify processing of the golden render context state 2014-06-16 19:53:09 +02:00
intel_renderstate_gen7.c drm/i915: Simplify processing of the golden render context state 2014-06-16 19:53:09 +02:00
intel_renderstate_gen8.c drm/i915: Simplify processing of the golden render context state 2014-06-16 19:53:09 +02:00
intel_ringbuffer.c drm/i915: Use genX_ prefix for gt irq enable/disable functions 2014-07-23 07:05:30 +02:00
intel_ringbuffer.h drm/i915: Generalize intel_ring_get_tail to take a ringbuf 2014-07-08 12:31:02 +02:00
intel_sdvo.c drm/i915: Avoid div-by-zero when pixel_multiplier is zero 2014-06-11 11:06:43 +03:00
intel_sdvo_regs.h drm/i915: use __packed instead of __attribute__((packed)) 2013-12-03 18:19:49 +01:00
intel_sideband.c drm/i915: vlv/chv: fix DSI sideband register accessing 2014-05-19 17:50:14 +02:00
intel_sprite.c drm/i915: Also give the sprite width for WM computation 2014-07-23 07:05:27 +02:00
intel_tv.c drm: convert crtc and connection_mutex to ww_mutex (v5) 2014-06-05 09:54:33 +10:00
intel_uncore.c drm/i915: reorganize the unclaimed register detection code 2014-07-23 07:05:36 +02:00