Commit 390c8205 authored by Tvrtko Ursulin's avatar Tvrtko Ursulin
Browse files

drm/i915: Compartmentalize timeline_init/park/fini



Continuing on the theme of better logical organization of our code, make
the first step towards making the timeline code better isolated from wider
struct drm_i915_private.

Signed-off-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20190621070811.7006-25-tvrtko.ursulin@linux.intel.com
parent baea429d
Loading
Loading
Loading
Loading
+41 −26
Original line number Diff line number Diff line
@@ -261,18 +261,23 @@ int i915_timeline_init(struct drm_i915_private *i915,
	return 0;
}

void i915_timelines_init(struct drm_i915_private *i915)
static void timelines_init(struct intel_gt *gt)
{
	struct i915_gt_timelines *gt = &i915->gt.timelines;
	struct i915_gt_timelines *timelines = &gt->timelines;

	mutex_init(&gt->mutex);
	INIT_LIST_HEAD(&gt->active_list);
	mutex_init(&timelines->mutex);
	INIT_LIST_HEAD(&timelines->active_list);

	spin_lock_init(&gt->hwsp_lock);
	INIT_LIST_HEAD(&gt->hwsp_free_list);
	spin_lock_init(&timelines->hwsp_lock);
	INIT_LIST_HEAD(&timelines->hwsp_free_list);

	/* via i915_gem_wait_for_idle() */
	i915_gem_shrinker_taints_mutex(i915, &gt->mutex);
	i915_gem_shrinker_taints_mutex(gt->i915, &timelines->mutex);
}

void i915_timelines_init(struct drm_i915_private *i915)
{
	timelines_init(&i915->gt);
}

static void timeline_add_to_active(struct i915_timeline *tl)
@@ -293,6 +298,24 @@ static void timeline_remove_from_active(struct i915_timeline *tl)
	mutex_unlock(&gt->mutex);
}

static void timelines_park(struct intel_gt *gt)
{
	struct i915_gt_timelines *timelines = &gt->timelines;
	struct i915_timeline *timeline;

	mutex_lock(&timelines->mutex);
	list_for_each_entry(timeline, &timelines->active_list, link) {
		/*
		 * All known fences are completed so we can scrap
		 * the current sync point tracking and start afresh,
		 * any attempt to wait upon a previous sync point
		 * will be skipped as the fence was signaled.
		 */
		i915_syncmap_free(&timeline->sync);
	}
	mutex_unlock(&timelines->mutex);
}

/**
 * i915_timelines_park - called when the driver idles
 * @i915: the drm_i915_private device
@@ -305,20 +328,7 @@ static void timeline_remove_from_active(struct i915_timeline *tl)
 */
void i915_timelines_park(struct drm_i915_private *i915)
{
	struct i915_gt_timelines *gt = &i915->gt.timelines;
	struct i915_timeline *timeline;

	mutex_lock(&gt->mutex);
	list_for_each_entry(timeline, &gt->active_list, link) {
		/*
		 * All known fences are completed so we can scrap
		 * the current sync point tracking and start afresh,
		 * any attempt to wait upon a previous sync point
		 * will be skipped as the fence was signaled.
		 */
		i915_syncmap_free(&timeline->sync);
	}
	mutex_unlock(&gt->mutex);
	timelines_park(&i915->gt);
}

void i915_timeline_fini(struct i915_timeline *timeline)
@@ -563,14 +573,19 @@ void __i915_timeline_free(struct kref *kref)
	kfree(timeline);
}

void i915_timelines_fini(struct drm_i915_private *i915)
static void timelines_fini(struct intel_gt *gt)
{
	struct i915_gt_timelines *gt = &i915->gt.timelines;
	struct i915_gt_timelines *timelines = &gt->timelines;

	GEM_BUG_ON(!list_empty(&gt->active_list));
	GEM_BUG_ON(!list_empty(&gt->hwsp_free_list));
	GEM_BUG_ON(!list_empty(&timelines->active_list));
	GEM_BUG_ON(!list_empty(&timelines->hwsp_free_list));

	mutex_destroy(&gt->mutex);
	mutex_destroy(&timelines->mutex);
}

void i915_timelines_fini(struct drm_i915_private *i915)
{
	timelines_fini(&i915->gt);
}

#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)