2012-02-21 13 views
6

मैं लिनक्स कर्नेल के लिए एफपीजीए ड्राइवर पर काम कर रहा हूं। कोड x86 पर ठीक काम करता प्रतीत होता है, लेकिन x86_64 पर मुझे कुछ समस्याएं आई हैं। मैंने स्ट्रीमिंग डीएमए लागू किया। तो यह जाता हैपीसीआईई लिनक्स कर्नेल ड्राइवर में स्ट्रीमिंग डीएमए

get_user_pages(...); 
for (...) { 
    sg_set_page(); 
} 
pci_map_sg(); 

लेकिन pci_map_sg तरह 0xbd285800 जैसे पतों का है, जो PAGE_SIZE से गठबंधन नहीं कर रहे हैं लौट आए, तो मैं पूर्ण पहले पृष्ठ नहीं भेज सकते, क्योंकि PCIE विनिर्देश कहते

"अनुरोध उल्लेख नहीं होना चाहिए एक पता/लंबाई संयोजन जो को 4-केबी सीमा पार करने के लिए मेमोरी स्पेस एक्सेस का कारण बनता है। "

क्या गठबंधन पते प्राप्त करने का कोई तरीका है, या क्या मैंने अभी कुछ महत्वपूर्ण याद किया है?

Source code of DMA

+0

क्या आप अपने असली स्रोत से कोड शामिल कर सकते हैं? बग को खोजने के लिए पर्याप्त नहीं है। –

+0

हाँ, ज़ाहिर है। मूल पोस्ट से जुड़ा हुआ है। – soh

+0

@soh: इसे जनता को छोड़ने की कोई योजना है? मैं एक खुले ड्राइवर के लिए चारों ओर देख रहा था और एक अच्छा नहीं मिला। खुद को लिखने के लिए बहुत आलसी होने के नाते, मैं योगदान करने और परीक्षण में सहायता करने के लिए खुश हूं। –

उत्तर

3

दिमाग में आने वाली पहली संभावना यह है कि उपयोगकर्ता बफर आने वाले पृष्ठ सीमा से शुरू नहीं होता है। यदि आपका प्रारंभ पता किसी पृष्ठ के माध्यम से 0x800 बाइट्स है, तो आपके पहले sg_set_page कॉल पर ऑफसेट 0x800 होगा। यह 0x800 में समाप्त होने वाले डीएमए पते का उत्पादन करेगा। यह एक सामान्य बात है, और एक बग नहीं है।

pci_map_sg कोलेसेस पृष्ठ के रूप में, यह पहला खंड एक पृष्ठ से बड़ा हो सकता है। महत्वपूर्ण बात यह है कि pci_map_sg डीएमए एड्रेसेबल मेमोरी के संगत ब्लॉक उत्पन्न करता है, लेकिन यह निम्न स्तर के पीसीआई लेनदेन की एक सूची नहीं बनाता है। X64 पर आपको एक बड़ा क्षेत्र प्राप्त करने की अधिक संभावना है, क्योंकि अधिकांश x64 प्लेटफ़ॉर्म में IOMMU होता है।

मेरे साथ सौदा करने वाले कई डिवाइसों में डीएमए इंजन हैं जो मुझे कई मेगाबाइट्स की लॉजिकल ट्रांसफर लम्बाई निर्दिष्ट करने की अनुमति देते हैं। आम तौर पर पीसीआई एंडपॉइंट में डीएमए कार्यान्वयन प्रत्येक 4 केबी सीमा पर एक नया पीसीआई लेनदेन शुरू करने के लिए ज़िम्मेदार है, और प्रोग्रामर उस बाधा को अनदेखा कर सकता है। यदि एफपीजीए में संसाधनों को संभालने के लिए बहुत सीमित हैं, तो आप पीसीआई लेनदेन की एक (बहुत अधिक) सूची में मेमोरी ब्लॉक की लिनक्स सूची को परिवर्तित करने के लिए ड्राइवर कोड लिखने पर विचार कर सकते हैं।

+0

के लिए अपना डीएमए मास्क ठीक से सेट करने का प्रयास करें बहुत बहुत धन्यवाद। उपयोगकर्ता बफर ठीक था, लेकिन एफपीजीए पीसीआईई कोर लंबे बफर को संभाल नहीं करता है। – soh

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