mainboard/emulation/qemu-aarch64: Add new board for ARMv8
This CL adds a new board, QEMU/AArch64, for ARMv8. The machine supported is virt which is a QEMU 2.8 ARM virtual machine. The default CPU of qemu-system-aarch64 is Cortex-a15, so you need to specify a 64-bit cpu via a flag. To execute: $ qemu-system-aarch64 -M virt,secure=on,virtualization=on \ -cpu cortex-a53 -bios build/coreboot.rom -m 8192M -nographic Change-Id: Id7c0831b1ecf08785b4ec8139d809bad9b3e1eec Signed-off-by: Asami Doi <d0iasm.pub@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/33387 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Raul Rangel <rrangel@chromium.org> Reviewed-by: Julius Werner <jwerner@chromium.org>
This commit is contained in:
parent
9c55ee34ac
commit
f795242f26
|
@ -0,0 +1,47 @@
|
|||
# QEMU AArch64 emulator
|
||||
This page discribes how to build and run coreboot for QEMU/AArch64.
|
||||
You can use LinuxBoot via `make menuconfig` or an arbitrary FIT image
|
||||
as a payload for QEMU/AArch64.
|
||||
|
||||
## Running coreboot in QEMU
|
||||
```bash
|
||||
qemu-system-aarch64 -bios ./build/coreboot.rom \
|
||||
-M virt,secure=on,virtualization=on -cpu cortex-a53 \
|
||||
-nographic -m 8912M
|
||||
```
|
||||
|
||||
- The default CPU in QEMU for AArch64 is a cortex-a15 which is 32-bit
|
||||
ARM CPU. You need to specify 64-bit ARM CPU via `-cpu cortex-a53`.
|
||||
- The default privilege level in QEMU for AArch64 is EL1 that we can't
|
||||
have the right to access EL3/EL2 registers. You need to enable EL3/EL2
|
||||
via `-machine secure=on,virtualization=on`.
|
||||
- You need to specify the size of memory more than 544 MiB because 512
|
||||
MiB is reserved for the kernel.
|
||||
|
||||
## Building coreboot with an arbitrary FIT payload
|
||||
There are 3 steps to make coreboot.rom for QEMU/AArch64. If you select
|
||||
LinuxBoot, step 2 and 3 have done by LinuxBoot.
|
||||
1. Get a DTB (Device Tree Blob)
|
||||
2. Build a FIT image with a DTB
|
||||
3. Add a FIT image to coreboot.rom
|
||||
|
||||
### 1. Get a DTB
|
||||
You can get the DTB from QEMU with the following command.
|
||||
```
|
||||
$ qemu-system-aarch64 \
|
||||
-M virt,dumpdtb=virt.dtb,secure=on,virtualization=on \
|
||||
-cpu cortex-a53 -nographic -m 2048M
|
||||
```
|
||||
|
||||
### 2. Build a FIT image with a DTB
|
||||
You need to write an image source file that has an `.its` extension to
|
||||
configure kernels, ramdisks, and DTBs.
|
||||
See [Flattened uImage Tree documentation](../../lib/payloads/fit.md) for more details.
|
||||
|
||||
### 3. Add a FIT image to coreboot.rom
|
||||
You can use cbfstool to add the payload you created in step 2 to
|
||||
the coreboot.rom.
|
||||
```
|
||||
$ ./build/cbfstool ./build/coreboot.rom add -f <path-to-a-payload>/uImage \
|
||||
-n fallback/payload -t fit -c lzma
|
||||
```
|
|
@ -24,6 +24,7 @@ The boards in this section are not real mainboards, but emulators.
|
|||
|
||||
- [Spike RISC-V emulator](emulation/spike-riscv.md)
|
||||
- [Qemu RISC-V emulator](emulation/qemu-riscv.md)
|
||||
- [Qemu AArch64 emulator](emulation/qemu-aarch64.md)
|
||||
|
||||
## Intel
|
||||
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
#
|
||||
# This file is part of the coreboot project.
|
||||
#
|
||||
# Copyright (C) 2019 Asami Doi <d0iasm.pub@gmail.com>.
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
# Emulation for QEMU 2.8 ARM Virtual Machine (alias of virt-2.8)
|
||||
# https://wiki.qemu.org/Documentation/Platforms/ARM
|
||||
|
||||
if BOARD_EMULATION_QEMU_AARCH64
|
||||
|
||||
config BOARD_SPECIFIC_OPTIONS
|
||||
def_bool y
|
||||
select ARCH_BOOTBLOCK_ARMV8_64
|
||||
select ARCH_VERSTAGE_ARMV8_64
|
||||
select ARCH_ROMSTAGE_ARMV8_64
|
||||
select ARCH_RAMSTAGE_ARMV8_64
|
||||
select ARM64_USE_ARCH_TIMER
|
||||
select BOARD_ROMSIZE_KB_4096
|
||||
select BOOTBLOCK_CONSOLE
|
||||
select BOOTBLOCK_CUSTOM
|
||||
select BOOT_DEVICE_NOT_SPI_FLASH
|
||||
select CONSOLE_SERIAL
|
||||
select DRIVERS_UART_PL011
|
||||
select HAVE_LINEAR_FRAMEBUFFER
|
||||
select MAINBOARD_FORCE_NATIVE_VGA_INIT
|
||||
select MAINBOARD_HAS_NATIVE_VGA_INIT
|
||||
select MISSING_BOARD_RESET
|
||||
|
||||
config MAINBOARD_DIR
|
||||
string
|
||||
default emulation/qemu-aarch64
|
||||
|
||||
config MAINBOARD_PART_NUMBER
|
||||
string
|
||||
default "QEMU AArch64"
|
||||
|
||||
config MAX_CPUS
|
||||
int
|
||||
default 2
|
||||
|
||||
config MAINBOARD_VENDOR
|
||||
string
|
||||
default "QEMU"
|
||||
|
||||
config DRAM_SIZE_MB
|
||||
int
|
||||
default 1024
|
||||
|
||||
endif # BOARD_EMULATION_QEMU_AARCH64
|
|
@ -0,0 +1,5 @@
|
|||
config BOARD_EMULATION_QEMU_AARCH64
|
||||
bool "QEMU AArch64 (virt)"
|
||||
help
|
||||
To execute, do:
|
||||
qemu-system-aarch64 -bios ./build/coreboot.rom -M virt,secure=on,virtualization=on -cpu cortex-a53 -nographic -m 8192M
|
|
@ -0,0 +1,25 @@
|
|||
#
|
||||
# This file is part of the coreboot project.
|
||||
#
|
||||
# Copyright (C) 2019 Asami Doi <d0iasm.pub@gmail.com>
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
romstage-y += cbmem.c
|
||||
ramstage-y += cbmem.c
|
||||
|
||||
bootblock-y += media.c
|
||||
romstage-y += media.c
|
||||
ramstage-y += media.c
|
||||
|
||||
bootblock-y += mmio.c
|
||||
romstage-y += mmio.c
|
||||
ramstage-y += mmio.c
|
||||
|
||||
bootblock-y += memlayout.ld
|
||||
romstage-y += memlayout.ld
|
||||
ramstage-y += memlayout.ld
|
||||
|
||||
bootblock-y += bootblock_custom.S
|
||||
|
||||
CPPFLAGS_common += -I$(src)/mainboard/$(MAINBOARDDIR)/include
|
|
@ -0,0 +1,3 @@
|
|||
Board name: QEMU AArch64 (virt)
|
||||
Category: emulation
|
||||
Board URL: http://wiki.qemu.org/Main_Page
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Early initialization code for aarch64 (a.k.a. armv8)
|
||||
*
|
||||
* Copyright 2019 Asami Doi <d0iasm.pub@gmail.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include <arch/asm.h>
|
||||
|
||||
ENTRY(_start)
|
||||
/* Setup CPU. */
|
||||
bl arm64_init_cpu
|
||||
|
||||
/* Get code positions. */
|
||||
ldr x1, =_flash
|
||||
ldr x0, =_bootblock
|
||||
|
||||
/* Calculate bootblock size. */
|
||||
ldr x2, =_ebootblock
|
||||
sub x2, x2, x0
|
||||
|
||||
/* Call memcpy in arch/arm64/memcpy.S */
|
||||
bl memcpy
|
||||
dmb sy
|
||||
|
||||
/* Calculate relocation offset between bootblock in flash and in DRAM. */
|
||||
ldr x0, =_flash
|
||||
ldr x1, =_bootblock
|
||||
sub x1, x1, x0
|
||||
|
||||
/* Jump to main() in DRAM. */
|
||||
adr x0, main
|
||||
add x0, x0, x1
|
||||
blr x0
|
||||
ENDPROC(_start)
|
|
@ -0,0 +1,16 @@
|
|||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright (C) 2019 Asami Doi <d0iasm.pub@gmail.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include <cbmem.h>
|
||||
#include <ramdetect.h>
|
||||
#include <symbols.h>
|
||||
|
||||
void *cbmem_top(void)
|
||||
{
|
||||
return _dram + (probe_ramsize((uintptr_t)_dram, CONFIG_DRAM_SIZE_MB) * MiB);
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
#
|
||||
# This file is part of the coreboot project.
|
||||
#
|
||||
# Copyright (C) 2019 Asami Doi <d0iasm.pub@gmail.com>.
|
||||
#
|
||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
# This file exists only to avoid a compile error. It needs a devicetree.cb that is not empty.
|
||||
chip drivers/generic/generic # I2C0 controller
|
||||
device i2c 6 on end # Fake component for testing
|
||||
end
|
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright 2019 Asami Doi <d0iasm.pub@gmail.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
/*
|
||||
* Memory map for QEMU virt machine since
|
||||
* a578cdfbdd8f9beff5ced52b7826ddb1669abbbf (June 2019):
|
||||
*
|
||||
* 0..128MiB (0x0000_0000..0x0080_0000) is the space for a flash device.
|
||||
* 128MiB..256MiB (0x0080_0000..0x0100_0000) is used for miscellaneous device I/O.
|
||||
* 256MiB..1GiB (0x0100_0000..0x4000_0000) is reserved for possible future PCI support.
|
||||
* 1GiB.. (0x4000_0000) is RAM and the size depends on initial RAM and device memory settings
|
||||
*
|
||||
* 0x0000_0000..0x0080_0000: Flash memory
|
||||
* 0x0900_0000..0x0900_1000: UART (PL011)
|
||||
* 0x0901_0000..0x0901_1000: RTC (PL031)
|
||||
* 0x0903_0000..0x0903_1000: GPIO (PL061)
|
||||
* 0x0904_0000..0x0904_1000: Secure UART (PL011)
|
||||
* 0x0905_0000..0x0907_0000: SMMU (smmu-v3)
|
||||
* 0x0a00_0000..0x0a00_0200: MMIO (virtio)
|
||||
* 0x0c00_0000..0x0e00_0000: Platform bus
|
||||
* 0x4000_0000..: RAM
|
||||
*/
|
||||
#define VIRT_UART_BASE 0x09000000
|
||||
#define VIRT_RTC_BASE 0x09010000
|
||||
#define VIRT_GPIO_BASE 0x09030000
|
||||
#define VIRT_SECURE_UART_BASE 0x09040000
|
||||
#define VIRT_SMMU_BASE 0x09050000
|
||||
#define VIRT_MMIO_BASE 0x0a000000
|
||||
#define VIRT_PLATFORM_BUS_BASE 0x0c000000
|
|
@ -0,0 +1,23 @@
|
|||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright (C) 2019 Asami Doi <d0iasm.pub@gmail.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include <cbmem.h>
|
||||
#include <ramdetect.h>
|
||||
#include <symbols.h>
|
||||
#include <device/device.h>
|
||||
|
||||
static void mainboard_enable(struct device *dev)
|
||||
{
|
||||
int ram_size_mb = probe_ramsize((uintptr_t)_dram, CONFIG_DRAM_SIZE_MB);
|
||||
ram_resource(dev, 0, (uintptr_t)_dram / KiB, ram_size_mb * KiB);
|
||||
}
|
||||
|
||||
struct chip_operations mainboard_ops = {
|
||||
.name = "qemu_aarch64",
|
||||
.enable_dev = mainboard_enable,
|
||||
};
|
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright (C) 2019 Asami Doi <d0iasm.pub@gmail.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include <boot_device.h>
|
||||
|
||||
/* Maps directly to NOR flash up to ROM size. */
|
||||
static const struct mem_region_device boot_dev =
|
||||
MEM_REGION_DEV_RO_INIT((void *)0x0, CONFIG_ROM_SIZE);
|
||||
|
||||
const struct region_device *boot_device_ro(void)
|
||||
{
|
||||
return &boot_dev.rdev;
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright 2019 Asami Doi <d0iasm.pub@gmail.com>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include <memlayout.h>
|
||||
#include <arch/header.ld>
|
||||
|
||||
/*
|
||||
* Memory map for QEMU virt machine since
|
||||
* a578cdfbdd8f9beff5ced52b7826ddb1669abbbf (June 2019):
|
||||
*
|
||||
* 0..128MiB (0x0000_0000..0x0080_0000) is the space for a flash device.
|
||||
* 128MiB..256MiB (0x0080_0000..0x0100_0000) is used for miscellaneous device I/O.
|
||||
* 256MiB..1GiB (0x0100_0000..0x4000_0000) is reserved for possible future PCI support.
|
||||
* 1GiB.. (0x4000_0000) is RAM and the size depends on initial RAM and device memory settings.
|
||||
*/
|
||||
SECTIONS
|
||||
{
|
||||
REGION(flash, 0x00000000, CONFIG_ROM_SIZE, 8)
|
||||
|
||||
DRAM_START(0x40000000)
|
||||
BOOTBLOCK(0x60010000, 64K)
|
||||
STACK(0x60020000, 64K)
|
||||
ROMSTAGE(0x60030000, 128K)
|
||||
RAMSTAGE(0x60070000, 16M)
|
||||
|
||||
TTB(0x61100000, 16K)
|
||||
POSTRAM_CBFS_CACHE(0x61110000, 1M)
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright (C) 2019 Asami Doi <d0iasm.pub@gmail.com>.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#include <console/uart.h>
|
||||
#include <mainboard/addressmap.h>
|
||||
|
||||
uintptr_t uart_platform_base(int idx)
|
||||
{
|
||||
return VIRT_UART_BASE;
|
||||
}
|
Loading…
Reference in New Issue