Re: [PATCH v10 03/21] drm/bridge: synopsys: dw-dp: Fix error handling for DP link enablement
[email protected] Thu, 06 Aug 2026 00:59:53 +0000
| Newsgroups | gmane.linux.drivers.devicetree,gmane.comp.video.dri.devel |
|---|---|
| Message-ID | <[email protected]> |
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider: - [Medium] The new error handling path in `dw_dp_link_enable()` fails to clear the PHY transmit enable bit (`XMIT_ENABLE`) before powering off the PHY. - [Medium] The error path in `dw_dp_link_enable()` unconditionally calls `drm_dp_link_power_down()` without checking if the display is still connected. -- --- Patch [3]: [PATCH v10 03/21] drm/bridge: synopsys: dw-dp: Fix error handling for DP link enablement --- commit 8b0823cf002b6b94f89ce0d8276e50b1fc919ef4 Author: Sebastian Reichel <sebastian.reichel-ZGY8ohtN/[email protected]> drm/bridge: synopsys: dw-dp: Fix error handling for DP link enablement This patch introduces a new enabled state in the link structure to ensure the link disabling only happens if it has been properly enabled. It also adds missing error handling in dw_dp_link_enable() to power off the PHY and link if training fails. > diff --git a/drivers/gpu/drm/bridge/synopsys/dw-dp.c b/drivers/gpu/drm/bridge/synopsys/dw-dp.c > index f8ca464d43717..dd951fd447227 100644 > --- a/drivers/gpu/drm/bridge/synopsys/dw-dp.c > +++ b/drivers/gpu/drm/bridge/synopsys/dw-dp.c [ ... ] > @@ -1615,6 +1616,9 @@ static void dw_dp_link_disable(struct dw_dp *dp) > { > struct dw_dp_link *link = &dp->link; > > + if (!link->enabled) > + return; > + [Severity: Medium] Does this early return prevent cleaning up the hardware state if link enablement fails partway through? If dw_dp_link_train() fails, the PHY transmit enable bit (XMIT_ENABLE) might be set, but link->enabled will remain false. Bypassing the teardown here means we could leave the MAC configured to transmit while the PHY is eventually powered down, potentially causing hardware lockups. [ ... ] > static int dw_dp_link_enable(struct dw_dp *dp) > @@ -1636,10 +1641,21 @@ static int dw_dp_link_enable(struct dw_dp *dp) > > ret = drm_dp_link_power_up(&dp->aux, dp->link.revision); > if (ret < 0) > - return ret; > + goto err_phy_power_off; > > ret = dw_dp_link_train(dp); > + if (ret < 0) > + goto err_link_power_down; > + > + dp->link.enabled = true; > > + return 0; > + > +err_link_power_down: > + drm_dp_link_power_down(&dp->aux, dp->link.revision); [Severity: Medium] Could this unconditional call to drm_dp_link_power_down() cause a performance regression on hot-unplugs? If link training fails because the DP cable is physically disconnected, attempting an AUX transaction on an unplugged display causes timeout delays which unnecessarily block the atomic commit thread. Should this call be guarded with dw_dp_hpd_detect(dp) just as it is in dw_dp_link_disable()? [Severity: Medium] Additionally, should there be a call to dw_dp_phy_xmit_enable(dp, 0) in this error path? If dw_dp_link_train() fails, the hardware might still have the PHY transmit enable bit set. Shutting down the PHY before clearing the XMIT_ENABLE state can lead to undefined hardware states. > + > +err_phy_power_off: > + phy_power_off(dp->phy); > return ret; > } -- Sashiko AI review ยท https://sashiko.dev/#/patchset/20260806-synopsys-dw-dp-improvements-v10-0-d84a26c303d6-ZGY8ohtN/[email protected]?part=3