drm/vc4: hdmi: vc4_hdmi_hpd_irq_thread() checks !force_hotplug globally instead of per-connector bitmask
Les mainteneurs répondent en général sous 1 jour
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 68/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- c, linux
- Domaine
- backend, operating-systems
Piste de recherche
Lisez drivers/gpu/drm/vc4/vc4_hdmi.c, en vous concentrant sur vc4_hdmi_hpd_irq_thread() et sur la vérification par connecteur dans vc4_hdmi_connector_detect_ctx(). Mettez à jour le gestionnaire IRQ pour qu’il applique le bit du connecteur correspondant, puis vérifiez que le forçage d’un connecteur HDMI permet toujours les événements de connexion à chaud sur l’autre.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
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;
- Langage dominant
- C
- Étoiles
- 13.3k
- Forks
- 5.5k
- Merge moyen
- 1 j 12 h
- PR mergées (30 j)
- 24
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de raspberrypi/linux
-
Difficulté 2/5 1-3 heures Accessibilité débutants 63/100
raspberrypi/linux#7718 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
raspberrypi/linux#7415 · 2 commentaires · 1 réaction ·
Les mainteneurs répondent en général sous 1 jour
-
rp1-cfe doesn't forward V4L2_EVENT_SOURCE_CHANGE event from csi-2 sensor driver to userspace appOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
raspberrypi/linux#7399 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Documentation update requiredOuverte
Difficulté 1/5 Moins d'une heure Accessibilité débutants 82/100
raspberrypi/linux#7357 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
raspberrypi/linux#7054 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de raspberrypi/linux
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
cyrusimap/cyrus-imapd#6640 ·
Les mainteneurs répondent en général sous 2 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 60/100
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
GalusPeres/HomeTiles#139 · 1 commentaire ·
Les mainteneurs répondent en général sous 3 jours
-
Difficulté 2/5 1-3 heures Accessibilité débutants 70/100
DaveGamble/cJSON#1122 ·
Les mainteneurs répondent en général sous 12 jours
-
Type: Bug
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
apache/nuttx-apps#3942 ·
Les mainteneurs répondent en général sous 1 jour