Commit 8d208a5e authored by Luca Coelho's avatar Luca Coelho Committed by Jani Nikula
Browse files

drm/i915: use pointer to i915 instead of rpm in wakeref



Currently a pointer to an intel_runtime_pm structure is stored in the
wake reference structures so the runtime data can be accessed.  We can
save the entire device information (drm_i915_private) instead, since
we'll need to reference the new workqueue we'll add in subsequent
patches.

Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/ec0eb5149120d04f3d9870d7671ef10103e6fc29.1686231190.git.jani.nikula@intel.com
parent 3fecd469
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -296,9 +296,7 @@ static const struct intel_wakeref_ops wf_ops = {

void intel_engine_init__pm(struct intel_engine_cs *engine)
{
	struct intel_runtime_pm *rpm = engine->uncore->rpm;

	intel_wakeref_init(&engine->wakeref, rpm, &wf_ops);
	intel_wakeref_init(&engine->wakeref, engine->i915, &wf_ops);
	intel_engine_init_heartbeat(engine);

	intel_gsc_idle_msg_enable(engine);
+1 −1
Original line number Diff line number Diff line
@@ -137,7 +137,7 @@ void intel_gt_pm_init_early(struct intel_gt *gt)
	 * runtime_pm is per-device rather than per-tile, so this is still the
	 * correct structure.
	 */
	intel_wakeref_init(&gt->wakeref, &gt->i915->runtime_pm, &wf_ops);
	intel_wakeref_init(&gt->wakeref, gt->i915, &wf_ops);
	seqcount_mutex_init(&gt->stats.lock, &gt->wakeref.mutex);
}

+1 −1
Original line number Diff line number Diff line
@@ -658,5 +658,5 @@ void intel_runtime_pm_init_early(struct intel_runtime_pm *rpm)
	init_intel_runtime_pm_wakeref(rpm);
	INIT_LIST_HEAD(&rpm->lmem_userfault_list);
	spin_lock_init(&rpm->lmem_userfault_lock);
	intel_wakeref_auto_init(&rpm->userfault_wakeref, rpm);
	intel_wakeref_auto_init(&rpm->userfault_wakeref, i915);
}
+11 −9
Original line number Diff line number Diff line
@@ -8,17 +8,18 @@

#include "intel_runtime_pm.h"
#include "intel_wakeref.h"
#include "i915_drv.h"

static void rpm_get(struct intel_wakeref *wf)
{
	wf->wakeref = intel_runtime_pm_get(wf->rpm);
	wf->wakeref = intel_runtime_pm_get(&wf->i915->runtime_pm);
}

static void rpm_put(struct intel_wakeref *wf)
{
	intel_wakeref_t wakeref = fetch_and_zero(&wf->wakeref);

	intel_runtime_pm_put(wf->rpm, wakeref);
	intel_runtime_pm_put(&wf->i915->runtime_pm, wakeref);
	INTEL_WAKEREF_BUG_ON(!wakeref);
}

@@ -94,11 +95,11 @@ static void __intel_wakeref_put_work(struct work_struct *wrk)
}

void __intel_wakeref_init(struct intel_wakeref *wf,
			  struct intel_runtime_pm *rpm,
			  struct drm_i915_private *i915,
			  const struct intel_wakeref_ops *ops,
			  struct intel_wakeref_lockclass *key)
{
	wf->rpm = rpm;
	wf->i915 = i915;
	wf->ops = ops;

	__mutex_init(&wf->mutex, "wakeref.mutex", &key->mutex);
@@ -137,17 +138,17 @@ static void wakeref_auto_timeout(struct timer_list *t)
	wakeref = fetch_and_zero(&wf->wakeref);
	spin_unlock_irqrestore(&wf->lock, flags);

	intel_runtime_pm_put(wf->rpm, wakeref);
	intel_runtime_pm_put(&wf->i915->runtime_pm, wakeref);
}

void intel_wakeref_auto_init(struct intel_wakeref_auto *wf,
			     struct intel_runtime_pm *rpm)
			     struct drm_i915_private *i915)
{
	spin_lock_init(&wf->lock);
	timer_setup(&wf->timer, wakeref_auto_timeout, 0);
	refcount_set(&wf->count, 0);
	wf->wakeref = 0;
	wf->rpm = rpm;
	wf->i915 = i915;
}

void intel_wakeref_auto(struct intel_wakeref_auto *wf, unsigned long timeout)
@@ -161,13 +162,14 @@ void intel_wakeref_auto(struct intel_wakeref_auto *wf, unsigned long timeout)
	}

	/* Our mission is that we only extend an already active wakeref */
	assert_rpm_wakelock_held(wf->rpm);
	assert_rpm_wakelock_held(&wf->i915->runtime_pm);

	if (!refcount_inc_not_zero(&wf->count)) {
		spin_lock_irqsave(&wf->lock, flags);
		if (!refcount_inc_not_zero(&wf->count)) {
			INTEL_WAKEREF_BUG_ON(wf->wakeref);
			wf->wakeref = intel_runtime_pm_get_if_in_use(wf->rpm);
			wf->wakeref =
				intel_runtime_pm_get_if_in_use(&wf->i915->runtime_pm);
			refcount_set(&wf->count, 1);
		}
		spin_unlock_irqrestore(&wf->lock, flags);
+6 −6
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ struct intel_wakeref {

	intel_wakeref_t wakeref;

	struct intel_runtime_pm *rpm;
	struct drm_i915_private *i915;
	const struct intel_wakeref_ops *ops;

	struct delayed_work work;
@@ -51,13 +51,13 @@ struct intel_wakeref_lockclass {
};

void __intel_wakeref_init(struct intel_wakeref *wf,
			  struct intel_runtime_pm *rpm,
			  struct drm_i915_private *i915,
			  const struct intel_wakeref_ops *ops,
			  struct intel_wakeref_lockclass *key);
#define intel_wakeref_init(wf, rpm, ops) do {				\
#define intel_wakeref_init(wf, i915, ops) do {				\
	static struct intel_wakeref_lockclass __key;			\
									\
	__intel_wakeref_init((wf), (rpm), (ops), &__key);		\
	__intel_wakeref_init((wf), (i915), (ops), &__key);		\
} while (0)

int __intel_wakeref_get_first(struct intel_wakeref *wf);
@@ -262,7 +262,7 @@ __intel_wakeref_defer_park(struct intel_wakeref *wf)
int intel_wakeref_wait_for_idle(struct intel_wakeref *wf);

struct intel_wakeref_auto {
	struct intel_runtime_pm *rpm;
	struct drm_i915_private *i915;
	struct timer_list timer;
	intel_wakeref_t wakeref;
	spinlock_t lock;
@@ -287,7 +287,7 @@ struct intel_wakeref_auto {
void intel_wakeref_auto(struct intel_wakeref_auto *wf, unsigned long timeout);

void intel_wakeref_auto_init(struct intel_wakeref_auto *wf,
			     struct intel_runtime_pm *rpm);
			     struct drm_i915_private *i915);
void intel_wakeref_auto_fini(struct intel_wakeref_auto *wf);

#endif /* INTEL_WAKEREF_H */