WeHack BBS
[讨论] 如何移植coreboot到Skylake及更新的Intel主板? - 可打印的版本

+- WeHack BBS (https://bbs.wehack.space)
+-- 版块: 计算机技术 (https://bbs.wehack.space/forum-5.html)
+--- 版块: 固件技术讨论区 (https://bbs.wehack.space/forum-8.html)
+--- 主题: [讨论] 如何移植coreboot到Skylake及更新的Intel主板? (/thread-322.html)

页: 1 2 3 4 5


[讨论] 如何移植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。

.zip   b85m-e45.zip (大小: 3.74 KB / 下载: 0)
我看见生成的文件里有gpio.c,gpio不用管了吧?
superio怎么生成来着?
查查是不是和h81m-p33是不是用同一块superio?
然后复用bootblock.c?
--------------------------------
确认了使用的同一块NCT6779D作为SUPERIO。
我只要复制h81m-p33的bootblock.c就好了?

.zip   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 的事是另一个工作。