1e0dea671SAndre PrzywaraRaspberry Pi 4 2e0dea671SAndre Przywara============== 3e0dea671SAndre Przywara 4e0dea671SAndre PrzywaraThe `Raspberry Pi 4`_ is an inexpensive single-board computer that contains four 5e0dea671SAndre PrzywaraArm Cortex-A72 cores. Also in contrast to previous Raspberry Pi versions this 6e0dea671SAndre Przywaramodel has a GICv2 interrupt controller. 7e0dea671SAndre Przywara 8e0dea671SAndre PrzywaraThis port is a minimal port to support loading non-secure EL2 payloads such 9e0dea671SAndre Przywaraas a 64-bit Linux kernel. Other payloads such as U-Boot or EDK-II should work 10e0dea671SAndre Przywaraas well, but have not been tested at this point. 11e0dea671SAndre Przywara 12e0dea671SAndre Przywara**IMPORTANT NOTE**: This port isn't secure. All of the memory used is DRAM, 13e0dea671SAndre Przywarawhich is available from both the Non-secure and Secure worlds. The SoC does 14e0dea671SAndre Przywaranot seem to feature a secure memory controller of any kind, so portions of 15e0dea671SAndre PrzywaraDRAM can't be protected properly from the Non-secure world. 16e0dea671SAndre Przywara 17e0dea671SAndre PrzywaraBuild Instructions 18e0dea671SAndre Przywara------------------ 19e0dea671SAndre Przywara 20e0dea671SAndre PrzywaraThere are no real configuration options at this point, so there is only 21e0dea671SAndre Przywaraone universal binary (bl31.bin), which can be built with: 22e0dea671SAndre Przywara 23e0dea671SAndre Przywara.. code:: shell 24e0dea671SAndre Przywara 25650a435cSMark Dykes CROSS_COMPILE=aarch64-linux-gnu- make PLAT=rpi4 DEBUG=1 26e0dea671SAndre Przywara 2743309051SJan KiszkaCopy the generated build/rpi4/debug/bl31.bin to the SD card, adding an entry 2843309051SJan Kiszkastarting with ``armstub=``, then followed by the respective file name to 2943309051SJan Kiszka``config.txt``. You should have AArch64 code in the file loaded as the 3043309051SJan Kiszka"kernel", as BL31 will drop into AArch64/EL2 to the respective load address. 31e0dea671SAndre Przywaraarm64 Linux kernels are known to work this way. 32e0dea671SAndre Przywara 33e0dea671SAndre PrzywaraOther options that should be set in ``config.txt`` to properly boot 64-bit 34e0dea671SAndre Przywarakernels are: 35e0dea671SAndre Przywara 36e0dea671SAndre Przywara:: 37e0dea671SAndre Przywara 38e0dea671SAndre Przywara enable_uart=1 39e0dea671SAndre Przywara arm_64bit=1 40e0dea671SAndre Przywara enable_gic=1 41e0dea671SAndre Przywara 42e0dea671SAndre PrzywaraThe BL31 code will patch the provided device tree blob in memory to advertise 43e0dea671SAndre PrzywaraPSCI support, also will add a reserved-memory node to the DT to tell the 44e0dea671SAndre Przywaranon-secure payload to not touch the resident TF-A code. 45e0dea671SAndre Przywara 46e0dea671SAndre PrzywaraIf you connect a serial cable between the Mini UART and your computer, and 47e0dea671SAndre Przywaraconnect to it (for example, with ``screen /dev/ttyUSB0 115200``) you should 48e0dea671SAndre Przywarasee some text from BL31, followed by the output of the EL2 payload. 49e0dea671SAndre PrzywaraThe command line provided is read from the ``cmdline.txt`` file on the SD card. 50e0dea671SAndre Przywara 51e0dea671SAndre PrzywaraTF-A port design 52e0dea671SAndre Przywara---------------- 53e0dea671SAndre Przywara 54e0dea671SAndre PrzywaraIn contrast to the existing Raspberry Pi 3 port this one here is a BL31-only 55e0dea671SAndre Przywaraport, also it deviates quite a lot from the RPi3 port in many other ways. 56e0dea671SAndre PrzywaraThere is not so much difference between the two models, so eventually those 57e0dea671SAndre Przywaratwo could be (more) unified in the future. 58e0dea671SAndre Przywara 59e0dea671SAndre PrzywaraAs with the previous models, the GPU and its firmware are the first entity to 60e0dea671SAndre Przywararun after the SoC gets its power. The on-chip Boot ROM loads the next stage 61e0dea671SAndre Przywara(bootcode.bin) from flash (EEPROM), which is again GPU code. 62e0dea671SAndre PrzywaraThis part knows how to access the MMC controller and how to parse a FAT 63*47147013SDavid Horstmannfilesystem, so it will load further components and configuration files 64e0dea671SAndre Przywarafrom the first FAT partition on the SD card. 65e0dea671SAndre Przywara 66e0dea671SAndre PrzywaraTo accommodate this existing way of configuring and setting up the board, 67e0dea671SAndre Przywarawe use as much of this workflow as possible. 68e0dea671SAndre PrzywaraIf bootcode.bin finds a file called ``armstub8.bin`` on the SD card or it gets 69e0dea671SAndre Przywarapointed to such code by finding a ``armstub=`` key in ``config.txt``, it will 70e0dea671SAndre Przywaraload this file to the beginning of DRAM (address 0) and execute it in 71e0dea671SAndre PrzywaraAArch64 EL3. 72e0dea671SAndre PrzywaraBut before doing that, it will also load a "kernel" and the device tree into 73e0dea671SAndre Przywaramemory. The load addresses have a default, but can also be changed by 74e0dea671SAndre Przywarasetting them in ``config.txt``. If the GPU firmware finds a magic value in the 75e0dea671SAndre Przywaraarmstub image file, it will put those two load addresses in memory locations 76e0dea671SAndre Przywaranear the beginning of memory, where TF-A code picks them up. 77e0dea671SAndre Przywara 78e0dea671SAndre PrzywaraTo keep things simple, we will just use the kernel load address as the BL33 79e0dea671SAndre Przywaraentry point, also put the DTB address in the x0 register, as requested by 80e0dea671SAndre Przywarathe arm64 Linux kernel boot protocol. This does not necessarily mean that 81e0dea671SAndre Przywarathe EL2 payload needs to be a Linux kernel, a bootloader or any other kernel 82e0dea671SAndre Przywarawould work as well, as long as it can cope with having the DT address in 83e0dea671SAndre Przywararegister x0. If the payload has other means of finding the device tree, it 84e0dea671SAndre Przywaracould ignore this address as well. 85