drm/vc4: hdmi: vc4_hdmi_hpd_irq_thread() checks !force_hotplug globally instead of per-connector bitmask
Los mantenedores suelen responder en 1 día
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 68/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Stack tecnológico
- c, linux
- Área
- backend, operating-systems
Línea de trabajo
Lee drivers/gpu/drm/vc4/vc4_hdmi.c, centrándote en vc4_hdmi_hpd_irq_thread() y en la comprobación por conector de vc4_hdmi_connector_detect_ctx(). Actualiza el controlador IRQ para que aplique el bit del conector correspondiente y, después, verifica que forzar un conector HDMI siga permitiendo eventos de conexión en caliente en el otro.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Describe the bug
In drivers/gpu/drm/vc4/vc4_hdmi.c, vc4.force_hotplug is defined as a per-connector bitfield (bit0 = HDMI0 / HDMI-A-1, bit1 = HDMI1 / HDMI-A-2), and vc4_hdmi_connector_detect_ctx() (added in c96c9d87f8bd / #5052) checks the per-connector bit:
/* bit field to force hotplug detection. bit0 = HDMI0 */
static int force_hotplug;
module_param(force_hotplug, int, 0644);
...
if (force_hotplug & BIT(vc4_hdmi->encoder.type - VC4_ENCODER_TYPE_HDMI0))
status = connector_status_connected;
However, vc4_hdmi_hpd_irq_thread() (modified in cb7db28b9e17 / #6123) checks !force_hotplug globally instead of checking only the connector's corresponding bit:
static irqreturn_t vc4_hdmi_hpd_irq_thread(int irq, void *priv)
{
struct vc4_hdmi *vc4_hdmi = priv;
struct drm_connector *connector = &vc4_hdmi->connector;
struct drm_device *dev = connector->dev;
if (dev && dev->registered && !force_hotplug)
drm_connector_helper_hpd_irq_event(connector);
return IRQ_HANDLED;
}
Because vc4_hdmi_bind() sets connector->polled = DRM_CONNECTOR_POLL_HPD whenever HPD IRQs are registered, drm_kms_helper's periodic polling (output_poll_execute) also skips both HDMI connectors.
As a result, setting vc4.force_hotplug=1 (to force only HDMI-A-1) inadvertently disables HPD interrupts on HDMI-A-2, and setting vc4.force_hotplug=2 (to force only HDMI-A-2, e.g. for an internal laptop panel on CM5 / Argon ONE UP where HDMI-A-2 is internal and HDMI-A-1 is the external HDMI port) completely disables hotplug/unplug interrupt detection on HDMI-A-1.
Steps to reproduce the behaviour
- Boot a Raspberry Pi 5 / CM5 with
vc4.force_hotplug=2(forcing onlyHDMI-A-2, leavingHDMI-A-1unforced). - Connect an external monitor to
HDMI-A-1(or boot with it connected) and then unplugHDMI-A-1while the system is running. - Observe
/sys/class/drm/card*-HDMI-A-1/status: it remains stuck atconnected(ordisconnectedif plugged in later) untilecho detect > /sys/class/drm/card*-HDMI-A-1/statusis manually triggered, becausevc4_hdmi_hpd_irq_thread()ignores the HPD interrupt wheneverforce_hotplug != 0.
Device (s)
Raspberry Pi 5, Raspberry Pi CM5, Raspberry Pi 4 Mod. B, Raspberry Pi CM4
System
- OS: Raspberry Pi OS Trixie (64-bit)
- Kernel:
Linux 6.18.59+rpt-rpi-2712(also affectsrpi-6.12.yandrpi-6.18.y)
Proposed Fix / Patch
Check the per-connector bit in vc4_hdmi_hpd_irq_thread() matching vc4_hdmi_connector_detect_ctx():
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -2480,7 +2480,8 @@ static irqreturn_t vc4_hdmi_hpd_irq_thread(int irq, void *priv)
struct drm_connector *connector = &vc4_hdmi->connector;
struct drm_device *dev = connector->dev;
- if (dev && dev->registered && !force_hotplug)
+ if (dev && dev->registered &&
+ !(force_hotplug & BIT(vc4_hdmi->encoder.type - VC4_ENCODER_TYPE_HDMI0)))
drm_connector_helper_hpd_irq_event(connector);
return IRQ_HANDLED;
- Lenguaje dominante
- C
- Estrellas
- 13.3k
- Forks
- 5.5k
- Merge medio
- 1 d 12 h
- PR fusionados (30 d)
- 24
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de raspberrypi/linux
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 63/100
raspberrypi/linux#7718 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
raspberrypi/linux#7415 · 2 comentarios · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
rp1-cfe doesn't forward V4L2_EVENT_SOURCE_CHANGE event from csi-2 sensor driver to userspace appAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
raspberrypi/linux#7399 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Documentation update requiredAbierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 82/100
raspberrypi/linux#7357 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
raspberrypi/linux#7054 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
Todos los issues de raspberrypi/linux
Issues similares
-
Type: Bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
apache/nuttx-apps#3942 ·
Los mantenedores suelen responder en 1 día
-
Add missing unit tests for IsAdmissionPolicyName and IsCertManagerResourceNamePosiblemente ocupada @a1h8 la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
kubernetes-sigs/security-profiles-operator#3644 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 70/100
ly05010419/MacNativeGames#1340 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Los mantenedores suelen responder en 1 día
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
Los mantenedores suelen responder en 1 día