【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…

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

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

Redis命令-String命令

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

小米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 是一种国际标准的日期时间表示法,例如&…

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

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

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

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

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

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

景联文科技高质量大模型训练数据汇总!

3月25日,2024年中国发展高层论坛年会上,国家数据局局长刘烈宏在“释放数据要素价值,助力可持续发展”的演讲中表示,中国10亿参数规模以上的大模型数量已超100个。 当前,国内AI大模型发展仍面临诸多困境。其中&#xff…

spring安全框架之Shiro

Shiro 一、现存问题 1.1 现存问题 认证(登录):认证操作流程都差不多,但是每次都需要手动的基于业务代码去实现,很麻烦! 授权:如果权限控制粒度比较粗,可以自身去实现&#xff0c…

VBA高级应用30例应用2:MouseMove鼠标左键按下并移动鼠标事件

《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以…

实测梳理一下kafka分区分组的作用

清空topickafka-topics.sh --bootstrap-server localhost:9092 --delete --topic second创建分区kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 3 --topic second发kafka-console-producer.sh --bootstrap-server localhos…

OCP NVME SSD规范解读-15.DSSD set feature功能要求-2

启用IEEE1667隔离区(Enable IEEE1667 Silo):特征标识符C4h允许开启符合IEEE1667标准的安全存储区功能,以实现数据的隔离和安全存储。 4.15.9章节描述了启用IEEE1667 Silo(通过Feature Identifier C4h标识的Set Feature命令)的相关…

一个基于.NET Core构建的简单、跨平台、模块化的商城系统

前言 今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统:Module Shop。 商城后台管理端功能 商品:分类、品牌、单位、选项(销售属性)、属性、属性模…

面向对象语言的全局认识

学习一门语言,就像在一座陌生的城市旅游,第一步应该找一张这座城市的地图,对这座城市有个整体的了解,然后寻找自己的目的地,不至于迷失方向。 一句话:先整体,再局部。 一.从面向过程到面向对象…