RE: [PATCH 4/4] drm/amd/display: Add HDMI ALLM support

"Zuo, Jerry" <[email protected]> Thu, 6 Aug 2026 20:20:01 +0000
Newsgroups org.freedesktop.lists.amd-gfx
Message-ID <CHXPR12MB999220DAFE5B7B990698B1D3D4E5D22@CHXPR12MB999220.namprd12.prod.outlook.com>
AMD General

> -----Original Message-----
> From: Wentland, Harry <[email protected]>
> Sent: Friday, July 31, 2026 16:11
> To: Zuo, Jerry <[email protected]>; [email protected]
> Subject: Re: [PATCH 4/4] drm/amd/display: Add HDMI ALLM support
>
>
>
> On 2026-07-30 13:17, Fangzhi Zuo wrote:
> > why:
> > HDMI 2.1 Auto Low-Latency Mode (ALLM) lets a Source request the Sink's
> > low-latency mode through the HF-VSIF. amdgpu never set ALLM_Mode in
> > the HF-VSIF, so ALLM was never signalled to the sink.
> >
> > how:
> > - Add an allm capability flag to struct dc_edid_caps and populate it in
> >   dm_helpers_parse_edid_caps() from the HF-VSDB ALLM bit parsed by
> DRM
> >   core (connector->display_info.hdmi.allm).
> > - In create_stream_for_sink(), build the HF-VSIF with ALLM_Mode set when
> >   the sink advertises ALLM and the content type is Game (content-type =
> >   Game is how userspace requests low-latency mode, HDMI GCTS HF1-56).
> > - In update_freesync_state_on_stream(), also set ALLM_Mode when
> >   Gaming-VRR is active (VRR_EN=1, HDMI GCTS HF1-58 step 8.3.1), and push
> >   the updated HF-VSIF (vsp_infopacket) as a stream update.
> >
> > Signed-off-by: Fangzhi Zuo <[email protected]>
> > ---
> >  .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 35
> ++++++++++++++++++-
> >  .../display/amdgpu_dm/amdgpu_dm_connector.c   | 18 ++++++++--
> >  .../amd/display/amdgpu_dm/amdgpu_dm_helpers.c |  5 ++-
> >  drivers/gpu/drm/amd/display/dc/dc_types.h     |  3 ++
> >  4 files changed, 57 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > index 223b562f7005..fc3005ecc681 100644
> > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> > @@ -3895,6 +3895,36 @@ static void update_freesync_state_on_stream(
> >     new_stream->vrr_infopacket = vrr_infopacket;
> >     new_stream->allow_freesync =
> > mod_freesync_get_freesync_enabled(&vrr_params);
> >
> > +   /*
> > +    * HDMI ALLM: transmit the HF-VSIF with ALLM_Mode=1 when the
> sink
> > +    * advertises ALLM in the SCDS and either the content type is Game
> > +    * (HF1-56) or Gaming-VRR is active (VRR_EN=1, HF1-58 step 8.3.1).
> > +    * HDMI 2.1 7.6.6.
> > +    */
> > +   if (new_stream->signal == SIGNAL_TYPE_HDMI_TYPE_A ||
> > +       new_stream->signal == SIGNAL_TYPE_HDMI_FRL) {
> > +           struct dc_info_packet vsp_infopacket = {0};
> > +           bool allm = new_stream->sink->edid_caps.allm &&
>
> We have an `aconn` in this function above, so we can simply get the allm bit
> from the connector:
>
>               bool sink_allm = aconn && aconn-
> >base.display_info.hdmi.allm;
>               bool allm = sink_allm &&
>                       (new_stream->content_type ==
> DISPLAY_CONTENT_TYPE_GAME ||
>                        vrr_params.state == VRR_STATE_ACTIVE_VARIABLE ||
>                        vrr_params.state == VRR_STATE_ACTIVE_FIXED);
>
> Then we don't need to add a new allm bool to edid_caps.
>
> Harry
>
Noted. Will be changed in v2.

> > +                   (new_stream->content_type ==
> DISPLAY_CONTENT_TYPE_GAME ||
> > +                    vrr_params.state == VRR_STATE_ACTIVE_VARIABLE ||
> > +                    vrr_params.state == VRR_STATE_ACTIVE_FIXED);
> > +           bool allm_changed;
> > +
> > +           mod_build_hf_vsif_infopacket(new_stream, &vsp_infopacket,
> allm,
> > +allm);
> > +
> > +           allm_changed = memcmp(&new_stream->vsp_infopacket,
> &vsp_infopacket,
> > +                                 sizeof(vsp_infopacket)) != 0;
> > +           new_crtc_state->freesync_vrr_info_changed |=
> allm_changed;
> > +           new_stream->vsp_infopacket = vsp_infopacket;
> > +
> > +           if (allm_changed)
> > +                   drm_dbg_driver(adev_to_drm(adev),
> > +                                  "ALLM: flip on crtc=%u: sink_allm=%d
> content_type=%d vrr_state=%d -> ALLM_Mode=%d\n",
> > +                               new_crtc_state->base.crtc->base.id,
> > +                               new_stream->sink->edid_caps.allm,
> > +                               new_stream->content_type,
> vrr_params.state, allm);
> > +   }
> > +
> >     if (new_crtc_state->freesync_vrr_info_changed)
> >             drm_dbg_kms(adev_to_drm(adev), "VRR packet update:
> crtc=%u enabled=%d state=%d",
> >                           new_crtc_state->base.crtc->base.id,
> > @@ -4429,9 +4459,12 @@ static void amdgpu_dm_commit_planes(struct
> drm_atomic_state *state,
> >             }
> >
> >             if (acrtc_state->stream) {
> > -                   if (acrtc_state->freesync_vrr_info_changed)
> > +                   if (acrtc_state->freesync_vrr_info_changed) {
> >                             bundle->stream_update.vrr_infopacket =
> >                                     &acrtc_state->stream-
> >vrr_infopacket;
> > +                           bundle->stream_update.vsp_infopacket =
> > +                                   &acrtc_state->stream-
> >vsp_infopacket;
> > +                   }
> >             }
> >     }
> >
> > diff --git
> > a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
> > b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
> > index ebead39939a6..430f1628ced0 100644
> > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
> > +++
> b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c
> > @@ -1511,8 +1511,22 @@ create_stream_for_sink(struct drm_connector
> *connector,
> >     update_stream_signal(stream, sink);
> >
> >     if (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A ||
> > -       stream->signal == SIGNAL_TYPE_HDMI_FRL)
> > -           mod_build_hf_vsif_infopacket(stream, &stream-
> >vsp_infopacket, false, false);
> > +       stream->signal == SIGNAL_TYPE_HDMI_FRL) {
> > +           /*
> > +            * Enable HDMI ALLM (Auto Low-Latency Mode) when the
> sink
> > +            * advertises ALLM in the SCDS and the content type is Game.
> > +            * Setting content-type = Game is how userspace requests the
> > +            * Sink's low-latency mode (HDMI GCTS HF1-56).
> > +            */
> > +           bool allm = sink->edid_caps.allm &&
> > +                   stream->content_type ==
> DISPLAY_CONTENT_TYPE_GAME;
> > +
> > +           drm_dbg_driver(dev,
> > +                          "ALLM: set mode: sink_allm=%d content_type=%d
> -> ALLM_Mode=%d\n",
> > +                       sink->edid_caps.allm, stream->content_type, allm);
> > +
> > +           mod_build_hf_vsif_infopacket(stream, &stream-
> >vsp_infopacket, allm, allm);
> > +   }
> >
> >     if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT ||
> >         stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST || diff --git
> > a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
> > b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
> > index 42f5673acb4d..e69ce0a1b4b4 100644
> > --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
> > +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_helpers.c
> > @@ -197,7 +197,10 @@ enum dc_edid_status
> dm_helpers_parse_edid_caps(
> >                               edid_caps->display_name,
> >
> AUDIO_INFO_DISPLAY_NAME_SIZE_IN_CHARS);
> >
> > -   edid_caps->edid_hdmi = connector->display_info.is_hdmi;
> > +   if (connector->display_info.is_hdmi) {
> > +           edid_caps->edid_hdmi = true;
> > +           edid_caps->allm = connector->display_info.hdmi.allm;
> > +   }
> >
> >     if (edid_caps->edid_hdmi) {
> >             populate_hdmi_info_from_connector(link->dc-
> >config.enable_frl,
> > &connector->display_info.hdmi, edid_caps); diff --git
> > a/drivers/gpu/drm/amd/display/dc/dc_types.h
> > b/drivers/gpu/drm/amd/display/dc/dc_types.h
> > index 3edeb94fba23..ae409cc59ae4 100644
> > --- a/drivers/gpu/drm/amd/display/dc/dc_types.h
> > +++ b/drivers/gpu/drm/amd/display/dc/dc_types.h
> > @@ -226,6 +226,9 @@ struct dc_edid_caps {
> >     /*HDMI 2.0 caps*/
> >     bool lte_340mcsc_scramble;
> >
> > +   /* HDMI 2.1 caps */
> > +   bool allm;
> > +
> >     bool edid_hdmi;
> >     bool hdr_supported;
> >     bool rr_capable;