Message ID | 20190516215634.16675-2-daniele.ceraolospurio@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Runtime PM encapsulation | expand |
On Thu, 16 May 2019, Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> wrote: > As a first step towards updating the code to work on the runtime_pm > structure instead of i915, rework all the internals to use and pass > around that. > > Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> > --- > drivers/gpu/drm/i915/i915_drv.h | 2 + > drivers/gpu/drm/i915/intel_drv.h | 10 +- > drivers/gpu/drm/i915/intel_runtime_pm.c | 152 ++++++++++++------------ > 3 files changed, 82 insertions(+), 82 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index 5801f5407589..474074c7f395 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -1177,6 +1177,8 @@ struct skl_wm_params { > */ > struct i915_runtime_pm { > atomic_t wakeref_count; > + struct device *kdev; This could use a small comment to say what device this is. BR, Jani. > + bool available; > bool suspended; > bool irqs_enabled; > > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h > index 30b2d6ed2d53..bd04f394fbd3 100644 > --- a/drivers/gpu/drm/i915/intel_drv.h > +++ b/drivers/gpu/drm/i915/intel_drv.h > @@ -1662,13 +1662,17 @@ ____assert_rpm_wakelock_held(struct i915_runtime_pm *rpm, int wakeref_count) > } > > static inline void > -assert_rpm_raw_wakeref_held(struct drm_i915_private *i915) > +__assert_rpm_raw_wakeref_held(struct i915_runtime_pm *rpm) > { > - struct i915_runtime_pm *rpm = &i915->runtime_pm; > - > ____assert_rpm_raw_wakeref_held(rpm, atomic_read(&rpm->wakeref_count)); > } > > +static inline void > +assert_rpm_raw_wakeref_held(struct drm_i915_private *i915) > +{ > + __assert_rpm_raw_wakeref_held(&i915->runtime_pm); > +} > + > static inline void > __assert_rpm_wakelock_held(struct i915_runtime_pm *rpm) > { > diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c > index b4abababdf6c..2e21f562df44 100644 > --- a/drivers/gpu/drm/i915/intel_runtime_pm.c > +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c > @@ -60,19 +60,19 @@ > * present for a given platform. > */ > > -static intel_wakeref_t intel_runtime_pm_get_raw(struct drm_i915_private *i915); > +static intel_wakeref_t intel_runtime_pm_get_raw(struct i915_runtime_pm *rpm); > static void > -__intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref, > +__intel_runtime_pm_put(struct i915_runtime_pm *rpm, intel_wakeref_t wref, > bool wakelock); > > #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) > static void > -intel_runtime_pm_put_raw(struct drm_i915_private *i915, intel_wakeref_t wref); > +intel_runtime_pm_put_raw(struct i915_runtime_pm *rpm, intel_wakeref_t wref); > #else > -static inline void intel_runtime_pm_put_raw(struct drm_i915_private *i915, > +static inline void intel_runtime_pm_put_raw(struct i915_runtime_pm *rpm, > intel_wakeref_t wref) > { > - __intel_runtime_pm_put(i915, -1, false); > + __intel_runtime_pm_put(rpm, -1, false); > } > #endif > > @@ -112,21 +112,18 @@ static void __print_depot_stack(depot_stack_handle_t stack, > snprint_stack_trace(buf, sz, &trace, indent); > } > > -static void init_intel_runtime_pm_wakeref(struct drm_i915_private *i915) > +static void init_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm) > { > - struct i915_runtime_pm *rpm = &i915->runtime_pm; > - > spin_lock_init(&rpm->debug.lock); > } > > static noinline depot_stack_handle_t > -track_intel_runtime_pm_wakeref(struct drm_i915_private *i915) > +track_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm) > { > - struct i915_runtime_pm *rpm = &i915->runtime_pm; > depot_stack_handle_t stack, *stacks; > unsigned long flags; > > - if (!HAS_RUNTIME_PM(i915)) > + if (!rpm->available) > return -1; > > stack = __save_depot_stack(); > @@ -153,10 +150,9 @@ track_intel_runtime_pm_wakeref(struct drm_i915_private *i915) > return stack; > } > > -static void untrack_intel_runtime_pm_wakeref(struct drm_i915_private *i915, > +static void untrack_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm, > depot_stack_handle_t stack) > { > - struct i915_runtime_pm *rpm = &i915->runtime_pm; > unsigned long flags, n; > bool found = false; > > @@ -274,9 +270,8 @@ dump_and_free_wakeref_tracking(struct intel_runtime_pm_debug *debug) > } > > static noinline void > -__intel_wakeref_dec_and_check_tracking(struct drm_i915_private *i915) > +__intel_wakeref_dec_and_check_tracking(struct i915_runtime_pm *rpm) > { > - struct i915_runtime_pm *rpm = &i915->runtime_pm; > struct intel_runtime_pm_debug dbg = {}; > unsigned long flags; > > @@ -292,9 +287,8 @@ __intel_wakeref_dec_and_check_tracking(struct drm_i915_private *i915) > } > > static noinline void > -untrack_all_intel_runtime_pm_wakerefs(struct drm_i915_private *i915) > +untrack_all_intel_runtime_pm_wakerefs(struct i915_runtime_pm *rpm) > { > - struct i915_runtime_pm *rpm = &i915->runtime_pm; > struct intel_runtime_pm_debug dbg = {}; > unsigned long flags; > > @@ -345,61 +339,57 @@ void print_intel_runtime_pm_wakeref(struct drm_i915_private *i915, > > #else > > -static void init_intel_runtime_pm_wakeref(struct drm_i915_private *i915) > +static void init_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm) > { > } > > static depot_stack_handle_t > -track_intel_runtime_pm_wakeref(struct drm_i915_private *i915) > +track_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm) > { > return -1; > } > > -static void untrack_intel_runtime_pm_wakeref(struct drm_i915_private *i915, > +static void untrack_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm, > intel_wakeref_t wref) > { > } > > static void > -__intel_wakeref_dec_and_check_tracking(struct drm_i915_private *i915) > +__intel_wakeref_dec_and_check_tracking(struct i915_runtime_pm *rpm) > { > - atomic_dec(&i915->runtime_pm.wakeref_count); > + atomic_dec(&rpm->wakeref_count); > } > > static void > -untrack_all_intel_runtime_pm_wakerefs(struct drm_i915_private *i915) > +untrack_all_intel_runtime_pm_wakerefs(struct i915_runtime_pm *rpm) > { > } > > #endif > > static void > -intel_runtime_pm_acquire(struct drm_i915_private *i915, bool wakelock) > +intel_runtime_pm_acquire(struct i915_runtime_pm *rpm, bool wakelock) > { > - struct i915_runtime_pm *rpm = &i915->runtime_pm; > - > if (wakelock) { > atomic_add(1 + INTEL_RPM_WAKELOCK_BIAS, &rpm->wakeref_count); > - assert_rpm_wakelock_held(i915); > + __assert_rpm_wakelock_held(rpm); > } else { > atomic_inc(&rpm->wakeref_count); > - assert_rpm_raw_wakeref_held(i915); > + __assert_rpm_raw_wakeref_held(rpm); > } > } > > static void > -intel_runtime_pm_release(struct drm_i915_private *i915, int wakelock) > +intel_runtime_pm_release(struct i915_runtime_pm *rpm, int wakelock) > { > - struct i915_runtime_pm *rpm = &i915->runtime_pm; > - > if (wakelock) { > - assert_rpm_wakelock_held(i915); > + __assert_rpm_wakelock_held(rpm); > atomic_sub(INTEL_RPM_WAKELOCK_BIAS, &rpm->wakeref_count); > } else { > - assert_rpm_raw_wakeref_held(i915); > + __assert_rpm_raw_wakeref_held(rpm); > } > > - __intel_wakeref_dec_and_check_tracking(i915); > + __intel_wakeref_dec_and_check_tracking(rpm); > } > > bool intel_display_power_well_is_enabled(struct drm_i915_private *dev_priv, > @@ -2030,7 +2020,7 @@ intel_display_power_grab_async_put_ref(struct drm_i915_private *dev_priv, > goto out_verify; > > cancel_delayed_work(&power_domains->async_put_work); > - intel_runtime_pm_put_raw(dev_priv, > + intel_runtime_pm_put_raw(&dev_priv->runtime_pm, > fetch_and_zero(&power_domains->async_put_wakeref)); > out_verify: > verify_async_put_domains_state(power_domains); > @@ -2219,7 +2209,8 @@ intel_display_power_put_async_work(struct work_struct *work) > container_of(work, struct drm_i915_private, > power_domains.async_put_work.work); > struct i915_power_domains *power_domains = &dev_priv->power_domains; > - intel_wakeref_t new_work_wakeref = intel_runtime_pm_get_raw(dev_priv); > + struct i915_runtime_pm *rpm = &dev_priv->runtime_pm; > + intel_wakeref_t new_work_wakeref = intel_runtime_pm_get_raw(rpm); > intel_wakeref_t old_work_wakeref = 0; > > mutex_lock(&power_domains->lock); > @@ -2249,9 +2240,9 @@ intel_display_power_put_async_work(struct work_struct *work) > mutex_unlock(&power_domains->lock); > > if (old_work_wakeref) > - intel_runtime_pm_put_raw(dev_priv, old_work_wakeref); > + intel_runtime_pm_put_raw(rpm, old_work_wakeref); > if (new_work_wakeref) > - intel_runtime_pm_put_raw(dev_priv, new_work_wakeref); > + intel_runtime_pm_put_raw(rpm, new_work_wakeref); > } > > /** > @@ -2269,7 +2260,8 @@ void __intel_display_power_put_async(struct drm_i915_private *i915, > intel_wakeref_t wakeref) > { > struct i915_power_domains *power_domains = &i915->power_domains; > - intel_wakeref_t work_wakeref = intel_runtime_pm_get_raw(i915); > + struct i915_runtime_pm *rpm = &i915->runtime_pm; > + intel_wakeref_t work_wakeref = intel_runtime_pm_get_raw(rpm); > > mutex_lock(&power_domains->lock); > > @@ -2296,7 +2288,7 @@ void __intel_display_power_put_async(struct drm_i915_private *i915, > mutex_unlock(&power_domains->lock); > > if (work_wakeref) > - intel_runtime_pm_put_raw(i915, work_wakeref); > + intel_runtime_pm_put_raw(rpm, work_wakeref); > > intel_runtime_pm_put(i915, wakeref); > } > @@ -2334,7 +2326,7 @@ void intel_display_power_flush_work(struct drm_i915_private *i915) > mutex_unlock(&power_domains->lock); > > if (work_wakeref) > - intel_runtime_pm_put_raw(i915, work_wakeref); > + intel_runtime_pm_put_raw(&i915->runtime_pm, work_wakeref); > } > > /** > @@ -4996,24 +4988,22 @@ static void intel_power_domains_verify_state(struct drm_i915_private *i915) > > #endif > > -static intel_wakeref_t __intel_runtime_pm_get(struct drm_i915_private *i915, > +static intel_wakeref_t __intel_runtime_pm_get(struct i915_runtime_pm *rpm, > bool wakelock) > { > - struct pci_dev *pdev = i915->drm.pdev; > - struct device *kdev = &pdev->dev; > int ret; > > - ret = pm_runtime_get_sync(kdev); > + ret = pm_runtime_get_sync(rpm->kdev); > WARN_ONCE(ret < 0, "pm_runtime_get_sync() failed: %d\n", ret); > > - intel_runtime_pm_acquire(i915, wakelock); > + intel_runtime_pm_acquire(rpm, wakelock); > > - return track_intel_runtime_pm_wakeref(i915); > + return track_intel_runtime_pm_wakeref(rpm); > } > > -static intel_wakeref_t intel_runtime_pm_get_raw(struct drm_i915_private *i915) > +static intel_wakeref_t intel_runtime_pm_get_raw(struct i915_runtime_pm *rpm) > { > - return __intel_runtime_pm_get(i915, false); > + return __intel_runtime_pm_get(rpm, false); > } > > /** > @@ -5030,7 +5020,7 @@ static intel_wakeref_t intel_runtime_pm_get_raw(struct drm_i915_private *i915) > */ > intel_wakeref_t intel_runtime_pm_get(struct drm_i915_private *i915) > { > - return __intel_runtime_pm_get(i915, true); > + return __intel_runtime_pm_get(&i915->runtime_pm, true); > } > > /** > @@ -5049,23 +5039,22 @@ intel_wakeref_t intel_runtime_pm_get(struct drm_i915_private *i915) > */ > intel_wakeref_t intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915) > { > - if (IS_ENABLED(CONFIG_PM)) { > - struct pci_dev *pdev = i915->drm.pdev; > - struct device *kdev = &pdev->dev; > + struct i915_runtime_pm *rpm = &i915->runtime_pm; > > + if (IS_ENABLED(CONFIG_PM)) { > /* > * In cases runtime PM is disabled by the RPM core and we get > * an -EINVAL return value we are not supposed to call this > * function, since the power state is undefined. This applies > * atm to the late/early system suspend/resume handlers. > */ > - if (pm_runtime_get_if_in_use(kdev) <= 0) > + if (pm_runtime_get_if_in_use(rpm->kdev) <= 0) > return 0; > } > > - intel_runtime_pm_acquire(i915, true); > + intel_runtime_pm_acquire(rpm, true); > > - return track_intel_runtime_pm_wakeref(i915); > + return track_intel_runtime_pm_wakeref(rpm); > } > > /** > @@ -5089,27 +5078,25 @@ intel_wakeref_t intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915) > */ > intel_wakeref_t intel_runtime_pm_get_noresume(struct drm_i915_private *i915) > { > - struct pci_dev *pdev = i915->drm.pdev; > - struct device *kdev = &pdev->dev; > + struct i915_runtime_pm *rpm = &i915->runtime_pm; > > - assert_rpm_wakelock_held(i915); > - pm_runtime_get_noresume(kdev); > + __assert_rpm_wakelock_held(rpm); > + pm_runtime_get_noresume(rpm->kdev); > > - intel_runtime_pm_acquire(i915, true); > + intel_runtime_pm_acquire(rpm, true); > > - return track_intel_runtime_pm_wakeref(i915); > + return track_intel_runtime_pm_wakeref(rpm); > } > > -static void __intel_runtime_pm_put(struct drm_i915_private *i915, > +static void __intel_runtime_pm_put(struct i915_runtime_pm *rpm, > intel_wakeref_t wref, > bool wakelock) > { > - struct pci_dev *pdev = i915->drm.pdev; > - struct device *kdev = &pdev->dev; > + struct device *kdev = rpm->kdev; > > - untrack_intel_runtime_pm_wakeref(i915, wref); > + untrack_intel_runtime_pm_wakeref(rpm, wref); > > - intel_runtime_pm_release(i915, wakelock); > + intel_runtime_pm_release(rpm, wakelock); > > pm_runtime_mark_last_busy(kdev); > pm_runtime_put_autosuspend(kdev); > @@ -5117,9 +5104,9 @@ static void __intel_runtime_pm_put(struct drm_i915_private *i915, > > #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) > static void > -intel_runtime_pm_put_raw(struct drm_i915_private *i915, intel_wakeref_t wref) > +intel_runtime_pm_put_raw(struct i915_runtime_pm *rpm, intel_wakeref_t wref) > { > - __intel_runtime_pm_put(i915, wref, false); > + __intel_runtime_pm_put(rpm, wref, false); > } > #endif > > @@ -5137,7 +5124,7 @@ intel_runtime_pm_put_raw(struct drm_i915_private *i915, intel_wakeref_t wref) > */ > void intel_runtime_pm_put_unchecked(struct drm_i915_private *i915) > { > - __intel_runtime_pm_put(i915, -1, true); > + __intel_runtime_pm_put(&i915->runtime_pm, -1, true); > } > > #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) > @@ -5152,7 +5139,7 @@ void intel_runtime_pm_put_unchecked(struct drm_i915_private *i915) > */ > void intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref) > { > - __intel_runtime_pm_put(i915, wref, true); > + __intel_runtime_pm_put(&i915->runtime_pm, wref, true); > } > #endif > > @@ -5168,8 +5155,8 @@ void intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref) > */ > void intel_runtime_pm_enable(struct drm_i915_private *i915) > { > - struct pci_dev *pdev = i915->drm.pdev; > - struct device *kdev = &pdev->dev; > + struct i915_runtime_pm *rpm = &i915->runtime_pm; > + struct device *kdev = rpm->kdev; > > /* > * Disable the system suspend direct complete optimization, which can > @@ -5190,7 +5177,7 @@ void intel_runtime_pm_enable(struct drm_i915_private *i915) > * so the driver's own RPM reference tracking asserts also work on > * platforms without RPM support. > */ > - if (!HAS_RUNTIME_PM(i915)) { > + if (!rpm->available) { > int ret; > > pm_runtime_dont_use_autosuspend(kdev); > @@ -5210,8 +5197,8 @@ void intel_runtime_pm_enable(struct drm_i915_private *i915) > > void intel_runtime_pm_disable(struct drm_i915_private *i915) > { > - struct pci_dev *pdev = i915->drm.pdev; > - struct device *kdev = &pdev->dev; > + struct i915_runtime_pm *rpm = &i915->runtime_pm; > + struct device *kdev = rpm->kdev; > > /* Transfer rpm ownership back to core */ > WARN(pm_runtime_get_sync(kdev) < 0, > @@ -5219,7 +5206,7 @@ void intel_runtime_pm_disable(struct drm_i915_private *i915) > > pm_runtime_dont_use_autosuspend(kdev); > > - if (!HAS_RUNTIME_PM(i915)) > + if (!rpm->available) > pm_runtime_put(kdev); > } > > @@ -5233,10 +5220,17 @@ void intel_runtime_pm_cleanup(struct drm_i915_private *i915) > intel_rpm_raw_wakeref_count(count), > intel_rpm_wakelock_count(count)); > > - untrack_all_intel_runtime_pm_wakerefs(i915); > + untrack_all_intel_runtime_pm_wakerefs(rpm); > } > > void intel_runtime_pm_init_early(struct drm_i915_private *i915) > { > - init_intel_runtime_pm_wakeref(i915); > + struct i915_runtime_pm *rpm = &i915->runtime_pm; > + struct pci_dev *pdev = i915->drm.pdev; > + struct device *kdev = &pdev->dev; > + > + rpm->kdev = kdev; > + rpm->available = HAS_RUNTIME_PM(i915); > + > + init_intel_runtime_pm_wakeref(rpm); > }
On 5/21/19 1:45 AM, Jani Nikula wrote: > On Thu, 16 May 2019, Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> wrote: >> As a first step towards updating the code to work on the runtime_pm >> structure instead of i915, rework all the internals to use and pass >> around that. >> >> Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> >> --- >> drivers/gpu/drm/i915/i915_drv.h | 2 + >> drivers/gpu/drm/i915/intel_drv.h | 10 +- >> drivers/gpu/drm/i915/intel_runtime_pm.c | 152 ++++++++++++------------ >> 3 files changed, 82 insertions(+), 82 deletions(-) >> >> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h >> index 5801f5407589..474074c7f395 100644 >> --- a/drivers/gpu/drm/i915/i915_drv.h >> +++ b/drivers/gpu/drm/i915/i915_drv.h >> @@ -1177,6 +1177,8 @@ struct skl_wm_params { >> */ >> struct i915_runtime_pm { >> atomic_t wakeref_count; >> + struct device *kdev; > > This could use a small comment to say what device this is. > Would something like: /* the intel gpu we're loaded on */ work? Or should I just rename it to i915_kdev like we use in other parts of the driver? Thanks, Daniele > BR, > Jani. > >> + bool available; >> bool suspended; >> bool irqs_enabled; >> >> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h >> index 30b2d6ed2d53..bd04f394fbd3 100644 >> --- a/drivers/gpu/drm/i915/intel_drv.h >> +++ b/drivers/gpu/drm/i915/intel_drv.h >> @@ -1662,13 +1662,17 @@ ____assert_rpm_wakelock_held(struct i915_runtime_pm *rpm, int wakeref_count) >> } >> >> static inline void >> -assert_rpm_raw_wakeref_held(struct drm_i915_private *i915) >> +__assert_rpm_raw_wakeref_held(struct i915_runtime_pm *rpm) >> { >> - struct i915_runtime_pm *rpm = &i915->runtime_pm; >> - >> ____assert_rpm_raw_wakeref_held(rpm, atomic_read(&rpm->wakeref_count)); >> } >> >> +static inline void >> +assert_rpm_raw_wakeref_held(struct drm_i915_private *i915) >> +{ >> + __assert_rpm_raw_wakeref_held(&i915->runtime_pm); >> +} >> + >> static inline void >> __assert_rpm_wakelock_held(struct i915_runtime_pm *rpm) >> { >> diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c >> index b4abababdf6c..2e21f562df44 100644 >> --- a/drivers/gpu/drm/i915/intel_runtime_pm.c >> +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c >> @@ -60,19 +60,19 @@ >> * present for a given platform. >> */ >> >> -static intel_wakeref_t intel_runtime_pm_get_raw(struct drm_i915_private *i915); >> +static intel_wakeref_t intel_runtime_pm_get_raw(struct i915_runtime_pm *rpm); >> static void >> -__intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref, >> +__intel_runtime_pm_put(struct i915_runtime_pm *rpm, intel_wakeref_t wref, >> bool wakelock); >> >> #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) >> static void >> -intel_runtime_pm_put_raw(struct drm_i915_private *i915, intel_wakeref_t wref); >> +intel_runtime_pm_put_raw(struct i915_runtime_pm *rpm, intel_wakeref_t wref); >> #else >> -static inline void intel_runtime_pm_put_raw(struct drm_i915_private *i915, >> +static inline void intel_runtime_pm_put_raw(struct i915_runtime_pm *rpm, >> intel_wakeref_t wref) >> { >> - __intel_runtime_pm_put(i915, -1, false); >> + __intel_runtime_pm_put(rpm, -1, false); >> } >> #endif >> >> @@ -112,21 +112,18 @@ static void __print_depot_stack(depot_stack_handle_t stack, >> snprint_stack_trace(buf, sz, &trace, indent); >> } >> >> -static void init_intel_runtime_pm_wakeref(struct drm_i915_private *i915) >> +static void init_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm) >> { >> - struct i915_runtime_pm *rpm = &i915->runtime_pm; >> - >> spin_lock_init(&rpm->debug.lock); >> } >> >> static noinline depot_stack_handle_t >> -track_intel_runtime_pm_wakeref(struct drm_i915_private *i915) >> +track_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm) >> { >> - struct i915_runtime_pm *rpm = &i915->runtime_pm; >> depot_stack_handle_t stack, *stacks; >> unsigned long flags; >> >> - if (!HAS_RUNTIME_PM(i915)) >> + if (!rpm->available) >> return -1; >> >> stack = __save_depot_stack(); >> @@ -153,10 +150,9 @@ track_intel_runtime_pm_wakeref(struct drm_i915_private *i915) >> return stack; >> } >> >> -static void untrack_intel_runtime_pm_wakeref(struct drm_i915_private *i915, >> +static void untrack_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm, >> depot_stack_handle_t stack) >> { >> - struct i915_runtime_pm *rpm = &i915->runtime_pm; >> unsigned long flags, n; >> bool found = false; >> >> @@ -274,9 +270,8 @@ dump_and_free_wakeref_tracking(struct intel_runtime_pm_debug *debug) >> } >> >> static noinline void >> -__intel_wakeref_dec_and_check_tracking(struct drm_i915_private *i915) >> +__intel_wakeref_dec_and_check_tracking(struct i915_runtime_pm *rpm) >> { >> - struct i915_runtime_pm *rpm = &i915->runtime_pm; >> struct intel_runtime_pm_debug dbg = {}; >> unsigned long flags; >> >> @@ -292,9 +287,8 @@ __intel_wakeref_dec_and_check_tracking(struct drm_i915_private *i915) >> } >> >> static noinline void >> -untrack_all_intel_runtime_pm_wakerefs(struct drm_i915_private *i915) >> +untrack_all_intel_runtime_pm_wakerefs(struct i915_runtime_pm *rpm) >> { >> - struct i915_runtime_pm *rpm = &i915->runtime_pm; >> struct intel_runtime_pm_debug dbg = {}; >> unsigned long flags; >> >> @@ -345,61 +339,57 @@ void print_intel_runtime_pm_wakeref(struct drm_i915_private *i915, >> >> #else >> >> -static void init_intel_runtime_pm_wakeref(struct drm_i915_private *i915) >> +static void init_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm) >> { >> } >> >> static depot_stack_handle_t >> -track_intel_runtime_pm_wakeref(struct drm_i915_private *i915) >> +track_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm) >> { >> return -1; >> } >> >> -static void untrack_intel_runtime_pm_wakeref(struct drm_i915_private *i915, >> +static void untrack_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm, >> intel_wakeref_t wref) >> { >> } >> >> static void >> -__intel_wakeref_dec_and_check_tracking(struct drm_i915_private *i915) >> +__intel_wakeref_dec_and_check_tracking(struct i915_runtime_pm *rpm) >> { >> - atomic_dec(&i915->runtime_pm.wakeref_count); >> + atomic_dec(&rpm->wakeref_count); >> } >> >> static void >> -untrack_all_intel_runtime_pm_wakerefs(struct drm_i915_private *i915) >> +untrack_all_intel_runtime_pm_wakerefs(struct i915_runtime_pm *rpm) >> { >> } >> >> #endif >> >> static void >> -intel_runtime_pm_acquire(struct drm_i915_private *i915, bool wakelock) >> +intel_runtime_pm_acquire(struct i915_runtime_pm *rpm, bool wakelock) >> { >> - struct i915_runtime_pm *rpm = &i915->runtime_pm; >> - >> if (wakelock) { >> atomic_add(1 + INTEL_RPM_WAKELOCK_BIAS, &rpm->wakeref_count); >> - assert_rpm_wakelock_held(i915); >> + __assert_rpm_wakelock_held(rpm); >> } else { >> atomic_inc(&rpm->wakeref_count); >> - assert_rpm_raw_wakeref_held(i915); >> + __assert_rpm_raw_wakeref_held(rpm); >> } >> } >> >> static void >> -intel_runtime_pm_release(struct drm_i915_private *i915, int wakelock) >> +intel_runtime_pm_release(struct i915_runtime_pm *rpm, int wakelock) >> { >> - struct i915_runtime_pm *rpm = &i915->runtime_pm; >> - >> if (wakelock) { >> - assert_rpm_wakelock_held(i915); >> + __assert_rpm_wakelock_held(rpm); >> atomic_sub(INTEL_RPM_WAKELOCK_BIAS, &rpm->wakeref_count); >> } else { >> - assert_rpm_raw_wakeref_held(i915); >> + __assert_rpm_raw_wakeref_held(rpm); >> } >> >> - __intel_wakeref_dec_and_check_tracking(i915); >> + __intel_wakeref_dec_and_check_tracking(rpm); >> } >> >> bool intel_display_power_well_is_enabled(struct drm_i915_private *dev_priv, >> @@ -2030,7 +2020,7 @@ intel_display_power_grab_async_put_ref(struct drm_i915_private *dev_priv, >> goto out_verify; >> >> cancel_delayed_work(&power_domains->async_put_work); >> - intel_runtime_pm_put_raw(dev_priv, >> + intel_runtime_pm_put_raw(&dev_priv->runtime_pm, >> fetch_and_zero(&power_domains->async_put_wakeref)); >> out_verify: >> verify_async_put_domains_state(power_domains); >> @@ -2219,7 +2209,8 @@ intel_display_power_put_async_work(struct work_struct *work) >> container_of(work, struct drm_i915_private, >> power_domains.async_put_work.work); >> struct i915_power_domains *power_domains = &dev_priv->power_domains; >> - intel_wakeref_t new_work_wakeref = intel_runtime_pm_get_raw(dev_priv); >> + struct i915_runtime_pm *rpm = &dev_priv->runtime_pm; >> + intel_wakeref_t new_work_wakeref = intel_runtime_pm_get_raw(rpm); >> intel_wakeref_t old_work_wakeref = 0; >> >> mutex_lock(&power_domains->lock); >> @@ -2249,9 +2240,9 @@ intel_display_power_put_async_work(struct work_struct *work) >> mutex_unlock(&power_domains->lock); >> >> if (old_work_wakeref) >> - intel_runtime_pm_put_raw(dev_priv, old_work_wakeref); >> + intel_runtime_pm_put_raw(rpm, old_work_wakeref); >> if (new_work_wakeref) >> - intel_runtime_pm_put_raw(dev_priv, new_work_wakeref); >> + intel_runtime_pm_put_raw(rpm, new_work_wakeref); >> } >> >> /** >> @@ -2269,7 +2260,8 @@ void __intel_display_power_put_async(struct drm_i915_private *i915, >> intel_wakeref_t wakeref) >> { >> struct i915_power_domains *power_domains = &i915->power_domains; >> - intel_wakeref_t work_wakeref = intel_runtime_pm_get_raw(i915); >> + struct i915_runtime_pm *rpm = &i915->runtime_pm; >> + intel_wakeref_t work_wakeref = intel_runtime_pm_get_raw(rpm); >> >> mutex_lock(&power_domains->lock); >> >> @@ -2296,7 +2288,7 @@ void __intel_display_power_put_async(struct drm_i915_private *i915, >> mutex_unlock(&power_domains->lock); >> >> if (work_wakeref) >> - intel_runtime_pm_put_raw(i915, work_wakeref); >> + intel_runtime_pm_put_raw(rpm, work_wakeref); >> >> intel_runtime_pm_put(i915, wakeref); >> } >> @@ -2334,7 +2326,7 @@ void intel_display_power_flush_work(struct drm_i915_private *i915) >> mutex_unlock(&power_domains->lock); >> >> if (work_wakeref) >> - intel_runtime_pm_put_raw(i915, work_wakeref); >> + intel_runtime_pm_put_raw(&i915->runtime_pm, work_wakeref); >> } >> >> /** >> @@ -4996,24 +4988,22 @@ static void intel_power_domains_verify_state(struct drm_i915_private *i915) >> >> #endif >> >> -static intel_wakeref_t __intel_runtime_pm_get(struct drm_i915_private *i915, >> +static intel_wakeref_t __intel_runtime_pm_get(struct i915_runtime_pm *rpm, >> bool wakelock) >> { >> - struct pci_dev *pdev = i915->drm.pdev; >> - struct device *kdev = &pdev->dev; >> int ret; >> >> - ret = pm_runtime_get_sync(kdev); >> + ret = pm_runtime_get_sync(rpm->kdev); >> WARN_ONCE(ret < 0, "pm_runtime_get_sync() failed: %d\n", ret); >> >> - intel_runtime_pm_acquire(i915, wakelock); >> + intel_runtime_pm_acquire(rpm, wakelock); >> >> - return track_intel_runtime_pm_wakeref(i915); >> + return track_intel_runtime_pm_wakeref(rpm); >> } >> >> -static intel_wakeref_t intel_runtime_pm_get_raw(struct drm_i915_private *i915) >> +static intel_wakeref_t intel_runtime_pm_get_raw(struct i915_runtime_pm *rpm) >> { >> - return __intel_runtime_pm_get(i915, false); >> + return __intel_runtime_pm_get(rpm, false); >> } >> >> /** >> @@ -5030,7 +5020,7 @@ static intel_wakeref_t intel_runtime_pm_get_raw(struct drm_i915_private *i915) >> */ >> intel_wakeref_t intel_runtime_pm_get(struct drm_i915_private *i915) >> { >> - return __intel_runtime_pm_get(i915, true); >> + return __intel_runtime_pm_get(&i915->runtime_pm, true); >> } >> >> /** >> @@ -5049,23 +5039,22 @@ intel_wakeref_t intel_runtime_pm_get(struct drm_i915_private *i915) >> */ >> intel_wakeref_t intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915) >> { >> - if (IS_ENABLED(CONFIG_PM)) { >> - struct pci_dev *pdev = i915->drm.pdev; >> - struct device *kdev = &pdev->dev; >> + struct i915_runtime_pm *rpm = &i915->runtime_pm; >> >> + if (IS_ENABLED(CONFIG_PM)) { >> /* >> * In cases runtime PM is disabled by the RPM core and we get >> * an -EINVAL return value we are not supposed to call this >> * function, since the power state is undefined. This applies >> * atm to the late/early system suspend/resume handlers. >> */ >> - if (pm_runtime_get_if_in_use(kdev) <= 0) >> + if (pm_runtime_get_if_in_use(rpm->kdev) <= 0) >> return 0; >> } >> >> - intel_runtime_pm_acquire(i915, true); >> + intel_runtime_pm_acquire(rpm, true); >> >> - return track_intel_runtime_pm_wakeref(i915); >> + return track_intel_runtime_pm_wakeref(rpm); >> } >> >> /** >> @@ -5089,27 +5078,25 @@ intel_wakeref_t intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915) >> */ >> intel_wakeref_t intel_runtime_pm_get_noresume(struct drm_i915_private *i915) >> { >> - struct pci_dev *pdev = i915->drm.pdev; >> - struct device *kdev = &pdev->dev; >> + struct i915_runtime_pm *rpm = &i915->runtime_pm; >> >> - assert_rpm_wakelock_held(i915); >> - pm_runtime_get_noresume(kdev); >> + __assert_rpm_wakelock_held(rpm); >> + pm_runtime_get_noresume(rpm->kdev); >> >> - intel_runtime_pm_acquire(i915, true); >> + intel_runtime_pm_acquire(rpm, true); >> >> - return track_intel_runtime_pm_wakeref(i915); >> + return track_intel_runtime_pm_wakeref(rpm); >> } >> >> -static void __intel_runtime_pm_put(struct drm_i915_private *i915, >> +static void __intel_runtime_pm_put(struct i915_runtime_pm *rpm, >> intel_wakeref_t wref, >> bool wakelock) >> { >> - struct pci_dev *pdev = i915->drm.pdev; >> - struct device *kdev = &pdev->dev; >> + struct device *kdev = rpm->kdev; >> >> - untrack_intel_runtime_pm_wakeref(i915, wref); >> + untrack_intel_runtime_pm_wakeref(rpm, wref); >> >> - intel_runtime_pm_release(i915, wakelock); >> + intel_runtime_pm_release(rpm, wakelock); >> >> pm_runtime_mark_last_busy(kdev); >> pm_runtime_put_autosuspend(kdev); >> @@ -5117,9 +5104,9 @@ static void __intel_runtime_pm_put(struct drm_i915_private *i915, >> >> #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) >> static void >> -intel_runtime_pm_put_raw(struct drm_i915_private *i915, intel_wakeref_t wref) >> +intel_runtime_pm_put_raw(struct i915_runtime_pm *rpm, intel_wakeref_t wref) >> { >> - __intel_runtime_pm_put(i915, wref, false); >> + __intel_runtime_pm_put(rpm, wref, false); >> } >> #endif >> >> @@ -5137,7 +5124,7 @@ intel_runtime_pm_put_raw(struct drm_i915_private *i915, intel_wakeref_t wref) >> */ >> void intel_runtime_pm_put_unchecked(struct drm_i915_private *i915) >> { >> - __intel_runtime_pm_put(i915, -1, true); >> + __intel_runtime_pm_put(&i915->runtime_pm, -1, true); >> } >> >> #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) >> @@ -5152,7 +5139,7 @@ void intel_runtime_pm_put_unchecked(struct drm_i915_private *i915) >> */ >> void intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref) >> { >> - __intel_runtime_pm_put(i915, wref, true); >> + __intel_runtime_pm_put(&i915->runtime_pm, wref, true); >> } >> #endif >> >> @@ -5168,8 +5155,8 @@ void intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref) >> */ >> void intel_runtime_pm_enable(struct drm_i915_private *i915) >> { >> - struct pci_dev *pdev = i915->drm.pdev; >> - struct device *kdev = &pdev->dev; >> + struct i915_runtime_pm *rpm = &i915->runtime_pm; >> + struct device *kdev = rpm->kdev; >> >> /* >> * Disable the system suspend direct complete optimization, which can >> @@ -5190,7 +5177,7 @@ void intel_runtime_pm_enable(struct drm_i915_private *i915) >> * so the driver's own RPM reference tracking asserts also work on >> * platforms without RPM support. >> */ >> - if (!HAS_RUNTIME_PM(i915)) { >> + if (!rpm->available) { >> int ret; >> >> pm_runtime_dont_use_autosuspend(kdev); >> @@ -5210,8 +5197,8 @@ void intel_runtime_pm_enable(struct drm_i915_private *i915) >> >> void intel_runtime_pm_disable(struct drm_i915_private *i915) >> { >> - struct pci_dev *pdev = i915->drm.pdev; >> - struct device *kdev = &pdev->dev; >> + struct i915_runtime_pm *rpm = &i915->runtime_pm; >> + struct device *kdev = rpm->kdev; >> >> /* Transfer rpm ownership back to core */ >> WARN(pm_runtime_get_sync(kdev) < 0, >> @@ -5219,7 +5206,7 @@ void intel_runtime_pm_disable(struct drm_i915_private *i915) >> >> pm_runtime_dont_use_autosuspend(kdev); >> >> - if (!HAS_RUNTIME_PM(i915)) >> + if (!rpm->available) >> pm_runtime_put(kdev); >> } >> >> @@ -5233,10 +5220,17 @@ void intel_runtime_pm_cleanup(struct drm_i915_private *i915) >> intel_rpm_raw_wakeref_count(count), >> intel_rpm_wakelock_count(count)); >> >> - untrack_all_intel_runtime_pm_wakerefs(i915); >> + untrack_all_intel_runtime_pm_wakerefs(rpm); >> } >> >> void intel_runtime_pm_init_early(struct drm_i915_private *i915) >> { >> - init_intel_runtime_pm_wakeref(i915); >> + struct i915_runtime_pm *rpm = &i915->runtime_pm; >> + struct pci_dev *pdev = i915->drm.pdev; >> + struct device *kdev = &pdev->dev; >> + >> + rpm->kdev = kdev; >> + rpm->available = HAS_RUNTIME_PM(i915); >> + >> + init_intel_runtime_pm_wakeref(rpm); >> } >
On Fri, 31 May 2019, Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> wrote: > On 5/21/19 1:45 AM, Jani Nikula wrote: >> On Thu, 16 May 2019, Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> wrote: >>> As a first step towards updating the code to work on the runtime_pm >>> structure instead of i915, rework all the internals to use and pass >>> around that. >>> >>> Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> >>> --- >>> drivers/gpu/drm/i915/i915_drv.h | 2 + >>> drivers/gpu/drm/i915/intel_drv.h | 10 +- >>> drivers/gpu/drm/i915/intel_runtime_pm.c | 152 ++++++++++++------------ >>> 3 files changed, 82 insertions(+), 82 deletions(-) >>> >>> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h >>> index 5801f5407589..474074c7f395 100644 >>> --- a/drivers/gpu/drm/i915/i915_drv.h >>> +++ b/drivers/gpu/drm/i915/i915_drv.h >>> @@ -1177,6 +1177,8 @@ struct skl_wm_params { >>> */ >>> struct i915_runtime_pm { >>> atomic_t wakeref_count; >>> + struct device *kdev; >> >> This could use a small comment to say what device this is. >> > > Would something like: > > /* the intel gpu we're loaded on */ I meant more literally something like "set to i915->drm->pdev->dev". (With . instead of -> in some places...) BR, Jani. > work? Or should I just rename it to i915_kdev like we use in other parts > of the driver? > > Thanks, > Daniele > >> BR, >> Jani. >> >>> + bool available; >>> bool suspended; >>> bool irqs_enabled; >>> >>> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h >>> index 30b2d6ed2d53..bd04f394fbd3 100644 >>> --- a/drivers/gpu/drm/i915/intel_drv.h >>> +++ b/drivers/gpu/drm/i915/intel_drv.h >>> @@ -1662,13 +1662,17 @@ ____assert_rpm_wakelock_held(struct i915_runtime_pm *rpm, int wakeref_count) >>> } >>> >>> static inline void >>> -assert_rpm_raw_wakeref_held(struct drm_i915_private *i915) >>> +__assert_rpm_raw_wakeref_held(struct i915_runtime_pm *rpm) >>> { >>> - struct i915_runtime_pm *rpm = &i915->runtime_pm; >>> - >>> ____assert_rpm_raw_wakeref_held(rpm, atomic_read(&rpm->wakeref_count)); >>> } >>> >>> +static inline void >>> +assert_rpm_raw_wakeref_held(struct drm_i915_private *i915) >>> +{ >>> + __assert_rpm_raw_wakeref_held(&i915->runtime_pm); >>> +} >>> + >>> static inline void >>> __assert_rpm_wakelock_held(struct i915_runtime_pm *rpm) >>> { >>> diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c >>> index b4abababdf6c..2e21f562df44 100644 >>> --- a/drivers/gpu/drm/i915/intel_runtime_pm.c >>> +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c >>> @@ -60,19 +60,19 @@ >>> * present for a given platform. >>> */ >>> >>> -static intel_wakeref_t intel_runtime_pm_get_raw(struct drm_i915_private *i915); >>> +static intel_wakeref_t intel_runtime_pm_get_raw(struct i915_runtime_pm *rpm); >>> static void >>> -__intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref, >>> +__intel_runtime_pm_put(struct i915_runtime_pm *rpm, intel_wakeref_t wref, >>> bool wakelock); >>> >>> #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) >>> static void >>> -intel_runtime_pm_put_raw(struct drm_i915_private *i915, intel_wakeref_t wref); >>> +intel_runtime_pm_put_raw(struct i915_runtime_pm *rpm, intel_wakeref_t wref); >>> #else >>> -static inline void intel_runtime_pm_put_raw(struct drm_i915_private *i915, >>> +static inline void intel_runtime_pm_put_raw(struct i915_runtime_pm *rpm, >>> intel_wakeref_t wref) >>> { >>> - __intel_runtime_pm_put(i915, -1, false); >>> + __intel_runtime_pm_put(rpm, -1, false); >>> } >>> #endif >>> >>> @@ -112,21 +112,18 @@ static void __print_depot_stack(depot_stack_handle_t stack, >>> snprint_stack_trace(buf, sz, &trace, indent); >>> } >>> >>> -static void init_intel_runtime_pm_wakeref(struct drm_i915_private *i915) >>> +static void init_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm) >>> { >>> - struct i915_runtime_pm *rpm = &i915->runtime_pm; >>> - >>> spin_lock_init(&rpm->debug.lock); >>> } >>> >>> static noinline depot_stack_handle_t >>> -track_intel_runtime_pm_wakeref(struct drm_i915_private *i915) >>> +track_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm) >>> { >>> - struct i915_runtime_pm *rpm = &i915->runtime_pm; >>> depot_stack_handle_t stack, *stacks; >>> unsigned long flags; >>> >>> - if (!HAS_RUNTIME_PM(i915)) >>> + if (!rpm->available) >>> return -1; >>> >>> stack = __save_depot_stack(); >>> @@ -153,10 +150,9 @@ track_intel_runtime_pm_wakeref(struct drm_i915_private *i915) >>> return stack; >>> } >>> >>> -static void untrack_intel_runtime_pm_wakeref(struct drm_i915_private *i915, >>> +static void untrack_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm, >>> depot_stack_handle_t stack) >>> { >>> - struct i915_runtime_pm *rpm = &i915->runtime_pm; >>> unsigned long flags, n; >>> bool found = false; >>> >>> @@ -274,9 +270,8 @@ dump_and_free_wakeref_tracking(struct intel_runtime_pm_debug *debug) >>> } >>> >>> static noinline void >>> -__intel_wakeref_dec_and_check_tracking(struct drm_i915_private *i915) >>> +__intel_wakeref_dec_and_check_tracking(struct i915_runtime_pm *rpm) >>> { >>> - struct i915_runtime_pm *rpm = &i915->runtime_pm; >>> struct intel_runtime_pm_debug dbg = {}; >>> unsigned long flags; >>> >>> @@ -292,9 +287,8 @@ __intel_wakeref_dec_and_check_tracking(struct drm_i915_private *i915) >>> } >>> >>> static noinline void >>> -untrack_all_intel_runtime_pm_wakerefs(struct drm_i915_private *i915) >>> +untrack_all_intel_runtime_pm_wakerefs(struct i915_runtime_pm *rpm) >>> { >>> - struct i915_runtime_pm *rpm = &i915->runtime_pm; >>> struct intel_runtime_pm_debug dbg = {}; >>> unsigned long flags; >>> >>> @@ -345,61 +339,57 @@ void print_intel_runtime_pm_wakeref(struct drm_i915_private *i915, >>> >>> #else >>> >>> -static void init_intel_runtime_pm_wakeref(struct drm_i915_private *i915) >>> +static void init_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm) >>> { >>> } >>> >>> static depot_stack_handle_t >>> -track_intel_runtime_pm_wakeref(struct drm_i915_private *i915) >>> +track_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm) >>> { >>> return -1; >>> } >>> >>> -static void untrack_intel_runtime_pm_wakeref(struct drm_i915_private *i915, >>> +static void untrack_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm, >>> intel_wakeref_t wref) >>> { >>> } >>> >>> static void >>> -__intel_wakeref_dec_and_check_tracking(struct drm_i915_private *i915) >>> +__intel_wakeref_dec_and_check_tracking(struct i915_runtime_pm *rpm) >>> { >>> - atomic_dec(&i915->runtime_pm.wakeref_count); >>> + atomic_dec(&rpm->wakeref_count); >>> } >>> >>> static void >>> -untrack_all_intel_runtime_pm_wakerefs(struct drm_i915_private *i915) >>> +untrack_all_intel_runtime_pm_wakerefs(struct i915_runtime_pm *rpm) >>> { >>> } >>> >>> #endif >>> >>> static void >>> -intel_runtime_pm_acquire(struct drm_i915_private *i915, bool wakelock) >>> +intel_runtime_pm_acquire(struct i915_runtime_pm *rpm, bool wakelock) >>> { >>> - struct i915_runtime_pm *rpm = &i915->runtime_pm; >>> - >>> if (wakelock) { >>> atomic_add(1 + INTEL_RPM_WAKELOCK_BIAS, &rpm->wakeref_count); >>> - assert_rpm_wakelock_held(i915); >>> + __assert_rpm_wakelock_held(rpm); >>> } else { >>> atomic_inc(&rpm->wakeref_count); >>> - assert_rpm_raw_wakeref_held(i915); >>> + __assert_rpm_raw_wakeref_held(rpm); >>> } >>> } >>> >>> static void >>> -intel_runtime_pm_release(struct drm_i915_private *i915, int wakelock) >>> +intel_runtime_pm_release(struct i915_runtime_pm *rpm, int wakelock) >>> { >>> - struct i915_runtime_pm *rpm = &i915->runtime_pm; >>> - >>> if (wakelock) { >>> - assert_rpm_wakelock_held(i915); >>> + __assert_rpm_wakelock_held(rpm); >>> atomic_sub(INTEL_RPM_WAKELOCK_BIAS, &rpm->wakeref_count); >>> } else { >>> - assert_rpm_raw_wakeref_held(i915); >>> + __assert_rpm_raw_wakeref_held(rpm); >>> } >>> >>> - __intel_wakeref_dec_and_check_tracking(i915); >>> + __intel_wakeref_dec_and_check_tracking(rpm); >>> } >>> >>> bool intel_display_power_well_is_enabled(struct drm_i915_private *dev_priv, >>> @@ -2030,7 +2020,7 @@ intel_display_power_grab_async_put_ref(struct drm_i915_private *dev_priv, >>> goto out_verify; >>> >>> cancel_delayed_work(&power_domains->async_put_work); >>> - intel_runtime_pm_put_raw(dev_priv, >>> + intel_runtime_pm_put_raw(&dev_priv->runtime_pm, >>> fetch_and_zero(&power_domains->async_put_wakeref)); >>> out_verify: >>> verify_async_put_domains_state(power_domains); >>> @@ -2219,7 +2209,8 @@ intel_display_power_put_async_work(struct work_struct *work) >>> container_of(work, struct drm_i915_private, >>> power_domains.async_put_work.work); >>> struct i915_power_domains *power_domains = &dev_priv->power_domains; >>> - intel_wakeref_t new_work_wakeref = intel_runtime_pm_get_raw(dev_priv); >>> + struct i915_runtime_pm *rpm = &dev_priv->runtime_pm; >>> + intel_wakeref_t new_work_wakeref = intel_runtime_pm_get_raw(rpm); >>> intel_wakeref_t old_work_wakeref = 0; >>> >>> mutex_lock(&power_domains->lock); >>> @@ -2249,9 +2240,9 @@ intel_display_power_put_async_work(struct work_struct *work) >>> mutex_unlock(&power_domains->lock); >>> >>> if (old_work_wakeref) >>> - intel_runtime_pm_put_raw(dev_priv, old_work_wakeref); >>> + intel_runtime_pm_put_raw(rpm, old_work_wakeref); >>> if (new_work_wakeref) >>> - intel_runtime_pm_put_raw(dev_priv, new_work_wakeref); >>> + intel_runtime_pm_put_raw(rpm, new_work_wakeref); >>> } >>> >>> /** >>> @@ -2269,7 +2260,8 @@ void __intel_display_power_put_async(struct drm_i915_private *i915, >>> intel_wakeref_t wakeref) >>> { >>> struct i915_power_domains *power_domains = &i915->power_domains; >>> - intel_wakeref_t work_wakeref = intel_runtime_pm_get_raw(i915); >>> + struct i915_runtime_pm *rpm = &i915->runtime_pm; >>> + intel_wakeref_t work_wakeref = intel_runtime_pm_get_raw(rpm); >>> >>> mutex_lock(&power_domains->lock); >>> >>> @@ -2296,7 +2288,7 @@ void __intel_display_power_put_async(struct drm_i915_private *i915, >>> mutex_unlock(&power_domains->lock); >>> >>> if (work_wakeref) >>> - intel_runtime_pm_put_raw(i915, work_wakeref); >>> + intel_runtime_pm_put_raw(rpm, work_wakeref); >>> >>> intel_runtime_pm_put(i915, wakeref); >>> } >>> @@ -2334,7 +2326,7 @@ void intel_display_power_flush_work(struct drm_i915_private *i915) >>> mutex_unlock(&power_domains->lock); >>> >>> if (work_wakeref) >>> - intel_runtime_pm_put_raw(i915, work_wakeref); >>> + intel_runtime_pm_put_raw(&i915->runtime_pm, work_wakeref); >>> } >>> >>> /** >>> @@ -4996,24 +4988,22 @@ static void intel_power_domains_verify_state(struct drm_i915_private *i915) >>> >>> #endif >>> >>> -static intel_wakeref_t __intel_runtime_pm_get(struct drm_i915_private *i915, >>> +static intel_wakeref_t __intel_runtime_pm_get(struct i915_runtime_pm *rpm, >>> bool wakelock) >>> { >>> - struct pci_dev *pdev = i915->drm.pdev; >>> - struct device *kdev = &pdev->dev; >>> int ret; >>> >>> - ret = pm_runtime_get_sync(kdev); >>> + ret = pm_runtime_get_sync(rpm->kdev); >>> WARN_ONCE(ret < 0, "pm_runtime_get_sync() failed: %d\n", ret); >>> >>> - intel_runtime_pm_acquire(i915, wakelock); >>> + intel_runtime_pm_acquire(rpm, wakelock); >>> >>> - return track_intel_runtime_pm_wakeref(i915); >>> + return track_intel_runtime_pm_wakeref(rpm); >>> } >>> >>> -static intel_wakeref_t intel_runtime_pm_get_raw(struct drm_i915_private *i915) >>> +static intel_wakeref_t intel_runtime_pm_get_raw(struct i915_runtime_pm *rpm) >>> { >>> - return __intel_runtime_pm_get(i915, false); >>> + return __intel_runtime_pm_get(rpm, false); >>> } >>> >>> /** >>> @@ -5030,7 +5020,7 @@ static intel_wakeref_t intel_runtime_pm_get_raw(struct drm_i915_private *i915) >>> */ >>> intel_wakeref_t intel_runtime_pm_get(struct drm_i915_private *i915) >>> { >>> - return __intel_runtime_pm_get(i915, true); >>> + return __intel_runtime_pm_get(&i915->runtime_pm, true); >>> } >>> >>> /** >>> @@ -5049,23 +5039,22 @@ intel_wakeref_t intel_runtime_pm_get(struct drm_i915_private *i915) >>> */ >>> intel_wakeref_t intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915) >>> { >>> - if (IS_ENABLED(CONFIG_PM)) { >>> - struct pci_dev *pdev = i915->drm.pdev; >>> - struct device *kdev = &pdev->dev; >>> + struct i915_runtime_pm *rpm = &i915->runtime_pm; >>> >>> + if (IS_ENABLED(CONFIG_PM)) { >>> /* >>> * In cases runtime PM is disabled by the RPM core and we get >>> * an -EINVAL return value we are not supposed to call this >>> * function, since the power state is undefined. This applies >>> * atm to the late/early system suspend/resume handlers. >>> */ >>> - if (pm_runtime_get_if_in_use(kdev) <= 0) >>> + if (pm_runtime_get_if_in_use(rpm->kdev) <= 0) >>> return 0; >>> } >>> >>> - intel_runtime_pm_acquire(i915, true); >>> + intel_runtime_pm_acquire(rpm, true); >>> >>> - return track_intel_runtime_pm_wakeref(i915); >>> + return track_intel_runtime_pm_wakeref(rpm); >>> } >>> >>> /** >>> @@ -5089,27 +5078,25 @@ intel_wakeref_t intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915) >>> */ >>> intel_wakeref_t intel_runtime_pm_get_noresume(struct drm_i915_private *i915) >>> { >>> - struct pci_dev *pdev = i915->drm.pdev; >>> - struct device *kdev = &pdev->dev; >>> + struct i915_runtime_pm *rpm = &i915->runtime_pm; >>> >>> - assert_rpm_wakelock_held(i915); >>> - pm_runtime_get_noresume(kdev); >>> + __assert_rpm_wakelock_held(rpm); >>> + pm_runtime_get_noresume(rpm->kdev); >>> >>> - intel_runtime_pm_acquire(i915, true); >>> + intel_runtime_pm_acquire(rpm, true); >>> >>> - return track_intel_runtime_pm_wakeref(i915); >>> + return track_intel_runtime_pm_wakeref(rpm); >>> } >>> >>> -static void __intel_runtime_pm_put(struct drm_i915_private *i915, >>> +static void __intel_runtime_pm_put(struct i915_runtime_pm *rpm, >>> intel_wakeref_t wref, >>> bool wakelock) >>> { >>> - struct pci_dev *pdev = i915->drm.pdev; >>> - struct device *kdev = &pdev->dev; >>> + struct device *kdev = rpm->kdev; >>> >>> - untrack_intel_runtime_pm_wakeref(i915, wref); >>> + untrack_intel_runtime_pm_wakeref(rpm, wref); >>> >>> - intel_runtime_pm_release(i915, wakelock); >>> + intel_runtime_pm_release(rpm, wakelock); >>> >>> pm_runtime_mark_last_busy(kdev); >>> pm_runtime_put_autosuspend(kdev); >>> @@ -5117,9 +5104,9 @@ static void __intel_runtime_pm_put(struct drm_i915_private *i915, >>> >>> #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) >>> static void >>> -intel_runtime_pm_put_raw(struct drm_i915_private *i915, intel_wakeref_t wref) >>> +intel_runtime_pm_put_raw(struct i915_runtime_pm *rpm, intel_wakeref_t wref) >>> { >>> - __intel_runtime_pm_put(i915, wref, false); >>> + __intel_runtime_pm_put(rpm, wref, false); >>> } >>> #endif >>> >>> @@ -5137,7 +5124,7 @@ intel_runtime_pm_put_raw(struct drm_i915_private *i915, intel_wakeref_t wref) >>> */ >>> void intel_runtime_pm_put_unchecked(struct drm_i915_private *i915) >>> { >>> - __intel_runtime_pm_put(i915, -1, true); >>> + __intel_runtime_pm_put(&i915->runtime_pm, -1, true); >>> } >>> >>> #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) >>> @@ -5152,7 +5139,7 @@ void intel_runtime_pm_put_unchecked(struct drm_i915_private *i915) >>> */ >>> void intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref) >>> { >>> - __intel_runtime_pm_put(i915, wref, true); >>> + __intel_runtime_pm_put(&i915->runtime_pm, wref, true); >>> } >>> #endif >>> >>> @@ -5168,8 +5155,8 @@ void intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref) >>> */ >>> void intel_runtime_pm_enable(struct drm_i915_private *i915) >>> { >>> - struct pci_dev *pdev = i915->drm.pdev; >>> - struct device *kdev = &pdev->dev; >>> + struct i915_runtime_pm *rpm = &i915->runtime_pm; >>> + struct device *kdev = rpm->kdev; >>> >>> /* >>> * Disable the system suspend direct complete optimization, which can >>> @@ -5190,7 +5177,7 @@ void intel_runtime_pm_enable(struct drm_i915_private *i915) >>> * so the driver's own RPM reference tracking asserts also work on >>> * platforms without RPM support. >>> */ >>> - if (!HAS_RUNTIME_PM(i915)) { >>> + if (!rpm->available) { >>> int ret; >>> >>> pm_runtime_dont_use_autosuspend(kdev); >>> @@ -5210,8 +5197,8 @@ void intel_runtime_pm_enable(struct drm_i915_private *i915) >>> >>> void intel_runtime_pm_disable(struct drm_i915_private *i915) >>> { >>> - struct pci_dev *pdev = i915->drm.pdev; >>> - struct device *kdev = &pdev->dev; >>> + struct i915_runtime_pm *rpm = &i915->runtime_pm; >>> + struct device *kdev = rpm->kdev; >>> >>> /* Transfer rpm ownership back to core */ >>> WARN(pm_runtime_get_sync(kdev) < 0, >>> @@ -5219,7 +5206,7 @@ void intel_runtime_pm_disable(struct drm_i915_private *i915) >>> >>> pm_runtime_dont_use_autosuspend(kdev); >>> >>> - if (!HAS_RUNTIME_PM(i915)) >>> + if (!rpm->available) >>> pm_runtime_put(kdev); >>> } >>> >>> @@ -5233,10 +5220,17 @@ void intel_runtime_pm_cleanup(struct drm_i915_private *i915) >>> intel_rpm_raw_wakeref_count(count), >>> intel_rpm_wakelock_count(count)); >>> >>> - untrack_all_intel_runtime_pm_wakerefs(i915); >>> + untrack_all_intel_runtime_pm_wakerefs(rpm); >>> } >>> >>> void intel_runtime_pm_init_early(struct drm_i915_private *i915) >>> { >>> - init_intel_runtime_pm_wakeref(i915); >>> + struct i915_runtime_pm *rpm = &i915->runtime_pm; >>> + struct pci_dev *pdev = i915->drm.pdev; >>> + struct device *kdev = &pdev->dev; >>> + >>> + rpm->kdev = kdev; >>> + rpm->available = HAS_RUNTIME_PM(i915); >>> + >>> + init_intel_runtime_pm_wakeref(rpm); >>> } >>
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 5801f5407589..474074c7f395 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1177,6 +1177,8 @@ struct skl_wm_params { */ struct i915_runtime_pm { atomic_t wakeref_count; + struct device *kdev; + bool available; bool suspended; bool irqs_enabled; diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 30b2d6ed2d53..bd04f394fbd3 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -1662,13 +1662,17 @@ ____assert_rpm_wakelock_held(struct i915_runtime_pm *rpm, int wakeref_count) } static inline void -assert_rpm_raw_wakeref_held(struct drm_i915_private *i915) +__assert_rpm_raw_wakeref_held(struct i915_runtime_pm *rpm) { - struct i915_runtime_pm *rpm = &i915->runtime_pm; - ____assert_rpm_raw_wakeref_held(rpm, atomic_read(&rpm->wakeref_count)); } +static inline void +assert_rpm_raw_wakeref_held(struct drm_i915_private *i915) +{ + __assert_rpm_raw_wakeref_held(&i915->runtime_pm); +} + static inline void __assert_rpm_wakelock_held(struct i915_runtime_pm *rpm) { diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c index b4abababdf6c..2e21f562df44 100644 --- a/drivers/gpu/drm/i915/intel_runtime_pm.c +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c @@ -60,19 +60,19 @@ * present for a given platform. */ -static intel_wakeref_t intel_runtime_pm_get_raw(struct drm_i915_private *i915); +static intel_wakeref_t intel_runtime_pm_get_raw(struct i915_runtime_pm *rpm); static void -__intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref, +__intel_runtime_pm_put(struct i915_runtime_pm *rpm, intel_wakeref_t wref, bool wakelock); #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) static void -intel_runtime_pm_put_raw(struct drm_i915_private *i915, intel_wakeref_t wref); +intel_runtime_pm_put_raw(struct i915_runtime_pm *rpm, intel_wakeref_t wref); #else -static inline void intel_runtime_pm_put_raw(struct drm_i915_private *i915, +static inline void intel_runtime_pm_put_raw(struct i915_runtime_pm *rpm, intel_wakeref_t wref) { - __intel_runtime_pm_put(i915, -1, false); + __intel_runtime_pm_put(rpm, -1, false); } #endif @@ -112,21 +112,18 @@ static void __print_depot_stack(depot_stack_handle_t stack, snprint_stack_trace(buf, sz, &trace, indent); } -static void init_intel_runtime_pm_wakeref(struct drm_i915_private *i915) +static void init_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm) { - struct i915_runtime_pm *rpm = &i915->runtime_pm; - spin_lock_init(&rpm->debug.lock); } static noinline depot_stack_handle_t -track_intel_runtime_pm_wakeref(struct drm_i915_private *i915) +track_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm) { - struct i915_runtime_pm *rpm = &i915->runtime_pm; depot_stack_handle_t stack, *stacks; unsigned long flags; - if (!HAS_RUNTIME_PM(i915)) + if (!rpm->available) return -1; stack = __save_depot_stack(); @@ -153,10 +150,9 @@ track_intel_runtime_pm_wakeref(struct drm_i915_private *i915) return stack; } -static void untrack_intel_runtime_pm_wakeref(struct drm_i915_private *i915, +static void untrack_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm, depot_stack_handle_t stack) { - struct i915_runtime_pm *rpm = &i915->runtime_pm; unsigned long flags, n; bool found = false; @@ -274,9 +270,8 @@ dump_and_free_wakeref_tracking(struct intel_runtime_pm_debug *debug) } static noinline void -__intel_wakeref_dec_and_check_tracking(struct drm_i915_private *i915) +__intel_wakeref_dec_and_check_tracking(struct i915_runtime_pm *rpm) { - struct i915_runtime_pm *rpm = &i915->runtime_pm; struct intel_runtime_pm_debug dbg = {}; unsigned long flags; @@ -292,9 +287,8 @@ __intel_wakeref_dec_and_check_tracking(struct drm_i915_private *i915) } static noinline void -untrack_all_intel_runtime_pm_wakerefs(struct drm_i915_private *i915) +untrack_all_intel_runtime_pm_wakerefs(struct i915_runtime_pm *rpm) { - struct i915_runtime_pm *rpm = &i915->runtime_pm; struct intel_runtime_pm_debug dbg = {}; unsigned long flags; @@ -345,61 +339,57 @@ void print_intel_runtime_pm_wakeref(struct drm_i915_private *i915, #else -static void init_intel_runtime_pm_wakeref(struct drm_i915_private *i915) +static void init_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm) { } static depot_stack_handle_t -track_intel_runtime_pm_wakeref(struct drm_i915_private *i915) +track_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm) { return -1; } -static void untrack_intel_runtime_pm_wakeref(struct drm_i915_private *i915, +static void untrack_intel_runtime_pm_wakeref(struct i915_runtime_pm *rpm, intel_wakeref_t wref) { } static void -__intel_wakeref_dec_and_check_tracking(struct drm_i915_private *i915) +__intel_wakeref_dec_and_check_tracking(struct i915_runtime_pm *rpm) { - atomic_dec(&i915->runtime_pm.wakeref_count); + atomic_dec(&rpm->wakeref_count); } static void -untrack_all_intel_runtime_pm_wakerefs(struct drm_i915_private *i915) +untrack_all_intel_runtime_pm_wakerefs(struct i915_runtime_pm *rpm) { } #endif static void -intel_runtime_pm_acquire(struct drm_i915_private *i915, bool wakelock) +intel_runtime_pm_acquire(struct i915_runtime_pm *rpm, bool wakelock) { - struct i915_runtime_pm *rpm = &i915->runtime_pm; - if (wakelock) { atomic_add(1 + INTEL_RPM_WAKELOCK_BIAS, &rpm->wakeref_count); - assert_rpm_wakelock_held(i915); + __assert_rpm_wakelock_held(rpm); } else { atomic_inc(&rpm->wakeref_count); - assert_rpm_raw_wakeref_held(i915); + __assert_rpm_raw_wakeref_held(rpm); } } static void -intel_runtime_pm_release(struct drm_i915_private *i915, int wakelock) +intel_runtime_pm_release(struct i915_runtime_pm *rpm, int wakelock) { - struct i915_runtime_pm *rpm = &i915->runtime_pm; - if (wakelock) { - assert_rpm_wakelock_held(i915); + __assert_rpm_wakelock_held(rpm); atomic_sub(INTEL_RPM_WAKELOCK_BIAS, &rpm->wakeref_count); } else { - assert_rpm_raw_wakeref_held(i915); + __assert_rpm_raw_wakeref_held(rpm); } - __intel_wakeref_dec_and_check_tracking(i915); + __intel_wakeref_dec_and_check_tracking(rpm); } bool intel_display_power_well_is_enabled(struct drm_i915_private *dev_priv, @@ -2030,7 +2020,7 @@ intel_display_power_grab_async_put_ref(struct drm_i915_private *dev_priv, goto out_verify; cancel_delayed_work(&power_domains->async_put_work); - intel_runtime_pm_put_raw(dev_priv, + intel_runtime_pm_put_raw(&dev_priv->runtime_pm, fetch_and_zero(&power_domains->async_put_wakeref)); out_verify: verify_async_put_domains_state(power_domains); @@ -2219,7 +2209,8 @@ intel_display_power_put_async_work(struct work_struct *work) container_of(work, struct drm_i915_private, power_domains.async_put_work.work); struct i915_power_domains *power_domains = &dev_priv->power_domains; - intel_wakeref_t new_work_wakeref = intel_runtime_pm_get_raw(dev_priv); + struct i915_runtime_pm *rpm = &dev_priv->runtime_pm; + intel_wakeref_t new_work_wakeref = intel_runtime_pm_get_raw(rpm); intel_wakeref_t old_work_wakeref = 0; mutex_lock(&power_domains->lock); @@ -2249,9 +2240,9 @@ intel_display_power_put_async_work(struct work_struct *work) mutex_unlock(&power_domains->lock); if (old_work_wakeref) - intel_runtime_pm_put_raw(dev_priv, old_work_wakeref); + intel_runtime_pm_put_raw(rpm, old_work_wakeref); if (new_work_wakeref) - intel_runtime_pm_put_raw(dev_priv, new_work_wakeref); + intel_runtime_pm_put_raw(rpm, new_work_wakeref); } /** @@ -2269,7 +2260,8 @@ void __intel_display_power_put_async(struct drm_i915_private *i915, intel_wakeref_t wakeref) { struct i915_power_domains *power_domains = &i915->power_domains; - intel_wakeref_t work_wakeref = intel_runtime_pm_get_raw(i915); + struct i915_runtime_pm *rpm = &i915->runtime_pm; + intel_wakeref_t work_wakeref = intel_runtime_pm_get_raw(rpm); mutex_lock(&power_domains->lock); @@ -2296,7 +2288,7 @@ void __intel_display_power_put_async(struct drm_i915_private *i915, mutex_unlock(&power_domains->lock); if (work_wakeref) - intel_runtime_pm_put_raw(i915, work_wakeref); + intel_runtime_pm_put_raw(rpm, work_wakeref); intel_runtime_pm_put(i915, wakeref); } @@ -2334,7 +2326,7 @@ void intel_display_power_flush_work(struct drm_i915_private *i915) mutex_unlock(&power_domains->lock); if (work_wakeref) - intel_runtime_pm_put_raw(i915, work_wakeref); + intel_runtime_pm_put_raw(&i915->runtime_pm, work_wakeref); } /** @@ -4996,24 +4988,22 @@ static void intel_power_domains_verify_state(struct drm_i915_private *i915) #endif -static intel_wakeref_t __intel_runtime_pm_get(struct drm_i915_private *i915, +static intel_wakeref_t __intel_runtime_pm_get(struct i915_runtime_pm *rpm, bool wakelock) { - struct pci_dev *pdev = i915->drm.pdev; - struct device *kdev = &pdev->dev; int ret; - ret = pm_runtime_get_sync(kdev); + ret = pm_runtime_get_sync(rpm->kdev); WARN_ONCE(ret < 0, "pm_runtime_get_sync() failed: %d\n", ret); - intel_runtime_pm_acquire(i915, wakelock); + intel_runtime_pm_acquire(rpm, wakelock); - return track_intel_runtime_pm_wakeref(i915); + return track_intel_runtime_pm_wakeref(rpm); } -static intel_wakeref_t intel_runtime_pm_get_raw(struct drm_i915_private *i915) +static intel_wakeref_t intel_runtime_pm_get_raw(struct i915_runtime_pm *rpm) { - return __intel_runtime_pm_get(i915, false); + return __intel_runtime_pm_get(rpm, false); } /** @@ -5030,7 +5020,7 @@ static intel_wakeref_t intel_runtime_pm_get_raw(struct drm_i915_private *i915) */ intel_wakeref_t intel_runtime_pm_get(struct drm_i915_private *i915) { - return __intel_runtime_pm_get(i915, true); + return __intel_runtime_pm_get(&i915->runtime_pm, true); } /** @@ -5049,23 +5039,22 @@ intel_wakeref_t intel_runtime_pm_get(struct drm_i915_private *i915) */ intel_wakeref_t intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915) { - if (IS_ENABLED(CONFIG_PM)) { - struct pci_dev *pdev = i915->drm.pdev; - struct device *kdev = &pdev->dev; + struct i915_runtime_pm *rpm = &i915->runtime_pm; + if (IS_ENABLED(CONFIG_PM)) { /* * In cases runtime PM is disabled by the RPM core and we get * an -EINVAL return value we are not supposed to call this * function, since the power state is undefined. This applies * atm to the late/early system suspend/resume handlers. */ - if (pm_runtime_get_if_in_use(kdev) <= 0) + if (pm_runtime_get_if_in_use(rpm->kdev) <= 0) return 0; } - intel_runtime_pm_acquire(i915, true); + intel_runtime_pm_acquire(rpm, true); - return track_intel_runtime_pm_wakeref(i915); + return track_intel_runtime_pm_wakeref(rpm); } /** @@ -5089,27 +5078,25 @@ intel_wakeref_t intel_runtime_pm_get_if_in_use(struct drm_i915_private *i915) */ intel_wakeref_t intel_runtime_pm_get_noresume(struct drm_i915_private *i915) { - struct pci_dev *pdev = i915->drm.pdev; - struct device *kdev = &pdev->dev; + struct i915_runtime_pm *rpm = &i915->runtime_pm; - assert_rpm_wakelock_held(i915); - pm_runtime_get_noresume(kdev); + __assert_rpm_wakelock_held(rpm); + pm_runtime_get_noresume(rpm->kdev); - intel_runtime_pm_acquire(i915, true); + intel_runtime_pm_acquire(rpm, true); - return track_intel_runtime_pm_wakeref(i915); + return track_intel_runtime_pm_wakeref(rpm); } -static void __intel_runtime_pm_put(struct drm_i915_private *i915, +static void __intel_runtime_pm_put(struct i915_runtime_pm *rpm, intel_wakeref_t wref, bool wakelock) { - struct pci_dev *pdev = i915->drm.pdev; - struct device *kdev = &pdev->dev; + struct device *kdev = rpm->kdev; - untrack_intel_runtime_pm_wakeref(i915, wref); + untrack_intel_runtime_pm_wakeref(rpm, wref); - intel_runtime_pm_release(i915, wakelock); + intel_runtime_pm_release(rpm, wakelock); pm_runtime_mark_last_busy(kdev); pm_runtime_put_autosuspend(kdev); @@ -5117,9 +5104,9 @@ static void __intel_runtime_pm_put(struct drm_i915_private *i915, #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) static void -intel_runtime_pm_put_raw(struct drm_i915_private *i915, intel_wakeref_t wref) +intel_runtime_pm_put_raw(struct i915_runtime_pm *rpm, intel_wakeref_t wref) { - __intel_runtime_pm_put(i915, wref, false); + __intel_runtime_pm_put(rpm, wref, false); } #endif @@ -5137,7 +5124,7 @@ intel_runtime_pm_put_raw(struct drm_i915_private *i915, intel_wakeref_t wref) */ void intel_runtime_pm_put_unchecked(struct drm_i915_private *i915) { - __intel_runtime_pm_put(i915, -1, true); + __intel_runtime_pm_put(&i915->runtime_pm, -1, true); } #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_RUNTIME_PM) @@ -5152,7 +5139,7 @@ void intel_runtime_pm_put_unchecked(struct drm_i915_private *i915) */ void intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref) { - __intel_runtime_pm_put(i915, wref, true); + __intel_runtime_pm_put(&i915->runtime_pm, wref, true); } #endif @@ -5168,8 +5155,8 @@ void intel_runtime_pm_put(struct drm_i915_private *i915, intel_wakeref_t wref) */ void intel_runtime_pm_enable(struct drm_i915_private *i915) { - struct pci_dev *pdev = i915->drm.pdev; - struct device *kdev = &pdev->dev; + struct i915_runtime_pm *rpm = &i915->runtime_pm; + struct device *kdev = rpm->kdev; /* * Disable the system suspend direct complete optimization, which can @@ -5190,7 +5177,7 @@ void intel_runtime_pm_enable(struct drm_i915_private *i915) * so the driver's own RPM reference tracking asserts also work on * platforms without RPM support. */ - if (!HAS_RUNTIME_PM(i915)) { + if (!rpm->available) { int ret; pm_runtime_dont_use_autosuspend(kdev); @@ -5210,8 +5197,8 @@ void intel_runtime_pm_enable(struct drm_i915_private *i915) void intel_runtime_pm_disable(struct drm_i915_private *i915) { - struct pci_dev *pdev = i915->drm.pdev; - struct device *kdev = &pdev->dev; + struct i915_runtime_pm *rpm = &i915->runtime_pm; + struct device *kdev = rpm->kdev; /* Transfer rpm ownership back to core */ WARN(pm_runtime_get_sync(kdev) < 0, @@ -5219,7 +5206,7 @@ void intel_runtime_pm_disable(struct drm_i915_private *i915) pm_runtime_dont_use_autosuspend(kdev); - if (!HAS_RUNTIME_PM(i915)) + if (!rpm->available) pm_runtime_put(kdev); } @@ -5233,10 +5220,17 @@ void intel_runtime_pm_cleanup(struct drm_i915_private *i915) intel_rpm_raw_wakeref_count(count), intel_rpm_wakelock_count(count)); - untrack_all_intel_runtime_pm_wakerefs(i915); + untrack_all_intel_runtime_pm_wakerefs(rpm); } void intel_runtime_pm_init_early(struct drm_i915_private *i915) { - init_intel_runtime_pm_wakeref(i915); + struct i915_runtime_pm *rpm = &i915->runtime_pm; + struct pci_dev *pdev = i915->drm.pdev; + struct device *kdev = &pdev->dev; + + rpm->kdev = kdev; + rpm->available = HAS_RUNTIME_PM(i915); + + init_intel_runtime_pm_wakeref(rpm); }
As a first step towards updating the code to work on the runtime_pm structure instead of i915, rework all the internals to use and pass around that. Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> --- drivers/gpu/drm/i915/i915_drv.h | 2 + drivers/gpu/drm/i915/intel_drv.h | 10 +- drivers/gpu/drm/i915/intel_runtime_pm.c | 152 ++++++++++++------------ 3 files changed, 82 insertions(+), 82 deletions(-)