Skip to content

Commit

Permalink
drm/i915/dg2: Skip output init on PHY calibration failure
Browse files Browse the repository at this point in the history
If one of our PHYs fails to complete calibration, we should skip the
general initialization of the corresponding output.  Most likely this is
going to happen on outputs that don't actually exist on the board; in
theory we should have already decided to skip this output based on the
VBT, but we can't always rely on the VBT being accurate.

Cc: Lucas De Marchi <[email protected]>
Signed-off-by: Matt Roper <[email protected]>
Reviewed-by: Lucas De Marchi <[email protected]>
Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
  • Loading branch information
mattrope committed Feb 25, 2022
1 parent 772ba8d commit b4eb76d
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 4 deletions.
8 changes: 8 additions & 0 deletions drivers/gpu/drm/i915/display/intel_ddi.c
Original file line number Diff line number Diff line change
Expand Up @@ -4308,6 +4308,14 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
return;
}

if (intel_phy_is_snps(dev_priv, phy) &&
dev_priv->snps_phy_failed_calibration & BIT(phy)) {
drm_dbg_kms(&dev_priv->drm,
"SNPS PHY %c failed to calibrate; output will not be used.\n",
phy_name(phy));
return;
}

dig_port = kzalloc(sizeof(*dig_port), GFP_KERNEL);
if (!dig_port)
return;
Expand Down
8 changes: 6 additions & 2 deletions drivers/gpu/drm/i915/display/intel_snps_phy.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,14 @@ void intel_snps_phy_wait_for_calibration(struct drm_i915_private *i915)
if (!intel_phy_is_snps(i915, phy))
continue;

/*
* If calibration does not complete successfully, we'll remember
* which phy was affected and skip setup of the corresponding
* output later.
*/
if (intel_de_wait_for_clear(i915, DG2_PHY_MISC(phy),
DG2_PHY_DP_TX_ACK_MASK, 25))
drm_err(&i915->drm, "SNPS PHY %c failed to calibrate after 25ms.\n",
phy_name(phy));
i915->snps_phy_failed_calibration |= BIT(phy);
}
}

Expand Down
12 changes: 10 additions & 2 deletions drivers/gpu/drm/i915/i915_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -837,8 +837,16 @@ struct drm_i915_private {

bool irq_enabled;

/* perform PHY state sanity checks? */
bool chv_phy_assert[2];
union {
/* perform PHY state sanity checks? */
bool chv_phy_assert[2];

/*
* DG2: Mask of PHYs that were not calibrated by the firmware
* and should not be used.
*/
u8 snps_phy_failed_calibration;
};

bool ipc_enabled;

Expand Down

0 comments on commit b4eb76d

Please sign in to comment.