Add qemu virt board which emulates arm64 board. Signed-off-by: Raphael Poggi <poggi.raph@xxxxxxxxx> --- arch/arm/Kconfig | 9 ++++ arch/arm/boards/Makefile | 1 + arch/arm/boards/virt/Kconfig | 8 ++++ arch/arm/boards/virt/Makefile | 1 + arch/arm/boards/virt/env/bin/_update | 36 ++++++++++++++++ arch/arm/boards/virt/env/bin/boot | 38 +++++++++++++++++ arch/arm/boards/virt/env/bin/init | 20 +++++++++ arch/arm/boards/virt/env/bin/update_kernel | 8 ++++ arch/arm/boards/virt/env/bin/update_root | 8 ++++ arch/arm/boards/virt/env/config | 38 +++++++++++++++++ arch/arm/boards/virt/env/init/mtdparts-nor | 11 +++++ arch/arm/boards/virt/init.c | 67 ++++++++++++++++++++++++++++++ arch/arm/configs/virt_defconfig | 55 ++++++++++++++++++++++++ arch/arm/mach-virt/Kconfig | 15 +++++++ arch/arm/mach-virt/Makefile | 3 ++ arch/arm/mach-virt/devices.c | 30 +++++++++++++ arch/arm/mach-virt/include/mach/debug_ll.h | 24 +++++++++++ arch/arm/mach-virt/include/mach/devices.h | 13 ++++++ arch/arm/mach-virt/lowlevel.c | 19 +++++++++ arch/arm/mach-virt/reset.c | 24 +++++++++++ 20 files changed, 428 insertions(+) create mode 100644 arch/arm/boards/virt/Kconfig create mode 100644 arch/arm/boards/virt/Makefile create mode 100644 arch/arm/boards/virt/env/bin/_update create mode 100644 arch/arm/boards/virt/env/bin/boot create mode 100644 arch/arm/boards/virt/env/bin/init create mode 100644 arch/arm/boards/virt/env/bin/update_kernel create mode 100644 arch/arm/boards/virt/env/bin/update_root create mode 100644 arch/arm/boards/virt/env/config create mode 100644 arch/arm/boards/virt/env/init/mtdparts-nor create mode 100644 arch/arm/boards/virt/init.c create mode 100644 arch/arm/configs/virt_defconfig create mode 100644 arch/arm/mach-virt/Kconfig create mode 100644 arch/arm/mach-virt/Makefile create mode 100644 arch/arm/mach-virt/devices.c create mode 100644 arch/arm/mach-virt/include/mach/debug_ll.h create mode 100644 arch/arm/mach-virt/include/mach/devices.h create mode 100644 arch/arm/mach-virt/lowlevel.c create mode 100644 arch/arm/mach-virt/reset.c diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 986fdaa..71b90e7 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -255,6 +255,14 @@ config ARCH_ZYNQ bool "Xilinx Zynq-based boards" select HAS_DEBUG_LL +config ARCH_VIRT + bool "ARM QEMU virt boards" + select HAS_DEBUG_LL + select CPU_V8 + select SYS_SUPPORTS_64BIT_KERNEL + select ARM_AMBA + select HAVE_CONFIGURABLE_MEMORY_LAYOUT + endchoice source arch/arm/cpu/Kconfig @@ -280,6 +288,7 @@ source arch/arm/mach-vexpress/Kconfig source arch/arm/mach-tegra/Kconfig source arch/arm/mach-uemd/Kconfig source arch/arm/mach-zynq/Kconfig +source arch/arm/mach-virt/Kconfig config ARM_ASM_UNIFIED bool diff --git a/arch/arm/boards/Makefile b/arch/arm/boards/Makefile index 5a755c9..da0af74 100644 --- a/arch/arm/boards/Makefile +++ b/arch/arm/boards/Makefile @@ -134,3 +134,4 @@ obj-$(CONFIG_MACH_VIRT2REAL) += virt2real/ obj-$(CONFIG_MACH_ZEDBOARD) += avnet-zedboard/ obj-$(CONFIG_MACH_ZYLONITE) += zylonite/ obj-$(CONFIG_MACH_VARISCITE_MX6) += variscite-mx6/ +obj-$(CONFIG_MACH_VIRT) += virt/ diff --git a/arch/arm/boards/virt/Kconfig b/arch/arm/boards/virt/Kconfig new file mode 100644 index 0000000..b239127 --- /dev/null +++ b/arch/arm/boards/virt/Kconfig @@ -0,0 +1,8 @@ + +if MACH_VIRT + +config ARCH_TEXT_BASE + hex + default 0x40000000 + +endif diff --git a/arch/arm/boards/virt/Makefile b/arch/arm/boards/virt/Makefile new file mode 100644 index 0000000..eb072c0 --- /dev/null +++ b/arch/arm/boards/virt/Makefile @@ -0,0 +1 @@ +obj-y += init.o diff --git a/arch/arm/boards/virt/env/bin/_update b/arch/arm/boards/virt/env/bin/_update new file mode 100644 index 0000000..014bce3 --- /dev/null +++ b/arch/arm/boards/virt/env/bin/_update @@ -0,0 +1,36 @@ +#!/bin/sh + +if [ -z "$part" -o -z "$image" ]; then + echo "define \$part and \$image" + exit 1 +fi + +if [ ! -e "$part" ]; then + echo "Partition $part does not exist" + exit 1 +fi + +if [ $# = 1 ]; then + image=$1 +fi + +if [ x$ip = xdhcp ]; then + dhcp +fi + +ping $eth0.serverip +if [ $? -ne 0 ] ; then + echo "update aborted" + exit 1 +fi + +unprotect $part + +echo +echo "erasing partition $part" +erase $part + +echo +echo "flashing $image to $part" +echo +tftp $image $part diff --git a/arch/arm/boards/virt/env/bin/boot b/arch/arm/boards/virt/env/bin/boot new file mode 100644 index 0000000..3859dc1 --- /dev/null +++ b/arch/arm/boards/virt/env/bin/boot @@ -0,0 +1,38 @@ +#!/bin/sh + +. /env/config + +if [ x$1 = xflash ]; then + root=flash + kernel=flash +fi + +if [ x$1 = xnet ]; then + root=net + kernel=net +fi + +if [ x$ip = xdhcp ]; then + bootargs="$bootargs ip=dhcp" +else + bootargs="$bootargs ip=$eth0.ipaddr:$eth0.serverip:$eth0.gateway:$eth0.netmask:::" +fi + +if [ x$root = xflash ]; then + bootargs="$bootargs root=$rootpart rootfstype=jffs2" +else + bootargs="$bootargs root=/dev/nfs nfsroot=$eth0.serverip:$nfsroot,v3,tcp" +fi + +bootargs="$bootargs mtdparts=physmap-flash.0:$mtdparts" + +if [ $kernel = net ]; then + if [ x$ip = xdhcp ]; then + dhcp + fi + tftp $uimage uImage || exit 1 + bootm uImage +else + bootm /dev/nor0.kernel +fi + diff --git a/arch/arm/boards/virt/env/bin/init b/arch/arm/boards/virt/env/bin/init new file mode 100644 index 0000000..48e2139 --- /dev/null +++ b/arch/arm/boards/virt/env/bin/init @@ -0,0 +1,20 @@ +#!/bin/sh + +PATH=/env/bin +export PATH + +. /env/config +addpart /dev/nor0 $mtdparts + +echo +echo -n "Hit any key to stop autoboot: " +timeout -a $autoboot_timeout +if [ $? != 0 ]; then + echo + echo "type update_kernel [<imagename>] to update kernel into flash" + echo "type udate_root [<imagename>] to update rootfs into flash" + echo + exit +fi + +boot \ No newline at end of file diff --git a/arch/arm/boards/virt/env/bin/update_kernel b/arch/arm/boards/virt/env/bin/update_kernel new file mode 100644 index 0000000..1ad95fc --- /dev/null +++ b/arch/arm/boards/virt/env/bin/update_kernel @@ -0,0 +1,8 @@ +#!/bin/sh + +. /env/config + +image=$uimage +part=/dev/nor0.kernel + +. /env/bin/_update $1 diff --git a/arch/arm/boards/virt/env/bin/update_root b/arch/arm/boards/virt/env/bin/update_root new file mode 100644 index 0000000..b757a5b --- /dev/null +++ b/arch/arm/boards/virt/env/bin/update_root @@ -0,0 +1,8 @@ +#!/bin/sh + +. /env/config + +image=$jffs2 +part=/dev/nor0.root + +. /env/bin/_update $1 diff --git a/arch/arm/boards/virt/env/config b/arch/arm/boards/virt/env/config new file mode 100644 index 0000000..6c0abda --- /dev/null +++ b/arch/arm/boards/virt/env/config @@ -0,0 +1,38 @@ +#!/bin/sh + +# use 'dhcp' to do dhcp in barebox and in kernel +# use 'none' if you want to skip kernel ip autoconfiguration +ip=dhcp +global.dhcp.vendor_id=barebox-${global.hostname} + +# or set your networking parameters here +#eth0.ipaddr=a.b.c.d +#eth0.netmask=a.b.c.d +#eth0.gateway=a.b.c.d +#eth0.serverip=a.b.c.d + +# can be either 'nfs', 'tftp' or 'nor' +kernel_loc=tftp +# can be either 'net', 'nor' or 'initrd' +rootfs_loc=initrd + +# can be either 'jffs2' or 'ubifs' +rootfs_type=ubifs +rootfsimage=root.$rootfs_type + +kernelimage=zImage +#kernelimage=uImage +#kernelimage=Image +#kernelimage=Image.lzo + +nfsroot="$eth0.serverip:/opt/work/busybox/arm9/rootfs_arm" + +nor_parts="256k(barebox)ro,64k(bareboxenv),1536k(kernel),-(root)" +rootfs_mtdblock_nor=3 + +autoboot_timeout=3 + +bootargs="console=ttyAMA0,115200n8 CONSOLE=/dev/ttyAMA0" + +# set a fancy prompt (if support is compiled in) +PS1="\e[1;31m[barebox@\h]:\w\e[0m\n# " diff --git a/arch/arm/boards/virt/env/init/mtdparts-nor b/arch/arm/boards/virt/env/init/mtdparts-nor new file mode 100644 index 0000000..3307596 --- /dev/null +++ b/arch/arm/boards/virt/env/init/mtdparts-nor @@ -0,0 +1,11 @@ +#!/bin/sh + +if [ "$1" = menu ]; then + init-menu-add-entry "$0" "NOR partitions" + exit +fi + +mtdparts="2048k@0(nor0.barebox)ro,256k(nor0.barebox-env),256k(nor0.barebox-logo),256k(nor0.barebox-logo2),5120k(nor0.kernel),-(nor0.root)" +kernelname="application-flash" + +mtdparts-add -d nor0 -k ${kernelname} -p ${mtdparts} diff --git a/arch/arm/boards/virt/init.c b/arch/arm/boards/virt/init.c new file mode 100644 index 0000000..9626067 --- /dev/null +++ b/arch/arm/boards/virt/init.c @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2016 Raphaël Poggi <poggi.raph@xxxxxxxxx> + * + * GPLv2 only + */ + +#include <common.h> +#include <init.h> +#include <asm/armlinux.h> +#include <asm/system_info.h> +#include <mach/devices.h> +#include <environment.h> +#include <linux/sizes.h> +#include <io.h> +#include <globalvar.h> +#include <asm/mmu.h> + +static int virt_mem_init(void) +{ + virt_add_ddram(SZ_512M); + + add_cfi_flash_device(0, 0x00000000, SZ_4M, 0); + + devfs_add_partition("nor0", 0x00000, 0x40000, DEVFS_PARTITION_FIXED, "self0"); + devfs_add_partition("nor0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env0"); + + return 0; +} +mem_initcall(virt_mem_init); + +static int virt_console_init(void) +{ + virt_register_uart(0); + + return 0; +} +console_initcall(virt_console_init); + +static int virt_core_init(void) +{ + char *hostname = "virt"; + + if (cpu_is_cortex_a53()) + hostname = "virt-a53"; + else if (cpu_is_cortex_a57()) + hostname = "virt-a57"; + + barebox_set_model("ARM QEMU virt"); + barebox_set_hostname(hostname); + + return 0; +} +postcore_initcall(virt_core_init); + +static int virt_mmu_enable(void) +{ + /* Mapping all periph range */ + arch_remap_range(0x09000000, 0x01000000, PMD_SECT_DEF_CACHED); + + /* Mapping all flash range */ + arch_remap_range(0x00000000, 0x08000000, PMD_SECT_DEF_CACHED); + + mmu_enable(); + + return 0; +} +postmmu_initcall(virt_mmu_enable); diff --git a/arch/arm/configs/virt_defconfig b/arch/arm/configs/virt_defconfig new file mode 100644 index 0000000..567c0da --- /dev/null +++ b/arch/arm/configs/virt_defconfig @@ -0,0 +1,55 @@ +CONFIG_ARCH_VIRT=y +CONFIG_BAREBOX_MAX_IMAGE_SIZE=0x05000000 +CONFIG_AEABI=y +CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y +CONFIG_MMU=y +# CONFIG_MMU_EARLY is not set +CONFIG_BAREBOX_MAX_BARE_INIT_SIZE=0x01000000 +CONFIG_MEMORY_LAYOUT_FIXED=y +CONFIG_STACK_BASE=0x60000000 +CONFIG_MALLOC_BASE=0x50000000 +CONFIG_PROMPT="virt: " +CONFIG_HUSH_FANCY_PROMPT=y +CONFIG_CMDLINE_EDITING=y +CONFIG_AUTO_COMPLETE=y +CONFIG_MENU=y +CONFIG_PASSWORD=y +CONFIG_PARTITION=y +CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW=y +CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/virt/env" +CONFIG_DEBUG_INFO=y +CONFIG_LONGHELP=y +# CONFIG_CMD_BOOTM is not set +# CONFIG_CMD_BOOTU is not set +# CONFIG_CMD_MOUNT is not set +# CONFIG_CMD_UMOUNT is not set +# CONFIG_CMD_CAT is not set +# CONFIG_CMD_CD is not set +# CONFIG_CMD_CP is not set +# CONFIG_CMD_LS is not set +# CONFIG_CMD_MKDIR is not set +# CONFIG_CMD_PWD is not set +# CONFIG_CMD_RM is not set +# CONFIG_CMD_RMDIR is not set +# CONFIG_CMD_FALSE is not set +# CONFIG_CMD_TEST is not set +# CONFIG_CMD_TRUE is not set +# CONFIG_CMD_CLEAR is not set +# CONFIG_CMD_ECHO is not set +CONFIG_CMD_CRC=y +CONFIG_CMD_CRC_CMP=y +# CONFIG_CMD_MD is not set +# CONFIG_CMD_MEMCMP is not set +# CONFIG_CMD_MEMCPY is not set +# CONFIG_CMD_MEMSET is not set +# CONFIG_CMD_MW is not set +CONFIG_SERIAL_AMBA_PL011=y +# CONFIG_SPI is not set +CONFIG_MTD=y +CONFIG_DRIVER_CFI=y +CONFIG_DRIVER_CFI_BANK_WIDTH_8=y +CONFIG_CFI_BUFFER_WRITE=y +CONFIG_NAND=y +# CONFIG_FS_RAMFS is not set +CONFIG_DIGEST_SHA1_GENERIC=y +CONFIG_DIGEST_SHA256_GENERIC=y diff --git a/arch/arm/mach-virt/Kconfig b/arch/arm/mach-virt/Kconfig new file mode 100644 index 0000000..1f43606 --- /dev/null +++ b/arch/arm/mach-virt/Kconfig @@ -0,0 +1,15 @@ +if ARCH_VIRT + +config ARCH_TEXT_BASE + hex + default 0x40000000 + +choice + prompt "ARM Board type" + +config MACH_VIRT + bool "ARM QEMU virt" + +endchoice + +endif diff --git a/arch/arm/mach-virt/Makefile b/arch/arm/mach-virt/Makefile new file mode 100644 index 0000000..3924a10 --- /dev/null +++ b/arch/arm/mach-virt/Makefile @@ -0,0 +1,3 @@ +obj-y += devices.o reset.o + +lwl-y += lowlevel.o diff --git a/arch/arm/mach-virt/devices.c b/arch/arm/mach-virt/devices.c new file mode 100644 index 0000000..999f463 --- /dev/null +++ b/arch/arm/mach-virt/devices.c @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2016 Raphaël Poggi <poggi.raph@xxxxxxxxx> + * + * GPLv2 only + */ + +#include <common.h> +#include <linux/amba/bus.h> +#include <asm/memory.h> +#include <mach/devices.h> +#include <linux/ioport.h> + +void virt_add_ddram(u32 size) +{ + arm_add_mem_device("ram0", 0x40000000, size); +} + +void virt_register_uart(unsigned id) +{ + resource_size_t start; + + switch (id) { + case 0: + start = 0x09000000; + break; + default: + return; + } + amba_apb_device_add(NULL, "uart-pl011", id, start, 4096, NULL, 0); +} diff --git a/arch/arm/mach-virt/include/mach/debug_ll.h b/arch/arm/mach-virt/include/mach/debug_ll.h new file mode 100644 index 0000000..89b0692 --- /dev/null +++ b/arch/arm/mach-virt/include/mach/debug_ll.h @@ -0,0 +1,24 @@ +/* + * Copyright 2013 Jean-Christophe PLAGNIOL-VILLARD <plagniol@xxxxxxxxxxxx> + * + * GPLv2 only + */ + +#ifndef __MACH_DEBUG_LL_H__ +#define __MACH_DEBUG_LL_H__ + +#include <linux/amba/serial.h> +#include <io.h> + +#define DEBUG_LL_PHYS_BASE 0x10000000 +#define DEBUG_LL_PHYS_BASE_RS1 0x1c000000 + +#ifdef MP +#define DEBUG_LL_UART_ADDR DEBUG_LL_PHYS_BASE +#else +#define DEBUG_LL_UART_ADDR DEBUG_LL_PHYS_BASE_RS1 +#endif + +#include <asm/debug_ll_pl011.h> + +#endif diff --git a/arch/arm/mach-virt/include/mach/devices.h b/arch/arm/mach-virt/include/mach/devices.h new file mode 100644 index 0000000..9872c61 --- /dev/null +++ b/arch/arm/mach-virt/include/mach/devices.h @@ -0,0 +1,13 @@ +/* + * Copyright (C) 2016 Raphaël Poggi <poggi.raph@xxxxxxxxx> + * + * GPLv2 only + */ + +#ifndef __ASM_ARCH_DEVICES_H__ +#define __ASM_ARCH_DEVICES_H__ + +void virt_add_ddram(u32 size); +void virt_register_uart(unsigned id); + +#endif /* __ASM_ARCH_DEVICES_H__ */ diff --git a/arch/arm/mach-virt/lowlevel.c b/arch/arm/mach-virt/lowlevel.c new file mode 100644 index 0000000..6f695a5 --- /dev/null +++ b/arch/arm/mach-virt/lowlevel.c @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2013 Jean-Christophe PLAGNIOL-VILLARD <plagnio@xxxxxxxxxxxx> + * + * GPLv2 only + */ + +#include <common.h> +#include <linux/sizes.h> +#include <asm/barebox-arm-head.h> +#include <asm/barebox-arm.h> +#include <asm/system_info.h> + +void barebox_arm_reset_vector(void) +{ + arm_cpu_lowlevel_init(); + arm_setup_stack(STACK_BASE); + + barebox_arm_entry(0x40000000, SZ_512M, NULL); +} diff --git a/arch/arm/mach-virt/reset.c b/arch/arm/mach-virt/reset.c new file mode 100644 index 0000000..fb895eb --- /dev/null +++ b/arch/arm/mach-virt/reset.c @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2016 Raphaël Poggi <poggi.raph@xxxxxxxxx> + * + * GPLv2 only + */ + +#include <common.h> +#include <io.h> +#include <init.h> +#include <restart.h> +#include <mach/devices.h> + +static void virt_reset_soc(struct restart_handler *rst) +{ + hang(); +} + +static int restart_register_feature(void) +{ + restart_handler_register_fn(virt_reset_soc); + + return 0; +} +coredevice_initcall(restart_register_feature); -- 2.1.0 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox