PCIe基礎知識之Linux內核中PCIe子系統的架構

5.1 先驗知識

驅動模型:Linux建立了一個統一的設備模型,分別采用總線、設備、驅動三者進行抽象,其中設備和驅動均掛載在總線上面,當有新的設備注冊或者新的驅動注冊的時候,總線會進行匹配操作(match函數),當發現驅動和設備能進行匹配的時候,就會執行probe函數的操作

對于PCI:PCI設備,PCI總線和PC驅動的創建,PCI設備和PCI驅動掛接在PCI總線上面

對于PCIe的控制器,遵循設備,總線,驅動的匹配模型,這里的總線是由虛擬總線platform總線來替代,相應的設備和驅動分別為platform_device和platform_driver;

5.2 PCIe驅動程序的實現

5.2.1 Linux PCI的初始化過程

Linux PCI初始化的主要工作是遍歷當前處理器系統中的所有PCI總線樹,并且初始化PCI總線樹上面的全部設備,包括PCI橋和PCI Agent設備。在Linux系統中,多次使用DFS算法對PCI總線樹進行遍歷查找,并分配相關的PCI總線號與PCI總線地址資源。

*參考博客:*【原創】Linux PCI驅動框架分析(三) - LoyenWang - 博客園

1.設備樹

設備樹用于描述硬件的信息,包含節點各類屬性,在dts文件中定義,最終編譯為dtb文件加載到內存中

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

根據device_node節點,創建platform_device結構,并最終注冊進系統,這個也就是PCIe設備的創建過程。

2.probe流程

系統會根據dtb文件創建對應的platform_device并進行注冊;

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

看一下nwl_pcie_probe函數:

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

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

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

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

*devm_pci_alloc_host_bridge*:分配并且初始化一個基礎的pci_host_bridge結構

*nwl_pcie_parse_dt*:獲取DTS中的寄存器信息以及中斷信息,并且通過*irq_set_chained_handler_and_data*設置intx中斷號對應的中斷處理函數,該處理函數用于中斷的級聯;

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

*pci_parse_request_of_pci_ranges*:用于解析PCI總線的總線范圍和總線上的地址范圍,也就是CPU可以看到的地址區域

*nwl_pcie_init_irq_domain**mwl_pcie_enable_msi*與中斷級聯相關

pci_scan_root_bus_bridge:對總線上的設備進行*掃描枚舉*,(枚舉具體介紹:【原創】Linux PCI驅動框架分析(二) - LoyenWang - 博客園)bridge結構體中的pci_ops字段,用于指向PCI的讀寫操作函數集,當具體掃描到設備要讀寫的配置空間的時候,調用的就是這個函數,由具體的Controller驅動實現

3.中斷處理

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

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

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

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

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

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

再來看一下nwl_pcie_enable_msi函數:

在該函數中主要完成的工作就是設置級聯的中斷處理函數,級聯的中斷處理函數中最終回去調用具體設備的中斷處理函數;

總結,作為兩種不同的中斷處理方式,套路都是一樣的,均為創建irq_chip中斷控制器,為該中斷控制器添加irq_domain,具體設備的中斷響應流程如下:

1)設備連接在PCI總線上面,觸發中斷的時候,通過PCIe控制器充當的中斷控制器路由到上一級控制器,最終路由到CPU;

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

3)在級聯的中斷處理函數中,調用chained_irq_enter進入中斷級聯處理;

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

5)調用generic_handle_irq觸發具體的PCIe設備的中斷處理函數執行;

6)調用chained_irq_exit退出中斷級聯的處理

4.總結

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

PCI驅動程序實現關鍵數據結構

PCI設備有三種地址空間:

PCI的I/O空間

PCI的存儲空間

PCI的配置空間。

CPU可以訪問PCI設備上的所有地址空間,其中I/O空間和存儲空間提供給設備驅動程序使用,而配置空間則由Linux內核中的PCI初始化代碼使用。內核在啟動時負責對所有的PCI設備進行初始化,配置好所有的PCI設備,包括中斷號以及I/O基址,并在文件 /proc/pci中列出所有找到的PCI設備,以及這些設備的參數和屬性

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88247.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88247.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88247.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2.2 TF-A在ARM生態系統中的角色

目錄2.2.1 作為ARM安全架構的參考實現2.2.2 與ARM處理器內核的協同關系2.2.3 在啟動鏈中的核心地位2.2.4 與上下游軟件的關系與底層固件的協作與上層軟件的接口2.2.5 在ARM生態系統中的標準化作用2.2.6 典型應用場景2.2.1 作為ARM安全架構的參考實現 TF-A(Trusted …

Chrome 開發者警告:`DELETE err_empty_response` 是什么?jQuery AJAX 如何應對?

在Web開發的世界里,我們時常會遇到各種各樣的錯誤信息,它們像一個個謎語,等待我們去破解。今天我們要聊的這個錯誤——DELETE err_empty_response,尤其是在使用 jQuery 的 $.ajax 發送 DELETE 請求時遇到,確實讓人頭疼。它意味著瀏覽器嘗試刪除某個資源,卻收到了一個空蕩…

python作業 1

1.技術面試題 (1)TCP與UDP的區別是什么? 答: TCP建立通信前有三次握手,結束通信后有四次揮手,數據傳輸的可靠性高但效率較低;UDP不需要三次握手就可傳輸數據,數據傳輸完成后也不需要…

centos7 java多版本切換

文章目錄前言一、卸載原來的jdk二、下載jdk三、解壓jdk三、配置環境變量四、切換JAVA環境變量前言 本來是為了安裝jenkins,安裝了對應的java,node,maven,git等環境,然后運行jenkins時候下載插件總是報錯,我下載的jenkins是 2.346.1 版本&…

用Python和OpenCV從零搭建一個完整的雙目視覺系統(四)

本系列文章旨在系統性地闡述如何利用 Python 與 OpenCV 庫,從零開始構建一個完整的雙目立體視覺系統。 本項目github地址:https://github.com/present-cjn/stereo-vision-python.git 在上一篇文章中,我們完成了相機標定這一最關鍵的基礎步驟…

STM32-中斷

中斷分為兩路:12345用于產生中斷;678產生事件外設為NVIC設計流程:使能外設中斷設置中斷優先級分組初始化結構體編寫中斷服務函數初始化結構體:typedef struct {uint8_t NVIC_IRQChannel; 指定要使能或禁用的中斷通道例如: TIM3_I…

Shader面試題100道之(61-80)

Shader面試題(第61-80題) 以下是第61到第80道Shader相關的面試題及答案: 61. 什么是UV展開?它在Shader中有什么作用? UV展開是將3D模型表面映射到2D紋理空間的過程,用于定義紋理如何貼合模型。在Shader中&a…

C#基礎:Winform桌面開發中窗體之間的數據傳遞

1.主窗體using System; using System.Windows.Forms;public partial class MainForm : Form {public MainForm(){InitializeComponent();}// 打開二級窗體private void btnOpenSecondaryForm_Click(object sender, EventArgs e){// 創建二級窗體并訂閱事件SecondaryForm second…

工程改Mvvm

導入CommunityToolKit vs2017只能導入7 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input;namespace WpfApp1.vi…

【HarmonyOS Next之旅】DevEco Studio使用指南(四十二) -> 動態修改編譯配置

目錄 1 -> 通過hook以及插件上下文實現動態配置 2 -> 在hvigorfile.ts中通過overrides關鍵字導出動態配置 3 -> 通過hook以及插件上下文動態配置構建配置 3.1 -> 修改每個hvigorNode中的build-profile.json5 3.2 -> 修改module.json5中的配置信息 3.3 -&g…

Android View事件分發機制詳解

Android 的 View 事件分發機制是處理用戶觸摸(Touch)事件的核心流程,它決定了觸摸事件如何從系統傳遞到具體的 View 并被消費。理解這個機制對于處理復雜的觸摸交互、解決滑動沖突至關重要。 核心思想:責任鏈模式 事件分發遵循一個…

【CMake】自定義package并通過find_package找到

在一些場景下我們需要編寫一些庫,并希望其他程序可以找到這些庫并引用。 CMake采用package這個概念來解決這個問題。 關于CMake的find_package文章有很多,但這些文章的內容大多不直觀講了一堆講不到點子上,讓人看了一頭霧水。因此我想通過本文…

【MATLAB例程】AOA與TDOA混合定位例程,適用于二維環境、3個錨點的定位|附代碼下載鏈接

本 MATLAB 程序實現了基于 Angle of Arrival (AOA) 與 Time Difference of Arrival (TDOA) 的二維定位方法,通過自適應融合與最小二乘優化,實現對未知目標的高精度估計。本例中固定使用了 3 個基站(錨點),算法框架支持…

磐維數據庫panweidb集中式集群配置VIP【添加、刪除和修改】

0 說明 panweidb集中式集群為了防止主備切換后應用連接無法切換到新主庫,需要配置vip,應用可以只通過該ip與數據庫連接,不用感知數據庫在哪個節點上。 panweidb中配置 VIP主要依賴 CM 組件的 VIP 仲裁功能,通過回調腳本在主備切換…

python的保險業務管理與數據分析系統

前端開發框架:vue.js 數據庫 mysql 版本不限 后端語言框架支持: 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 數據庫工具:Navicat/SQLyog等都可以 保險行業…

R語言如何接入實時行情接口

目錄 1. 安裝必要的R包 2. 導入庫 3. 連接WebSocket 4. 處理連接成功后的操作 5. 處理接收到的消息 6. 處理連接關閉和錯誤 7. 發送心跳數據 8. 自動重連機制 9. 啟動連接和重連 總結 在數據分析和金融研究中,實時行情數據的獲取至關重要,但市…

Redis數據安全性分析

Redis高可用與數據安全機制深度解析前置知識:Redis基礎安裝與使用(主從復制、哨兵集群、Cluster集群搭建)一、Redis性能壓測工具 工具名稱:redis-benchmark核心作用:快速基準測試Redis性能使用場景:評估不同…

差分和前綴和

差分和前綴和的原理、用法和區別。前綴和(Prefix Sum)核心思想:預處理數組的前綴和,快速回答「區間和查詢」 適用場景:數組靜態(更新少、查詢多),需要頻繁計算任意區間的和1. 定義與…

C++并發編程-12. 用內存順序實現內存模型

前情回顧 前文我們介紹了六種內存順序,以及三種內存模型,本文通過代碼示例講解六種內存順序使用方法,并實現相應的內存模型。全局一致性模型同步模型(獲取和釋放)松散模型memory_order_seq_cst memory_order_seq_cst代表全局一致性順序&#…

AI測試革命:從智能缺陷檢測到自愈式測試框架的工業實踐

AI測試革命:從智能缺陷檢測到自愈式測試框架的工業實踐 希望對大家有用! 目錄AI測試革命:從智能缺陷檢測到自愈式測試框架的工業實踐希望對大家有用!一、傳統測試之殤:工業質檢的切膚之痛二、智能缺陷檢測系統架構1. …