]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/i915: ensure correct VLV IOSF SB units have been get/put
authorJani Nikula <jani.nikula@intel.com>
Mon, 12 May 2025 14:56:59 +0000 (17:56 +0300)
committerJani Nikula <jani.nikula@intel.com>
Tue, 13 May 2025 07:26:45 +0000 (10:26 +0300)
Add some extra paranoia to check correct use of the VLV IOSF SB
get/put/read/write.

Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://lore.kernel.org/r/be6f029adf7148198821e5fe01dcf5d5406aa1fe.1747061743.git.jani.nikula@intel.com
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/vlv_iosf_sb.c

index d0e1980dcba2ca628365520c485b365ff36120a9..93b4c504b7100ff0c41a041139aabc43ebc44d0f 100644 (file)
@@ -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;
 
index c8f8589ee0be6b2132b4001f218e358360142f4d..f4b435555f3bd8f9d1b0eec6cdc5a6c9ab575679 100644 (file)
@@ -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);
 }