Commit 11b5b1bd authored by Jani Nikula's avatar Jani Nikula
Browse files

drm/i915: ensure correct VLV IOSF SB units have been get/put



Add some extra paranoia to check correct use of the VLV IOSF SB
get/put/read/write.

Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://lore.kernel.org/r/be6f029adf7148198821e5fe01dcf5d5406aa1fe.1747061743.git.jani.nikula@intel.com


Signed-off-by: default avatarJani Nikula <jani.nikula@intel.com>
parent 52d83615
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -230,6 +230,7 @@ struct drm_i915_private {
	/* VLV/CHV IOSF sideband */
	struct {
		struct mutex lock; /* protect sideband access */
		unsigned long locked_unit_mask;
		struct pm_qos_request qos;
	} vlv_iosf_sb;

+10 −0
Original line number Diff line number Diff line
@@ -65,12 +65,18 @@ void vlv_iosf_sb_get(struct drm_device *drm, unsigned long unit_mask)
		__vlv_punit_get(i915);

	mutex_lock(&i915->vlv_iosf_sb.lock);

	i915->vlv_iosf_sb.locked_unit_mask |= unit_mask;
}

void vlv_iosf_sb_put(struct drm_device *drm, unsigned long unit_mask)
{
	struct drm_i915_private *i915 = to_i915(drm);

	i915->vlv_iosf_sb.locked_unit_mask &= ~unit_mask;

	drm_WARN_ON(drm, i915->vlv_iosf_sb.locked_unit_mask);

	mutex_unlock(&i915->vlv_iosf_sb.lock);

	if (unit_mask & BIT(VLV_IOSF_SB_PUNIT))
@@ -182,6 +188,8 @@ u32 vlv_iosf_sb_read(struct drm_device *drm, enum vlv_iosf_sb_unit unit, u32 add
	if (drm_WARN_ONCE(&i915->drm, !port, "invalid unit %d\n", unit))
		return 0;

	drm_WARN_ON(&i915->drm, !(i915->vlv_iosf_sb.locked_unit_mask & BIT(unit)));

	vlv_sideband_rw(i915, devfn, port, opcode, addr, &val);

	return val;
@@ -199,6 +207,8 @@ int vlv_iosf_sb_write(struct drm_device *drm, enum vlv_iosf_sb_unit unit, u32 ad
	if (drm_WARN_ONCE(&i915->drm, !port, "invalid unit %d\n", unit))
		return -EINVAL;

	drm_WARN_ON(&i915->drm, !(i915->vlv_iosf_sb.locked_unit_mask & BIT(unit)));

	return vlv_sideband_rw(i915, devfn, port, opcode, addr, &val);
}