[PATCH] drm/admgpu: check HDMI HPD status after ddc probe

Aaron Chou zhoubb.aaron at gmail.com
Mon May 11 01:45:01 UTC 2020


On Sat, May 9, 2020 at 9:35 PM Alex Deucher <alexdeucher at gmail.com> wrote:
>
> On Sat, May 9, 2020 at 1:48 AM Binbin Zhou <zhoubb.aaron at gmail.com> wrote:
> >
> > Now, we check the presence of the EDID to determine if there is a monitor
> > present.
> >
> > DVI-I connectors have both analog and digital encoders and the HPD pin
> > is only reliable on the digital part.
> >
> > But when I pull out the Radeon HD8570's HDMI connector, the HDMI status
> > in system is still perform connected.
> >
> > asd at asd-PC:~$ cat /sys/class/drm/card0-HDMI-A-1/status
> > connected
> >
> > At this moment, if I want to read the EDID by /dev/i2c-X with I2C
> > driver, there is no EDID can be read.
> >
> > Dmesg witha drm.debug=0x6, we can find the following message:
> >
> > [drm:drm_helper_hpd_irq_event] [CONNECTOR:41:HDMI-A-1] status
> > updated from connected to connected
> >
> > Based on the appearance, I thought to check the HPD status again, because
> > the HPD status is perform disconnected, after amdgpu_display_ddc_probe().
> > If the amdgpu_display_hpd_sense() return false, I think the HDMI connector
> > status is undefined, and just return disconnected simply.
> >
> > I'm not sure if it happened to other AMD cards.
>
> This is the part I don't understand.  The logic already checks the HPD
> status in amdgpu_connector_check_hpd_status_unchanged().  Does it
> still report connected at that point?  After that it tires to read the
> EDID in amdgpu_display_ddc_probe().  If the monitor is disconnected,
> there should be no EDID so dret should be false.  We should try and
> figure out why the first HPD check reports connected and the EDID
> probe returns true.
>
> Alex

Emm.....
I have tried with Radeon driver, it is the same.
And In the Mint system, I find if I pick out the HDMI connector, I can
see the status is still connected,
At the moment, If I do the xrandr command or open the Setting->Display
application, the HDMI status will refresh to disconnected.
The operation means to detect the display again.

Does the phenomenon meet the expectation?

Regards.
Aaron.
>
> >
> > Signed-off-by: Binbin Zhou <zhoubb.aaron at gmail.com>
> > ---
> >  drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c | 9 +++++++--
> >  1 file changed, 7 insertions(+), 2 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> > index f355d9a752d2..ee657db9a228 100644
> > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
> > @@ -973,7 +973,7 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)
> >         const struct drm_encoder_helper_funcs *encoder_funcs;
> >         int r;
> >         enum drm_connector_status ret = connector_status_disconnected;
> > -       bool dret = false, broken_edid = false;
> > +       bool dret = false, broken_edid = false, undefined_flag = false;
> >
> >         if (!drm_kms_helper_is_poll_worker()) {
> >                 r = pm_runtime_get_sync(connector->dev->dev);
> > @@ -988,7 +988,12 @@ amdgpu_connector_dvi_detect(struct drm_connector *connector, bool force)
> >
> >         if (amdgpu_connector->ddc_bus)
> >                 dret = amdgpu_display_ddc_probe(amdgpu_connector, false);
> > -       if (dret) {
> > +
> > +       /* Check the HDMI HPD pin status again */
> > +       if (!amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd))
> > +               undefined_flag = true;
> > +
> > +       if (dret && !undefined_flag) {
> >                 amdgpu_connector->detected_by_load = false;
> >                 amdgpu_connector_free_edid(connector);
> >                 amdgpu_connector_get_edid(connector);
> > --
> > 2.17.1
> >
> > _______________________________________________
> > amd-gfx mailing list
> > amd-gfx at lists.freedesktop.org
> > https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list