PCIe配置概述(二)-FPGA常见问题社区-FPGA CPLD-ChipDebug

PCIe配置概述(二)

拓展配置空间

在阅读如下讨论时,请参阅图3-3。当PCIe被引入的时候,起初的256byte空间没有足够的区域去容纳所需要新的功能。所以每个function的配置空间大小由256byte拓展到4KB大小,并被命名为拓展配置空间(Extended Configuration Space)。拓展配置区域的960d-word大小空间只能通过加强配置机制(Enhanced configuration mechanism)来获得,因此对传统PCI软件来讲是不可视的(不可访问)。也包含了用于PCIe的额外可选的拓展功能寄存器,如图3-3所列(没有完整列出)。

图片[1]-PCIe配置概述(二)-FPGA常见问题社区-FPGA CPLD-ChipDebug
图3-3 PCIe每个function的4KB配置空间

1Host-to-PCI 桥配置寄存器

概述

对Host-to-PCI桥配置寄存器的访问并不需要使用之前小节所提到的配置机制。取而代之的是,它通常在内存地址空间中作为设备特定的寄存器来实现,这一点被平台固件所知晓。然而,他的配置寄存器布局和使用必需遵循PCIe2.0标准和PCIe3.0标准所定义的Type0模板。

仅有根复合体Root可以发送配置请求

标准中表述仅有RC被允许发起配置请求,RC作为系统处理器的中介,向其他结构法出请求,并将完成结果传递回来。发送配置事务的能力被限制为-仅处理器通过RC来实现。如果其他设备也具备改变配置的能力,可能会带来混乱。

由于只有Root可以发送这些请求,它们只能向下转发downstream,那么点对点(peer-to-peer)的配置请求将不被允许。这个请求是基于目标设备的ID,即所谓的BDF(Bus number in the topology, Device number on that bus, and Function number within that Device)。

2生成配置事务

处理器通常不直接执行读配置和写配置,因为它仅能生成memory和IO请求这意味着Root Complex需要将这些访问中的某些内容翻译成配置请求以支持这一过程。配置空间可以使用两种机制中的任何一种进行访问:

  • 传统的PCI配置机制,使用IO间接访问(IO‐indirect)

  • 增强型配置机制,使用内存映射访问(memory‐mapped)

传统PCI机制

PCI 规范定义了一种 IO 间接访问(IO‐indirect)方法,用于指示系统(根复合体RC或其等效物)执行 PCI 配置访问。事实上,占主导地位的 PC 处理器(Intel x86)仅设计用于处理 64KB 的 IO 地址空间。到定义 PCI 时,这个有限的 IO 空间已经变得非常混乱,只有几个地址范围仍然可用:0800h – 08FFh 和 0C00h – 0CFFh。因此,将所有可能的Function配置寄存器直接映射到 IO 空间是不可行的。同时,内存地址空间的大小也受到限制,将所有配置空间映射到内存地址空间也不是一个好的解决方案。因此,规范编写者选择了一个常用的解决方案来解决这个问题,使用间接地址映射。为此,一个寄存器持有目标地址,而另一个寄存器持有进入或来自目标的数据。对地址寄存器的写入,以及对数据寄存器的读或写,将导致对目标Function的正确内部地址的单一读或写事务。这很好地解决了地址空间有限的问题,但这意味着需要两个IO访问来创建一个配置访问。

PCI-Compatible(兼容)机制在Root Complex的Host桥中使用两个32位的IO端口。它们是配置地址端口,位于IO地址 0CF8h – 0CFBh,以及配置数据端口,在IO地址0CFCh – 0CFFh。

访问一个Function的PCI兼容配置寄存器的方法是:首先将目标总线(Bus)、设备(设备)、功能(Function)和dword号写入配置地址端口,在此过程中设置其使能位。其次,向配置数据端口发送一个、两个或四个字节的IO读或写。根复合体(RC)中的主机桥将指定的目标总线与桥下游的总线范围进行比较。如果目标总线在该范围内,网桥启动配置读或写请求(取决于对配置数据端口的IO访问是读还是写)。

配置端口地址

如图3-4所示,配置地址端口只在处理器对该端口进行完整的32位写操作时锁存信息,而从该端口进行32位读操作时则返回其内容。写入配置地址端口的信息必须符合以下模板(如图3-4所示) 并在后面的页面中描述。

图片[2]-PCIe配置概述(二)-FPGA常见问题社区-FPGA CPLD-ChipDebug
图3-4 在0CF8h配置地址端口
  • 位[1:0]是固定值,只读,读时必须返回零。该位置是字(DW)对齐的,不允许有特定的字节偏移。

  • 位[7:2]识别目标Function的字(也称为寄存器编号),在目标Function的PCI兼容配置空间。该机制仅限于兼容配置空间(即Function配置空间的前64个双字)。这个机制仅限于兼容的配置空间(即一个Function配置空间的前64个双字)。

  • 位[10:8]识别目标设备中的目标Function编号(0-7)设备。

  • 位[15:11]识别目标设备编号(0 – 31)。

  • 位[23:16]识别目标总线编号(0 – 255)。

  • 位[30:24]被保留,必须为零。

  • 位[31]必须被设置为1(是使能位),以使随后对配置数据端口的IO访问转换为配置访问。如果第 31 位为零,并且向配置数据端口发送了一个 IO 读或写,该事务就会被当作普通的 IO 请求。

总线比较和数据端口使用

主桥(Host Bridge)在RC中,如图3-5所示,实现了一个二级总线号(Secondary Bus Number)寄存器和一个从属总线号(Subordinate Bus Number)寄存器。二级总线号是紧靠桥接的总线的总线号。从属总线号是目标总线号,位于桥的下游。

在单根复合体(单RC)系统中,桥可能有一个固定值为 0 的二级总线号码寄存器,一个复位为 0 的读/写寄存器,或者它可能只是知道第一条可访问的总线是Bus0。如果配置地址端口的第 31 位(见图 3-4)被设置为 1,桥将把目标总线号码与存在下游的总线范围进行比较,以此来检查这个目标是否从属于当前的Bridge。

当看到一个请求时,桥会评估目标总线号码是否在下游的总线号码范围内,从二级总线号码的值到从属总线号码的值。如果目标总线与二级总线相符,该请求作为 Type0 型配置请求被传递。当设备看到一个Type0型请求时,它们知道该总线上的本地设备是目标设备(而不是下游从属总线上的设备)。

如果目标总线大于网桥的二级总线编号,但小于或等于网桥的从属总线编号,则该请求将作为网桥二级总线上的Type1 类配置请求被转发。Type1类配置访问被理解为,即使该请求必须穿过该总线,但它并不针对该总线上的设备。相反,该请求将被该总线上的一个网桥转发到下游,该网桥的二级总线和从属总线号码范围包含目标总线号码。由于这个原因,只有网桥设备会注意类型为Type1配置请求。有关Type0型和Type1型配置请求的其他信息,请参见后续章节 “配置请求”。

单主机系统

写入配置地址端口的信息由主机/PCI桥在根复合体(RC)中进行锁存,如图3-1所示。如果第31位是1b,并且目标总线是在总线编号的下游范围内,桥接器就会将随后的处理器访问其配置数据端口的行为转化为对Bus0的配置请求。然后,处理器向配置数据端口发起一个 IO 读或写事务。然后处理器在 0CFCh 处向配置数据端口发起一个 IO 读或写事务。导致网桥产生一个配置请求,如果对配置数据端口的 IO 访问是一个读,则是一个配置读,如果 IO 访问是一个写,则是配置写。如果目标总线是Bus0,它将是一个Type0型配置事务,如果是范围内的另一个总线,它将是一个Type1型配置事务,如果目标总线不在范围内,则根本不转发。

图片[3]-PCIe配置概述(二)-FPGA常见问题社区-FPGA CPLD-ChipDebug
图3-5 单RC系统
请登录后发表评论

    没有回复内容