再读 eSPI

5年前,我给出过如果有可能尽量不要在设计上使用 eSPI 接口,时至今日,至少在平板和笔记本上 eSPI 已经完全取代了 LPC 接口, 我们需要对此有所了解。

首先 eSPI 相比之前的 LPC 总线,有着速度更快的优势。最新的 ADL-P 平台上,eSPI 可达50Mhz (最多支持4个数据线,一次性可以传输 4Bits).

此外,还提供了虚拟信号的功能,比如,可以从eSPI上发送 SMI# 信号,这样无需外部有SMI# 的引线即可让 EC 发送 SMI# 请求。从另外的角度来说,使用 eSPI 之后可以简化布线节省 PCB 空间。

再有就是提供通过 PECI 读取CPU /PCH 温度这样的功能,便于 EC 进行温度方面的控制。这样可以实现更好的散热功能。

传统的设计上, BIOS 和 EC 的 Firemware 是分别存储在两个 SPI NOR 中的:

使用 eSPI 之后可以共享。共享方式有如下两种:

第一种:挂接在 PCH 上,EC 访问需要通过 PCH 的 eSPI Master, 称作 Master Attached Flash Sharing (简称 MAFS,或者 MAF),这种模式下 EC 通过PCH 中的SPI Master 来访问存放在 SPI Nor 中的 EC Firmware。

MAFS

特别注意的是,还有一种 MAFS 的变种 G3 Flash Sharing,特别之处在于 EC 和 PCH 都是直连 SPI Nor。在PCH Reset 之前,EC 作为 SPI master 需要完成读取 Firmware 的动作。PCH Reset 之后,PCH 作为 SPI Master 来和 SPI Nor 进行通讯。G3 Flash Sharing 的设定和CSME以及BIOS 无关,完全是硬件动作,所以你也无法在 FIT 中找到设定的选项(个人非常不建议用这个模式,因为出现问题不容易判断产生错误的原因,可能是硬件也可能是 EC Firmare) 随着时代的进步,G3 Sharing 已经成为主流,现在建议跟随 Intel 参考设计进行:

第二种,SPI 挂在 EC 下面,PCH 访问需要透过EC, 这种称作 Slave Attached Flash Sharing(简称 SAFS,或者 SAF)

SAFS

个人建议:尽量不要使用共享模式,虽然能帮老板省一点钱,但是可能会有未知的问题。或者说参考板用哪种,尽量用哪种。特别是新的 Chipset ,理论上全部都可以支持,但是很可能非参考板的设计目前尚未验证过,如果想让它正常工作还需要特别的PMC 之类的设定。

参考:

1.https://blog.csdn.net/gkcywbcbjpvel404/article/details/107401736

2.Intel: Enhanced SPI (eSPI) Platform Enabling and Debug Guide

《再读 eSPI》有3个想法

  1. 您好,我是参考1里的第五位面壁者,我不是做BIOS的,算是硬件工程师,但是通过您的博客,我从零开始自学UEFI环境搭建,现在已经可以自己编译app,编译替换USB DXE Driver了。但是我最近有一个困扰,比如说我想要自己编译一个x86平台的bios,我手里有一些源码,我也知道需要编辑fdf文件,使用GenFW命令,但还是感觉无从下手。或者说条件再放宽,我只需要boot进sec阶段,在实模式下玩一玩,我会写汇编,但是我不知道怎么把这些汇编程序变成可以烧录到spi flash里执行的bin档案。您这里有什么资料或者例子可以让我参考吗?

    1. 这个牵扯到你需要有一套开源的 X86 平台,并且有对应的 BIOS Source Code,据我所知网上有开源的板子,但是我没有研究过。一般都是工作才会有,个人如果想实验不太现实。

  2. 您好,参考1里的文章就是我写的,我通过学习您的uefi系列文章,已经可以自己搭建环境编译app和DXE driver了,谢谢~我现在遇到的问题是,如果把一段源代码编译成可以烧录到spi flash里让x86 boot的bin文档?我知道需要使用GenFW命令和fdf文件,但还是感觉无从下手,比如我自己用汇编写一段Sec,让cpu在实模式下做点事情玩,您这里有什么样建议或者例子可以参考吗?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注