【问题标题】:ARM v7 cache behavior and usageARM v7 缓存行为和使用
【发布时间】:2021-05-03 16:22:18
【问题描述】:

我正在调整 u-boot 以支持 Cyclone V SX PCIe + NVMe。我通过对版本 2020.10 socfpga fork 的一系列 hack 使其工作。

我有两个问题需要解决:

  1. u-boot 似乎并不理解 PCI 地址空间和主机地址空间不一定相同,当 nvme 获取分配给 PCIe 端口的地址时,PCI 驱动程序假定读取的地址直接映射到 main记忆。它没有。它完全映射到另一个地址。我有一个黑客来处理这个问题。我将尝试向 u-boot 中的设备树实用程序添加一项功能,以在不破坏现有功能的情况下进行地址转换。

  2. 在 NVMe 执行命令后,nvme 驱动程序处理清除和无效缓存以获取对内存的更改的方式存在重大问题。门铃寄存器需要在轮询期间在传出时清除并在传入时无效,也就是说,在各种方面几乎完全错误。

这是我需要指导的地方。

u-boot 中有两段代码用于处理缓存清除/失效。一个是arm v7核心代码的一部分,另一个是pl310控制器代码。 arm v7 代码认为缓存行是 64 字节,pl310 代码认为缓存行是 32 字节。怎么回事?

nvme 代码正在使用这两个代码。我认为清除通过 pl310,无效通过 arm v7,但我可能在这一点上倒退了,我还在学习,很容易把它们混在一起。

nvme 驱动程序的问题很简单:它要求清除未缓存对齐的地址范围,并且两个代码都阻塞并做错了事情,最终不会清除或使需要清除的缓存无效并作废。在 pl310 的情况下,它对起始地址进行四舍五入并且不做任何事情,在 arm v7 代码的情况下,如果开始和停止,在将它们对齐到 64 字节边界后,是相同的,代码确实什么都没有。

我通过在 nvme 代码中强制对齐到 64 个字节并确保它通过在停止位置添加一个来清除缓存(如果它与 arm v7 调用的情况下的开始相同)来解决这个问题。

如果你还在关注我。谢谢,非常感谢。

解决此问题的正确方法是什么。这些代码都不是我的。在我看来,缓存代码中存在错误。 pl310 不应该在起始地址上加一,也许它应该在停止地址上加一,这取决于 for 循环的编写方式。用于在 arm v7 代码中失效的 for 循环应至少运行一次,以确保它清除起始位置。所以无效循环应该是

如果有人感兴趣,我可以发布此代码,请告诉我。

但最大的问题是:为什么有两种方法可以清除/使缓存无效,为什么两者都被使用?在我看来,由于 Cyclone V 使用 pl310 缓存控制器,它的代码应该用于清除和无效。这是通过#define 配置的,用于确定调用哪个代码,并且告诉我这也应该修复。

意见?选项?想法?

我很开放,请告诉我你的想法。

【问题讨论】:

    标签: caching u-boot pci nvme


    【解决方案1】:

    由于您使用的是基于 v2020.10 的内容,因此您在此处缺少所有与缓存相关的更改:https://source.denx.de/u-boot/u-boot/-/commit/d0c04926cd054cf7360ec15913ac17a465f32603

    至于你提出的其余内容,如果是正确的论坛,请务必抄送 U-Boot 邮件列表,并确保抄送之前从事过代码工作的相关人员。 scripts/get_maintainer.pl 工具将对此有所帮助。

    【讨论】:

    • 感谢汤姆的回复。我在邮件列表中并发送了两封电子邮件,但他们从未通过审核 AFAIK。我不知道抄送作者。接下来我一定会尝试的。
    • 其实我之前也发现了这些变化,但是 pci 代码自 2020.10 以来已经发生了很大变化,而且由于 socfpga 补丁集还没有适配到 2021.04,所以我无法让那个版本工作.我试图自己带来补丁,但是......一个简单的方法导致代码损坏。我决定等待 socfpga 维护者更新它。
    猜你喜欢
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 1970-01-01
    • 2017-11-09
    相关资源
    最近更新 更多