BIOS开发笔记 22 – eSPI 总线深度解析

 

一、从LPC到eSPI的演进

在 LPC 时代,芯片组与 EC/BMC/SIO 之间存在大量边带信号(Sideband Pins)—— 复位、睡眠、中断、GPIO 等。这些信号带来显著的引脚成本。

eSPI 的设计目标之一,就是将这些边带信号转化为 带内消息(in-band messages)。 Virtual Wire(虚拟线) 通道由此诞生:它在物理上复用 eSPI 的数据线,在逻辑上却像一根根独立的"导线"传递信号状态。

二、硬件架构

2.1 架构图

2.2 eSPI引脚定义

eSPI复用SPI的I/O缓冲器,电气规范与SPI相同。

引脚名称
方向
说明
CLK
Controller→Target
串行时钟
CS#
Controller→Target
片选
I/O[3:0]
双向
数据线
Alert#
Target→Controller
告警信号
eSPI Reset#
双向
接口复位

2.3 四通道架构

eSPI定义了4个独立通道:

通道编号
通道类型
用途
Channel 0
Peripheral
外设通信
Channel 1
Virtual Wire
虚拟线传输
Channel 2
OOB Message
SMBus隧道
Channel 3
Flash Access
Flash访问

四个通道是逻辑通道 (Logical Channels),而不是物理隔离的线路。不管激活了几个通道,它们在主板上走的都是同一组物理引脚(即 CS#、CLK、IO[3:0]、ALERT# 和 RESET#)。

eSPI 的本质是一个基于数据包的时分复用 (Time-Division Multiplexing, TDM) 总线。不同通道的数据包像高速公路上的不同车辆一样,排队交错通过同一组 IO 数据线。

三、通讯方式

主从的控制与区分通道的核心机制可以拆解为三个阶段:初始化使能主端下行寻址 和 从端上行仲裁

3.1. 初始化阶段:单独开启/关闭通道

Host (PCH) 会通过 eSPI 的带内管理命令读写 Target (EC) 的内部配置寄存器来使能通道:

  • • 查询能力:PCH 发送 GET_CONFIGURATION 命令,分别读取偏移地址 0x10 (外设)、0x11 (虚拟线)、0x12 (OOB)、0x13 (Flash) 的寄存器,查看 EC 支持哪些通道。
  • • 单独使能:PCH 发送 SET_CONFIGURATION 命令,将对应通道配置寄存器的 Bit 0 (Channel Enable) 置为 1

    (注:根据 eSPI 启动规范,通常会优先全速协商并优先使能 Channel 1 虚拟线通道,以便同步底层的电源和复位状态。)

3.2. 消息下发(PCH  EC):如何精准分发?

虽然物理引脚共享,但 eSPI 协议在 Command Phase 的 Opcode 字段中编码了通道信息。Controller 通过发送不同的 Opcode 来“选择”当前事务要访问的通道。


规范中定义的通道专属 Opcode 如下:

通道
功能
Command Opcode
二进制编码
Channel 0
Peripheral Posted/Completion
PUT_PC

 / GET_PC
00000000

 / 00000001
Channel 0
Peripheral Non-Posted
PUT_NP

 / GET_NP
00000010

 / 00000011
Channel 0
Peripheral Non-Posted
PUT_IORD_SHORT

 / PUT_IOWR_SHORT / PUT_MEMRD32_SHORT / PUT_MEMWR32_SHORT
00000010

 / 00000011 / 0100 00C1C0 / 0100 01C1C0 / 0100 10C1C0 / 0100 11C1C0
Channel 1
Virtual Wire
PUT_VWIRE

 / GET_VWIRE
00000100

 / 00000101
Channel 2
OOB Message
PUT_OOB

 / GET_OOB
00000110

 / 00000111
Channel 3
Flash Access
PUT_FLASH_NP

 / GET_FLASH_C 等
00001010

 / 00001011 等

此处特别注意,Host 发起的对 EC 的读写走的便是 Channel 0,使用的是 PUT_IORD_SHORT / PUT_IOWR_SHORT / PUT_MEMRD32_SHORT / PUT_MEMWR32_SHORT 这几个命令。

3.3. 消息上行(EC  PCH):如何请求特定通道的服务?

eSPI 是主从架构,EC 作为 Target 不能主动占用数据线发起长包传输。如果 EC 突发事件需要上报(例如触发了特定通道的数据),需要通过带外告警 + 状态轮询的机制精确指明通道:

  1. 1. 发起请求:EC 拉低物理引脚 ALERT#
  2. 2. 主端轮询:PCH 收到告警后,立即挂起当前低优先级事务,向 EC 发送 GET_STATUS 短命令。
  3. 3. 指明通道:EC 返回 2 个字节的 STATUS 寄存器数据。该寄存器中有专门的标志位指明是哪个逻辑通道饿了:
  • • Bit 1 (VWIRE_AVAIL)置 1:说明 Ch 1 (虚拟线) 有包要发(如 SMI# 触发)。
  • • Bit 2 (OOB_AVAIL)置 1:说明 Ch 2 (OOB) 有包要发。
  • • Bit 3 (FLASH_NP_AVAIL)置 1:说明 Ch 3 (Flash) 有非同步请求。
  1. 4. 定向拉取:PCH 看到具体的标志位后,发送对应通道的专属读取命令(如看到 VWIRE_AVAIL=1,就发送 GET_VWIRE 命令),此时 EC 才能把真实的业务数据包顺着数据线推回给 PCH。

四、虚拟线

虚拟线是 BIOS / EC 中需要接触到的知识,主要是数据包格式及类型,来一起重点了解一下。

4.1 虚拟线包格式

虚拟线数据包直接嵌入在 eSPI 事务的命令阶段中,使用 PUT_VWIRE(00000100b) 或 GET_VWIRE(00000101b) 操作码。

Byte
说明
Byte 0
Command Opcode (PUT_VWIRE / GET_VWIRE)
Byte 1
Virtual Wire Count
 
[5:0] = Count (0-based)
 
[7:6] = Reserved
Byte 2
Virtual Wire Index
Byte 3
Virtual Wire Data
...
更多 Index + Data
Last Byte
CRC-8

4.2 虚拟线分类与定义

规范将虚拟线划分为四大类,通过 Virtual Wire Index 寻址。

4.2.1 中断事件(Index 0h - 1h)

用于替代传统 SERIRQ,支持 256 条 IRQ 线(Index 0h 对应 IRQ 0-127,Index 1h 对应 IRQ 128-255)。

Bit
说明
Bit [6:0]
IRQ Line Number
Bit [7]
Level (1 = High / Assert)

还记得这篇《按下一个按键发生了什么?笔记本键盘事件全链路追踪!》文章介绍的键盘中断 IRQ 1 吗?EC 发送键盘字符使用的便是此类型的虚拟线包报给 Host 的。

4.2.1 系统事件(Index 2h - 7h)

这是最常打交道的区域,涵盖平台级电源管理与复位信号。

每组系统事件采用统一的 Valid + Level 位域格式:

Bit
字段
说明
[7:4]
Valid[3:0]
1 = 对应 Level 位有效,0 = 保留前值(Mask)
[3:0]
Level[3:0]
信号电平状态

Index 2h - 7h 详细映射

Index
Bit[3:0] 定义
方向
极性
2h
[3]RSV [2]SLP_S5# [1]SLP_S4# [0]SLP_S3#
Controller → Target
低有效
3h
[3]RSV [2]OOB_RST_WARN [1]PLTRST# [0]SUS_STAT#
Controller → Target
-
4h
[3]PME# [2]WAKE# [1]RSV [0]OOB_RST_ACK
Target → Controller
低有效
5h
[3]TARGET_BOOT_LOAD_STATUS [2]ERROR_NONFATAL [1]ERROR_FATAL [0]TARGET_BOOT_LOAD_DONE
Target → Controller
-
6h
[3]HOST_RST_ACK [2]RCIN# [1]SMI# [0]SCI#
Target → Controller
低有效
7h
[3]RSV [2]NMIOUT# [1]SMIOUT# [0]HOST_RST_WARN
Controller → Target
-

4.2.1 GPIO 扩展(Index 80h - FFh)

eSPI Controller 可将 Target 侧的物理 GPIO 引脚虚拟化为自己的 I/O。

Bit
字段
[7:4]
Valid[3:0]
[3:0]
Level[3:0]

注:Index 8 - 7F 为 Reserved 和 Platform specific 部分。

五、一个例子

以 EC 处理笔记本键盘上按下数字键 1 为例,整个数据传输过程横跨了物理硬件、eSPI 协议栈、主机控制器、内核驱动及操作系统应用层。

在这个流程中,最精妙的部分在于 eSPI 虚拟线通道(Ch1,传中断) 与 eSPI 外设通道(Ch0,传 I/O 数据) 的接力协同。

EC 物理/逻辑层(KBC 模拟器)EC 物理/逻辑层(KBC 模拟器)eSPI 总线(物理引脚)eSPI 总线(物理引脚)PCH 控制器(eSPI Master)PCH 控制器(eSPI Master)CPU & OS 内核(i8042prt 驱动)CPU & OS 内核(i8042prt 驱动) 阶段一:物理按键触发与中断上报 (走 Ch1 虚拟线) 1 MakeCode (0x02) 0x60 OBF=1 2 ALERT#  3GET_STATUS 4  5 STATUS (VWIRE_AVAIL= 1) 6GET_VWIRE  (Ch1) 7  8 ACCEPT +VW ( IRQ1 /SERIRQ ) 9 IRQ1线 阶段二:系统中断路由与响应 10IOAPIC  CPUCore 11CPU  IDT ISR 阶段三:I/O 端口读取真实按键数据 (走 Ch0 外设通道) 12ISR  IN AL,60h  13 I/O Read (Ch0) =0x0060 14  15SUCCESS_WITH_DATAPayload Data= 0x02 ('1') 16 CPU  AL 阶段四:中断撤销与状态恢复 170x60 OBF 18 Ch1VW (De-assert)IRQ1 19 0x02  '1'

 

 
 

 
 

版权声明:
作者:bin
链接:https://ay123.net/mystudy/bios/1963/
来源:爱影博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
BIOS开发笔记 22 – eSPI 总线深度解析
  一、从LPC到eSPI的演进 在 LPC 时代,芯片组与 EC/BMC/SIO 之间存在大量边带信号(Sideband Pins)—— 复位、睡眠、中断、GPIO 等。这些信号带来显著的引脚……
<<上一篇
下一篇>>
文章目录
关闭
目 录