File tree Expand file tree Collapse file tree 3 files changed +23
-4
lines changed Expand file tree Collapse file tree 3 files changed +23
-4
lines changed Original file line number Diff line number Diff line change @@ -1730,6 +1730,8 @@ bool intel_sdvo_init(struct drm_device *dev,
1730
1730
1731
1731
1732
1732
/* intel_sprite.c */
1733
+ int intel_usecs_to_scanlines (const struct drm_display_mode * adjusted_mode ,
1734
+ int usecs );
1733
1735
int intel_plane_init (struct drm_device * dev , enum pipe pipe , int plane );
1734
1736
int intel_sprite_set_colorkey (struct drm_device * dev , void * data ,
1735
1737
struct drm_file * file_priv );
Original file line number Diff line number Diff line change @@ -327,6 +327,9 @@ static bool intel_psr_match_conditions(struct intel_dp *intel_dp)
327
327
struct drm_i915_private * dev_priv = to_i915 (dev );
328
328
struct drm_crtc * crtc = dig_port -> base .base .crtc ;
329
329
struct intel_crtc * intel_crtc = to_intel_crtc (crtc );
330
+ const struct drm_display_mode * adjusted_mode =
331
+ & intel_crtc -> config -> base .adjusted_mode ;
332
+ int psr_setup_time ;
330
333
331
334
lockdep_assert_held (& dev_priv -> psr .lock );
332
335
WARN_ON (!drm_modeset_is_locked (& dev -> mode_config .connection_mutex ));
@@ -365,11 +368,25 @@ static bool intel_psr_match_conditions(struct intel_dp *intel_dp)
365
368
}
366
369
367
370
if (IS_HASWELL (dev ) &&
368
- intel_crtc -> config -> base . adjusted_mode . flags & DRM_MODE_FLAG_INTERLACE ) {
371
+ adjusted_mode -> flags & DRM_MODE_FLAG_INTERLACE ) {
369
372
DRM_DEBUG_KMS ("PSR condition failed: Interlaced is Enabled\n" );
370
373
return false;
371
374
}
372
375
376
+ psr_setup_time = drm_dp_psr_setup_time (intel_dp -> psr_dpcd );
377
+ if (psr_setup_time < 0 ) {
378
+ DRM_DEBUG_KMS ("PSR condition failed: Invalid PSR setup time (0x%02x)\n" ,
379
+ intel_dp -> psr_dpcd [1 ]);
380
+ return false;
381
+ }
382
+
383
+ if (intel_usecs_to_scanlines (adjusted_mode , psr_setup_time ) >
384
+ adjusted_mode -> crtc_vtotal - adjusted_mode -> crtc_vdisplay - 1 ) {
385
+ DRM_DEBUG_KMS ("PSR condition failed: PSR setup time (%d us) too long\n" ,
386
+ psr_setup_time );
387
+ return false;
388
+ }
389
+
373
390
dev_priv -> psr .source_ok = true;
374
391
return true;
375
392
}
Original file line number Diff line number Diff line change @@ -53,8 +53,8 @@ format_is_yuv(uint32_t format)
53
53
}
54
54
}
55
55
56
- static int usecs_to_scanlines (const struct drm_display_mode * adjusted_mode ,
57
- int usecs )
56
+ int intel_usecs_to_scanlines (const struct drm_display_mode * adjusted_mode ,
57
+ int usecs )
58
58
{
59
59
/* paranoia */
60
60
if (!adjusted_mode -> crtc_htotal )
@@ -91,7 +91,7 @@ void intel_pipe_update_start(struct intel_crtc *crtc)
91
91
vblank_start = DIV_ROUND_UP (vblank_start , 2 );
92
92
93
93
/* FIXME needs to be calibrated sensibly */
94
- min = vblank_start - usecs_to_scanlines (adjusted_mode , 100 );
94
+ min = vblank_start - intel_usecs_to_scanlines (adjusted_mode , 100 );
95
95
max = vblank_start - 1 ;
96
96
97
97
local_irq_disable ();
You can’t perform that action at this time.
0 commit comments