PCI quirks.c介绍

本文介绍如何通过在drivers/pci/quirks.c中注册函数来修复特定PCI设备的硬件问题。利用DECLARE_PCI_FIXUP_FINAL宏定义回调函数,当检测到指定供应商ID时,将触发这些函数执行。文章详细解释了不同阶段的回调函数及其执行时机。

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

  1. 在drivers/pci/quirks.c 中可以注册函数修复pcie的bug。例如  
  2. static void quirk_mellanox_tavor(struct pci_dev *dev)  
  3. {  
  4.     dev->broken_parity_status = 1;   /* This device gives false positives */  
  5. }  
  6. DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX, PCI_DEVICE_ID_MELLANOX_TAVOR_BRIDGE, quirk_mellanox_tavor);  
  7. 当在scan root port的时候发现vendor id是PCI_VENDOR_ID_MELLANOX的话,就会调用quirk_mellanox_tavor。  
  8. 从这里可以通过DECLARE_PCI_FIXUP_FINAL 来注册回调函数来修复硬件bug  
  9. 与之类似的函数还有很多,这些函数都定义在drivers/pci/pci.h 中  
  10.   
  11. #define DECLARE_PCI_FIXUP_CLASS_EARLY(vendor, device, class,        \  
  12.                      class_shift, hook)     \  
  13.     DECLARE_PCI_FIXUP_SECTION(.pci_fixup_early,         \  
  14.         hook, vendor, device, class, class_shift, hook)  
  15. #define DECLARE_PCI_FIXUP_CLASS_HEADER(vendor, device, class,       \  
  16.                      class_shift, hook)     \  
  17.     DECLARE_PCI_FIXUP_SECTION(.pci_fixup_header,            \  
  18.         hook, vendor, device, class, class_shift, hook)  
  19. #define DECLARE_PCI_FIXUP_CLASS_FINAL(vendor, device, class,        \  
  20.                      class_shift, hook)     \  
  21.     DECLARE_PCI_FIXUP_SECTION(.pci_fixup_final,         \  
  22.         hook, vendor, device, class, class_shift, hook)  
  23. 这些回调函数会在pcie 初始化的不同阶段执行,可以从下面看到,总共可以在pcie运行过程中总共有8个点可以执行quirk的回调函数  
  24.   
  25. enum pci_fixup_pass {  
  26.     pci_fixup_early,    /* Before probing BARs */  
  27.     pci_fixup_header,   /* After reading configuration header */  
  28.     pci_fixup_final,    /* Final phase of device fixups */  
  29.     pci_fixup_enable,   /* pci_enable_device() time */  
  30.     pci_fixup_resume,   /* pci_device_resume() */  
  31.     pci_fixup_suspend,  /* pci_device_suspend() */  
  32.     pci_fixup_resume_early, /* pci_device_resume_early() */  
  33.     pci_fixup_suspend_late, /* pci_device_suspend_late() */  
  34. };  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值