[問題] DMA driver相關問題

看板LinuxDev作者 (back7590)時間2年前 (2022/02/24 15:56), 2年前編輯推噓1(1035)
留言36則, 2人參與, 2年前最新討論串1/3 (看更多)
最近突然需要實現用dma與fpga溝通, 但由於一直以來都沒有碰有關driver的東西, 而且有時間壓力, 所以一直都是在網路上瞎找資料。 (因為真的沒有按部就班的從基礎學起, 所以可能會有非常嚴重的概念錯誤, 請各位見諒。) 想請問一些觀念問題或有沒有推薦的書? 1. 像是使用持續性(coherent)的DMA是在掛載driver時就將配置buffer的部分寫在driver中了; 那如果是streaming這種,既然是每次動作時重新map,那是不是配置buffer的部分就是直接寫在軟體動作裡? 2. (這問題不知道會不會錯版) fpga的部分等軟體分配完buffer後,將總線地址傳給fpga。 照著TLP格式來放入此地址,並將TLP丟給RQ/RC通道, 就會自動判定成DMA請求並執行嗎? (因為部分原因,所以pcie ip的部分沒有使用官方含有dma的ip,而是使用最基礎的Ultrasc 目前只是要將fpga內的資料在軟體請求時,透過dma寫入主機。 但因為相關概念真的非常不足, 也沒有人可以詢問,所以可能很多觀念有嚴重錯誤,煩請大家不吝指教。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.200.42.183 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/LinuxDev/M.1645689370.A.628.html ※ 編輯: uniquelegend (1.200.42.183 臺灣), 02/24/2022 16:30:26

02/25 00:03, 2年前 , 1F
我不是driver的專家,雖然不能給你什麼建議,但在你問
02/25 00:03, 1F

02/25 00:03, 2年前 , 2F
題的描述上想探討釐清一下,更清楚的描述或許有助於其
02/25 00:03, 2F

02/25 00:03, 2年前 , 3F
他人幫助你。以下是我對問題的理解,目前看起來是你有
02/25 00:03, 3F

02/25 00:03, 2年前 , 4F
一台x86主機,主機上有一套軟體要透過PCIe介面來跟FPGA
02/25 00:03, 4F

02/25 00:03, 2年前 , 5F
溝通,而你想使用DMA的方式來實現,到這部分我的理解對
02/25 00:03, 5F

02/25 00:03, 2年前 , 6F
嗎?假如這部分理解沒錯,再來會有幾個延伸問題,這個F
02/25 00:03, 6F

02/25 00:03, 2年前 , 7F
PGA的供應商有提供基本的驅動給你嗎?還是你要自己從從
02/25 00:03, 7F

02/25 00:04, 2年前 , 8F
無到有?如果從無到有的話工程量可能頗巨大,就我的理
02/25 00:04, 8F

02/25 00:04, 2年前 , 9F
解來說你需要先閱讀那塊FGPA的Spec知道如何操作那塊FPG
02/25 00:04, 9F

02/25 00:04, 2年前 , 10F
A,再來是根據Spec來撰寫主機上的PCIe驅動來實現跟FPGA
02/25 00:04, 10F

02/25 00:04, 2年前 , 11F
基本的溝通,然後以此為基礎調整成以DMA的方式傳送。還
02/25 00:04, 11F

02/25 00:04, 2年前 , 12F
是說你已經有廠商給的基本驅動只是要調整成DMA的方式?
02/25 00:04, 12F

02/25 00:04, 2年前 , 13F
另外根據你最後提到的透過DMA傳給主機這句話來看,我有
02/25 00:04, 13F

02/25 00:04, 2年前 , 14F
疑惑的是你這塊FPGA的角色是主動式還是被動式?他會主
02/25 00:04, 14F

02/25 00:04, 2年前 , 15F
動給PC訊號還是PC給訊號後才會動?這塊FPGA上的程式是
02/25 00:04, 15F

02/25 00:04, 2年前 , 16F
你撰寫的嗎?還是廠商提供的?你有需要去調整這上面的
02/25 00:04, 16F

02/25 00:05, 2年前 , 17F
程式碼嗎?還是程式碼是已經固化的?
02/25 00:05, 17F
不好意思!因為怕手機排版不好看,所以用截圖回覆! 非常謝謝您的幫助

02/25 00:32, 2年前 , 18F
※ 編輯: uniquelegend (36.230.25.93 臺灣), 02/25/2022 00:33:34

02/25 00:40, 2年前 , 19F
這邊在釐清一下你想實現的DMA部份,指的是FPGA那一側還
02/25 00:40, 19F

02/25 00:40, 2年前 , 20F
是指主機那一側?還是兩側都要?
02/25 00:40, 20F

02/25 00:44, 2年前 , 21F
關於主機的PCIe驅動撰寫,參考書籍可以看看Linux Devic
02/25 00:44, 21F

02/25 00:44, 2年前 , 22F
e Driver 3/e 或是平田豐的 Linux Device Driver Progr
02/25 00:44, 22F

02/25 00:44, 2年前 , 23F
amming
02/25 00:44, 23F

02/25 00:46, 2年前 , 24F
這兩本也有關於DMA的章節
02/25 00:46, 24F

02/25 00:54, 2年前 , 25F
話說碩班一個人做這個感覺是有點慘,如果真的沒有人可
02/25 00:54, 25F

02/25 00:54, 2年前 , 26F
以幫的話可能就要考慮descent大說的外包了
02/25 00:54, 26F

02/25 01:03, 2年前 , 27F
啊 抱歉 我看到你是要實現FPGA上的DMA了,但如果是要實
02/25 01:03, 27F

02/25 01:03, 2年前 , 28F
現FPGA上的DMA可能就不屬於Linux driver的範疇了,而是
02/25 01:03, 28F

02/25 01:03, 2年前 , 29F
屬於積體電路設計的部分
02/25 01:03, 29F
不好意思!我可能沒有表達清楚。 是兩邊都需要的,驅動/fpga/軟體都需要實現。目前打算先新增完驅動的部分,再來進一步測試硬體到底該如何實現 因為目前我可能觀念有點模糊,所以不確定像這種streaming dma的buffer配置到底應不應該在驅動裡實現? 因為在網路上查到的介紹看起來是在「每次執行讀寫動作時,重新配置。」 感覺這個動作(每次執行)比較偏向軟體的部分而不是驅動。 我想確認我這個判斷方式是否有誤? 因為目前看到的範例都是比較簡短的小例子,我不大會分辨該在哪部分實現他才是對的。 謝謝您的回答 ※ 編輯: uniquelegend (36.230.25.93 臺灣), 02/25/2022 02:09:20

02/25 15:40, 2年前 , 30F
關於buffer該放在哪,以我粗淺的認知,放在用戶態(也就
02/25 15:40, 30F

02/25 15:40, 2年前 , 31F
是你的軟體)的效能會比較好,因為假如buffer放在驅動中
02/25 15:40, 31F

02/25 15:40, 2年前 , 32F
(內核態),你的軟體還需要進行系統呼叫才能讀取,這步
02/25 15:40, 32F

02/25 15:40, 2年前 , 33F
驟就多了一份overhead。那所謂的buffer放在用戶態,其
02/25 15:40, 33F

02/25 15:41, 2年前 , 34F
具體實現也是透過驅動來達成的,通常是透過驅動中實現m
02/25 15:41, 34F

02/25 15:41, 2年前 , 35F
map這個file operation來把內核態的空間映射至用戶態。
02/25 15:41, 35F

02/27 00:52, 2年前 , 36F
了解!太感謝您的幫忙了!
02/27 00:52, 36F
文章代碼(AID): #1Y5peQOe (LinuxDev)
討論串 (同標題文章)
文章代碼(AID): #1Y5peQOe (LinuxDev)