PCIe(Peripheral Component Interconnect Express)作为一种高速串行计算机扩展总线标准,已经成为现代计算系统中不可或缺的一部分。它不仅用于个人电脑和服务器,还广泛应用于嵌入式系统和数据中心。
因为项目需求对pcie进行功能调试,本文将以探讨PCIe的架构设计,包括Root Complex(RC)、Endpoint(EP)、Switch和Bridge的各个功能为主。此外,还将记述还将介绍如何在U-Boot环境中查看和管理PCIe设备。
Root Complex是PCIe拓扑结构的根节点,通常集成在主机处理器或芯片组中。它是整个PCIe总线的起点,负责管理整个PCIe拓扑结构中的所有设备。以下是RC的主要功能:
初始化和枚举:在系统启动时对所有连接的PCIe设备进行初始化和枚举,分配资源(如内存地址空间、中断号等)。
事务发起:RC可以作为请求者(Requester),发起对Endpoint设备的读写操作。
事务完成:RC作为完成者(Completer),处理来自Endpoint设备的完成消息。
配置管理:RC负责配置PCIe拓扑中的所有设备,包括设置设备的BAR(Base Address Register)等配置寄存器。
错误处理:RC负责处理PCIe总线上的错误消息和事件。
Endpoint是PCIe拓扑结构中的终端设备,位于树状结构的末端。它们是实际的外设,如显卡、网卡、SSD等。以下是EP的主要功能:
事务响应:EP作为目标设备(Target),响应来自RC或其他Endpoint的事务请求,执行读写操作。
中断生成:EP可以生成中断,通知RC或其他设备有事件发生。
数据传输:EP负责接收和发送数据,确保数据的正确传输。
配置响应:EP响应RC的配置请求,提供设备的配置信息。
Switch是一种更高级的设备,用于扩展PCIe总线的连接能力,允许多个设备通过单个PCIe端口连接到主机系统。以下是Switch的主要功能:
连接多个设备:允许多个设备通过单个PCIe总线连接到主机,从而扩展系统的连接性。
数据交换:在多个设备之间传输数据,允许设备之间直接通信而无需通过主机处理器。
动态分配:支持动态分配带宽和资源,根据需要调整设备之间的通信速率和优先级。
NTB技术:支持NTB(Non-Transparent Bridge)技术,允许两个或多个系统之间直接通信。
Peer to Peer通信:支持点对点通信,设备之间可以直接进行数据交换而无需通过主机。
虚拟化支持:支持多根IO虚拟化(MRIOV)和单根IO虚拟化(SRIOV),实现资源的灵活分配和管理。
Bridge是一种连接不同总线的设备,用于扩展PCIe拓扑结构。它通常用于连接不同类型的PCIe链路,例如将PCIe总线连接到传统的PCI或PCI-X总线。Bridge的主要功能包括:
连接不同链路:允许不同类型的PCIe设备连接在一起。
数据传输:在不同总线之间传输数据,确保数据的一致性和完整性。
地址转换:进行地址转换,确保数据包正确路由到目标设备。
配置管理:支持配置空间访问,允许操作系统和驱动程序配置Bridge设备。
在U-Boot中,可以使用pci
命令来查看和操作PCIe设备。以下是一些常用的子命令及其用法:
pci info
显示系统中所有PCI设备的信息,包括设备地址、设备ID、厂商ID等。
U-Boot> pci info
pci device
列出系统中所有PCI设备的设备地址和设备ID。
U-Boot> pci device
pci read
从指定的PCI设备上读取数据,需要指定设备地址、偏移地址、数据类型和数据长度。
U-Boot> pci read
pci write
向指定的PCI设备上写入数据,需要指定设备地址、偏移地址、数据类型和数据长度。
U-Boot> pci write
pci probe
探测系统中的PCI设备,并打印出所有找到的设备的信息。
U-Boot> pci probe
pci enum
枚举系统中的所有PCI设备,并打印出找到的设备的信息。
U-Boot> pci enum
使用pci d
命令可以查看PCI设备的配置空间信息。设备地址由总线号(bus number)、设备号(device number)和功能号(function number)组成。
例如,查看总线号为3的设备的配置空间信息:
U-Boot> pci d 03.00.00
执行该命令后,U-Boot将显示与该设备相关的详细信息,如厂商ID、设备ID、设备类别等。
可以通过pci
命令加上总线号来查看PCIe控制器情况以及扫到的外设情况。例如:
U-Boot> pci 3
这将显示总线号为3的PCIe控制器及其连接的外设信息。
以下是一个U-Boot中查看PCIe设备信息的示例输出:
U-Boot> pci info
PCI device: 0000:00:00.0 (8086:1234)
Class: 0x060000
Vendor: Intel Corporation
Device: 82579V Gigabit Network Connection
IRQ: 44
Memory: 0xf7e00000 (64KB)
Memory: 0xf7e20000 (64KB)
I/O: 0xf000
在使用pci
命令之前,需要确保U-Boot启用了PCI支持。这通常通过在编译U-Boot时启用CONFIG_CMD_PCI
配置选项来实现。
不同的U-Boot版本和硬件平台可能会有不同的命令和输出格式。具体命令的使用方法可以在U-Boot的文档或板级支持包(BSP)中查找。
每个PCI设备都有一个唯一的地址,由Bus Number、Device Number和Function Number组成,通常写作BB:DD.F的格式。例如,FCH SMBus Controller的BDF为00:14.0。
PCIe的架构设计包括Root Complex、Endpoint、Switch和Bridge,这些组件协同工作,实现高效的数据传输和系统管理。通过理解这些组件的功能和交互机制,开发者可以更好地设计和优化基于PCIe的系统架构。在U-Boot环境中,通过使用pci
命令,可以方便地查看和管理PCIe设备,获取设备的详细信息并进行调试和配置。
下篇文章将对pcie的树状结构图如何绘制给出详细记录讲解