Skip to content

Commit

Permalink
drm/i915: forcewake struct mutex locking fixes
Browse files Browse the repository at this point in the history
Found by the new strict checking for the mutex being held whilst
manipulating the forcewake status.

Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Keith Packard <keithp@keithp.com>
  • Loading branch information
Ben Widawsky authored and Keith Packard committed May 10, 2011
1 parent fcca792 commit d1ebd81
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 2 deletions.
10 changes: 8 additions & 2 deletions drivers/gpu/drm/i915/i915_debugfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -853,6 +853,7 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused)
struct drm_info_node *node = (struct drm_info_node *) m->private;
struct drm_device *dev = node->minor->dev;
drm_i915_private_t *dev_priv = dev->dev_private;
int ret;

if (IS_GEN5(dev)) {
u16 rgvswctl = I915_READ16(MEMSWCTL);
Expand All @@ -874,6 +875,10 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused)
int max_freq;

/* RPSTAT1 is in the GT power well */
ret = mutex_lock_interruptible(&dev->struct_mutex);
if (ret)
return ret;

gen6_gt_force_wake_get(dev_priv);

rpstat = I915_READ(GEN6_RPSTAT1);
Expand All @@ -884,6 +889,9 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused)
rpcurdown = I915_READ(GEN6_RP_CUR_DOWN);
rpprevdown = I915_READ(GEN6_RP_PREV_DOWN);

gen6_gt_force_wake_put(dev_priv);
mutex_unlock(&dev->struct_mutex);

seq_printf(m, "GT_PERF_STATUS: 0x%08x\n", gt_perf_status);
seq_printf(m, "RPSTAT1: 0x%08x\n", rpstat);
seq_printf(m, "Render p-state ratio: %d\n",
Expand Down Expand Up @@ -918,8 +926,6 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused)
max_freq = rp_state_cap & 0xff;
seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n",
max_freq * 50);

gen6_gt_force_wake_put(dev_priv);
} else {
seq_printf(m, "no P-state info available\n");
}
Expand Down
9 changes: 9 additions & 0 deletions drivers/gpu/drm/i915/intel_display.c
Original file line number Diff line number Diff line change
Expand Up @@ -2585,7 +2585,11 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
ironlake_pch_enable(crtc);

intel_crtc_load_lut(crtc);

mutex_lock(&dev->struct_mutex);
intel_update_fbc(dev);
mutex_unlock(&dev->struct_mutex);

intel_crtc_update_cursor(crtc, true);
}

Expand Down Expand Up @@ -2681,8 +2685,11 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)

intel_crtc->active = false;
intel_update_watermarks(dev);

mutex_lock(&dev->struct_mutex);
intel_update_fbc(dev);
intel_clear_scanline_wait(dev);
mutex_unlock(&dev->struct_mutex);
}

static void ironlake_crtc_dpms(struct drm_crtc *crtc, int mode)
Expand Down Expand Up @@ -6973,6 +6980,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv)
* userspace...
*/
I915_WRITE(GEN6_RC_STATE, 0);
mutex_lock(&dev_priv->dev->struct_mutex);
gen6_gt_force_wake_get(dev_priv);

/* disable the counters and set deterministic thresholds */
Expand Down Expand Up @@ -7075,6 +7083,7 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv)
I915_WRITE(GEN6_PMINTRMSK, 0);

gen6_gt_force_wake_put(dev_priv);
mutex_unlock(&dev_priv->dev->struct_mutex);
}

void intel_enable_clock_gating(struct drm_device *dev)
Expand Down

0 comments on commit d1ebd81

Please sign in to comment.