c request_irq MSI multi-messages est-il implémenté sous Linux/x86?




request_irq (3)

J'ai eu des problèmes en utilisant plus d'un MSI sur une machine Intel indépendamment de la version du noyau Linux. Après beaucoup de tripotage, j'ai réalisé que l'activation de VT-d dans le BIOS corrigeait le problème (testé sur le noyau Linux 4.6). Je pense que c'est parce que pour supporter plusieurs MSI sur x86, le noyau Linux a besoin de support pour le remappage d'interruption qui est l'une des fonctionnalités fournies par VT-d.

Je travaille sur un pilote réseau pour un point de terminaison FPGA qui supporte les interruptions MSI multi-message (pas msix) sur un bus PCIe. Le processeur hôte est un Intel i7 620LM x86 fonctionnant sur CentOS avec un noyau 4.2.

Le point d'extrémité FPGA annonce correctement plusieurs vecteurs msi dans son registre de capacités MSI (0x101 = 32 vecteurs possibles totaux).

D'après ce que je peux dire, la fonctionnalité multi-message a été ajoutée dans le noyau 4.2. Malheureusement, quand j'appelle pci_enable_msi_range(pdev, 1, 32); il ne renvoie que 1 . Quand j'appelle pci_msi_vec_count(pdev); il renvoie 32 . Je suis en mesure de demander un gestionnaire irq sur le seul vecteur et cela fonctionne comme prévu.

Est-ce que quelqu'un sait si les vecteurs MSI multi-message sont réellement supportés sous Linux sur les architectures x86?

MISE À JOUR: J'ai été en mesure d'obtenir tous les 32 vecteurs MSI activés en utilisant un autre SBC avec un processeur i7-4700EQ. Ceci avec un noyau 4.4-rc1.

MISE À JOUR: Fonctionne également avec 4.2.

UPDATE: Dans ce cas, le problème était dans coreboot. J'ai réussi à faire fonctionner plusieurs vecteurs une fois que le vendeur du forum a fourni une mise à jour.


Pour ajouter à ce qu'Adrien a mentionné, activer CONFIG_IRQ_REMAP a résolu mon problème de pouvoir demander plusieurs MSI pour le même périphérique. pci_enable_msi_range est réussi avec mes interruptions msi demandées (8 dans ce cas).


Bien sûr que c'est. Je ne suis pas sûr pourquoi exactement vous obtenez l'erreur. mais j'ai écrit quelques pilotes qui utilisaient plus d'un vecteur.

Je viens de vérifier mon PC à la maison, j'ai plusieurs pilotes qui utilisent plus l'IRQ 1 MSI:

$ cat /proc/interrupts | grep -i msi
 33:    5683962          0          0          0          0          0          0          0   PCI-MSI 524288-edge      radeon
 34:          0          0          0          0          0          0          0          0   PCI-MSI 1572864-edge      xhci_hcd
 35:          0          0          0          0          0          0          0          0   PCI-MSI 1572865-edge      xhci_hcd
 36:          0          0          0          0          0          0          0          0   PCI-MSI 1572866-edge      xhci_hcd
 37:          0          0          0          0          0          0          0          0   PCI-MSI 1572867-edge      xhci_hcd
 38:          0          0          0          0          0          0          0          0   PCI-MSI 1572868-edge      xhci_hcd
 39:          0          0          0          0          0          0          0          0   PCI-MSI 1572869-edge      xhci_hcd
 40:          0          0          0          0          0          0          0          0   PCI-MSI 1572870-edge      xhci_hcd
 41:          0          0          0          0          0          0          0          0   PCI-MSI 1572871-edge      xhci_hcd
 42:    3807594          0          0          0          0          0          0          0   PCI-MSI 512000-edge      0000:00:1f.2
 43:          0          0          0          0          0          0          0          0   PCI-MSI 2097152-edge      xhci_hcd
 44:          0          0          0          0          0          0          0          0   PCI-MSI 2097153-edge      xhci_hcd
 45:          0          0          0          0          0          0          0          0   PCI-MSI 2097154-edge      xhci_hcd
 46:          0          0          0          0          0          0          0          0   PCI-MSI 2097155-edge      xhci_hcd
 47:          0          0          0          0          0          0          0          0   PCI-MSI 2097156-edge      xhci_hcd
 48:          0          0          0          0          0          0          0          0   PCI-MSI 2097157-edge      xhci_hcd
 49:          0          0          0          0          0          0          0          0   PCI-MSI 2097158-edge      xhci_hcd
 50:          0          0          0          0          0          0          0          0   PCI-MSI 2097159-edge      xhci_hcd
 51:     310762          0          0          0          0          0          0          0   PCI-MSI 5242880-edge      0000:0a:00.0
 52:         11          0          0          0          0          0          0          0   PCI-MSI 360448-edge      mei_me
 54:   38991293          0          0          0          0          0          0          0   PCI-MSI 7340032-edge      enp14s0
 55:          1          0          0          0          0          0          0          0   PCI-MSI 32768-edge      i915
 56:       1169          0          0          0          0          0          0          0   PCI-MSI 442368-edge      snd_hda_intel
 57:        152          0          0          0          0          0          0          0   PCI-MSI 526336-edge      snd_hda_intel

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 42
Model name:            Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz
Stepping:              7
CPU MHz:               1634.257
CPU max MHz:           3800.0000
CPU min MHz:           1600.0000
BogoMIPS:              6825.67
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt tsc_deadline_timer aes xsave avx lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid xsaveopt




pci-e