pcie slot的再理解:代表最小的功能。在物理上小于等于endpoint

本文详细介绍了PCI Express (PCIe) 设备如何通过CONFIG_ADDRESS寄存器进行定位,包括各字段的作用及意义,并展示了Linux内核中用于查询特定PCIe设备的函数实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从下面的说明可以看到要定位一个pcie设别必须是domian:bus:device:fn
CONFIG_ADDRESS寄存器格式:
         31 位:Enabled位。
        23:16 位:总线编号。
        15:11 位:设备编号。
        10: 8 位:功能编号。
         7: 2 位:配置空间寄存器编号。
         1: 0 位:恒为“00”。
其中device占用5个bit,功能编号占用3个bit。在kernel中常常将设别编号和功能编号这8个bit合起来成为devfn,这样每个devfn就代表一个有具体功能的pcie设备
这样就可以通过下面这个函数来查找这种最小功能的pcie设备
struct pci_dev *pci_get_slot(struct pci_bus *bus, unsigned int devfn)
{
    struct pci_dev *dev;

    WARN_ON(in_interrupt());
    down_read(&pci_bus_sem);

    list_for_each_entry(dev, &bus->devices, bus_list) {
        if (dev->devfn == devfn)
            goto out;
    }

    dev = NULL;
 out:
    pci_dev_get(dev);
    up_read(&pci_bus_sem);
    return dev;
}
可以看到所有的devfn都是挂在bus->devices 这个列表中的
同样如果给定domain/bus/devfn 就可以找到这个pci_dev
struct pci_dev *pci_get_domain_bus_and_slot(int domain, unsigned int bus,
                        unsigned int devfn)
{
    struct pci_dev *dev = NULL;

    for_each_pci_dev(dev) {
        if (pci_domain_nr(dev->bus) == domain &&
            (dev->bus->number == bus && dev->devfn == devfn))
            return dev;
    }
    return NULL;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值