diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_execbuffer.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 32 | 
1 files changed, 31 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index 0414228cd2b5..f627a8c47c58 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c @@ -81,6 +81,35 @@ enum {   * but this remains just a hint as the kernel may choose a new location for   * any object in the future.   * + * At the level of talking to the hardware, submitting a batchbuffer for the + * GPU to execute is to add content to a buffer from which the HW + * command streamer is reading. + * + * 1. Add a command to load the HW context. For Logical Ring Contexts, i.e. + *    Execlists, this command is not placed on the same buffer as the + *    remaining items. + * + * 2. Add a command to invalidate caches to the buffer. + * + * 3. Add a batchbuffer start command to the buffer; the start command is + *    essentially a token together with the GPU address of the batchbuffer + *    to be executed. + * + * 4. Add a pipeline flush to the buffer. + * + * 5. Add a memory write command to the buffer to record when the GPU + *    is done executing the batchbuffer. The memory write writes the + *    global sequence number of the request, ``i915_request::global_seqno``; + *    the i915 driver uses the current value in the register to determine + *    if the GPU has completed the batchbuffer. + * + * 6. Add a user interrupt command to the buffer. This command instructs + *    the GPU to issue an interrupt when the command, pipeline flush and + *    memory write are completed. + * + * 7. Inform the hardware of the additional commands added to the buffer + *    (by updating the tail pointer). + *   * Processing an execbuf ioctl is conceptually split up into a few phases.   *   * 1. Validation - Ensure all the pointers, handles and flags are valid. @@ -733,7 +762,8 @@ static int eb_lookup_vmas(struct i915_execbuffer *eb)  		}  		/* transfer ref to ctx */ -		vma->open_count++; +		if (!vma->open_count++) +			i915_vma_reopen(vma);  		list_add(&lut->obj_link, &obj->lut_list);  		list_add(&lut->ctx_link, &eb->ctx->handles_list);  		lut->ctx = eb->ctx;  | 
