【56】linux NTB 的測試工具

https://www.kernel.org/doc/html/latest/driver-api/ntb.html
https://github.com/jonmason/ntb/wiki/Linux-NTB-HOWTO-build-and-install
https://github.com/jonmason/ntb/wiki/Linux-NTB-HOWTO-test
https://www.kernel.org/doc/html/latest/driver-api/ntb.html
1、NTB的概念和作用
NTB全稱non transparent bridge,是相對於transparent bridge來說的。簡單說就是枚舉的時候,到了NTB這個橋時,枚舉事務就結束了,也就是該橋對於枚舉事務不再透明瞭(說白了就是PCI域隔離)。主要作用:用來連接兩個或者多個分離的memory系統(說白了就是地址轉換)。現在的NTB的支持兩個通用特性:doorbell reg和memory地址轉換窗口,還有一些不通用的特性:scratchpad和message寄存器。
Scratchpad寄存器是一個EP兩端都可以讀寫的寄存器,可以用讓對端設備和本段設備交換少量信息。
Message寄存器也可以用來做同樣的事情。
這兩種寄存器提供了特殊的mask bit來防止信息被對端設備重寫(也就是說同一時間只能有一端寫)。
Doorbell reg用讓對控給本控發送中斷(主要用來IO到達時,及時通知本控接收數據)。
Memory windows寄存器用來translate 對對控內存的讀寫請求。
2、linux NTB driver軟件棧
在這裏插入圖片描述
上圖可以看到linux NTB的軟件棧,hardware目錄是各個廠商具體的實現方式,NTB抽象出一個概念:ntb_dev,所有的hardware廠商要註冊對應的OPS到ntb_dev->ops,這樣可以提供統一的API,上層driver是看不到底層硬件具體操作(這種抽象是linux的核心思想,否者linux根本玩不轉這麼多硬件)。
3、NTB的測試工具
linux kernel在drivers\ntb\test提供了三個測試工具:ntb_tool、ntb_pingpong、ntb_perf

3.1 NTB pingpong測試原理
pingpong測試的原理很簡單,ntb_pingpong.ko加載後會註冊ntb_client pp_client。
pp_link_event-> pp_setup建立好pingpong數據結構,選擇使用哪個port,選擇doorbell哪寫bit,然後掛上hrtimer pp_timer_func。
本控Ping操作:
pp_timer_func–>pp_ping,把計數寫對端的scratch reg,然後寫doorebell request reg來觸發對端產生doorbell中斷,最後寫doorbell mask reg 來enable本端的doorbell中斷。
對控Pong操作:
中斷服務函數:ndev_interrupt-> ntb_db_event-> pp_db_event-> pp_pong。會讀取scratchreg(其實就是對端寫過來的計數),然後增加該計數,並寫doorbell mask reg來禁止本端的doorbell中斷,寫 doorbell status 來清除本端的doorbell中斷。最後掛hrtimer pp_timer_func,等待ping的爆發。
在這裏插入圖片描述
在這裏插入圖片描述
3.2. NTB perf原理
ntb perf是使用CPU或者DMA通過NTB往對控搬移數據。
默認是使用cpu搬運數據,如果想使用DMA搬運數據需要制定模塊參數use_dma爲1:insmod ntb_perf.ko dyndbg=+p use_dma=1
注意:ntb_perf的狀態機寫的比較土,必須兩控同時加載ntb_perf.ko(可以使用secureCRT或者xshell發送交互命令到所有對話讓兩控同時加載),否者必然有一控的狀態機走不完。使用DMA搬運數據的代碼寫錯了,導致填寫到描述符的目的地址是個非法地址,DMA無法使用。
解決目的地址非法的patch見
https://lore.kernel.org/patchwork/patch/1156715/
增加定位信息的patch見
https://lore.kernel.org/patchwork/patch/1168668/
怎麼把patch合併到自己的代碼中見:
https://blog.csdn.net/linjiasen/article/details/85262213

使用CPU搬運數據的數據流如下,下圖只是畫了從主控到從控的數據流,從從控到主控的數據流也是一樣的,只是CPU換成從控的CPU,地址映射使用的是從端的XLAT映射主控內存。
在這裏插入圖片描述
使用DMA搬運數據的數據流如下,下圖只是畫了從主控到從控的數據流,從從控到主控的數據流也是一樣的,只是DMA換成從控的NTBCCP,地址映射使用的是從端的XLAT映射主控內存。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章