1. 程式人生 > >dmesg報錯:pci 0000:00:1c.0: BAR 15: failed to assign [mem size 0x00200000 64bit pref]

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橋裝置

image

2)以第一個PCI橋00:1c.0為例,從shell介面可以看到BIOS給其分配的memory地址為90600000~908fffff,進入系統後,dmesg看到:

image
系統要給00:1c.0分配的是另一段地址,而不是BIOS中的地址,但是分配失敗,如下圖:

image

3) 而BIOS中給00:1c.0的地址對應了bridge window [mem 0x90600000-0x908fffff]

從系統的記憶體分配上個可看到,這段地址實際上分配給了PCI匯流排0000:02:
image

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;
image

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樹如下