IOMMU Client設備DMA配置過程分析(九)

1.設備樹

cp0_pcie0是一個PCIe RC控制器,使用SMMU將PCIe設備的IOVA轉換成物理地址,使用iommu-map-maskiommu-map定義PCIe設備使用的Stream ID。設備樹定義如下所示。

[arch/arm64/boot/dts/marvell/armada-ap80x.dtsi]
smmu: iommu@100000 {compatible = "marvell,ap806-smmu-500", "arm,mmu-500";reg = <0x100000 0x100000>;dma-coherent;#iommu-cells = <1>;#global-interrupts = <1>;interrupts = <GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>;status = "disabled";
};[arch/arm64/boot/dts/marvell]
&cp0_pcie0 {// iommu-map四個元素分別為BDF、引用的SMMUphandle_node、Base StreamID、數量iommu-map =<0x0   &smmu 0x480 0x20>,<0x100 &smmu 0x4a0 0x20>,<0x200 &smmu 0x4c0 0x20>;iommu-map-mask = <0x031f>;
};

2.dma_configure

設備總系類型數據結構bus_type中定義了dma_configure和dma_cleanup兩個回調函數,前者用于建立該總線上設備的DMA配置,后者用于清理該總線上設備的DMA配置。

[include/linux/device/bus.h]
struct bus_type {......int (*dma_configure)(struct device *dev);void (*dma_cleanup)(struct device *dev);......
};

當設備或者驅動初始化的時候都會調用到really_probe函數。若設備所屬總線定義了dma_configure函數,則會調用該回調函數建立設備的DMA配置。

[drivers/pci/pci-driver.c]
const struct bus_type pci_bus_type = {.name              = "pci",.match             = pci_bus_match,.uevent            = pci_uevent,.probe             = pci_device_probe,.remove            = pci_device_remove,.shutdown          = pci_device_shutdown,.dev_groups        = pci_dev_groups,.bus_groups        = pci_bus_groups,.drv_groups        = pci_drv_groups,.pm                = PCI_PM_OPS_PTR,.num_vf            = pci_bus_num_vf,.dma_configure     = pci_dma_configure,.dma_cleanup       = pci_dma_cleanup,
};
[drivers/base/platform.c]
const struct bus_type platform_bus_type = {.name              = "platform",.dev_groups        = platform_dev_groups,.match             = platform_match,.uevent            = platform_uevent,.probe             = platform_probe,.remove            = platform_remove,.shutdown          = platform_shutdown,.dma_configure     = platform_dma_configure,.dma_cleanup       = platform_dma_cleanup,.pm                = &platform_dev_pm_ops,
};

3. DMA配置過程

下面以PCIe設備為例,介紹PCIe設備初始化的時候,DMA配置流程。具體工作如下:

  1. platform_bus_type定義了pci_dma_configure函數,因此在really_probe函數里面會調用該函數設置DMA相關配置。
  2. 首先解析"dma-range"屬性,"dma-range"屬性定義了PCI地址到CPU地址的轉換關系(inbound memory)。
  3. 使能ACS。
  4. 解析"iommu-map""iommu-map-mask"屬性,然后將PCIe設備的BDF轉換成對應的StreamID。
  5. 調用SMMU驅動提供的arm_smmu_of_xlate函數,將轉換后的StreamID保存到iommu_fwspec數據結構中。
  6. 調用iommu_probe_device初始化設備,這部分內容在ARM SMMUv3控制器注冊過程分析(八)介紹過,這里不多贅述。

DMA配置過程

of_map_id函數首先解析"iommu-map""iommu-map-mask"屬性,然后將設備的BDF轉換成StreamID。流程如代碼所示。

int of_map_id(struct device_node *np, u32 id,const char *map_name, const char *map_mask_name,struct device_node **target, u32 *id_out)
{// 讀取"iommu-map"屬性map = of_get_property(np, map_name, &map_len);....../* The default is to select all bits. */map_mask = 0xffffffff;// 讀取"iommu-map-mask"屬性if (map_mask_name)of_property_read_u32(np, map_mask_name, &map_mask);// iommu-map-mask & BDF,通常情況下,只屏蔽function三位masked_id = map_mask & id;// 遍歷所有iommu-map定義的數據for ( ; map_len > 0; map_len -= 4 * sizeof(*map), map += 4) {struct device_node *phandle_node;u32 id_base = be32_to_cpup(map + 0);  // 解析BDFu32 phandle = be32_to_cpup(map + 1);  // 解析引用的SMMU的phandle_nodeu32 out_base = be32_to_cpup(map + 2); // Base StreamIDu32 id_len = be32_to_cpup(map + 3);   // 長度......// *id_ou = iommu-map-mask & BDF - BDF + Base StreamIDif (id_out)*id_out = masked_id - id_base + out_base;return 0;}/* Bypasses translation */if (id_out)*id_out = id;return 0;
}

參考資料

  1. linux 6.12.35 source code.

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

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

相關文章

使用node-cron實現Node.js定時任務

1. 簡介 node-cron 是一個輕量級的Node.js庫&#xff0c;用于在指定時間或間隔執行任務。它是Unix系統cron工具的JavaScript實現&#xff0c;適用于需要定時執行腳本的場景&#xff08;如數據備份、定期爬蟲等&#xff09;。 2. 安裝 npm install node-cron # 或 yarn add node…

前綴和-525.連續數組-力扣(LeetCode)

一、題目解析1、只包含0、1的二進制數組2、找到含有相同數量的0和1&#xff0c;并返回其子數組長度二、算法原理解法1&#xff1a;暴力枚舉 時間復雜度O(N^2)解法2&#xff1a;前綴和哈希表對于統計子數組中的0和1的數量有點困難&#xff0c;我們可以將其轉化一下轉化&#xff…

汽車電子控制系統開發的整體安全理念

1. 摘要在汽車制造商和一級供應商避免責任的背景下&#xff0c;公認的技術規則作為法律要求的標準具有重要的實際意義。道路車輛電子控制單元的安全性目前主要通過 ISO 26262 的要求和流程來保障。特別是隨著道路交通自動化程度的不斷提高以及現代車輛隨之而來的復雜性&#xf…

IDEA重新安裝常用設置

IDEA重新安裝常用設置 展示固定導航欄 項目構建和運行操作委托給maven 參考&#xff1a;IDEA build委托到Maven build

微服務的編程測評系統9-競賽新增-競賽編輯

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄前言1. 競賽新增1.1 競賽基本信息增加-后端開發1.2 競賽新增題目-后端1.3 競賽基本信息-前端1.4 競賽新增題目-前端2. 競賽編輯2.1 競賽詳情-后端2.2 競賽詳情-前端2…

《零基礎入門AI:線性回歸進階(梯度下降算法詳解)》

在上一篇博客中&#xff0c;我們學習了線性回歸的基本概念、損失函數&#xff08;如MSE&#xff09;以及最小二乘法。最小二乘法通過求解解析解&#xff08;直接計算出最優參數&#xff09;的方式得到線性回歸模型&#xff0c;但它有一個明顯的局限&#xff1a;當特征數量很多時…

基于C語言實現的KV存儲引擎(一)

基于C語言實現的KV存儲引擎項目簡介整體架構網絡模塊的實現recatorproactorNtyco項目簡介 本文主要是基于 C 語言來實現一個簡單的 KV 存儲架構&#xff0c;目的就是將網絡模塊跟實際開發結合起來。 首先我們知道對于數據的存儲可以分為兩種方式&#xff0c;一種是在內存中進…

c++和python聯合編程示例

安裝 C與 Python 綁定工具 pip install pybind11這其實相當于使用 python 安裝了一個 c的庫 pybind11,這個庫只由頭文件構成&#xff0c; 支持基礎數據類型傳遞以及 python 的 numpy 和 c的 eigen 庫之間的自動轉換。 編寫 CMakeList.txt cmake_minimum_required(VERSION 3.14)…

【OD機試題解法筆記】貪心歌手

題目描述 一個歌手準備從A城去B城參加演出。 按照合同&#xff0c;他必須在 T 天內趕到歌手途經 N 座城市歌手不能往回走每兩座城市之間需要的天數都可以提前獲知。歌手在每座城市都可以在路邊賣唱賺錢。 經過調研&#xff0c;歌手提前獲知了每座城市賣唱的收入預期&#xff1a…

AI: 告別過時信息, 用RAG和一份PDF 為LLM打造一個隨需更新的“外腦”

嘿&#xff0c;各位技術同學&#xff01;今天&#xff0c;我們來聊一個大家在使用大語言模型&#xff08;LLM&#xff09;時都會遇到的痛點&#xff1a;知識過時。 無論是像我一樣&#xff0c;用 Gemini Pro 學習日新月異的以太坊&#xff0c;還是希望它能精確掌握某個特定工具…

深度學習(魚書)day08--誤差反向傳播(后三節)

深度學習&#xff08;魚書&#xff09;day08–誤差反向傳播&#xff08;后三節&#xff09;一、激活函數層的實現 這里&#xff0c;我們把構成神經網絡的層實現為一個類。先來實現激活函數的ReLU層和Sigmoid層。ReLU層 激活函數ReLU&#xff08;Rectified Linear Unit&#xff…

C# 中生成隨機數的常用方法

1. 使用 Random 類&#xff08;簡單場景&#xff09; 2. 使用 RandomNumberGenerator 類&#xff08;安全場景&#xff09; 3. 生成指定精度的隨機小數 C# 中生成隨機數的常用方法&#xff1a; 隨機數類型實現方式示例代碼特點與適用場景隨機整數&#xff08;無范圍&#xf…

Flink 算子鏈設計和源代碼實現

1、JobGraph &#xff08;JobManager&#xff09; JobGraph 生成時&#xff0c;通過 ChainingStrategy 連接算子&#xff0c;最終在 Task 中生成 ChainedDriver 鏈表。StreamingJobGraphGeneratorcreateJobGraph() 構建jobGrapch 包含 JobVertex setChaining() 構建算子鏈isCha…

對接八大應用渠道

背景最近公司想把游戲包上到各個渠道上&#xff0c;因此需要對接各種渠道&#xff0c;渠道如下&#xff0c;oppo、vivo、華為、小米、應用寶、taptap、榮耀、三星等應用渠道 主要就是對接登錄、支付接口&#xff08;后續不知道會不會有其他的&#xff09;&#x…

學習:入門uniapp Vue3組合式API版本(17)

42.打包發行微信小程序的上線全流程 域名 配置 發行 綁定手機號 上傳 提交后等待&#xff0c;上傳 43.打包H5并發布上線到unicloud的前端頁面托管 完善配置 unicloud 手機號實名信息不一致&#xff1a;請確保手機號的實名信息與開發者姓名、身份證號一致&#xff0c;請前往開…

SOLIDWORKS材料明細表設置,屬于自己的BOM表模板

上一期我們了解了如何在SOLIDWORKS工程圖中添加材料明細表?接下來&#xff0c;我們將進行對SOLIDWORKS材料明細表的設置、查看縮略圖、模板保存的深度講解。01 材料明細表設置菜單欄生成表格后左側菜單欄會顯示關于材料明細表的相關設置信息。我們先了解一下菜單欄設置詳情&am…

全棧:Maven的作用是什么?本地倉庫,私服還有中央倉庫的區別?Maven和pom.xml配置文件的關系是什么?

Maven和pom.xml配置文件的關系是什么&#xff1a; Maven是一個構建工具和依賴管理工具&#xff0c;而pom.xml&#xff08;Project Object Model&#xff09;是Maven的核心配置文件。 SSM 框架的項目不一定是 Maven 項目&#xff0c;但推薦使用 Maven進行管理。 SSM 框架的項目可…

超越 ChatGPT:智能體崛起,開啟全自主 AI 時代

引言 短短三年,生成式 AI 已從對話助手跨越到能自主規劃并完成任務的“智能體(Agentic AI)”時代。這場演進不僅體現在模型規模的提升,更在于系統架構、交互范式與安全治理的全面革新。本文按時間線梳理關鍵階段與核心技術,為您呈現 AI 智能體革命的脈絡與未來趨勢。 1. …

一杯就夠:讓大腦瞬間在線、讓肌肉滿電的 “Kick-out Drink” 全解析

一杯就夠&#xff1a;讓大腦瞬間在線、讓肌肉滿電的 “Kick-out Drink” 全解析“每天清晨&#xff0c;當鬧鐘還在哀嚎&#xff0c;你舉杯一飲&#xff0c;睡意像被扔出擂臺——這&#xff0c;就是 Kick-out Drink 的全部浪漫。”清晨 30 分鐘后&#xff0c;250 mL 常溫水里溶解…

系統開機時自動執行指令

使用 systemd 創建一個服務單元可以讓系統開機時自動執行指令&#xff0c;假設需要執行的指令如下&#xff0c;運行可執行文件&#xff08;/home/demo/可執行文件&#xff09;&#xff0c;并輸入參數&#xff08;–input/home/config/demo.yaml&#xff09;&#xff1a; /home/…