Commit eb17af67 authored by Daniele Ceraolo Spurio's avatar Daniele Ceraolo Spurio Committed by Chris Wilson

drm/i915: take a ref to the rpm in the uncore structure

Remove a bit of pointer dancing in the reg access path.
Signed-off-by: default avatarDaniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20190325214940.23632-5-daniele.ceraolospurio@intel.com
parent 2cf7bf6f
...@@ -2269,20 +2269,26 @@ void icl_dbuf_slices_update(struct drm_i915_private *dev_priv, ...@@ -2269,20 +2269,26 @@ void icl_dbuf_slices_update(struct drm_i915_private *dev_priv,
u8 req_slices); u8 req_slices);
static inline void static inline void
assert_rpm_device_not_suspended(struct drm_i915_private *i915) assert_rpm_device_not_suspended(struct i915_runtime_pm *rpm)
{ {
WARN_ONCE(i915->runtime_pm.suspended, WARN_ONCE(rpm->suspended,
"Device suspended during HW access\n"); "Device suspended during HW access\n");
} }
static inline void static inline void
assert_rpm_wakelock_held(struct drm_i915_private *i915) __assert_rpm_wakelock_held(struct i915_runtime_pm *rpm)
{ {
assert_rpm_device_not_suspended(i915); assert_rpm_device_not_suspended(rpm);
WARN_ONCE(!atomic_read(&i915->runtime_pm.wakeref_count), WARN_ONCE(!atomic_read(&rpm->wakeref_count),
"RPM wakelock ref not held during HW access"); "RPM wakelock ref not held during HW access");
} }
static inline void
assert_rpm_wakelock_held(struct drm_i915_private *i915)
{
__assert_rpm_wakelock_held(&i915->runtime_pm);
}
/** /**
* disable_rpm_wakeref_asserts - disable the RPM assert checks * disable_rpm_wakeref_asserts - disable the RPM assert checks
* @i915: i915 device instance * @i915: i915 device instance
......
...@@ -342,7 +342,7 @@ intel_uncore_fw_release_timer(struct hrtimer *timer) ...@@ -342,7 +342,7 @@ intel_uncore_fw_release_timer(struct hrtimer *timer)
struct intel_uncore *uncore = forcewake_domain_to_uncore(domain); struct intel_uncore *uncore = forcewake_domain_to_uncore(domain);
unsigned long irqflags; unsigned long irqflags;
assert_rpm_device_not_suspended(uncore_to_i915(uncore)); assert_rpm_device_not_suspended(uncore->rpm);
if (xchg(&domain->active, false)) if (xchg(&domain->active, false))
return HRTIMER_RESTART; return HRTIMER_RESTART;
...@@ -623,7 +623,7 @@ void intel_uncore_forcewake_get(struct intel_uncore *uncore, ...@@ -623,7 +623,7 @@ void intel_uncore_forcewake_get(struct intel_uncore *uncore,
if (!uncore->funcs.force_wake_get) if (!uncore->funcs.force_wake_get)
return; return;
assert_rpm_wakelock_held(uncore_to_i915(uncore)); __assert_rpm_wakelock_held(uncore->rpm);
spin_lock_irqsave(&uncore->lock, irqflags); spin_lock_irqsave(&uncore->lock, irqflags);
__intel_uncore_forcewake_get(uncore, fw_domains); __intel_uncore_forcewake_get(uncore, fw_domains);
...@@ -777,7 +777,7 @@ void assert_forcewakes_active(struct intel_uncore *uncore, ...@@ -777,7 +777,7 @@ void assert_forcewakes_active(struct intel_uncore *uncore,
if (!uncore->funcs.force_wake_get) if (!uncore->funcs.force_wake_get)
return; return;
assert_rpm_wakelock_held(uncore_to_i915(uncore)); __assert_rpm_wakelock_held(uncore->rpm);
fw_domains &= uncore->fw_domains; fw_domains &= uncore->fw_domains;
WARN(fw_domains & ~uncore->fw_domains_active, WARN(fw_domains & ~uncore->fw_domains_active,
...@@ -1095,7 +1095,7 @@ unclaimed_reg_debug(struct intel_uncore *uncore, ...@@ -1095,7 +1095,7 @@ unclaimed_reg_debug(struct intel_uncore *uncore,
#define GEN2_READ_HEADER(x) \ #define GEN2_READ_HEADER(x) \
struct intel_uncore *uncore = &dev_priv->uncore; \ struct intel_uncore *uncore = &dev_priv->uncore; \
u##x val = 0; \ u##x val = 0; \
assert_rpm_wakelock_held(dev_priv); __assert_rpm_wakelock_held(uncore->rpm);
#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); \
...@@ -1138,7 +1138,7 @@ __gen2_read(64) ...@@ -1138,7 +1138,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_rpm_wakelock_held(dev_priv); \ __assert_rpm_wakelock_held(uncore->rpm); \
spin_lock_irqsave(&uncore->lock, irqflags); \ spin_lock_irqsave(&uncore->lock, irqflags); \
unclaimed_reg_debug(uncore, reg, true, true) unclaimed_reg_debug(uncore, reg, true, true)
...@@ -1213,7 +1213,7 @@ __gen6_read(64) ...@@ -1213,7 +1213,7 @@ __gen6_read(64)
#define GEN2_WRITE_HEADER \ #define GEN2_WRITE_HEADER \
struct intel_uncore *uncore = &dev_priv->uncore; \ struct intel_uncore *uncore = &dev_priv->uncore; \
trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \ trace_i915_reg_rw(true, reg, val, sizeof(val), trace); \
assert_rpm_wakelock_held(dev_priv); \ __assert_rpm_wakelock_held(uncore->rpm); \
#define GEN2_WRITE_FOOTER #define GEN2_WRITE_FOOTER
...@@ -1252,7 +1252,7 @@ __gen2_write(32) ...@@ -1252,7 +1252,7 @@ __gen2_write(32)
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_rpm_wakelock_held(dev_priv); \ __assert_rpm_wakelock_held(uncore->rpm); \
spin_lock_irqsave(&uncore->lock, irqflags); \ spin_lock_irqsave(&uncore->lock, irqflags); \
unclaimed_reg_debug(uncore, reg, false, true) unclaimed_reg_debug(uncore, reg, false, true)
...@@ -1596,6 +1596,8 @@ int intel_uncore_init(struct intel_uncore *uncore) ...@@ -1596,6 +1596,8 @@ int intel_uncore_init(struct intel_uncore *uncore)
uncore->pmic_bus_access_nb.notifier_call = uncore->pmic_bus_access_nb.notifier_call =
i915_pmic_bus_access_notifier; i915_pmic_bus_access_notifier;
uncore->rpm = &i915->runtime_pm;
if (!intel_uncore_has_forcewake(uncore)) { if (!intel_uncore_has_forcewake(uncore)) {
if (IS_GEN(i915, 5)) { if (IS_GEN(i915, 5)) {
ASSIGN_WRITE_MMIO_VFUNCS(uncore, gen5); ASSIGN_WRITE_MMIO_VFUNCS(uncore, gen5);
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#include "i915_reg.h" #include "i915_reg.h"
struct drm_i915_private; struct drm_i915_private;
struct i915_runtime_pm;
struct intel_uncore; struct intel_uncore;
enum forcewake_domain_id { enum forcewake_domain_id {
...@@ -95,6 +96,8 @@ struct intel_forcewake_range { ...@@ -95,6 +96,8 @@ struct intel_forcewake_range {
struct intel_uncore { struct intel_uncore {
void __iomem *regs; void __iomem *regs;
struct i915_runtime_pm *rpm;
spinlock_t lock; /** lock is also taken in irq contexts. */ spinlock_t lock; /** lock is also taken in irq contexts. */
unsigned int flags; unsigned int flags;
......
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