dmesg報錯:pci 0000:00:1c.0: BAR 15: failed to assign [mem size 0x00200000 64bit pref]
1)00:1c.0, 00:1c.1, 00:1c.2, 00:1c.3 裝置如下,為PCI橋裝置
2)以第一個PCI橋00:1c.0為例,從shell介面可以看到BIOS給其分配的memory地址為90600000~908fffff,進入系統後,dmesg看到:
系統要給00:1c.0分配的是另一段地址,而不是BIOS中的地址,但是分配失敗,如下圖:
3) 而BIOS中給00:1c.0的地址對應了bridge window [mem 0x90600000-0x908fffff]
,
從系統的記憶體分配上個可看到,這段地址實際上分配給了PCI匯流排0000:02:
4)從系統記憶體分配上看到
BIOS中00:1c.0地址對應PCI匯流排0000:01,上面的有乙太網絡裝置01:00.0;
BIOS中00:1c.1地址對應PCI匯流排0000:02,上面的有乙太網絡裝置02:00.0;
BIOS中00:1c.2地址對應PCI匯流排0000:03,上面的有Exar串列埠裝置03:00.0;
5)原來核心中 pci_assign_resource 分配記憶體失敗後,pci_setup_bridge會重新給其分配,如果 記錄了以下訊息“kernel: MEM window: fb700000-fb9fffff ”
,即可忽略“PCI: Failed to allocate mem resource"
訊息。
- 1 核心中找到drivers/pci/setup-bus.c 中
pdev_assign_resources_sorted包含
--> __assign_resources_sorted
-->> assign_requested_resources_sorted
-->>> pci_assign_resource
- 2 pci_assign_resource 在drivers/pci/setup-res.c中
pci_assign_resource 包含”BAR 15: no space for [mem size 0x00200000 64bit pref] BAR 15: failed to assign [mem size 0x00200000 64bit pref]” memory分配失敗
- 3 假如上面地址的失敗後,會繼續呼叫
pci_setup_bridge 包含
-->__pci_setup_bridge
列印“PCI bridge to [bus 02]
-->> pci_setup_bridge_io
列印“bridge window [io 0xc000-0xcfff]”
-->> pci_setup_bridge_mmio
列印“bridge window [mem 0x90600000-0x908fffff]”
分別表橋的IO和memory分配成功
即如果後面有
則可忽略前面的如下報錯
- 4 最後在系統中可以看到pci樹如下