Hi Cedric, > Cc: Troy Lee <troy_...@aspeedtech.com>; nabiheste...@google.com > Subject: Re: [PATCH v4 06/10] hw/arm/aspeed: Add support for loading > vbootrom image via "-bios" > > Hello Jamin, > > > Based on the design of aspeed_install_boot_rom, users can place their > > ROM code at the top of the image-bmc, and this function will install > > image-bmc which included the user's ROM IMAGE at the > > ASPEED_DEV_SPI_BOOT address. For AST2600, users typically set the > > boot address to 0x0 and boot directly from there. > > > > For AST2700, we introduced a vbootrom to simulate the ROM code and the > > BOOTMCU SPL (RISC-V). > > Side question, is anyone working on the BOOTMCU SPL (RISC-V) models ? > heterogeneous machines should be supported one day. >
Troy developed an initial implementation, but testing has not yet been performed due to uncertainty around "how to share DRAM memory and controllers registers" between the RISC-V and the Cortex-A35 cores. Furthermore, RISC-V interrupt support is currently not implemented. > > We use aspeed_install_boot_rom to load the image-bmc at the FMC CS0 > > memory-mapped I/O address, so we set ASPEED_DEV_SPI_BOOT to > > 0x100000000. > > > > We load the vbootrom image into the vbootrom memory region at address > > 0x0 and start execution from there. > > > > The guest OS first enters the vbootrom. From there, it can easily > > access the flash data (image-bmc) at 0x100000000, since vbootrom > > itself doesn’t require SPI/flash/emmc host drivers. > > > > To support future eMMC booting, we also plan to install the eMMC image > > at the ASPEED_DEV_SPI_BOOT address. > > https://github.com/qemu/qemu/blob/master/hw/arm/aspeed.c#L477 > > ok. > > > It is fully supported to have both options. If users want to include > > their own ROM code within image-bmc, they can set the program counter > > (PC) to 0x100000000, just like how a manual loader set it to > > 0x43000000 (e.g., to jump directly to BL31). This allows users to > > bypass the vbootrom if desired. > > ok. > > > However, I believe this use case will be rare, as the vbootrom design > > should be able to satisfy most, if not all, user requirements. > > We need to be careful about what we offer the user in terms of boot method. > It's difficult to maintain on the long term. Let's recap. > For the AST2700, I am currently considering support for the following boot methods only: 1. eMMC device boot 2. UFS device boot (Note: QEMU currently only supports PCI-based UFS and does not support platform-based UFS. This remains a long-term goal) 3. Firmware boot using vbootrom 4. Firmware boot using a manual loader The boot flow for the AST2700’s Cortex-A35 should follow this sequence: BL31 (Trusted Firmware-A) → BL32 (OP-TEE OS) → BL33 (U-Boot) I don't think we should support direct kernel boot , as I don't know how to start execution directly from the kernel. By the way, AST2700 support to boot from either EMMC or UFS. I am considering to read OTP configs and strap instead of command line. Ex: we used bootmmc=true to change hardstrap. It just my briefly plane and future goal. Thanks-Jamin > For the AST2[456]00 machines, we have : > > 1. kernel boot > 2. flash device boot with or without "execute-in-place" machine > option > > and this could work for AST2700 machines with some loader magic. > It would be good to decide to or not to support it. If not supported, let's > inform > the user asap. > > For the AST2600 ast2600evb and rainier machines only, we have : > > 3. emmc device boot > > and we plan to extend it for AST2700 machines. > > For the AST2700 machines, we have : > > 4. manual loader boot (this could work for the other SoCs, although > we have never tried) > 5. firmware boot > > We need to define a priority between these methods too (the list above is > more or less ordered, apart from 4.) and handle conflicts. > > All of which is to say that the piece of code below will require some care: > > if (!bmc->mmio_exec) { > DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0); > BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL; > > if (fmc0 && !boot_emmc) { > rom_size = memory_region_size(&bmc->soc->spi_boot); > aspeed_install_boot_rom(bmc, fmc0, rom_size); > } else if (emmc0) { > aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(emmc0), > 64 * KiB); > } > } > > if (amc->vbootrom) { > rom_size = memory_region_size(&bmc->soc->vbootrom); > aspeed_load_vbootrom(machine, rom_size, &error_abort); > } > > Thanks, > > C. >