> -----Original Message-----
> From: Intel-gfx <intel-gfx-boun...@lists.freedesktop.org> On Behalf Of Imre 
> Deak
> Sent: Tuesday, 5 August 2025 12.34
> To: intel-gfx@lists.freedesktop.org; intel...@lists.freedesktop.org
> Cc: sta...@vger.kernel.org; Lin, Charlton <charlton....@intel.com>; 
> Almahallawy, Khaled <khaled.almahall...@intel.com>
> Subject: [PATCH v2 03/19] drm/i915/lnl+/tc: Fix max lane count HW readout
> 
> On LNL+ for a disconnected sink the pin assignment value gets cleared by the 
> HW/FW as soon as the sink gets disconnected, even
> if the PHY ownership got acquired already by the BIOS/driver (and hence the 
> PHY itself is still connected and used by the display).
> During HW readout this can result in detecting the PHY's max lane count as 0 
> - matching the above cleared aka NONE pin
> assignment HW state. For a connected PHY the driver in general (outside of 
> intel_tc.c) expects the max lane count value to be
> valid for the video mode enabled on the corresponding output (1, 2 or 4). 
> Ensure this by setting the max lane count to 4 in this case.
> Note, that it doesn't matter if this lane count happened to be more than the 
> max lane count with which the PHY got connected and
> enabled, since the only thing the driver can do with such an output - where 
> the DP-alt sink is disconnected - is to disable the
> output.
> 
> v2: Rebased on change reading out the pin configuration only if the PHY
>     is connected.
> 
> Cc: sta...@vger.kernel.org # v6.8+
> Reported-by: Charlton Lin <charlton....@intel.com>
> Tested-by: Khaled Almahallawy <khaled.almahall...@intel.com>

Reviewed-by: Mika Kahola <mika.kah...@intel.com>

> Signed-off-by: Imre Deak <imre.d...@intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_tc.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_tc.c 
> b/drivers/gpu/drm/i915/display/intel_tc.c
> index b8453fc3ab688..a89fbbf848d7d 100644
> --- a/drivers/gpu/drm/i915/display/intel_tc.c
> +++ b/drivers/gpu/drm/i915/display/intel_tc.c
> @@ -23,6 +23,7 @@
>  #include "intel_modeset_lock.h"
>  #include "intel_tc.h"
> 
> +#define DP_PIN_ASSIGNMENT_NONE       0x0
>  #define DP_PIN_ASSIGNMENT_C  0x3
>  #define DP_PIN_ASSIGNMENT_D  0x4
>  #define DP_PIN_ASSIGNMENT_E  0x5
> @@ -308,6 +309,8 @@ static int lnl_tc_port_get_max_lane_count(struct 
> intel_digital_port *dig_port)
>               REG_FIELD_GET(TCSS_DDI_STATUS_PIN_ASSIGNMENT_MASK, val);
> 
>       switch (pin_assignment) {
> +     case DP_PIN_ASSIGNMENT_NONE:
> +             return 0;
>       default:
>               MISSING_CASE(pin_assignment);
>               fallthrough;
> @@ -1159,6 +1162,12 @@ static void xelpdp_tc_phy_get_hw_state(struct 
> intel_tc_port *tc)
>               tc->lock_wakeref = tc_cold_block(tc);
> 
>               read_pin_configuration(tc);
> +             /*
> +              * Set a valid lane count value for a DP-alt sink which got
> +              * disconnected. The driver can only disable the output on this 
> PHY.
> +              */
> +             if (tc->max_lane_count == 0)
> +                     tc->max_lane_count = 4;
>       }
> 
>       drm_WARN_ON(display->drm,
> --
> 2.49.1

Reply via email to