Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 829a0af2 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Group all the global context information together



Create a substruct to hold all the global context state under
drm_i915_private.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170620110547.15947-1-chris@chris-wilson.co.uk
parent c58949f4
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -1966,7 +1966,7 @@ static int i915_context_status(struct seq_file *m, void *unused)
	if (ret)
		return ret;

	list_for_each_entry(ctx, &dev_priv->context_list, link) {
	list_for_each_entry(ctx, &dev_priv->contexts.list, link) {
		seq_printf(m, "HW context %u ", ctx->hw_id);
		if (ctx->pid) {
			struct task_struct *task;
@@ -2072,7 +2072,7 @@ static int i915_dump_lrc(struct seq_file *m, void *unused)
	if (ret)
		return ret;

	list_for_each_entry(ctx, &dev_priv->context_list, link)
	list_for_each_entry(ctx, &dev_priv->contexts.list, link)
		for_each_engine(engine, dev_priv, id)
			i915_dump_lrc_obj(m, ctx, engine);

+5 −4
Original line number Diff line number Diff line
@@ -588,13 +588,13 @@ static void i915_gem_fini(struct drm_i915_private *dev_priv)
	mutex_lock(&dev_priv->drm.struct_mutex);
	intel_uc_fini_hw(dev_priv);
	i915_gem_cleanup_engines(dev_priv);
	i915_gem_context_fini(dev_priv);
	i915_gem_contexts_fini(dev_priv);
	i915_gem_cleanup_userptr(dev_priv);
	mutex_unlock(&dev_priv->drm.struct_mutex);

	i915_gem_drain_freed_objects(dev_priv);

	WARN_ON(!list_empty(&dev_priv->context_list));
	WARN_ON(!list_empty(&dev_priv->contexts.list));
}

static int i915_load_modeset_init(struct drm_device *dev)
@@ -1425,9 +1425,10 @@ static void i915_driver_release(struct drm_device *dev)

static int i915_driver_open(struct drm_device *dev, struct drm_file *file)
{
	struct drm_i915_private *i915 = to_i915(dev);
	int ret;

	ret = i915_gem_open(dev, file);
	ret = i915_gem_open(i915, file);
	if (ret)
		return ret;

@@ -1457,7 +1458,7 @@ static void i915_driver_postclose(struct drm_device *dev, struct drm_file *file)
	struct drm_i915_file_private *file_priv = file->driver_priv;

	mutex_lock(&dev->struct_mutex);
	i915_gem_context_close(dev, file);
	i915_gem_context_close(file);
	i915_gem_release(dev, file);
	mutex_unlock(&dev->struct_mutex);

+11 −9
Original line number Diff line number Diff line
@@ -2235,13 +2235,6 @@ struct drm_i915_private {
	DECLARE_HASHTABLE(mm_structs, 7);
	struct mutex mm_lock;

	/* The hw wants to have a stable context identifier for the lifetime
	 * of the context (for OA, PASID, faults, etc). This is limited
	 * in execlists to 21 bits.
	 */
	struct ida context_hw_ida;
#define MAX_CONTEXT_HW_ID (1<<21) /* exclusive */

	/* Kernel Modesetting */

	struct intel_crtc *plane_to_crtc_mapping[I915_MAX_PIPES];
@@ -2320,7 +2313,16 @@ struct drm_i915_private {
	 */
	struct mutex av_mutex;

	struct list_head context_list;
	struct {
		struct list_head list;

		/* The hw wants to have a stable context identifier for the
		 * lifetime of the context (for OA, PASID, faults, etc).
		 * This is limited in execlists to 21 bits.
		 */
		struct ida hw_ida;
#define MAX_CONTEXT_HW_ID (1<<21) /* exclusive */
	} contexts;

	u32 fdi_rx_config;

@@ -3498,7 +3500,7 @@ i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
void i915_gem_object_unpin_from_display_plane(struct i915_vma *vma);
int i915_gem_object_attach_phys(struct drm_i915_gem_object *obj,
				int align);
int i915_gem_open(struct drm_device *dev, struct drm_file *file);
int i915_gem_open(struct drm_i915_private *i915, struct drm_file *file);
void i915_gem_release(struct drm_device *dev, struct drm_file *file);

int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
+6 −7
Original line number Diff line number Diff line
@@ -3098,7 +3098,7 @@ void i915_gem_set_wedged(struct drm_i915_private *dev_priv)

	stop_machine(__i915_gem_set_wedged_BKL, dev_priv, NULL);

	i915_gem_context_lost(dev_priv);
	i915_gem_contexts_lost(dev_priv);

	mod_delayed_work(dev_priv->wq, &dev_priv->gt.idle_work, 0);
}
@@ -4564,7 +4564,7 @@ int i915_gem_suspend(struct drm_i915_private *dev_priv)
		goto err_unlock;

	assert_kernel_context_is_current(dev_priv);
	i915_gem_context_lost(dev_priv);
	i915_gem_contexts_lost(dev_priv);
	mutex_unlock(&dev->struct_mutex);

	intel_guc_suspend(dev_priv);
@@ -4811,7 +4811,7 @@ int i915_gem_init(struct drm_i915_private *dev_priv)
	if (ret)
		goto out_unlock;

	ret = i915_gem_context_init(dev_priv);
	ret = i915_gem_contexts_init(dev_priv);
	if (ret)
		goto out_unlock;

@@ -4921,7 +4921,6 @@ i915_gem_load_init(struct drm_i915_private *dev_priv)
	if (err)
		goto err_priorities;

	INIT_LIST_HEAD(&dev_priv->context_list);
	INIT_WORK(&dev_priv->mm.free_work, __i915_gem_free_work);
	init_llist_head(&dev_priv->mm.free_list);
	INIT_LIST_HEAD(&dev_priv->mm.unbound_list);
@@ -5045,7 +5044,7 @@ void i915_gem_release(struct drm_device *dev, struct drm_file *file)
	}
}

int i915_gem_open(struct drm_device *dev, struct drm_file *file)
int i915_gem_open(struct drm_i915_private *i915, struct drm_file *file)
{
	struct drm_i915_file_private *file_priv;
	int ret;
@@ -5057,7 +5056,7 @@ int i915_gem_open(struct drm_device *dev, struct drm_file *file)
		return -ENOMEM;

	file->driver_priv = file_priv;
	file_priv->dev_priv = to_i915(dev);
	file_priv->dev_priv = i915;
	file_priv->file = file;
	INIT_LIST_HEAD(&file_priv->rps.link);

@@ -5066,7 +5065,7 @@ int i915_gem_open(struct drm_device *dev, struct drm_file *file)

	file_priv->bsd_engine = -1;

	ret = i915_gem_context_open(dev, file);
	ret = i915_gem_context_open(i915, file);
	if (ret)
		kfree(file_priv);

+19 −16
Original line number Diff line number Diff line
@@ -188,7 +188,7 @@ void i915_gem_context_free(struct kref *ctx_ref)

	list_del(&ctx->link);

	ida_simple_remove(&ctx->i915->context_hw_ida, ctx->hw_id);
	ida_simple_remove(&ctx->i915->contexts.hw_ida, ctx->hw_id);
	kfree(ctx);
}

@@ -205,7 +205,7 @@ static int assign_hw_id(struct drm_i915_private *dev_priv, unsigned *out)
{
	int ret;

	ret = ida_simple_get(&dev_priv->context_hw_ida,
	ret = ida_simple_get(&dev_priv->contexts.hw_ida,
			     0, MAX_CONTEXT_HW_ID, GFP_KERNEL);
	if (ret < 0) {
		/* Contexts are only released when no longer active.
@@ -213,7 +213,7 @@ static int assign_hw_id(struct drm_i915_private *dev_priv, unsigned *out)
		 * stale contexts and try again.
		 */
		i915_gem_retire_requests(dev_priv);
		ret = ida_simple_get(&dev_priv->context_hw_ida,
		ret = ida_simple_get(&dev_priv->contexts.hw_ida,
				     0, MAX_CONTEXT_HW_ID, GFP_KERNEL);
		if (ret < 0)
			return ret;
@@ -265,7 +265,7 @@ __create_hw_context(struct drm_i915_private *dev_priv,
	}

	kref_init(&ctx->ref);
	list_add_tail(&ctx->link, &dev_priv->context_list);
	list_add_tail(&ctx->link, &dev_priv->contexts.list);
	ctx->i915 = dev_priv;
	ctx->priority = I915_PRIORITY_NORMAL;

@@ -418,7 +418,7 @@ i915_gem_context_create_gvt(struct drm_device *dev)
	return ctx;
}

int i915_gem_context_init(struct drm_i915_private *dev_priv)
int i915_gem_contexts_init(struct drm_i915_private *dev_priv)
{
	struct i915_gem_context *ctx;

@@ -427,6 +427,8 @@ int i915_gem_context_init(struct drm_i915_private *dev_priv)
	if (WARN_ON(dev_priv->kernel_context))
		return 0;

	INIT_LIST_HEAD(&dev_priv->contexts.list);

	if (intel_vgpu_active(dev_priv) &&
	    HAS_LOGICAL_RING_CONTEXTS(dev_priv)) {
		if (!i915.enable_execlists) {
@@ -437,7 +439,7 @@ int i915_gem_context_init(struct drm_i915_private *dev_priv)

	/* Using the simple ida interface, the max is limited by sizeof(int) */
	BUILD_BUG_ON(MAX_CONTEXT_HW_ID > INT_MAX);
	ida_init(&dev_priv->context_hw_ida);
	ida_init(&dev_priv->contexts.hw_ida);

	ctx = i915_gem_create_context(dev_priv, NULL);
	if (IS_ERR(ctx)) {
@@ -463,7 +465,7 @@ int i915_gem_context_init(struct drm_i915_private *dev_priv)
	return 0;
}

void i915_gem_context_lost(struct drm_i915_private *dev_priv)
void i915_gem_contexts_lost(struct drm_i915_private *dev_priv)
{
	struct intel_engine_cs *engine;
	enum intel_engine_id id;
@@ -484,7 +486,7 @@ void i915_gem_context_lost(struct drm_i915_private *dev_priv)
	if (!i915.enable_execlists) {
		struct i915_gem_context *ctx;

		list_for_each_entry(ctx, &dev_priv->context_list, link) {
		list_for_each_entry(ctx, &dev_priv->contexts.list, link) {
			if (!i915_gem_context_is_default(ctx))
				continue;

@@ -503,7 +505,7 @@ void i915_gem_context_lost(struct drm_i915_private *dev_priv)
	}
}

void i915_gem_context_fini(struct drm_i915_private *dev_priv)
void i915_gem_contexts_fini(struct drm_i915_private *dev_priv)
{
	struct i915_gem_context *dctx = dev_priv->kernel_context;

@@ -514,7 +516,7 @@ void i915_gem_context_fini(struct drm_i915_private *dev_priv)
	context_close(dctx);
	dev_priv->kernel_context = NULL;

	ida_destroy(&dev_priv->context_hw_ida);
	ida_destroy(&dev_priv->contexts.hw_ida);
}

static int context_idr_cleanup(int id, void *p, void *data)
@@ -525,16 +527,17 @@ static int context_idr_cleanup(int id, void *p, void *data)
	return 0;
}

int i915_gem_context_open(struct drm_device *dev, struct drm_file *file)
int i915_gem_context_open(struct drm_i915_private *i915,
			  struct drm_file *file)
{
	struct drm_i915_file_private *file_priv = file->driver_priv;
	struct i915_gem_context *ctx;

	idr_init(&file_priv->context_idr);

	mutex_lock(&dev->struct_mutex);
	ctx = i915_gem_create_context(to_i915(dev), file_priv);
	mutex_unlock(&dev->struct_mutex);
	mutex_lock(&i915->drm.struct_mutex);
	ctx = i915_gem_create_context(i915, file_priv);
	mutex_unlock(&i915->drm.struct_mutex);

	GEM_BUG_ON(i915_gem_context_is_kernel(ctx));

@@ -546,11 +549,11 @@ int i915_gem_context_open(struct drm_device *dev, struct drm_file *file)
	return 0;
}

void i915_gem_context_close(struct drm_device *dev, struct drm_file *file)
void i915_gem_context_close(struct drm_file *file)
{
	struct drm_i915_file_private *file_priv = file->driver_priv;

	lockdep_assert_held(&dev->struct_mutex);
	lockdep_assert_held(&file_priv->dev_priv->drm.struct_mutex);

	idr_for_each(&file_priv->context_idr, context_idr_cleanup, NULL);
	idr_destroy(&file_priv->context_idr);
Loading