|
@@ -0,0 +1,141 @@
|
|
|
+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.
|
|
|
+ The simpleImage is useful for booting systems with
|
|
|
+ an unknown firmware interface or for booting from
|
|
|
+ a debugger when no firmware is present (such as on
|
|
|
+ the Xilinx Virtex platform). The only assumption that
|
|
|
+ simpleImage makes is that RAM is correctly initialized
|
|
|
+ and that the MMU is either off or has RAM mapped to
|
|
|
+ base address 0.
|
|
|
+ simpleImage also supports inserting special platform
|
|
|
+ specific initialization code to the start of the bootup
|
|
|
+ sequence. The virtex405 platform uses this feature to
|
|
|
+ ensure that the cache is invalidated before caching
|
|
|
+ is enabled. Platform specific initialization code is
|
|
|
+ added as part of the wrapper script and is keyed on
|
|
|
+ the image target name. For example, all
|
|
|
+ simpleImage.virtex405-* targets will add the
|
|
|
+ virtex405-head.S initialization code (This also means
|
|
|
+ that the dts file for virtex405 targets should be
|
|
|
+ named (virtex405-<board>.dts). Search the wrapper
|
|
|
+ script for 'virtex405' and see the file
|
|
|
+ arch/powerpc/boot/virtex405-head.S for details.
|
|
|
+ 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 simpleImage.virtex405-ml403', then the
|
|
|
+build system will use arch/powerpc/boot/dts/walnut.dts to build
|
|
|
+treeImage.walnut and arch/powerpc/boot/dts/virtex405-ml403.dts to build
|
|
|
+the simpleImage.virtex405-ml403.
|
|
|
+
|
|
|
+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.
|