看板 LinuxDev 關於我們 聯絡資訊
最近突然需要實現用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
breeze08: 我不是driver的專家,雖然不能給你什麼建議,但在你問 02/25 00:03
breeze08: 題的描述上想探討釐清一下,更清楚的描述或許有助於其 02/25 00:03
breeze08: 他人幫助你。以下是我對問題的理解,目前看起來是你有 02/25 00:03
breeze08: 一台x86主機,主機上有一套軟體要透過PCIe介面來跟FPGA 02/25 00:03
breeze08: 溝通,而你想使用DMA的方式來實現,到這部分我的理解對 02/25 00:03
breeze08: 嗎?假如這部分理解沒錯,再來會有幾個延伸問題,這個F 02/25 00:03
breeze08: PGA的供應商有提供基本的驅動給你嗎?還是你要自己從從 02/25 00:03
breeze08: 無到有?如果從無到有的話工程量可能頗巨大,就我的理 02/25 00:04
breeze08: 解來說你需要先閱讀那塊FGPA的Spec知道如何操作那塊FPG 02/25 00:04
breeze08: A,再來是根據Spec來撰寫主機上的PCIe驅動來實現跟FPGA 02/25 00:04
breeze08: 基本的溝通,然後以此為基礎調整成以DMA的方式傳送。還 02/25 00:04
breeze08: 是說你已經有廠商給的基本驅動只是要調整成DMA的方式? 02/25 00:04
breeze08: 另外根據你最後提到的透過DMA傳給主機這句話來看,我有 02/25 00:04
breeze08: 疑惑的是你這塊FPGA的角色是主動式還是被動式?他會主 02/25 00:04
breeze08: 動給PC訊號還是PC給訊號後才會動?這塊FPGA上的程式是 02/25 00:04
breeze08: 你撰寫的嗎?還是廠商提供的?你有需要去調整這上面的 02/25 00:04
breeze08: 程式碼嗎?還是程式碼是已經固化的? 02/25 00:05
不好意思!因為怕手機排版不好看,所以用截圖回覆! 非常謝謝您的幫助
uniquelegend: https://i.imgur.com/PZQVy8o.jpg 02/25 00:32
※ 編輯: uniquelegend (36.230.25.93 臺灣), 02/25/2022 00:33:34
breeze08: 這邊在釐清一下你想實現的DMA部份,指的是FPGA那一側還 02/25 00:40
breeze08: 是指主機那一側?還是兩側都要? 02/25 00:40
breeze08: 關於主機的PCIe驅動撰寫,參考書籍可以看看Linux Devic 02/25 00:44
breeze08: e Driver 3/e 或是平田豐的 Linux Device Driver Progr 02/25 00:44
breeze08: amming 02/25 00:44
breeze08: 這兩本也有關於DMA的章節 02/25 00:46
breeze08: 話說碩班一個人做這個感覺是有點慘,如果真的沒有人可 02/25 00:54
breeze08: 以幫的話可能就要考慮descent大說的外包了 02/25 00:54
breeze08: 啊 抱歉 我看到你是要實現FPGA上的DMA了,但如果是要實 02/25 01:03
breeze08: 現FPGA上的DMA可能就不屬於Linux driver的範疇了,而是 02/25 01:03
breeze08: 屬於積體電路設計的部分 02/25 01:03
不好意思!我可能沒有表達清楚。 是兩邊都需要的,驅動/fpga/軟體都需要實現。目前打算先新增完驅動的部分,再來進一步測試硬體到底該如何實現 因為目前我可能觀念有點模糊,所以不確定像這種streaming dma的buffer配置到底應不應該在驅動裡實現? 因為在網路上查到的介紹看起來是在「每次執行讀寫動作時,重新配置。」 感覺這個動作(每次執行)比較偏向軟體的部分而不是驅動。 我想確認我這個判斷方式是否有誤? 因為目前看到的範例都是比較簡短的小例子,我不大會分辨該在哪部分實現他才是對的。 謝謝您的回答 ※ 編輯: uniquelegend (36.230.25.93 臺灣), 02/25/2022 02:09:20
breeze08: 關於buffer該放在哪,以我粗淺的認知,放在用戶態(也就 02/25 15:40
breeze08: 是你的軟體)的效能會比較好,因為假如buffer放在驅動中 02/25 15:40
breeze08: (內核態),你的軟體還需要進行系統呼叫才能讀取,這步 02/25 15:40
breeze08: 驟就多了一份overhead。那所謂的buffer放在用戶態,其 02/25 15:40
breeze08: 具體實現也是透過驅動來達成的,通常是透過驅動中實現m 02/25 15:41
breeze08: map這個file operation來把內核態的空間映射至用戶態。 02/25 15:41
uniquelegend: 了解!太感謝您的幫忙了! 02/27 00:52