Retour à l'accueil

Régression audio snd_hda_intel : correctif de rescan PCI

Décomposition de la régression snd_hda_intel : temporisation de réinitialisation CORB sur Intel HDA après mise à jour du noyau. Diagnostics via dmesg, solution — rescan PCI via sysfs avec réallocation BAR. Automatisation et conseils de débogage pour matériel ancien.

Comment réparer le son : rescan PCI contre régression du noyau
Advertisement 728x90

# Correction de la régression snd_hda_intel : rescan PCI restaure l'audio sur un vieil ordinateur portable

Après une mise à jour du noyau sur mon Emachines E732 avec Intel 5 Series/3400 Series HDA (chip-ID 8086:3b56), l'audio a disparu. aplay -l affiche no soundcards found. lspci détecte le périphérique à 00:1b.0, inxi -Axxz confirme le pilote snd_hda_intel, mais journalctl est inondé d'erreurs : hdaudio hdaudioC0D0: no AFG or MFG node found sur tous les nœuds.

dmesg raconte l'histoire vraie : lors de l'initialisation, snd_hda_intel 0000:00:1b.0: CORB reset timeout#2, CORBRP = 65535, suivi de no codecs initialized. CORB (Command Output Ring Buffer) est l'anneau tampon pour les commandes du codec. Une valeur de 0xFFFF signale un bus bloqué ou un matériel inaccessible — lecture d'un registre non initialisé.

BAR au démarrage à froid : mem 0xd4400000-0xd4403fff 64bit. Recharger le module (modprobe -r/-a snd_hda_intel) répète l'erreur avec des horodatages frais.

Google AdInline article slot

Solutions rapides inefficaces

Les ajustements standards n'ont rien donné :

  • Outils espace utilisateur : Réinstaller PipeWire/WirePlumber, ajuster alsamixer — inutile sans périphériques ALSA.
  • Options de module : options snd-hda-intel enable=1 power_save=0 power_save_controller=N model=auto dans /etc/modprobe.d/alsa-fix.conf.
  • Paramètres GRUB : pci=nocrs pci=nomsi pcie_aspm=off snd_hda_intel.power_save=0 snd_hda_intel.dma_mask=0.
  • Rechargement à chaud : modprobe snd_hda_intel msi=0 dsp_driver=1 probe_mask=1.

Le problème vient d'une initialisation trop précoce : les noyaux LTS ou LiveCD fonctionnent grâce à un ordre de chargement de modules différent ou un état BIOS différent.

[   17.492159] snd_hda_intel 0000:00:1b.0: CORB reset timeout#2, CORBRP = 65535
[   17.492380] snd_hda_intel 0000:00:1b.0: no codecs initialized

La solution : rescan PCI à chaud via sysfs

L'idée clé : au démarrage à froid, un mauvais BAR est assigné, mais un rescan à chaud sur un système réchauffé fonctionne. Voici la séquence :

Google AdInline article slot
  • echo 1 | sudo tee /sys/bus/pci/devices/0000:00:1b.0/remove
  • sleep 2
  • echo 1 | sudo tee /sys/bus/pci/rescan

Sortie dmesg fraîche :

[  473.969035] pci 0000:00:1b.0: [8086:3b56] ... 
[  473.969102] pci 0000:00:1b.0: BAR 0 [mem 0x00000000-0x00003fff 64bit]
[  473.969982] pci 0000:00:1b.0: BAR 0 [mem 0x23c000000-0x23c003fff 64bit]: assigned
[  474.095498] input: HDA Intel MID Mic as /devices/pci0000:00/0000:00:1b.0/sound/card0/input24
[  474.095675] input: HDA Intel MID Headphone as /devices/pci0000:00/0000:00:1b.0/sound/card0/input25

L'audio est de retour : carte son dans /dev/snd, PipeWire détecte les périphériques. Le coupable ? Le BIOS fournit de faux paramètres au début ; le rescan après init PCI complète assigne le bon BAR.

Automatisation pour un usage quotidien

Pour un script systemd de production (post-démarrage) :

Google AdInline article slot
#!/bin/bash
PCI_ID="0000:00:1b.0"
echo 1 > /sys/bus/pci/devices/$PCI_ID/remove
sleep 2
echo 1 > /sys/bus/pci/rescan
# Vérification
if aplay -l | grep -q "card 0"; then
    systemctl --user restart pipewire pipewire-pulse wireplumber
fi

Placez-le dans /etc/systemd/system/pci-audio-rescan.service avec After=multi-user.target.

Diagnostic de régressions similaires

Pour snd_hda_intel sur Intel HDA legacy :

  • Récupérez les logs : dmesg | grep '00:1b.0', journalctl -b -p err | grep hda.
  • Vérifiez BAR : lspci -vv -s 00:1b.0 | grep BAR.
  • Testez le rescan : Utilisez la méthode sysfs ci-dessus.
  • Comparez les noyaux : LTS vs mainline — régression dans l'allocation PCI ou gestion d'énergie.
  • BIOS/UEFI : Mettez à jour si disponible, bien que ça aide rarement sur les chipsets de 2010.

Ça touche durement le matériel ancien après noyau 6.8+ : changements dans l'énumération PCI et ASPM.

Points clés

  • CORBRP=0xFFFF signale un contrôleur HDA bloqué, pas un problème BIOS/codec.
  • Rescan PCI via sysfs contourne les timeouts au démarrage à froid en réassignant BAR.
  • Noyaux LTS réussissent grâce au timing : modules chargés après remise BIOS.
  • Automatisation : service systemd assure la fiabilité sur les machines quotidiennes.
  • Diagnostic : Focalisez sur dmesg plutôt que l'espace utilisateur ; ciblez PCI BAR et CORB/RIRB.

— Editorial Team

Advertisement 728x90

Lire ensuite