diff options
| author | Linus Torvalds <[email protected]> | 2024-07-26 10:57:07 -0700 | 
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2024-07-26 10:57:07 -0700 | 
| commit | 0ba9b1551185a8b42003b708b6a9c25a9808701e (patch) | |
| tree | f4e23b05bfed571db2bdd037a48025a44629de41 /drivers/gpu/drm/i915/display/intel_dp_link_training.c | |
| parent | 65ad409e6388ea59d8ae73e99857c565da69612e (diff) | |
| parent | d4ef5d2b7ee0cbb5f2d864716140366a618400d6 (diff) | |
Merge tag 'drm-next-2024-07-26' of https://gitlab.freedesktop.org/drm/kernel
Pull drm fixes from Dave Airlie:
 "Fixes for rc1, mostly amdgpu, i915 and xe, with some other misc ones,
  doesn't seem to be anything too serious.
  amdgpu:
   - Bump driver version for GFX12 DCC
   - DC documention warning fixes
   - VCN unified queue power fix
   - SMU fix
   - RAS fix
   - Display corruption fix
   - SDMA 5.2 workaround
   - GFX12 fixes
   - Uninitialized variable fix
   - VCN/JPEG 4.0.3 fixes
   - Misc display fixes
   - RAS fixes
   - VCN4/5 harvest fix
   - GPU reset fix
  i915:
   - Reset intel_dp->link_trained before retraining the link
   - Don't switch the LTTPR mode on an active link
   - Do not consider preemption during execlists_dequeue for gen8
   - Allow NULL memory region
  xe:
   - xe_exec ioctl minor fix on sync entry cleanup upon error
   - SRIOV: limit VF LMEM provisioning
   - Wedge mode fixes
  v3d:
   - fix indirect dispatch on newer v3d revs
  panel:
   - fix panel backlight bindings"
* tag 'drm-next-2024-07-26' of https://gitlab.freedesktop.org/drm/kernel: (39 commits)
  drm/amdgpu: reset vm state machine after gpu reset(vram lost)
  drm/amdgpu: add missed harvest check for VCN IP v4/v5
  drm/amdgpu: Fix eeprom max record count
  drm/amdgpu: fix ras UE error injection failure issue
  drm/amd/display: Remove ASSERT if significance is zero in math_ceil2
  drm/amd/display: Check for NULL pointer
  drm/amdgpu/vcn: Use offsets local to VCN/JPEG in VF
  drm/amdgpu: Add empty HDP flush function to VCN v4.0.3
  drm/amdgpu: Add empty HDP flush function to JPEG v4.0.3
  drm/amd/amdgpu: Fix uninitialized variable warnings
  drm/amdgpu: Fix atomics on GFX12
  drm/amdgpu/sdma5.2: Update wptr registers as well as doorbell
  drm/i915: Allow NULL memory region
  drm/i915/gt: Do not consider preemption during execlists_dequeue for gen8
  dt-bindings: display: panel: samsung,atna33xc20: Document ATNA45AF01
  drm/xe: Don't suspend device upon wedge
  drm/xe: Wedge the entire device
  drm/xe/pf: Limit fair VF LMEM provisioning
  drm/xe/exec: Fix minor bug related to xe_sync_entry_cleanup
  drm/amd/display: fix corruption with high refresh rates on DCN 3.0
  ...
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_dp_link_training.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_dp_link_training.c | 55 | 
1 files changed, 48 insertions, 7 deletions
diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c index 1bc4ef84ff3b..d044c8e36bb3 100644 --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c @@ -117,10 +117,24 @@ intel_dp_set_lttpr_transparent_mode(struct intel_dp *intel_dp, bool enable)  	return drm_dp_dpcd_write(&intel_dp->aux, DP_PHY_REPEATER_MODE, &val, 1) == 1;  } -static int intel_dp_init_lttpr(struct intel_dp *intel_dp, const u8 dpcd[DP_RECEIVER_CAP_SIZE]) +static bool intel_dp_lttpr_transparent_mode_enabled(struct intel_dp *intel_dp) +{ +	return intel_dp->lttpr_common_caps[DP_PHY_REPEATER_MODE - +					   DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV] == +		DP_PHY_REPEATER_MODE_TRANSPARENT; +} + +/* + * Read the LTTPR common capabilities and switch the LTTPR PHYs to + * non-transparent mode if this is supported. Preserve the + * transparent/non-transparent mode on an active link. + * + * Return the number of detected LTTPRs in non-transparent mode or 0 if the + * LTTPRs are in transparent mode or the detection failed. + */ +static int intel_dp_init_lttpr_phys(struct intel_dp *intel_dp, const u8 dpcd[DP_RECEIVER_CAP_SIZE])  {  	int lttpr_count; -	int i;  	if (!intel_dp_read_lttpr_common_caps(intel_dp, dpcd))  		return 0; @@ -135,6 +149,19 @@ static int intel_dp_init_lttpr(struct intel_dp *intel_dp, const u8 dpcd[DP_RECEI  		return 0;  	/* +	 * Don't change the mode on an active link, to prevent a loss of link +	 * synchronization. See DP Standard v2.0 3.6.7. about the LTTPR +	 * resetting its internal state when the mode is changed from +	 * non-transparent to transparent. +	 */ +	if (intel_dp->link_trained) { +		if (lttpr_count < 0 || intel_dp_lttpr_transparent_mode_enabled(intel_dp)) +			goto out_reset_lttpr_count; + +		return lttpr_count; +	} + +	/*  	 * See DP Standard v2.0 3.6.6.1. about the explicit disabling of  	 * non-transparent mode and the disable->enable non-transparent mode  	 * sequence. @@ -154,11 +181,25 @@ static int intel_dp_init_lttpr(struct intel_dp *intel_dp, const u8 dpcd[DP_RECEI  		       "Switching to LTTPR non-transparent LT mode failed, fall-back to transparent mode\n");  		intel_dp_set_lttpr_transparent_mode(intel_dp, true); -		intel_dp_reset_lttpr_count(intel_dp); -		return 0; +		goto out_reset_lttpr_count;  	} +	return lttpr_count; + +out_reset_lttpr_count: +	intel_dp_reset_lttpr_count(intel_dp); + +	return 0; +} + +static int intel_dp_init_lttpr(struct intel_dp *intel_dp, const u8 dpcd[DP_RECEIVER_CAP_SIZE]) +{ +	int lttpr_count; +	int i; + +	lttpr_count = intel_dp_init_lttpr_phys(intel_dp, dpcd); +  	for (i = 0; i < lttpr_count; i++)  		intel_dp_read_lttpr_phy_caps(intel_dp, dpcd, DP_PHY_LTTPR(i)); @@ -1482,10 +1523,10 @@ void intel_dp_start_link_train(struct intel_atomic_state *state,  	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);  	struct intel_encoder *encoder = &dig_port->base;  	bool passed; -  	/* -	 * TODO: Reiniting LTTPRs here won't be needed once proper connector -	 * HW state readout is added. +	 * Reinit the LTTPRs here to ensure that they are switched to +	 * non-transparent mode. During an earlier LTTPR detection this +	 * could've been prevented by an active link.  	 */  	int lttpr_count = intel_dp_init_lttpr_and_dprx_caps(intel_dp);  |