2015-12-22 12 views
6

Sto lavorando su un driver di rete per un endpoint FPGA che supporta interrupt MSI multi-messaggio (non msix) su un bus PCIe. Il processore host è un Intel i7 620LM x86 in esecuzione su CentOS con un kernel 4.2.Multi Message MSI implementato su Linux/x86?

L'endpoint FPGA annuncia correttamente più vettori msi nel suo registro delle capacità MSI (0x101 = 32 vettori possibili totali).

Da quello che posso dire, la funzionalità multi-messaggio è stata aggiunta nel kernel 4.2. Sfortunatamente quando chiamo pci_enable_msi_range(pdev, 1, 32); restituisce solo 1. Quando chiamo pci_msi_vec_count(pdev); restituisce 32. Sono in grado di richiedere un gestore di irq su un vettore e funziona come previsto.

Qualcuno sa se i vettori MSI multi-messaggio sono effettivamente supportati in Linux su architetture x86?

UPDATE: ho potuto ottenere tutti i 32 vettori MSI attivate utilizzando un diverso SBC con processore i7-4700EQ. Questo con un kernel 4.4-rc1.

UPDATE: Funziona anche con 4.2.

UPDATE: In questo caso, il problema era in coreboot. Sono riuscito a far funzionare più vettori una volta che il distributore di schede ha fornito un aggiornamento.

+0

Certo che lo è. Non sono sicuro del motivo per cui ottieni l'errore. ma ho scritto pochi driver che utilizzavano più di 1 vettore. – stdcall

+1

Che piattaforme erano su questo. Hai trovato processori, APIC, ecc. Combo che non riescono a rimappare più vettori? – Tanner

risposta

3

Ovviamente lo è. Non sono sicuro del motivo per cui ottieni l'errore. ma ho scritto pochi driver che utilizzavano più di 1 vettore.

Ho appena controllato il mio PC a casa, ho vari driver che utilizzano di più l'1 MSI IRQ:

$ 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

Sei sicuro che non stiano usando msi-x? Ho pensato che è quello che usa xhci-hcd. puoi fare un 'sudo lspci -v | grep MSI: '? – Tanner

+0

non c'è differenza tra MSI e MSIX da APIC prospective. – stdcall

+0

A un certo punto, si suppone, il supporto per MSI Muilti-Message sia stato aggiunto al kernel per architetture x86. Sembra che sia stato aggiunto in 4.2. Prima di questo, erano disponibili solo più vettori MSI-X. Chiaramente c'è qualche differenza sia che il software o l'hardware ne limitino l'implementazione. Non riesco a ottenere più vettori MSI sui kernel 4.2 e 4.4, ho incontrato altri con lo stesso problema. Non ho trovato un driver nell'albero del kernel 4.4 che implementa più di un vettore MSI. I driver che hai scritto usano i vettori MSI o MSI-X? – Tanner

5

ho avuto problemi utilizzando più di un MSI su una macchina Intel indipendentemente dalla versione del kernel Linux bene. Dopo un sacco di giochetti mi sono reso conto che abilitare VT-d nel BIOS ha risolto il problema (testato sul kernel di Linux 4.6). Penso che questo sia dovuto al fatto che per supportare più MSI su x86, il kernel Linux ha bisogno di supporto per il remapping degli interrupt, che è una delle funzionalità fornite da VT-d.

+0

Come si è scoperto il distributore di schede ha dovuto fornire una nuova versione di coreboot. Questo ha risolto il problema. – Tanner

2

Per aggiungere a ciò che ha menzionato Adrien, l'attivazione di CONFIG_IRQ_REMAP ha risolto il problema relativo alla possibilità di richiedere più MSI per lo stesso dispositivo. pci_enable_msi_range ha successo con i miei interrupt msi richiesti (8 in questo caso).