linux/drivers/gpu/drm
Daniel Vetter e35a41de39 drm/i915: allow lazy emitting of requests
Sometimes (like when flushing in preparation of batchbuffer execution)
we know that we'll emit a request but haven't yet done so. Allow this
case by simply taking the next seqno by default. Ensure that a request
is eventually emitted before waiting for an request by issuing it
in i915_wait_request iff this is not yet done.

Also replace one open-coded version of i915_gem_object_wait_rendering,
to prevent future code-diversion.

Chris Wilson asked me to explain and clarify what this patch does and why.
Here it goes:

Old way of moving objects onto the active list and associating them with a
reques:

1. i915_add_request + store the returned seqno somewhere
2. i915_gem_object_move_to_active (with the stored seqno as parameter)

For the current users, this is all fine. But I'd like to associate objects
(and fence regs) with the batchbuffer request deep down in the execbuf
call-chain. I thought about three ways of implementing this.

a) Don't care, just emit request when we need a new seqno. When heavily
pipelining fence reg changes, this would have caused tons of superflous
request (and corresponding irqs).

b) Thread all changed fences, objects, whatever through the execbuf-maze,
so that when we emit a request, we can store the new seqno at all the right
places.

c) Kill that seqno-threading-around business by simply storing the next
seqno, i.e. allow 2. to be done before 1. in the above sequence.

I've decided to implement c) (in this patch). The following patches are
just fall-out that resulted from this small conceptual change.

* We can handle the flushing list processing where we actually emit a flush
  (i915_gem_flush and i915_retire_commands) instead of in i915_add_request.
  The code makes IMHO more sense this way (and i915_add_request looses the
  flush_domains parameter, obviously).

* We can avoid emitting unnecessary requests. IMHO there's no point in
  emitting more than one request per batchbuffer (with or without an
  corresponding irq).

* By enforcing 2. before 1. ordering in the above sequence the seqno
  argument of i915_gem_object_move_to_active is redundant and can be
  dropped.

v2: Now i915_wait_request issues request if it is not yet emitted.
Also introduce i915_gem_next_request_seqno(dev) just in case we ever
need to do some prep work before using a new seqno.

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
[ickle: Keep i915_gem_object_set_to_display_plane() uninterruptible.]
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
2010-09-08 10:23:34 +01: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 drm: kill get_reg_ofs callback 2010-08-30 09:44:56 +10:00
i830 drm: kill get_reg_ofs callback 2010-08-30 09:44:56 +10:00
i915 drm/i915: allow lazy emitting of requests 2010-09-08 10:23:34 +01:00
mga drm: kill get_reg_ofs callback 2010-08-30 09:44:56 +10:00
nouveau drm: kill get_reg_ofs callback 2010-08-30 09:44:56 +10:00
r128 drm: kill get_reg_ofs callback 2010-08-30 09:44:56 +10:00
radeon drm: kill get_reg_ofs callback 2010-08-30 09:44:56 +10:00
savage drm: kill get_reg_ofs callback 2010-08-30 09:44:56 +10:00
sis drm: kill get_reg_ofs callback 2010-08-30 09:44:56 +10:00
tdfx drm: kill get_reg_ofs callback 2010-08-30 09:44:56 +10:00
ttm drm: move ttm global code to core drm 2010-08-04 09:46:06 +10:00
via drm: kill get_reg_ofs callback 2010-08-30 09:44:56 +10:00
vmwgfx drm: kill get_reg_ofs callback 2010-08-30 09:44:56 +10:00
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: Add generic multipart buffer. 2010-02-23 09:46:20 +10:00
drm_bufs.c DRM: Replace kmalloc/memset combos with kzalloc 2010-08-12 09:12:30 +10:00
drm_cache.c drm: fix drm_cache.c for arch with no support. 2009-09-02 09:41:13 +10:00
drm_context.c drm: kill context_ctor callback 2010-08-30 09:38:25 +10:00
drm_crtc_helper.c Merge branch 'drm-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 2010-08-12 09:21:39 -07:00
drm_crtc.c drm: expand gamma_set 2010-08-10 10:47:00 +10:00
drm_debugfs.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_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 drm: kill dev->timer 2010-08-30 09:44:54 +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_edid.c Merge branch 'drm-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6 2010-08-12 09:21:39 -07: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 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input 2010-08-28 13:55:31 -07:00
drm_fops.c Merge remote branch 'nouveau/for-airlied' of /ssd/git/drm-nouveau-next into drm-fixes 2010-08-27 09:09:46 +10:00
drm_gem.c drm: kill gem_free_object_unlocked driver callback 2010-08-30 09:38:18 +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 drm: Add support for platform devices to register as DRM devices 2010-06-01 10:07:39 +10:00
drm_ioc32.c drm: convert drm_ioctl to unlocked_ioctl 2009-12-18 11:22:31 +10:00
drm_ioctl.c drm: Fix support for PCI domains 2010-08-10 08:20:20 +10:00
drm_irq.c Merge branch 'drm-tracepoints' into drm-testing 2010-07-07 18:38:44 +10:00
drm_lock.c drm: don't export dri1 locking functions 2010-08-30 09:39:00 +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 drm/modes: Fix CVT-R modeline generation 2010-08-27 09:10:33 +10:00
drm_pci.c drm: Add support for platform devices to register as DRM devices 2010-06-01 10:07:39 +10:00
drm_platform.c drm: Add support for platform devices to register as DRM devices 2010-06-01 10:07:39 +10:00
drm_proc.c drm: kill procfs callbacks 2010-08-30 09:38:08 +10: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: kill dev->timer 2010-08-30 09:44:54 +10:00
drm_sysfs.c Merge branch 'drm-platform' into drm-testing 2010-07-07 18:37:35 +10:00
drm_trace_points.c drm: add vblank event trace point 2010-07-02 14:02:44 +10:00
drm_trace.h drm: add per-event vblank event trace points 2010-07-02 14:03:24 +10:00
drm_vm.c drm: kill get_reg_ofs callback 2010-08-30 09:44:56 +10:00
Kconfig drm/radeon/kms: add support for internal thermal sensors (v3) 2010-08-02 10:00:00 +10:00
Makefile drm: replace drawable ioctl by noops 2010-08-30 09:39:11 +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