2015-12-22 3 views
6

Я работаю над сетевым драйвером конечной точки FPGA, которая поддерживает прерывания MSI с несколькими сообщениями (не msix) на шине PCIe. Хост-процессор - это x86 Intel i7 620LM, работающий на CentOS с ядром 4.2.Является ли Multi Message MSI реализованным на Linux/x86?

Конечная точка FPGA правильно рекламирует несколько векторов msi в своем регистре возможностей MSI (0x101 = 32 возможных возможных вектора).

Из того, что я могу сказать, в ядре 4.2 была добавлена ​​функциональность нескольких сообщений. К сожалению, когда я звоню pci_enable_msi_range(pdev, 1, 32);, он возвращает 1. Когда я звоню pci_msi_vec_count(pdev);, он возвращает 32. Я могу запросить обработчик irq на одном векторе, и он работает так, как ожидалось.

Кто-нибудь знает, действительно ли многопоточные векторы MSI поддерживаются в Linux на архитектурах x86?

UPDATE: я был в состоянии получить все включено 32 векторы MSI с использованием другого SBC с процессором i7-4700EQ. Это с ядром 4.4-rc1.

ОБНОВЛЕНИЕ: Работы с 4.2 также.

ОБНОВЛЕНИЕ: В этом случае проблема была в загрузке. Мне удалось получить несколько векторов, работающих после того, как обновил досье.

+0

Конечно, это так. Я не уверен, почему именно вы получаете ошибку. но я написал несколько драйверов, которые использовали более 1 вектор. – stdcall

+1

Что такое платформа (-ы). Вы нашли какие-либо процессоры, APIC и т. Д. Комбо, которые неспособны переназначить несколько векторов? – Tanner

ответ

3

Конечно, это так. Я не уверен, почему именно вы получаете ошибку. но я написал несколько драйверов, которые использовали более 1 вектор.

Я только что проверил мой компьютер у себя дома, у меня есть различные драйверы, которые используют больше 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

Вы уверены, что не используете msi-x? Я думал, что это то, что использует xhci-hcd. вы можете сделать sudo lspci -v | grep MSI: '? – Tanner

+0

нет никакой разницы между MSI и MSIX от APIC. – stdcall

+0

В какой-то момент, предположительно, поддержка Muilti-Message MSI была добавлена ​​в ядро ​​для архитектур x86. Похоже, это было добавлено в 4.2. До этого были доступны только несколько векторов MSI-X. Ясно, что есть какая-то разница в том, что это программное обеспечение или аппаратное обеспечение, которые ограничивают его реализацию. Я не могу получить несколько векторов MSI в ядрах 4.2 и 4.4, я столкнулся с другими проблемами, имеющими ту же проблему. Я не нашел драйвер в дереве ядра 4.4, который реализует несколько векторов MSI. Использовали ли ваши драйверы MSI или MSI-X векторы? – Tanner

5

я имел проблемы с использованием более одного MSI на машине Intel, независимо от версии ядра Linux, как Что ж. После многих попыток я понял, что включение VT-d в BIOS устраняет проблему (протестировано на ядре Linux 4.6). Я думаю, это связано с тем, что для поддержки нескольких MSI на x86 ядро ​​Linux нуждается в поддержке переназначения прерываний, что является одной из функций, предоставляемых VT-d.

+0

Как выяснилось, игроку на борту пришлось предоставить новую версию Coreboot. Это решило проблему. – Tanner

2

Чтобы добавить к тому, что упоминает Адриен, включив CONFIG_IRQ_REMAP, я решил, что могу запросить несколько MSI для того же устройства. pci_enable_msi_range успешно работает с моими запрошенными прерываниями msi (в этом случае 8).

Смежные вопросы