[笔记]深入理解PCIe架构与U-Boot中的设备管理

前言

PCIe(Peripheral Component Interconnect Express)作为一种高速串行计算机扩展总线标准,已经成为现代计算系统中不可或缺的一部分。它不仅用于个人电脑和服务器,还广泛应用于嵌入式系统和数据中心。

       因为项目需求对pcie进行功能调试,本文将以探讨PCIe的架构设计,包括Root Complex(RC)、Endpoint(EP)、Switch和Bridge的各个功能为主。此外,还将记述还将介绍如何在U-Boot环境中查看和管理PCIe设备。

一、PCIe架构详解

(一)Root Complex(RC)

Root Complex是PCIe拓扑结构的根节点,通常集成在主机处理器或芯片组中。它是整个PCIe总线的起点,负责管理整个PCIe拓扑结构中的所有设备。以下是RC的主要功能:

  • 初始化和枚举:在系统启动时对所有连接的PCIe设备进行初始化和枚举,分配资源(如内存地址空间、中断号等)。

  • 事务发起:RC可以作为请求者(Requester),发起对Endpoint设备的读写操作。

  • 事务完成:RC作为完成者(Completer),处理来自Endpoint设备的完成消息。

  • 配置管理:RC负责配置PCIe拓扑中的所有设备,包括设置设备的BAR(Base Address Register)等配置寄存器。

  • 错误处理:RC负责处理PCIe总线上的错误消息和事件。

(二)Endpoint(EP)

Endpoint是PCIe拓扑结构中的终端设备,位于树状结构的末端。它们是实际的外设,如显卡、网卡、SSD等。以下是EP的主要功能:

  • 事务响应:EP作为目标设备(Target),响应来自RC或其他Endpoint的事务请求,执行读写操作。

  • 中断生成:EP可以生成中断,通知RC或其他设备有事件发生。

  • 数据传输:EP负责接收和发送数据,确保数据的正确传输。

  • 配置响应:EP响应RC的配置请求,提供设备的配置信息。

(三)Switch

Switch是一种更高级的设备,用于扩展PCIe总线的连接能力,允许多个设备通过单个PCIe端口连接到主机系统。以下是Switch的主要功能:

  • 连接多个设备:允许多个设备通过单个PCIe总线连接到主机,从而扩展系统的连接性。

  • 数据交换:在多个设备之间传输数据,允许设备之间直接通信而无需通过主机处理器。

  • 动态分配:支持动态分配带宽和资源,根据需要调整设备之间的通信速率和优先级。

  • NTB技术:支持NTB(Non-Transparent Bridge)技术,允许两个或多个系统之间直接通信。

  • Peer to Peer通信:支持点对点通信,设备之间可以直接进行数据交换而无需通过主机。

  • 虚拟化支持:支持多根IO虚拟化(MRIOV)和单根IO虚拟化(SRIOV),实现资源的灵活分配和管理。

(四)Bridge

Bridge是一种连接不同总线的设备,用于扩展PCIe拓扑结构。它通常用于连接不同类型的PCIe链路,例如将PCIe总线连接到传统的PCI或PCI-X总线。Bridge的主要功能包括:

  • 连接不同链路:允许不同类型的PCIe设备连接在一起。

  • 数据传输:在不同总线之间传输数据,确保数据的一致性和完整性。

  • 地址转换:进行地址转换,确保数据包正确路由到目标设备。

  • 配置管理:支持配置空间访问,允许操作系统和驱动程序配置Bridge设备。

二、U-Boot中的PCIe设备管理

(一)查看PCIe设备信息

在U-Boot中,可以使用pci命令来查看和操作PCIe设备。以下是一些常用的子命令及其用法:

(1)pci info

显示系统中所有PCI设备的信息,包括设备地址、设备ID、厂商ID等。

U-Boot> pci info
(2)pci device

列出系统中所有PCI设备的设备地址和设备ID。

U-Boot> pci device
(3)pci read

从指定的PCI设备上读取数据,需要指定设备地址、偏移地址、数据类型和数据长度。

U-Boot> pci read    
(4)pci write

向指定的PCI设备上写入数据,需要指定设备地址、偏移地址、数据类型和数据长度。

U-Boot> pci write    
(5)pci probe

探测系统中的PCI设备,并打印出所有找到的设备的信息。

U-Boot> pci probe
(6)pci enum

枚举系统中的所有PCI设备,并打印出找到的设备的信息。

U-Boot> pci enum

(二)查看PCIe设备的配置空间

使用pci d命令可以查看PCI设备的配置空间信息。设备地址由总线号(bus number)、设备号(device number)和功能号(function number)组成。

例如,查看总线号为3的设备的配置空间信息:

U-Boot> pci d 03.00.00

执行该命令后,U-Boot将显示与该设备相关的详细信息,如厂商ID、设备ID、设备类别等。

(三)查看PCIe控制器情况以及外设情况

可以通过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)中查找。

三、解析BDF信息

每个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的树状结构图如何绘制给出详细记录讲解

你可能感兴趣的:(笔记,架构)