HiKey960

= Xen ARM64 on 96boards HiKey960 =
NOTE that Hikey 960 is very different than Hikey! DO NOT TRY TO USE INSTRUCTIONS OR BINARIES FOR HIKEY
Xen is now supported upstream on the 96boards HiKey, however beware that to run Xen on HiKey you ought to get the 96Boards UART Serial Adapter, available here, or here.
You can do it without the serial adapter but it is hard - as you do not have any output.
= Requirements =
To use Xen under this board you need to flash it with EDK2 (TianoCore) so it boots
in UEFI mode. You can then boot Xen using either method:
* GRUB
* UEFI Shell (bundled in UEFI)
The following git trees and branches are known to work:
* https://github.com/96boards-hikey/edk2.git #testing/hikey960_v2.5
* https://github.com/96boards-hikey/OpenPlatformPkg.git #testing/hikey960_v1.3.4
* https://git.savannah.gnu.org/git/grub.git #master
* https://github.com/96boards-hikey/linux.git #hikey960-upstream-rebase
* https://github.com/96boards-hikey/tools-images-hikey960.git #master
* git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git #master
Flashing the Hikey 960 is using the fastboot mechanism. This guide explains how
to build (or get pre-built) the:
* ptable - aka Partition Table layout for the 32GB NAND
* xloader - the initial secure mode loader
* fastboot - the image with fastboot and UEFI firmware
* fip - No idea
* boot - The FAT32 64MB partition containing GRUB (or xen.efi if desired)
* system - The rootfs (Ext4) containing the OS and /boot directory for GRUB to search.
You can retrieve rootfs from Latest RPB
, look for rpb-console-image-hikey960-<some number>.rootfs.img.gz
Linaro latest ARM64 developer images can be used as well.
And also you need the boot-0.0+AUTOINC+<some number>hikey960-<some number>.uefi.img
from Latest RPB
Keep in mind that the version of Linux that is on this web-site is not built with Xen support so you will need
to build Linux from scratch (see below).
= Building UEFI =
All the files needed are pre-built and available at Debug.
The instructions are (if you prefer to build it from source) are available at README - ATF UEFI build from source.
If you are downloading the binaries already pre-built - then start in instructions at Boot UEFI in recovery mode (and yes it makes no sense as you do not have
UEFI installed).
The recovery mode is described in Step 3 Enter recovery forced download mode.
Follow exactly the steps - especially the Prepare the config file.
Before you flash the boot.img (boot-0.0.. so on) and system.img (rpb-console-<something>rootfs.img.gz it is recommended you modify these two images. See below.
= Building Linux =
You need to build Linux before Xen or GRUB as you will need the DTB file to seed GRUB2.
The prebuilt version of Linux that is available at Latest RPB
is not built with CONFIG_XEN so you need to compile you own.
Fortunately the instructions are simple
 git clone https://github.com/96boards-hikey/linux.git
 cd linux
 git checkout origin/hikey960-upstream-rebase
 export CROSS_COMPILE=aarch64-linux-gnu-
 export ARCH=arm64
 make defconfig
 make -j8
 cp -f arch/$ARCH/boot/Image ../Image
 cp -f arch/$ARCH/boot/dts/hisilicon/hi3660-hikey960.dtb ../Image.dtb
The Image and Image.dtb will be put in the rootfs you have downloaded.
= Building Xen =
Upstream Xen is to be used:
 git clone git://xenbits.xen.org/xen.git
 cd xen/xen
 export CROSS_COMPILE=aarch64-linux-gnu-
 export ARCH=arm64
 export XEN_TARGET_ARCH=arm64
 make defconfig
 make -j8
 cp xen.efi ../../
The xen.efi will be put in the rootfs you have downloaded. 
= Extract the wl18xx-fw-4.bin so your WiFi will work =
 git clone git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
 cd linux-firmware
 cp ti-connectivity/wl18xx-fw-4.bin ../
The wl18xx-fw-4.bin will be used in your rootfs you have downloaded.
= Modify rootfs =
Use any rootfs you wish. For example Latest Linaro ARM64 developer can be used.
 https://releases.linaro.org/debian/images/developer-arm64/latest/linaro-stretch-developer-20170720-71.tar.gz
 sudo tar -xzf linaro-stretch-developer-20170720-71.tar.gz
 sudo mv binary rootfs
 sudo cp Image rootfs/boot
 sudo cp Image.dtb rootfs/boot
 sudo cp xen.efi rootfs/boot
 sudo mkdir -p rootfs/lib/firmware/ti-connectivity
 sudo cp wl18xx-fw-4.bin rootfs/lib/firmware/ti-connectivity
Modify the rootfs/boot/grub.cfg to your satisfaction (see below in Building GRUB section).
== Create new rootfs ==
 mkdir loop
 dd if=/dev/zero of=rootfs.img bs=1M count=2096
 mkfs.ext4 -F -L rootfs rootfs.img #kernel use the label rootfs to mount the rootfs as /
 sudo mount -o loop rootfs.img loop
 cd rootfs
 sudo tar -cf - * | (cd ../loop;sudo tar -xf - )
 sudo umount loop
 img2simg rootfs.img rootfs.sparse.img 4096
Whenever the instructions asks you to fastboot flash system system.img instead of system.img use rootfs.sparse.img
= Building GRUB =
The upstream version of GRUB #master has the patches to boot Xen hypervisor using the xen_boot module.
The stanza you will need to boot Xen is very simple:
 menuentry 'Xen' {
 xen_hypervisor /boot/xen.efi loglvl=all console=dtuart dtuart=/soc/serial@fff32000 efi=no-rs
 xen_module /boot/Image console=tty0 console=hvc0 root=/dev/sdd10 rw efi=noruntime
 devicetree /boot/Image.dtb
 }
 
But the version of GRUB which is in the boot.img is an older version. Hence you need to build it from scratch.
 git clone https://git.savannah.gnu.org/git/grub.git
 cd grub
 export CROSS_COMPILE=aarch64-linux-gnu-
 export ARCH=arm64
 ./configure --prefix=/usr --target=aarch64-linux-gnu --with-platform=efi
 make
 mkdir ../grub-install
 make DESTDIR=`pwd`/../grub-install install
 cd ../
The next step is to create grubaa64.efi. You create it by providing to grub-mkimage a list of modules. You
need xen_boot but also other ones.
Also you need to provide an embedded configuration file grub.config
 $cat grub.config
 search.fs_label rootfs root
 set prefix=($root)/boot/grub
 configfile $prefix/grub.cfg
NOTE. The fs.label will search for a partition called rootfs. It should match exactly with what you had
called it when you invoked mkfs.ext4 .. -L rootfs.
To create grubaa64.efi:
 GRUB_MODULES="boot chain configfile echo efinet eval ext2 fat font gettext gfxterm gzio help linux loadenv lsefi normal part_gpt part_msdos read regexp search search_fs_file search_fs_uuid search_label terminal terminfo test tftp time xen_boot"
 grub-install/usr/bin/grub-mkimage 
 --config grub.config \
 --dtb Image.dtb \
 --directory=`pwd`/grub-install/usr/lib64/grub/arm64-efi \
 --output=grubaa64.efi \
 --format=arm64-efi \
 --prefix="/boot/grub" \
 $GRUB_MODULES
= Update boot.img =
 sudo mount boot-0.0+AUTOINC+<some number>hikey960-<some number>.uefi.img loop -o loop
 cp grubaa64.efi loop/EFI/BOOT
 sudo umount loop
= Flash boot.img and system.img =
If you were following README ATF UEFI Build from source
you should replace the calls of:
 $sudo fastboot flash boot boot.img
 $sudo fastboot flash system system.img
with:
 $sudo fastboot flash boot boot-0.0+AUTOINC+<some number>hikey960-<some number>.uefi.img 
 $sudo fastboot flash system rootfs.sparse.img
Once the flash is complete, and you have moved the device to Normal boot and rebooted
the device, you will be greeted with:
 GNU GRUB version 2.03
 /----------------------------------------------------------------------------\
 |*Xen | 
 | CE Reference Platform (HiKey960 rpb) |
 | Fastboot |
 | |
 | |
 | |
 | |
 | |
 | |
 | |
 | |
 | | 
 \----------------------------------------------------------------------------/
 Use the ^ and v keys to select which entry is highlighted. 
 Press enter to boot the selected OS, `e' to edit the commands 
 before booting or `c' for a command-line. ESC to return previous 
 menu. 
 
= Install the rest of Xen (tools, etc) =
At this point you are booted in and should be able to use the WiFi.
The instructions at Networking CLI should
provide the guidance on how to setup WiFi using the command line.
Once you have the network you can download Xen and built the toolstack natively
on your Hikey 960!