aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_dma.c
diff options
context:
space:
mode:
authorBen Widawsky <ben@bwidawsk.net>2012-06-04 17:42:42 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-06-14 11:36:16 -0400
commit254f965c39e3918544395f4ebac8c589d890bae6 (patch)
tree84006b2ad284d07cb1fc57e9eda7ead98bc93f11 /drivers/gpu/drm/i915/i915_dma.c
parentfe1cc68fcb11ca14f420068d1806eb5e719ac772 (diff)
drm/i915: preliminary context support
Very basic code for context setup/destruction in the driver. Adds the file i915_gem_context.c This file implements HW context support. On gen5+ a HW context consists of an opaque GPU object which is referenced at times of context saves and restores. With RC6 enabled, the context is also referenced as the GPU enters and exists from RC6 (GPU has it's own internal power context, except on gen5). Though something like a context does exist for the media ring, the code only supports contexts for the render ring. In software, there is a distinction between contexts created by the user, and the default HW context. The default HW context is used by GPU clients that do not request setup of their own hardware context. The default context's state is never restored to help prevent programming errors. This would happen if a client ran and piggy-backed off another clients GPU state. The default context only exists to give the GPU some offset to load as the current to invoke a save of the context we actually care about. In fact, the code could likely be constructed, albeit in a more complicated fashion, to never use the default context, though that limits the driver's ability to swap out, and/or destroy other contexts. All other contexts are created as a request by the GPU client. These contexts store GPU state, and thus allow GPU clients to not re-emit state (and potentially query certain state) at any time. The kernel driver makes certain that the appropriate commands are inserted. There are 4 entry points into the contexts, init, fini, open, close. The names are self-explanatory except that init can be called during reset, and also during pm thaw/resume. As we expect our context to be preserved across these events, we do not reinitialize in this case. As Adam Jackson pointed out, The cutoff of 1MB where a HW context is considered too big is arbitrary. The reason for this is even though context sizes are increasing with every generation, they have yet to eclipse even 32k. If we somehow read back way more than that, it probably means BIOS has done something strange, or we're running on a platform that wasn't designed for this. v2: rename load/unload to init/fini (daniel) remove ILK support for get_size() (indirectly daniel) add HAS_HW_CONTEXTS macro to clarify supported platforms (daniel) added comments (Ben) Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_dma.c')
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index fa8f2699344b..3f3aca8c3767 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1669,6 +1669,7 @@ int i915_driver_unload(struct drm_device *dev)
1669 if (ret) 1669 if (ret)
1670 DRM_ERROR("failed to idle hardware: %d\n", ret); 1670 DRM_ERROR("failed to idle hardware: %d\n", ret);
1671 i915_gem_retire_requests(dev); 1671 i915_gem_retire_requests(dev);
1672 i915_gem_context_fini(dev);
1672 mutex_unlock(&dev->struct_mutex); 1673 mutex_unlock(&dev->struct_mutex);
1673 1674
1674 /* Cancel the retire work handler, which should be idle now. */ 1675 /* Cancel the retire work handler, which should be idle now. */
@@ -1758,6 +1759,8 @@ int i915_driver_open(struct drm_device *dev, struct drm_file *file)
1758 spin_lock_init(&file_priv->mm.lock); 1759 spin_lock_init(&file_priv->mm.lock);
1759 INIT_LIST_HEAD(&file_priv->mm.request_list); 1760 INIT_LIST_HEAD(&file_priv->mm.request_list);
1760 1761
1762 i915_gem_context_open(dev, file);
1763
1761 return 0; 1764 return 0;
1762} 1765}
1763 1766
@@ -1790,6 +1793,7 @@ void i915_driver_lastclose(struct drm_device * dev)
1790 1793
1791void i915_driver_preclose(struct drm_device * dev, struct drm_file *file_priv) 1794void i915_driver_preclose(struct drm_device * dev, struct drm_file *file_priv)
1792{ 1795{
1796 i915_gem_context_close(dev, file_priv);
1793 i915_gem_release(dev, file_priv); 1797 i915_gem_release(dev, file_priv);
1794} 1798}
1795 1799