Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/i915: Deal with bigjoiner vs. DRRS

DRRS operates on transcoder level, so we should only poke at it from
the master crtc rather than letting every joined pipe give it
potentially conflicting input.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220315132752.11849-9-ville.syrjala@linux.intel.com
Reviewed-by: Manasi Navare <manasi.d.navare@intel.com>

+15 -1
+15 -1
drivers/gpu/drm/i915/display/intel_drrs.c
··· 176 176 static unsigned int intel_drrs_frontbuffer_bits(const struct intel_crtc_state *crtc_state) 177 177 { 178 178 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 179 + struct drm_i915_private *i915 = to_i915(crtc->base.dev); 180 + unsigned int frontbuffer_bits; 179 181 180 - return INTEL_FRONTBUFFER_ALL_MASK(crtc->pipe); 182 + frontbuffer_bits = INTEL_FRONTBUFFER_ALL_MASK(crtc->pipe); 183 + 184 + for_each_intel_crtc_in_pipe_mask(&i915->drm, crtc, 185 + crtc_state->bigjoiner_pipes) 186 + frontbuffer_bits |= INTEL_FRONTBUFFER_ALL_MASK(crtc->pipe); 187 + 188 + return frontbuffer_bits; 181 189 } 182 190 183 191 /** ··· 202 194 return; 203 195 204 196 if (!crtc_state->hw.active) 197 + return; 198 + 199 + if (intel_crtc_is_bigjoiner_slave(crtc_state)) 205 200 return; 206 201 207 202 mutex_lock(&crtc->drrs.mutex); ··· 232 221 return; 233 222 234 223 if (!old_crtc_state->hw.active) 224 + return; 225 + 226 + if (intel_crtc_is_bigjoiner_slave(old_crtc_state)) 235 227 return; 236 228 237 229 mutex_lock(&crtc->drrs.mutex);