DeviceTree 启动

在 Linux/ppc64 内核的开发过程中,更具体地说是添加旧 IBM pSeries/iSeries 对之外的新平台类型时,决定强制执行一些关于内核入口和引导加载程序 <-> 内核接口的严格规则,以避免 ppc32 内核入口点以及将新平台添加到内核的方式发生的退化。 传统的 iSeries 平台打破了这些规则,因为它早于这个方案,但是主树中不会接受任何不正确遵循这些规则的新板级支持。 此外,自从 ppc32 和 ppc64 的 arch/powerpc 合并架构出现以来,新的 32 位平台和进入 arch/powerpc 的 32 位平台也将需要使用这些规则。

将在下面更详细地定义的主要要求是存在一个设备树,其格式在 Open Firmware 规范之后定义。 但是,为了简化嵌入式板供应商的生活,内核不要求设备树代表系统中的每个设备,而只需要存在一些节点和属性。 例如,内核不要求您为系统中的每个 PCI 设备创建一个节点。 必须具有 PCI 主桥的节点,以便提供中断路由信息和内存/IO 范围等。 还建议为片上设备和其他不完全适合现有 OF 规范的总线定义节点。 这在内核可以探测这些设备并将驱动程序与设备匹配的方式上创造了很大的灵活性,而无需硬编码各种表格。 它还使板供应商可以更灵活地进行小的硬件升级,而不会显着影响内核代码或使其混乱特殊情况。

入口点

内核只有一个入口点,位于内核映像的开头。 该入口点支持两种调用约定

a) 从 Open Firmware 启动。 如果您的固件与 Open Firmware (IEEE 1275) 兼容或提供与 OF 兼容的客户端接口 API(不需要对 Forth 字的“interpret”回调的支持),则可以使用以下方式进入内核:

r5:由 IEEE 1275 定义的 powerpc 绑定的 OF 回调指针。 当前仅支持 32 位客户端接口

r3, r4:任何 initrd 的地址和长度,如果存在,否则为 0

MMU 处于开启或关闭状态; 内核将运行位于 arch/powerpc/kernel/prom_init.c 中的 trampoline,以从开放固件中提取设备树和其他信息,并构建一个扁平化的设备树,如 b) 中所述。 prom_init() 将使用第二种方法重新进入内核。 此 trampoline 代码在固件的上下文中运行,固件应该处理该时间内的所有异常。

b) 使用扁平化的设备树块直接进入。 此入口点由 a) 在 OF trampoline 之后调用,也可以由不支持 Open Firmware 客户端接口的引导加载程序直接调用。 它也被“kexec”用于实现从先前运行的内核“热”启动新内核。 我将在本文档中更详细地描述此方法,因为方法 a) 只是标准的 Open Firmware,因此应根据定义它及其与 PowerPC 平台绑定的各种标准文档来实现。 然后入口点定义变为

r3:RAM 中设备树块(在第二章中定义)的物理指针

r4:内核本身的物理指针。 这被汇编代码用于在您以启用 MMU 和非 1:1 映射进入内核时正确禁用 MMU。

r5:NULL(用于与方法 a 区分)

关于 SMP 入口的说明:或者您的固件将您的其他 CPU 放在 ROM 中的某个睡眠循环或自旋循环中,您可以通过软重置或其他方式将它们取出,在这种情况下,您无需关心,或者您必须使用所有 CPU 进入内核。 如何使用方法 b) 执行此操作将在本文档的后续修订版中描述。

板级支持(平台)不是互斥的配置选项。 可以在单个内核映像中构建任意一组板级支持。 内核将根据设备树的内容“知道”要用于给定平台的功能集。 因此,您应该

a) 在 arch/powerpc/Kconfig 中添加您的平台支持作为 _boolean_ 选项,遵循 PPC_PSERIES 和 PPC_PMAC 的示例。 后者可能是一个很好的板级支持的例子,可以从它开始。

b) 将您的主平台文件创建为“arch/powerpc/platforms/myplatform/myboard_setup.c”,并在 CONFIG_ 选项的条件下将其添加到 Makefile 中。 此文件将定义一个类型为“ppc_md”的结构,其中包含通用代码将用于访问您的平台特定代码的各种回调

一个内核映像可以支持多个平台,但前提是这些平台具有相同的核心架构。 单个内核构建不能同时支持 Book E 的配置和具有经典 Powerpc 架构的配置。