123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- 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.
|