【问题标题】:Why do my PCI-e I/O register reads appear to be cached?为什么我的 PCI-e I/O 寄存器读取似乎被缓存了?
【发布时间】:2019-11-24 12:57:12
【问题描述】:

我有一个 PCI-e 硬件设备,它有许多我想要读取和写入的寄存器。但是,当我读取一个寄存器时,我会从前一次读取中获得一个值(第一次读取返回 0xFFFFFFFF)。

我正在使用 pci_iomap() 来获取 I/O 区域的基地址。我尝试使用 readl() 和 ioread32() 而不是我收到的原始代码中的直接指针取消引用。都给出相同的结果。

例如,如果寄存器 foo 包含 0xDEADBEEF,则第一次读取将返回 0xFFFFFFFF,而后续读取将返回 0xDEADBEEF。如果我然后读取寄存器bar,其中包含0xFEEDFACE,第一次读取将返回0xDEADBEEF,所有后续读取将返回0xFEEDFACE。

【问题讨论】:

  • 这听起来不像普通的缓存。另外,我认为 IO 设备访问通常总是未缓存的,至少在默认情况下是这样。您是否 100% 确定设备运行正常?
  • 您是否过快地读取寄存器?有些设备上的芯片速度较慢,因此您无法以全 CPU 速度读取它们,并且已公布了连续寄存器读取之间的最短时间。
  • 你正在从关闭的设备中读取,大概是在 D3cold 中。
  • 感谢您的回复,@ThomasJager。看起来这确实不是正常的缓存,你是对的。也许设备正在某处缓冲该值。硬件人员坚持说他不是,但我会让他再看一遍。正如您所说,I/O 操作应该始终是未缓存的。其他任何事情都没有意义。
  • 感谢您的回复,@1201ProgramAlarm。在这种情况下,它只是由用户空间程序中的用户操作触发 ioctl() 调用而触发的单个寄存器读取。应用程序一次读取的寄存器不超过一个。

标签: c linux io linux-device-driver pci-e


【解决方案1】:

如果您从用户代码中看到错误值,调用 ioctl() 并取回错误值,请查看驱动程序对 copy_from_user() 和 copy_to_user() 的使用。作为检查,您可以使用 printk() 或更好的 dev_dbg() 来打印驱动程序看到的寄存器地址和值。

【讨论】:

  • 谢谢。我看到内核空间中的“陈旧”值基于 printk() 调用来显示寄存器值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
相关资源
最近更新 更多