普尔斯博系统控制器枢纽(US15W)中LPC总线的配置寄存器

11
我们有一个基于Atom Z510 / Intel SCH US15W Q7卡的系统(运行Debian Linux)。我们需要从Low Pin Count总线上的设备传输数据块。据我所知,这个芯片组不提供DMA功能,这意味着处理器必须通过软件循环逐字节读取数据。(如果我理解正确,设备驱动程序实际上使用“rep insb” x86指令来实现这一点,因此循环实际上是由CPU实现的。)
尽管每次对从设备的读取在560ns内完成,但我们只能以低于14Mb/s的速率进行传输,而且总线上的事务之间距离不得少于2us。我不认为总线上的其他流量有问题,但仍在调查。
我的问题是:

是否有人知道SCH上是否有任何配置寄存器可以影响LPC总线定时?

我在Intel网站上找不到有用的信息,也没有发现Linux Kernel代码中有任何调整这些寄存器的东西(但我在Linux Kernel方面还是个新手)。

我不是x86专家,因此任何可能影响或与该设备相关的其他因素或“战斗故事”也很重要。
编辑:我已经找到了datasheet。我没有在其中发现任何解释这种行为的东西,但我正在调查将我们的设备映射为固件设备的可能性,因为固件总线周期似乎没有遇到同样的延迟问题。

您还需要考虑从设备的硬件限制,即在按字节轮询时它可以提供数据的速度。 "寻道"可能会有一些延迟。由于我们没有进行任何突发I/O,因此每个字节读取都会添加这种“寻道延迟”。英特尔LPC接口规范的12.2节列出了LPC总线上各种外围设备的典型I/O性能概况。您能否分享一下您正在通过LPC总线通信的外围设备的详细信息?... - TheCodeArtist
该设备是一款Spartan 3 FPGA,作为ARCNET控制器芯片的桥梁。我们已经在逻辑分析仪上检查了读取周期,并且固件在同步部分注入了一个“短等待” - 将周期延长一个时钟 - 在这种情况下为40微秒。整个周期在14个时钟周期内完成 - 560微秒。FPGA无法阻止下一个周期的到来。 - sheddenizen
1个回答

1
记录一下,解决方案是修改FPGA固件,使芯片的数据输入/输出寄存器映射到四个相邻地址,并修改驱动程序以执行32位inb/outb指令。虽然SCH没有实现32位LPC读/写操作,但结果是4个连续的8位操作,后面跟着与之前单字节获取相同的死时间,这意味着平均每字节需要约1微秒。虽然不理想,但吞吐量增加了一倍。

事实证明,固件循环速度更快,因为SCH每次从固件闪存传输64个字节 - 64个字节后有相同的1.4微秒间隔,表明这是设备的每个事务延迟。利用这一点可能比上述解决方案稍微快一些,但折衷方案是它限于64字节块,每个字节需要更长时间(680纳秒,我记得)由于需要执行固件读取所需的额外周期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接