赞
踩
pcie 设备是通过一种树状的方式连接在root port上,有时候需要知道自己连在哪个root port上就可以通过pcie_find_root_port来找到root port。
例如下例就是找到root port,然后判断root port是否支持aer功能
struct pci_dev *dev, *rpdev;
dev = pci_get_domain_bus_and_slot(einj->domain, einj->bus, devfn);
if (!dev)
return -ENODEV;
rpdev = pcie_find_root_port(dev);
if (!rpdev) {
dev_err(&dev->dev, "aer_inject: Root port not found\n");
ret = -ENODEV;
goto out_put;
}
rp_pos_cap_err = pci_find_ext_capability(rpdev, PCI_EXT_CAP_ID_ERR);
if (!rp_pos_cap_err) {
dev_err(&rpdev->dev,
"aer_inject: Root port doesn't support AER\n");
ret = -EPROTONOSUPPORT;
goto out_put;
}
继续看看pcie_find_root_port是如何找到root port的呢?
static inline struct pci_dev *pcie_find_root_port(struct pci_dev *dev)
{
while (1) {
if (!pci_is_pcie(dev))
break;
//原来就是一直往上回溯,知道找到root port后,返回root port
if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT)
return dev;
if (!dev->bus->self)
break;
dev = dev->bus->self;
}
return NULL;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。