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 *pdev

PCI 设备

描述

返回 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_CHSWP CompactPCI 热插拔 PCI_CAP_ID_PCIX PCI-X PCI_CAP_ID_EXP PCI 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_cap

HyperTransport 功能代码

描述

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_cap

HyperTransport 功能代码

描述

判断设备是否支持给定的 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 能力,其 VSEC ID 为 cap。如果找到,则返回配置空间中的能力偏移量;否则返回 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 pcie_read_tlp_log(struct pci_dev *dev, int where, struct pcie_tlp_log *tlp_log)

读取 TLP 报头日志

参数

struct pci_dev *dev

PCIe 设备

int where

TLP 报头日志的 PCI 配置偏移量

struct pcie_tlp_log *tlp_log

要填充的 TLP 日志结构

描述

从 TLP 报头日志寄存器(例如,AER 或 DPC)填充 tlp_log

返回

成功时返回 0 并填充 TLP 日志结构,错误时返回 <0。

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 *dev

PCIe 设备重置

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” 禁用它。

描述

调用者必须在调用此函数时将 enable 设置为 “true” 之前,验证设备是否能够生成 PME#。

int pci_enable_wake(struct pci_dev *pci_dev, pci_power_t state, bool enable)

更改 PCI 设备的唤醒设置

参数

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 enable

如果为 True 则启用唤醒事件生成;如果为 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

整个系统的目标状态。

描述

返回适合 devstate 的 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 *pdev

PCI 设备

int bar

要查询的 BAR

描述

获取可调整大小的 BAR 的可能大小,它在规范中定义为位掩码(第 0 位=1MB,第 19 位=512GB)。如果 BAR 不可调整大小,则返回 0。

int pci_enable_atomic_ops_to_root(struct pci_dev *dev, u32 cap_mask)

启用到根端口的 AtomicOp 请求

参数

struct pci_dev *dev

PCI 设备

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 *res_name)

保留 PCI I/O 和内存资源

参数

struct pci_dev *pdev

要保留其资源的 PCI 设备

int bar

要保留的 BAR

const char *res_name

要与资源关联的名称

返回

成功时返回 0,失败时返回负错误代码。

描述

将与 PCI 设备 pdev 的 BAR bar 关联的 PCI 区域标记为由所有者 res_name 保留。除非此调用成功返回,否则不要访问 PCI 区域内的任何地址。

成功时返回 0,或错误时返回 EBUSY。 失败时也会打印警告消息。

注意

这是一个“混合”函数:它通常是未管理的,但在提前调用 pcim_enable_device() 时变为托管。 此混合功能已弃用! 如果您需要托管清理,请改用 pcim_* 函数。

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 *res_name)

保留选定的 PCI I/O 和内存资源

参数

struct pci_dev *pdev

要保留其资源的 PCI 设备

int bars

要请求的 BAR 的位掩码

const char *res_name

要与资源关联的名称

返回

成功时返回 0,失败时返回负错误代码。

注意

这是一个“混合”函数:它通常是未管理的,但在提前调用 pcim_enable_device() 时变为托管。 此混合功能已弃用! 如果您需要托管清理,请改用 pcim_* 函数。

int pci_request_selected_regions_exclusive(struct pci_dev *pdev, int bars, const char *res_name)

独占请求区域

参数

struct pci_dev *pdev

从中请求区域的 PCI 设备

int bars

要请求的 BAR 的位掩码

const char *res_name

要与请求关联的名称

返回

成功时返回 0,失败时返回负错误代码。

注意

这是一个“混合”函数:它通常是未管理的,但在提前调用 pcim_enable_device() 时变为托管。 此混合功能已弃用! 如果您需要托管清理,请改用 pcim_* 函数。

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 *res_name)

保留 PCI I/O 和内存资源

参数

struct pci_dev *pdev

要保留其资源的 PCI 设备

const char *res_name

要与资源关联的名称。

描述

将与 PCI 设备 pdev 关联的所有 PCI 区域标记为由所有者 res_name 保留。 除非此调用成功返回,否则不要访问 PCI 区域内的任何地址。

成功时返回 0,或错误时返回 EBUSY。 失败时也会打印警告消息。

注意

这是一个“混合”函数:它通常是未管理的,但在提前调用 pcim_enable_device() 时变为托管。 此混合功能已弃用! 如果您需要托管清理,请改用 pcim_* 函数。

int pci_request_regions_exclusive(struct pci_dev *pdev, const char *res_name)

保留 PCI I/O 和内存资源

参数

struct pci_dev *pdev

要保留其资源的 PCI 设备

const char *res_name

要与资源关联的名称。

返回

成功时返回 0,失败时返回负错误代码。

描述

将与 PCI 设备 pdev 关联的所有 PCI 区域标记为由所有者 res_name 保留。 除非此调用成功返回,否则不要访问 PCI 区域内的任何地址。

pci_request_regions_exclusive() 将标记该区域,以便不允许 /dev/mem 和 sysfs MMIO 访问。

成功时返回 0,或错误时返回 EBUSY。 失败时也会打印警告消息。

注意

这是一个“混合”函数:它通常是未管理的,但在提前调用 pcim_enable_device() 时变为托管。 此混合功能已弃用! 如果您需要托管清理,请改用 pcim_* 函数。

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 复制而来。版权归 Jes Sorensen 所有,1998-2001, <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

注意

这是一个“混合”函数:它通常是未管理的,但是当事先调用了 pcim_enable_device() 时,它变为受管理的。此混合功能已**弃用**!如果您想要受管理的清理,请改用 pcim_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 设备宽度能力。返回设备支持的最大链路宽度。

报告 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 bar

BAR 编号

unsigned long offset

在 BAR 中的给定偏移量处映射内存

unsigned long maxlen

要映射的最大内存长度

描述

使用此函数,您将获得指向设备 BAR 的 __iomem 地址。您可以使用 ioread*() 和 iowrite*() 访问它。这些函数隐藏了这是否是 MMIO 或 PIO 地址空间的细节,并且会以正确的方式执行您期望的操作。

maxlen 指定要映射的最大长度。如果您想从偏移量到末尾获取对整个 BAR 的访问权限,请在此处传递 0

注意

即使您使用 pcim_enable_device() 初始化,此函数也永远不受管理。

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 bar

BAR 编号

unsigned long offset

在 BAR 中的给定偏移量处映射内存

unsigned long maxlen

要映射的最大内存长度

描述

使用此函数,您将获得指向设备 BAR 的 __iomem 地址。您可以使用 ioread*() 和 iowrite*() 访问它。这些函数隐藏了这是否是 MMIO 或 PIO 地址空间的细节,并且会以正确的方式执行您期望的操作。如果可能,将使用写入组合。

maxlen 指定要映射的最大长度。如果您想从偏移量到末尾获取对整个 BAR 的访问权限,请在此处传递 0

注意

即使您使用 pcim_enable_device() 初始化,此函数也永远不受管理。

void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)

为 PCI BAR 创建虚拟映射 cookie

参数

struct pci_dev *dev

拥有 BAR 的 PCI 设备

int bar

BAR 编号

unsigned long maxlen

要映射的内存长度

描述

使用此函数,您将获得指向设备 BAR 的 __iomem 地址。您可以使用 ioread*() 和 iowrite*() 访问它。这些函数隐藏了这是否是 MMIO 或 PIO 地址空间的细节,并且会以正确的方式执行您期望的操作。

maxlen 指定要映射的最大长度。 如果您想访问完整的 BAR 而不先检查其长度,请在此处传递 0

注意

即使您使用 pcim_enable_device() 初始化,此函数也永远不会被管理。 如果您需要自动清理,请使用 pcim_iomap()

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 bar

BAR 编号

unsigned long maxlen

要映射的内存长度

描述

使用此函数,您将获得指向设备 BAR 的 __iomem 地址。您可以使用 ioread*() 和 iowrite*() 访问它。这些函数隐藏了这是否是 MMIO 或 PIO 地址空间的细节,并且会以正确的方式执行您期望的操作。如果可能,将使用写入组合。

maxlen 指定要映射的最大长度。 如果您想访问完整的 BAR 而不先检查其长度,请在此处传递 0

注意

即使您使用 pcim_enable_device() 初始化,此函数也永远不受管理。

int devm_pci_remap_iospace(struct device *dev, const struct resource *res, phys_addr_t phys_addr)

托管的 pci_remap_iospace()

参数

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 配置资源

参数

struct device *dev

用于处理资源的通用设备

struct resource *res

要处理的配置空间资源

描述

检查资源是否为有效的内存区域,请求内存区域,并使用 pci_remap_cfgspace() API 重新映射,以确保保证正确的 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()

参数

struct pci_dev *pdev

为其启用 MWI 的 PCI 设备

描述

托管的 pci_set_mwi()

返回

错误时返回合适的 -ERRNO 错误值,成功时返回零。

int pcim_enable_device(struct pci_dev *pdev)

托管的 pci_enable_device()

参数

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 maxlen

iomap 的最大长度

返回

成功时返回 __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

要取消映射的 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 pcim_iounmap_regions(struct pci_dev *pdev, int mask)

取消映射并释放 PCI BAR(已弃用)

参数

struct pci_dev *pdev

要映射 IO 资源的 PCI 设备

int mask

要取消映射和释放的 BAR 的掩码

描述

取消映射并释放由 mask 指定的区域。

此函数已弃用。请勿在新代码中使用。请改用 pcim_iounmap_region()

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 bar

BAR 的索引

unsigned long offset

从 BAR 开始的偏移量

unsigned long len

映射的字节长度

返回

成功时返回 __iomem 指针,失败时返回 IOMEM_ERR_PTR。

描述

在指定的 bar 内创建一个新的 IO 映射,范围从 offsetoffset + 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 vendor

PCI 供应商 ID

unsigned int device

PCI 设备 ID

unsigned int subvendor

PCI 子供应商 ID

unsigned int subdevice

PCI 子设备 ID

unsigned int class

PCI 类

unsigned int class_mask

PCI 类掩码

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 *owner

drv 的所有者模块

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 domain

PCI 设备所在的 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)

开始或继续按供应商/子供应商/设备/子设备 ID 搜索 PCI 设备

参数

unsigned int vendor

要匹配的 PCI 供应商 ID,或者 PCI_ANY_ID 以匹配所有供应商 ID

unsigned int device

要匹配的 PCI 设备 ID,或者 PCI_ANY_ID 以匹配所有设备 ID

unsigned int ss_vendor

要匹配的 PCI 子系统供应商 ID,或者 PCI_ANY_ID 以匹配所有供应商 ID

unsigned int ss_device

要匹配的 PCI 子系统设备 ID,或者 PCI_ANY_ID 以匹配所有设备 ID

struct pci_dev *from

在搜索中找到的上一个 PCI 设备,或者对于新搜索为 NULL

描述

遍历已知 PCI 设备的列表。如果找到一个 PCI 设备,其vendordevicess_vendorss_device 都匹配,则返回指向其设备结构的指针,并将该设备的引用计数加 1。否则,返回 NULL。通过传递 NULL 作为 from 参数来启动新的搜索。否则,如果 from 不为 NULL,则从全局列表中的下一个设备继续搜索。如果 from 不为 NULL,则其引用计数总是会递减。

struct pci_dev *pci_get_device(unsigned int vendor, unsigned int device, struct pci_dev *from)

根据 vendor/device id 开始或继续搜索 PCI 设备

参数

unsigned int vendor

要匹配的 PCI 供应商 ID,或者 PCI_ANY_ID 以匹配所有供应商 ID

unsigned int device

要匹配的 PCI 设备 ID,或者 PCI_ANY_ID 以匹配所有设备 ID

struct pci_dev *from

在搜索中找到的上一个 PCI 设备,或者对于新搜索为 NULL

描述

遍历已知 PCI 设备的列表。如果找到一个 PCI 设备,其 vendordevice 匹配,则该设备的引用计数将增加,并返回指向其设备结构的指针。否则,返回 NULL。通过传递 NULL 作为 from 参数来启动新的搜索。否则,如果 from 不为 NULL,则从全局列表中的下一个设备继续搜索。如果 from 不为 NULL,则其引用计数总是会递减。

struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from)

根据 class 开始或继续搜索 PCI 设备

参数

unsigned int class

搜索具有此 class 指定的 PCI 设备

struct pci_dev *from

在搜索中找到的上一个 PCI 设备,或者对于新搜索为 NULL

描述

遍历已知 PCI 设备的列表。如果找到一个 PCI 设备,其 class 匹配,则该设备的引用计数将增加,并返回指向其设备结构的指针。否则,返回 NULL。通过传递 NULL 作为 from 参数来启动新的搜索。否则,如果 from 不为 NULL,则从全局列表中的下一个设备继续搜索。如果 from 不为 NULL,则其引用计数总是会递减。

struct pci_dev *pci_get_base_class(unsigned int class, struct pci_dev *from)

仅通过与基本 class 代码匹配来搜索 PCI 设备

参数

unsigned int class

搜索具有此基本 class 代码的 PCI 设备

struct pci_dev *from

在搜索中找到的上一个 PCI 设备,或者对于新搜索为 NULL

描述

遍历已知 PCI 设备的列表。如果找到一个 PCI 设备,其基本 class 代码匹配,则该设备的引用计数将增加。请参阅 pci_match_one_device() 以了解其工作原理。通过传递 NULL 作为 from 参数来启动新的搜索。否则,如果 from 不为 NULL,则从全局列表中的下一个设备继续搜索。如果 from 不为 NULL,则其引用计数总是会递减。

返回

指向匹配的 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 设备类型。

描述

显而易见的事实:您没有对此函数可能找到的任何设备的引用,因此,如果该设备在此函数完成后立即从系统中移除,则该值将失效。使用此函数查找通常内置于系统中的设备,或者用于大致了解此时此刻是否碰巧存在其他设备。

void pci_msi_mask_irq(struct irq_data *data)

用于屏蔽 PCI/MSI 中断的通用 IRQ 芯片回调

参数

struct irq_data *data

指向与该中断关联的 irqdata 的指针

void pci_msi_unmask_irq(struct irq_data *data)

用于取消屏蔽 PCI/MSI 中断的通用 IRQ 芯片回调

参数

struct irq_data *data

指向与该中断关联的 irqdata 的指针

int pci_msi_vec_count(struct pci_dev *dev)

返回设备可以发送的 MSI 向量的数量

参数

struct pci_dev *dev

要报告的设备

描述

此函数返回设备通过多消息功能寄存器请求的 MSI 向量数量。如果设备无法发送 MSI 中断,则返回负的 errno。否则,调用成功并根据 MSI 规范返回 2 的幂,最大值为 2^5 (32)。

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 *bus

PCI 总线

struct resource *res

要分配的资源

resource_size_t size

要分配的资源大小

resource_size_t align

要分配的资源的对齐方式

resource_size_t min

要分配的最小 /proc/iomem 地址

unsigned long type_mask

IORESOURCE_* 类型标志

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 *bus

pci 总线结构体

struct pci_ops *ops

新的原始操作

描述

返回之前的原始操作

void pci_cfg_access_lock(struct pci_dev *dev)

锁定 PCI 配置的读/写

参数

struct pci_dev *dev

pci 设备结构体

描述

当访问被锁定时,任何用户空间对配置空间的读写和并发锁定请求都将休眠,直到通过 pci_cfg_access_unlock() 再次允许访问。

bool pci_cfg_access_trylock(struct pci_dev *dev)

尝试锁定 PCI 配置的读/写

参数

struct pci_dev *dev

pci 设备结构体

描述

与 pci_cfg_access_lock 相同,但如果访问已被锁定,则返回 0,否则返回 1。此函数可以从原子上下文中调用。

void pci_cfg_access_unlock(struct pci_dev *dev)

解锁 PCI 配置的读/写

参数

struct pci_dev *dev

pci 设备结构体

描述

此函数允许 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 *fmt

命名处理程序的 Printf 式格式字符串

...

可变参数

描述

此调用会分配中断资源并启用中断线和 IRQ 处理。从发出此调用的那一刻起,可能会调用 handlerthread_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 *dev

PCI 设备

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_nr

PCI_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_busslot_nr 元组唯一标识。

已知存在固件损坏的平台,会将相同的名称分配给多个插槽。通过代表调用者重命名插槽来解决这些损坏的平台。如果固件将名称 N 分配给多个插槽

第一个插槽分配 N,第二个插槽分配 N-1,第三个插槽分配 N-2 等。

占位符插槽:在大多数情况下,pci_busslot_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,并让我们的释放方法完成其余的工作。

创建指向热插拔驱动程序模块的符号链接

参数

struct pci_slot *pci_slot

struct pci_slot

描述

pci_hotplug_core.c 的帮助函数,用于创建指向热插拔驱动程序模块的符号链接。

删除指向热插拔驱动程序模块的符号链接。

参数

struct pci_slot *pci_slot

struct pci_slot

描述

pci_hotplug_core.c 的帮助函数,用于删除指向热插拔驱动程序模块的符号链接。

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 *dev

VF 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 *dev

PCI 设备

int nr_virtfn

要启用的虚拟功能的数量

描述

成功时返回 0,失败时返回负数。

void pci_disable_sriov(struct pci_dev *dev)

禁用 SR-IOV 功能

参数

struct pci_dev *dev

PCI 设备

int pci_num_vf(struct pci_dev *dev)

返回与 PF 设备关联的 VF 数量 device_release_driver

参数

struct pci_dev *dev

PCI 设备

描述

返回 VF 的数量,如果未启用 SR-IOV,则返回 0。

int pci_vfs_assigned(struct pci_dev *dev)

返回分配给客户机的 VF 数量

参数

struct pci_dev *dev

PCI 设备

描述

返回属于此设备且分配给客户机的 VF 数量。如果设备不是物理功能,则返回 0。

int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs)
  • 减少可用的 TotalVFs

参数

struct pci_dev *dev

PCI 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 *dev

PCI PF 设备

描述

对于支持 SRIOV 的 PCIe 设备,返回 TotalVFs 的 PCIe SRIOV 功能值,或者如果驱动程序减少了该值,则返回 driver_max_VFs 的值。否则返回 0。

int pci_sriov_configure_simple(struct pci_dev *dev, int nr_virtfn)

用于配置 SR-IOV 的助手函数

参数

struct pci_dev *dev

PCI 设备

int nr_virtfn

要启用的虚拟功能数量,禁用则为 0

描述

为在启用 SR-IOV 之前不需要任何 PF 设置的设备启用或禁用 SR-IOV。错误时返回负值,成功时返回分配的 VF 数量。

ssize_t pci_read_legacy_io(struct file *filp, struct kobject *kobj, struct bin_attribute *bin_attr, char *buf, loff_t off, size_t count)

从旧式 I/O 端口空间读取字节

参数

struct file *filp

打开 sysfs 文件

struct kobject *kobj

要读取的文件的 kobject

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, struct bin_attribute *bin_attr, char *buf, loff_t off, size_t count)

将字节写入旧式 I/O 端口空间

参数

struct file *filp

打开 sysfs 文件

struct kobject *kobj

要读取的文件的 kobject

struct bin_attribute *bin_attr

此文件的 struct bin_attribute

char *buf

包含要写入的值的缓冲区

loff_t off

旧式 I/O 端口空间中的偏移量

size_t count

要写入的字节数

描述

使用特定于架构的回调例程 (pci_legacy_write) 从旧式 I/O 端口空间写入 1、2 或 4 个字节。

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)

调整旧式文件属性

参数

struct pci_bus *b

要在其下创建文件的总线

enum pci_mmap_state mmap_type

I/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_combine

1 表示写入合并映射

描述

使用常规 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, struct bin_attribute *bin_attr, char *buf, loff_t off, size_t count)

用于启用对 PCI ROM 显示的访问

参数

struct file *filp

sysfs 文件

struct kobject *kobj

内核对象句柄

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, struct bin_attribute *bin_attr, char *buf, loff_t off, size_t count)

读取 PCI ROM

参数

struct file *filp

sysfs 文件

struct kobject *kobj

内核对象句柄

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

应该释放其条目的设备

描述

pdev 从 sysfs 中移除时进行清理。

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 *pdev

PCI 设备

enum tph_mem_type mem_type

目标内存类型(易失性或持久性 RAM)

unsigned int cpu_uid

关联的 CPU ID

u16 *tag

要返回的引导标签

描述

返回与 cpu_uid 指示的特定 CPU 关联的目标内存的引导标签。

返回

成功时为 0,否则为负值 (-errno)

int pcie_tph_set_st_entry(struct pci_dev *pdev, unsigned int index, u16 tag)

在 ST 表条目中设置引导标签

参数

struct pci_dev *pdev

PCI 设备

unsigned int index

ST 表条目索引

u16 tag

要写入的引导标签

描述

找出 ST 表的正确位置(在 MSI-X 表中或在 TPH 扩展能力空间中),并将引导标签写入 index 指向的 ST 条目中。

返回

成功时为 0,否则为负值 (-errno)

void pcie_disable_tph(struct pci_dev *pdev)

关闭设备的 TPH 支持

参数

struct pci_dev *pdev

PCI 设备

返回

int pcie_enable_tph(struct pci_dev *pdev, int mode)

使用特定的 ST 模式启用设备的 TPH 支持

参数

struct pci_dev *pdev

PCI 设备

int mode

要启用的 ST 模式。当前支持的模式包括

  • PCI_TPH_ST_NS_MODE:无 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 热插拔子系统取消注册热插拔插槽。

参数

struct hotplug_slot *slot

指向要取消注册的struct hotplug_slot的指针。

描述

slot 必须先通过调用 pci_hp_register() 向 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 回调。