From cf7c06297d04bade9cd04c056f9ed510e64dd7bd Mon Sep 17 00:00:00 2001 From: Uros Majstorovic Date: Wed, 5 Aug 2020 03:39:22 +0200 Subject: code -> fw --- code/fe310/bsp/metal/Makefile | 13 ------ code/fe310/bsp/metal/entry.S | 106 ------------------------------------------ code/fe310/bsp/metal/metal.c | 34 -------------- 3 files changed, 153 deletions(-) delete mode 100644 code/fe310/bsp/metal/Makefile delete mode 100644 code/fe310/bsp/metal/entry.S delete mode 100644 code/fe310/bsp/metal/metal.c (limited to 'code/fe310/bsp/metal') diff --git a/code/fe310/bsp/metal/Makefile b/code/fe310/bsp/metal/Makefile deleted file mode 100644 index 32acfd2..0000000 --- a/code/fe310/bsp/metal/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -include ../../common.mk -CFLAGS += -I../include -I../drivers - -%.o: %.c - $(CC) $(CFLAGS) -c $< - -%.o: %.S - $(CC) $(CFLAGS) -c $< - -all: entry.o metal.o - -clean: - rm -f *.o diff --git a/code/fe310/bsp/metal/entry.S b/code/fe310/bsp/metal/entry.S deleted file mode 100644 index 97da3fd..0000000 --- a/code/fe310/bsp/metal/entry.S +++ /dev/null @@ -1,106 +0,0 @@ -/* Copyright 2018 SiFive, Inc */ -/* SPDX-License-Identifier: Apache-2.0 */ - -/* This code executes before _start, which is contained inside the C library. - * In embedded systems we want to ensure that _enter, which contains the first - * code to be executed, can be loaded at a specific address. To enable this - * feature we provide the '.text.metal.init.enter' section, which is - * defined to have the first address being where execution should start. */ -.section .text.metal.init.enter -.global _enter -_enter: - .cfi_startproc - - /* Inform the debugger that there is nowhere to backtrace past _enter. */ - .cfi_undefined ra - - /* The absolute first thing that must happen is configuring the global - * pointer register, which must be done with relaxation disabled because - * it's not valid to obtain the address of any symbol without GP - * configured. The C environment might go ahead and do this again, but - * that's safe as it's a fixed register. */ -.option push -.option norelax - la gp, __global_pointer$ -.option pop - - /* Set up a simple trap vector to catch anything that goes wrong early in - * the boot process. */ - la t0, early_trap_vector - csrw mtvec, t0 - /* enable chicken bit if core is bullet series*/ - la t0, __metal_chicken_bit - beqz t0, 1f - csrwi 0x7C1, 0 -1: - - /* There may be pre-initialization routines inside the MBI code that run in - * C, so here we set up a C environment. First we set up a stack pointer, - * which is left as a weak reference in order to allow initialization - * routines that do not need a stack to be set up to transparently be - * called. */ - .weak __metal_stack_pointer - la sp, __metal_stack_pointer - - /* Check for an initialization routine and call it if one exists, otherwise - * just skip over the call entirely. Note that __metal_initialize isn't - * actually a full C function, as it doesn't end up with the .bss or .data - * segments having been initialized. This is done to avoid putting a - * burden on systems that can be initialized without having a C environment - * set up. */ - .weak __metal_before_start - la ra, __metal_before_start - beqz ra, 1f - jalr ra -1: - - /* At this point we can enter the C runtime's startup file. The arguments - * to this function are designed to match those provided to the SEE, just - * so we don't have to write another ABI. */ - csrr a0, mhartid - li a1, 0 - li a2, 0 - call _start - - /* If we've made it back here then there's probably something wrong. We - * allow the METAL to register a handler here. */ - .weak __metal_after_main - la ra, __metal_after_main - beqz ra, 1f - jalr ra -1: - - /* If that handler returns then there's not a whole lot we can do. Just - * try to make some noise. */ - la t0, 1f - csrw mtvec, t0 -1: - lw t1, 0(x0) - j 1b - - .cfi_endproc - -/* For sanity's sake we set up an early trap vector that just does nothing. If - * you end up here then there's a bug in the early boot code somewhere. */ -.section .text.metal.init.trapvec -.align 2 -early_trap_vector: - .cfi_startproc - csrr t0, mcause - csrr t1, mepc - csrr t2, mtval - j early_trap_vector - .cfi_endproc - -/* The GCC port might not emit a __register_frame_info symbol, which eventually - * results in a weak undefined reference that eventually causes crash when it - * is dereference early in boot. We really shouldn't need to put this here, - * but to deal with what I think is probably a bug in the linker script I'm - * going to leave this in for now. At least it's fairly cheap :) */ -.weak __register_frame_info -.global __register_frame_info -.section .text.metal.init.__register_frame_info -__register_frame_info: - .cfi_startproc - ret - .cfi_endproc diff --git a/code/fe310/bsp/metal/metal.c b/code/fe310/bsp/metal/metal.c deleted file mode 100644 index 00849b9..0000000 --- a/code/fe310/bsp/metal/metal.c +++ /dev/null @@ -1,34 +0,0 @@ -#include - -#include "encoding.h" -#include "platform.h" -#include "prci_driver.h" - -extern void eos_trap_entry(); - -static void uart_init(size_t baud_rate) { - GPIO_REG(GPIO_IOF_SEL) &= ~IOF0_UART0_MASK; - GPIO_REG(GPIO_IOF_EN) |= IOF0_UART0_MASK; - UART0_REG(UART_REG_DIV) = PRCI_get_cpu_freq() / baud_rate - 1; - UART0_REG(UART_REG_TXCTRL) |= UART_TXEN; - UART0_REG(UART_REG_RXCTRL) |= UART_RXEN; -} - -__attribute__((constructor)) -void metal_init(void) { - SPI0_REG(SPI_REG_SCKDIV) = 8; - - PRCI_use_default_clocks(); - PRCI_use_pll(PLL_REFSEL_HFXOSC, 0, 1, 31, 1, -1, -1, -1); - uart_init(115200); - - write_csr(mtvec, &eos_trap_entry); - if (read_csr(misa) & (1 << ('F' - 'A'))) { // if F extension is present - write_csr(mstatus, MSTATUS_FS); // allow FPU instructions without trapping - write_csr(fcsr, 0); // initialize rounding mode, undefined at reset - } -} - -__attribute__((section(".init"))) -void __metal_synchronize_harts() { -} -- cgit v1.2.3