0

对于 P2P BRIDGE,pciConfigTopoShow() 的输出中的“mem”和“preMem”是什么?

这是我的目标的输出......

[1,0,0] type=P2P BRIDGE to [2,0,0] base/limit:mem= 0xa0000000/0x9fffffff preMem=0x0000000080000000/0x00000000800fffff I/O= 0xe8000000/0xe7ffffff status=0x0010(CAP DEVSEL=0x0010)命令=0x0007(IO_ENABLE MEM_ENABLE MASTER_ENABLE)[2,1,0] 类型=P2P 桥接至 [3,0,0] 基本/限制:mem= 0xa0000000/0x9ffffffff preMem=0x0000000080000000/0x00000000800fffff00000= 0xeffff 状态=e (CAP DEVSEL=0) command=0x0007 (IO_ENABLE MEM_ENABLE MASTER_ENABLE) [3,0,0] type=P2P BRIDGE to [4,0,0] base/limit:mem= 0xa0000000/0x9fffffff preMem=0x80100000/0x800fffff I/O= 0x0000/0xffff status=0x0010 (CAP DEVSEL=0) command=0x0007 (IO_ENABLE MEM_ENABLE MASTER_ENABLE) bar0 在可预取的 64 位内存空间 @ 0x800

4

1 回答 1

0

“mem”和“preMem”值是由 pciConfigTopoShow() 函数通过多层函数调用产生的。“mem”是为桥映射的普通内存窗口,分别显示内存基数和内存限制,用“/”分隔。

如果设备支持,“preMem”用于可预取内存窗口,显示该设备的内存基础和内存限制。如果是 64 位机器,则这些值显示为 64 位数量。

最终,在文件 WIND_BASE/target/src/drv/pci/pciConfigShow.c 中找到的 pciConfigForeachShow() 函数会生成以下代码片段中与您的问题一起显示的输出:

if ( cmdReg & PCI_CMD_MEM_ENABLE )

{

     pciConfigInWord(bus,device,function,

                     PCI_CFG_MEM_BASE, &memBase);

     pciConfigInWord(bus,device,function,

                     PCI_CFG_MEM_LIMIT, &memLimit);

     printf("\tbase/limit:\n");

     printf("\t  mem=   0x%04x0000/0x%04xffff\n",

                 memBase & 0xfff0, memLimit | 0x000f);



     pciConfigInWord(bus,device,function,

                     PCI_CFG_PRE_MEM_BASE, &memBase);

     pciConfigInWord(bus,device,function,

                     PCI_CFG_PRE_MEM_LIMIT, &memLimit);

     if ( ( memBase & 0x000f ) == 0x0001 )

     {

         /* 64-bit memory */

         pciConfigInLong(bus,device,function,

                         PCI_CFG_PRE_MEM_BASE_U,

                         &memBaseU);

         pciConfigInLong(bus,device,function,

                         PCI_CFG_PRE_MEM_LIMIT_U,

                         &memLimitU);

         printf("\t  preMem=0x%08x%04x0000/"

                     "0x%08x%04xffff\n",

                      memBaseU, memBase & 0xfff0,

                      memLimitU, memLimit | 0x000f);

     }

     else

         printf("\t  preMem=0x%04x0000/0x%04xffff\n",

                     memBase & 0xfff0, memLimit | 0x000f);

     }
于 2012-09-11T13:56:44.563 回答