[讨论] 如何移植coreboot到Skylake及更新的Intel主板? - vimacs - 11-19-2021
我想实践一下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/gitiles/coreboot/+/refs/heads/master/src/mainboard/asrock/h110m/devicetree.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.
RE: [讨论] 如何移植coreboot到Skylake及更新的Intel主板? - vimacs - 11-20-2021
试着用inteltool读PCR,结果读PCR 0xCF的时候把系统读死机了,改一下inteltool的代码让它读到offset=0x200的地方,发现0x100附近的值全是0,不知道为什么。
RE: [讨论] 如何移植coreboot到Skylake及更新的Intel主板? - 维格纳朋友 - 02-06-2023
V大,我搞到一块MSI B85M-E45 (MS-7817) ,我看着平台很老,当时就想折腾一下coreboot,于是搜了一下。
https://coreboot.org/releases/coreboot-4.14-relnotes.txt
coreboot-4.14似乎支持同代号MSI H81M-P33(MS-7817) 。
但我不知道我还要做些什么才能移植coreboot。
能复用MSI H81M-P33的支持吗?
另外就是去年10月份的时候,牙膏厂又泄漏了一波源码。
coreboot的移植能否进一步推进?
AMD的Ryzen应该没有可用的移植吧?
我自用ZEN2 3900X和ZEN3 5800X。
最后,就算是coreboot也不能让不支持ECC的平台支持ECC吧?
主要是5800X拿来做NAS功耗有点高。
但牙膏厂平台很多都不支持ECC。
Ryzen用华硕的B系列就能用ECC。
RE: [讨论] 如何移植coreboot到Skylake及更新的Intel主板? - vimacs - 02-06-2023
(02-06-2023, 07:41 PM)维格纳朋友 提到: V大,我搞到一块MSI B85M-E45 (MS-7817) ,我看着平台很老,当时就想折腾一下coreboot,于是搜了一下。
https://coreboot.org/releases/coreboot-4.14-relnotes.txt
coreboot-4.14似乎支持同代号MSI H81M-P33(MS-7817) 。
但我不知道我还要做些什么才能移植coreboot。
能复用MSI H81M-P33的支持吗?
我今天在 reddit 看到有人问这个问题,应该是你发的吧。我也建议你用 autoport 先生成一套基础的代码,剩下的可以参考一下 H81M-P33 的。内存插槽的SPD映射比较重要(mb_get_spd_map),如果启动不了的话,需要结合调试信息修改。其他的细节包含PCIe,SATA口这些,这个开始移植的时候可以暂时不动或者全部打开,后续再细化。
我已经很长时间没搞过coreboot了,剩下的问题我也不熟。
RE: [讨论] 如何移植coreboot到Skylake及更新的Intel主板? - 维格纳朋友 - 02-07-2023
(02-06-2023, 11:13 PM)vimacs 提到: (02-06-2023, 07:41 PM)维格纳朋友 提到: V大,我搞到一块MSI B85M-E45 (MS-7817) ,我看着平台很老,当时就想折腾一下coreboot,于是搜了一下。
https://coreboot.org/releases/coreboot-4.14-relnotes.txt
coreboot-4.14似乎支持同代号MSI H81M-P33(MS-7817) 。
但我不知道我还要做些什么才能移植coreboot。
能复用MSI H81M-P33的支持吗?
我今天在 reddit 看到有人问这个问题,应该是你发的吧。我也建议你用 autoport 先生成一套基础的代码,剩下的可以参考一下 H81M-P33 的。内存插槽的SPD映射比较重要(mb_get_spd_map),如果启动不了的话,需要结合调试信息修改。其他的细节包含PCIe,SATA口这些,这个开始移植的时候可以暂时不动或者全部打开,后续再细化。
我已经很长时间没搞过coreboot了,剩下的问题我也不熟。 已经用autoport生成配置了,mb_get_spd_map也修正了,红迪那边说是还要配gpio和superio。
b85m-e45.zip (大小: 3.74 KB / 下载: 0)
我看见生成的文件里有gpio.c,gpio不用管了吧?
superio怎么生成来着?
查查是不是和h81m-p33是不是用同一块superio?
然后复用bootblock.c?
--------------------------------
确认了使用的同一块NCT6779D作为SUPERIO。
我只要复制h81m-p33的bootblock.c就好了?
b85m-e45(适配完毕).zip (大小: 4.09 KB / 下载: 0)
似乎是弄完了。
superiotool似乎有BUG,没有正确输出。
RE: [讨论] 如何移植coreboot到Skylake及更新的Intel主板? - vimacs - 02-08-2023
(02-07-2023, 11:03 PM)维格纳朋友 提到: (02-06-2023, 11:13 PM)vimacs 提到: (02-06-2023, 07:41 PM)维格纳朋友 提到: V大,我搞到一块MSI B85M-E45 (MS-7817) ,我看着平台很老,当时就想折腾一下coreboot,于是搜了一下。
https://coreboot.org/releases/coreboot-4.14-relnotes.txt
coreboot-4.14似乎支持同代号MSI H81M-P33(MS-7817) 。
但我不知道我还要做些什么才能移植coreboot。
能复用MSI H81M-P33的支持吗?
我今天在 reddit 看到有人问这个问题,应该是你发的吧。我也建议你用 autoport 先生成一套基础的代码,剩下的可以参考一下 H81M-P33 的。内存插槽的SPD映射比较重要(mb_get_spd_map),如果启动不了的话,需要结合调试信息修改。其他的细节包含PCIe,SATA口这些,这个开始移植的时候可以暂时不动或者全部打开,后续再细化。
我已经很长时间没搞过coreboot了,剩下的问题我也不熟。 已经用autoport生成配置了,mb_get_spd_map也修正了,红迪那边说是还要配gpio和superio。
我看见生成的文件里有gpio.c,gpio不用管了吧?
superio怎么生成来着?
查查是不是和h81m-p33是不是用同一块superio?
然后复用bootblock.c?
--------------------------------
确认了使用的同一块NCT6779D作为SUPERIO。
我只要复制h81m-p33的bootblock.c就好了?
似乎是弄完了。
superiotool似乎有BUG,没有正确输出。
gpio用autoport生成的gpio.c就行了。superio的代码要自己写,相同的superio的话,直接复制h81m-p33的就行了,除了 bootblock.c 之外,还有 devicetree.cb 的 lpc 下的那部分,还有在 Kconfig 里加上 CONFIG_SUPERIO_.... 的部分。superiotool没输出可能是因为它的数据库里没有这个。
RE: [讨论] 如何移植coreboot到Skylake及更新的Intel主板? - 维格纳朋友 - 02-08-2023
(02-08-2023, 09:28 AM)vimacs 提到: (02-07-2023, 11:03 PM)维格纳朋友 提到: (02-06-2023, 11:13 PM)vimacs 提到: (02-06-2023, 07:41 PM)维格纳朋友 提到: V大,我搞到一块MSI B85M-E45 (MS-7817) ,我看着平台很老,当时就想折腾一下coreboot,于是搜了一下。
https://coreboot.org/releases/coreboot-4.14-relnotes.txt
coreboot-4.14似乎支持同代号MSI H81M-P33(MS-7817) 。
但我不知道我还要做些什么才能移植coreboot。
能复用MSI H81M-P33的支持吗?
我今天在 reddit 看到有人问这个问题,应该是你发的吧。我也建议你用 autoport 先生成一套基础的代码,剩下的可以参考一下 H81M-P33 的。内存插槽的SPD映射比较重要(mb_get_spd_map),如果启动不了的话,需要结合调试信息修改。其他的细节包含PCIe,SATA口这些,这个开始移植的时候可以暂时不动或者全部打开,后续再细化。
我已经很长时间没搞过coreboot了,剩下的问题我也不熟。 已经用autoport生成配置了,mb_get_spd_map也修正了,红迪那边说是还要配gpio和superio。
我看见生成的文件里有gpio.c,gpio不用管了吧?
superio怎么生成来着?
查查是不是和h81m-p33是不是用同一块superio?
然后复用bootblock.c?
--------------------------------
确认了使用的同一块NCT6779D作为SUPERIO。
我只要复制h81m-p33的bootblock.c就好了?
似乎是弄完了。
superiotool似乎有BUG,没有正确输出。
gpio用autoport生成的gpio.c就行了。superio的代码要自己写,相同的superio的话,直接复制h81m-p33的就行了,除了 bootblock.c 之外,还有 devicetree.cb 的 lpc 下的那部分,还有在 Kconfig 里加上 CONFIG_SUPERIO_.... 的部分。superiotool没输出可能是因为它的数据库里没有这个。 https://ticket.coreboot.org/issues/455
superiotool直接寄了。
不知道是不是错误的检测。
说是gdb下断点。
不知道给哪个函数下断点。
如果superiotool正常工作,大概superio的部分也会被正常生成。
老实说这个状态,感觉开发者可以用SSH直接远程调试。
romstage.c里的void mainboard_config_superio并没有被正常配置。
注释掉就好了吧?
设备树那边用h81m-p33设备树里的
代码: chip superio/nuvoton/nct6779d
device pnp 4e.1 off end # Parallel
device pnp 4e.2 on # UART A
io 0x60 = 0x3f8
irq 0x70 = 4
end
device pnp 4e.3 off end # UART B, IR
device pnp 4e.5 on # Keyboard
io 0x60 = 0x60
io 0x62 = 0x64
irq 0x70 = 1
irq 0x72 = 12
end
device pnp 4e.6 off end # CIR
device pnp 4e.7 off end # GPIO6-8
device pnp 4e.8 off end # WDT1, GPIO0, GPIO1
device pnp 4e.108 on end # GPIO0
device pnp 4e.9 off end # GPIO1-8
device pnp 4e.109 off end # GPIO1
device pnp 4e.209 off end # GPIO2
device pnp 4e.309 off end # GPIO3
device pnp 4e.409 off end # GPIO4
device pnp 4e.509 off end # GPIO5
device pnp 4e.609 off end # GPIO6
device pnp 4e.709 off end # GPIO7
device pnp 4e.a on end # ACPI
device pnp 4e.b on # H/W Monitor, FP LED
io 0x60 = 0x290
io 0x62 = 0
irq 0x70 = 0
end
device pnp 4e.d off end # WDT1
device pnp 4e.e off end # CIR Wake-up
device pnp 4e.f off end # Push-pull/Open-drain
device pnp 4e.14 off end # Port 80 UART
device pnp 4e.16 off end # Deep Sleep
end
直接换掉生成的
代码: subsystemid 0x1462 0x7817
?
RE: [讨论] 如何移植coreboot到Skylake及更新的Intel主板? - vimacs - 02-08-2023
(02-08-2023, 10:57 AM)维格纳朋友 提到: 如果superiotool正常工作,大概superio的部分也会被正常生成。
老实说这个状态,感觉开发者可以用SSH直接远程调试。
romstage.c里的void mainboard_config_superio并没有被正常配置。
注释掉就好了吧?
设备树那边用h81m-p33设备树里的
代码: chip superio/nuvoton/nct6779d
device pnp 4e.1 off end # Parallel
device pnp 4e.2 on # UART A
io 0x60 = 0x3f8
irq 0x70 = 4
end
device pnp 4e.3 off end # UART B, IR
device pnp 4e.5 on # Keyboard
io 0x60 = 0x60
io 0x62 = 0x64
irq 0x70 = 1
irq 0x72 = 12
end
device pnp 4e.6 off end # CIR
device pnp 4e.7 off end # GPIO6-8
device pnp 4e.8 off end # WDT1, GPIO0, GPIO1
device pnp 4e.108 on end # GPIO0
device pnp 4e.9 off end # GPIO1-8
device pnp 4e.109 off end # GPIO1
device pnp 4e.209 off end # GPIO2
device pnp 4e.309 off end # GPIO3
device pnp 4e.409 off end # GPIO4
device pnp 4e.509 off end # GPIO5
device pnp 4e.609 off end # GPIO6
device pnp 4e.709 off end # GPIO7
device pnp 4e.a on end # ACPI
device pnp 4e.b on # H/W Monitor, FP LED
io 0x60 = 0x290
io 0x62 = 0
irq 0x70 = 0
end
device pnp 4e.d off end # WDT1
device pnp 4e.e off end # CIR Wake-up
device pnp 4e.f off end # Push-pull/Open-drain
device pnp 4e.14 off end # Port 80 UART
device pnp 4e.16 off end # Deep Sleep
end
直接换掉生成的
代码: subsystemid 0x1462 0x7817
?
autoport 没有生成 superio 代码的功能,这块还是要自己做。
h81m-p33 的 superio 初始化是在 bootblock.c 的 mainboard_config_superio 实现的,目的是把串口打开,从而可以利用串口获取调试信息。而 devicetree.cb 里面的 superio 是 ramstage 初始化 superio 用的,属于后续细化的操作。
h81m-p33 的 lpc 下面没有 subsystemid 这行,是因为它的 devicetree.cb 在 "device domain 0 on" 那行下面已经有一行 "subsystemid 0x1462 0x7817 inherit", 所以下面节点相同 subsystemid 的那些 "subsystemid 0x1462 0x7817" 都可以省略掉,你可以考虑做相同的简化。“chip superio/nuvoton/nct6779d” 这整块代码的确可以直接贴到 LPC 下,也就是 “device pci 1f.0 on” 这个节点。
RE: [讨论] 如何移植coreboot到Skylake及更新的Intel主板? - 维格纳朋友 - 02-08-2023
(02-08-2023, 11:17 AM)vimacs 提到: (02-08-2023, 10:57 AM)维格纳朋友 提到: 如果superiotool正常工作,大概superio的部分也会被正常生成。
老实说这个状态,感觉开发者可以用SSH直接远程调试。
romstage.c里的void mainboard_config_superio并没有被正常配置。
注释掉就好了吧?
设备树那边用h81m-p33设备树里的
代码: chip superio/nuvoton/nct6779d
device pnp 4e.1 off end # Parallel
device pnp 4e.2 on # UART A
io 0x60 = 0x3f8
irq 0x70 = 4
end
device pnp 4e.3 off end # UART B, IR
device pnp 4e.5 on # Keyboard
io 0x60 = 0x60
io 0x62 = 0x64
irq 0x70 = 1
irq 0x72 = 12
end
device pnp 4e.6 off end # CIR
device pnp 4e.7 off end # GPIO6-8
device pnp 4e.8 off end # WDT1, GPIO0, GPIO1
device pnp 4e.108 on end # GPIO0
device pnp 4e.9 off end # GPIO1-8
device pnp 4e.109 off end # GPIO1
device pnp 4e.209 off end # GPIO2
device pnp 4e.309 off end # GPIO3
device pnp 4e.409 off end # GPIO4
device pnp 4e.509 off end # GPIO5
device pnp 4e.609 off end # GPIO6
device pnp 4e.709 off end # GPIO7
device pnp 4e.a on end # ACPI
device pnp 4e.b on # H/W Monitor, FP LED
io 0x60 = 0x290
io 0x62 = 0
irq 0x70 = 0
end
device pnp 4e.d off end # WDT1
device pnp 4e.e off end # CIR Wake-up
device pnp 4e.f off end # Push-pull/Open-drain
device pnp 4e.14 off end # Port 80 UART
device pnp 4e.16 off end # Deep Sleep
end
直接换掉生成的
代码: subsystemid 0x1462 0x7817
?
autoport 没有生成 superio 代码的功能,这块还是要自己做。
h81m-p33 的 superio 初始化是在 bootblock.c 的 mainboard_config_superio 实现的,目的是把串口打开,从而可以利用串口获取调试信息。而 devicetree.cb 里面的 superio 是 ramstage 初始化 superio 用的,属于后续细化的操作。
h81m-p33 的 lpc 下面没有 subsystemid 这行,是因为它的 devicetree.cb 在 "device domain 0 on" 那行下面已经有一行 "subsystemid 0x1462 0x7817 inherit", 所以下面节点相同 subsystemid 的那些 "subsystemid 0x1462 0x7817" 都可以省略掉,你可以考虑做相同的简化。“chip superio/nuvoton/nct6779d” 这整块代码的确可以直接贴到 LPC 下,也就是 “device pci 1f.0 on” 这个节点。 那到这一步,移植是已经做完了。
剩下的是帮superiotool debug吧。
RE: [讨论] 如何移植coreboot到Skylake及更新的Intel主板? - vimacs - 02-08-2023
(02-08-2023, 11:25 AM)维格纳朋友 提到: (02-08-2023, 11:17 AM)vimacs 提到: (02-08-2023, 10:57 AM)维格纳朋友 提到: 如果superiotool正常工作,大概superio的部分也会被正常生成。
老实说这个状态,感觉开发者可以用SSH直接远程调试。
romstage.c里的void mainboard_config_superio并没有被正常配置。
注释掉就好了吧?
设备树那边用h81m-p33设备树里的
代码: chip superio/nuvoton/nct6779d
device pnp 4e.1 off end # Parallel
device pnp 4e.2 on # UART A
io 0x60 = 0x3f8
irq 0x70 = 4
end
device pnp 4e.3 off end # UART B, IR
device pnp 4e.5 on # Keyboard
io 0x60 = 0x60
io 0x62 = 0x64
irq 0x70 = 1
irq 0x72 = 12
end
device pnp 4e.6 off end # CIR
device pnp 4e.7 off end # GPIO6-8
device pnp 4e.8 off end # WDT1, GPIO0, GPIO1
device pnp 4e.108 on end # GPIO0
device pnp 4e.9 off end # GPIO1-8
device pnp 4e.109 off end # GPIO1
device pnp 4e.209 off end # GPIO2
device pnp 4e.309 off end # GPIO3
device pnp 4e.409 off end # GPIO4
device pnp 4e.509 off end # GPIO5
device pnp 4e.609 off end # GPIO6
device pnp 4e.709 off end # GPIO7
device pnp 4e.a on end # ACPI
device pnp 4e.b on # H/W Monitor, FP LED
io 0x60 = 0x290
io 0x62 = 0
irq 0x70 = 0
end
device pnp 4e.d off end # WDT1
device pnp 4e.e off end # CIR Wake-up
device pnp 4e.f off end # Push-pull/Open-drain
device pnp 4e.14 off end # Port 80 UART
device pnp 4e.16 off end # Deep Sleep
end
直接换掉生成的
代码: subsystemid 0x1462 0x7817
?
autoport 没有生成 superio 代码的功能,这块还是要自己做。
h81m-p33 的 superio 初始化是在 bootblock.c 的 mainboard_config_superio 实现的,目的是把串口打开,从而可以利用串口获取调试信息。而 devicetree.cb 里面的 superio 是 ramstage 初始化 superio 用的,属于后续细化的操作。
h81m-p33 的 lpc 下面没有 subsystemid 这行,是因为它的 devicetree.cb 在 "device domain 0 on" 那行下面已经有一行 "subsystemid 0x1462 0x7817 inherit", 所以下面节点相同 subsystemid 的那些 "subsystemid 0x1462 0x7817" 都可以省略掉,你可以考虑做相同的简化。“chip superio/nuvoton/nct6779d” 这整块代码的确可以直接贴到 LPC 下,也就是 “device pci 1f.0 on” 这个节点。 那到这一步,移植是已经做完了。
剩下的是帮superiotool debug吧。
你先把代码编译通过,把 coreboot 刷到主板的 flash (记得备份原有的flash的内容),看到主板正常启动才叫把移植做完。
debug superiotool 的事是另一个工作。
|