[PATCH 07/49] drm/i915/bdw: Rework init code for gen8 contexts

oscar.mateo
2014-03-27T17:12:16Z

From: Ben Widawsky <benjamin.widawsky@intel.com>

This modifies the init code to try to start logical ring contexts when
possible, and fall back to legacy ringbuffers when not.

Most importantly, things make things easy if we do the context creation
before ringbuffer initialization. Upcoming patches will make it clearer
why that is. For the initial enabling of execlists, the ringbuffer code
will be reused a decent amount. As such this code will have to change,
but it helps with enabling to be able to run through a bunch of the
context init, and still have a system boot.

Finally, for the bikeshedders out there: I've tried merging the legacy
hw context init functionality, ie. one init function, and this logic was
in the context creation. The resulting code was much uglier and for no
real gain.

Signed-off-by: Ben Widawsky <ben@bwidawsk.net>

v2: Rebased on top of the Full PPGTT series.

Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
---
drivers/gpu/drm/i915/i915_drv.h | 3 +++
drivers/gpu/drm/i915/i915_gem.c | 16 +++++++++++-----
drivers/gpu/drm/i915/i915_lrc.c | 5 +++++
3 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 488d406..872849e 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2312,6 +2312,9 @@ int i915_gem_context_create_ioctl(struct drm_device *dev, void *data,
int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data,
struct drm_file *file);

+/* i915_lrc.c */
+int gen8_gem_context_init(struct drm_device *dev);
+
/* i915_gem_evict.c */
int __must_check i915_gem_evict_something(struct drm_device *dev,
struct i915_address_space *vm,
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index f429887..d734ee3 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4451,7 +4451,7 @@ err_out:
int i915_gem_init(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = dev->dev_private;
- int ret;
+ int ret = -1;

mutex_lock(&dev->struct_mutex);

@@ -4466,11 +4466,17 @@ int i915_gem_init(struct drm_device *dev)

intel_init_rings_early(dev);

- ret = i915_gem_context_init(dev);
+ if (HAS_LOGICAL_RING_CONTEXTS(dev) && USES_PPGTT(dev))
+ ret = gen8_gem_context_init(dev);
+
if (ret) {
- mutex_unlock(&dev->struct_mutex);
- return ret;
- }
+ ret = i915_gem_context_init(dev);
+ if (ret) {
+ mutex_unlock(&dev->struct_mutex);
+ return ret;
+ }
+ } else
+ dev_priv->lrc_enabled = true;

ret = i915_gem_init_hw(dev);
mutex_unlock(&dev->struct_mutex);
diff --git a/drivers/gpu/drm/i915/i915_lrc.c b/drivers/gpu/drm/i915/i915_lrc.c
index 49bb6fc..3a93e99 100644
--- a/drivers/gpu/drm/i915/i915_lrc.c
+++ b/drivers/gpu/drm/i915/i915_lrc.c
@@ -40,3 +40,8 @@
#include <drm/drmP.h>
#include <drm/i915_drm.h>
#include "i915_drv.h"
+
+int gen8_gem_context_init(struct drm_device *dev)
+{
+ return -ENOSYS;
+}
--
1.9.0