On Mon, Aug 25, 2025 at 6:10 PM Timur Kristóf <timur.kris...@gmail.com> wrote:
>
> Change the legacy (non-DC) display code to respect the maximum
> pixel clock for HDMI and DVI-D. Reject modes that would require
> a higher pixel clock than can be supported.
>
> Also update the maximum supported HDMI clock value depending on
> the ASIC type.
>
> For reference, see the DC code:
> check max_hdmi_pixel_clock in dce*_resource.c
>
> Signed-off-by: Timur Kristóf <timur.kris...@gmail.com>
> ---
>  .../gpu/drm/amd/amdgpu/amdgpu_connectors.c    | 21 +++++++++++++++++--
>  1 file changed, 19 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> index 5e375e9c4f5d..abcc4469cf57 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> @@ -1195,12 +1195,26 @@ static void amdgpu_connector_dvi_force(struct 
> drm_connector *connector)
>                 amdgpu_connector->use_digital = true;
>  }
>
> +/**
> + * Returns the maximum supported HDMI (TMDS) pixel clock in KHz.
> + */
> +static int amdgpu_max_hdmi_pixel_clock(const struct amdgpu_device *adev)
> +{
> +       if (adev->asic_type >= CHIP_POLARIS10)
> +               return 600000;
> +       else if (adev->asic_type >= CHIP_TONGA)
> +               return 300000;
> +       else
> +               return 297000;
> +}
> +
>  static enum drm_mode_status amdgpu_connector_dvi_mode_valid(struct 
> drm_connector *connector,
>                                             const struct drm_display_mode 
> *mode)
>  {
>         struct drm_device *dev = connector->dev;
>         struct amdgpu_device *adev = drm_to_adev(dev);
>         struct amdgpu_connector *amdgpu_connector = 
> to_amdgpu_connector(connector);
> +       const int max_hdmi_pixel_clock = amdgpu_max_hdmi_pixel_clock(adev);
>
>         /* XXX check mode bandwidth */
>
> @@ -1208,10 +1222,13 @@ static enum drm_mode_status 
> amdgpu_connector_dvi_mode_valid(struct drm_connector
>                 if ((amdgpu_connector->connector_object_id == 
> CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I) ||
>                     (amdgpu_connector->connector_object_id == 
> CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) ||
>                     (amdgpu_connector->connector_object_id == 
> CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) {
> -                       return MODE_OK;
> +                       if (mode->clock > max_hdmi_pixel_clock)
> +                               return MODE_CLOCK_HIGH;
> +                       else
> +                               return MODE_OK;

I don't think it makes sense to limit dual link DVI to the max HDMI
clock.  HDMI is single link TMDS.  Other than that, the patch looks
good to me.

Alex

>                 } else if (connector->display_info.is_hdmi) {
>                         /* HDMI 1.3+ supports max clock of 340 Mhz */
> -                       if (mode->clock > 340000)
> +                       if (mode->clock > max_hdmi_pixel_clock)
>                                 return MODE_CLOCK_HIGH;
>                         else
>                                 return MODE_OK;
> --
> 2.50.1
>

Reply via email to