OpenCloudOS-Kernel/drivers/gpu/drm
Mario Kleiner 27641c3f00 drm/vblank: Add support for precise vblank timestamping.
The DRI2 swap & sync implementation needs precise
vblank counts and precise timestamps corresponding
to those vblank counts. For conformance to the OpenML
OML_sync_control extension specification the DRM
timestamp associated with a vblank count should
correspond to the start of video scanout of the first
scanline of the video frame following the vblank
interval for that vblank count.

Therefore we need to carry around precise timestamps
for vblanks. Currently the DRM and KMS drivers generate
timestamps ad-hoc via do_gettimeofday() in some
places. The resulting timestamps are sometimes not
very precise due to interrupt handling delays, they
don't conform to OML_sync_control and some are wrong,
as they aren't taken synchronized to the vblank.

This patch implements support inside the drm core
for precise and robust timestamping. It consists
of the following interrelated pieces.

1. Vblank timestamp caching:

A per-crtc ringbuffer stores the most recent vblank
timestamps corresponding to vblank counts.

The ringbuffer can be read out lock-free via the
accessor function:

struct timeval timestamp;
vblankcount = drm_vblank_count_and_time(dev, crtcid, &timestamp).

The function returns the current vblank count and
the corresponding timestamp for start of video
scanout following the vblank interval. It can be
used anywhere between enclosing drm_vblank_get(dev, crtcid)
and drm_vblank_put(dev,crtcid) statements. It is used
inside the drmWaitVblank ioctl and in the vblank event
queueing and handling. It should be used by kms drivers for
timestamping of bufferswap completion.

The timestamp ringbuffer is reinitialized each time
vblank irq's get reenabled in drm_vblank_get()/
drm_update_vblank_count(). It is invalidated when
vblank irq's get disabled.

The ringbuffer is updated inside drm_handle_vblank()
at each vblank irq.

2. Calculation of precise vblank timestamps:

drm_get_last_vbltimestamp() is used to compute the
timestamp for the end of the most recent vblank (if
inside active scanout), or the expected end of the
current vblank interval (if called inside a vblank
interval). The function calls into a new optional kms
driver entry point dev->driver->get_vblank_timestamp()
which is supposed to provide the precise timestamp.
If a kms driver doesn't implement the entry point or
if the call fails, a simple do_gettimeofday() timestamp
is returned as crude approximation of the true vblank time.

A new drm module parameter drm.timestamp_precision_usec
allows to disable high precision timestamps (if set to
zero) or to specify the maximum acceptable error in
the timestamps in microseconds.

Kms drivers could implement their get_vblank_timestamp()
function in a gpu specific way, as long as returned
timestamps conform to OML_sync_control, e.g., by use
of gpu specific hardware timestamps.

Optionally, kms drivers can simply wrap and use the new
utility function drm_calc_vbltimestamp_from_scanoutpos().
This function calls a new optional kms driver function
dev->driver->get_scanout_position() which returns the
current horizontal and vertical video scanout position
of the crtc. The scanout position together with the
drm_display_timing of the current video mode is used
to calculate elapsed time relative to start of active scanout
for the current video frame. This elapsed time is subtracted
from the current do_gettimeofday() time to get the timestamp
corresponding to start of video scanout. Currently
non-interlaced, non-doublescan video modes, with or
without panel scaling are handled correctly. Interlaced/
doublescan modes are tbd in a future patch.

3. Filtering of redundant vblank irq's and removal of
some race-conditions in the vblank irq enable/disable path:

Some gpu's (e.g., Radeon R500/R600) send spurious vblank
irq's outside the vblank if vblank irq's get reenabled.
These get detected by use of the vblank timestamps and
filtered out to avoid miscounting of vblanks.

Some race-conditions between the vblank irq enable/disable
functions, the vblank irq handler and the gpu itself (updating
its hardware vblank counter in the "wrong" moment) are
fixed inside vblank_disable_and_save() and
drm_update_vblank_count() by use of the vblank timestamps and
a new spinlock dev->vblank_time_lock.

The time until vblank irq disable is now configurable via
a new drm module parameter drm.vblankoffdelay to allow
experimentation with timeouts that are much shorter than
the current 5 seconds and should allow longer vblank off
periods for better power savings.

Followup patches will use these new functions to
implement precise timestamping for the intel and radeon
kms drivers.

Signed-off-by: Mario Kleiner <mario.kleiner@tuebingen.mpg.de>
Signed-off-by: Dave Airlie <airlied@redhat.com>
2010-11-22 11:45:05 +10:00
..
i2c drm/i2c/ch7006: Don't use POWER_LEVEL_FULL_POWER_OFF on early chip versions. 2010-08-09 15:16:23 +10:00
i810 Merge branch 'drm-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 2010-10-26 18:57:59 -07:00
i830 Merge branch 'drm-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 2010-10-26 18:57:59 -07:00
i915 drm/i915: Disable FBC on Ironlake to save 1W 2010-11-19 09:36:21 +00:00
mga Merge branch 'drm-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 2010-10-26 18:57:59 -07:00
nouveau nouveau: Acknowledge HPD irq in handler, not bottom half 2010-11-18 14:39:07 +10:00
r128 Merge branch 'drm-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 2010-10-26 18:57:59 -07:00
radeon drm/radeon/kms: i2c s/sprintf/snprintf/g for safety 2010-11-19 09:27:48 +10:00
savage Merge branch 'drm-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 2010-10-26 18:57:59 -07:00
sis Merge branch 'drm-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 2010-10-26 18:57:59 -07:00
tdfx Merge branch 'drm-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 2010-10-26 18:57:59 -07:00
ttm drm/ttm: Fix up a theoretical deadlock 2010-11-18 15:00:42 +10:00
via drivers/gpu: Use vzalloc 2010-11-09 13:41:35 +10:00
vmwgfx drm/vmwgfx: Fix up an error path during bo creation 2010-11-18 14:56:47 +10:00
Kconfig BKL: introduce CONFIG_BKL. 2010-10-21 15:44:13 +02:00
Makefile drm: replace drawable ioctl by noops 2010-08-30 09:39:11 +10:00
README.drm
ati_pcigart.c drm/radeon: Fix pci_map_page() error checking 2010-08-12 09:38:29 +10:00
drm_agpsupport.c drm: kill agp indirection mess 2010-08-30 09:44:40 +10:00
drm_auth.c drivers/gpu/drm: Use kzalloc 2010-05-18 15:57:05 +10:00
drm_buffer.c drm: fix trivial coding errors 2010-09-24 10:10:23 +10:00
drm_bufs.c DRM: Replace kmalloc/memset combos with kzalloc 2010-08-12 09:12:30 +10:00
drm_cache.c
drm_context.c drm: kill context_ctor callback 2010-08-30 09:38:25 +10:00
drm_crtc.c drm: vmwgfx: Add a struct drm_file parameter to the dirty framebuffer callback 2010-10-06 11:29:41 +10:00
drm_crtc_helper.c drm/vblank: Add support for precise vblank timestamping. 2010-11-22 11:45:05 +10:00
drm_debugfs.c drm: Move the GTT accounting to i915 2010-10-01 14:45:20 +01:00
drm_dma.c drivers/gpu/drm: Use kzalloc 2010-05-18 15:57:05 +10:00
drm_dp_i2c_helper.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
drm_drv.c Merge branch 'drm-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 2010-10-26 18:57:59 -07:00
drm_edid.c DRM: ignore invalid EDID extensions 2010-11-09 13:34:14 +10:00
drm_edid_modes.h drm/edid: Split mode lists out to their own header for readability 2010-08-10 10:47:00 +10:00
drm_encoder_slave.c drm/kms: Simplify setup of the initial I2C encoder config. 2010-08-05 09:37:45 +10:00
drm_fb_helper.c drm, kdb, kms: Change mode_set_base_atomic() enter argument to be an enum 2010-10-19 14:13:33 +10:00
drm_fops.c BKL: remove extraneous #include <smp_lock.h> 2010-11-17 08:59:32 -08:00
drm_gem.c Merge remote branch 'korg/drm-fixes' into drm-vmware-next 2010-10-06 11:10:48 +10:00
drm_global.c drm: move ttm global code to core drm 2010-08-04 09:46:06 +10:00
drm_hashtab.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
drm_info.c Merge remote branch 'korg/drm-fixes' into drm-vmware-next 2010-10-06 11:10:48 +10:00
drm_ioc32.c
drm_ioctl.c drm: Fix support for PCI domains 2010-08-10 08:20:20 +10:00
drm_irq.c drm/vblank: Add support for precise vblank timestamping. 2010-11-22 11:45:05 +10:00
drm_lock.c drm: readd drm_lock_free in drm_unlock 2010-09-26 13:35:49 +10:00
drm_memory.c drm: kill agp indirection mess 2010-08-30 09:44:40 +10:00
drm_mm.c drm: mm: fix range restricted allocations 2010-08-27 09:10:16 +10:00
drm_modes.c Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2010-10-24 13:41:39 -07:00
drm_pci.c drm: fix race between driver loading and userspace open. 2010-09-14 20:39:04 +10:00
drm_platform.c drm: fix race between driver loading and userspace open. 2010-09-14 20:39:04 +10:00
drm_proc.c drm: Move the GTT accounting to i915 2010-10-01 14:45:20 +01:00
drm_scatter.c drm: don't export drm_sg_alloc 2010-08-30 09:37:43 +10:00
drm_sman.c
drm_stub.c drm/vblank: Add support for precise vblank timestamping. 2010-11-22 11:45:05 +10:00
drm_sysfs.c drm: Use a nondestructive mode for output detect when polling 2010-09-13 20:29:11 +10:00
drm_trace.h drm: add per-event vblank event trace points 2010-07-02 14:03:24 +10:00
drm_trace_points.c drm: add vblank event trace point 2010-07-02 14:02:44 +10:00
drm_vm.c Merge remote branch 'korg/drm-fixes' into drm-vmware-next 2010-10-06 11:10:48 +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