pci枚举初始化部分(2)

本文详细介绍了PCI设备初始化过程,包括判断PCIE设备是否支持雷电技术,修复特殊bug,设置command寄存器,以及根据不同头类型进行初始化。重点讲解了如何设置中断禁止位,获取设备信息,特别是对于ATA控制器的特殊设置和PCI-PCI桥的热插拔支持。

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

1.2.8判断pcie设备是否支持雷电技术

Intel具有一种基于Thunderbolt技术的PCIE变体,它结合了DisplayPort和PCIe协议,与Mini DisplayPort兼容。
Thunderbolt技术融合两种通信方法或者说协议,其中PCI Express用于数据传输,可以连接几乎任何类型的设备,DisplayPort用于显示,能同步传输1080p乃至超高清视频和最多八声道音频。
因此代码只在intel生产的设备中进行判别。
set_pcie_thunderbolt()

while ((vsec = pci_find_next_ext_capability(dev, vsec,
          PCI_EXT_CAP_ID_VNDR))) {
  pci_read_config_dword(dev, vsec + PCI_VNDR_HEADER, &header);

  /* Is the device part of a Thunderbolt controller? */
  //设备是否具有雷电控制器
  if (dev->vendor == PCI_VENDOR_ID_INTEL &&
      PCI_VNDR_HEADER_ID(header) == PCI_VSEC_ID_INTEL_TBT) {
   dev->is_thunderbolt = 1;
   return;
  }
 }

其中有

#define PCI_VNDR_HEADER_ID(x)   ((x) & 0xffff)
#define PCI_VSEC_ID_INTEL_TBT   0x1234  //雷电接口

1.2.9修复某些特殊的bug

对于某些bug,只存在于特定体系或设备,无法在此处进行列举,因此提供一个hook用于修复特殊设备的bug。而hook通过内核配置情况进行挂载。
pci_fixup_device()

//查找是否存在厂商号设备号相同的情况
for (; f < end; f++)
  if ((f->class == (u32) (dev->class >> f->class_shift) ||
       f->class == (u32) PCI_ANY_ID) &&
      (f->vendor == dev->vendor ||
       f->vendor == (u16) PCI_ANY_ID) &&
      (f->device == dev->device ||
       f->device == (u16) PCI_ANY_ID)) {
   void (*hook)(struct pci_dev *dev);

//获取hook函数指针,用于修复特定bug
#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
   hook = offset_to_ptr(&f->hook_offset);
#else
   hook = f->hook;
#endif
   calltime = fixup_debug_start(dev, hook);
   hook(dev);
   fixup_debug_report(dev, calltime, hook);
  }

其中hook可有由

#define DECLARE_PCI_FIXUP_CLASS_EARLY(vendor, device, class,    \
      class_shift, hook)    \
 DECLARE_PCI_FIXUP_SECTION(.pci_fixup_early,    \
  hook, vendor, device, class, class_shift, hook)

等宏进行挂载。

  • 举个例子
    arch\x86\pci
static void pci_early_fixup_cyrix_5530(struct pci_dev *dev)
{
 u8 r;
 /* clear 'F4 Video Configuration Trap' bit */
 pci_read_config_byte(dev, 0x42, &r);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值