Skip to content

Commit 30afd24

Browse files
committed
Merge tag 'drm-intel-fixes-2026-05-20' of https://gitlab.freedesktop.org/drm/i915/kernel into drm-fixes
- Fix joiner color pipeline selection [display] (Chaitanya Kumar Borah) - Fix readback for target_rr in Adaptive Sync SDP [dp] (Ankit Nautiyal) - Apply Intel DPCD workaround when SDP on prior line used [psr] (Jouni Högander) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Tvrtko Ursulin <tursulin@igalia.com> Link: https://patch.msgid.link/ag1hKBRKwwv9JOMW@linux
2 parents 5b4a47d + 4703049 commit 30afd24

5 files changed

Lines changed: 57 additions & 7 deletions

File tree

drivers/gpu/drm/i915/display/intel_display_types.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,7 @@ struct intel_connector {
584584

585585
struct {
586586
u8 dpcd[EDP_PSR_RECEIVER_CAP_SIZE];
587+
u8 intel_wa_dpcd;
587588

588589
bool support;
589590
bool su_support;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5303,7 +5303,7 @@ int intel_dp_as_sdp_unpack(struct drm_dp_as_sdp *as_sdp,
53035303
as_sdp->length = sdp->sdp_header.HB3 & DP_ADAPTIVE_SYNC_SDP_LENGTH;
53045304
as_sdp->mode = sdp->db[0] & DP_ADAPTIVE_SYNC_SDP_OPERATION_MODE;
53055305
as_sdp->vtotal = (sdp->db[2] << 8) | sdp->db[1];
5306-
as_sdp->target_rr = (u64)sdp->db[3] | ((u64)sdp->db[4] & 0x3);
5306+
as_sdp->target_rr = ((sdp->db[4] & 0x3) << 8) | sdp->db[3];
53075307
as_sdp->target_rr_divider = sdp->db[4] & 0x20 ? true : false;
53085308

53095309
return 0;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/* SPDX-License-Identifier: MIT */
2+
/*
3+
* Copyright © 2026 Intel Corporation
4+
*/
5+
6+
#ifndef __INTEL_DPCD_H__
7+
#define __INTEL_DPCD_H__
8+
9+
#define INTEL_DPCD_INTEL_WA_REGISTER_CAPS 0x3f0
10+
# define INTEL_DPCD_INTEL_WA_REGISTER_CAPS_PSR2_EARLYSCANLINE_SDP_SUPPORT_MASK REG_GENMASK(1, 0)
11+
# define INTEL_DPCD_INTEL_WA_REGISTER_CAPS_FALL_BACK_TO_PSR1 0
12+
# define INTEL_DPCD_INTEL_WA_REGISTER_CAPS_PSR2_WITH_EARLY_SCANLINE 1
13+
# define INTEL_DPCD_INTEL_WA_REGISTER_CAPS_PSR2_WITHOUT_EARLY_SCANLINE 2
14+
15+
#endif /* __INTEL_DPCD_H__ */

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ intel_plane_color_copy_uapi_to_hw_state(struct intel_plane_state *plane_state,
373373
bool changed = false;
374374
int i = 0;
375375

376-
iter_colorop = plane_state->uapi.color_pipeline;
376+
iter_colorop = from_plane_state->uapi.color_pipeline;
377377

378378
while (iter_colorop) {
379379
for_each_new_colorop_in_state(state, colorop, new_colorop_state, i) {

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

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
#include "intel_display_wa.h"
4444
#include "intel_dmc.h"
4545
#include "intel_dp.h"
46+
#include "intel_dpcd.h"
4647
#include "intel_dp_aux.h"
4748
#include "intel_dsb.h"
4849
#include "intel_frontbuffer.h"
@@ -716,8 +717,14 @@ static void _psr_init_dpcd(struct intel_dp *intel_dp, struct intel_connector *co
716717
connector->dp.psr_caps.su_support ? "" : "not ");
717718
}
718719

719-
if (connector->dp.psr_caps.su_support)
720+
if (connector->dp.psr_caps.su_support) {
721+
ret = drm_dp_dpcd_read_byte(&intel_dp->aux,
722+
INTEL_DPCD_INTEL_WA_REGISTER_CAPS,
723+
&connector->dp.psr_caps.intel_wa_dpcd);
724+
if (ret < 0)
725+
return;
720726
_psr_compute_su_granularity(intel_dp, connector);
727+
}
721728
}
722729

723730
void intel_psr_init_dpcd(struct intel_dp *intel_dp, struct intel_connector *connector)
@@ -1358,9 +1365,35 @@ static bool psr2_granularity_check(struct intel_crtc_state *crtc_state,
13581365
return true;
13591366
}
13601367

1361-
static bool _compute_psr2_sdp_prior_scanline_indication(struct intel_dp *intel_dp,
1362-
struct intel_crtc_state *crtc_state)
1368+
static bool apply_scanline_indication_wa(struct intel_crtc_state *crtc_state,
1369+
struct intel_connector *connector)
1370+
{
1371+
struct intel_dp *intel_dp = intel_attached_dp(connector);
1372+
u8 early_scanline_support = connector->dp.psr_caps.intel_wa_dpcd &
1373+
INTEL_DPCD_INTEL_WA_REGISTER_CAPS_PSR2_EARLYSCANLINE_SDP_SUPPORT_MASK;
1374+
1375+
if (intel_dp->edp_dpcd[0] >= DP_EDP_15)
1376+
return true;
1377+
1378+
switch (early_scanline_support) {
1379+
case INTEL_DPCD_INTEL_WA_REGISTER_CAPS_FALL_BACK_TO_PSR1:
1380+
crtc_state->req_psr2_sdp_prior_scanline = false;
1381+
return false;
1382+
case INTEL_DPCD_INTEL_WA_REGISTER_CAPS_PSR2_WITH_EARLY_SCANLINE:
1383+
return true;
1384+
case INTEL_DPCD_INTEL_WA_REGISTER_CAPS_PSR2_WITHOUT_EARLY_SCANLINE:
1385+
crtc_state->req_psr2_sdp_prior_scanline = false;
1386+
return true;
1387+
default:
1388+
MISSING_CASE(early_scanline_support);
1389+
return false;
1390+
}
1391+
}
1392+
1393+
static bool _compute_psr2_sdp_prior_scanline_indication(struct intel_crtc_state *crtc_state,
1394+
struct intel_connector *connector)
13631395
{
1396+
struct intel_dp *intel_dp = intel_attached_dp(connector);
13641397
struct intel_display *display = to_intel_display(intel_dp);
13651398
const struct drm_display_mode *adjusted_mode = &crtc_state->uapi.adjusted_mode;
13661399
u32 hblank_total, hblank_ns, req_ns;
@@ -1379,7 +1412,8 @@ static bool _compute_psr2_sdp_prior_scanline_indication(struct intel_dp *intel_d
13791412
return false;
13801413

13811414
crtc_state->req_psr2_sdp_prior_scanline = true;
1382-
return true;
1415+
1416+
return apply_scanline_indication_wa(crtc_state, connector);
13831417
}
13841418

13851419
static int intel_psr_entry_setup_frames(struct intel_dp *intel_dp,
@@ -1660,7 +1694,7 @@ static bool intel_sel_update_config_valid(struct intel_crtc_state *crtc_state,
16601694
conn_state))
16611695
goto unsupported;
16621696

1663-
if (!_compute_psr2_sdp_prior_scanline_indication(intel_dp, crtc_state)) {
1697+
if (!_compute_psr2_sdp_prior_scanline_indication(crtc_state, connector)) {
16641698
drm_dbg_kms(display->drm,
16651699
"Selective update not enabled, SDP indication do not fit in hblank\n");
16661700
goto unsupported;

0 commit comments

Comments
 (0)