The OpenPower server platform comprises one or more Power8 processors, the latest of the IBM PowerPC family, and some kind of management controller to power on and monitor the state of the main processor(s). This post provides an overview of the different bits of open source firmware that are used to take the machine from power on all the way through to running your operating system.
The Tyan GN70-BP010 is the first OpenPower machine to ship. Known also by its codename Palmetto, it contains a single Power8 processor and an Aspeed AST2400 ARM System on Chip which we refer to as the Baseboard Management Controller (BMC). The BMC is a typical embedded ARM system: u-boot, Linux kernel and stripped down userspace. This firmware is built by OpenPower Foundation member AMI.
The BMC and the Power8 share a common memory mapped interface, called the LPC bus. This is the interface over which the Power8 accesses boot firmware, as well as boot time configuration, from a SPI attached PNOR flash, and speaks to the BMC’s IPMI stack over the BT interface.
When it comes to starting the Power8 the BMC wiggles a pin to kick the SBE (Self Boot Engine) into gear. This tiny processor in the Power8 loads the first stage firmware, called Hostboot, from PNOR and configures one of the Power8 threads to execute it from L3 cache. Hostboot is responsible for bringing up the internal buses in the Power8, as well as the rest of the cores, SDRAM memory, and another on-CPU microcontroller called the OCC (On Chip Controller).
When Hostboot is finished the procedures it loads a payload from the PNOR. This payload is the second stage firmware, known as Skiboot. Skiboot synchronises the timebase between all the CPU threads, brings up the PCIe buses, communicates with the management controller, and provides the runtime OPAL (Open Power Abstraction Layer) interface for the operating system to call into. Skiboot is also responsible for loading the next stage bootloader, which in this case is a Linux kernel and root file system that provide the Petitboot loader environment.
Petitboot is a bootloader that discovers all the disks and network devices in the system, and presents a menu for the user to select which OS to run. Petiboot looks for PXE configuration information, as well as parsing Grub configuration files found on local disks. Petitboot reads configration information from the NVRAM partition on the PNOR, which means it can be configured to boot from a specific network interface, hard drive, or even not boot at all and wait for user input. Once the boot OS has been selected, Petitboot uses the Linux kexec functionality to jump into the host kernel.