mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
6.6 KiB
131 lines
6.6 KiB
======================== |
|
The PowerPC boot wrapper |
|
======================== |
|
|
|
Copyright (C) Secret Lab Technologies Ltd. |
|
|
|
PowerPC image targets compresses and wraps the kernel image (vmlinux) with |
|
a boot wrapper to make it usable by the system firmware. There is no |
|
standard PowerPC firmware interface, so the boot wrapper is designed to |
|
be adaptable for each kind of image that needs to be built. |
|
|
|
The boot wrapper can be found in the arch/powerpc/boot/ directory. The |
|
Makefile in that directory has targets for all the available image types. |
|
The different image types are used to support all of the various firmware |
|
interfaces found on PowerPC platforms. OpenFirmware is the most commonly |
|
used firmware type on general purpose PowerPC systems from Apple, IBM and |
|
others. U-Boot is typically found on embedded PowerPC hardware, but there |
|
are a handful of other firmware implementations which are also popular. Each |
|
firmware interface requires a different image format. |
|
|
|
The boot wrapper is built from the makefile in arch/powerpc/boot/Makefile and |
|
it uses the wrapper script (arch/powerpc/boot/wrapper) to generate target |
|
image. The details of the build system is discussed in the next section. |
|
Currently, the following image format targets exist: |
|
|
|
==================== ======================================================== |
|
cuImage.%: Backwards compatible uImage for older version of |
|
U-Boot (for versions that don't understand the device |
|
tree). This image embeds a device tree blob inside |
|
the image. The boot wrapper, kernel and device tree |
|
are all embedded inside the U-Boot uImage file format |
|
with boot wrapper code that extracts data from the old |
|
bd_info structure and loads the data into the device |
|
tree before jumping into the kernel. |
|
|
|
Because of the series of #ifdefs found in the |
|
bd_info structure used in the old U-Boot interfaces, |
|
cuImages are platform specific. Each specific |
|
U-Boot platform has a different platform init file |
|
which populates the embedded device tree with data |
|
from the platform specific bd_info file. The platform |
|
specific cuImage platform init code can be found in |
|
`arch/powerpc/boot/cuboot.*.c`. Selection of the correct |
|
cuImage init code for a specific board can be found in |
|
the wrapper structure. |
|
|
|
dtbImage.%: Similar to zImage, except device tree blob is embedded |
|
inside the image instead of provided by firmware. The |
|
output image file can be either an elf file or a flat |
|
binary depending on the platform. |
|
|
|
dtbImages are used on systems which do not have an |
|
interface for passing a device tree directly. |
|
dtbImages are similar to simpleImages except that |
|
dtbImages have platform specific code for extracting |
|
data from the board firmware, but simpleImages do not |
|
talk to the firmware at all. |
|
|
|
PlayStation 3 support uses dtbImage. So do Embedded |
|
Planet boards using the PlanetCore firmware. Board |
|
specific initialization code is typically found in a |
|
file named arch/powerpc/boot/<platform>.c; but this |
|
can be overridden by the wrapper script. |
|
|
|
simpleImage.%: Firmware independent compressed image that does not |
|
depend on any particular firmware interface and embeds |
|
a device tree blob. This image is a flat binary that |
|
can be loaded to any location in RAM and jumped to. |
|
Firmware cannot pass any configuration data to the |
|
kernel with this image type and it depends entirely on |
|
the embedded device tree for all information. |
|
|
|
treeImage.%; Image format for used with OpenBIOS firmware found |
|
on some ppc4xx hardware. This image embeds a device |
|
tree blob inside the image. |
|
|
|
uImage: Native image format used by U-Boot. The uImage target |
|
does not add any boot code. It just wraps a compressed |
|
vmlinux in the uImage data structure. This image |
|
requires a version of U-Boot that is able to pass |
|
a device tree to the kernel at boot. If using an older |
|
version of U-Boot, then you need to use a cuImage |
|
instead. |
|
|
|
zImage.%: Image format which does not embed a device tree. |
|
Used by OpenFirmware and other firmware interfaces |
|
which are able to supply a device tree. This image |
|
expects firmware to provide the device tree at boot. |
|
Typically, if you have general purpose PowerPC |
|
hardware then you want this image format. |
|
==================== ======================================================== |
|
|
|
Image types which embed a device tree blob (simpleImage, dtbImage, treeImage, |
|
and cuImage) all generate the device tree blob from a file in the |
|
arch/powerpc/boot/dts/ directory. The Makefile selects the correct device |
|
tree source based on the name of the target. Therefore, if the kernel is |
|
built with 'make treeImage.walnut', then the build system will use |
|
arch/powerpc/boot/dts/walnut.dts to build treeImage.walnut. |
|
|
|
Two special targets called 'zImage' and 'zImage.initrd' also exist. These |
|
targets build all the default images as selected by the kernel configuration. |
|
Default images are selected by the boot wrapper Makefile |
|
(arch/powerpc/boot/Makefile) by adding targets to the $image-y variable. Look |
|
at the Makefile to see which default image targets are available. |
|
|
|
How it is built |
|
--------------- |
|
arch/powerpc is designed to support multiplatform kernels, which means |
|
that a single vmlinux image can be booted on many different target boards. |
|
It also means that the boot wrapper must be able to wrap for many kinds of |
|
images on a single build. The design decision was made to not use any |
|
conditional compilation code (#ifdef, etc) in the boot wrapper source code. |
|
All of the boot wrapper pieces are buildable at any time regardless of the |
|
kernel configuration. Building all the wrapper bits on every kernel build |
|
also ensures that obscure parts of the wrapper are at the very least compile |
|
tested in a large variety of environments. |
|
|
|
The wrapper is adapted for different image types at link time by linking in |
|
just the wrapper bits that are appropriate for the image type. The 'wrapper |
|
script' (found in arch/powerpc/boot/wrapper) is called by the Makefile and |
|
is responsible for selecting the correct wrapper bits for the image type. |
|
The arguments are well documented in the script's comment block, so they |
|
are not repeated here. However, it is worth mentioning that the script |
|
uses the -p (platform) argument as the main method of deciding which wrapper |
|
bits to compile in. Look for the large 'case "$platform" in' block in the |
|
middle of the script. This is also the place where platform specific fixups |
|
can be selected by changing the link order. |
|
|
|
In particular, care should be taken when working with cuImages. cuImage |
|
wrapper bits are very board specific and care should be taken to make sure |
|
the target you are trying to build is supported by the wrapper bits.
|
|
|