Skip to content

Commit ecf8a99

Browse files
committed
Merge tag 'drm-intel-fixes-2022-02-24' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes
- Fix QGV handling on ADL-P+ (Ville Syrjälä) - Fix bw atomic check when switching between SAGV vs. no SAGV (Ville Syrjälä) - Disconnect PHYs left connected by BIOS on disabled ports (Imre Deak) - Fix SAVG to no SAGV transitions on TGL+ (Ville Syrjälä) - Print PHY name properly on calibration error (DG2) (Matt Roper) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/YhdyHwRWkOTWwlqi@tursulin-mobl2
2 parents 7c17b3d + 28adef8 commit ecf8a99

5 files changed

Lines changed: 52 additions & 24 deletions

File tree

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

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,7 @@ int intel_bw_atomic_check(struct intel_atomic_state *state)
825825
unsigned int max_bw_point = 0, max_bw = 0;
826826
unsigned int num_qgv_points = dev_priv->max_bw[0].num_qgv_points;
827827
unsigned int num_psf_gv_points = dev_priv->max_bw[0].num_psf_gv_points;
828+
bool changed = false;
828829
u32 mask = 0;
829830

830831
/* FIXME earlier gens need some checks too */
@@ -868,14 +869,28 @@ int intel_bw_atomic_check(struct intel_atomic_state *state)
868869
new_bw_state->data_rate[crtc->pipe] = new_data_rate;
869870
new_bw_state->num_active_planes[crtc->pipe] = new_active_planes;
870871

872+
changed = true;
873+
871874
drm_dbg_kms(&dev_priv->drm,
872875
"pipe %c data rate %u num active planes %u\n",
873876
pipe_name(crtc->pipe),
874877
new_bw_state->data_rate[crtc->pipe],
875878
new_bw_state->num_active_planes[crtc->pipe]);
876879
}
877880

878-
if (!new_bw_state)
881+
old_bw_state = intel_atomic_get_old_bw_state(state);
882+
new_bw_state = intel_atomic_get_new_bw_state(state);
883+
884+
if (new_bw_state &&
885+
intel_can_enable_sagv(dev_priv, old_bw_state) !=
886+
intel_can_enable_sagv(dev_priv, new_bw_state))
887+
changed = true;
888+
889+
/*
890+
* If none of our inputs (data rates, number of active
891+
* planes, SAGV yes/no) changed then nothing to do here.
892+
*/
893+
if (!changed)
879894
return 0;
880895

881896
ret = intel_atomic_lock_global_state(&new_bw_state->base);
@@ -961,7 +976,6 @@ int intel_bw_atomic_check(struct intel_atomic_state *state)
961976
*/
962977
new_bw_state->qgv_points_mask = ~allowed_points & mask;
963978

964-
old_bw_state = intel_atomic_get_old_bw_state(state);
965979
/*
966980
* If the actual mask had changed we need to make sure that
967981
* the commits are serialized(in case this is a nomodeset, nonblocking)

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,19 @@ struct intel_bw_state {
3030
*/
3131
u8 pipe_sagv_reject;
3232

33+
/* bitmask of active pipes */
34+
u8 active_pipes;
35+
3336
/*
3437
* Current QGV points mask, which restricts
3538
* some particular SAGV states, not to confuse
3639
* with pipe_sagv_mask.
3740
*/
38-
u8 qgv_points_mask;
41+
u16 qgv_points_mask;
3942

4043
unsigned int data_rate[I915_MAX_PIPES];
4144
u8 num_active_planes[I915_MAX_PIPES];
4245

43-
/* bitmask of active pipes */
44-
u8 active_pipes;
45-
4646
int min_cdclk;
4747
};
4848

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ void intel_snps_phy_wait_for_calibration(struct drm_i915_private *dev_priv)
3434
if (intel_de_wait_for_clear(dev_priv, ICL_PHY_MISC(phy),
3535
DG2_PHY_DP_TX_ACK_MASK, 25))
3636
DRM_ERROR("SNPS PHY %c failed to calibrate after 25ms.\n",
37-
phy);
37+
phy_name(phy));
3838
}
3939
}
4040

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

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,8 @@ void intel_tc_port_sanitize(struct intel_digital_port *dig_port)
691691
{
692692
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
693693
struct intel_encoder *encoder = &dig_port->base;
694+
intel_wakeref_t tc_cold_wref;
695+
enum intel_display_power_domain domain;
694696
int active_links = 0;
695697

696698
mutex_lock(&dig_port->tc_lock);
@@ -702,12 +704,11 @@ void intel_tc_port_sanitize(struct intel_digital_port *dig_port)
702704

703705
drm_WARN_ON(&i915->drm, dig_port->tc_mode != TC_PORT_DISCONNECTED);
704706
drm_WARN_ON(&i915->drm, dig_port->tc_lock_wakeref);
705-
if (active_links) {
706-
enum intel_display_power_domain domain;
707-
intel_wakeref_t tc_cold_wref = tc_cold_block(dig_port, &domain);
708707

709-
dig_port->tc_mode = intel_tc_port_get_current_mode(dig_port);
708+
tc_cold_wref = tc_cold_block(dig_port, &domain);
710709

710+
dig_port->tc_mode = intel_tc_port_get_current_mode(dig_port);
711+
if (active_links) {
711712
if (!icl_tc_phy_is_connected(dig_port))
712713
drm_dbg_kms(&i915->drm,
713714
"Port %s: PHY disconnected with %d active link(s)\n",
@@ -716,10 +717,23 @@ void intel_tc_port_sanitize(struct intel_digital_port *dig_port)
716717

717718
dig_port->tc_lock_wakeref = tc_cold_block(dig_port,
718719
&dig_port->tc_lock_power_domain);
719-
720-
tc_cold_unblock(dig_port, domain, tc_cold_wref);
720+
} else {
721+
/*
722+
* TBT-alt is the default mode in any case the PHY ownership is not
723+
* held (regardless of the sink's connected live state), so
724+
* we'll just switch to disconnected mode from it here without
725+
* a note.
726+
*/
727+
if (dig_port->tc_mode != TC_PORT_TBT_ALT)
728+
drm_dbg_kms(&i915->drm,
729+
"Port %s: PHY left in %s mode on disabled port, disconnecting it\n",
730+
dig_port->tc_port_name,
731+
tc_port_mode_name(dig_port->tc_mode));
732+
icl_tc_phy_disconnect(dig_port);
721733
}
722734

735+
tc_cold_unblock(dig_port, domain, tc_cold_wref);
736+
723737
drm_dbg_kms(&i915->drm, "Port %s: sanitize mode (%s)\n",
724738
dig_port->tc_port_name,
725739
tc_port_mode_name(dig_port->tc_mode));

drivers/gpu/drm/i915/intel_pm.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4029,6 +4029,17 @@ static int intel_compute_sagv_mask(struct intel_atomic_state *state)
40294029
return ret;
40304030
}
40314031

4032+
if (intel_can_enable_sagv(dev_priv, new_bw_state) !=
4033+
intel_can_enable_sagv(dev_priv, old_bw_state)) {
4034+
ret = intel_atomic_serialize_global_state(&new_bw_state->base);
4035+
if (ret)
4036+
return ret;
4037+
} else if (new_bw_state->pipe_sagv_reject != old_bw_state->pipe_sagv_reject) {
4038+
ret = intel_atomic_lock_global_state(&new_bw_state->base);
4039+
if (ret)
4040+
return ret;
4041+
}
4042+
40324043
for_each_new_intel_crtc_in_state(state, crtc,
40334044
new_crtc_state, i) {
40344045
struct skl_pipe_wm *pipe_wm = &new_crtc_state->wm.skl.optimal;
@@ -4044,17 +4055,6 @@ static int intel_compute_sagv_mask(struct intel_atomic_state *state)
40444055
intel_can_enable_sagv(dev_priv, new_bw_state);
40454056
}
40464057

4047-
if (intel_can_enable_sagv(dev_priv, new_bw_state) !=
4048-
intel_can_enable_sagv(dev_priv, old_bw_state)) {
4049-
ret = intel_atomic_serialize_global_state(&new_bw_state->base);
4050-
if (ret)
4051-
return ret;
4052-
} else if (new_bw_state->pipe_sagv_reject != old_bw_state->pipe_sagv_reject) {
4053-
ret = intel_atomic_lock_global_state(&new_bw_state->base);
4054-
if (ret)
4055-
return ret;
4056-
}
4057-
40584058
return 0;
40594059
}
40604060

0 commit comments

Comments
 (0)