All of lore.kernel.org
 help / color / mirror / Atom feed
* A curious phenomenon in HDMI hotplug.
@ 2020-05-06  3:29 Aaron Chou
  0 siblings, 0 replies; only message in thread
From: Aaron Chou @ 2020-05-06  3:29 UTC (permalink / raw)
  To: alexander.deucher, amd-gfx, christian.koenig, David1.Zhou

Hi all:

I'm a newer about the amdgpu driver.
I have a question about it.
In my company, there are some experiments about HDMI hotplug.
First, I introduce the lab environment:
cpu: huawei kunpeng
os: uos
kernel: 4.19.90
video card: Radeon HD 700

the lab step is:
1, I connect the hdmi and vga with the expand mode;
2. I disconnect the hdmi connector, but the app display in the hdmi is
not back to vga, and the mode is still expand mode.

I found when I disconnect the hdmi connector, the sys files about HDMI
are keep the connection status.
Such as the value of /sys/class/drm/card0-HDMI-A-1/status is
connected, and I can read the edid file correctly.
At this moment, I use I2C driver to read the edid via /dev/i2c-X. I
can not get the edid value.

In kernel source ,I found the suspicious points in
amdgpu_connector_dvi_detect() (amdgpu_connector.c)

In amdgpu_connector_dvi_detect() function,
The hpd status was correctly through the amdgpu_display_hpd_sence(),
but the ddc probe operation is successed via
amdgpu_display_ddc_probe()

I am so confused.

Is it a normal behavior?

I have written a workaround patch to fix this problem.

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
index c770d73352a7..4809ceb56f5e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
@@ -975,7 +975,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, unknown_status = false;

        if (!drm_kms_helper_is_poll_worker()) {
                r = pm_runtime_get_sync(connector->dev->dev);
@@ -990,7 +990,11 @@ 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) {
+
+       if (!amdgpu_display_hpd_sense(adev, amdgpu_connector->hpd.hpd))
+               unknown_status = true;
+
+       if (dret && !unknown_status) {
                amdgpu_connector->detected_by_load = false;
                amdgpu_connector_free_edid(connector);
                amdgpu_connector_get_edid(connector);

Is it correctly.

Best Wishes!

Aaron.
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2020-05-06  3:29 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-06  3:29 A curious phenomenon in HDMI hotplug Aaron Chou

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.