PCI 总线

发布时间 2023-11-07 17:17:24作者: ImreW

PCI Peripheral Component Interconnect 总线用于建立高性能低成本的局部总线,经过几代的发展,使得传输率从 132M/s 到 528 M/s。PCI 总线满足了低端桌面系统和高端局域网服务器的需求。PCI 总线组件和外接卡是处理器独立的。能有效地过渡到未来的处理器,以及与多处理器架构一起使用,多处理器架构也一样。PCI 总线的一个缺点是单总线最大可以驱动 10 个负载。

PCI 的说明文档 (Specifications)

配置空间

PCI 规范通过单独的配置地址空间为 PCI 总线上的每个设备(或目标)提供了完全由软件驱动的初始化和配置。所有 PCI 设备,除了主机总线桥,都需要为此提供 256 字节的配置寄存器。

PCI 设备先天是小端存储的,这意味着所有多字节字段在较低地址具有最低有效值。这需要一个大端处理器(比如 Power PC)来执行对 PCI 设备读写数据的正确字节交换,包括对配置地址空间的任何访问。

系统必须提供一种允许访问 PCI 配置空间的机制,因为大多数 CPU 没有这种机制。这个任务通常由 Host to PCI Bridge(主机桥) 执行。定义了两种不同的机制来允许软件生成所需的配置访问。配置机制 1 是首选方法,而机制 2 是为了向后兼容而提供的。这里只描述配置机制 1,因为它是未来将使用的唯一访问机制。

配置机制

使用了两个 32 位的 I/O位置,第一个位置 (0xCF8) 被称为 PCI_CONF_ADDR,第二个位置 (0xCFC) 被称为 PCI_CONF_DATA。 PCI_CONF_ADDR 指定需要访问的配置地址,而对 PCI_CONF_DATA 的访问将实际生成配置访问,并将数据传输到 PCI_CONF_DATA 寄存器或从 PCI_CONF_DATA 寄存器得到数据。

PCI 设备结构

PCI 规范定义了 256 字节配置空间寄存器的组织,并为该空间引入了一个特定的模板。图 2 和 3 显示了 256 字节配置空间的布局。所有 PCI 兼容设备必须支持 供应商ID、设备ID、命令和状态、修订ID、类代码 和 报头类型 字段。其他寄存器的实现是可选的,这取决于设备的功能。

  • Device ID(设备 ID):

    标识特定的设备,有效的 ID 由供应商分配

  • Vendor ID(供应商 ID):

    标识设备的制造商。有效的 ID 是由 PCI-SIG  分配的,以确保唯一性,0xFFFF 是一个无效的值,将在读取不存在设备的配置空间寄存器时返回

  • 状态寄存器

    用于记录 PCI 总线相关事件的状态信息 

  • 命令寄存器

    提供对设备生成和响应 PCI 周期的能力的控制。所有设备都支持的唯一功能是,当向该寄存器写入 0 时,除配置空间访问外,都断开设备与 PCI 总线的所有访问连接(见下文)

  • Class Code (类型码):

    一种只读寄存器,它指定设备执行的功能类型

  • Subclass (子类型):

    用于指定设备执行的特定功能

  • Prog IF (Programming Interface Byte 编程接口字节)

    一种只读寄存器,它指定设备具有的寄存器级编程接口(如果有的话)

  • Revision ID (修订 ID):

    为特定设备指定修订标识符。有效的id由供应商分配。

  • BIST (built-in self test 内置自检)

    表示该状态并允许控制设备 BIST

  • Header Type (头类型)

    标识从字节 0x10 开始的头的其余部分的布局,还指定设备是否具有多个功能。其中 0x0 指通用设备,0x1 指 PCI - PCI 桥,0x2 指 CardBus 桥

    如果设置了该寄存器的第 7 位,则设备具有多种功能,否则为单一功能设备

  • Latency Timer (延迟计时器)

    以 PCI 总线时钟为单位指定延迟计时器

  • Cache Line Size (缓存线大小)

    指定系统缓存行大小,以 32 位为单位。设备可以限制其支持的缓存先大小的数量,如果将不支持的值写入该字段,设备的行为将像写入值为 0 一样

  • CardBus CIS 指针

    指向卡信息结构,由 CardBus 和 PCI 之间共享硅的设备使用

  • 中断线

    指定设备的中断引脚连接到系统中断控制器的哪个输入,并且由任何使用中断引脚的设备实现。对于 x86 架构,这个寄存器对应于 PIC IRQ 编号0-15(而不是I/O APIC IRQ编号),0xFF 的值定义没有连接

  • 中断引脚

    指定设备使用的中断引脚。其中:

    • 0x1 是 INTA#
    • 0x2 是 INTB#
    • 0x3 是 INTC#
    • 0x4 是 INTD#
    • 0x0 表示设备没有使用中断引脚
  • 最大延迟时间

    只读寄存器,指定设备需要访问 PCI 总线的频率(以 1/4 微秒为单位)

  • Min Grant

    只读寄存器,指定设备需要的突发周期长度,单位为 1/4 微秒(假设时钟频率为 33 MHz)

  • 功能指针

    指向一个由设备实现的新功能链表的指针(即该函数配置空间的偏移量)。如果状态寄存器(能力列表位)的第 4 位设置为 1,则使用。底部的两位是保留的,并且应该在指针被用来访问配置空间之前被屏蔽。

基址寄存器 Base Address Registers (BAR)

基址寄存器(BAR) 可以用来保存设备使用的内存地址,或端口地址的偏移量。通常,内存地址 BAR 需要位于物理 RAM 中,而 I/O 空间 BAR 可以驻留在任何内存地址(甚至超出物理内存)。要区分它们,可以检查最低位的值。下面的表格描述了两种类型的 BAR:

内存空间 BAR 布局

英文描述
0 Always 0 常为0
1 ~ 2 Type 类型
3 Prefetchable  
4 ~ 31 16 Byte Aligned Base Address 16字节对齐基址

I/O 空间 BAR 布局

英文描述
0 Always 1 常为 1
1 Reserved 保留
2 ~ 31 4-Byte Aligned Base Address 4字节对齐基址

Memory Space BAR Layout 的 Type 字段指定基本寄存器的大小,以及它在内存中的映射位置: