我想实践一下Skylake平台的coreboot移植,但是一直都没动手。以前整理过一些资料,现在找不到了,所以只好重新整理,并且在这里开个帖子记录一下。如果有人收集到相关的资料,也可以在这里写一下。
我参考的主板是 ASRock H110M-DVS REV2.0, 之前好不容易在闲鱼上找到一块,但是现在也很久没开机了。
对于Sandy/Ivy Bridge,我们有 autoport 工具,对于 Haswell/Broadwell,方法也是类似的,我把这两代平台的 autoport 也实现了,并且移植了几个主板。但是到了 Skylake 这代,PCH 有很多东西和以前的平台不一样了,而且使用的 blob 也变成了完整版的 FSP,配置方法很不一样。
对于 GPIO 的配置,coreboot 提供了 intelp2m 工具。
我想重点谈的是 PCIe 设备的配置问题,例如 H110M-DVS 的:
https://review.coreboot.org/plugins/giti...ree.cb#134
我们怎么获得 PcieRpClkReqSupport, PcieRpClkReqNumber 这些参数的值?这些东西好像没什么文档。不过我手上有以前泄露出的 Intel FSP 源码,可以从这里找线索。据说 FSP 源码也可以通过和 Intel 签 NDA 获得。泄露的源码有两个版本,一个是比较早的 Intel FSP leak,另一个是个几十G的 Intel exconfidential Lake drop 1,后者的版本要新一些,功能更完整,所以我们参考后者。
我以前应该整理过关于 ClkReqNumber 这个参数的获取方法。
可以参考这段源码,Skylake和Kabylake都有。
而初始化的过程可以见 KabylakeSiliconPkg/Pch/Library/Private/PeiPchInitLib/PchInit.c 的 PchConfigureClkreqMapping 函数,这个函数也写了 PID_FIA PCR.
PID_FIA 是 0xCF, R_PCH_PCR_FIA_DRCRM1 是 0x100.
我参考的主板是 ASRock H110M-DVS REV2.0, 之前好不容易在闲鱼上找到一块,但是现在也很久没开机了。
对于Sandy/Ivy Bridge,我们有 autoport 工具,对于 Haswell/Broadwell,方法也是类似的,我把这两代平台的 autoport 也实现了,并且移植了几个主板。但是到了 Skylake 这代,PCH 有很多东西和以前的平台不一样了,而且使用的 blob 也变成了完整版的 FSP,配置方法很不一样。
对于 GPIO 的配置,coreboot 提供了 intelp2m 工具。
我想重点谈的是 PCIe 设备的配置问题,例如 H110M-DVS 的:
https://review.coreboot.org/plugins/giti...ree.cb#134
我们怎么获得 PcieRpClkReqSupport, PcieRpClkReqNumber 这些参数的值?这些东西好像没什么文档。不过我手上有以前泄露出的 Intel FSP 源码,可以从这里找线索。据说 FSP 源码也可以通过和 Intel 签 NDA 获得。泄露的源码有两个版本,一个是比较早的 Intel FSP leak,另一个是个几十G的 Intel exconfidential Lake drop 1,后者的版本要新一些,功能更完整,所以我们参考后者。
我以前应该整理过关于 ClkReqNumber 这个参数的获取方法。
可以参考这段源码,Skylake和Kabylake都有。
代码:
// KabylakeSiliconPkg/Pch/Library/Private/PeiDxeSmmPchPciExpressHelpersLib/PchPciExpressHelpersLibrary.c
/**
This returns ClkReq Number from Port Number
@param[in] PortIndex PCIe Port Number (Zero Base)
@retval ClkReq Number
**/
UINT8
GetPortClkReqNumber (
IN UINT8 PortIndex
)
{
UINT8 ClkReqNum;
PchPcrRead8 (PID_FIA, R_PCH_PCR_FIA_DRCRM1 + (PortIndex / 2), &ClkReqNum);
if (PortIndex % 2 == 0) {
ClkReqNum &= 0x0F;
} else {
ClkReqNum = ClkReqNum >> 4;
}
return ClkReqNum;
}
而初始化的过程可以见 KabylakeSiliconPkg/Pch/Library/Private/PeiPchInitLib/PchInit.c 的 PchConfigureClkreqMapping 函数,这个函数也写了 PID_FIA PCR.
PID_FIA 是 0xCF, R_PCH_PCR_FIA_DRCRM1 是 0x100.