Skip to content

Commit 005010f

Browse files
committed
drm/i915/psr: Split setting sff and cff bits away from intel_psr_force_update
This is a clean-up and a preparation for adding own SFF and CFF registers for LunarLake onwards. Signed-off-by: Jouni Högander <jouni.hogander@intel.com> Reviewed-by: Animesh Manna <animesh.manna@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20250213064804.2077127-4-jouni.hogander@intel.com
1 parent 8e8cadf commit 005010f

File tree

1 file changed

+31
-57
lines changed

1 file changed

+31
-57
lines changed

drivers/gpu/drm/i915/display/intel_psr.c

Lines changed: 31 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -2327,15 +2327,6 @@ static u32 man_trk_ctl_continuos_full_frame(struct intel_display *display)
23272327
static void intel_psr_force_update(struct intel_dp *intel_dp)
23282328
{
23292329
struct intel_display *display = to_intel_display(intel_dp);
2330-
enum transcoder cpu_transcoder = intel_dp->psr.transcoder;
2331-
2332-
if (intel_dp->psr.psr2_sel_fetch_enabled)
2333-
intel_de_write(display,
2334-
PSR2_MAN_TRK_CTL(display, cpu_transcoder),
2335-
man_trk_ctl_enable_bit_get(display) |
2336-
man_trk_ctl_partial_frame_bit_get(display) |
2337-
man_trk_ctl_single_full_frame_bit_get(display) |
2338-
man_trk_ctl_continuos_full_frame(display));
23392330

23402331
/*
23412332
* Display WA #0884: skl+
@@ -3131,31 +3122,31 @@ static void intel_psr_work(struct work_struct *work)
31313122
mutex_unlock(&intel_dp->psr.lock);
31323123
}
31333124

3134-
static void _psr_invalidate_handle(struct intel_dp *intel_dp)
3125+
static void intel_psr_configure_full_frame_update(struct intel_dp *intel_dp)
31353126
{
31363127
struct intel_display *display = to_intel_display(intel_dp);
31373128
enum transcoder cpu_transcoder = intel_dp->psr.transcoder;
31383129

3139-
if (intel_dp->psr.psr2_sel_fetch_enabled) {
3140-
u32 val;
3130+
if (!intel_dp->psr.psr2_sel_fetch_enabled)
3131+
return;
31413132

3142-
if (intel_dp->psr.psr2_sel_fetch_cff_enabled) {
3143-
/* Send one update otherwise lag is observed in screen */
3144-
intel_de_write(display,
3145-
CURSURFLIVE(display, intel_dp->psr.pipe),
3146-
0);
3147-
return;
3133+
intel_de_write(display,
3134+
PSR2_MAN_TRK_CTL(display, cpu_transcoder),
3135+
man_trk_ctl_enable_bit_get(display) |
3136+
man_trk_ctl_partial_frame_bit_get(display) |
3137+
man_trk_ctl_single_full_frame_bit_get(display) |
3138+
man_trk_ctl_continuos_full_frame(display));
3139+
}
3140+
3141+
static void _psr_invalidate_handle(struct intel_dp *intel_dp)
3142+
{
3143+
if (intel_dp->psr.psr2_sel_fetch_enabled) {
3144+
if (!intel_dp->psr.psr2_sel_fetch_cff_enabled) {
3145+
intel_dp->psr.psr2_sel_fetch_cff_enabled = true;
3146+
intel_psr_configure_full_frame_update(intel_dp);
31483147
}
31493148

3150-
val = man_trk_ctl_enable_bit_get(display) |
3151-
man_trk_ctl_partial_frame_bit_get(display) |
3152-
man_trk_ctl_continuos_full_frame(display);
3153-
intel_de_write(display,
3154-
PSR2_MAN_TRK_CTL(display, cpu_transcoder),
3155-
val);
3156-
intel_de_write(display,
3157-
CURSURFLIVE(display, intel_dp->psr.pipe), 0);
3158-
intel_dp->psr.psr2_sel_fetch_cff_enabled = true;
3149+
intel_psr_force_update(intel_dp);
31593150
} else {
31603151
intel_psr_exit(intel_dp);
31613152
}
@@ -3236,44 +3227,27 @@ static void _psr_flush_handle(struct intel_dp *intel_dp)
32363227
{
32373228
struct intel_display *display = to_intel_display(intel_dp);
32383229
struct drm_i915_private *dev_priv = to_i915(display->drm);
3239-
enum transcoder cpu_transcoder = intel_dp->psr.transcoder;
32403230

32413231
if (intel_dp->psr.psr2_sel_fetch_enabled) {
32423232
if (intel_dp->psr.psr2_sel_fetch_cff_enabled) {
32433233
/* can we turn CFF off? */
3244-
if (intel_dp->psr.busy_frontbuffer_bits == 0) {
3245-
u32 val = man_trk_ctl_enable_bit_get(display) |
3246-
man_trk_ctl_partial_frame_bit_get(display) |
3247-
man_trk_ctl_single_full_frame_bit_get(display) |
3248-
man_trk_ctl_continuos_full_frame(display);
3249-
3250-
/*
3251-
* Set psr2_sel_fetch_cff_enabled as false to allow selective
3252-
* updates. Still keep cff bit enabled as we don't have proper
3253-
* SU configuration in case update is sent for any reason after
3254-
* sff bit gets cleared by the HW on next vblank.
3255-
*/
3256-
intel_de_write(display,
3257-
PSR2_MAN_TRK_CTL(display, cpu_transcoder),
3258-
val);
3259-
intel_de_write(display,
3260-
CURSURFLIVE(display, intel_dp->psr.pipe),
3261-
0);
3234+
if (intel_dp->psr.busy_frontbuffer_bits == 0)
32623235
intel_dp->psr.psr2_sel_fetch_cff_enabled = false;
3263-
}
3264-
} else {
3265-
/*
3266-
* continuous full frame is disabled, only a single full
3267-
* frame is required
3268-
*/
3269-
intel_psr_force_update(intel_dp);
32703236
}
3271-
} else {
3272-
intel_psr_force_update(intel_dp);
32733237

3274-
if (!intel_dp->psr.active && !intel_dp->psr.busy_frontbuffer_bits)
3275-
queue_work(dev_priv->unordered_wq, &intel_dp->psr.work);
3238+
/*
3239+
* Still keep cff bit enabled as we don't have proper SU
3240+
* configuration in case update is sent for any reason after
3241+
* sff bit gets cleared by the HW on next vblank.
3242+
*/
3243+
intel_psr_configure_full_frame_update(intel_dp);
32763244
}
3245+
3246+
intel_psr_force_update(intel_dp);
3247+
3248+
if (!intel_dp->psr.psr2_sel_fetch_enabled && !intel_dp->psr.active &&
3249+
!intel_dp->psr.busy_frontbuffer_bits)
3250+
queue_work(dev_priv->unordered_wq, &intel_dp->psr.work);
32773251
}
32783252

32793253
/**

0 commit comments

Comments
 (0)