【C语言】Infiniband驱动pci_pcie_cap

一、注释

//include\linux\compat-2.6.h
#define LINUX_BACKPORT(__sym) backport_ ##__sym//include\linux\compat-2.6.33.h
#define pci_pcie_cap LINUX_BACKPORT(pci_pcie_cap)/*** pci_pcie_cap - 获取保存的PCIe能力偏移* @dev: PCI 设备** PCIe能力偏移在PCI设备初始化时计算并保存在数据结构中。此函数返回* 保存的PCIe能力偏移。使用这个而不是pci_find_capability()可以减少* 在PCI配置空间中不必要的搜索。如果您出于某些原因需要从原始设备计算* PCIe能力偏移,请使用pci_find_capability()来代替。*/
static inline int pci_pcie_cap(struct pci_dev *dev)
{return pci_find_capability(dev, PCI_CAP_ID_EXP);
}

二、讲解

在这段代码中,定义了一个宏`LINUX_BACKPORT`以便为符号添加前缀`backport_`,用于处理向后兼容性问题,这样内核较旧版本中不存在的功能可以通过额外的代码补丁或加工来实现。
在`pci_pcie_cap`的定义中,实际上使用了`LINUX_BACKPORT`宏来后缀该函数,因此在不同版本的内核头文件中可能会出现不同的宏定义。
注释中的函数`pci_pcie_cap`对应于一个内联函数,它接受一个指向PCI设备结构的指针,返回PCIe能力结构在PCI配置空间中的偏移。该偏移在设备初始化时计算并保存,因此直接获取保存值比每次都在配置空间中搜索要高效得多。不过,如果需要直接从设备计算这个偏移,应该使用`pci_find_capability`函数来获取。
pci_find_capability(dev, PCI_CAP_ID_EXP)是一个标准函数,用于搜索指定PCI设备的配置空间以找到具有指定PCI能力ID(在这里是PCIe能力)的能力列表条目的偏移。在这个语境中,PCI_CAP_ID_EXP是PCI Express能力的ID代码。

pci_find_capability 是一个函数,它用于从指定的 PCI 设备的配置空间中读取信息。PCI 配置空间是一块特殊的内存区域,用于存储有关 PCI 设备的关键信息,包括设备的能力列表。能力列表中的每一项都代表该设备支持的不同的PCI功能或标准。
PCI 配置空间不是常规的RAM内存,它是通过特定的PCI配置地址空间访问的,该地址空间由主机系统的PCI控制器提供管理。无论是从设备取还是从内存取,并不是针对RAM的操作,而是针对设备的配置空间的操作。
因此,可以说 pci_find_capability 通过 PCI 子系统提供的接口从内存映射的 PCI 配置空间中提取信息,而不是直接与物理设备进行通讯。
当驱动程序调用 pci_find_capability 函数时,它会指定想要搜索的PCI能力ID。内核会管理从PCI设备的配置空间读取数据所需的操作,并返回找到的能力结构的偏移地址,如果未找到则返回 0。通过这种方式,驱动程序可以不必直接处理配置空间的底层细节,从而简化了与硬件的交互。 

这段代码首先定义了一个宏 LINUX_BACKPORT,目的是为了创建一个新的符号名称,该名称是通过在原始符号名前添加 backport_ 前缀来生成的。这通常用于内核回移(backporting)过程,使得一些在新版内核中引入的功能可以在旧版内核中使用。
第二部分是 #define pci_pcie_cap LINUX_BACKPORT(pci_pcie_cap) 定义,这一行代码实际上将 pci_pcie_cap 符号重命名为 backport_pci_pcie_cap,意在使用已经传递过来的 pci_pcie_cap 函数,但通过新名称避免潜在的名称冲突。
最后是 pci_pcie_cap 函数的定义。`pci_pcie_cap` 函数的作用是获取保存在PCI设备数据结构中的PCIe(PCI Express)功能的偏移量。PCIe功能偏移量是在PCI设备初始化时计算并保存的。这个函数返回之前保存的偏移量。与每次调用时都从PCI配置空间搜索的 pci_find_capability() 函数相比,使用此函数会减少不必要的搜索操作,因此提高了效率。然而,如果出于某些原因需要直接从原始设备计算PCIe功能偏移量,那么应当使用 pci_find_capability() 函数。
这段代码的注释中文翻译如下:

/*** pci_pcie_cap - 获取保存的PCIe功能偏移量* @dev: PCI设备** PCIe功能偏移量在PCI设备初始化时计算* 并保存在数据结构中。此函数返回已保存* 的PCIe功能偏移量。使用这个代替pci_find_capability()* 减少了在PCI配置空间中不必要的搜索。如果你* 出于某些原因需要从原始设备计算PCIe功能偏移量,* 请使用pci_find_capability()。*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/775665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实例、构造函数、原型、原型对象、prototype、__proto__、原型链……

学习原型链和原型对象,不需要说太多话,只需要给你看看几张图,你自然就懂了。 prototype 表示原型对象__proto__ 表示原型 实例、构造函数和原型对象 以 error 举例 图中的 error 表示 axios 抛出的一个错误对象(实例&#xff0…

基于springboot的车辆充电桩管理系统

开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven…

【Postman如何进行接口测试简单详细操作实例】

1、下载Postman postman下载地址:Download Postman | Get Started for Free 2、安装Postman (1)双击下载好的postman-setup.exe文件,进行安装postman工具 (2)安装完成后,在桌面找到并打开postman软件,输入邮箱和密码进行登录&a…

【前端面试3+1】03深拷贝浅拷贝、let和var、css盒模型、【有效括号】

一、深拷贝浅拷贝 深拷贝和浅拷贝都是用于复制对象或数组的概念,但它们之间有着重要的区别: 1. 浅拷贝: 浅拷贝是指在拷贝对象或数组时,只会复制一层对象的属性或元素,而不会递归地复制嵌套的对象或数组。因此&#xf…

使用jQuery的基本方法

1.jQuery基本选择器有哪些,语法 jQuery(选择器).action()元素选择器 $(p);iD选择器 $("#myElement")类选择器 $(".myClass") 属性选择器 $(a[href^"https://"]2.如何操作类属性 //添加类名 a.classList.add("类1", &…

只用一部手机,为你的吉利车机安装第三方软件(支持大部分车型)

💡 文中使用的方法为DNS重定向,需要你具备一定的动手能力,否则将无法达到最终目的。 💡 阅读本文,视为你有一定电脑基础,难以理解时,请寻求百度帮助,百度就是最好的老师!…

java实现MP4视频压缩

要在Java中实现MP4视频压缩,您可以使用一些第三方库,比如ffmpeg或Xuggler等。下面是使用ffmpeg库进行MP4视频压缩的示例代码: java import java.io.BufferedReader; import java.io.InputStreamReader; public class MP4Compressor { public static void main(String[] args)…

Redis命令-String命令

4.3 Redis命令-String命令 String类型,也就是字符串类型,是Redis中最简单的存储类型。 其value是字符串,不过根据字符串的格式不同,又可以分为3类: string:普通字符串int:整数类型&#xff0…

【Python操作基础】——序列

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一|统计学|干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项,参与研究经费10w、40w级横向 文…

小米HyperOS 澎湃os机型免答题 免社区等级 秒接bl锁操作步骤解析

小米机型解锁bl 绕过社区等级5才可以解锁的限制的教程_没有五级社区怎么解锁bl-CSDN博客 上次解析了小米有些出厂不是HyperOS系统的机型绕社区等级接bl锁的操作。目前有更新出厂为HyperOS系统的机型免社区登录等级限制 免答题解锁bl的操作。而且有网友在米14 平板6sp k70这些新…

【MySQL】5.2MySQL高级语句与sql语句

模板 test、class、class0 mysql> select * from test; -------------------------------- | idcard | name | age | hobbid | -------------------------------- | 01 | lizi | 18 | guangjie | | 02 | monor | 22 | zhaijia | | 03 | sansan | …

【Java程序设计】【C00388】基于(JavaWeb)Springboot的校园竞赛管理系统(有论文)

Springboot的校园竞赛管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 博主介绍:java高级开发,从事互联网行业六年,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,博客…

Fastjson配置消息转换器(时间格式问题)

问题: 我们可以看见,日期的格式有点问题。 由于ArticleListVO类的createTime成员变量是Date类型,默认是由java的Jackson来处理,使用 ISO-8601 规范来处理日期时间格式。ISO-8601 是一种国际标准的日期时间表示法,例如&…

PyTorch-----torch.flatten()函数

torch.flatten() 是 PyTorch 中的一个函数,用于将输入张量展平为一维张量。它的语法如下: torch.flatten(input, start_dim0, end_dim-1)input:要展平的输入张量。start_dim(可选):指定从哪个维度开始展平…

pt-archiver的实践分享,及为何要用 ob-archiver 归档数据的探讨

作者简介:肖杨,软件开发工程师 在数据密集型业务场景中,数据管理策略是否有效至关重要,它直接关系到系统性能与存储效率的提升。数据归档作为该策略的关键环节,不仅有助于优化数据库性能,还能有效降低存储成…

HarmonyOS实战开发-为应用添加运行时权限

介绍 通过AbilityAccessCtrl动态向用户申请“允许不同设备间的数据交换”的权限,使用设备管理实例获取周边不可信设备列表。 说明: 查询周边不可信设备之前,请确保本设备与周边设备未进行配对。如果已配对,则恢复出厂设置之后重新…

软考高级架构师:ESB 企业服务总线概念和例题

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

基于Python的高考志愿辅助填报系统

基于Python的高考志愿辅助填报系统是一个利用数据分析和机器学习技术帮助高考生进行志愿填报决策的工具。该系统可以根据考生的分数、兴趣、专业偏好、历史录取数据等因素,为考生提供科学合理的志愿填报建议。以下是设计这样一个系统的步骤和要点。 ### 1. 数据收集…

基于Python的旅游网站数据爬虫分析

基于Python的旅游网站数据爬虫分析是一种利用Python编程语言的强大功能和丰富的库资源来自动化地从旅游相关网站抓取数据,并对这些数据进行分析和处理的技术。这种方法可以帮助用户更高效地获取旅游信息,为旅游决策提供数据支持,同时也为旅游…

大模型的 Token 使用详解:限制与注意事项

在大型语言模型中,Token 是指文本处理的基本单位,通常是单词、短语或句子的一部分。Tokenization 是将输入文本分割成一系列 Token 的过程,它是自然语言处理(NLP)任务中的关键步骤。了解 Token 的使用限制和注意事项对…