[MAJOR] Add device tree compatibility

Unstable version of device tree compability.
Device tree passes through bootloader, but doesn't parse on this stage.
This commit is contained in:
Korobov Nikita
2017-05-22 01:48:45 +03:00
parent 7b468ec005
commit e70062feb3
9 changed files with 97 additions and 42 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -45,7 +45,7 @@ SECTIONS
__k_unpaged__end = . - _kern_offset;
/DISCARD/ :
{
{
*(.ARM.exidx*)
}
}

View File

@@ -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;

View File

@@ -17,6 +17,9 @@
#include "glo.h"
#include <machine/multiboot.h>
#include <libfdt.h>
#include <libfdt_internal.h>
#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 */

View File

@@ -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}

View File

@@ -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 <<EOF | cpio -o --format=newc >> ${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 <<EOF >${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 "

View File

@@ -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

View File

@@ -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"