最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

深入分析Linux PCI驅動框架(三)

2023-01-11 15:34 作者:補給站Linux內核  | 我要投稿

說明:

  1. Kernel版本:4.14

  2. ARM64處理器

  3. 使用工具:Source Insight 3.5, Visio

1. 概述

先回顧一下PCIe的架構圖:

  • 本文將講PCIe Host的驅動,對應為Root Complex部分,相當于PCI的Host Bridge部分;

  • 本文會選擇Xilinx的nwl-pcie來進行分析;

  • 驅動的編寫整體偏簡單,往現(xiàn)有的框架上套就可以了,因此不會花太多筆墨,點到為止;

2. 流程分析

  • 但凡涉及到驅動的分析,都離不開驅動模型的介紹,驅動模型的實現(xiàn)讓具體的驅動開發(fā)變得更容易;

  • 所以,還是回顧一下上篇文章提到的驅動模型:Linux內核建立了一個統(tǒng)一的設備模型,分別采用總線、設備、驅動三者進行抽象,其中設備與驅動都掛在總線上,當有新的設備注冊或者新的驅動注冊時,總線會去進行匹配操作(match函數(shù)),當發(fā)現(xiàn)驅動與設備能進行匹配時,就會執(zhí)行probe函數(shù)的操作;

  • 《Linux PCI驅動框架分析(二)》中提到過PCI設備、PCI總線和PCI驅動的創(chuàng)建,PCI設備和PCI驅動掛接在PCI總線上,這個理解很直觀。針對PCIe的控制器來說,同樣遵循設備、總線、驅動的匹配模型,不過這里的總線是由虛擬總線platform總線來替代,相應的設備和驅動分別為platform_deviceplatform_driver;

那么問題來了,platform_device是在什么時候創(chuàng)建的呢?那就不得不提到Device Tree設備樹了。


【文章福利】小編推薦自己的Linux內核技術交流群:【749907784】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ?

2.1 Device Tree

  • 設備樹用于描述硬件的信息,包含節(jié)點各類屬性,在dts文件中定義,最終會被編譯成dtb文件加載到內存中;

  • 內核會在啟動過程中去解析dtb文件,解析成device_node描述的Device Tree

  • 根據(jù)device_node節(jié)點,創(chuàng)建platform_device結構,并最終注冊進系統(tǒng),這個也就是PCIe Host設備的創(chuàng)建過程;

我們看看PCIe Host的設備樹內容:

關鍵字段描述如下:

  • compatible:用于匹配PCIe Host驅動;

  • msi-controller:表示是一個MSI(Message Signaled Interrupt)控制器節(jié)點,這里需要注意的是,有的SoC中斷控制器使用的是GICV2版本,而GICV2并不支持MSI,所以會導致該功能的缺失;

  • device-type:必須是"pci";

  • interrupts:包含NWL PCIe控制器的中斷號;

  • interrupts-namemsi1, msi0用于MSI中斷,intx用于舊式中斷,與interrupts中的中斷號對應;

  • reg:包含用于訪問PCIe控制器操作的寄存器物理地址和大??;

  • reg-name:分別表示Bridge registersPCIe Controller registers,?Configuration space region,與reg中的值對應;

  • ranges:PCIe地址空間轉換到CPU的地址空間中的范圍;

  • bus-range:PCIe總線的起始范圍;

  • interrupt-map-maskinterrupt-map:標準PCI屬性,用于定義PCI接口到中斷號的映射;

  • legacy-interrupt-controller:舊式的中斷控制器;

2.2 probe流程

  • 系統(tǒng)會根據(jù)dtb文件創(chuàng)建對應的platform_device并進行注冊;

  • 當驅動與設備通過compatible字段匹配上后,會調用probe函數(shù),也就是nwl_pcie_probe;

看一下nwl_pcie_probe函數(shù):

  • 通常probe函數(shù)都是進行一些初始化操作和注冊操作:

    1. 初始化包括:數(shù)據(jù)結構的初始化以及設備的初始化等,設備的初始化則需要獲取硬件的信息(比如寄存器基地址,長度,中斷號等),這些信息都從DTS而來;

    2. 注冊操作主要是包含中斷處理函數(shù)的注冊,以及通常的設備文件注冊等;

?

  • 針對PCI控制器的驅動,核心的流程是需要分配并初始化一個pci_host_bridge結構,最終通過這個bridge去枚舉PCI總線上的所有設備;

  • devm_pci_alloc_host_bridge:分配并初始化一個基礎的pci_hsot_bridge結構;

  • nwl_pcie_parse_dt:獲取DTS中的寄存器信息及中斷信息,并通過irq_set_chained_handler_and_data設置intx中斷號對應的中斷處理函數(shù),該處理函數(shù)用于中斷的級聯(lián);

  • nwl_pcie_bridge_init:硬件的Controller一堆設置,這部分需要去查閱Spec,了解硬件工作的細節(jié)。此外,通過devm_request_irq注冊misc中斷號對應的中斷處理函數(shù),該處理函數(shù)用于控制器自身狀態(tài)的處理;

  • pci_parse_request_of_pci_ranges:用于解析PCI總線的總線范圍和總線上的地址范圍,也就是CPU能看到的地址區(qū)域;

  • nwl_pcie_init_irq_domainmwl_pcie_enable_msi與中斷級聯(lián)相關,下個小節(jié)介紹;

  • pci_scan_root_bus_bridge:對總線上的設備進行掃描枚舉,這個流程在《Linux PCI驅動框架分析(二)》中分析過。brdige結構體中的pci_ops字段,用于指向PCI的讀寫操作函數(shù)集,當具體掃描到設備要讀寫配置空間時,調用的就是這個函數(shù),由具體的Controller驅動實現(xiàn);

2.3 中斷處理

PCIe控制器,通過PCIe總線連接各種設備,因此它本身充當一個中斷控制器,級聯(lián)到上一層的中斷控制器(比如GIC),如下圖:

  • PCIe總線支持兩種中斷的處理方式:

    1. Legacy Interrupt:總線提供INTA#, INTB#, INTC#, INTD#四根中斷信號,PCI設備借助這四根信號使用電平觸發(fā)方式提交中斷請求;

    2. MSI(Message Signaled Interrupt) Interrupt:基于消息機制的中斷,也就是往一個指定地址寫入特定消息,從而觸發(fā)一個中斷;

針對兩種處理方式,NWL PCIe驅動中,實現(xiàn)了兩個irq_chip,也就是兩種方式的中斷控制器:

  • irq_domain對應一個中斷控制器(irq_chip),irq_domain負責將硬件中斷號映射到虛擬中斷號上;

  • 來一張舊圖吧,具體文章可以去參考中斷子系統(tǒng)相關文章;

再來看一下nwl_pcie_enable_msi函數(shù):

  • 在該函數(shù)中主要完成的工作就是設置級聯(lián)的中斷處理函數(shù),級聯(lián)的中斷處理函數(shù)中最終會去調用具體的設備的中斷處理函數(shù);

?

所以,稍微匯總一下,作為兩種不同的中斷處理方式,套路都是一樣的,都是創(chuàng)建irq_chip中斷控制器,為該中斷控制器添加irq_domain,具體設備的中斷響應流程如下:

  1. 設備連接在PCI總線上,觸發(fā)中斷時,通過PCIe控制器充當?shù)闹袛嗫刂破髀酚傻缴弦患壙刂破?,最終路由到CPU;

  2. CPU在處理PCIe控制器的中斷時,調用它的中斷處理函數(shù),也就是上文中提到過的nwl_pcie_leg_handler,nwl_pcie_msi_handler_high,和nwl_pcie_leg_handler_low;

  3. 在級聯(lián)的中斷處理函數(shù)中,調用chained_irq_enter進入中斷級聯(lián)處理;

  4. 調用irq_find_mapping找到具體的PCIe設備的中斷號;

  5. 調用generic_handle_irq觸發(fā)具體的PCIe設備的中斷處理函數(shù)執(zhí)行;

  6. 調用chained_irq_exit退出中斷級聯(lián)的處理;

2.4 總結

  • PCIe控制器驅動,各家的IP實現(xiàn)不一樣,驅動的差異可能會很大,單獨分析一個驅動畢竟只是個例,應該去掌握背后的通用框架;

  • 各類驅動,大體都是硬件初始化配置,資源申請注冊,核心是處理與硬件的交互(一般就是中斷的處理),如果需要用戶來交互的,則還需要注冊設備文件,實現(xiàn)一堆file_operation操作函數(shù)集;

原文作者:LoyenWang





深入分析Linux PCI驅動框架(三)的評論 (共 條)

分享到微博請遵守國家法律
攀枝花市| 亚东县| 醴陵市| 新昌县| 榕江县| 肃南| 资溪县| 南康市| 栾川县| 商河县| 灌云县| 荃湾区| 金阳县| 文水县| 余江县| 禄丰县| 襄樊市| 宁南县| 社会| 江津市| 淮北市| 景东| 塘沽区| 普格县| 同德县| 梁山县| 罗城| 含山县| 岐山县| 六安市| 襄樊市| 西林县| 平山县| 三门峡市| 正定县| 阳曲县| 滁州市| 遵义市| 古浪县| 广宗县| 虞城县|