Pulled from official Altera trunk and modified the handoff section. New handoff tool location and operations are explained accordingly.
Signed-off-by: Brian Sune <[email protected]> --- doc/README.socfpga | 412 ++++++++++++++++++++++++++++++++------------- 1 file changed, 295 insertions(+), 117 deletions(-) diff --git a/doc/README.socfpga b/doc/README.socfpga index e5adb62102b..ae87f4cd9da 100644 --- a/doc/README.socfpga +++ b/doc/README.socfpga @@ -1,168 +1,346 @@ ----------------------------------------- +--------------------------------------------------------------------- SOCFPGA Documentation for U-Boot and SPL ----------------------------------------- +--------------------------------------------------------------------- -This README is about U-Boot and SPL support for Altera's ARM Cortex-A9MPCore -based SOCFPGA. To know more about the hardware itself, please refer to -www.altera.com. +This README is about U-Boot and SPL support for Intel SOCFPGA. +To know more about the hardware itself, please refer to +https://www.intel.com/content/www/us/en/products/programmable/soc.html +Table of Contents --------------------------------------------------------------------- -Cyclone 5 / Arria 5 generating the handoff header files for U-Boot SPL + 1. Device Family Support vs Tested Intel Quartus + 2. Feature Support + 3. Major Changes and Known Issues + 4. Git branch naming convention + 5. Cyclone V / Arria V generating the handoff header files for U-Boot SPL + 6. Arria10 generating the handoff header files for U-Boot SPL + 7. mkimage for Cyclone V, Arria V and Arria 10 + 8. SDRAM secure region in U-boot ATF flow + 9. binman for U-boot ATF flow + + +1. Device Family Support vs Tested Intel Quartus --------------------------------------------------------------------- -This text is assuming quartus 16.1, but newer versions will probably work just fine too; -verified with DE1_SOC_Linux_FB demo project (https://github.com/VCTLabs/DE1_SOC_Linux_FB). -Updated/working projects should build using either process below. + Processor SOCFPGA Device Family Intel Quartus Prime Pro Edition Intel Quartus Prime Standard Edition + -------------------------------------------------------------------------------------------------------------------------------------------- + Dual-core ARM Cortex-A9 Cyclone V N/A 22.1 + Arria 10 23.2 N/A + + Quad-core ARM Cortex-A53 Stratix 10 23.2 N/A + Agilex 23.2 N/A + eASIC N5X 23.2 N/A + + +2. Feature Support +--------------------------------------------------------------------- -Note: it *should* work from Quartus 14.0.200 onwards, however, the current vendor demo -projects must have the IP cores updated as shown below. + Hardware Feature Cyclone V Arria 10 Stratix 10 Agilex eASIC N5X + Arria V + -------------------------------------------------------------------------------------------------------------------- + SDRAM Yes Yes Yes Yes Yes + HPS bridge (LWH2F, H2F, F2S) Yes Yes Yes Yes Yes + HPS cold/warm reset Yes Yes Yes Yes Yes + FPGA configuration Yes Yes Yes Yes No + Partial reconfiguration No No Yes Yes No + Ethernet (Synopsys EMAC controller) Yes Yes Yes Yes Yes + Synopsys GPIO controller Yes Yes Yes Yes Yes + Synopsys UART controller Yes Yes Yes Yes Yes + Synopsys USB controller Yes Yes Yes Yes Yes + Synopsys Watchdog timer Yes Yes Yes Yes Yes + Synopsys I2C master controller Yes Yes Yes Yes Yes + Synopsys SDMMC controller Yes Yes Yes Yes Yes + Cadence QSPI controller Yes Yes Yes Yes Yes + Denali NAND controller No Yes Yes Yes Yes + --------------------------------------------------------------------------------------------------------------------- + + Software Feature Cyclone V Arria 10 Stratix 10 Agilex eASIC N5X + Arria V + --------------------------------------------------------------------------------------------------------------------- + Remote System Update (RSU) [1] No No Yes Yes No + ARM Trusted Firmware (ATF) [2] No No Yes Yes Yes + Vendor Authorized Boot (VAB) No No No No Yes + --------------------------------------------------------------------------------------------------------------------- + + Notes: + [1] RSU SPT/CPB recovery features are supported with Quartus version 20.4 onwards + [2] ATF boot flow is supported with altera-opensource/arm-trusted-firmware branch:socfpga_v2.3 onwards + + +3. Major Changes and Known Issues +--------------------------------------------------------------------- -Rebuilding your Quartus project -------------------------------- + 3.1 Upgraded U-boot to version v2023.04 -Choose one of the follwing methods, either command line or GUI. -Using the command line -~~~~~~~~~~~~~~~~~~~~~~ -First run the embedded command shell, using your path to the Quartus install: +4. Git branch naming convention +--------------------------------------------------------------------- + This convention is important to direct all users of Intel SOCFPGA U-Boot repository to use + the appropriate branch. + + The syntax of branch naming will be "socfpga_v[year].[month][_RC]". For example, + "socfpga_v2021.04_RC" or "socfpga_v2021.01" + Where, + [year] is the year of the branch released. + [month] is the month of the branch released. + [_RC] is the label for branch categories, optional, based on the branch categories below. + + Generally, branches in Intel SOCFPGA U-Boot repository can be distincted into TWO categories, + which are with and without "RC" labeled. + + Branch with "RC" labeled + ~~~~~~~~~~~~~~~~~~~~~~~~ + A "RC" labeled branch is for Intel internal active development use and customer early access + for latest updates without official customer support. Since this "RC" labeled branch is still + comes with active development, the branch release with latest year and month. There will be + always only ONE branch labeled with "RC" in Intel SOCFPGA U-Boot repository. + + Branch without "RC" labeled + ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + Latest stable branch (no RC labeled) is strongly recommended for any development and + production use outside of Intel. Only stable branches will be supported by official + customer support. + + +5. Cyclone V / Arria V generating the handoff header files for U-Boot SPL +--------------------------------------------------------------------- - $ /path/to/intelFPGA/16.1/embedded/embedded_command_shell.sh + Rebuilding your Quartus project + ------------------------------- -Then (if necessary) update the IP cores in the project, generate HDL code, and -build the project: + Choose one of the following methods, either command line or GUI. - $ cd path/to/project/dir - $ qsys-generate soc_system.qsys --upgrade-ip-cores - $ qsys-generate soc_system.qsys --synthesis=[VERILOG|VHDL] - $ quartus_sh --flow compile <project name> + Using the command line + ~~~~~~~~~~~~~~~~~~~~~~ -Convert the resulting .sof file (SRAM object file) to .rbf file (Raw bit file): + First run the embedded command shell, using your path to the Quartus install: - $ quartus_cpf -c <project_name>.sof soc_system.rbf + $ /path/to/intelFPGA/16.1/embedded/embedded_command_shell.sh + Then (if necessary) update the IP cores in the project, generate HDL code, and + build the project: -Generate BSP handoff files -~~~~~~~~~~~~~~~~~~~~~~~~~~ + $ cd path/to/project/dir + $ qsys-generate soc_system.qsys --upgrade-ip-cores + $ qsys-generate soc_system.qsys --synthesis=[VERILOG|VHDL] + $ quartus_sh --flow compile <project name> -You can run the bsp editor GUI below, or run the following command from the -project directory: + Convert the resulting .sof file (SRAM object file) to .rbf file (Raw bit file): - $ /path/to/bsb/tools/bsp-create-settings --type spl --bsp-dir build \ - --preloader-settings-dir hps_isw_handoff/soc_system_hps_0/ \ - --settings build/settings.bsp + $ quartus_cpf -c <project_name>.sof soc_system.rbf -You should use the bsp "build" directory above (ie, where the settings.bsp file is) -in the following u-boot command to update the board headers. Once these headers -are updated for a given project build, u-boot should be configured for the -project board (eg, de0-nano-sockit) and then build the normal spl build. -Now you can skip the GUI section. + Generate BSP handoff files + ~~~~~~~~~~~~~~~~~~~~~~~~~~ + There are two forms to run the handoff script. + Method 1 - directly call from tools: + $ python ./tools/cv_bsp_generator/cv_bsp_generator.py \ + -i <path_to_qpds_handoff>/hps_isw_handoff/<foo bar> \ + -o board/<vendor name>/<board name>/qts -Using the Qsys GUI -~~~~~~~~~~~~~~~~~~ + Method 2 + $ # general make command with auto config board detection + $ make prepare + $ # user path define with make + $ make prepare HANDOFF_PATH=<handoff folder path> + $ # user path export + $ export HANDOFF_PATH=<handoff folder path> + $ make prepare -1. Navigate to your project directory -2. Run Quartus II -3. Open Project (Ctrl+J), select <project_name>.qpf -4. Run QSys [Tools->QSys] - 4.1 In the Open dialog, select '<project_name>.qsys' - 4.2 In the Open System dialog, wait until completion and press 'Close' - 4.3 In the Qsys window, click on 'Generate HDL...' in bottom right corner - 4.3.1 In the 'Generation' window, click 'Generate' - 4.3.2 In the 'Generate' dialog, wait until completion and click 'Close' - 4.4 In the QSys window, click 'Finish' - 4.4.1 In the 'Quartus II' pop up window, click 'OK' -5. Back in Quartus II main window, do the following - 5.1 Use Processing -> Start -> Start Analysis & Synthesis (Ctrl+K) - 5.2 Use Processing -> Start Compilation (Ctrl+L) + The generated files are uboot-compatible. They will be located in \ + board/<board vendor>/<platform_type>/qts. These files will be used for SPL \ + generation. - ... this may take some time, have patience ... + Argument: -6. Start the embedded command shell as shown in the previous section - 6.1 Change directory to 'software/spl_bsp' - 6.2 Prepare BSP by launching the BSP editor from ECS - => bsp-editor - 6.3 In BSP editor - 6.3.1 Use File -> Open - 6.3.2 Select 'settings.bsp' file - 6.3.3 Click Generate - 6.3.4 Click Exit + -i - Directory with QPDS handoff path. + -o - Directory to store the U-Boot compatible headers. + This will generate (or update) the following 4 files: -Post handoff generation -~~~~~~~~~~~~~~~~~~~~~~~ + iocsr_config.h + pinmux_config.h + pll_config.h + sdram_config.h -Now that the handoff files are generated, U-Boot can be used to process -the handoff files generated by the bsp-editor. For this, please use the -following script from the u-boot source tree: + These files should be copied into "qts" directory in the board directory + (see output argument of cv_bsp_generator.py command above). - $ ./arch/arm/mach-socfpga/qts-filter.sh \ - <soc_type> \ - <input_qts_dir> \ - <input_bsp_dir> \ - <output_dir> + Here is an example for the DE-0 Nano SoC after the above rebuild process: -Process QTS-generated files into U-Boot compatible ones. + $ ll board/terasic/de0-nano-soc/qts/ + total 36 + -rw-r--r-- 1 sarnold sarnold 8826 Mar 21 18:11 iocsr_config.h + -rw-r--r-- 1 sarnold sarnold 4398 Mar 21 18:11 pinmux_config.h + -rw-r--r-- 1 sarnold sarnold 3190 Mar 21 18:11 pll_config.h + -rw-r--r-- 1 sarnold sarnold 9022 Mar 21 18:11 sdram_config.h - soc_type - Type of SoC, either 'cyclone5' or 'arria5'. - input_qts_dir - Directory with compiled Quartus project - and containing the Quartus project file (QPF). - input_bsp_dir - Directory with generated bsp containing - the settings.bsp file. - output_dir - Directory to store the U-Boot compatible - headers. + Note: file sizes will differ slightly depending on the selected board. + For SoC devkit please refer to https://rocketboards.org/foswiki/Documentation/BuildingBootloader#Cyclone_V_SoC_45_Boot_from_SD_Card -This will generate (or update) the following 4 files: + Now your board is ready for full mainline support including U-Boot SPL. + The Preloader will not be needed any more. - iocsr_config.h - pinmux_config.h - pll_config.h - sdram_config.h -These files should be copied into "qts" directory in the board directory -(see output argument of qts-filter.sh command above). +6. Arria10 generating the handoff header files for U-Boot SPL +---------------------------------------------------------- -Here is an example for the DE-0 Nano SoC after the above rebuild process: + A header file for inclusion in a devicetree for Arria10 can be generated + by the qts-filter-a10.sh script directly from the hps_isw_handoff/hps.xml + file generated during the FPGA project compilation. The header contains + all PLL, clock, pinmux, and bridge configurations required. - $ ll board/terasic/de0-nano-soc/qts/ - total 36 - -rw-r--r-- 1 sarnold sarnold 8826 Mar 21 18:11 iocsr_config.h - -rw-r--r-- 1 sarnold sarnold 4398 Mar 21 18:11 pinmux_config.h - -rw-r--r-- 1 sarnold sarnold 3190 Mar 21 18:11 pll_config.h - -rw-r--r-- 1 sarnold sarnold 9022 Mar 21 18:11 sdram_config.h + Please look at the socfpga_arria10_socdk_sdmmc-u-boot.dtsi for an example + that includes use of the generated handoff header. -Note: file sizes will differ slightly depending on the selected board. + Devicetree header generation + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Now your board is ready for full mainline support including U-Boot SPL. -The Preloader will not be needed any more. + The qts-filter-a10.sh script can process the compile time genetated hps.xml + to create the appropriate devicetree header. + + $ ./arch/arm/mach-socfpga/qts-filter-a10.sh \ + <hps_xml> \ + <output_file> + + hps_xml - hps_isw_handoff/hps.xml from Quartus project + output_file - Output filename and location for header file + + The script generates a single header file names <output_file> that should + be placed in arch/arm/dts. + +7. mkimage for Cyclone V, Arria V and Arria 10 ---------------------------------------------------------- -Arria 10 generating the handoff header files for U-Boot SPL + + The mkimage tool creates an Intel BootROM compatible image of the + Cyclone V SoC, Arria V SoC or Arria 10 SoC bootloader. mkimage is invoked + automatically in default U-boot building proccess. To create BootROM + compatible image manually, user can run example below: + + ./tools/mkimage -T <type> -d <input file> <output file> + + Cyclone V and Arria V: + ./tools/mkimage -T socfpgaimage -d spl/u-boot-spl.bin spl/u-boot-spl.sfp + + Arria 10: + ./tools/mkimage -T socfpgaimage_v1 -d spl/u-boot-spl.bin spl/u-boot-spl.sfp + + For more inforation, run "./tools/mkimage --help". + +8. SDRAM secure region in U-boot ATF flow ---------------------------------------------------------- -A header file for inclusion in a devicetree for Arria10 can be generated -by the qts-filter-a10.sh script directly from the hps_isw_handoff/hps.xml -file generated during the FPGA project compilation. The header contains -all PLL, clock, pinmux, and bridge configurations required. + In boot flow that uses ATF (ARM trusted firmware), the first 1 MiB of SDRAM + is configured as secure region, other address spaces are non-secure regions. + Only software executing at secure state EL3 (eg: U-boot SPL, ATF) and secure + masters are allowed access to the secure region. + +9. binman for U-boot ATF flow +---------------------------------------------------------- + + Overview + ~~~~~~~~ + + Before v2021.04, we provide *.sh/*.its for user to generate FIT image using + 'mkimage' tool. To align with U-Boot community strategy to eliminate the custom + *.sh/*its script, we have removed all *.sh/*.its files and switched to use + 'binman' tool to generate FIT image for all SOC64 devices (Stratix 10, Agilex, + eASIC N5X) started in U-boot version v2021.04. + + FIT image content is defined in binman node in U-boot device tree (u-boot.dtb). + U-Boot v2021.04 support u-boot.itb and kernel.itb. + + With "CONFIG_BINMAN" enabled in deconfig, U-boot will always run 'binman' tool + before end of the code compilation. If the required input files exists in U-boot + folder, *.itb files defined in u-boot.dtb will be generated. Otherwise, 'binman' + will not generate the *.itb files. You can run 'binman' tool manually via command + line to generate the *.itb file. + + Input Files + ~~~~~~~~~~~ + + Input files for *_atf_defconfig FIT image generation: + To generate u-boot.itb: + u-boot-nodtb.bin + u-boot.dtb + bl31.bin + To generate kernel.itb: + Image + linux.dtb -Please look at the socfpga_arria10_socdk_sdmmc-u-boot.dtsi for an example -that includes use of the generated handoff header. + Input files for *_vab_defconfig FIT image generation: + To generate u-boot.itb: + signed-u-boot-nodtb.bin + signed-u-boot.dtb + signed-bl31.bin -Devicetree header generation -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + To generate kernel.itb: + signed-Image + signed-linux.dtb -The qts-filter-a10.sh script can process the compile time genetated hps.xml -to create the appropriate devicetree header. + Command Line + ~~~~~~~~~~~~ + Please use the following commands to generate the u-boot.itb and kernel.itb: - $ ./arch/arm/mach-socfpga/qts-filter-a10.sh \ - <hps_xml> \ - <output_file> + $ <U-boot path>/tools/binman/binman build -u -d u-boot.dtb -O . + This command generate all FIT images that defined in device tree. - hps_xml - hps_isw_handoff/hps.xml from Quartus project - output_file - Output filename and location for header file + $ <U-boot path>/tools/binman/binman build -u -d u-boot.dtb -O . -i u-boot + This command generate u-boot.itb only. -The script generates a single header file names <output_file> that should -be placed in arch/arm/dts. + $ <U-boot path>/tools/binman/binman build -u -d u-boot.dtb -O . -i kernel + This command generate kernel.itb only. + +9. Official Boot-up Flow Support +--------------------------------------------------------------------- + U-boot with Arm Trusted Firmware (ATF, TF-A) boot-up is the official supported + boot flow for Intel SoC FPGA Arm 64-bit architecture devices including + Stratix 10, Agilex and N5X. ATF is the secure runtime firmware running at EL3 + which handles secure accesses from U-boot proper and Linux running at EL2 and EL1. + + Official boot flow: + U-boot -> ATF BL31 -> U-boot proper -> Linux + + Legacy (aka non ATF) boot flow: + U-boot -> U-boot proper -> Linux + + U-boot version socfpga_v2021.07 and onwards change the defconfig name to match + the official boot flow. The non ATF flow defconfigs are renamed with _legacy_ + appended and is not officially supported moving forward. See details as follow. + + Legacy boot flow: + socfpga_agilex_defconfig -> socfpga_agilex_legacy_defconfig + socfpga_n5x_defconfig -> socfpga_n5x_legacy_defconfig + socfpga_stratix10_defconfig -> socfpga_stratix10_legacy_defconfig + + Official boot flow: + socfpga_agilex_atf_defconfig -> socfpga_agilex_defconfig + socfpga_n5x_atf_defconfig -> socfpga_n5x_defconfig + socfpga_stratix10_atf_defconfig -> socfpga_stratix10_defconfig + +10. FPGA full reconfig flow for SoC64 devices +--------------------------------------------------------------------- + Bridges should be disabled before running any FPGA reconfiguration, + this ensures that all outstanding traffic between MPFE to bridge and + FPGA to bridge are completed. + + Bridges should be enabled after FPGA is successfully programmed + and entered user mode. + + Legacy and official boot flow: + If you are running fpga load command in U-Boot console, you are required + to run below steps to gracefully shutdown the bridges before running FPGA + reconfiguration: + 1. bridge disable command + 2. fpga load command + 3. bridge enable command after FPGA is successfully programmed + + If you are running bootm to program FPGA with bitstream loading from + FIT, you are required to run below steps before running bootm command. + 1. bridge disable command (can be done in U-Boot script) + 2. bootm, the bridge would be enabled automatically once FPGA is + is successfully programmed. -- 2.25.1

