一、注释
//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()。*/