From e70062feb3077411e91a07d3209252b6c87da4b9 Mon Sep 17 00:00:00 2001 From: Korobov Nikita Date: Mon, 22 May 2017 01:48:45 +0300 Subject: [PATCH] [MAJOR] Add device tree compatibility Unstable version of device tree compability. Device tree passes through bootloader, but doesn't parse on this stage. --- minix/kernel/arch/earm/Makefile.inc | 2 + minix/kernel/arch/earm/head.S | 15 +-- minix/kernel/arch/earm/kernel-omap.lds | 2 +- minix/kernel/arch/earm/kernel-rpi.lds | 2 +- minix/kernel/arch/earm/pre_init.c | 94 ++++++++++++++----- releasetools/arm_sdimage_omap.sh | 2 +- releasetools/arm_sdimage_rpi.sh | 12 ++- releasetools/rpi-bootloader/bootloader.S | 6 +- .../rpi-bootloader/bootloader_common.S | 4 +- 9 files changed, 97 insertions(+), 42 deletions(-) diff --git a/minix/kernel/arch/earm/Makefile.inc b/minix/kernel/arch/earm/Makefile.inc index 9de8817ce..6caf1bc28 100644 --- a/minix/kernel/arch/earm/Makefile.inc +++ b/minix/kernel/arch/earm/Makefile.inc @@ -32,6 +32,8 @@ SRCS+= mpx.S arch_clock.c arch_do_vmctl.c arch_system.c do_padconf.c \ OBJS.kernel+= ${UNPAGED_OBJS} +LDADD+=-lfdt + klib.o mpx.o head.o: procoffsets.h SRCS+= procoffsets.h diff --git a/minix/kernel/arch/earm/head.S b/minix/kernel/arch/earm/head.S index 26b84b6bc..bd7d5847b 100644 --- a/minix/kernel/arch/earm/head.S +++ b/minix/kernel/arch/earm/head.S @@ -44,14 +44,16 @@ multiboot_init: * * in r0 - argc * in r1 - argv + * in r2 - dev_tree * * r4 - pg_table * r9 - _kern_phys_base * * out r0 - argc * out r1 - argv + * out r2 - dev_tree */ - + mov r10, r2 ldr r6, =0xFFF00000 and r9, pc, r6 @@ -224,11 +226,13 @@ setup: mcr p15, 0, r3, c1, c0, 0 isb + mov r2, r10 ldr sp, =k_initial_stktop /* make usable stack */ - /* Terminate stack */ + + mov r3, #0 + push {r3} mov fp, #0 - mov r2, #0 - push {r2} + push {r3} bl _C_LABEL(pre_init) ldr r4, =1384 // FIXME @@ -241,7 +245,7 @@ setup: * the boot info pointer returned by pre_init in r0. * Set the highly mapped stack and initialize it. * - * Afther that call kmain with r0 still pointing to boot info + * After that call kmain with r0 still pointing to boot info */ ldr r2, =_C_LABEL(kmain) /* r0 holds kinfo_t ptr */ bx r2 @@ -256,4 +260,3 @@ pg_table: .space 16384 freepde: .word 0 - diff --git a/minix/kernel/arch/earm/kernel-omap.lds b/minix/kernel/arch/earm/kernel-omap.lds index 8081c241b..9b84fe4ce 100644 --- a/minix/kernel/arch/earm/kernel-omap.lds +++ b/minix/kernel/arch/earm/kernel-omap.lds @@ -45,7 +45,7 @@ SECTIONS __k_unpaged__end = . - _kern_offset; /DISCARD/ : - { + { *(.ARM.exidx*) } } diff --git a/minix/kernel/arch/earm/kernel-rpi.lds b/minix/kernel/arch/earm/kernel-rpi.lds index 07bf54150..a2ad2963c 100644 --- a/minix/kernel/arch/earm/kernel-rpi.lds +++ b/minix/kernel/arch/earm/kernel-rpi.lds @@ -34,7 +34,7 @@ SECTIONS .data ALIGN(4096) : AT(ADDR(.data) - _kern_offset) { *(.data .rodata* ) } . = ALIGN(4096); _edata = .; - __k_unpaged__edata = . - _kern_offset; + __k_unpaged__edata = . - _kern_offset; .bss ALIGN(4096) : AT(ADDR(.bss) - _kern_offset) { *(.bss* COMMON) __k_unpaged__kern_size = . - _kern_vir_base; _kern_size = __k_unpaged__kern_size; diff --git a/minix/kernel/arch/earm/pre_init.c b/minix/kernel/arch/earm/pre_init.c index 54d135571..e807dfbc3 100644 --- a/minix/kernel/arch/earm/pre_init.c +++ b/minix/kernel/arch/earm/pre_init.c @@ -17,6 +17,9 @@ #include "glo.h" #include +#include +#include + #if USE_SYSDEBUG #define MULTIBOOT_VERBOSE 1 #endif @@ -38,30 +41,28 @@ extern u32_t _edata; extern u32_t _end; #define BSP_TABLE_GENERATE(name) \ - bsp_table name##_bsp_table = { \ - .bsp_init = name##_init, \ - .bsp_irq_unmask = name##_irq_unmask, \ - .bsp_irq_mask = name##_irq_mask, \ - .bsp_irq_handle = name##_irq_handle, \ - .bsp_padconf_init = name##_padconf_init, \ - .bsp_padconf_set = name##_padconf_set, \ - .bsp_reset_init = name##_reset_init, \ - .bsp_reset = name##_reset, \ - .bsp_poweroff = name##_poweroff, \ - .bsp_disable_watchdog = name##_disable_watchdog, \ - .bsp_ser_init = name##_ser_init, \ - .bsp_ser_putc = name##_ser_putc, \ - .bsp_timer_init = name##_timer_init, \ - .bsp_timer_stop = name##_timer_stop, \ - .bsp_register_timer_handler = name##_register_timer_handler, \ - .bsp_timer_int_handler = name##_timer_int_handler, \ - .read_tsc_64 = name##_read_tsc_64, \ - .intr_init = name##_intr_init \ - } - -BSP_TABLE_GENERATE(rpi); -BSP_TABLE_GENERATE(omap); + do { \ + platform_tb.bsp_init = name##_init; \ + platform_tb.bsp_irq_unmask = name##_irq_unmask; \ + platform_tb.bsp_irq_mask = name##_irq_mask; \ + platform_tb.bsp_irq_handle = name##_irq_handle; \ + platform_tb.bsp_padconf_init = name##_padconf_init; \ + platform_tb.bsp_padconf_set = name##_padconf_set; \ + platform_tb.bsp_reset_init = name##_reset_init;\ + platform_tb.bsp_reset = name##_reset; \ + platform_tb.bsp_poweroff = name##_poweroff; \ + platform_tb.bsp_disable_watchdog = name##_disable_watchdog; \ + platform_tb.bsp_ser_init = name##_ser_init; \ + platform_tb.bsp_ser_putc = name##_ser_putc; \ + platform_tb.bsp_timer_init = name##_timer_init; \ + platform_tb.bsp_timer_stop = name##_timer_stop; \ + platform_tb.bsp_register_timer_handler = name##_register_timer_handler; \ + platform_tb.bsp_timer_int_handler = name##_timer_int_handler; \ + platform_tb.read_tsc_64 = name##_read_tsc_64; \ + platform_tb.intr_init = name##_intr_init; \ + } while(0) +bsp_table platform_tb; bsp_table *bsp_tb; /* @@ -404,13 +405,51 @@ void set_machine_id(char *cmdline) } } -void set_bsp_table () +void set_bsp_table() { if (BOARD_IS_BB(machine.board_id) || BOARD_IS_BBXM(machine.board_id)) { - bsp_tb = &omap_bsp_table; + BSP_TABLE_GENERATE(omap); } else if (BOARD_IS_RPI_2_B(machine.board_id) || BOARD_IS_RPI_3_B(machine.board_id)) { - bsp_tb = &rpi_bsp_table; + BSP_TABLE_GENERATE(rpi); + } + bsp_tb = &platform_tb; +} + +static void test_node(const void *fdt, int parent_offset) +{ + uint32_t subnodes; + const fdt32_t *prop; + int offset; + int count; + int len; + /* This property indicates the number of subnodes to expect */ + prop = fdt_getprop(fdt, parent_offset, "subnodes", &len); + if (!prop || len != sizeof(fdt32_t)) { + printf("Missing/invalid subnodes property at '%s'", + fdt_get_name(fdt, parent_offset, NULL)); + } + subnodes = fdt32_to_cpu(*prop); + count = 0; + fdt_for_each_subnode(offset, fdt, parent_offset) + count++; + if (count != subnodes) { + printf("Node '%s': Expected %d subnodes, got %d\n", + fdt_get_name(fdt, parent_offset, NULL), subnodes, count); + } +} + +void parse_dev_tree(const void *dev_tree) +{ + uint32_t offset; + uint32_t len; + if (!fdt_check_header(dev_tree)) { + printf("BAD HEADER\n"); + return; + } + int node; + fdt_for_each_subnode(node, dev_tree, 0) { + test_node(dev_tree, node); } } @@ -433,6 +472,9 @@ kinfo_t *pre_init(int argc, char **argv) { char* bootargs; + void* dev_tree; + asm volatile ("ldr %0, [%%r2]":"=r"(dev_tree)::"r2", "memory"); + /* This is the main "c" entry point into the kernel. It gets called from head.S */ diff --git a/releasetools/arm_sdimage_omap.sh b/releasetools/arm_sdimage_omap.sh index a95054255..79f974e7c 100755 --- a/releasetools/arm_sdimage_omap.sh +++ b/releasetools/arm_sdimage_omap.sh @@ -25,7 +25,7 @@ BSP_NAME=omap : ${BUILDSH=build.sh} : ${SETS="minix-base minix-comp minix-games minix-man minix-tests tests"} -: ${IMG=minix_arm_sd_omap.img} +: ${IMG=minix_arm_sd.img} # ARM definitions: : ${BUILDVARS=-V MKGCCCMDS=yes -V MKLLVM=no} diff --git a/releasetools/arm_sdimage_rpi.sh b/releasetools/arm_sdimage_rpi.sh index 2eb0d2558..d05a2d580 100755 --- a/releasetools/arm_sdimage_rpi.sh +++ b/releasetools/arm_sdimage_rpi.sh @@ -25,7 +25,7 @@ BSP_NAME=rpi : ${BUILDSH=build.sh} : ${SETS="minix-base"} -: ${IMG=minix_arm_sd_rpi.img} +: ${IMG=minix_arm_sd.img} # ARM definitions: : ${BUILDVARS=-V MKGCCCMDS=yes -V MKLLVM=no} @@ -87,6 +87,8 @@ ${CROSS_PREFIX}objcopy ${OBJ}/minix/kernel/kernel -O binary ${ROOT_DIR}/kernel.b ${CROSS_PREFIX}as ${RELEASETOOLSDIR}/rpi-bootloader/bootloader.S -o ${RELEASETOOLSDIR}/rpi-bootloader/bootloader.o ${CROSS_PREFIX}ld ${RELEASETOOLSDIR}/rpi-bootloader/bootloader.o -o ${RELEASETOOLSDIR}/rpi-bootloader/bootloader.elf -Ttext=0x8000 2> /dev/null ${CROSS_PREFIX}objcopy -O binary ${RELEASETOOLSDIR}/rpi-bootloader/bootloader.elf ${ROOT_DIR}/minix_rpi.bin +# copy device trees +cp ${RELEASETOOLSDIR}/rpi-firmware/bcm*.dtb ${ROOT_DIR} # pack modules (cd ${ROOT_DIR} && cat <> ${ROOT_DIR}/minix_rpi.bin 2>/dev/null kernel.bin @@ -109,11 +111,15 @@ cp -r releasetools/rpi-firmware/* ${ROOT_DIR} # Write GPU config file cat <${ROOT_DIR}/config.txt [pi3] -kernel=minix_rpi.bin +device_tree=bcm2710-rpi-3-b.dtb enable_uart=1 dtoverlay=pi3-disable-bt [pi2] +device_tree=bcm2709-rpi-2-b.dtb + +[all] +device_tree_address=0x100 kernel=minix_rpi.bin EOF @@ -129,4 +135,4 @@ echo "" echo "Disk image at `pwd`/${IMG}" echo "" echo "To boot this image on kvm:" -echo "qemu-system-arm -M raspi2 -drive if=sd,cache=writeback,format=raw,file=$(pwd)/${IMG} -bios ${ROOT_DIR}/minix_rpi.bin -serial stdio" +echo "qemu-system-arm -M raspi2 -kernel if=sd,cache=writeback,format=raw,file=/$(pwd)/${IMG} -bios ${ROOT_DIR}/minix_rpi.bin -serial stdio -dtb $(pwd)/releasetools/rpi-firmware/bcm2709-rpi-2-b.dtb " diff --git a/releasetools/rpi-bootloader/bootloader.S b/releasetools/rpi-bootloader/bootloader.S index 7ffbaf8d4..93faf3d21 100644 --- a/releasetools/rpi-bootloader/bootloader.S +++ b/releasetools/rpi-bootloader/bootloader.S @@ -5,12 +5,12 @@ .align 4 argv: .word argv0 - .word argv1 - .word 0x0 + .word argv1 + .word 0x0 argv0: .asciz "0x00200000" argv1: - .asciz "board_name=RPI_2_B console=tty00" + .asciz "board_name=RPI_2_B console=tty00" .data .align 4 .space 256 diff --git a/releasetools/rpi-bootloader/bootloader_common.S b/releasetools/rpi-bootloader/bootloader_common.S index 613fa9314..f5c2ff6e3 100644 --- a/releasetools/rpi-bootloader/bootloader_common.S +++ b/releasetools/rpi-bootloader/bootloader_common.S @@ -1,5 +1,6 @@ _start: ldr sp, =stack_top + mov r9, r2 /* Print banner */ ldr r0, =msg_empty @@ -72,6 +73,7 @@ final_preparations: bl puts mov r0, #2 ldr r1, =argv + mov r2, r9 b 0x00200000 /* @@ -314,7 +316,7 @@ memcpy_done: pop {r5-r11} bx lr -msg_empty: + msg_empty: .asciz "" msg_banner: .asciz "MINIX 3 unpacker for Raspberry Pi"