【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()。
 */

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3+Vite+TS项目,配置ESlint和Prettier

创建vue3项目 实操过的有两种方式 1.vue脚手架2.vite(推荐,也是尤大大团队研发) 具体怎么新建一个vue3项目就不多讲了,可以按照官方文档来 创建后的文件目录长这样 多提一句,vite也会随着时间不断迭代,后…

方格分割(蓝桥杯)

文章目录 方格分割题目描述答案:509思路dfs 方格分割 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 6x6的方格,沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同。 如下就是三…

蓝桥杯基础练习汇总详细解析(三)——字母图形、01字符串、闰年判断(详细解题思路、代码实现、Python)

试题 基础练习 字母图形 提交此题 评测记录 资源限制 内存限制:256.0MB C/C时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 利用字母可以组成一些美丽的图形,下面给出了一个例子&#…

汇编语言学习记录 01

目录 VScode配置调试环境 Debug的主要命令 简单写个Hello World VScode配置调试环境 没有IDE真的蛮难受的 安装插件TASM/MASM 右键扩展设置,选择Assembler:MASM 右键调试即可开始 Debug的主要命令 R-查看和修改寄存器 D-查看内存单元 E-修改内…

SAP系统如何使用中间数据库与其它系统进行数据交互

SAP系统与外部系统之间进行数据交换和通信的接口方式有很多种,比如常用的接口技术有RFC、BAPI、ALE、Webservice、RESTful、中间数据库等等,不同的接口形式具有不同的特点和适用场景,可以根据具体需求选择合适的接口形式来实现系统间的数据交互。 前面文章中已介绍Webservi…

2024年腾讯云4核8G服务器多少钱一年?买1年送3个月

2024年腾讯云4核8G服务器租用优惠价格:轻量应用服务器4核8G12M带宽646元15个月,CVM云服务器S5实例优惠价格1437.24元买一年送3个月,腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图: 腾讯云4核8G服务器优惠价格 轻…

SOC子模块--Timer

作用 Timer 是片内集成的通用定时器,能够向系统提供定时中断,也可以通过外部时钟进行定时计数; 工作模式 重启计数模式: 当通道使能后计数器锁存加载计数寄存器的值,然后在系统时钟的驱动下递减计数。当计数到零时…

信息系统项目管理师——第9章项目范围管理(重要)

本章属于10大管理知识领域,选择、案例、论文都会考。选择题考大概3分,案例题考的比较多,需要重点记录,论文也考的比较多,建议作为第二梯队准备。 1.管理基础 1.1 产品范围和项目范围 产品范围:指某项产品、服务或成…

Yarn资源调度器

目录 写在前面一、yarn资源调度器1.1 Yarn基础架构1.2 Yarn工作机制1.3 作业提交全过程1.3.1 作业提交1.3.2 作业初始化1.3.3 任务分配1.3.4 任务运行1.3.5 进度和状态更新1.3.6 作业完成 1.4 Yarn调度器和调度算法1.4.1 先进先出调度器(FIFO)1.4.2 容量…

如何使用VS统计自己的代码量?

历经漫漫编程之路,此刻我们不妨回首细数,那已累积的无数行代码,它们如同一串串无声的脚印,记载着我们默默耕耘的点滴时光。每一行代码都是平凡努力的印记,见证了我们的执着与付出,也塑造了今天的我们。让这…

Pandas数据清洗

数据清洗是对一些没有用的数据进行处理的过程。很多数据集存在数据缺失、数据格式错误、数据错误或数据重复的情况,如果要使数据分析更加准确,就需要对这些没有用的数据进行处理。 这里使用的测试数据是clean-data.csv,如图3-10所示。这个表…

【二叉树】Leetcode 108. 将有序数组转换为二叉搜索树【简单】

将有序数组转换为二叉搜索树 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡二叉搜索树。 示例1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null…

npm淘宝镜像源更新

目录 前情提要: 背景: 镜像源更新: 清楚缓存: 直接切换镜像源: 补充: 错误解释: 解决方法: 前情提要: 2024 /1 /22 ,registry.npm.taobao.org淘宝镜像源的SSL…

基于java实现的高校二手交易平台

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

【uniapp】uniapp实现免密登录

文章目录 一、概要二、整体架构流程三、技术名词解释四 、技术细节1.存取token有效期?2.使用setStorageSync而不使用setStorage?3.使用onLaunch而不使用全局路由? 一、概要 打开一个网页或小程序的时候,我们有时候会自动进入主页…

【JAVA】多态

去完成某个行为,当不同的对象去完成时会产生出不同 的状 态。 比如吃东西 猫吃的是猫粮,狗吃的是狗粮 多态实现条件 1. 必须在继承体系下 2. 子类必须要对父类中方法进行重写 3. 通过父类的引用调用重写的方法 多态体现:在代码运行时…

【Spring Boot 源码学习】共享 MetadataReaderFactory 上下文初始化器

《Spring Boot 源码学习系列》 共享 MetadataReaderFactory 上下文初始化器 一、引言二、往期内容三、主要内容3.1 源码初识3.2 CachingMetadataReaderFactoryPostProcessor3.2.1 register 方法3.2.1 configureConfigurationClassPostProcessor 方法 3.3 ConfigurationClassPos…

uniApp使用XR-Frame创建3D场景(4)金属度和粗糙度

上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这一篇我们讲解xr-frame中关于mesh网格材质的金属度和粗糙度的设置。 1.先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"> <xr-node visible"{…

面试知识汇总——JVM内存模型

JVM内存模型 线程独占&#xff1a;栈和本地方法栈、程序计数器&#xff1b;线程共享的是堆和方法区 栈&#xff1a;又叫方法栈&#xff0c;线程私有&#xff0c;线程执行方法都会创建一个栈阵&#xff0c;用来储存局部变量表&#xff0c;调用方法执行入栈&#xff0c;方法返回…

AJAX(二):axios 和 fetch函数发送AJAX请求、同源策略、 jsonp、CORS

一、各种发送AJAX请求 jquery基于回调函数&#xff0c;axios基于promise 1.axios发送AJAX请求!!! axios (v1.5.0) - Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 Node.js 中。 | BootCDN - Bootstrap 中文网开源项目免费 CDN 加速服务 服务器&#xff1a; app.…