Heterogeneous multiprocessor SoCs are becoming more common for use in application areas such as advanced driver assistance systems (ADAS) and autonomous vehicles, networking, industrial automation, security, video analytics and machine learning. These SoCs often have GPUs and/or hardware accelerator units that work together on a common set of data, however, the simplest coherent processing systems use multiple clusters of CPUs. These CPU clusters can be homogeneous, or heterogeneous, such as with ARM’s big.LITTLE configuration or Imagination’s MIPS I6500 architecture.
Linux has become the general purpose operating system of choice for embedded systems, and now for these heterogeneous multi-cluster architectures Linux needs to be modified to support the coherence between the clusters, as well as whatever differences exist between the clusters in terms of number of processors, processor type, and other features and capabilities. Most vendors use an open source Linux distribution from their processor IP vendor, then build a custom distribution representing the cluster/processor configuration and device tree supported for the specific SoC. This custom Linux distribution needs to include the necessary drivers for the peripherals on the SoC, as well as supporting other customizations and unique features. Obviously, this gets quite complex, and the complexity keeps increasing with increasing device complexity, including coherence.
This need to port, customize and bring up Linux on these heterogeneous SoCs requires significant engineering effort by the SoC developer. Also, their customers do not always reward this effort by paying more for the SoCs. So how can the semiconductor vendors make this Linux task more efficient? What are the best practices for Linux porting and bring up on heterogeneous multi-cluster/multiprocessor SoCs?
This tutorial is presented in two sections. In the first section (Imagination Technologies), the various components of the Linux distribution are covered, including the basic Linux kernel, device trees and other customizations, SMP variations and drivers, both static and dynamic. Coherency for multi-cluster architectures is also discussed. The methodology used for bring up of the Linux kernel, starting with boot loaders including U-boot, on hardware is presented.
The second section (Imperas) discusses the development of a robust test environment using virtual platform technology. The virtual platform provides a complementary approach to porting and bring-up on hardware. The benefits of controllability, observability and repeatability for virtual platform use are covered. Automated testing, such as needed for an Agile Continuous Integration (CI) development and test methodology is discussed. Specific OS-aware tools are also highlighted, plus other tools such as non-intrusive memory monitors, the use of software assertions, and code and functional coverage techniques for the operating system and drivers.