Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

drm/vc4: hdmi: vc4_hdmi_hpd_irq_thread() checks !force_hotplug globally instead of per-connector bitmask

Abierto Apto para principiantes
#7,724 1 comentario 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

@popcornmix ya está trabajando en esto.

Desde el 28/10/2026.

  • #7727 de @popcornmix — abierto

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

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
  1. Boot a Raspberry Pi 5 / CM5 with vc4.force_hotplug=2 (forcing only HDMI-A-2, leaving HDMI-A-1 unforced).
  2. Connect an external monitor to HDMI-A-1 (or boot with it connected) and then unplug HDMI-A-1 while the system is running.
  3. Observe /sys/class/drm/card*-HDMI-A-1/status: it remains stuck at connected (or disconnected if plugged in later) until echo detect > /sys/class/drm/card*-HDMI-A-1/status is manually triggered, because vc4_hdmi_hpd_irq_thread() ignores the HPD interrupt whenever force_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 affects rpi-6.12.y and rpi-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

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de raspberrypi/linux

Todos los issues de raspberrypi/linux

Issues similares

Más issues de C

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.