This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] XIO2001:帮助确定 Dell 7090台式机上的慢速内存映射 I/O

Guru**** 2537090 points
Other Parts Discussed in Thread: XIO2001

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1061473/xio2001-help-figuring-out-slow-memory-mapped-i-o-on-a-dell-7090-desktop

器件型号:XIO2001

您好!

我们希望 TI 的工程师能够帮助我们了解 XIO2001 PCIe 转 PCI 桥 接器在特定戴尔台式机上运行缓慢的原因。

为了进行比较、以下是 使用存储器映射 I/O 的一些32位读取时间:

  • Dell XE2:2至5us
  • Dell 7090:49至64 us

遗憾的是、Dell XE2现已停产、因此我们将测试 Dell 7090作为可能的更换产品(当我们在测试期间遇到此问题时)。

这两种台式机都使用相同的 PCIe 转 PCI 桥接器、即德州仪器(TI) XIO2001 PCI Express 转 PCI 桥接器(0x104c:0x8240)。

我希望 BIOS 只是在 Dell 7090上不正确地配置网桥、但我不确定情况是否如此、并希望获得有关如何查找 Dell 7090延迟原因的指导。

我快速查看了 XIO2001数据表、它已经在我的脑海中出现了。 似乎有各种时钟速度(从25MHz 到66MHz)可根据硬接线引脚进行配置。 尽管如此、我不确定如何查询器件以查看使用的频率(或确定 I/O 为何在一台 PC 上速度快、而在另一台 PC 上速度慢)。 如果我知道 BIOS 配置有问题、我可以向戴尔申请验证并要求 BIOS 修复。 如果最终戴尔在戴尔7090上错误地连接了 XIO2001,则我们只需查找此系统的另一个桌面。

我们在 QNX 和 Linux 中都看到了这一点。

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Devin、

    增加响应时间的唯一方法是通过 BIOS 或 PCB 上的不同时钟配置。 然而,我相信,必须有理由减慢回应时间。 即使我们知道确切的原因、如果我们加快响应速度、也可能会产生其他负面副作用。   

    此致、、Nasser

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这种较大的差异不是由不同的时钟引起的、而是由影响缓存、预取或突发等内容的配置更改引起的。

    请在两台计算机上显示 XIO2001和 PCI 设备的 lspci -vv 输出。

    您的设备驱动程序是否更改了任何 XiO 配置寄存器? 器件驱动程序如何映射 MMIO 存储器范围?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Nasser、

    我不赞同。 具有相同桥接器的 Dell XE2的传输速度显著加快、而不会产生任何明显的负面影响。

    谢谢、

    Devin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Clemens、

    我们的设备驱动程序不会更改任何 XiO 配置寄存器。

    MMIO 在 XE2和7090上的映射方式与测试代码中的映射方式相同:

    //------------------------------

    int fd = open ("/dev/mem、O_RDWR);

    volatile unsigned int * ioBase =(unsigned int *) mmap (0、4、PROT_read | PROT_WRITE、

                             map_shared、fd、(off_t)(bar0 + 0x1000);// DT330_status 位于0x1000

    //------------------------------

    我可以看到 XE2和7090之间的配置存在差异、尽管我不知道影响是什么、或者它们是否会解释速度差异。

    XE2 (2至5us 32位读取):
    ------------------------
    Ubuntu@Ubuntu:~$ lspci -vv -P -PP -nn

    00:1c.1/03:00.0 PCI 桥[0604]:德州仪器(TI) XIO2001 PCI Express 至 PCI 桥[104C:82240](prog-if 00 [正常解码])
    控制:I/O+ Mem+ Busmaster+ Spectroycle- MemWINV- VGASnoop- ParErr- Stepping - SERR- FastB2B- DisINTx-
    状态:CAP+ 66MHz - UDF- FastB2B- ParErr- DEVSEL=FAST > TABORT-<TAbort- SERR-<PERR- INTx-
    延迟:0、缓存行大小:64字节
    总线:primary=03、secondary =04、subordinate=04、sec-latiter=32
    桥后的 I/O:[禁用]
    桥后存储器:f7b00000-f7bffff [size=1M]
    桥后可预取存储器:[禁用]
    次要状态:66MHz FastB2B+ ParErr- DEVSEL=medium >TAbort-<TAbort- <MAbort+ <SERR- <PERR-
    BridgeCtl:奇偶校验- SERR+ NoISA- VGA- VGA16+ Mbort->重置- FastB2B-
    PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREN-
    功能:

    Ubuntu@Ubuntu:~$ sudo lspci -d 0x104c:0x8240 -xxx
    03:00.0 PCI 桥接器:德州仪器 XIO2001 PCI Express 至 PCI 桥接器
    00:4C 10 40 82 07 00 10 00 00 04 06 10 00 01 00
    10:00 00 00 00 00 00 00 03 04 04 20 F1 01 a0 22
    20:B0 F7 b0 F7 F1 ff 01 00 00 00 00 00 00 00 00 00
    30:00 00 00 40 00 00 00 00 00 00 00 00 00 00 ff 00 12 00
    40:0D 48 00 28 10 C1 05 01 50 03 06 08 00 40 00
    50:05 70 88 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    60:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    70:10 00 72 00 02 80 90 05 00 20 19 00 11 3c 06 00
    80:40 01 11 10 00 00 00 00 00 00 00 00 00 00 00
    90:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    A0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    B0:00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00
    C0:01 00 03 08 01 12 00 20 14 32 00 00 00 00
    D0:28 10 C1 05 5F 02 00 86 00 00 40 00 00 00
    E0:00 00 00 00 00 00 00 43 04 08 00 7f 00 c0 01
    F0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    ------------------------

    7090 (49至64us 32位读取):
    ------------------------
    Ubuntu@Ubuntu:~$ lspci -vv -P -PP -nn

    00:1c.0/01:00.0 PCI 桥[0604]:德州仪器(TI) XIO2001 PCI Express 至 PCI 桥[104C:8240](prog-if 00 [正常解码])
    控制:I/O+ Mem+ Busmaster+ Spectroycle- MemWINV- VGASnoop- ParErr- Stepping - SERR- FastB2B- DisINTx-
    状态:CAP+ 66MHz - UDF- FastB2B- ParErr- DEVSEL=FAST > TABORT-<TAbort- SERR-<PERR- INTx-
    延迟:0
    总线:primary=01、secondary =02、subordinate=02、sec-latiter=0
    桥后的 I/O:[禁用]
    桥后内存:71400000-714ffff [size=1M]
    桥后可预取存储器:[禁用]
    次要状态:66MHz FastB2B+ ParErr- DEVSEL=medium >TAbort-<TAbort- <MAbort+ <SERR- <PERR-
    BridgeCtl:奇偶校验- SERR+ NoISA- VGA-VGA16- Mbort->重置- FastB2B-
    PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREN-
    功能:

    Ubuntu@Ubuntu:~$ sudo lspci -d 0x104c:0x8240 -xxx
    02:00.0 PCI 桥接器:德州仪器 XIO2001 PCI Express 至 PCI 桥接器
    00:4C 10 40 82 07 00 10 00 00 04 06 00 01 00
    10:00 00 00 00 00 00 00 02 03 03 00 F1 01 a0 22
    20:d0 70 d0 70 f1 ff 01 00 00 00 00 00 00 00 00 00 00
    30:00 00 00 40 00 00 00 00 00 00 00 00 00 00 ff 00 02 00
    40:0D 48 00 00 00 00 00 01 50 03 06 08 00 40 00
    50:05 70 88 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    60:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    70:10 00 72 00 02 80 90 05 20 19 00 11 3c 06 00
    80:42 01 11 10 00 00 00 00 00 00 00 00 00 00 00 00
    90:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    A0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    B0:00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00
    C0:01 00 02 08 01 12 00 20 14 32 00 00 00 00
    D0:00 00 00 5F 02 00 86 00 00 00 40 00 00
    E0:00 00 00 00 00 00 00 43 04 08 00 7f 00 c0 01
    F0:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    ------------------------

    谢谢、

    Devin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我在 Google 电子表格中绘制了配置空间的差异。 我应该能够运行下面列出的命令以使7090配置空间与 XE2配置空间相匹配。

    我的问题是:

    1) 1)在哪里可以找到有关这些配置空间寄存器用途的更多信息?

    2) 2)这些是所有标准的"PCI 配置"空间、还是有一些 XIO2001所独有的空间?

    3) 3)是否有任何我不应该运行的内容? 例如、如果 bar 存储在0x10和0x28之间、那么我应该排除这些值吗?

    4) 4)我是否应该检查其他内容(超出 lspci -xxx 涵盖的范围)?

    5) 5)这里是否有任何内容可以解释速度差异(或者类似地、前面列出的任何 lspci 输出是否可以解释速度差异?

    sudo setpci -v -s 02:00.0 0C.w=0x10

    sudo setpci -v -s 02:00.0 18.w=0x03
    sudo setpci -v -s 02:00.0 19.w=0x04
    sudo setpci -v -s 02:00.0 1a.w=0x04
    sudo setpci -v -s 02:00.0 1b.w=0x20

    sudo setpci -v -s 02:00.0 20.w=b0
    sudo setpci -v -s 02:00.0 21.w=0xf7
    sudo setpci -v -s 02:00.0 22.w=b0
    sudo setpci -v -s 02:00.0 23.w=0xf7

    sudo setpci -v -s 02:00.0 3e.w=0x12

    sudo setpci -v -s 02:00.0 44.w=0x28
    sudo setpci -v -s 02:00.0 45.w=0x10
    sudo setpci -v -s 02:00.0 46.w=0xc1
    sudo setpci -v -s 02:00.0 47.w=0x05

    sudo setpci -v -s 02:00.0 78.w=0x00

    sudo setpci -v -s 02:00.0 80.w=0x40

    sudo setpci -v -s 02:00.0 C3.w=0x03

    sudo setpci -v -s 02:00.0 d0.w=0x28
    sudo setpci -v -s 02:00.0 d1.w=0x10
    sudo setpci -v -s 02:00.0 d2.w=0xc1
    sudo setpci -v -s 02:00.0 D3.w=0x05

    谢谢、

    Devin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您未显示实际 PCI 设备的配置空间。 但我想它具有单个范围的不可高速缓冲存储器。

    请勿更改总线编号或存储器地址。

    某些寄存器在 PCI(e)规范中定义;某些寄存器特定于 XIO2001。

    请注意、要写入字节、您不能使用.w、而是.b.

    0C:只有在写入整个缓存行时、缓存行大小才会起作用。

    3e:仅对旧 VGA 卡很重要;忽略它。

    44/D0:子系统 ID:识别主板;忽略它。

    78:最大有效载荷大小仅对缓存的读取/写入至关重要。

    80:bit 0/1启用电源管理;这实际上会有所不同。 我想 BIOS 中的 ASPM 设置会影响这一点。

    C3:只读

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Clemens、

    PCI 设备本身在 XE2和7090之间具有相同的配置空间设置(其内存地址除外)。 因此我认为不值得将这些数据转储到这里(尽管我应该提到它们是相同的、抱歉)。

    我刚刚尝试将 XIO2001上0x80处的寄存器从0x42更改为0x40、并且... 很不错!

    在 Linux 中、7090上进行32位读取的时间已降至7us!

    在哪里可以找到0x80处的寄存器的更多信息? 这是 XIO2001特有的吗?

    我将回顾 BIOS 的一般节能功能。 不过、它目前应设置为"最高性能"、但我将确认这一点。 我知道对于 PCI 设置、只有一个设置可用于启用或禁用 PCI 端口。

    我将在 QNX 中使用我们的实时应用程序尝试此操作、但在 Linux 中、这看起来非常有希望。

    非常感谢您花时间查看我的问题并提供一些指导。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您不想更改软件、最好在 BIOS 中设置此项。 7090《维修手册》指出、可以在系统设置选项/电源/活动状态电源管理中找到该设置

    ASPM 由 PCIe 规范定义;另请参阅 en.wikipedia.org/wiki/Active_State_Power_Management。 在 Linux 中、您可以使用 PCIe_ASPM 内核参数对其进行更改。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Clemens、

    遗憾的是、此 BIOS 设置不起作用。 但这很可能是戴尔 BIOS 中的错误。

    您找到的设置有三种可能的设置:自动、禁用和仅 L1。 我刚刚尝试了所有三个设置、并确认对于所有这三个设置、XIO2001的0x80仍然是0x42。 如果任何 BIOS 选项将0x80值更改为0x40、那么这可能是一个合适的解决方案。

    我尝试通过他们的社区论坛与戴尔联系,但遇到的困难比帮助还要多。 我将了解我是否可以通过其他渠道联系戴尔的帮助人员。

    同时、我想尝试在启动期间在我们的系统上运行的单独软件中手动写入0x40到0x80。 如果这可以为我们解决问题、我将乐意接受此问题作为答案(并继续推动戴尔以 BIOS 更新并行解决此问题)。

    如果您在 BIOS 中看到您希望我尝试的任何其他选项、请告诉我。 不过、您发现的这一个看起来应该是正确的选择。 我正在使用的7090也应用了最新的 BIOS。

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Clemens、

    0x80是 XIO2001所独有的、还是需要所有 PCI 桥接器来实现它? 是否有我可以查看的 XIO2001数据表、或 PCIe 规范的0x80部分?

    要确保禁用 ASPM,清除0x2是否足够? 还是我们还应该在0x80中检查和清除其他位? ASPM L1为0x2吗? ASPM L0是否有位?

    我想对此进行内部修复、通常应用于所有 PCI 桥接器(06类、04类、00类)。 但是、如果0x80是 XIO2001的唯一位、那么如果其他 PCI 桥接器上的位与禁用 ASPM 不对应、我不想清除这些位。

    此外、0x10不应该是 PCIe 链路控制寄存器、而应该是0x80?

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Clemens、

    我已经掌握了 PCIe 规范、这是有道理的。 以前我只使用 PCI 设备。 PCIe 使用功能指针指向功能列表、因此我需要遍历该列表以查找功能、然后将该功能中的偏移量添加到链路控制寄存器。

    感谢你的帮助。 我应该能够为这个问题找到一个通用的解决方案。

    太糟糕了、戴尔在 BIOS 中对解决此问题没有帮助。 ASPM 设置无法禁用 ASPM。

    谢谢