2015-12-22 6 views
6

मैं एक एफपीजीए एंडपॉइंट के लिए नेटवर्क ड्राइवर पर काम कर रहा हूं जो पीसीआई बस पर बहु-संदेश एमएसआई इंटरप्ट्स (एमएसआईक्स नहीं) का समर्थन करता है। होस्ट प्रोसेसर एक x86 इंटेल i7 620LM 4.2 कर्नेल के साथ CentOS पर चल रहा है।क्या मल्टी संदेश एमएसआई लिनक्स/x86 पर लागू किया गया है?

एफपीजीए एंडपॉइंट सही ढंग से एमएसआई क्षमताओं रजिस्टर (0x101 = 32 कुल संभावित वैक्टर) में कई एमएसआई वैक्टर का विज्ञापन करता है।

जो मैं बता सकता हूं, बहु-संदेश कार्यक्षमता कर्नेल 4.2 में जोड़ा गया था। दुर्भाग्य से जब मैं pci_enable_msi_range(pdev, 1, 32); पर कॉल करता हूं तो यह केवल 1 देता है। जब मैं pci_msi_vec_count(pdev); पर कॉल करता हूं तो यह 32 देता है। मैं एक वेक्टर पर एक irq हैंडलर का अनुरोध करने में सक्षम हूं और यह उम्मीद के अनुसार काम करता है।

क्या किसी को पता है कि क्या बहु-संदेश एमएसआई वैक्टर वास्तव में x86 आर्किटेक्चर पर लिनक्स में समर्थित हैं?

अद्यतन: मैं सभी 32 एमएसआई वैक्टर एक i7-4700EQ प्रोसेसर के साथ एक अलग एसबीसी का उपयोग करके सक्षम प्राप्त करने में सक्षम था। यह 4.4-आरसी 1 कर्नेल के साथ है।

अद्यतन: 4.2 के साथ भी काम करता है।

अद्यतन: इस मामले में, समस्या कोरबूट में थी। एक बार बोर्ड विक्रेता ने एक अद्यतन प्रदान करने के बाद मैं कई वैक्टर काम करने में सक्षम था।

+0

बेशक यह है। मुझे यकीन नहीं है कि आपको वास्तव में त्रुटि क्यों मिलती है। लेकिन मैंने कुछ ड्राइवर लिखे हैं जो 1 से अधिक वेक्टर का इस्तेमाल करते हैं। – stdcall

+1

यह किस प्लेटफ़ॉर्म पर था। क्या आपको कोई प्रोसेसर, एपीआईसी, इत्यादि मिल गया है जो एकाधिक वैक्टरों को रीमेप करने में असमर्थ हैं? – Tanner

उत्तर

3

बेशक यह है। मुझे यकीन नहीं है कि आपको वास्तव में त्रुटि क्यों मिलती है। लेकिन मैंने कुछ ड्राइवर लिखे हैं जो 1 से अधिक वेक्टर का इस्तेमाल करते हैं।

मैं सिर्फ घर पर मेरे पीसी की जाँच की, मैं जो अधिक 1 एमएसआई 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

क्या आप वाकई एमएसआई-एक्स का उपयोग नहीं कर रहे हैं? मैंने सोचा कि xhci-hcd क्या उपयोग करता है। क्या आप एक 'sudo lspci -v | कर सकते हैं grep एमएसआई: '? – Tanner

+0

एपीआईसी संभावित से एमएसआई और एमएसआईक्स के बीच कोई अंतर नहीं है। – stdcall

+0

किसी बिंदु पर, माना जाता है कि, मुलिली-संदेश एमएसआई समर्थन x86 आर्किटेक्चर के लिए कर्नेल में जोड़ा गया था। ऐसा लगता है कि यह 4.2 में जोड़ा गया था। इससे पहले, केवल कई एमएसआई-एक्स वैक्टर उपलब्ध थे। स्पष्ट रूप से कुछ अंतर यह सॉफ्टवेयर या हार्डवेयर है जो इसके कार्यान्वयन को सीमित करता है। मैं 4.2 और 4.4 कर्नेल पर कई एमएसआई वैक्टर प्राप्त करने में असमर्थ हूं, मैंने अन्य समस्याओं में एक ही समस्या है। मुझे 4.4 कर्नेल पेड़ में एक ड्राइवर नहीं मिला है जो एक से अधिक एमएसआई वेक्टर लागू करता है। क्या आपने लिखा ड्राइवरों ने एमएसआई या एमएसआई-एक्स वैक्टर का उपयोग किया था? – Tanner

5

मैं था एक इंटेल के रूप में लिनक्स कर्नेल संस्करण की स्वतंत्र रूप से मशीन पर एक से अधिक एमएसआई प्रयोग करने में समस्या कुंआ। बहुत सारे झुकाव के बाद मुझे एहसास हुआ कि बायोस में वीटी-डी को सक्षम करने से समस्या ठीक हुई (लिनक्स 4.6 कर्नेल पर परीक्षण किया गया)। मुझे लगता है कि ऐसा इसलिए है क्योंकि x86 पर एकाधिक एमएसआई का समर्थन करने के लिए, लिनक्स कर्नेल को इंटरप्ट रीपैपिंग के लिए समर्थन की आवश्यकता है जो वीटी-डी द्वारा प्रदान की जाने वाली सुविधाओं में से एक है।

+0

जैसा कि यह निकला कि बोर्ड विक्रेता को कोरबूट का एक नया संस्करण प्रदान करना पड़ा था। इसने समस्या हल की। – Tanner

2

एड्रियान का उल्लेख करने के लिए, CONFIG_IRQ_REMAP को चालू करने के लिए एक ही डिवाइस के लिए कई एमएसआई का अनुरोध करने में सक्षम होने का मेरा मुद्दा हल हो गया। pci_enable_msi_range मेरे अनुरोधित एमएसआई इंटरप्ट्स (इस मामले में 8) के साथ सफल है।

संबंधित मुद्दे