【总线】【PCI】【PCIe】【转】配置空间
PCI Express,是计算机总线PCI的一种,它沿用现有的PCI编程概念及通信标准,但建基于更快的串行通信系统;PCIE总线使用的是高速差分总线,并采用端到端的连接方式, 现在的高速总线基本上都是串行总线,这样可以使用更高的时钟频率。
PCIe采用的是树形拓扑结构, 它的体系架构一般由root complex,switch,endpoint等类型的PCIe设备组成
root complex: 根桥设备,是PCIe最重要的一个组成部件; root complex主要负责PCIe报文的解析和生成。RC接受来自CPU的IO指令,生成对应的PCIe报文,或者接受来自设备的PCIe TLP报文,解析数据传输给CPU或者内存。
switch: PCIe的转接器设备,目的是扩展PCIe总线。和PCI并行总线不同,PCIe的总线采用了高速差分总线,并采用端到端的连接方式, 因此在每一条PCIe链路中两端只能各连接一个设备, 如果需要挂载更多的PCIe设备,那就需要用到switch转接器。switch在linux下不可见,软件层面可以看到的是switch的上行口(upstream port, 靠近RC的那一侧)和下行口(downstream port)。
一般而言,一个switch 只有一个upstream port, 可以有多个downstream port.
lspci -tv命令可以显示pcie的总线拓扑,如上图所示, 一个PCIe设备的ID由以下几个部分组成:
以0000:00:00.0为例,分别对应PCI域,总线号,设备号,功能号
配置空间
PCI有三个相互独立的物理地址空间:memory地址空间、I/O地址空间和配置空间。这三个地址空间都是采用唯一的地址进行寻址,比如我们使用地址0x100时需要指定这个地址在哪个地址空间,配置空间,I/O地址空间和memory地址空间的0x100偏移,对应的是不同的存储位置。
PCIe spec规定了所有PCIe设备(除了host bus bridge外)必须实现配置空间,说白了就是PCI-SIG规定了一种独立于memory空间的PCIe设备访问(读写、配置)机制(说白了就是一堆按规则排列的reg)。PCI-SIG详细规定了PCIe设备reg的排列(每个capability id reg的后面4Byte会保存next capability的起始地址,这样方便芯片厂商扩展reg,并且PCIe驱动软件天然可以使用list来管理这些reg
————————————————
版权声明:本文为CSDN博主「linjiasen」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/linjiasen/article/details/87944672
我们可以读取配置空间获得设备的信息,也可以通过配置空间来配置设备,通过pci设备的id和配置空间的偏移地址, 软件可以来访问具体的寄存器。
PCIe设备的每一个功能(function)都对应一个独立的配置空间, pcie的配置空间布局如下:
CPU可以通过访问BAR地址读取PCIe的设备空间,但是我们需要读取到配置空间才能获取BAR,那么怎么访问PCIe的配置空间呢?
ARM使用ECAM的方式访问PCIe配置空间。ECAM是一个将配置空间映射到MEMORY空间的规则。硬件根据ECAM的方式将某个Memory空间映射给PCI配置空间,CPU访问对应的memory空间即可以操作PCIe配置空间。
————————————————
版权声明:本文为CSDN博主「Hober_yao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yhb1047818384/article/details/106676528
PCI/PCIE设备配置空间的访问方式----IO访问 & 内存访问
X86系统中,对PCIE设备配置空间的地址映射一般有两种方式:内存映射和IO映射。因此开发者也可以通过内存访问或者IO访问来访问其配置空间
PCIE设备的访问离不开其Bus,Dev,Fun的编号方式,如下图寄存器所示,Bit[23:16]用来存放Bus号,共8Bit,因此解释了上述表述为何一共有256条Bus,Bit[15:11]存放Dev,共5bit可存32个Dev,Bit[10:8]存放Bus,共3Bit可存8个Fun。这也就也是了为何上述PCIE设备数一共是256个Bus,32个Dev和8个Fun。
————————————————
版权声明:本文为CSDN博主「欢乐的鱼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Liang0528/article/details/120161547
CSDN-Ada助手: 恭喜作者发布了第18篇博客,内容涉及硬件统计采样PMU和SPE,非常有深度和技术含量!希望作者能够继续保持创作的热情和耐心,坚持分享自己的专业知识和经验。或许下一步可以考虑结合实际案例或者应用场景,让读者更好地理解和运用所学的内容。期待作者更多精彩的文章,加油!
CSDN-Ada助手: 感谢用户分享关于VCS编译命令的知识,这篇博客对我来说真的很有帮助。希望你能继续分享更多关于VCS的知识,比如VCS的常见问题解决方法或者VCS的高级用法等等。期待你的下一篇博客!
CSDN-Ada助手: 恭喜您撰写了第16篇博客!标题为“c++之深浅拷贝”,这是一个非常有趣且重要的主题。深浅拷贝在C++中是一个容易引起混淆的概念,您的博客将为读者提供清晰的解释和指导。 在接下来的创作中,我建议您可以探索更多与C++相关的主题。或许您可以考虑深入研究C++的多线程编程,或者是介绍C++中一些高级的语法和技巧。无论您选择哪个方向,我相信您的知识和经验将为读者带来很大的帮助。 再次恭喜您,期待您的下一篇博客!请继续努力创作,您的分享对于我们这些学习者来说是非常宝贵的。
CSDN-Ada助手: 恭喜您写完了第15篇博客《UVM框架的理解》!持续的创作展示了您对UVM框架的深入理解和研究。您的文章内容生动且富有见地,对读者来说是一次很好的学习体验。 在接下来的创作中,或许您可以考虑深入探讨UVM框架在实际项目中的应用案例,例如如何解决一些常见的挑战或优化测试环境等方面的内容。这将进一步丰富您的博客,并为读者提供更实用的指导。 希望您能够继续保持谦虚的态度并分享自己的经验,期待您未来更多精彩的创作!
CSDN-Ada助手: 恭喜作者撰写第13篇博客!标题为“AXI协议”,内容一定十分精彩。在这篇博客中,作者可能会详细介绍AXI协议的原理、应用以及其在系统设计中的重要性。接下来,我期待着作者能够继续分享更多关于协议的深入研究和实践经验。也许下一步,作者可以探讨一些AXI协议的实际应用案例,或者深入解析不同版本之间的差异和性能优化。再次感谢作者的分享,期待未来更多精彩的博客!