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相同。
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2.3 四通道架构
eSPI定义了4个独立通道:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
四个通道是逻辑通道 (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 如下:
|
|
|
|
|
|---|---|---|---|
| Channel 0 |
|
PUT_PC
GET_PC |
00000000
00000001 |
| Channel 0 |
|
PUT_NP
GET_NP |
00000010
00000011 |
| Channel 0 |
|
PUT_IORD_SHORT
PUT_IOWR_SHORT / PUT_MEMRD32_SHORT / PUT_MEMWR32_SHORT |
00000010
00000011 / 0100 00C1C0 / 0100 01C1C0 / 0100 10C1C0 / 0100 11C1C0 |
| Channel 1 |
|
PUT_VWIRE
GET_VWIRE |
00000100
00000101 |
| Channel 2 |
|
PUT_OOB
GET_OOB |
00000110
00000111 |
| Channel 3 |
|
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. 发起请求:EC 拉低物理引脚 ALERT#。 -
2. 主端轮询:PCH 收到告警后,立即挂起当前低优先级事务,向 EC 发送 GET_STATUS短命令。 -
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) 有非同步请求。
-
4. 定向拉取:PCH 看到具体的标志位后,发送对应通道的专属读取命令(如看到 VWIRE_AVAIL=1,就发送GET_VWIRE命令),此时 EC 才能把真实的业务数据包顺着数据线推回给 PCH。
四、虚拟线
虚拟线是 BIOS / EC 中需要接触到的知识,主要是数据包格式及类型,来一起重点了解一下。
4.1 虚拟线包格式
虚拟线数据包直接嵌入在 eSPI 事务的命令阶段中,使用 PUT_VWIRE(00000100b) 或 GET_VWIRE(00000101b) 操作码。
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4.2 虚拟线分类与定义
规范将虚拟线划分为四大类,通过 Virtual Wire Index 寻址。
4.2.1 中断事件(Index 0h - 1h)
用于替代传统 SERIRQ,支持 256 条 IRQ 线(Index 0h 对应 IRQ 0-127,Index 1h 对应 IRQ 128-255)。
|
|
|
|---|---|
|
|
|
|
|
|
还记得这篇《按下一个按键发生了什么?笔记本键盘事件全链路追踪!》文章介绍的键盘中断 IRQ 1 吗?EC 发送键盘字符使用的便是此类型的虚拟线包报给 Host 的。
4.2.1 系统事件(Index 2h - 7h)
这是最常打交道的区域,涵盖平台级电源管理与复位信号。
每组系统事件采用统一的 Valid + Level 位域格式:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
Index 2h - 7h 详细映射:
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4.2.1 GPIO 扩展(Index 80h - FFh)
eSPI Controller 可将 Target 侧的物理 GPIO 引脚虚拟化为自己的 I/O。
|
|
|
|---|---|
|
|
|
|
|
|
注:Index 8 - 7F 为 Reserved 和 Platform specific 部分。
五、一个例子
以 EC 处理笔记本键盘上按下数字键 1 为例,整个数据传输过程横跨了物理硬件、eSPI 协议栈、主机控制器、内核驱动及操作系统应用层。
在这个流程中,最精妙的部分在于 eSPI 虚拟线通道(Ch1,传中断) 与 eSPI 外设通道(Ch0,传 I/O 数据) 的接力协同。
版权声明:
作者:bin
链接:https://ay123.net/mystudy/bios/1963/
来源:爱影博客
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论