linux/drivers/gpu/drm/i915
Daniel Vetter 28c70f162a drm/i915: use the gmbus irq for waits
We need two special things to properly wire this up:
- Add another argument to gmbus_wait_hw_status to pass in the
  correct interrupt bit in gmbus4.
- Since we can only get an irq for one of the two events we want,
  hand-roll the wait_event_timeout code so that we wake up every
  jiffie and can check for NAKs. This way we also subsume gmbus
  support for platforms without interrupts (or where those are not
  yet enabled).

The important bit really is to only enable one gmbus interrupt source
at the same time - with that piece of lore figured out, this seems to
work flawlessly.

Ben Widawsky rightfully complained the lack of measurements for the
claimed benefits (especially since the first version was actually
broken and fell back to bit-banging). Previously reading the 256 byte
hdmi EDID takes about 72 ms here. With this patch it's down to 33 ms.
Given that transfering the 256 bytes over i2c at wire speed takes
20.5ms alone, the reduction in additional overhead is rather nice.

v2: Chris Wilson wondered whether GMBUS4 might contain some set bits
when booting up an hence result in some spurious interrupts. Since we
clear GMBUS4 after every wait and we do gmbus transfer really early in
the setup sequence to detect displays the window is small, but still
be paranoid and clear it properly.

v3: Clarify the comment that gmbus irq generation can only support one
kind of event, why it bothers us and how we work around that limit.

Cc: Daniel Kurtz <djkurtz@chromium.org>
Reviewed-by: Imre Deak <imre.deak@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2012-12-06 13:14:37 +01:00
..
dvo_ch7xxx.c drm/i915/dvo-ch7xxx: fix get_hw_state 2012-10-12 10:59:11 +02:00
dvo_ch7017.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo_ivch.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo_ns2501.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo_sil164.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo_tfp410.c drm/i915/dvo: implement get_hw_state 2012-09-06 07:58:52 +02:00
dvo.h Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2012-10-03 23:29:23 -07:00
i915_debugfs.c drm/i915: Fix debugfs seqno info print to use uint 2012-12-05 17:17:50 +01:00
i915_dma.c drm/i915: reorder setup sequence to have irqs for output setup 2012-12-06 13:14:36 +01:00
i915_drv.c drm/i915: force restore on lid open 2012-11-29 11:43:52 +01:00
i915_drv.h drm/i915: use the gmbus irq for waits 2012-12-06 13:14:37 +01:00
i915_gem_context.c drm/i915: Preallocate next seqno before touching the ring 2012-11-29 11:43:52 +01:00
i915_gem_debug.c UAPI: (Scripted) Convert #include "..." to #include <path/...> in drivers/gpu/ 2012-10-02 18:01:07 +01:00
i915_gem_dmabuf.c drm/i915: Use a slab for object allocation 2012-11-30 23:44:05 +01:00
i915_gem_evict.c Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2012-10-03 23:29:23 -07:00
i915_gem_execbuffer.c drm/i915: Remove check for conflicting relocation write-domains 2012-12-03 20:13:16 +01:00
i915_gem_gtt.c drm/i915: Avoid clearing preallocated regions from the GTT 2012-11-30 23:24:49 +01:00
i915_gem_stolen.c drm/i915: Use a slab for object allocation 2012-11-30 23:44:05 +01:00
i915_gem_tiling.c Merge branch 'drm-intel-fixes' of git://people.freedesktop.org/~danvet/drm-intel into drm-next 2012-10-07 21:13:54 +10:00
i915_gem.c drm/i915: Add intel_ring_handle_seqno wrap 2012-12-06 13:14:34 +01:00
i915_ioc32.c UAPI: (Scripted) Convert #include "..." to #include <path/...> in drivers/gpu/ 2012-10-02 18:01:07 +01:00
i915_irq.c drm/i915: use the gmbus irq for waits 2012-12-06 13:14:37 +01:00
i915_reg.h drm/i915: remove duplicate register #defines 2012-11-29 11:58:14 +01:00
i915_suspend.c drm/i915: Remove save/restore of physical HWS_PGA register 2012-11-21 17:45:02 +01:00
i915_sysfs.c drm/i915: protect RPS/RC6 related accesses (including PCU) with a new mutex 2012-11-11 23:51:41 +01:00
i915_trace_points.c drm/i915: [sparse] trivial sparse fixes 2012-04-18 10:34:49 +02:00
i915_trace.h drm/i915: Allow DRM_ROOT_ONLY|DRM_MASTER to submit privileged batchbuffers 2012-10-17 21:06:59 +02:00
intel_acpi.c UAPI: (Scripted) Convert #include "..." to #include <path/...> in drivers/gpu/ 2012-10-02 18:01:07 +01:00
intel_bios.c drm/i915: Only check for valid PP_{ON, OFF}_DELAYS on pre ILK hardware 2012-11-21 17:45:01 +01:00
intel_bios.h UAPI: (Scripted) Convert #include "..." to #include <path/...> in drivers/gpu/ 2012-10-02 18:01:07 +01:00
intel_crt.c drm/i915: add HAS_DDI check 2012-11-29 14:58:53 +01:00
intel_ddi.c drm/i915: fixup sparse warnings 2012-12-03 22:31:04 +01:00
intel_display.c drm/i915: fixup sparse warnings 2012-12-03 22:31:04 +01:00
intel_dp.c drm/i915: kill intel_dp_link_clock() 2012-11-29 15:00:38 +01:00
intel_drv.h drm/i915: move is_dual_link_lvds to intel_lvds.c 2012-11-29 12:25:06 +01:00
intel_dvo.c Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2012-10-03 23:29:23 -07:00
intel_fb.c drm/i915: Allocate fbcon from stolen memory 2012-11-30 23:38:46 +01:00
intel_hdmi.c drm/i915: add HAS_DDI check 2012-11-29 14:58:53 +01:00
intel_i2c.c drm/i915: use the gmbus irq for waits 2012-12-06 13:14:37 +01:00
intel_lvds.c drm/i915: enable intel_lvds->pre_pll_enable for ilk+, too 2012-11-29 12:51:37 +01:00
intel_modes.c drm/i915: drm_connector_property -> drm_object_property 2012-11-21 22:12:26 +01:00
intel_opregion.c Linux 3.7-rc2 2012-10-22 14:34:51 +02:00
intel_overlay.c drm/i915: Allocate overlay registers from stolen memory 2012-11-30 23:43:32 +01:00
intel_panel.c drm/i915: resurrect panel lid handling 2012-11-21 17:45:05 +01:00
intel_pm.c drm/i915: Delay allocation of stolen space for FBC 2012-11-30 23:29:59 +01:00
intel_ringbuffer.c drm/i915: Add intel_ring_handle_seqno wrap 2012-12-06 13:14:34 +01:00
intel_ringbuffer.h drm/i915: Add intel_ring_handle_seqno wrap 2012-12-06 13:14:34 +01:00
intel_sdvo_regs.h drm/i915: clear the entire sdvo infoframe buffer 2012-10-24 15:12:48 +02:00
intel_sdvo.c drm/i915: Increase the response time for slow SDVO devices 2012-11-29 11:42:38 +01:00
intel_sprite.c drm/i915: Bad pixel formats can't reach the sprite code 2012-11-11 23:51:14 +01:00
intel_tv.c drm/i915: drm_connector_property -> drm_object_property 2012-11-21 22:12:26 +01:00
Makefile drm/i915: Support for ns2501-DVO 2012-07-25 18:23:48 +02:00