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

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
...@@ -296,9 +296,7 @@ static const struct intel_wakeref_ops wf_ops = { ...@@ -296,9 +296,7 @@ static const struct intel_wakeref_ops wf_ops = {
void intel_engine_init__pm(struct intel_engine_cs *engine) void intel_engine_init__pm(struct intel_engine_cs *engine)
{ {
struct intel_runtime_pm *rpm = engine->uncore->rpm; intel_wakeref_init(&engine->wakeref, engine->i915, &wf_ops);
intel_wakeref_init(&engine->wakeref, rpm, &wf_ops);
intel_engine_init_heartbeat(engine); intel_engine_init_heartbeat(engine);
intel_gsc_idle_msg_enable(engine); intel_gsc_idle_msg_enable(engine);
......
...@@ -137,7 +137,7 @@ void intel_gt_pm_init_early(struct intel_gt *gt) ...@@ -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 * runtime_pm is per-device rather than per-tile, so this is still the
* correct structure. * 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); seqcount_mutex_init(&gt->stats.lock, &gt->wakeref.mutex);
} }
......
...@@ -658,5 +658,5 @@ void intel_runtime_pm_init_early(struct intel_runtime_pm *rpm) ...@@ -658,5 +658,5 @@ void intel_runtime_pm_init_early(struct intel_runtime_pm *rpm)
init_intel_runtime_pm_wakeref(rpm); init_intel_runtime_pm_wakeref(rpm);
INIT_LIST_HEAD(&rpm->lmem_userfault_list); INIT_LIST_HEAD(&rpm->lmem_userfault_list);
spin_lock_init(&rpm->lmem_userfault_lock); spin_lock_init(&rpm->lmem_userfault_lock);
intel_wakeref_auto_init(&rpm->userfault_wakeref, rpm); intel_wakeref_auto_init(&rpm->userfault_wakeref, i915);
} }
...@@ -8,17 +8,18 @@ ...@@ -8,17 +8,18 @@
#include "intel_runtime_pm.h" #include "intel_runtime_pm.h"
#include "intel_wakeref.h" #include "intel_wakeref.h"
#include "i915_drv.h"
static void rpm_get(struct intel_wakeref *wf) 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) static void rpm_put(struct intel_wakeref *wf)
{ {
intel_wakeref_t wakeref = fetch_and_zero(&wf->wakeref); 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); INTEL_WAKEREF_BUG_ON(!wakeref);
} }
...@@ -94,11 +95,11 @@ static void __intel_wakeref_put_work(struct work_struct *wrk) ...@@ -94,11 +95,11 @@ static void __intel_wakeref_put_work(struct work_struct *wrk)
} }
void __intel_wakeref_init(struct intel_wakeref *wf, void __intel_wakeref_init(struct intel_wakeref *wf,
struct intel_runtime_pm *rpm, struct drm_i915_private *i915,
const struct intel_wakeref_ops *ops, const struct intel_wakeref_ops *ops,
struct intel_wakeref_lockclass *key) struct intel_wakeref_lockclass *key)
{ {
wf->rpm = rpm; wf->i915 = i915;
wf->ops = ops; wf->ops = ops;
__mutex_init(&wf->mutex, "wakeref.mutex", &key->mutex); __mutex_init(&wf->mutex, "wakeref.mutex", &key->mutex);
...@@ -137,17 +138,17 @@ static void wakeref_auto_timeout(struct timer_list *t) ...@@ -137,17 +138,17 @@ static void wakeref_auto_timeout(struct timer_list *t)
wakeref = fetch_and_zero(&wf->wakeref); wakeref = fetch_and_zero(&wf->wakeref);
spin_unlock_irqrestore(&wf->lock, flags); 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, 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); spin_lock_init(&wf->lock);
timer_setup(&wf->timer, wakeref_auto_timeout, 0); timer_setup(&wf->timer, wakeref_auto_timeout, 0);
refcount_set(&wf->count, 0); refcount_set(&wf->count, 0);
wf->wakeref = 0; wf->wakeref = 0;
wf->rpm = rpm; wf->i915 = i915;
} }
void intel_wakeref_auto(struct intel_wakeref_auto *wf, unsigned long timeout) 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) ...@@ -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 */ /* 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)) { if (!refcount_inc_not_zero(&wf->count)) {
spin_lock_irqsave(&wf->lock, flags); spin_lock_irqsave(&wf->lock, flags);
if (!refcount_inc_not_zero(&wf->count)) { if (!refcount_inc_not_zero(&wf->count)) {
INTEL_WAKEREF_BUG_ON(wf->wakeref); 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); refcount_set(&wf->count, 1);
} }
spin_unlock_irqrestore(&wf->lock, flags); spin_unlock_irqrestore(&wf->lock, flags);
......
...@@ -39,7 +39,7 @@ struct intel_wakeref { ...@@ -39,7 +39,7 @@ struct intel_wakeref {
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
struct intel_runtime_pm *rpm; struct drm_i915_private *i915;
const struct intel_wakeref_ops *ops; const struct intel_wakeref_ops *ops;
struct delayed_work work; struct delayed_work work;
...@@ -51,13 +51,13 @@ struct intel_wakeref_lockclass { ...@@ -51,13 +51,13 @@ struct intel_wakeref_lockclass {
}; };
void __intel_wakeref_init(struct intel_wakeref *wf, void __intel_wakeref_init(struct intel_wakeref *wf,
struct intel_runtime_pm *rpm, struct drm_i915_private *i915,
const struct intel_wakeref_ops *ops, const struct intel_wakeref_ops *ops,
struct intel_wakeref_lockclass *key); 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; \ static struct intel_wakeref_lockclass __key; \
\ \
__intel_wakeref_init((wf), (rpm), (ops), &__key); \ __intel_wakeref_init((wf), (i915), (ops), &__key); \
} while (0) } while (0)
int __intel_wakeref_get_first(struct intel_wakeref *wf); int __intel_wakeref_get_first(struct intel_wakeref *wf);
...@@ -262,7 +262,7 @@ __intel_wakeref_defer_park(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); int intel_wakeref_wait_for_idle(struct intel_wakeref *wf);
struct intel_wakeref_auto { struct intel_wakeref_auto {
struct intel_runtime_pm *rpm; struct drm_i915_private *i915;
struct timer_list timer; struct timer_list timer;
intel_wakeref_t wakeref; intel_wakeref_t wakeref;
spinlock_t lock; spinlock_t lock;
...@@ -287,7 +287,7 @@ struct intel_wakeref_auto { ...@@ -287,7 +287,7 @@ struct intel_wakeref_auto {
void intel_wakeref_auto(struct intel_wakeref_auto *wf, unsigned long timeout); void intel_wakeref_auto(struct intel_wakeref_auto *wf, unsigned long timeout);
void intel_wakeref_auto_init(struct intel_wakeref_auto *wf, 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); void intel_wakeref_auto_fini(struct intel_wakeref_auto *wf);
#endif /* INTEL_WAKEREF_H */ #endif /* INTEL_WAKEREF_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment