OpenBMC:LPC/eSPI 与主机侧通信
1. LPC 与 eSPI
LPC 和 eSPI 都可以用于主机与 BMC 之间的低速管理通信。
LPC 是传统主机平台常用的低引脚数总线,可承载:
- KCS
- BT
- POST Code
- Super I/O 访问
- 固件和寄存器访问
eSPI 是 LPC 的后续方案,将多种功能划分为不同通道,并改进了传输能力和扩展性。
2. 主机与 BMC 的通信结构
主机 CPU / 芯片组 ↓ LPC 或 eSPI ↓ BMC LPC/eSPI 控制器 ↓ Linux 内核驱动 ↓ KCS、BT、Snoop、Mailbox 等接口 ↓ OpenBMC 用户空间服务主机侧通常是请求发起者,BMC 负责响应管理请求或接收主机状态信息。
3. LPC 常见功能
LPC 采用 I/O Cycle、Memory Cycle 和 Firmware Cycle 等方式访问设备。
在 BMC 场景中常见功能包括:
KCS 和 BT
主机 BIOS 或操作系统通过 KCS、BT 发送 IPMI 请求。
主机 IPMI 驱动 ↓ LPC I/O Cycle ↓ BMC KCS/BT 控制器 ↓ IPMI 服务POST Code Snoop
主机固件向指定 I/O 端口写入 POST Code,BMC 控制器监听并保存数据。
Mailbox
部分平台使用 LPC Mailbox 传输启动参数、状态值或平台自定义数据。
4. eSPI 通道
eSPI 通常定义以下通道:
| 通道 | 作用 |
|---|---|
| Peripheral Channel | I/O 和内存映射外设访问 |
| Virtual Wire Channel | 传输 GPIO 类控制信号 |
| Out-of-Band Channel | BMC 与设备之间的带外消息 |
| Flash Channel | 主机访问由 BMC 管理的 Flash |
Peripheral Channel
可用于承载 KCS、POST Code、Mailbox 等传统 LPC 外设功能。
Virtual Wire Channel
用于传输电源状态、复位、休眠和告警等信号,减少独立 GPIO 数量。
Out-of-Band Channel
用于传输不依赖主机操作系统的管理消息。
Flash Channel
允许主机通过 eSPI 访问 Flash 内容,并由 BMC 参与访问控制或数据转发。
5. Linux 驱动分层
LPC/eSPI 驱动通常分为控制器层和功能层。
LPC/eSPI 控制器驱动 ├── KCS 功能驱动 ├── BT 功能驱动 ├── Snoop 功能驱动 ├── Mailbox 功能驱动 ├── Virtual Wire 驱动 └── Flash 通道驱动控制器驱动负责:
- 寄存器映射
- 时钟和复位
- 中断处理
- 通道使能
- FIFO 和 DMA
- 状态清除
功能驱动负责实现具体协议和用户空间接口。
6. 主机侧通信流程
以主机通过 KCS 发送 IPMI 命令为例:
主机写入 KCS 请求 ↓ LPC/eSPI 控制器接收 ↓ BMC 驱动获取数据 ↓ IPMI 服务解析并处理 ↓ 调用 D-Bus 后台服务 ↓ 生成 IPMI 响应 ↓ 控制器将响应返回主机以 POST Code 为例:
BIOS 写入 POST Code ↓ LPC/eSPI Snoop 捕获 ↓ BMC 驱动读取 ↓ POST Code 服务记录 ↓ Redfish 和 WebUI 展示7. LPC 与 eSPI 对比
| 对比项 | LPC | eSPI |
|---|---|---|
| 架构 | 传统并行式低引脚总线 | 串行化接口 |
| 传输通道 | 主要依赖 Cycle 类型 | 明确划分多个通道 |
| 带外通信 | 能力有限 | 支持 OOB Channel |
| GPIO 类信号 | 常使用独立 GPIO | 支持 Virtual Wire |
| Flash 访问 | Firmware Cycle | 独立 Flash Channel |
| 扩展能力 | 较弱 | 较强 |
平台迁移到 eSPI 后,上层 KCS、POST Code 和 IPMI 业务可以保持不变,但控制器和底层传输驱动需要重新适配。
8. 总结
LPC/eSPI 是连接主机和 BMC 的重要硬件通道。
LPC/eSPI 提供底层传输 KCS/BT 提供 IPMI 主机接口 Snoop 提供 POST Code 捕获 Virtual Wire 提供状态信号 Flash Channel 提供固件访问OpenBMC 上层服务不直接处理总线时序,而是通过对应内核功能驱动获取请求、状态和事件。