linux/drivers/gpu/drm
Daniel Vetter 9ee32fea5f drm/i915: irq-drive the dp aux communication
At least on the platforms that have a dp aux irq and also have it
enabled - vlvhsw should have one, too. But I don't have a machine to
test this on. Judging from docs there's no dp aux interrupt for gm45.

Also, I only have an ivb cpu edp machine, so the dp aux A code for
snb/ilk is untested.

For dpcd probing when nothing is connected it slashes about 5ms of cpu
time (cpu time is now negligible), which agrees with 3 * 5 400 usec
timeouts.

A previous version of this patch increases the time required to go
through the dp_detect cycle (which includes reading the edid) from
around 33 ms to around 40 ms. Experiments indicated that this is
purely due to the irq latency - the hw doesn't allow us to queue up
dp aux transactions and hence irq latency directly affects throughput.
gmbus is much better, there we have a 8 byte buffer, and we get the
irq once another 4 bytes can be queued up.

But by using the pm_qos interface to request the lowest possible cpu
wake-up latency this slowdown completely disappeared.

Since all our output detection logic is single-threaded with the
mode_config mutex right now anyway, I've decide not ot play fancy and
to just reuse the gmbus wait queue. But this would definitely prep the
way to run dp detection on different ports in parallel

v2: Add a timeout for dp aux transfers when using interrupts - the hw
_does_  prevent this with the hw-based 400 usec timeout, but if the
irq somehow doesn't arrive we're screwed. Lesson learned while
developing this ;-)

v3: While at it also convert the busy-loop to wait_for_atomic, so that
we don't run the risk of an infinite loop any more.

v4: Ensure we have the smallest possible irq latency by using the
pm_qos interface.

v5: Add a comment to the code to explain why we frob pm_qos. Suggested
by Chris Wilson.

v6: Disable dp irq for vlv, that's easier than trying to get at docs
and hw.

v7: Squash in a fix for Haswell that Paulo Zanoni tracked down - the
dp aux registers aren't at a fixed offset any more, but can be on the
PCH while the DP port is on the cpu die.

Reviewed-by: Imre Deak <imre.deak@intel.com> (v6)
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
2012-12-06 13:18:00 +01:00
..
ast drm/ttm: remove ttm_buffer_object->buffer_start 2012-11-20 16:06:19 +10:00
cirrus drm/cirrus: check alloc_apertures() success in cirrus_kick_out_firmware_fb() 2012-11-20 16:06:23 +10:00
exynos drm: exynos: removed warning due to missing typecast for mixer driver data 2012-10-31 06:11:40 -07:00
gma500 gma500: medfield: drop bogus NULL check in mdfld_dsi_output_init() 2012-11-07 11:35:32 +10:00
i2c Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2012-10-03 23:29:23 -07:00
i810
i915 drm/i915: irq-drive the dp aux communication 2012-12-06 13:18:00 +01:00
mga
mgag200 drm/mgag200: remove unneeded aper->count assignment after alloc_apertures() 2012-11-20 16:06:26 +10:00
nouveau drm/ttm: remove sync_arg from driver functions 2012-11-20 16:10:10 +10:00
r128
radeon drm/ttm: remove sync_arg from driver functions 2012-11-20 16:10:10 +10:00
savage Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2012-10-03 23:29:23 -07:00
shmobile drm: platform: Don't initialize driver-private data 2012-10-23 10:15:11 +10:00
sis
tdfx
tegra drm: tegra: Add HDMI support 2012-11-20 15:43:53 +10:00
ttm drm/ttm: alter cpu_writers to return -EBUSY in ttm_execbuf_util reservations 2012-11-20 16:17:35 +10:00
udl drm/udl: Add missing static storage class specifiers in udl_connector.c 2012-11-20 15:41:49 +10:00
via
vmwgfx drm/vmwgfx: Make vmw_dmabuf_unreference handle NULL objects 2012-11-20 16:19:59 +10:00
ati_pcigart.c
drm_agpsupport.c
drm_auth.c
drm_buffer.c
drm_bufs.c
drm_cache.c Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2012-10-03 23:29:23 -07:00
drm_context.c
drm_crtc.c drm: properly init/reset connector status 2012-11-20 15:51:06 +10:00
drm_crtc_helper.c drm: don't unnecessarily enable the polling work 2012-11-20 16:06:42 +10:00
drm_debugfs.c
drm_dma.c
drm_dp_helper.c drm: extract dp link bw helpers 2012-10-22 22:34:47 +02:00
drm_drv.c Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2012-10-03 23:29:23 -07:00
drm_edid.c drm: add drm_mode_cea_vic 2012-11-29 11:42:37 +01:00
drm_edid_load.c Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2012-10-03 23:29:23 -07:00
drm_edid_modes.h Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux 2012-10-03 23:29:23 -07:00
drm_encoder_slave.c
drm_fb_cma_helper.c drm: fb: cma: Fail gracefully on allocation failure 2012-10-23 10:14:58 +10:00
drm_fb_helper.c drm/fb_helper: Fix potential NULL pointer dereference 2012-11-20 15:40:56 +10:00
drm_fops.c
drm_gem.c mm: kill vma flag VM_RESERVED and mm->reserved_vm counter 2012-10-09 16:22:19 +09:00
drm_gem_cma_helper.c
drm_global.c
drm_hashtab.c drm: Make hashtab rcu-safe 2012-11-20 16:14:58 +10:00
drm_info.c drm/debugfs: remove redundant info from gem_names 2012-10-23 10:15:04 +10:00
drm_ioc32.c
drm_ioctl.c drm: add support for monotonic vblank timestamps 2012-11-20 16:06:16 +10:00
drm_irq.c DRM/KMS: Add Bail-Out Conditions for Loop. 2012-11-20 16:07:49 +10:00
drm_lock.c
drm_memory.c
drm_mm.c drm: Introduce an iterator over holes in the drm_mm range manager 2012-11-30 23:20:54 +01:00
drm_modes.c drm: Constify some function arguments 2012-11-07 10:09:16 +10:00
drm_pci.c
drm_platform.c drm: platform: Don't initialize driver-private data 2012-10-23 10:15:11 +10:00
drm_prime.c
drm_proc.c
drm_scatter.c
drm_stub.c drm: add support for monotonic vblank timestamps 2012-11-20 16:06:16 +10:00
drm_sysfs.c
drm_trace.h
drm_trace_points.c
drm_usb.c
drm_vm.c mm: kill vma flag VM_RESERVED and mm->reserved_vm counter 2012-10-09 16:22:19 +09:00
Kconfig drm: Add NVIDIA Tegra20 support 2012-11-20 15:43:41 +10:00
Makefile drm: Add NVIDIA Tegra20 support 2012-11-20 15:43:41 +10:00
README.drm

************************************************************
* For the very latest on DRI development, please see:      *
*     http://dri.freedesktop.org/                          *
************************************************************

The Direct Rendering Manager (drm) is a device-independent kernel-level
device driver that provides support for the XFree86 Direct Rendering
Infrastructure (DRI).

The DRM supports the Direct Rendering Infrastructure (DRI) in four major
ways:

    1. The DRM provides synchronized access to the graphics hardware via
       the use of an optimized two-tiered lock.

    2. The DRM enforces the DRI security policy for access to the graphics
       hardware by only allowing authenticated X11 clients access to
       restricted regions of memory.

    3. The DRM provides a generic DMA engine, complete with multiple
       queues and the ability to detect the need for an OpenGL context
       switch.

    4. The DRM is extensible via the use of small device-specific modules
       that rely extensively on the API exported by the DRM module.


Documentation on the DRI is available from:
    http://dri.freedesktop.org/wiki/Documentation
    http://sourceforge.net/project/showfiles.php?group_id=387
    http://dri.sourceforge.net/doc/

For specific information about kernel-level support, see:

    The Direct Rendering Manager, Kernel Support for the Direct Rendering
    Infrastructure
    http://dri.sourceforge.net/doc/drm_low_level.html

    Hardware Locking for the Direct Rendering Infrastructure
    http://dri.sourceforge.net/doc/hardware_locking_low_level.html

    A Security Analysis of the Direct Rendering Infrastructure
    http://dri.sourceforge.net/doc/security_low_level.html