PCI 支持库¶
-
unsigned char pci_bus_max_busnr(struct pci_bus *bus)¶
返回给定总线的子总线的最大 PCI 总线号
参数
struct pci_bus *bus指向要搜索的 PCI 总线结构的指针
描述
给定一个 PCI 总线,返回集合中最高的 PCI 总线号,包括给定的 PCI 总线及其子 PCI 总线列表。
-
int pci_status_get_and_clear_errors(struct pci_dev *pdev)¶
返回并清除 PCI_STATUS 中的错误位
参数
struct pci_dev *pdevPCI 设备
描述
返回 PCI_STATUS 中设置的错误位并清除它们。
-
u8 pci_find_capability(struct pci_dev *dev, int cap)¶
查询设备的功能
参数
struct pci_dev *dev要查询的 PCI 设备
int cap功能代码
描述
判断设备是否支持给定的 PCI 功能。返回设备 PCI 配置空间中请求的功能结构的地址,如果设备不支持该功能,则返回 0。cap 的可能值包括
PCI_CAP_ID_PM电源管理PCI_CAP_ID_AGP加速图形端口PCI_CAP_ID_VPD重要产品数据PCI_CAP_ID_SLOTID插槽识别PCI_CAP_ID_MSI消息信号中断PCI_CAP_ID_CHSWPCompactPCI 热插拔PCI_CAP_ID_PCIXPCI-XPCI_CAP_ID_EXPPCI Express
-
u8 pci_bus_find_capability(struct pci_bus *bus, unsigned int devfn, int cap)¶
查询设备的功能
参数
struct pci_bus *bus要查询的 PCI 总线
unsigned int devfn要查询的 PCI 设备
int cap功能代码
描述
与 pci_find_capability() 类似,但适用于尚未设置 pci_dev 结构的 PCI 设备。
返回设备 PCI 配置空间中请求的功能结构的地址,如果设备不支持该功能,则返回 0。
-
u16 pci_find_next_ext_capability(struct pci_dev *dev, u16 start, int cap)¶
查找扩展功能
参数
struct pci_dev *dev要查询的 PCI 设备
u16 start开始查找的地址(0 表示从列表开头开始)
int cap功能代码
描述
返回设备 PCI 配置空间中下一个匹配的扩展功能结构的地址,如果设备不支持该功能,则返回 0。某些功能可能会出现多次,例如,供应商特定的功能,这提供了一种查找所有功能的方法。
-
u16 pci_find_ext_capability(struct pci_dev *dev, int cap)¶
查找扩展功能
参数
struct pci_dev *dev要查询的 PCI 设备
int cap功能代码
描述
返回设备 PCI 配置空间中请求的扩展功能结构的地址,如果设备不支持该功能,则返回 0。cap 的可能值包括
PCI_EXT_CAP_ID_ERR高级错误报告PCI_EXT_CAP_ID_VC虚拟通道PCI_EXT_CAP_ID_DSN设备序列号PCI_EXT_CAP_ID_PWR功率预算
-
u64 pci_get_dsn(struct pci_dev *dev)¶
读取并返回 8 字节设备序列号
参数
struct pci_dev *dev要查询的 PCI 设备
描述
查找 PCI_EXT_CAP_ID_DSN 并读取 8 字节的设备序列号。
返回 DSN,如果该功能不存在,则返回零。
-
u8 pci_find_next_ht_capability(struct pci_dev *dev, u8 pos, int ht_cap)¶
查询设备的 HyperTransport 功能
参数
struct pci_dev *dev要查询的 PCI 设备
u8 pos继续搜索的位置
int ht_capHyperTransport 功能代码
描述
与 pci_find_ht_capability() 结合使用,以搜索与 ht_cap 匹配的所有功能。pos 应该始终是从 pci_find_ht_capability() 返回的值。
注意:为了 100% 避免损坏的 PCI 设备,调用者应采取措施避免无限循环。
-
u8 pci_find_ht_capability(struct pci_dev *dev, int ht_cap)¶
查询设备的 HyperTransport 功能
参数
struct pci_dev *dev要查询的 PCI 设备
int ht_capHyperTransport 功能代码
描述
判断设备是否支持给定的 HyperTransport 功能。返回设备 PCI 配置空间中的地址,如果设备不支持请求的功能,则返回 0。该地址指向 PCI 功能,类型为 PCI_CAP_ID_HT,它具有与 ht_cap 匹配的 HyperTransport 功能。
-
u16 pci_find_vsec_capability(struct pci_dev *dev, u16 vendor, int cap)¶
查找供应商特定的扩展功能
参数
struct pci_dev *dev要查询的 PCI 设备
u16 vendor定义功能的供应商 ID
int cap供应商特定的功能 ID
描述
如果 dev 具有供应商 ID vendor,则搜索 VSEC ID 为 cap 的 VSEC 功能。如果找到,则返回配置空间中的功能偏移量;否则返回 0。
-
u16 pci_find_dvsec_capability(struct pci_dev *dev, u16 vendor, u16 dvsec)¶
查找供应商的 DVSEC
参数
struct pci_dev *dev要查询的 PCI 设备
u16 vendor要匹配 DVSEC 的供应商 ID
u16 dvsec指定的供应商特定功能 ID
描述
如果 DVSEC 具有供应商 ID vendor 和 DVSEC ID dvsec,则返回配置空间中的功能偏移量;否则返回 0。
-
struct resource *pci_find_parent_resource(const struct pci_dev *dev, struct resource *res)¶
返回给定区域的父总线的资源区域
参数
const struct pci_dev *dev包含要搜索的资源的 PCI 设备结构
struct resource *res正在寻找父资源的子资源记录
描述
对于给定设备的给定资源区域,返回父总线的资源区域,该给定区域包含在该区域中。
-
struct resource *pci_find_resource(struct pci_dev *dev, struct resource *res)¶
返回匹配的 PCI 设备资源
参数
struct pci_dev *dev要查询的 PCI 设备
struct resource *res要查找的资源
描述
遍历标准 PCI 资源 (BAR),并检查给定的资源是否部分或完全包含在其中任何一个资源中。在这种情况下,将返回匹配的资源,否则返回 NULL。
-
int pci_platform_power_transition(struct pci_dev *dev, pci_power_t state)¶
使用平台更改设备电源状态
参数
struct pci_dev *dev要处理的 PCI 设备。
pci_power_t state要将设备置于的状态。
-
int pci_set_power_state(struct pci_dev *dev, pci_power_t state)¶
设置 PCI 设备的电源状态
参数
struct pci_dev *dev要处理的 PCI 设备。
pci_power_t state要将设备置于的 PCI 电源状态(D0、D1、D2、D3hot)。
描述
使用平台固件和/或设备的 PCI PM 寄存器将设备转换为新的电源状态。
返回值: 如果请求的状态无效,则返回 -EINVAL。 如果设备不支持 PCI PM 或者其 PM 功能寄存器的版本错误,或者设备不支持请求的状态,则返回 -EIO。 如果转换为 D1 或 D2 但不支持 D1 和 D2,则返回 0。 如果设备已处于请求的状态,则返回 0。 如果转换为 D3 但不支持 D3,则返回 0。 如果设备的电源状态已成功更改,则返回 0。
-
int pci_save_state(struct pci_dev *dev)¶
在挂起之前保存设备的 PCI 配置空间
参数
struct pci_dev *dev我们要处理的 PCI 设备
-
void pci_restore_state(struct pci_dev *dev)¶
恢复 PCI 设备的已保存状态
参数
struct pci_dev *dev我们要处理的 PCI 设备
-
struct pci_saved_state *pci_store_saved_state(struct pci_dev *dev)¶
分配并返回一个不透明结构,其中包含设备已保存状态。
参数
struct pci_dev *dev我们要处理的 PCI 设备
描述
如果没有状态或错误,则返回 NULL。
-
int pci_load_saved_state(struct pci_dev *dev, struct pci_saved_state *state)¶
将提供的已保存状态重新加载到 struct pci_dev 中。
参数
struct pci_dev *dev我们要处理的 PCI 设备
struct pci_saved_state *state从
pci_store_saved_state()返回的已保存状态
-
int pci_load_and_free_saved_state(struct pci_dev *dev, struct pci_saved_state **state)¶
重新加载 state 指向的保存状态,并释放为其分配的内存。
参数
struct pci_dev *dev我们要处理的 PCI 设备
struct pci_saved_state **state指向从
pci_store_saved_state()返回的保存状态的指针
-
int pci_reenable_device(struct pci_dev *dev)¶
恢复已放弃的设备
参数
struct pci_dev *dev要恢复的 PCI 设备
注意
此函数是 pci_default_resume() 的后端,不应由普通代码调用,请编写正确的恢复处理程序并改用它。
-
int pci_enable_device_mem(struct pci_dev *dev)¶
初始化设备以用于内存空间
参数
struct pci_dev *dev要初始化的 PCI 设备
描述
在驱动程序使用设备之前初始化设备。请求底层代码启用内存资源。唤醒已挂起的设备。注意,此函数可能会失败。
-
int pci_enable_device(struct pci_dev *dev)¶
在驱动程序使用设备之前初始化设备。
参数
struct pci_dev *dev要初始化的 PCI 设备
描述
在驱动程序使用设备之前初始化设备。请求底层代码启用 I/O 和内存。唤醒已挂起的设备。注意,此函数可能会失败。
注意,如果我们重复调用此函数,实际上不会多次启用设备(我们只会增加计数)。
-
void pci_disable_device(struct pci_dev *dev)¶
在使用后禁用 PCI 设备
参数
struct pci_dev *dev要禁用的 PCI 设备
描述
向系统发出信号,表明系统不再使用 PCI 设备。这仅涉及禁用 PCI 总线主控,如果已激活。
注意,在所有 pci_enable_device() 的调用者都调用 pci_disable_device() 之前,我们实际上不会禁用该设备。
-
int pci_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state)¶
设置设备 dev 的重置状态
参数
struct pci_dev *devPCIe 设备重置
enum pcie_reset_state state要进入的重置状态
描述
设置设备的 PCI 重置状态。
-
bool pci_pme_capable(struct pci_dev *dev, pci_power_t state)¶
检查 PCI 设备生成 PME# 的能力
参数
struct pci_dev *dev要处理的 PCI 设备。
pci_power_t state设备将从中发出 PME# 的 PCI 状态。
-
void pci_pme_active(struct pci_dev *dev, bool enable)¶
启用或禁用 PCI 设备的 PME# 功能
参数
struct pci_dev *dev要处理的 PCI 设备。
bool enable“true”表示启用 PME# 生成;“false”表示禁用它。
描述
调用者必须先验证设备是否能够生成 PME#,然后才能使用等于“true”的 enable 调用此函数。
参数
struct pci_dev *pci_dev目标设备
pci_power_t state设备将从中发出唤醒事件的 PCI 状态
bool enable是否启用事件生成
描述
如果设置了 enable,请在为设备调用 __pci_enable_wake() 之前,检查该设备的 device_may_wakeup()。
-
int pci_wake_from_d3(struct pci_dev *dev, bool enable)¶
启用/禁用设备从 D3_hot 或 D3_cold 唤醒
参数
struct pci_dev *dev要准备的 PCI 设备
bool enableTrue 表示启用唤醒事件生成;false 表示禁用
描述
许多驱动程序希望设备从 D3_hot 或 D3_cold 唤醒系统,此函数允许它们干净地进行设置 - 由于 PCI PM 与 ACPI 排序约束,不应连续两次调用 pci_enable_wake() 以启用唤醒。
仅当设备不允许从睡眠状态唤醒系统,或者它无法从 D3_hot 和 D3_cold 生成 PME#,并且平台无法为其启用唤醒电源时,此函数才会返回错误代码。
-
int pci_prepare_to_sleep(struct pci_dev *dev)¶
准备 PCI 设备以进行全系统转换到睡眠状态
参数
struct pci_dev *dev要处理的设备。
描述
根据设备是否可以唤醒系统和/或是否可以由平台进行电源管理(PCI_D3hot 是默认值)来选择适合设备的电源状态,并将设备置于该状态。
-
int pci_back_from_sleep(struct pci_dev *dev)¶
在全系统转换到工作状态期间打开 PCI 设备
参数
struct pci_dev *dev要处理的设备。
描述
禁用设备的系统唤醒功能,并将其置于 D0。
-
bool pci_dev_run_wake(struct pci_dev *dev)¶
检查设备是否可以生成运行时唤醒事件。
参数
struct pci_dev *dev要检查的设备。
描述
如果设备本身能够生成唤醒事件(通过平台或使用本机 PCIe PME),或者设备支持 PME 并且其上游网桥之一可以生成唤醒事件,则返回 true。
-
pci_power_t pci_choose_state(struct pci_dev *dev, pm_message_t state)¶
选择 PCI 设备的电源状态。
参数
struct pci_dev *dev目标 PCI 设备。
pm_message_t state整个系统的目标状态。
描述
返回适用于 dev 和 state 的 PCI 电源状态。
-
void pci_d3cold_enable(struct pci_dev *dev)¶
为设备启用 D3cold
参数
struct pci_dev *dev要处理的 PCI 设备
描述
驱动程序可以使用此函数来启用其处理的设备的 D3cold。它还会相应地更新上游 PCI 网桥 PM 功能。
-
void pci_d3cold_disable(struct pci_dev *dev)¶
为设备禁用 D3cold
参数
struct pci_dev *dev要处理的 PCI 设备
描述
驱动程序可以使用此函数来禁用其处理的设备的 D3cold。它还会相应地更新上游 PCI 网桥 PM 功能。
-
u32 pci_rebar_get_possible_sizes(struct pci_dev *pdev, int bar)¶
获取 BAR 的可能大小
参数
struct pci_dev *pdevPCI 设备
int bar要查询的 BAR
描述
以规范中定义的位掩码形式获取可调整大小的 BAR 的可能大小(位 0=1MB,位 31=128TB)。如果 BAR 不可调整大小,则返回 0。
-
int pci_enable_atomic_ops_to_root(struct pci_dev *dev, u32 cap_mask)¶
启用到根端口的 AtomicOp 请求
参数
struct pci_dev *devPCI 设备
u32 cap_mask所需 AtomicOp 大小的掩码,包括以下一项或多项:PCI_EXP_DEVCAP2_ATOMIC_COMP32 PCI_EXP_DEVCAP2_ATOMIC_COMP64 PCI_EXP_DEVCAP2_ATOMIC_COMP128
描述
如果所有上游网桥都支持 AtomicOp 路由,所有上游端口都禁用了出口阻止,并且根端口支持请求的完成能力(32 位、64 位和/或 128 位 AtomicOp 完成),则返回 0,否则返回负值。
-
void pci_release_region(struct pci_dev *pdev, int bar)¶
释放 PCI BAR
参数
struct pci_dev *pdev其资源先前由
pci_request_region()保留的 PCI 设备int bar要释放的 BAR
描述
释放先前通过成功调用 pci_request_region() 保留的 PCI I/O 和内存资源。仅在 PCI 区域的所有使用都已停止后才调用此函数。
-
int pci_request_region(struct pci_dev *pdev, int bar, const char *name)¶
保留 PCI I/O 和内存资源
参数
struct pci_dev *pdev要保留其资源的 PCI 设备
int bar要保留的 BAR
const char *name请求资源的驱动程序的名称
返回
成功时返回 0,失败时返回负错误代码。
描述
将与 PCI 设备 pdev BAR bar 关联的 PCI 区域标记为由所有者 name 保留。除非此调用成功返回,否则不要访问 PCI 区域内的任何地址。
成功时返回 0,或错误时返回 EBUSY。失败时还会打印警告消息。
-
void pci_release_selected_regions(struct pci_dev *pdev, int bars)¶
释放选定的 PCI I/O 和内存资源
参数
struct pci_dev *pdev其资源先前已保留的 PCI 设备
int bars要释放的 BAR 的位掩码
描述
释放先前保留的选定 PCI I/O 和内存资源。仅在 PCI 区域的所有使用都已停止后才调用此函数。
-
int pci_request_selected_regions(struct pci_dev *pdev, int bars, const char *name)¶
保留选定的 PCI I/O 和内存资源
参数
struct pci_dev *pdev要保留其资源的 PCI 设备
int bars要请求的 BAR 的位掩码
const char *name请求资源的驱动程序的名称
返回
成功时返回 0,失败时返回负错误代码。
-
int pci_request_selected_regions_exclusive(struct pci_dev *pdev, int bars, const char *name)¶
独占地请求区域
参数
struct pci_dev *pdev从中请求区域的 PCI 设备
int bars要请求的 BAR 的位掩码
const char *name请求资源的驱动程序的名称
返回
成功时返回 0,失败时返回负错误代码。
-
void pci_release_regions(struct pci_dev *pdev)¶
释放保留的 PCI I/O 和内存资源
参数
struct pci_dev *pdev其资源先前由
pci_request_regions()保留的 PCI 设备
描述
释放之前通过成功调用 pci_request_regions() 保留的所有 PCI I/O 和内存资源。 只有在所有 PCI 区域的使用都已停止后,才调用此函数。
-
int pci_request_regions(struct pci_dev *pdev, const char *name)¶
保留 PCI I/O 和内存资源
参数
struct pci_dev *pdev要保留其资源的 PCI 设备
const char *name请求资源的驱动程序的名称
描述
将与 PCI 设备 pdev 相关的所有 PCI 区域标记为由所有者 name 保留。 除非此调用成功返回,否则不要访问 PCI 区域内的任何地址。
成功时返回 0,或错误时返回 EBUSY。失败时还会打印警告消息。
-
int pci_request_regions_exclusive(struct pci_dev *pdev, const char *name)¶
保留 PCI I/O 和内存资源
参数
struct pci_dev *pdev要保留其资源的 PCI 设备
const char *name请求资源的驱动程序的名称
返回
成功时返回 0,失败时返回负错误代码。
描述
将与 PCI 设备 pdev 相关的所有 PCI 区域标记为由所有者 name 保留。 除非此调用成功返回,否则不要访问 PCI 区域内的任何地址。
pci_request_regions_exclusive() 将标记该区域,以便不允许 /dev/mem 和 sysfs MMIO 访问。
成功时返回 0,或错误时返回 EBUSY。失败时还会打印警告消息。
-
int pci_remap_iospace(const struct resource *res, phys_addr_t phys_addr)¶
重新映射内存映射的 I/O 空间
参数
const struct resource *res描述 I/O 空间的资源
phys_addr_t phys_addr要映射的范围的物理地址
描述
将由 res 描述的内存映射 I/O 空间和 CPU 物理地址 phys_addr 重新映射到虚拟地址空间中。 只有定义了内存映射 IO 函数(并定义了 PCI_IOBASE 值)的架构才应调用此函数。
-
void pci_unmap_iospace(struct resource *res)¶
取消映射内存映射的 I/O 空间
参数
struct resource *res要取消映射的资源
描述
从虚拟地址空间取消映射 CPU 虚拟地址 res。 只有定义了内存映射 IO 函数(并定义了 PCI_IOBASE 值)的架构才应调用此函数。
-
void pci_set_master(struct pci_dev *dev)¶
为设备 dev 启用总线主控
参数
struct pci_dev *dev要启用的 PCI 设备
描述
启用设备上的总线主控,并调用 pcibios_set_master() 来执行所需的特定于架构的设置。
-
void pci_clear_master(struct pci_dev *dev)¶
禁用设备 dev 的总线主控
参数
struct pci_dev *dev要禁用的 PCI 设备
-
int pci_set_cacheline_size(struct pci_dev *dev)¶
确保已编程 CACHE_LINE_SIZE 寄存器
参数
struct pci_dev *dev要为其启用 MWI 的 PCI 设备
描述
pci_set_mwi 的帮助函数。 最初从 drivers/net/acenic.c 复制。 Copyright 1998-2001 by Jes Sorensen, <jes**trained**-monkey.org>。
返回
错误时为适当的 -ERRNO 错误值,成功时为零。
-
int pci_set_mwi(struct pci_dev *dev)¶
启用内存写入无效 PCI 事务
参数
struct pci_dev *dev为其启用 MWI 的 PCI 设备
描述
在 PCI_COMMAND 中启用内存写入无效事务。
返回
错误时为适当的 -ERRNO 错误值,成功时为零。
-
int pci_try_set_mwi(struct pci_dev *dev)¶
启用内存写入无效 PCI 事务
参数
struct pci_dev *dev为其启用 MWI 的 PCI 设备
描述
在 PCI_COMMAND 中启用内存写入无效事务。 调用者不需要检查返回值。
返回
错误时为适当的 -ERRNO 错误值,成功时为零。
-
void pci_clear_mwi(struct pci_dev *dev)¶
禁用设备 dev 的内存写入无效
参数
struct pci_dev *dev要禁用的 PCI 设备
描述
禁用设备上的 PCI 内存写入无效事务
-
void pci_intx(struct pci_dev *pdev, int enable)¶
为设备 dev 启用/禁用 PCI INTx
参数
struct pci_dev *pdev要操作的 PCI 设备
int enable布尔值:是否启用或禁用 PCI INTx
描述
为设备 pdev 启用/禁用 PCI INTx
-
int pci_wait_for_pending_transaction(struct pci_dev *dev)¶
等待挂起的事务
参数
struct pci_dev *dev要操作的 PCI 设备
描述
如果事务挂起则返回 0,否则返回 1。
-
int pcie_flr(struct pci_dev *dev)¶
启动 PCIe 功能级别重置
参数
struct pci_dev *dev要重置的设备
描述
在 dev 上无条件启动功能级别重置,而不检查任何标志和 DEVCAP
-
int pcie_reset_flr(struct pci_dev *dev, bool probe)¶
启动 PCIe 功能级别重置
参数
struct pci_dev *dev要重置的设备
bool probe如果为 true,如果设备可以通过这种方式重置,则返回 0
描述
在 dev 上启动功能级别重置。
-
int pci_bridge_secondary_bus_reset(struct pci_dev *dev)¶
重置 PCI 桥上的辅助总线。
参数
struct pci_dev *dev桥设备
描述
使用桥控制寄存器在辅助总线上断言重置。 辅助总线上的设备保持在通电状态。
-
int __pci_reset_function_locked(struct pci_dev *dev)¶
在保持 dev 互斥锁时重置 PCI 设备功能。
参数
struct pci_dev *dev要重置的 PCI 设备
描述
某些设备允许重置单个功能,而不会影响同一设备中的其他功能。 PCI 设备必须响应 PCI 配置空间才能使用此功能。
假定设备功能未使用,并且在调用此函数时调用者持有设备互斥锁。
重置设备将使 PCI 配置空间的内容随机化,因此任何调用者都必须准备好重新初始化设备,包括 MSI、总线主控、BAR、解码 IO 和内存空间等。
如果设备功能已成功重置,则返回 0;如果设备不支持重置单个功能,则返回负数。
-
int pci_reset_function(struct pci_dev *dev)¶
停止并重置 PCI 设备功能
参数
struct pci_dev *dev要重置的 PCI 设备
描述
某些设备允许重置单个功能,而不会影响同一设备中的其他功能。 PCI 设备必须响应 PCI 配置空间才能使用此功能。
此函数不仅重置设备的 PCI 部分,还清除与该设备关联的所有状态。 此函数与 __pci_reset_function_locked() 的不同之处在于,它在重置时保存和恢复设备状态,并获取 PCI 设备锁。
如果设备功能已成功重置,则返回 0;如果设备不支持重置单个功能,则返回负数。
-
int pci_reset_function_locked(struct pci_dev *dev)¶
停止并重置 PCI 设备功能
参数
struct pci_dev *dev要重置的 PCI 设备
描述
某些设备允许重置单个功能,而不会影响同一设备中的其他功能。 PCI 设备必须响应 PCI 配置空间才能使用此功能。
此函数不仅重置设备的 PCI 部分,还清除与该设备关联的所有状态。 此函数与 __pci_reset_function_locked() 的不同之处在于,它在重置时保存和恢复设备状态。 它也与 pci_reset_function() 的不同之处在于,它要求持有 PCI 设备锁。
如果设备功能已成功重置,则返回 0;如果设备不支持重置单个功能,则返回负数。
-
int pci_try_reset_function(struct pci_dev *dev)¶
停止并重置 PCI 设备功能
参数
struct pci_dev *dev要重置的 PCI 设备
描述
与上述相同,如果无法锁定设备,则返回 -EAGAIN。
-
int pci_probe_reset_slot(struct pci_slot *slot)¶
探测是否可以重置 PCI 插槽
参数
struct pci_slot *slot要探测的 PCI 插槽
描述
如果可以重置插槽,则返回 0;如果不支持插槽重置,则返回负数。
-
int pci_probe_reset_bus(struct pci_bus *bus)¶
探测是否可以重置 PCI 总线
参数
struct pci_bus *bus要探测的 PCI 总线
描述
如果可以重置总线,则返回 0;如果不支持总线重置,则返回负数。
-
int pci_reset_bus(struct pci_dev *pdev)¶
尝试重置 PCI 总线
参数
struct pci_dev *pdev要通过插槽/总线重置的顶层 PCI 设备
描述
与上述相同,如果无法锁定总线,则返回 -EAGAIN
-
int pcix_get_max_mmrbc(struct pci_dev *dev)¶
获取 PCI-X 最大设计内存读取字节计数
参数
struct pci_dev *dev要查询的 PCI 设备
描述
返回 mmrbc:最大设计内存读取计数(以字节为单位)或适当的错误值。
-
int pcix_get_mmrbc(struct pci_dev *dev)¶
获取 PCI-X 最大内存读取字节计数
参数
struct pci_dev *dev要查询的 PCI 设备
描述
返回 mmrbc:最大内存读取计数(以字节为单位)或适当的错误值。
-
int pcix_set_mmrbc(struct pci_dev *dev, int mmrbc)¶
设置 PCI-X 最大内存读取字节计数
参数
struct pci_dev *dev要查询的 PCI 设备
int mmrbc最大内存读取计数(以字节为单位),有效值为 512、1024、2048、4096
描述
如果可能,则设置最大内存读取字节计数,某些桥接器具有阻止此操作的勘误。
-
int pcie_get_readrq(struct pci_dev *dev)¶
获取 PCI Express 读取请求大小
参数
struct pci_dev *dev要查询的 PCI 设备
描述
以字节为单位返回最大内存读取请求或适当的错误值。
-
int pcie_set_readrq(struct pci_dev *dev, int rq)¶
设置 PCI Express 最大内存读取请求
参数
struct pci_dev *dev要查询的 PCI 设备
int rq最大内存读取计数(以字节为单位),有效值为 128、256、512、1024、2048、4096
描述
如果可能,则以字节为单位设置最大内存读取请求
-
int pcie_get_mps(struct pci_dev *dev)¶
获取 PCI Express 最大有效负载大小
参数
struct pci_dev *dev要查询的 PCI 设备
描述
以字节为单位返回最大有效负载大小
-
int pcie_set_mps(struct pci_dev *dev, int mps)¶
设置 PCI Express 最大有效载荷大小
参数
struct pci_dev *dev要查询的 PCI 设备
int mps最大有效载荷大小,以字节为单位。有效值为 128、256、512、1024、2048、4096
描述
如果可能,则设置最大有效载荷大小
-
u32 pcie_bandwidth_available(struct pci_dev *dev, struct pci_dev **limiting_dev, enum pci_bus_speed *speed, enum pcie_link_width *width)¶
确定 PCIe 设备的最小链路设置及其带宽限制
参数
struct pci_dev *dev要查询的 PCI 设备
struct pci_dev **limiting_dev导致带宽限制的设备的存储位置
enum pci_bus_speed *speed限制设备的速度的存储位置
enum pcie_link_width *width限制设备的宽度的存储位置
描述
向上遍历 PCI 设备链,找到可用最小带宽的点。返回该处可用的带宽,并(如果提供了 limiting_dev、speed 和 width 指针)返回有关该点的信息。返回的带宽以 Mb/s 为单位,即原始带宽的兆比特/秒。
-
enum pci_bus_speed pcie_get_speed_cap(struct pci_dev *dev)¶
查询 PCI 设备的链路速度能力
参数
struct pci_dev *dev要查询的 PCI 设备
描述
查询 PCI 设备速度能力。
返回
设备支持的最大链路速度。
-
enum pcie_link_width pcie_get_width_cap(struct pci_dev *dev)¶
查询 PCI 设备的链路宽度能力
参数
struct pci_dev *dev要查询的 PCI 设备
描述
查询 PCI 设备宽度能力。返回设备支持的最大链路宽度。
-
void pcie_print_link_status(struct pci_dev *dev)¶
报告 PCI 设备的链路速度和宽度
参数
struct pci_dev *dev要查询的 PCI 设备
描述
报告设备上的可用带宽。
-
int pci_select_bars(struct pci_dev *dev, unsigned long flags)¶
根据资源类型创建 BAR 掩码
参数
struct pci_dev *dev为其创建 BAR 掩码的 PCI 设备
unsigned long flags要选择的资源类型掩码
描述
此辅助例程根据资源类型创建 bar 掩码。
-
void __iomem *pci_iomap_range(struct pci_dev *dev, int bar, unsigned long offset, unsigned long maxlen)¶
为 PCI BAR 创建虚拟映射 cookie
参数
struct pci_dev *dev拥有 BAR 的 PCI 设备
int barBAR 编号
unsigned long offset在 BAR 中的给定偏移量处映射内存
unsigned long maxlen要映射的内存的最大长度
描述
使用此函数,你将获得设备 BAR 的 __iomem 地址。你可以使用 ioread*() 和 iowrite*() 访问它。这些函数隐藏了这是 MMIO 还是 PIO 地址空间的详细信息,并且将以正确的方式执行你期望它们执行的操作。
maxlen 指定要映射的最大长度。如果要从偏移量到结尾访问完整的 BAR,请在此处传递 0。
-
void __iomem *pci_iomap_wc_range(struct pci_dev *dev, int bar, unsigned long offset, unsigned long maxlen)¶
为 PCI BAR 创建虚拟 WC 映射 cookie
参数
struct pci_dev *dev拥有 BAR 的 PCI 设备
int barBAR 编号
unsigned long offset在 BAR 中的给定偏移量处映射内存
unsigned long maxlen要映射的内存的最大长度
描述
使用此函数,你将获得设备 BAR 的 __iomem 地址。你可以使用 ioread*() 和 iowrite*() 访问它。这些函数隐藏了这是 MMIO 还是 PIO 地址空间的详细信息,并且将以正确的方式执行你期望它们执行的操作。如果可能,将使用写入组合。
maxlen 指定要映射的最大长度。如果要从偏移量到结尾访问完整的 BAR,请在此处传递 0。
-
void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)¶
为 PCI BAR 创建虚拟映射 cookie
参数
struct pci_dev *dev拥有 BAR 的 PCI 设备
int barBAR 编号
unsigned long maxlen要映射的内存的长度
描述
使用此函数,你将获得设备 BAR 的 __iomem 地址。你可以使用 ioread*() 和 iowrite*() 访问它。这些函数隐藏了这是 MMIO 还是 PIO 地址空间的详细信息,并且将以正确的方式执行你期望它们执行的操作。
maxlen 指定要映射的最大长度。如果要访问完整的 BAR 而无需先检查其长度,请在此处传递 0。
-
void __iomem *pci_iomap_wc(struct pci_dev *dev, int bar, unsigned long maxlen)¶
为 PCI BAR 创建虚拟 WC 映射 cookie
参数
struct pci_dev *dev拥有 BAR 的 PCI 设备
int barBAR 编号
unsigned long maxlen要映射的内存的长度
描述
使用此函数,你将获得设备 BAR 的 __iomem 地址。你可以使用 ioread*() 和 iowrite*() 访问它。这些函数隐藏了这是 MMIO 还是 PIO 地址空间的详细信息,并且将以正确的方式执行你期望它们执行的操作。如果可能,将使用写入组合。
maxlen 指定要映射的最大长度。如果要访问完整的 BAR 而无需先检查其长度,请在此处传递 0。
参数
struct device *dev用于重新映射 IO 地址的通用设备
const struct resource *res描述 I/O 空间的资源
phys_addr_t phys_addr要映射的范围的物理地址
描述
托管的 pci_remap_iospace()。映射在驱动程序分离时自动取消映射。
-
void __iomem *devm_pci_remap_cfgspace(struct device *dev, resource_size_t offset, resource_size_t size)¶
托管的 pci_remap_cfgspace()
参数
struct device *dev用于重新映射 IO 地址的通用设备
resource_size_t offset要映射的资源地址
resource_size_t size映射大小
描述
托管的 pci_remap_cfgspace()。映射在驱动程序分离时自动取消映射。
-
void __iomem *devm_pci_remap_cfg_resource(struct device *dev, struct resource *res)¶
检查、请求区域和 ioremap cfg 资源
参数
struct device *dev用于处理资源的通用设备
struct resource *res要处理的配置空间资源
描述
检查资源是否为有效的内存区域,请求内存区域并使用 pci_remap_cfgspace() API 进行 ioremap,以确保保证正确的 PCI 配置空间内存属性。
所有操作都是托管的,并且将在驱动程序分离时撤消。
返回指向重新映射的内存的指针,或者在失败时返回 IOMEM_ERR_PTR() 编码的错误代码。用法示例
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
base = devm_pci_remap_cfg_resource(&pdev->dev, res);
if (IS_ERR(base))
return PTR_ERR(base);
-
int pcim_set_mwi(struct pci_dev *pdev)¶
设备托管的
pci_set_mwi()
-
int pcim_intx(struct pci_dev *pdev, int enable)¶
托管的
pci_intx()
参数
struct pci_dev *pdev要操作的 PCI 设备
int enable布尔值:是否启用或禁用 PCI INTx
返回
成功时为 0,出错时为 -ENOMEM。
描述
为设备 pdev 启用/禁用 PCI INTx。在驱动程序分离时恢复原始状态。
-
int pcim_enable_device(struct pci_dev *pdev)¶
参数
struct pci_dev *pdev要初始化的 PCI 设备
返回
成功时返回 0,失败时返回负错误代码。
描述
托管的 pci_enable_device()。设备将在驱动程序分离时自动禁用。
-
void pcim_pin_device(struct pci_dev *pdev)¶
固定托管的 PCI 设备
参数
struct pci_dev *pdev要固定的 PCI 设备
描述
固定托管的 PCI 设备 pdev。固定的设备在驱动程序分离时不会被禁用。pdev 必须已使用 pcim_enable_device() 启用。
-
void __iomem *const *pcim_iomap_table(struct pci_dev *pdev)¶
访问 iomap 分配表(已弃用)
参数
struct pci_dev *pdev要访问 iomap 表的 PCI 设备
返回
成功时为指向 __iomem 指针数组的常量指针,失败时为 NULL。
描述
访问 dev 的 iomap 分配表。如果 iomap 表不存在并且 pdev 是托管的,则将对其进行分配。记录在 iomap 表中的所有 iomap 都会在驱动程序分离时自动取消映射。
首次分配表时,此函数可能会休眠,但可以在没有上下文的情况下安全地调用,并且保证在分配后成功。
此函数已弃用。不要在新代码中使用它。相反,直接从 pcim_* 映射函数之一获取映射的地址。对于
示例
void __iomem *mappy = pcim_iomap(pdev, bar, length);
-
void __iomem *pcim_iomap(struct pci_dev *pdev, int bar, unsigned long maxlen)¶
托管的
pcim_iomap()
参数
struct pci_dev *pdev要 iomap 的 PCI 设备
int bar要 iomap 的 BAR
unsigned long maxleniomap 的最大长度
返回
成功时为 __iomem 指针,失败时为 NULL。
描述
托管的 pci_iomap()。映射在驱动程序分离时自动取消映射。如果需要,只能使用 pcim_iounmap() 手动取消映射。
每个 BAR 应该只使用一次。
注意
与其他 pcim_* 函数相反,此函数在失败时不会返回 IOMEM_ERR_PTR(),而是返回一个简单的 NULL。这样做是为了向后兼容。
-
void pcim_iounmap(struct pci_dev *pdev, void __iomem *addr)¶
已管理的 pci_iounmap()
参数
struct pci_dev *pdev要执行 iounmap 的 PCI 设备
void __iomem *addr要取消映射的地址
描述
已管理的 pci_iounmap()。addr 必须已使用 pcim_* 映射函数进行映射。
-
void __iomem *pcim_iomap_region(struct pci_dev *pdev, int bar, const char *name)¶
请求并 iomap 一个 PCI BAR
参数
struct pci_dev *pdev要映射 IO 资源的 PCI 设备
int bar要映射的 BAR 的索引
const char *name请求资源的驱动程序的名称
返回
成功时返回 __iomem 指针,失败时返回 IOMEM_ERR_PTR。
描述
映射和区域将在驱动程序分离时自动释放。如果需要,只能使用 pcim_iounmap_region() 手动释放。
-
void pcim_iounmap_region(struct pci_dev *pdev, int bar)¶
取消映射并释放 PCI BAR
参数
struct pci_dev *pdev要操作的 PCI 设备
int bar要取消映射和释放的 BAR 的索引
描述
手动取消映射 BAR 并释放其区域。只能传递先前由 pcim_iomap_region() 映射的 BAR。
-
int pcim_iomap_regions(struct pci_dev *pdev, int mask, const char *name)¶
请求和 iomap PCI BAR (已弃用)
参数
struct pci_dev *pdev要映射 IO 资源的 PCI 设备
int mask要请求和 iomap 的 BAR 的掩码
const char *name请求资源的驱动程序的名称
返回
成功时返回 0,失败时返回负错误代码。
描述
请求并 iomap 由 mask 指定的区域。
此函数已弃用。请勿在新代码中使用它。请改用 pcim_iomap_region()。
-
int pcim_request_region(struct pci_dev *pdev, int bar, const char *name)¶
请求 PCI BAR
参数
struct pci_dev *pdev要请求区域的 PCI 设备
int bar要请求的 BAR 的索引
const char *name请求资源的驱动程序的名称
返回
成功时返回 0,失败时返回负的错误代码。
描述
请求由 bar 指定的区域。
该区域将在驱动程序分离时自动释放。如果需要,只能使用 pcim_release_region() 手动释放。
-
int pcim_request_all_regions(struct pci_dev *pdev, const char *name)¶
请求所有区域
参数
struct pci_dev *pdev要映射 IO 资源的 PCI 设备
const char *name请求资源的驱动程序的名称
返回
成功时返回 0,失败时返回负错误代码。
描述
请求的区域将在驱动程序分离时自动释放。如果需要,可以使用 pcim_release_region() 释放单个区域,或者使用 pcim_release_all_regions() 一次性释放所有区域。
-
void __iomem *pcim_iomap_range(struct pci_dev *pdev, int bar, unsigned long offset, unsigned long len)¶
在 PCI BAR 内创建范围化的 __iomap 映射
参数
struct pci_dev *pdev要映射 IO 资源的 PCI 设备
int barBAR 的索引
unsigned long offset从 BAR 的开始处的偏移量
unsigned long len映射的字节长度
返回
成功时返回 __iomem 指针,失败时返回 IOMEM_ERR_PTR。
描述
在指定的 bar 中创建一个新的 IO-Mapping,范围从 offset 到 offset + len。
映射将在驱动程序分离时自动取消映射。如果需要,只能使用 pcim_iounmap() 手动释放。
-
int pci_add_dynid(struct pci_driver *drv, unsigned int vendor, unsigned int device, unsigned int subvendor, unsigned int subdevice, unsigned int class, unsigned int class_mask, unsigned long driver_data)¶
向此驱动程序添加新的 PCI 设备 ID 并重新探测设备
参数
struct pci_driver *drv目标 pci 驱动程序
unsigned int vendorPCI 供应商 ID
unsigned int devicePCI 设备 ID
unsigned int subvendorPCI 子供应商 ID
unsigned int subdevicePCI 子设备 ID
unsigned int classPCI 类
unsigned int class_maskPCI 类掩码
unsigned long driver_data私有驱动程序数据
描述
向此驱动程序添加新的动态 pci 设备 ID,并导致驱动程序再次探测所有设备。必须在调用此函数之前注册 drv。
上下文
执行 GFP_KERNEL 分配。
返回
成功时返回 0,失败时返回 -errno。
-
const struct pci_device_id *pci_match_id(const struct pci_device_id *ids, struct pci_dev *dev)¶
查看 PCI 设备是否与给定的 pci_id 表匹配
参数
const struct pci_device_id *ids要在其中搜索的 PCI 设备 ID 结构数组
struct pci_dev *dev要匹配的 PCI 设备结构。
描述
驱动程序使用它来检查 PCI 设备是否在其支持的设备列表中。返回匹配的 pci_device_id 结构,如果没有匹配项,则返回 NULL。
已弃用;请勿使用此方法,因为它不会捕获驱动程序可能要检查的任何动态 ID。
-
int __pci_register_driver(struct pci_driver *drv, struct module *owner, const char *mod_name)¶
注册新的 pci 驱动程序
参数
struct pci_driver *drv要注册的驱动程序结构
struct module *ownerdrv 的所有者模块
const char *mod_name模块名称字符串
描述
将驱动程序结构添加到已注册驱动程序的列表中。错误时返回负值,否则返回 0。如果没有发生错误,即使在注册期间没有声明任何设备,驱动程序仍保持注册状态。
-
void pci_unregister_driver(struct pci_driver *drv)¶
注销 pci 驱动程序
参数
struct pci_driver *drv要注销的驱动程序结构
描述
从已注册 PCI 驱动程序的列表中删除驱动程序结构,使其有机会通过为其负责的每个设备调用其 remove() 函数来清理,并将这些设备标记为无驱动程序。
-
struct pci_driver *pci_dev_driver(const struct pci_dev *dev)¶
获取设备的 pci_driver
参数
const struct pci_dev *dev要查询的设备
描述
返回相应的 pci_driver 结构,如果没有该设备的已注册驱动程序,则返回 NULL。
-
struct pci_dev *pci_dev_get(struct pci_dev *dev)¶
递增 pci 设备结构的引用计数
参数
struct pci_dev *dev正在引用的设备
描述
对设备的每个实时引用都应进行引用计数。
PCI 设备的驱动程序通常应在其 probe() 方法(在绑定到设备时)中记录此类引用,并通过在其 disconnect() 方法中调用 pci_dev_put() 来释放它们。
返回指向具有递增的引用计数的设备的指针。
-
void pci_dev_put(struct pci_dev *dev)¶
释放 pci 设备结构的使用
参数
struct pci_dev *dev已断开连接的设备
描述
当设备的用户完成使用设备时,必须调用此函数。当设备的最后一个用户调用此函数时,将释放设备的内存。
-
void pci_stop_and_remove_bus_device(struct pci_dev *dev)¶
删除 PCI 设备和任何子设备
参数
struct pci_dev *dev要删除的设备
描述
从设备列表中删除 PCI 设备,通知驱动程序该设备已被删除。我们还以深度优先的方式删除任何从属总线和子设备。
对于我们要删除的每个设备,从设备列表中删除设备结构,删除 /proc 条目,并通知用户空间 (/sbin/hotplug)。
-
struct pci_bus *pci_find_bus(int domain, int busnr)¶
从给定的域和总线号定位 PCI 总线
参数
int domain要搜索的 PCI 域的编号
int busnr所需 PCI 总线的编号
描述
给定 PCI 总线号和域号,所需的 PCI 总线位于 PCI 总线的全局列表中。如果找到总线,则返回指向其数据结构的指针。如果未找到总线,则返回 NULL。
-
struct pci_bus *pci_find_next_bus(const struct pci_bus *from)¶
开始或继续搜索 PCI 总线
参数
const struct pci_bus *from先前找到的 PCI 总线,或
NULL用于新搜索。
描述
遍历已知 PCI 总线的列表。通过传递 NULL 作为 from 参数来启动新的搜索。否则,如果 from 不为 NULL,则从全局列表中的下一个设备继续搜索。
-
struct pci_dev *pci_get_slot(struct pci_bus *bus, unsigned int devfn)¶
定位给定 PCI 插槽的 PCI 设备
参数
struct pci_bus *bus所需 PCI 设备所在的 PCI 总线
unsigned int devfn编码所需 PCI 设备所在的 PCI 插槽的编号以及该插槽中多功能设备的逻辑设备编号。
描述
给定 PCI 总线和插槽/功能号,所需的 PCI 设备位于 PCI 设备的列表中。如果找到该设备,则其引用计数将增加,并且此函数返回指向其数据结构的指针。调用方必须通过调用 pci_dev_put() 来递减引用计数。如果未找到设备,则返回 NULL。
-
struct pci_dev *pci_get_domain_bus_and_slot(int domain, unsigned int bus, unsigned int devfn)¶
为给定的 PCI 域(段)、总线和槽位查找 PCI 设备
参数
int domainPCI 设备所在的 PCI 域/段。
unsigned int bus所需 PCI 设备所在的 PCI 总线
unsigned int devfn编码所需 PCI 设备所在的 PCI 插槽的编号以及该插槽中多功能设备的逻辑设备编号。
描述
给定 PCI 域、总线和槽位/功能号,将在 PCI 设备列表中查找所需的 PCI 设备。如果找到该设备,其引用计数将增加,并且此函数返回指向其数据结构的指针。调用者必须通过调用 pci_dev_put() 来减少引用计数。如果未找到设备,则返回 NULL。
-
struct pci_dev *pci_get_subsys(unsigned int vendor, unsigned int device, unsigned int ss_vendor, unsigned int ss_device, struct pci_dev *from)¶
开始或继续按 vendor/subvendor/device/subdevice id 搜索 PCI 设备
参数
unsigned int vendor要匹配的 PCI vendor id,或
PCI_ANY_ID以匹配所有 vendor idunsigned int device要匹配的 PCI device id,或
PCI_ANY_ID以匹配所有 device idunsigned int ss_vendor要匹配的 PCI 子系统 vendor id,或
PCI_ANY_ID以匹配所有 vendor idunsigned int ss_device要匹配的 PCI 子系统 device id,或
PCI_ANY_ID以匹配所有 device idstruct pci_dev *from搜索中找到的上一个 PCI 设备,或
NULL用于新的搜索。
描述
遍历已知 PCI 设备列表。如果找到一个 PCI 设备,其 **vendor**、**device**、**ss_vendor** 和 **ss_device** 匹配,则返回指向其设备结构的指针,并且设备的引用计数会增加。否则,返回 NULL。通过传递 NULL 作为 **from** 参数来启动新的搜索。否则,如果 **from** 不为 NULL,则从全局列表中的下一个设备继续搜索。如果 **from** 不为 NULL,则始终会减少 **from** 的引用计数。
-
struct pci_dev *pci_get_device(unsigned int vendor, unsigned int device, struct pci_dev *from)¶
开始或继续按 vendor/device id 搜索 PCI 设备
参数
unsigned int vendor要匹配的 PCI vendor id,或
PCI_ANY_ID以匹配所有 vendor idunsigned int device要匹配的 PCI device id,或
PCI_ANY_ID以匹配所有 device idstruct pci_dev *from搜索中找到的上一个 PCI 设备,或
NULL用于新的搜索。
描述
遍历已知 PCI 设备列表。如果找到一个 PCI 设备,其 **vendor** 和 **device** 匹配,则设备的引用计数会增加,并且返回指向其设备结构的指针。否则,返回 NULL。通过传递 NULL 作为 **from** 参数来启动新的搜索。否则,如果 **from** 不为 NULL,则从全局列表中的下一个设备继续搜索。如果 **from** 不为 NULL,则始终会减少 **from** 的引用计数。
-
struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from)¶
开始或继续按 class 搜索 PCI 设备
参数
unsigned int class搜索具有此类别的 PCI 设备
struct pci_dev *from搜索中找到的上一个 PCI 设备,或
NULL用于新的搜索。
描述
遍历已知 PCI 设备列表。如果找到一个 PCI 设备,其 **class** 匹配,则设备的引用计数会增加,并且返回指向其设备结构的指针。否则,返回 NULL。通过传递 NULL 作为 **from** 参数来启动新的搜索。否则,如果 **from** 不为 NULL,则从全局列表中的下一个设备继续搜索。如果 **from** 不为 NULL,则始终会减少 **from** 的引用计数。
-
struct pci_dev *pci_get_base_class(unsigned int class, struct pci_dev *from)¶
仅通过匹配基类代码来搜索 PCI 设备
参数
unsigned int class搜索具有此基类代码的 PCI 设备
struct pci_dev *from搜索中找到的上一个 PCI 设备,或
NULL用于新的搜索。
描述
遍历已知 PCI 设备列表。如果找到一个 PCI 设备,其基类代码匹配,则设备的引用计数会增加。请参阅 pci_match_one_device() 以了解其工作原理。通过传递 NULL 作为 **from** 参数来启动新的搜索。否则,如果 **from** 不为 NULL,则从全局列表中的下一个设备继续搜索。如果 **from** 不为 NULL,则始终会减少 **from** 的引用计数。
返回
指向匹配的 PCI 设备的指针,否则为 NULL。
-
int pci_dev_present(const struct pci_device_id *ids)¶
如果存在与设备列表匹配的设备,则返回 1,否则返回 0。
参数
const struct pci_device_id *ids指向以 NULL 结尾的
struct pci_device_id结构体列表的指针,这些结构体描述了调用者尝试查找的 PCI 设备的类型。
描述
显而易见的事实:您没有对可能被此函数找到的任何设备的引用,因此如果该设备在此函数完成后立即从系统中删除,则该值将失效。使用此函数查找通常内置到系统中的设备,或者作为关于另一设备是否恰好在此时存在的通用提示。
参数
struct irq_data *data指向与该中断关联的 irqdata 的指针
参数
struct irq_data *data指向与该中断关联的 irqdata 的指针
-
int pci_msi_vec_count(struct pci_dev *dev)¶
返回设备可以发送的 MSI 向量的数量
参数
struct pci_dev *dev要报告的设备
描述
此函数返回设备通过“多消息能力”寄存器请求的 MSI 向量的数量。如果设备无法发送 MSI 中断,则返回一个负的 errno。否则,调用成功并返回 2 的幂,最大值为 2^5 (32),根据 MSI 规范。
-
int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res, resource_size_t size, resource_size_t align, resource_size_t min, unsigned long type_mask, resource_alignf alignf, void *alignf_data)¶
从父总线分配资源
参数
struct pci_bus *busPCI 总线
struct resource *res要分配的资源
resource_size_t size要分配的资源的大小
resource_size_t align要分配的资源的对齐方式
resource_size_t min要分配的最小 /proc/iomem 地址
unsigned long type_maskIORESOURCE_* 类型标志
resource_alignf alignf资源对齐函数
void *alignf_data资源对齐函数的数据参数
描述
给定设备所在的 PCI 总线、大小、最小地址、对齐方式和类型,尝试为特定设备资源找到可接受的资源分配。
-
void pci_bus_add_device(struct pci_dev *dev)¶
为单个设备启动驱动程序
参数
struct pci_dev *dev要添加的设备
描述
这会添加 sysfs 条目并启动设备驱动程序
-
void pci_bus_add_devices(const struct pci_bus *bus)¶
为 PCI 设备启动驱动程序
参数
const struct pci_bus *bus要检查新设备的总线
描述
为 PCI 设备启动驱动程序并添加一些 sysfs 条目。
-
void pci_walk_bus(struct pci_bus *top, int (*cb)(struct pci_dev*, void*), void *userdata)¶
遍历总线上/下的设备,调用回调。
参数
struct pci_bus *top应该遍历其设备的总线
int (*cb)(struct pci_dev *, void *)为找到的每个设备调用的回调
void *userdata要传递给回调的任意指针
遍历给定的总线,包括此总线下任何总线上的任何桥接设备。在找到的每个设备上调用提供的回调。
我们每次都检查 **cb** 的返回值。如果它返回除 0 之外的任何内容,我们将退出。
-
struct pci_ops *pci_bus_set_ops(struct pci_bus *bus, struct pci_ops *ops)¶
设置 pci 总线的原始操作
参数
struct pci_bus *buspci 总线结构
struct pci_ops *ops新的原始操作
描述
返回之前的原始操作
-
void pci_cfg_access_lock(struct pci_dev *dev)¶
锁定 PCI 配置读取/写入
参数
struct pci_dev *devpci 设备结构
描述
当访问被锁定时,任何用户空间读取或写入配置空间以及并发锁请求都将休眠,直到通过 pci_cfg_access_unlock() 再次允许访问。
-
bool pci_cfg_access_trylock(struct pci_dev *dev)¶
尝试锁定 PCI 配置读取/写入
参数
struct pci_dev *devpci 设备结构
描述
与 pci_cfg_access_lock 相同,但如果访问已被锁定,则返回 0,否则返回 1。此函数可以从原子上下文中使用。
-
void pci_cfg_access_unlock(struct pci_dev *dev)¶
解锁 PCI 配置读取/写入
参数
struct pci_dev *devpci 设备结构
描述
此函数允许 PCI 配置访问恢复。
-
int pci_request_irq(struct pci_dev *dev, unsigned int nr, irq_handler_t handler, irq_handler_t thread_fn, void *dev_id, const char *fmt, ...)¶
为 PCI 设备分配中断线
参数
struct pci_dev *dev要操作的 PCI 设备
unsigned int nr设备相关的中断向量索引(从 0 开始)。
irq_handler_t handler发生 IRQ 时要调用的函数。线程中断的主要处理程序。 如果为 NULL 且 thread_fn != NULL,则安装默认的主要处理程序。
irq_handler_t thread_fn从 IRQ 处理程序线程调用的函数。如果为 NULL,则不创建 IRQ 线程
void *dev_id传递回处理程序的 Cookie
const char *fmtPrintf 类型的格式字符串,用于命名处理程序
...可变参数
描述
此调用会分配中断资源并启用中断线和 IRQ 处理。 从进行此调用的那一刻起,可能会调用 **handler** 和 **thread_fn**。 使用此函数请求的所有中断都可以共享。
**dev_id** 不得为 NULL,并且必须是全局唯一的。
-
void pci_free_irq(struct pci_dev *dev, unsigned int nr, void *dev_id)¶
释放使用 pci_request_irq 分配的中断
参数
struct pci_dev *dev要操作的 PCI 设备
unsigned int nr设备相关的中断向量索引(从 0 开始)。
void *dev_id要释放的设备标识
描述
删除中断处理程序。 删除处理程序,如果中断线不再被任何驱动程序使用,则将其禁用。 调用者必须确保在调用此函数之前设备上的中断已禁用。 该函数只有在此 IRQ 的任何正在执行的中断完成后才会返回。
不得从中断上下文中调用此函数。
-
u8 pci_common_swizzle(struct pci_dev *dev, u8 *pinp)¶
一直将 INTx 混杂到根桥
参数
struct pci_dev *devPCI 设备
u8 *pinp指向 INTx 引脚值的指针 (1=INTA, 2=INTB, 3=INTD, 4=INTD)
描述
为设备执行 INTx 混杂。 这会遍历所有 PCI 到 PCI 桥,一直到 PCI 根总线。
-
bool pci_check_and_mask_intx(struct pci_dev *dev)¶
屏蔽挂起中断上的 INTx
参数
struct pci_dev *dev要操作的 PCI 设备
描述
检查设备 dev 是否已声明其 INTx 线,如果已声明,则将其屏蔽并返回 true。 如果没有挂起的中断,则返回 False。
-
bool pci_check_and_unmask_intx(struct pci_dev *dev)¶
如果没有挂起的中断,则取消屏蔽 INTx
参数
struct pci_dev *dev要操作的 PCI 设备
描述
检查设备 dev 是否已声明其 INTx 线,如果未声明,则取消屏蔽它并返回 true。 如果仍然有挂起的中断,则返回 False,并且屏蔽保持活动状态。
-
bool pcie_relaxed_ordering_enabled(struct pci_dev *dev)¶
探测 PCIe 放松排序使能
参数
struct pci_dev *dev要查询的 PCI 设备
描述
如果设备启用了放松排序属性,则返回 true。
-
int pci_scan_slot(struct pci_bus *bus, int devfn)¶
在总线上扫描 PCI 插槽以查找设备
参数
struct pci_bus *bus要扫描的 PCI 总线
int devfn要扫描的插槽号(必须具有零功能)
描述
在指定的 PCI 总线上扫描 PCI 插槽以查找设备,并将发现的设备添加到 **bus->devices** 列表中。 新设备将没有设置 is_added。
返回找到的新设备的数量。
-
unsigned int pci_scan_child_bus(struct pci_bus *bus)¶
扫描总线下的设备
参数
struct pci_bus *bus要扫描设备的总线
描述
扫描 **bus** 下的设备,包括从属总线。 返回新的从属号码,包括所有找到的设备。
-
unsigned int pci_rescan_bus(struct pci_bus *bus)¶
扫描 PCI 总线以查找设备
参数
struct pci_bus *bus要扫描的 PCI 总线
描述
扫描 PCI 总线和子总线以查找新设备,添加它们并启用它们。
返回发现的从属总线的最大数量。
-
struct pci_slot *pci_create_slot(struct pci_bus *parent, int slot_nr, const char *name, struct hotplug_slot *hotplug)¶
创建或增加物理 PCI 插槽的引用计数
参数
struct pci_bus *parent父桥的 struct pci_bus
int slot_nrPCI_SLOT(pci_dev->devfn) 或占位符的 -1
const char *name用户可见的字符串,显示在 /sys/bus/pci/slots/<name> 中
struct hotplug_slot *hotplug如果调用者是热插拔驱动程序,则设置;否则为 NULL
描述
PCI 插槽具有诸如地址、速度、宽度之类的一流属性,并且 struct pci_slot 用于管理它们。 此接口将向调用者返回一个新的 struct pci_slot,或者,如果 pci_slot 已经存在,则其引用计数将递增。
插槽由 **pci_bus**、**slot_nr** 元组唯一标识。
已知某些平台的固件存在缺陷,会将相同的名称分配给多个插槽。 通过代表调用者重命名插槽来解决这些存在缺陷的平台。 如果固件将名称 N 分配给多个插槽
第一个插槽分配给 N 第二个插槽分配给 N-1 第三个插槽分配给 N-2 等。
占位符插槽:在大多数情况下,**pci_bus**、**slot_nr** 足以唯一标识一个插槽。 有一个值得注意的例外 - pSeries (rpaphp),在该平台上,在实际将设备插入插槽之前无法确定 **slot_nr**。 在这种情况下,调用者可以为 **slot_nr** 传递 -1。
当调用者传递 **slot_nr** == -1 时,会强制执行以下语义。 首先,我们不再检查现有的 struct pci_slot,因为可能有很多 **slot_nr** 为 -1 的插槽。 语义的另一个变化是用户可见的,即 sysfs 中显示的“address”参数将仅包含一个 dddd:bb 元组,其中 dddd 是 struct pci_bus 的 PCI 域,bb 是总线号。 换句话说,不会显示“占位符”插槽的 devfn。
-
void pci_destroy_slot(struct pci_slot *slot)¶
减少物理 PCI 插槽的引用计数
参数
struct pci_slot *slot要减少的 struct pci_slot
描述
struct pci_slot 经过引用计数,因此销毁它们非常容易; 我们只需在其 kobj 上调用 kobject_put,然后让我们的释放方法完成其余工作。
-
int pci_enable_rom(struct pci_dev *pdev)¶
为 PCI 设备启用 ROM 解码
参数
struct pci_dev *pdev要启用的 PCI 设备
描述
在 **dev** 上启用 ROM 解码。 这仅仅涉及打开 PCI ROM BAR 的最后一位。 请注意,某些卡可能会在 ROM 和其他资源之间共享地址解码器,因此启用它可能会禁用对 MMIO 寄存器或其他卡内存的访问。
-
void pci_disable_rom(struct pci_dev *pdev)¶
禁用 PCI 设备的 ROM 解码
参数
struct pci_dev *pdev要禁用的 PCI 设备
描述
通过关闭 ROM BAR 中的最后一位来禁用 PCI 设备上的 ROM 解码。
-
void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size)¶
将 PCI ROM 映射到内核空间
参数
struct pci_dev *pdev指向 pci 设备结构体的指针
size_t *size指向接收 ROM 上 pci 窗口大小的指针
返回
指向 ROM 映像的内核虚拟指针
描述
将 PCI ROM 映射到内核空间。 如果 ROM 是启动视频 ROM,则将返回影子 BIOS 副本而不是实际的 ROM。
-
void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom)¶
从内核空间取消映射 ROM
参数
struct pci_dev *pdev指向 pci 设备结构体的指针
void __iomem *rom先前映射的虚拟地址
描述
删除先前映射的 ROM 的映射
-
void *pci_iov_get_pf_drvdata(struct pci_dev *dev, struct pci_driver *pf_driver)¶
返回 PF 的 drvdata
参数
struct pci_dev *devVF pci_dev
struct pci_driver *pf_driver拥有 PF 所需的设备驱动程序
描述
必须从确保附加 VF 驱动程序的上下文中调用此函数。 VF 驱动程序完成其 remove() 回调后,返回的值将无效。
驱动程序核心实现锁定。 在调用 pci_enable_sriov() 之前,VF 驱动程序无法被探测,并且 pci_disable_sriov() 在所有 VF 驱动程序完成其 remove() 之前不会返回。
PF 驱动程序必须在开始销毁 drvdata 之前调用 pci_disable_sriov()。
-
int pci_enable_sriov(struct pci_dev *dev, int nr_virtfn)¶
启用 SR-IOV 功能
参数
struct pci_dev *devPCI 设备
int nr_virtfn要启用的虚拟功能的数量
描述
成功时返回 0,失败时返回负值。
-
void pci_disable_sriov(struct pci_dev *dev)¶
禁用 SR-IOV 功能
参数
struct pci_dev *devPCI 设备
-
int pci_num_vf(struct pci_dev *dev)¶
返回与 PF device_release_driver 关联的 VF 的数量
参数
struct pci_dev *devPCI 设备
描述
返回 VF 的数量,如果未启用 SR-IOV,则返回 0。
-
int pci_vfs_assigned(struct pci_dev *dev)¶
返回分配给访客的 VF 的数量
参数
struct pci_dev *devPCI 设备
描述
返回属于此设备的分配给访客的 VF 的数量。 如果设备不是物理功能,则返回 0。
-
int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs)¶
减少 TotalVFs 的可用数量
参数
struct pci_dev *devPCI PF 设备
u16 numvfs应用于支持的 TotalVFs 的编号
描述
应从 PF 驱动程序的探测例程中调用,并持有设备的互斥锁。
如果 PF 是支持 SRIOV 的设备并且 numvfs 的值有效,则返回 0。 如果不是 PF,则返回 -ENOSYS;如果 numvfs 无效,则返回 -EINVAL;如果已启用 VF,则返回 -EBUSY。
-
int pci_sriov_get_totalvfs(struct pci_dev *dev)¶
获取此设备支持的VF总数
参数
struct pci_dev *devPCI PF 设备
描述
对于支持SRIOV的PCIe设备,返回PCIe SRIOV capability中的TotalVFs值,或者如果驱动减少了VF数量,则返回driver_max_VFs的值。否则返回0。
-
int pci_sriov_configure_simple(struct pci_dev *dev, int nr_virtfn)¶
用于配置SR-IOV的辅助函数
参数
struct pci_dev *devPCI 设备
int nr_virtfn要启用的虚拟函数数量,0表示禁用
描述
为在启用SR-IOV之前不需要任何PF设置的设备启用或禁用SR-IOV。 错误时返回值是负数,成功时返回值是分配的VF数量。
-
ssize_t pci_read_legacy_io(struct file *filp, struct kobject *kobj, const struct bin_attribute *bin_attr, char *buf, loff_t off, size_t count)¶
从传统的I/O端口空间读取字节
参数
struct file *filp打开的sysfs文件
struct kobject *kobj要读取的文件对应的kobject
const struct bin_attribute *bin_attr此文件的struct bin_attribute
char *buf存储结果的缓冲区
loff_t off传统的I/O端口空间中的偏移量
size_t count要读取的字节数
描述
使用特定于架构的回调例程(pci_legacy_read)从传统的I/O端口空间读取1、2或4个字节。
-
ssize_t pci_write_legacy_io(struct file *filp, struct kobject *kobj, const struct bin_attribute *bin_attr, char *buf, loff_t off, size_t count)¶
将字节写入传统的I/O端口空间
参数
struct file *filp打开的sysfs文件
struct kobject *kobj要读取的文件对应的kobject
const struct bin_attribute *bin_attr此文件的struct bin_attribute
char *buf包含要写入的值的缓冲区
loff_t off传统的I/O端口空间中的偏移量
size_t count要写入的字节数
描述
使用特定于架构的回调例程(pci_legacy_write)将1、2或4个字节写入传统的I/O端口空间。
-
int pci_mmap_legacy_mem(struct file *filp, struct kobject *kobj, const struct bin_attribute *attr, struct vm_area_struct *vma)¶
将传统的PCI内存映射到用户内存空间
参数
struct file *filp打开的sysfs文件
struct kobject *kobj要映射的设备对应的kobject
const struct bin_attribute *attr此文件的struct bin_attribute
struct vm_area_struct *vma传递给mmap的struct vm_area_struct
描述
使用特定于架构的回调pci_mmap_legacy_mem_page_range,将传统的内存空间(总线空间的前1MB)映射到应用程序虚拟内存空间。
-
int pci_mmap_legacy_io(struct file *filp, struct kobject *kobj, const struct bin_attribute *attr, struct vm_area_struct *vma)¶
将传统的PCI IO映射到用户内存空间
参数
struct file *filp打开的sysfs文件
struct kobject *kobj要映射的设备对应的kobject
const struct bin_attribute *attr此文件的struct bin_attribute
struct vm_area_struct *vma传递给mmap的struct vm_area_struct
描述
使用特定于架构的回调pci_mmap_legacy_io_page_range,将传统的IO空间(总线空间的前1MB)映射到应用程序虚拟内存空间。 如果不支持该操作,则返回-ENOSYS
-
void pci_adjust_legacy_attr(struct pci_bus *b, enum pci_mmap_state mmap_type)¶
调整传统的file属性
参数
struct pci_bus *b要在其下创建文件的总线
enum pci_mmap_state mmap_typeI/O端口或内存
描述
存根实现。 如果必要,可以被架构覆盖。
-
void pci_create_legacy_files(struct pci_bus *b)¶
创建传统的I/O端口和内存文件
参数
struct pci_bus *b要在其下创建文件的总线
描述
某些平台允许在每个总线上访问传统的I/O端口和ISA内存空间。 此例程创建文件,并将它们与pci-sysfs.c中相关的读取、写入和mmap文件相关联。
如果发生错误,则进行回退,但不要将错误传播给调用方,因为在没有这些文件的情况下设置PCI总线是可以的。
-
int pci_mmap_resource(struct kobject *kobj, const struct bin_attribute *attr, struct vm_area_struct *vma, int write_combine)¶
将PCI资源映射到用户内存空间
参数
struct kobject *kobj用于映射的kobject
const struct bin_attribute *attr正在映射的文件的struct bin_attribute
struct vm_area_struct *vma传递给mmap的struct vm_area_struct
int write_combine1表示write_combine映射
描述
使用常规的PCI映射例程将PCI资源映射到用户空间。
-
void pci_remove_resource_files(struct pci_dev *pdev)¶
清理资源文件
参数
struct pci_dev *pdev要清理的设备
描述
如果我们为pdev创建了资源文件,则从sysfs中删除它们并释放它们的资源。
-
int pci_create_resource_files(struct pci_dev *pdev)¶
在sysfs中为dev创建资源文件
参数
struct pci_dev *pdev有问题的设备
描述
遍历pdev中的资源,为每个可用的资源创建文件。
-
ssize_t pci_write_rom(struct file *filp, struct kobject *kobj, const struct bin_attribute *bin_attr, char *buf, loff_t off, size_t count)¶
用于启用对PCI ROM显示的访问
参数
struct file *filpsysfs文件
struct kobject *kobj内核对象句柄
const struct bin_attribute *bin_attr此文件的struct bin_attribute
char *buf用户输入
loff_t off文件偏移量
size_t count输入中的字节数
描述
写入除0以外的任何内容都会启用它
-
ssize_t pci_read_rom(struct file *filp, struct kobject *kobj, const struct bin_attribute *bin_attr, char *buf, loff_t off, size_t count)¶
读取PCI ROM
参数
struct file *filpsysfs文件
struct kobject *kobj内核对象句柄
const struct bin_attribute *bin_attr此文件的struct bin_attribute
char *buf将从ROM读取的数据放入何处
loff_t off文件偏移量
size_t count要读取的字节数
描述
将与kobj对应的PCI设备中的ROM中从off开始的count个字节放入buf中。
-
void pci_remove_sysfs_dev_files(struct pci_dev *pdev)¶
清理PCI特定的sysfs文件
参数
struct pci_dev *pdev应该释放其条目的设备
描述
当从sysfs中删除pdev时进行清理。
-
int pcie_tph_get_cpu_st(struct pci_dev *pdev, enum tph_mem_type mem_type, unsigned int cpu_uid, u16 *tag)¶
检索与特定CPU关联的目标内存的导向标签
参数
struct pci_dev *pdevPCI 设备
enum tph_mem_type mem_type目标内存类型(易失性或持久性RAM)
unsigned int cpu_uid关联的CPU ID
u16 *tag要返回的导向标签
描述
返回与特定CPU(由cpu_uid指示)关联的目标内存的导向标签。
返回
成功时返回0,否则返回负值(-errno)
-
int pcie_tph_set_st_entry(struct pci_dev *pdev, unsigned int index, u16 tag)¶
在ST表条目中设置导向标签
参数
struct pci_dev *pdevPCI 设备
unsigned int indexST表条目索引
u16 tag要写入的导向标签
描述
找出ST表的正确位置,无论是在MSI-X表中还是在TPH扩展Capability空间中,并将导向标签写入由索引指向的ST条目中。
返回
成功时返回0,否则返回负值(-errno)
-
void pcie_disable_tph(struct pci_dev *pdev)¶
关闭设备的TPH支持
参数
struct pci_dev *pdevPCI 设备
返回
无
-
int pcie_enable_tph(struct pci_dev *pdev, int mode)¶
使用特定的ST模式启用设备的TPH支持
参数
struct pci_dev *pdevPCI 设备
int mode要启用的ST模式。 当前支持的模式包括
PCI_TPH_ST_NS_MODE: NO ST模式
PCI_TPH_ST_IV_MODE: 中断向量模式
PCI_TPH_ST_DS_MODE: 设备特定模式
描述
在启用之前检查设备是否实际支持该模式,如果不支持则返回错误。 此外,根据设备的TPH请求者能力和根端口的完成者能力,确定设备可以发出哪些类型的请求,TPH或扩展TPH。
返回
成功时返回0,否则返回负值(-errno)
PCI热插拔支持库¶
-
int __pci_hp_register(struct hotplug_slot *slot, struct pci_bus *bus, int devnr, const char *name, struct module *owner, const char *mod_name)¶
向PCI热插拔子系统注册一个hotplug_slot
参数
struct hotplug_slot *slot指向要注册的
struct hotplug_slot的指针struct pci_bus *bus此插槽所在的总线
int devnr设备号
const char *name在kobject核心中注册的名称
struct module *owner调用者模块的所有者
const char *mod_name调用者模块的名称
描述
准备一个热插拔插槽以供内核使用,并立即将其发布到用户空间。驱动程序也可以选择通过调用 pci_hp_initialize() 和 pci_hp_add() 分别执行这两个步骤。
成功返回 0,出错返回其他值。
-
int __pci_hp_initialize(struct hotplug_slot *slot, struct pci_bus *bus, int devnr, const char *name, struct module *owner, const char *mod_name)¶
准备热插拔插槽以供内核使用
参数
struct hotplug_slot *slot指向要初始化的
struct hotplug_slot的指针struct pci_bus *bus此插槽所在的总线
int devnr插槽号
const char *name在kobject核心中注册的名称
struct module *owner调用者模块的所有者
const char *mod_name调用者模块的名称
描述
分配并填充一个 PCI 插槽,供热插拔驱动程序使用。 一旦调用此函数,驱动程序可以调用 hotplug_slot_name() 来获取插槽的唯一名称。 从那时起,驱动程序必须准备好处理 ->reset_slot 回调。
成功返回 0,出错返回负整数。
-
int pci_hp_add(struct hotplug_slot *slot)¶
将热插拔插槽发布到用户空间
参数
struct hotplug_slot *slot指向要发布的
struct hotplug_slot的指针
描述
使热插拔插槽的 sysfs 接口可用,并通过发送 uevent 通知用户空间已添加该插槽。 从那时起,热插拔驱动程序必须准备好处理所有 struct hotplug_slot_ops 回调。
成功返回 0,出错返回负整数。
-
void pci_hp_deregister(struct hotplug_slot *slot)¶
从PCI热插拔子系统注销一个hotplug_slot
参数
struct hotplug_slot *slot指向要注销的
struct hotplug_slot的指针
描述
在先前调用 pci_hp_register() 时,slot 必须已在 pci 热插拔子系统中注册。
-
void pci_hp_del(struct hotplug_slot *slot)¶
从用户空间取消发布热插拔插槽
参数
struct hotplug_slot *slot指向要取消发布的
struct hotplug_slot的指针
描述
删除热插拔插槽的 sysfs 接口。
-
void pci_hp_destroy(struct hotplug_slot *slot)¶
从内核使用中删除热插拔插槽
参数
struct hotplug_slot *slot指向要销毁的
struct hotplug_slot的指针
描述
销毁热插拔驱动程序使用的 PCI 插槽。 一旦调用此函数,驱动程序将不再能够调用 hotplug_slot_name() 来获取插槽的唯一名称。 从那时起,驱动程序不再需要处理 ->reset_slot 回调。