pcie控制器也提供dma(direct memory access)功能,用來批量地非同步資料傳輸。
假設現在rc要從ep mem space讀1mb資料,可以有這麼兩種方式:rc發起dma讀;ep發起dma寫。這兩種方式結果是等效的,對最後完成中斷的方式會不一樣,前者通過local interrupt表示自己dma讀完了,後者需要ep傳送一筆imwr來表示dma讀完成了。
如圖表示本地控制器發起一筆1mb寫操作
1.2.1 sar和dst
sar表示dma傳輸的資料源位址,如果rc發起從ep讀操作,那麼sar必定是ep中某個bar range內。目標位址dar就是系統ddr中的位址。反之,如上圖所示的寫操作,dar就是ep中mem space。
1.2.2 max_payload_size
dma讀寫本質上還是通過拆分成tlp來進行的,每次傳輸的size就是通過tlp header中的length來確定的,而length由控制器的max_payload_size決定,這個值取ep和rc的capability中相應引數的最小值。
對於大批量資料的傳輸,通常都會有所謂的linked list mode。試想一下,在linux執行時要進行大批量資料傳輸的時候是很難分配到大塊連續的實體地址的,那麼勢必需要重**起dma傳輸,這樣的話dma的非同步傳輸功能豈不是被變相衰弱了。所以在硬體上要有這樣一種機制來避免這個問題,這就是ll dma。
這種機制廣泛存在於各種高速裝置中,usb3.0傳輸的時候內部通過鏈結trb實現的就是linked list dma。
如上圖所示,linked list中每個配置塊稱作element,每個element中的內容就是前面dma傳輸時候的配置,硬體在發起dma傳輸的時候把這塊payload載入到指定的暫存器中。ll mode的結束通過cb來標誌,toggle一下即表示到了ll的末尾。
pcie採用data path才傳遞interrupt,這就是message signal interrupt。假如rc收到一筆對應的寫操作,那麼在硬體實現上就會自動轉換成中斷訊號給中斷控制器,這筆寫請求並不會到任何ram區域。
2.1.1 generic interrupt controller
從corelink gic-500開始支援msi/msi-x。corelink gic-400不支援,所以就算pcie裝置支援也無法實現msi(-x)機制。
2.1.2 pcie裝置支援
每乙個具有msi capability的device都有一組對應的暫存器來表示msi能力。
msi control register中的multiple message capable(三個位元,假設值為x)表示msi可產生多少message,計算方法為2的x此方。另外有三個位元multiple message enable,和message capable對應,表示實際使能了多少message。還有乙個msi data暫存器和msi address暫存器,要結合中斷控制器配置,表示具體的message編碼和message的目標位址。
PCIe實踐之路 Linux訪問PCIe空間
linux在列舉pcie裝置的過程由核心中的pci框架負責,在ep配置完成之後,驅動通過以下介面訪問pcie空間,原理參考前文 大話pcie 裝置列舉 相關介面位於drivers pci access.c 在列舉過程中,pci驅動已經分配了address給各個bar,通過一些介面就可以訪問到bar ...
Linux下PCIe驅動以及DMA機制
1.驅動程式作用 裝置驅動程式向應用程式遮蔽了硬體在實現上的細節,使得應用程式可以像操作普通檔案一樣操作外部裝置。linux 作業系統抽象了對硬體的處理,可以使用和操作檔案相同的,標準的系統呼叫介面來完成開啟,關閉,讀寫喝 i o控制操作,而驅動程式主要任務也就是實現這些系統呼叫函式。每個裝置檔案對...
PCIe實踐之路 Linux RC驅動
最新的4.12核心中對pci host driver進行一些劃分,把基於designware ip的主控驅動放到drivers pci dwc目錄下去了。如果是基於老的kernel開發,想要移植新版的核心的話,要注意,同時多了designware ep驅動框架。非designware的主控驅動還是位...