【问题标题】:What about PCI mmio access alignment?PCI mmio 访问对齐呢?
【发布时间】:2017-10-26 01:15:31
【问题描述】:

我有一个关于访问 PCIe bar mmio 空间时对齐的基本问题。访问的地址是不是必须DW对齐,计数必须是DW对齐?

据我所知,TLB的地址字段忽略低2位,长度字段的单位也是DW。那么这是否意味着上述问题是Yes?否则 CPU 会处理 mmio 空间的未对齐访问吗?

我想知道以下访问是否非法: - 读取 (bar0) - readb(bar0 + 1) - readl(bar0+1)

PCIe 上会发生什么事务 总线是否发出未对齐的 mmio 访问?

【问题讨论】:

    标签: kernel memory-alignment pci


    【解决方案1】:

    如果您更深入地研究 TLP,您会发现它具有诸如首字节启用和末字节启用之类的字段。它们的目的是处理 DW 错位。每一个都显示了第一个和最后一个 DW 中的哪些字节被屏蔽掉了。最后字节启用仅用于大于 1 DW 的内存访问。

    例如: 如果您尝试在偏移量 0x3 处读取 1 个字节,它将被转换为在偏移量 0 处读取的 DW,第一个字节启用设置为 0x4(last_be 将为 0x0,因为它是 1 个 DW 访问)。完成数据然后应该屏蔽掉不必要的字节。

    另一个例子: 如果您尝试从偏移量 1 读取 1 个 DW,它将被转换为读取 2 个 DWord,其中 1st be 和 last 设置为忽略 1st DW 中的第 1 个字节和第 2 个 DW 中的最后 3 个字节。

    问候,
    马特乌斯。

    【讨论】:

    • 谢谢,对我帮助很大。对于示例 #2,我在我的电脑上进行了一些实验。如果跨 DWORD 边界读取,我会得到一些有趣的值,例如 readl(bar0+2)。对于某些设备,我得到第一个 DWORD 的循环移位值,而某些设备返回所有 FF。我通过 devmem2 工具读取了寄存器。这个结果是设计的还是只是设备无法处理 BE?似乎使用 BE 设备可以处理任何未对齐的访问。我对邮件列表的问题lkml.org/lkml/2017/5/28/89
    • 您确定返回所有 FF 的设备在读取其内存时不在 D3 中吗?
    • 我确定。由于读取对齐的地址,它返回正确的值,而不是 FF。一种尝试过的设备是英特尔集成 GPU。
    • 这很有趣。在这种情况下,我猜你需要咨询硬件提供商的行为。并且,如果可以附加一个,请使用一些 PCI 协议分析器查看 TLP,以充分了解总线上发生的情况。
    • 我手头没有 PCI 总线分析仪。当我找到一个时,我会尝试。
    猜你喜欢
    • 2019-02-07
    • 2017-10-02
    • 2010-11-07
    • 1970-01-01
    • 2016-02-14
    • 2013-10-21
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多