Commit da5827c3 authored by Imre Deak's avatar Imre Deak

drm/i915: add assert_rpm_wakelock_held helper

As a preparation for follow-up patches add a new helper that checks
whether we hold an RPM reference, since this is what we want most of
the cases. Atm this helper will only check for the HW suspended state, a
follow-up patch will do the actual change to check the refcount instead.
One exception is the forcewake release timer function, where it's
guaranteed that the HW is on even though the RPM refcount drops to zero.
This guarantee is provided by flushing the timer in the runtime suspend
handler. So leave the assert_device_not_suspended check in place there.

Also rename assert_device_suspended for consistency and export these
helpers as a preparation for the follow-up patches.

No functional change.

v3:
- change the assert warning message to be more meaningful (Chris)
Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: http://patchwork.freedesktop.org/patch/msgid/1450203038-5150-6-git-send-email-imre.deak@intel.com
parent 7f233235
...@@ -1430,6 +1430,20 @@ void intel_display_power_get(struct drm_i915_private *dev_priv, ...@@ -1430,6 +1430,20 @@ void intel_display_power_get(struct drm_i915_private *dev_priv,
enum intel_display_power_domain domain); enum intel_display_power_domain domain);
void intel_display_power_put(struct drm_i915_private *dev_priv, void intel_display_power_put(struct drm_i915_private *dev_priv,
enum intel_display_power_domain domain); enum intel_display_power_domain domain);
static inline void
assert_rpm_device_not_suspended(struct drm_i915_private *dev_priv)
{
WARN_ONCE(dev_priv->pm.suspended,
"Device suspended during HW access\n");
}
static inline void
assert_rpm_wakelock_held(struct drm_i915_private *dev_priv)
{
assert_rpm_device_not_suspended(dev_priv);
}
void intel_runtime_pm_get(struct drm_i915_private *dev_priv); void intel_runtime_pm_get(struct drm_i915_private *dev_priv);
void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv); void intel_runtime_pm_get_noresume(struct drm_i915_private *dev_priv);
void intel_runtime_pm_put(struct drm_i915_private *dev_priv); void intel_runtime_pm_put(struct drm_i915_private *dev_priv);
......
...@@ -50,12 +50,6 @@ intel_uncore_forcewake_domain_to_str(const enum forcewake_domain_id id) ...@@ -50,12 +50,6 @@ intel_uncore_forcewake_domain_to_str(const enum forcewake_domain_id id)
return "unknown"; return "unknown";
} }
static void
assert_device_not_suspended(struct drm_i915_private *dev_priv)
{
WARN_ONCE(dev_priv->pm.suspended, "Device suspended\n");
}
static inline void static inline void
fw_domain_reset(const struct intel_uncore_forcewake_domain *d) fw_domain_reset(const struct intel_uncore_forcewake_domain *d)
{ {
...@@ -235,7 +229,7 @@ static void intel_uncore_fw_release_timer(unsigned long arg) ...@@ -235,7 +229,7 @@ static void intel_uncore_fw_release_timer(unsigned long arg)
struct intel_uncore_forcewake_domain *domain = (void *)arg; struct intel_uncore_forcewake_domain *domain = (void *)arg;
unsigned long irqflags; unsigned long irqflags;
assert_device_not_suspended(domain->i915); assert_rpm_device_not_suspended(domain->i915);
spin_lock_irqsave(&domain->i915->uncore.lock, irqflags); spin_lock_irqsave(&domain->i915->uncore.lock, irqflags);
if (WARN_ON(domain->wake_count == 0)) if (WARN_ON(domain->wake_count == 0))
...@@ -627,7 +621,7 @@ hsw_unclaimed_reg_detect(struct drm_i915_private *dev_priv) ...@@ -627,7 +621,7 @@ hsw_unclaimed_reg_detect(struct drm_i915_private *dev_priv)
#define GEN2_READ_HEADER(x) \ #define GEN2_READ_HEADER(x) \
u##x val = 0; \ u##x val = 0; \
assert_device_not_suspended(dev_priv); assert_rpm_wakelock_held(dev_priv);
#define GEN2_READ_FOOTER \ #define GEN2_READ_FOOTER \
trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \ trace_i915_reg_rw(false, reg, val, sizeof(val), trace); \
...@@ -669,7 +663,7 @@ __gen2_read(64) ...@@ -669,7 +663,7 @@ __gen2_read(64)
u32 offset = i915_mmio_reg_offset(reg); \ u32 offset = i915_mmio_reg_offset(reg); \
unsigned long irqflags; \ unsigned long irqflags; \
u##x val = 0; \ u##x val = 0; \
assert_device_not_suspended(dev_priv); \ assert_rpm_wakelock_held(dev_priv); \
spin_lock_irqsave(&dev_priv->uncore.lock, irqflags) spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)
#define GEN6_READ_FOOTER \ #define GEN6_READ_FOOTER \
...@@ -802,7 +796,7 @@ __gen6_read(64) ...@@ -802,7 +796,7 @@ __gen6_read(64)
#define VGPU_READ_HEADER(x) \ #define VGPU_READ_HEADER(x) \
unsigned long irqflags; \ unsigned long irqflags; \
u##x val = 0; \ u##x val = 0; \
assert_device_not_suspended(dev_priv); \ assert_rpm_device_not_suspended(dev_priv); \
spin_lock_irqsave(&dev_priv->uncore.lock, irqflags) spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)
#define VGPU_READ_FOOTER \ #define VGPU_READ_FOOTER \
...@@ -829,7 +823,7 @@ __vgpu_read(64) ...@@ -829,7 +823,7 @@ __vgpu_read(64)
#define GEN2_WRITE_HEADER \ #define GEN2_WRITE_HEADER \
trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \ trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
assert_device_not_suspended(dev_priv); \ assert_rpm_wakelock_held(dev_priv); \
#define GEN2_WRITE_FOOTER #define GEN2_WRITE_FOOTER
...@@ -869,7 +863,7 @@ __gen2_write(64) ...@@ -869,7 +863,7 @@ __gen2_write(64)
u32 offset = i915_mmio_reg_offset(reg); \ u32 offset = i915_mmio_reg_offset(reg); \
unsigned long irqflags; \ unsigned long irqflags; \
trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \ trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
assert_device_not_suspended(dev_priv); \ assert_rpm_wakelock_held(dev_priv); \
spin_lock_irqsave(&dev_priv->uncore.lock, irqflags) spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)
#define GEN6_WRITE_FOOTER \ #define GEN6_WRITE_FOOTER \
...@@ -1045,7 +1039,7 @@ __gen6_write(64) ...@@ -1045,7 +1039,7 @@ __gen6_write(64)
#define VGPU_WRITE_HEADER \ #define VGPU_WRITE_HEADER \
unsigned long irqflags; \ unsigned long irqflags; \
trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \ trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
assert_device_not_suspended(dev_priv); \ assert_rpm_device_not_suspended(dev_priv); \
spin_lock_irqsave(&dev_priv->uncore.lock, irqflags) spin_lock_irqsave(&dev_priv->uncore.lock, irqflags)
#define VGPU_WRITE_FOOTER \ #define VGPU_WRITE_FOOTER \
......
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