First, we can't assume pipe == crtc index. If a pipe is fused off in
between, it no longer holds. intel_crtc_for_pipe() is the only proper
way to get from a pipe to the corresponding crtc.

Second, drivers aren't supposed to access or index drm->vblank[]
directly. There's drm_crtc_vblank_crtc() for this.

Use both functions to fix the pipe to vblank conversion.

Fixes: f02658c46cf7 ("drm/i915/psr: Add mechanism to notify PSR of pipe 
enable/disable")
Cc: Jouni Högander <[email protected]>
Cc: <[email protected]> # v6.16+
Signed-off-by: Jani Nikula <[email protected]>
---
 drivers/gpu/drm/i915/display/intel_psr.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/display/intel_psr.c 
b/drivers/gpu/drm/i915/display/intel_psr.c
index 05014ffe3ce1..c77a92ea7919 100644
--- a/drivers/gpu/drm/i915/display/intel_psr.c
+++ b/drivers/gpu/drm/i915/display/intel_psr.c
@@ -932,7 +932,8 @@ static bool is_dc5_dc6_blocked(struct intel_dp *intel_dp)
 {
        struct intel_display *display = to_intel_display(intel_dp);
        u32 current_dc_state = 
intel_display_power_get_current_dc_state(display);
-       struct drm_vblank_crtc *vblank = 
&display->drm->vblank[intel_dp->psr.pipe];
+       struct intel_crtc *crtc = intel_crtc_for_pipe(display, 
intel_dp->psr.pipe);
+       struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(&crtc->base);
 
        return (current_dc_state != DC_STATE_EN_UPTO_DC5 &&
                current_dc_state != DC_STATE_EN_UPTO_DC6) ||
-- 
2.47.3

Reply via email to