2015-12-22 22 views
6

Ich arbeite an einem Netzwerktreiber für einen FPGA-Endpunkt, der Multi-Message-MSI-Interrupts (nicht msix) auf einem PCIe-Bus unterstützt. Der Host-Prozessor ist ein x86 Intel i7 620LM, der auf CentOS mit einem 4.2 Kernel läuft.Ist Multi Message MSI unter Linux/x86 implementiert?

Der FPGA-Endpunkt macht mehrere MSI-Vektoren im MSI-Funktionsregister richtig bekannt (0x101 = 32 mögliche Vektoren insgesamt).

Von was ich sagen kann, wurde Multi-Message-Funktionalität in Kernel 4.2 hinzugefügt. Leider, wenn ich pci_enable_msi_range(pdev, 1, 32); rufe, gibt es nur 1 zurück. Wenn ich rufe, wird 32 zurückgegeben. Ich bin in der Lage, einen irq-Handler auf dem einen Vektor anzufordern, und es funktioniert wie erwartet.

Weiß jemand, ob Multi-Message-MSI-Vektoren tatsächlich in Linux auf x86-Architekturen unterstützt werden?

UPDATE: Ich war in der Lage alle 32 MSI-Vektoren erhalten aktiviert einen anderen SBC mit einem i7-4700EQ Prozessor. Dies mit einem 4,4-rc1-Kernel.

UPDATE: Funktioniert mit 4.2 ebenso.

UPDATE: In diesem Fall war das Problem in Coreboot. Ich war in der Lage, mehrere Vektoren zu aktivieren, sobald der Board-Verkäufer ein Update zur Verfügung gestellt hat.

+0

Natürlich ist es. Ich bin nicht sicher, warum genau Sie den Fehler erhalten. aber ich habe einige Treiber geschrieben, die mehr als 1 Vektor verwendeten. – stdcall

+1

Welche Plattform (en) war das? Haben Sie Prozessoren, APICs usw. gefunden, die mehrere Vektoren nicht neu zuordnen können? – Tanner

Antwort

3

Natürlich ist es. Ich bin nicht sicher, warum genau Sie den Fehler erhalten. aber ich habe einige Treiber geschrieben, die mehr als 1 Vektor verwendeten.

Ich habe gerade meinen PC zu Hause, habe ich verschiedene Treiber, die mehr die 1 MSI IRQ verwenden:

$ 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 
+0

Sind Sie sicher, dass sie msi-x nicht verwenden? Ich dachte das ist was xhci-hcd benutzt. kannst du ein 'sudo lspci -v | grep MSI: '? – Tanner

+0

Es gibt keinen Unterschied zwischen MSI und MSIX von APIC prospektiv. – stdcall

+0

Irgendwann wurde angeblich die Unterstützung von Muilti-Message MSI dem Kernel für x86-Architekturen hinzugefügt. Es sieht so aus, als ob es in 4.2 hinzugefügt wurde. Zuvor waren nur mehrere MSI-X-Vektoren verfügbar. Natürlich gibt es einen Unterschied, sei es Software oder Hardware, die ihre Implementierung einschränkten. Ich bin nicht in der Lage, mehrere MSI-Vektoren auf 4.2 und 4.4 Kernel zu bekommen, habe ich in andere mit dem gleichen Problem gerannt. Ich habe keinen Treiber im Kernel 4.4 gefunden, der mehr als einen MSI-Vektor implementiert. Haben die von Ihnen geschriebenen Treiber MSI- oder MSI-X-Vektoren verwendet? – Tanner

5

Ich hatte Probleme auf einer Intel-Maschine mehr als ein MSI mit unabhängig von der Linux-Kernel-Version als Gut. Nach langem Herumspielen wurde mir klar, dass die Aktivierung von VT-d im BIOS das Problem behob (getestet unter Linux 4.6 Kernel). Ich denke, das liegt daran, dass der Linux-Kernel, um mehrere MSIs auf x86 zu unterstützen, Unterstützung für die Neuzuordnung von Interrupts benötigt, was eine der Funktionen von VT-d ist.

+0

Wie sich herausstellte, musste der Board-Anbieter eine neue Version von coreboot bereitstellen. Dies hat das Problem gelöst. – Tanner

2

Um hinzuzufügen, was Adrien erwähnt, löste das Einschalten von CONFIG_IRQ_REMAP mein Problem mit der Möglichkeit, mehrere MSIs für das gleiche Gerät anzufordern. pci_enable_msi_range ist erfolgreich mit meinen angeforderten MSI-Interrupts (in diesem Fall 8).