Merge git://git.denx.de/u-boot-riscv
This commit is contained in:
commit
964d4f7211
@ -87,9 +87,9 @@ before_script:
|
|||||||
fi
|
fi
|
||||||
- if [[ "${TOOLCHAIN}" == "powerpc" ]]; then ./tools/buildman/buildman --fetch-arch powerpc; fi
|
- if [[ "${TOOLCHAIN}" == "powerpc" ]]; then ./tools/buildman/buildman --fetch-arch powerpc; fi
|
||||||
- if [[ "${TOOLCHAIN}" == "riscv" ]]; then
|
- if [[ "${TOOLCHAIN}" == "riscv" ]]; then
|
||||||
wget https://github.com/PkmX/riscv-prebuilt-toolchains/releases/download/20180111/riscv32-unknown-elf-toolchain.tar.gz &&
|
wget https://github.com/andestech/prebuilt/releases/download/20180530/riscv64-unknown-linux-gnu.tar.gz &&
|
||||||
tar -C /tmp -xf riscv32-unknown-elf-toolchain.tar.gz &&
|
tar -C /tmp -xf riscv64-unknown-linux-gnu.tar.gz &&
|
||||||
echo -e "\n[toolchain-prefix]\nriscv = /tmp/riscv32-unknown-elf/bin/riscv32-unknown-elf-" >> ~/.buildman;
|
echo -e "\n[toolchain-prefix]\nriscv = /tmp/riscv64-unknown-linux-gnu/bin/riscv64-unknown-linux-gnu-" >> ~/.buildman;
|
||||||
fi
|
fi
|
||||||
- if [[ "${QEMU_TARGET}" != "" ]]; then
|
- if [[ "${QEMU_TARGET}" != "" ]]; then
|
||||||
git clone git://git.qemu.org/qemu.git /tmp/qemu;
|
git clone git://git.qemu.org/qemu.git /tmp/qemu;
|
||||||
|
@ -8,12 +8,12 @@ choice
|
|||||||
prompt "Target select"
|
prompt "Target select"
|
||||||
optional
|
optional
|
||||||
|
|
||||||
config TARGET_NX25_AE250
|
config TARGET_AX25_AE350
|
||||||
bool "Support nx25-ae250"
|
bool "Support ax25-ae350"
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
source "board/AndesTech/nx25-ae250/Kconfig"
|
source "board/AndesTech/ax25-ae350/Kconfig"
|
||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "CPU selection"
|
prompt "CPU selection"
|
||||||
|
@ -19,15 +19,20 @@ endif
|
|||||||
|
|
||||||
ifdef CONFIG_32BIT
|
ifdef CONFIG_32BIT
|
||||||
PLATFORM_LDFLAGS += -m $(32bit-emul)
|
PLATFORM_LDFLAGS += -m $(32bit-emul)
|
||||||
|
EFI_LDS := elf_riscv32_efi.lds
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_64BIT
|
ifdef CONFIG_64BIT
|
||||||
PLATFORM_LDFLAGS += -m $(64bit-emul)
|
PLATFORM_LDFLAGS += -m $(64bit-emul)
|
||||||
|
EFI_LDS := elf_riscv64_efi.lds
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CONFIG_STANDALONE_LOAD_ADDR = 0x00000000 \
|
CONFIG_STANDALONE_LOAD_ADDR = 0x00000000 \
|
||||||
-T $(srctree)/examples/standalone/riscv.lds
|
-T $(srctree)/examples/standalone/riscv.lds
|
||||||
|
|
||||||
PLATFORM_CPPFLAGS += -ffixed-gp -fpic
|
PLATFORM_CPPFLAGS += -ffixed-gp -fpic
|
||||||
PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -gdwarf-2
|
PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -gdwarf-2 -ffunction-sections
|
||||||
LDFLAGS_u-boot += --gc-sections -static -pie
|
LDFLAGS_u-boot += --gc-sections -static -pie
|
||||||
|
|
||||||
|
EFI_CRT0 := crt0_riscv_efi.o
|
||||||
|
EFI_RELOC := reloc_riscv_efi.o
|
||||||
|
@ -28,5 +28,5 @@ int cleanup_before_linux(void)
|
|||||||
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||||
{
|
{
|
||||||
disable_interrupts();
|
disable_interrupts();
|
||||||
panic("nx25-ae250 wdt not support yet.\n");
|
panic("ax25-ae350 wdt not support yet.\n");
|
||||||
}
|
}
|
@ -11,7 +11,7 @@ SECTIONS
|
|||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
.text :
|
.text :
|
||||||
{
|
{
|
||||||
arch/riscv/cpu/nx25/start.o (.text)
|
arch/riscv/cpu/ax25/start.o (.text)
|
||||||
*(.text)
|
*(.text)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,6 +37,22 @@ SECTIONS
|
|||||||
KEEP(*(SORT(.u_boot_list*)));
|
KEEP(*(SORT(.u_boot_list*)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
|
||||||
|
.efi_runtime : {
|
||||||
|
__efi_runtime_start = .;
|
||||||
|
*(efi_runtime_text)
|
||||||
|
*(efi_runtime_data)
|
||||||
|
__efi_runtime_stop = .;
|
||||||
|
}
|
||||||
|
|
||||||
|
.efi_runtime_rel : {
|
||||||
|
__efi_runtime_rel_start = .;
|
||||||
|
*(.relaefi_runtime_text)
|
||||||
|
*(.relaefi_runtime_data)
|
||||||
|
__efi_runtime_rel_stop = .;
|
||||||
|
}
|
||||||
|
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
|
|
||||||
/DISCARD/ : { *(.rela.plt*) }
|
/DISCARD/ : { *(.rela.plt*) }
|
@ -1,6 +1,6 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0+
|
# SPDX-License-Identifier: GPL-2.0+
|
||||||
|
|
||||||
dtb-$(CONFIG_TARGET_NX25_AE250) += ae250.dtb
|
dtb-$(CONFIG_TARGET_AX25_AE350) += ae350.dtb
|
||||||
targets += $(dtb-y)
|
targets += $(dtb-y)
|
||||||
|
|
||||||
DTC_FLAGS += -R 4 -p 0x1000
|
DTC_FLAGS += -R 4 -p 0x1000
|
||||||
|
@ -1,97 +0,0 @@
|
|||||||
/dts-v1/;
|
|
||||||
/ {
|
|
||||||
compatible = "riscv32 nx25";
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <1>;
|
|
||||||
interrupt-parent = <&intc>;
|
|
||||||
|
|
||||||
aliases {
|
|
||||||
uart0 = &serial0;
|
|
||||||
ethernet0 = &mac0;
|
|
||||||
spi0 = &spi;
|
|
||||||
} ;
|
|
||||||
|
|
||||||
chosen {
|
|
||||||
bootargs = "console=ttyS0,38400n8 earlyprintk=uart8250-32bit,0xf0300000 debug loglevel=7";
|
|
||||||
stdout-path = "uart0:38400n8";
|
|
||||||
tick-timer = &timer0;
|
|
||||||
};
|
|
||||||
|
|
||||||
memory@0 {
|
|
||||||
device_type = "memory";
|
|
||||||
reg = <0x00000000 0x40000000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
spiclk: virt_100mhz {
|
|
||||||
#clock-cells = <0>;
|
|
||||||
compatible = "fixed-clock";
|
|
||||||
clock-frequency = <100000000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
cpus {
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
cpu@0 {
|
|
||||||
compatible = "andestech,n13";
|
|
||||||
reg = <0>;
|
|
||||||
/* FIXME: to fill correct frqeuency */
|
|
||||||
clock-frequency = <60000000>;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
intc: interrupt-controller {
|
|
||||||
compatible = "andestech,atnointc010";
|
|
||||||
#interrupt-cells = <1>;
|
|
||||||
interrupt-controller;
|
|
||||||
};
|
|
||||||
|
|
||||||
serial0: serial@f0300000 {
|
|
||||||
compatible = "andestech,uart16550", "ns16550a";
|
|
||||||
reg = <0xf0300000 0x1000>;
|
|
||||||
interrupts = <7 4>;
|
|
||||||
clock-frequency = <19660800>;
|
|
||||||
reg-shift = <2>;
|
|
||||||
reg-offset = <32>;
|
|
||||||
no-loopback-test = <1>;
|
|
||||||
};
|
|
||||||
|
|
||||||
timer0: timer@f0400000 {
|
|
||||||
compatible = "andestech,atcpit100";
|
|
||||||
reg = <0xf0400000 0x1000>;
|
|
||||||
interrupts = <2 4>;
|
|
||||||
clock-frequency = <40000000>;
|
|
||||||
};
|
|
||||||
|
|
||||||
mac0: mac@e0100000 {
|
|
||||||
compatible = "andestech,atmac100";
|
|
||||||
reg = <0xe0100000 0x1000>;
|
|
||||||
interrupts = <25 4>;
|
|
||||||
};
|
|
||||||
|
|
||||||
mmc0: mmc@f0e00000 {
|
|
||||||
compatible = "andestech,atsdc010";
|
|
||||||
max-frequency = <100000000>;
|
|
||||||
fifo-depth = <0x10>;
|
|
||||||
reg = <0xf0e00000 0x1000>;
|
|
||||||
interrupts = <17 4>;
|
|
||||||
cap-sd-highspeed;
|
|
||||||
};
|
|
||||||
|
|
||||||
spi: spi@f0b00000 {
|
|
||||||
compatible = "andestech,atcspi200";
|
|
||||||
reg = <0xf0b00000 0x1000>;
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
num-cs = <1>;
|
|
||||||
clocks = <&spiclk>;
|
|
||||||
interrupts = <3 4>;
|
|
||||||
flash@0 {
|
|
||||||
compatible = "spi-flash";
|
|
||||||
spi-max-frequency = <50000000>;
|
|
||||||
reg = <0>;
|
|
||||||
spi-cpol;
|
|
||||||
spi-cpha;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
149
arch/riscv/dts/ae350.dts
Normal file
149
arch/riscv/dts/ae350.dts
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
/dts-v1/;
|
||||||
|
|
||||||
|
/ {
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <2>;
|
||||||
|
compatible = "andestech,ax25";
|
||||||
|
model = "andestech,ax25";
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
uart0 = &serial0;
|
||||||
|
spi0 = &spi;
|
||||||
|
} ;
|
||||||
|
|
||||||
|
chosen {
|
||||||
|
bootargs = "console=ttyS0,38400n8 earlyprintk=uart8250-32bit,0xf0300000 debug loglevel=7";
|
||||||
|
stdout-path = "uart0:38400n8";
|
||||||
|
};
|
||||||
|
|
||||||
|
cpus {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
timebase-frequency = <10000000>;
|
||||||
|
CPU0: cpu@0 {
|
||||||
|
device_type = "cpu";
|
||||||
|
reg = <0>;
|
||||||
|
status = "okay";
|
||||||
|
compatible = "riscv";
|
||||||
|
riscv,isa = "rv64imafdc";
|
||||||
|
mmu-type = "riscv,sv39";
|
||||||
|
clock-frequency = <60000000>;
|
||||||
|
CPU0_intc: interrupt-controller {
|
||||||
|
#interrupt-cells = <1>;
|
||||||
|
interrupt-controller;
|
||||||
|
compatible = "riscv,cpu-intc";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
memory@0 {
|
||||||
|
device_type = "memory";
|
||||||
|
reg = <0x0 0x00000000 0x0 0x40000000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
soc {
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <2>;
|
||||||
|
compatible = "andestech,riscv-ae350-soc";
|
||||||
|
ranges;
|
||||||
|
};
|
||||||
|
|
||||||
|
plmt0@e6000000 {
|
||||||
|
compatible = "riscv,plmt0";
|
||||||
|
interrupts-extended = <&CPU0_intc 7>;
|
||||||
|
reg = <0x0 0xe6000000 0x0 0x100000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
plic0: interrupt-controller@e4000000 {
|
||||||
|
compatible = "riscv,plic0";
|
||||||
|
#address-cells = <2>;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
reg = <0x0 0xe4000000 0x0 0x2000000>;
|
||||||
|
riscv,ndev=<31>;
|
||||||
|
interrupts-extended = <&CPU0_intc 11 &CPU0_intc 9>;
|
||||||
|
};
|
||||||
|
|
||||||
|
plic1: interrupt-controller@e6400000 {
|
||||||
|
compatible = "riscv,plic1";
|
||||||
|
#address-cells = <2>;
|
||||||
|
#interrupt-cells = <2>;
|
||||||
|
interrupt-controller;
|
||||||
|
reg = <0x0 0xe6400000 0x0 0x400000>;
|
||||||
|
riscv,ndev=<1>;
|
||||||
|
interrupts-extended = <&CPU0_intc 3>;
|
||||||
|
};
|
||||||
|
|
||||||
|
spiclk: virt_100mhz {
|
||||||
|
#clock-cells = <0>;
|
||||||
|
compatible = "fixed-clock";
|
||||||
|
clock-frequency = <100000000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
timer0: timer@f0400000 {
|
||||||
|
compatible = "andestech,atcpit100";
|
||||||
|
reg = <0x0 0xf0400000 0x0 0x1000>;
|
||||||
|
clock-frequency = <40000000>;
|
||||||
|
interrupts = <3 4>;
|
||||||
|
interrupt-parent = <&plic0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
serial0: serial@f0300000 {
|
||||||
|
compatible = "andestech,uart16550", "ns16550a";
|
||||||
|
reg = <0x0 0xf0300000 0x0 0x1000>;
|
||||||
|
interrupts = <9 4>;
|
||||||
|
clock-frequency = <19660800>;
|
||||||
|
reg-shift = <2>;
|
||||||
|
reg-offset = <32>;
|
||||||
|
no-loopback-test = <1>;
|
||||||
|
interrupt-parent = <&plic0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
mac0: mac@e0100000 {
|
||||||
|
compatible = "andestech,atmac100";
|
||||||
|
reg = <0x0 0xe0100000 0x0 0x1000>;
|
||||||
|
interrupts = <19 4>;
|
||||||
|
interrupt-parent = <&plic0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
mmc0: mmc@f0e00000 {
|
||||||
|
compatible = "andestech,atfsdc010";
|
||||||
|
max-frequency = <100000000>;
|
||||||
|
clock-freq-min-max = <400000 100000000>;
|
||||||
|
fifo-depth = <0x10>;
|
||||||
|
reg = <0x0 0xf0e00000 0x0 0x1000>;
|
||||||
|
interrupts = <18 4>;
|
||||||
|
cap-sd-highspeed;
|
||||||
|
interrupt-parent = <&plic0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
smc0: smc@e0400000 {
|
||||||
|
compatible = "andestech,atfsmc020";
|
||||||
|
reg = <0x0 0xe0400000 0x0 0x1000>;
|
||||||
|
};
|
||||||
|
|
||||||
|
nor@0,0 {
|
||||||
|
compatible = "cfi-flash";
|
||||||
|
reg = <0x0 0x88000000 0x0 0x1000>;
|
||||||
|
bank-width = <2>;
|
||||||
|
device-width = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
spi: spi@f0b00000 {
|
||||||
|
compatible = "andestech,atcspi200";
|
||||||
|
reg = <0x0 0xf0b00000 0x0 0x1000>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
num-cs = <1>;
|
||||||
|
clocks = <&spiclk>;
|
||||||
|
interrupts = <3 4>;
|
||||||
|
interrupt-parent = <&plic0>;
|
||||||
|
flash@0 {
|
||||||
|
compatible = "spi-flash";
|
||||||
|
spi-max-frequency = <50000000>;
|
||||||
|
reg = <0>;
|
||||||
|
spi-cpol;
|
||||||
|
spi-cpha;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
@ -12,18 +12,18 @@
|
|||||||
extern unsigned int __machine_arch_type;
|
extern unsigned int __machine_arch_type;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MACH_TYPE_AE250 1
|
#define MACH_TYPE_AE350 1
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_AE250
|
#ifdef CONFIG_ARCH_AE350
|
||||||
# ifdef machine_arch_type
|
# ifdef machine_arch_type
|
||||||
# undef machine_arch_type
|
# undef machine_arch_type
|
||||||
# define machine_arch_type __machine_arch_type
|
# define machine_arch_type __machine_arch_type
|
||||||
# else
|
# else
|
||||||
# define machine_arch_type MACH_TYPE_AE250
|
# define machine_arch_type MACH_TYPE_AE350
|
||||||
# endif
|
# endif
|
||||||
# define machine_is_ae250() (machine_arch_type == MACH_TYPE_AE250)
|
# define machine_is_ae350() (machine_arch_type == MACH_TYPE_AE350)
|
||||||
#else
|
#else
|
||||||
# define machine_is_ae250() (1)
|
# define machine_is_ae350() (1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __ASM_RISCV_MACH_TYPE_H */
|
#endif /* __ASM_RISCV_MACH_TYPE_H */
|
||||||
|
25
arch/riscv/include/asm/setjmp.h
Normal file
25
arch/riscv/include/asm/setjmp.h
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2018 Alexander Graf <agraf@suse.de>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _SETJMP_H_
|
||||||
|
#define _SETJMP_H_ 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This really should be opaque, but the EFI implementation wrongly
|
||||||
|
* assumes that a 'struct jmp_buf_data' is defined.
|
||||||
|
*/
|
||||||
|
struct jmp_buf_data {
|
||||||
|
/* x2, x8, x9, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, sp */
|
||||||
|
unsigned long s_regs[12]; /* s0 - s11 */
|
||||||
|
unsigned long ra;
|
||||||
|
unsigned long sp;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct jmp_buf_data jmp_buf[1];
|
||||||
|
|
||||||
|
int setjmp(jmp_buf jmp);
|
||||||
|
void longjmp(jmp_buf jmp, int ret);
|
||||||
|
|
||||||
|
#endif /* _SETJMP_H_ */
|
@ -16,5 +16,6 @@ int cleanup_before_linux(void);
|
|||||||
|
|
||||||
/* board/.../... */
|
/* board/.../... */
|
||||||
int board_init(void);
|
int board_init(void);
|
||||||
|
void board_quiesce_devices(void);
|
||||||
|
|
||||||
#endif /* _U_BOOT_RISCV_H_ */
|
#endif /* _U_BOOT_RISCV_H_ */
|
||||||
|
@ -10,3 +10,15 @@ obj-$(CONFIG_CMD_BOOTM) += bootm.o
|
|||||||
obj-$(CONFIG_CMD_GO) += boot.o
|
obj-$(CONFIG_CMD_GO) += boot.o
|
||||||
obj-y += cache.o
|
obj-y += cache.o
|
||||||
obj-y += interrupts.o
|
obj-y += interrupts.o
|
||||||
|
obj-y += setjmp.o
|
||||||
|
|
||||||
|
# For building EFI apps
|
||||||
|
CFLAGS_$(EFI_CRT0) := $(CFLAGS_EFI)
|
||||||
|
CFLAGS_REMOVE_$(EFI_CRT0) := $(CFLAGS_NON_EFI)
|
||||||
|
|
||||||
|
CFLAGS_$(EFI_RELOC) := $(CFLAGS_EFI)
|
||||||
|
CFLAGS_REMOVE_$(EFI_RELOC) := $(CFLAGS_NON_EFI)
|
||||||
|
|
||||||
|
extra-$(CONFIG_CMD_BOOTEFI_HELLO_COMPILE) += $(EFI_CRT0) $(EFI_RELOC)
|
||||||
|
extra-$(CONFIG_CMD_BOOTEFI_SELFTEST) += $(EFI_CRT0) $(EFI_RELOC)
|
||||||
|
extra-$(CONFIG_EFI) += $(EFI_CRT0) $(EFI_RELOC)
|
||||||
|
@ -15,6 +15,10 @@
|
|||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
__weak void board_quiesce_devices(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
int arch_fixup_fdt(void *blob)
|
int arch_fixup_fdt(void *blob)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
|
151
arch/riscv/lib/crt0_riscv_efi.S
Normal file
151
arch/riscv/lib/crt0_riscv_efi.S
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||||
|
/*
|
||||||
|
* crt0-efi-riscv.S - PE/COFF header for RISC-V EFI applications
|
||||||
|
*
|
||||||
|
* Copright (C) 2014 Linaro Ltd. <ard.biesheuvel@linaro.org>
|
||||||
|
* Copright (C) 2018 Alexander Graf <agraf@suse.de>
|
||||||
|
*
|
||||||
|
* This file is inspired by arch/arm/lib/crt0_aarch64_efi.S
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <asm-generic/pe.h>
|
||||||
|
|
||||||
|
#if __riscv_xlen == 64
|
||||||
|
#define SIZE_LONG 8
|
||||||
|
#define SAVE_LONG(reg, idx) sd reg, (idx*SIZE_LONG)(sp)
|
||||||
|
#define LOAD_LONG(reg, idx) ld reg, (idx*SIZE_LONG)(sp)
|
||||||
|
#define PE_MACHINE 0x5064
|
||||||
|
#else
|
||||||
|
#define SIZE_LONG 4
|
||||||
|
#define SAVE_LONG(reg, idx) sw reg, (idx*SIZE_LONG)(sp)
|
||||||
|
#define LOAD_LONG(reg, idx) lw reg, (idx*SIZE_LONG)(sp)
|
||||||
|
#define PE_MACHINE 0x5032
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
.section .text.head
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Magic "MZ" signature for PE/COFF
|
||||||
|
*/
|
||||||
|
.globl ImageBase
|
||||||
|
ImageBase:
|
||||||
|
.ascii "MZ"
|
||||||
|
.skip 58 /* 'MZ' + pad + offset == 64 */
|
||||||
|
.long pe_header - ImageBase /* Offset to the PE header */
|
||||||
|
pe_header:
|
||||||
|
.ascii "PE"
|
||||||
|
.short 0
|
||||||
|
coff_header:
|
||||||
|
.short PE_MACHINE /* RISC-V 64/32-bit */
|
||||||
|
.short 2 /* nr_sections */
|
||||||
|
.long 0 /* TimeDateStamp */
|
||||||
|
.long 0 /* PointerToSymbolTable */
|
||||||
|
.long 1 /* NumberOfSymbols */
|
||||||
|
.short section_table - optional_header /* SizeOfOptionalHeader */
|
||||||
|
/*
|
||||||
|
* Characteristics: IMAGE_FILE_DEBUG_STRIPPED |
|
||||||
|
* IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_LINE_NUMS_STRIPPED
|
||||||
|
*/
|
||||||
|
.short 0x206
|
||||||
|
optional_header:
|
||||||
|
.short 0x20b /* PE32+ format */
|
||||||
|
.byte 0x02 /* MajorLinkerVersion */
|
||||||
|
.byte 0x14 /* MinorLinkerVersion */
|
||||||
|
.long _edata - _start /* SizeOfCode */
|
||||||
|
.long 0 /* SizeOfInitializedData */
|
||||||
|
.long 0 /* SizeOfUninitializedData */
|
||||||
|
.long _start - ImageBase /* AddressOfEntryPoint */
|
||||||
|
.long _start - ImageBase /* BaseOfCode */
|
||||||
|
|
||||||
|
extra_header_fields:
|
||||||
|
.quad 0 /* ImageBase */
|
||||||
|
.long 0x20 /* SectionAlignment */
|
||||||
|
.long 0x8 /* FileAlignment */
|
||||||
|
.short 0 /* MajorOperatingSystemVersion */
|
||||||
|
.short 0 /* MinorOperatingSystemVersion */
|
||||||
|
.short 0 /* MajorImageVersion */
|
||||||
|
.short 0 /* MinorImageVersion */
|
||||||
|
.short 0 /* MajorSubsystemVersion */
|
||||||
|
.short 0 /* MinorSubsystemVersion */
|
||||||
|
.long 0 /* Win32VersionValue */
|
||||||
|
|
||||||
|
.long _edata - ImageBase /* SizeOfImage */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Everything before the kernel image is considered part of the header
|
||||||
|
*/
|
||||||
|
.long _start - ImageBase /* SizeOfHeaders */
|
||||||
|
.long 0 /* CheckSum */
|
||||||
|
.short IMAGE_SUBSYSTEM_EFI_APPLICATION /* Subsystem */
|
||||||
|
.short 0 /* DllCharacteristics */
|
||||||
|
.quad 0 /* SizeOfStackReserve */
|
||||||
|
.quad 0 /* SizeOfStackCommit */
|
||||||
|
.quad 0 /* SizeOfHeapReserve */
|
||||||
|
.quad 0 /* SizeOfHeapCommit */
|
||||||
|
.long 0 /* LoaderFlags */
|
||||||
|
.long 0x6 /* NumberOfRvaAndSizes */
|
||||||
|
|
||||||
|
.quad 0 /* ExportTable */
|
||||||
|
.quad 0 /* ImportTable */
|
||||||
|
.quad 0 /* ResourceTable */
|
||||||
|
.quad 0 /* ExceptionTable */
|
||||||
|
.quad 0 /* CertificationTable */
|
||||||
|
.quad 0 /* BaseRelocationTable */
|
||||||
|
|
||||||
|
/* Section table */
|
||||||
|
section_table:
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The EFI application loader requires a relocation section
|
||||||
|
* because EFI applications must be relocatable. This is a
|
||||||
|
* dummy section as far as we are concerned.
|
||||||
|
*/
|
||||||
|
.ascii ".reloc"
|
||||||
|
.byte 0
|
||||||
|
.byte 0 /* end of 0 padding of section name */
|
||||||
|
.long 0
|
||||||
|
.long 0
|
||||||
|
.long 0 /* SizeOfRawData */
|
||||||
|
.long 0 /* PointerToRawData */
|
||||||
|
.long 0 /* PointerToRelocations */
|
||||||
|
.long 0 /* PointerToLineNumbers */
|
||||||
|
.short 0 /* NumberOfRelocations */
|
||||||
|
.short 0 /* NumberOfLineNumbers */
|
||||||
|
.long 0x42100040 /* Characteristics (section flags) */
|
||||||
|
|
||||||
|
|
||||||
|
.ascii ".text"
|
||||||
|
.byte 0
|
||||||
|
.byte 0
|
||||||
|
.byte 0 /* end of 0 padding of section name */
|
||||||
|
.long _edata - _start /* VirtualSize */
|
||||||
|
.long _start - ImageBase /* VirtualAddress */
|
||||||
|
.long _edata - _start /* SizeOfRawData */
|
||||||
|
.long _start - ImageBase /* PointerToRawData */
|
||||||
|
|
||||||
|
.long 0 /* PointerToRelocations (0 for executables) */
|
||||||
|
.long 0 /* PointerToLineNumbers (0 for executables) */
|
||||||
|
.short 0 /* NumberOfRelocations (0 for executables) */
|
||||||
|
.short 0 /* NumberOfLineNumbers (0 for executables) */
|
||||||
|
.long 0xe0500020 /* Characteristics (section flags) */
|
||||||
|
|
||||||
|
_start:
|
||||||
|
addi sp, sp, -(SIZE_LONG * 3)
|
||||||
|
SAVE_LONG(a0, 0)
|
||||||
|
SAVE_LONG(a1, 1)
|
||||||
|
SAVE_LONG(ra, 2)
|
||||||
|
|
||||||
|
lla a0, ImageBase
|
||||||
|
lla a1, _DYNAMIC
|
||||||
|
call _relocate
|
||||||
|
bne a0, zero, 0f
|
||||||
|
|
||||||
|
LOAD_LONG(a1, 1)
|
||||||
|
LOAD_LONG(a0, 0)
|
||||||
|
call efi_main
|
||||||
|
|
||||||
|
LOAD_LONG(ra, 2)
|
||||||
|
|
||||||
|
0: addi sp, sp, (SIZE_LONG * 3)
|
||||||
|
ret
|
71
arch/riscv/lib/elf_riscv32_efi.lds
Normal file
71
arch/riscv/lib/elf_riscv32_efi.lds
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||||
|
/*
|
||||||
|
* U-Boot riscv32 EFI linker script
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*
|
||||||
|
* Modified from arch/arm/lib/elf_aarch64_efi.lds
|
||||||
|
*/
|
||||||
|
|
||||||
|
OUTPUT_FORMAT("elf32-littleriscv", "elf32-littleriscv", "elf32-littleriscv")
|
||||||
|
OUTPUT_ARCH(riscv)
|
||||||
|
ENTRY(_start)
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.text 0x0 : {
|
||||||
|
_text = .;
|
||||||
|
*(.text.head)
|
||||||
|
*(.text)
|
||||||
|
*(.text.*)
|
||||||
|
*(.gnu.linkonce.t.*)
|
||||||
|
*(.srodata)
|
||||||
|
*(.rodata*)
|
||||||
|
. = ALIGN(16);
|
||||||
|
}
|
||||||
|
_etext = .;
|
||||||
|
_text_size = . - _text;
|
||||||
|
.dynamic : { *(.dynamic) }
|
||||||
|
.data : {
|
||||||
|
_data = .;
|
||||||
|
*(.sdata)
|
||||||
|
*(.data)
|
||||||
|
*(.data1)
|
||||||
|
*(.data.*)
|
||||||
|
*(.got.plt)
|
||||||
|
*(.got)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The EFI loader doesn't seem to like a .bss section, so we
|
||||||
|
* stick it all into .data:
|
||||||
|
*/
|
||||||
|
. = ALIGN(16);
|
||||||
|
_bss = .;
|
||||||
|
*(.sbss)
|
||||||
|
*(.scommon)
|
||||||
|
*(.dynbss)
|
||||||
|
*(.bss)
|
||||||
|
*(.bss.*)
|
||||||
|
*(COMMON)
|
||||||
|
. = ALIGN(16);
|
||||||
|
_bss_end = .;
|
||||||
|
_edata = .;
|
||||||
|
}
|
||||||
|
.rela.dyn : { *(.rela.dyn) }
|
||||||
|
.rela.plt : { *(.rela.plt) }
|
||||||
|
.rela.got : { *(.rela.got) }
|
||||||
|
.rela.data : { *(.rela.data) *(.rela.data*) }
|
||||||
|
_data_size = . - _etext;
|
||||||
|
|
||||||
|
. = ALIGN(4096);
|
||||||
|
.dynsym : { *(.dynsym) }
|
||||||
|
. = ALIGN(4096);
|
||||||
|
.dynstr : { *(.dynstr) }
|
||||||
|
. = ALIGN(4096);
|
||||||
|
.note.gnu.build-id : { *(.note.gnu.build-id) }
|
||||||
|
/DISCARD/ : {
|
||||||
|
*(.rel.reloc)
|
||||||
|
*(.eh_frame)
|
||||||
|
*(.note.GNU-stack)
|
||||||
|
}
|
||||||
|
.comment 0 : { *(.comment) }
|
||||||
|
}
|
71
arch/riscv/lib/elf_riscv64_efi.lds
Normal file
71
arch/riscv/lib/elf_riscv64_efi.lds
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||||
|
/*
|
||||||
|
* U-Boot riscv64 EFI linker script
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*
|
||||||
|
* Modified from arch/arm/lib/elf_aarch64_efi.lds
|
||||||
|
*/
|
||||||
|
|
||||||
|
OUTPUT_FORMAT("elf64-littleriscv", "elf64-littleriscv", "elf64-littleriscv")
|
||||||
|
OUTPUT_ARCH(riscv)
|
||||||
|
ENTRY(_start)
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.text 0x0 : {
|
||||||
|
_text = .;
|
||||||
|
*(.text.head)
|
||||||
|
*(.text)
|
||||||
|
*(.text.*)
|
||||||
|
*(.gnu.linkonce.t.*)
|
||||||
|
*(.srodata)
|
||||||
|
*(.rodata*)
|
||||||
|
. = ALIGN(16);
|
||||||
|
}
|
||||||
|
_etext = .;
|
||||||
|
_text_size = . - _text;
|
||||||
|
.dynamic : { *(.dynamic) }
|
||||||
|
.data : {
|
||||||
|
_data = .;
|
||||||
|
*(.sdata)
|
||||||
|
*(.data)
|
||||||
|
*(.data1)
|
||||||
|
*(.data.*)
|
||||||
|
*(.got.plt)
|
||||||
|
*(.got)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The EFI loader doesn't seem to like a .bss section, so we
|
||||||
|
* stick it all into .data:
|
||||||
|
*/
|
||||||
|
. = ALIGN(16);
|
||||||
|
_bss = .;
|
||||||
|
*(.sbss)
|
||||||
|
*(.scommon)
|
||||||
|
*(.dynbss)
|
||||||
|
*(.bss)
|
||||||
|
*(.bss.*)
|
||||||
|
*(COMMON)
|
||||||
|
. = ALIGN(16);
|
||||||
|
_bss_end = .;
|
||||||
|
_edata = .;
|
||||||
|
}
|
||||||
|
.rela.dyn : { *(.rela.dyn) }
|
||||||
|
.rela.plt : { *(.rela.plt) }
|
||||||
|
.rela.got : { *(.rela.got) }
|
||||||
|
.rela.data : { *(.rela.data) *(.rela.data*) }
|
||||||
|
_data_size = . - _etext;
|
||||||
|
|
||||||
|
. = ALIGN(4096);
|
||||||
|
.dynsym : { *(.dynsym) }
|
||||||
|
. = ALIGN(4096);
|
||||||
|
.dynstr : { *(.dynstr) }
|
||||||
|
. = ALIGN(4096);
|
||||||
|
.note.gnu.build-id : { *(.note.gnu.build-id) }
|
||||||
|
/DISCARD/ : {
|
||||||
|
*(.rel.reloc)
|
||||||
|
*(.eh_frame)
|
||||||
|
*(.note.GNU-stack)
|
||||||
|
}
|
||||||
|
.comment 0 : { *(.comment) }
|
||||||
|
}
|
98
arch/riscv/lib/reloc_riscv_efi.c
Normal file
98
arch/riscv/lib/reloc_riscv_efi.c
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
/* reloc_riscv.c - position independent ELF shared object relocator
|
||||||
|
Copyright (C) 2018 Alexander Graf <agraf@suse.de>
|
||||||
|
Copyright (C) 2014 Linaro Ltd. <ard.biesheuvel@linaro.org>
|
||||||
|
Copyright (C) 1999 Hewlett-Packard Co.
|
||||||
|
Contributed by David Mosberger <davidm@hpl.hp.com>.
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions
|
||||||
|
are met:
|
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
* Redistributions in binary form must reproduce the above
|
||||||
|
copyright notice, this list of conditions and the following
|
||||||
|
disclaimer in the documentation and/or other materials
|
||||||
|
provided with the distribution.
|
||||||
|
* Neither the name of Hewlett-Packard Co. nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived
|
||||||
|
from this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
|
||||||
|
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||||
|
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||||
|
BE LIABLE FOR ANYDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
||||||
|
OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||||
|
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
||||||
|
TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
||||||
|
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <efi.h>
|
||||||
|
|
||||||
|
#include <elf.h>
|
||||||
|
|
||||||
|
#if __riscv_xlen == 64
|
||||||
|
#define Elf_Dyn Elf64_Dyn
|
||||||
|
#define Elf_Rela Elf64_Rela
|
||||||
|
#define ELF_R_TYPE ELF64_R_TYPE
|
||||||
|
#else
|
||||||
|
#define Elf_Dyn Elf32_Dyn
|
||||||
|
#define Elf_Rela Elf32_Rela
|
||||||
|
#define ELF_R_TYPE ELF32_R_TYPE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
efi_status_t _relocate(long ldbase, Elf_Dyn *dyn, efi_handle_t image,
|
||||||
|
struct efi_system_table *systab)
|
||||||
|
{
|
||||||
|
long relsz = 0, relent = 0;
|
||||||
|
Elf_Rela *rel = 0;
|
||||||
|
unsigned long *addr;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; dyn[i].d_tag != DT_NULL; ++i) {
|
||||||
|
switch (dyn[i].d_tag) {
|
||||||
|
case DT_RELA:
|
||||||
|
rel = (Elf_Rela *)((ulong)dyn[i].d_un.d_ptr + ldbase);
|
||||||
|
break;
|
||||||
|
case DT_RELASZ:
|
||||||
|
relsz = dyn[i].d_un.d_val;
|
||||||
|
break;
|
||||||
|
case DT_RELAENT:
|
||||||
|
relent = dyn[i].d_un.d_val;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!rel && relent == 0)
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
|
||||||
|
if (!rel || relent == 0)
|
||||||
|
return EFI_LOAD_ERROR;
|
||||||
|
|
||||||
|
while (relsz > 0) {
|
||||||
|
/* apply the relocs */
|
||||||
|
switch (ELF_R_TYPE(rel->r_info)) {
|
||||||
|
case R_RISCV_RELATIVE:
|
||||||
|
addr = (ulong *)(ldbase + rel->r_offset);
|
||||||
|
*addr = ldbase + rel->r_addend;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* Panic */
|
||||||
|
while (1) ;
|
||||||
|
}
|
||||||
|
rel = (Elf_Rela *)((char *)rel + relent);
|
||||||
|
relsz -= relent;
|
||||||
|
}
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
65
arch/riscv/lib/setjmp.S
Normal file
65
arch/riscv/lib/setjmp.S
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||||
|
/*
|
||||||
|
* (C) 2018 Alexander Graf <agraf@suse.de>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPU_RISCV_64
|
||||||
|
#define STORE_IDX(reg, idx) sd reg, (idx*8)(a0)
|
||||||
|
#define LOAD_IDX(reg, idx) ld reg, (idx*8)(a0)
|
||||||
|
#else
|
||||||
|
#define STORE_IDX(reg, idx) sw reg, (idx*4)(a0)
|
||||||
|
#define LOAD_IDX(reg, idx) lw reg, (idx*4)(a0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
.pushsection .text.setjmp, "ax"
|
||||||
|
ENTRY(setjmp)
|
||||||
|
/* Preserve all callee-saved registers and the SP */
|
||||||
|
STORE_IDX(s0, 0)
|
||||||
|
STORE_IDX(s1, 1)
|
||||||
|
STORE_IDX(s2, 2)
|
||||||
|
STORE_IDX(s3, 3)
|
||||||
|
STORE_IDX(s4, 4)
|
||||||
|
STORE_IDX(s5, 5)
|
||||||
|
STORE_IDX(s6, 6)
|
||||||
|
STORE_IDX(s7, 7)
|
||||||
|
STORE_IDX(s8, 8)
|
||||||
|
STORE_IDX(s9, 9)
|
||||||
|
STORE_IDX(s10, 10)
|
||||||
|
STORE_IDX(s11, 11)
|
||||||
|
STORE_IDX(ra, 12)
|
||||||
|
STORE_IDX(sp, 13)
|
||||||
|
li a0, 0
|
||||||
|
ret
|
||||||
|
ENDPROC(setjmp)
|
||||||
|
.popsection
|
||||||
|
|
||||||
|
.pushsection .text.longjmp, "ax"
|
||||||
|
ENTRY(longjmp)
|
||||||
|
LOAD_IDX(s0, 0)
|
||||||
|
LOAD_IDX(s1, 1)
|
||||||
|
LOAD_IDX(s2, 2)
|
||||||
|
LOAD_IDX(s3, 3)
|
||||||
|
LOAD_IDX(s4, 4)
|
||||||
|
LOAD_IDX(s5, 5)
|
||||||
|
LOAD_IDX(s6, 6)
|
||||||
|
LOAD_IDX(s7, 7)
|
||||||
|
LOAD_IDX(s8, 8)
|
||||||
|
LOAD_IDX(s9, 9)
|
||||||
|
LOAD_IDX(s10, 10)
|
||||||
|
LOAD_IDX(s11, 11)
|
||||||
|
LOAD_IDX(ra, 12)
|
||||||
|
LOAD_IDX(sp, 13)
|
||||||
|
|
||||||
|
/* Move the return value in place, but return 1 if passed 0. */
|
||||||
|
beq a1, zero, longjmp_1
|
||||||
|
mv a0, a1
|
||||||
|
ret
|
||||||
|
|
||||||
|
longjmp_1:
|
||||||
|
li a0, 1
|
||||||
|
ret
|
||||||
|
ENDPROC(longjmp)
|
||||||
|
.popsection
|
@ -1,19 +1,19 @@
|
|||||||
if TARGET_NX25_AE250
|
if TARGET_AX25_AE350
|
||||||
|
|
||||||
config SYS_CPU
|
config SYS_CPU
|
||||||
default "nx25"
|
default "ax25"
|
||||||
|
|
||||||
config SYS_BOARD
|
config SYS_BOARD
|
||||||
default "nx25-ae250"
|
default "ax25-ae350"
|
||||||
|
|
||||||
config SYS_VENDOR
|
config SYS_VENDOR
|
||||||
default "AndesTech"
|
default "AndesTech"
|
||||||
|
|
||||||
config SYS_SOC
|
config SYS_SOC
|
||||||
default "ae250"
|
default "ae350"
|
||||||
|
|
||||||
config SYS_CONFIG_NAME
|
config SYS_CONFIG_NAME
|
||||||
default "nx25-ae250"
|
default "ax25-ae350"
|
||||||
|
|
||||||
config ENV_SIZE
|
config ENV_SIZE
|
||||||
default 0x2000 if ENV_IS_IN_SPI_FLASH
|
default 0x2000 if ENV_IS_IN_SPI_FLASH
|
6
board/AndesTech/ax25-ae350/MAINTAINERS
Normal file
6
board/AndesTech/ax25-ae350/MAINTAINERS
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
AX25-AE350 BOARD
|
||||||
|
M: Rick Chen <rick@andestech.com>
|
||||||
|
S: Maintained
|
||||||
|
F: board/AndesTech/ax25-ae350/
|
||||||
|
F: include/configs/ax25-ae350.h
|
||||||
|
F: configs/ax25-ae350_defconfig
|
@ -3,4 +3,4 @@
|
|||||||
# Copyright (C) 2017 Andes Technology Corporation.
|
# Copyright (C) 2017 Andes Technology Corporation.
|
||||||
# Rick Chen, Andes Technology Corporation <rick@andestech.com>
|
# Rick Chen, Andes Technology Corporation <rick@andestech.com>
|
||||||
|
|
||||||
obj-y := nx25-ae250.o
|
obj-y := ax25-ae350.o
|
@ -10,6 +10,8 @@
|
|||||||
#include <netdev.h>
|
#include <netdev.h>
|
||||||
#endif
|
#endif
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
#include <faraday/ftsmc020.h>
|
||||||
|
#include <fdtdec.h>
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
@ -19,7 +21,7 @@ DECLARE_GLOBAL_DATA_PTR;
|
|||||||
|
|
||||||
int board_init(void)
|
int board_init(void)
|
||||||
{
|
{
|
||||||
gd->bd->bi_arch_number = MACH_TYPE_AE250;
|
gd->bd->bi_arch_number = MACH_TYPE_AE350;
|
||||||
gd->bd->bi_boot_params = PHYS_SDRAM_0 + 0x400;
|
gd->bd->bi_boot_params = PHYS_SDRAM_0 + 0x400;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -72,3 +74,35 @@ void *board_fdt_blob_setup(void)
|
|||||||
|
|
||||||
return (void *)CONFIG_SYS_FDT_BASE;
|
return (void *)CONFIG_SYS_FDT_BASE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int smc_init(void)
|
||||||
|
{
|
||||||
|
int node = -1;
|
||||||
|
const char *compat = "andestech,atfsmc020";
|
||||||
|
void *blob = (void *)gd->fdt_blob;
|
||||||
|
fdt_addr_t addr;
|
||||||
|
struct ftsmc020_bank *regs;
|
||||||
|
|
||||||
|
node = fdt_node_offset_by_compatible(blob, -1, compat);
|
||||||
|
if (node < 0)
|
||||||
|
return -FDT_ERR_NOTFOUND;
|
||||||
|
|
||||||
|
addr = fdtdec_get_addr(blob, node, "reg");
|
||||||
|
|
||||||
|
if (addr == FDT_ADDR_T_NONE)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
regs = (struct ftsmc020_bank *)addr;
|
||||||
|
regs->cr &= ~FTSMC020_BANK_WPROT;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_BOARD_EARLY_INIT_F
|
||||||
|
int board_early_init_f(void)
|
||||||
|
{
|
||||||
|
smc_init();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
@ -1,6 +0,0 @@
|
|||||||
NX25-AE250 BOARD
|
|
||||||
M: Rick Chen <rick@andestech.com>
|
|
||||||
S: Maintained
|
|
||||||
F: board/AndesTech/nx25-ae250/
|
|
||||||
F: include/configs/nx25-ae250.h
|
|
||||||
F: configs/nx25-ae250_defconfig
|
|
@ -228,7 +228,7 @@ config CMD_BOOTEFI
|
|||||||
|
|
||||||
config CMD_BOOTEFI_HELLO_COMPILE
|
config CMD_BOOTEFI_HELLO_COMPILE
|
||||||
bool "Compile a standard EFI hello world binary for testing"
|
bool "Compile a standard EFI hello world binary for testing"
|
||||||
depends on CMD_BOOTEFI && (ARM || X86)
|
depends on CMD_BOOTEFI && (ARM || X86 || RISCV)
|
||||||
default y
|
default y
|
||||||
help
|
help
|
||||||
This compiles a standard EFI hello world application with U-Boot so
|
This compiles a standard EFI hello world application with U-Boot so
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
CONFIG_RISCV=y
|
CONFIG_RISCV=y
|
||||||
CONFIG_SYS_TEXT_BASE=0x00000000
|
CONFIG_SYS_TEXT_BASE=0x00000000
|
||||||
CONFIG_DEFAULT_DEVICE_TREE="ae250"
|
CONFIG_DEFAULT_DEVICE_TREE="ae350"
|
||||||
CONFIG_TARGET_NX25_AE250=y
|
CONFIG_TARGET_AX25_AE350=y
|
||||||
CONFIG_FIT=y
|
CONFIG_FIT=y
|
||||||
CONFIG_BOOTDELAY=3
|
CONFIG_BOOTDELAY=3
|
||||||
|
CONFIG_BOARD_EARLY_INIT_F=y
|
||||||
# CONFIG_AUTO_COMPLETE is not set
|
# CONFIG_AUTO_COMPLETE is not set
|
||||||
CONFIG_SYS_PROMPT="RISC-V # "
|
CONFIG_SYS_PROMPT="RISC-V # "
|
||||||
|
CONFIG_CMD_IMLS=y
|
||||||
CONFIG_CMD_MMC=y
|
CONFIG_CMD_MMC=y
|
||||||
CONFIG_CMD_SF=y
|
CONFIG_CMD_SF=y
|
||||||
CONFIG_CMD_SF_TEST=y
|
CONFIG_CMD_SF_TEST=y
|
||||||
@ -25,6 +27,9 @@ CONFIG_MMC=y
|
|||||||
CONFIG_DM_MMC=y
|
CONFIG_DM_MMC=y
|
||||||
CONFIG_FTSDC010=y
|
CONFIG_FTSDC010=y
|
||||||
CONFIG_FTSDC010_SDIO=y
|
CONFIG_FTSDC010_SDIO=y
|
||||||
|
CONFIG_MTD=y
|
||||||
|
CONFIG_MTD_NOR_FLASH=y
|
||||||
|
CONFIG_CFI_FLASH=y
|
||||||
CONFIG_DM_SPI_FLASH=y
|
CONFIG_DM_SPI_FLASH=y
|
||||||
CONFIG_SPI_FLASH=y
|
CONFIG_SPI_FLASH=y
|
||||||
CONFIG_SPI_FLASH_MACRONIX=y
|
CONFIG_SPI_FLASH_MACRONIX=y
|
||||||
@ -38,3 +43,5 @@ CONFIG_DM_SPI=y
|
|||||||
CONFIG_ATCSPI200_SPI=y
|
CONFIG_ATCSPI200_SPI=y
|
||||||
CONFIG_TIMER=y
|
CONFIG_TIMER=y
|
||||||
CONFIG_ATCPIT100_TIMER=y
|
CONFIG_ATCPIT100_TIMER=y
|
||||||
|
CONFIG_DISTRO_DEFAULTS=y
|
||||||
|
CONFIG_CPU_RISCV_64=y
|
@ -1,4 +1,4 @@
|
|||||||
NX25 is Andes CPU IP to adopt RISC-V architecture.
|
AX25 is Andes CPU IP to adopt RISC-V architecture.
|
||||||
|
|
||||||
Features
|
Features
|
||||||
========
|
========
|
@ -1,16 +1,16 @@
|
|||||||
Andes Technology SoC AE250
|
Andes Technology SoC AE350
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
AE250 is the mainline SoC produced by Andes Technology using NX25 CPU core
|
AE350 is the mainline SoC produced by Andes Technology using AX25 CPU core
|
||||||
base on RISC-V architecture.
|
base on RISC-V architecture.
|
||||||
|
|
||||||
AE250 has integrated both AHB and APB bus and many periphals for application
|
AE350 has integrated both AHB and APB bus and many periphals for application
|
||||||
and product development.
|
and product development.
|
||||||
|
|
||||||
NX25-AE250
|
AX25-AE350
|
||||||
=========
|
=========
|
||||||
|
|
||||||
NX25-AE250 is the SoC with AE250 hardcore CPU.
|
AX25-AE350 is the SoC with AE350 hardcore CPU.
|
||||||
|
|
||||||
Configurations
|
Configurations
|
||||||
==============
|
==============
|
||||||
@ -18,14 +18,14 @@ Configurations
|
|||||||
CONFIG_SKIP_LOWLEVEL_INIT:
|
CONFIG_SKIP_LOWLEVEL_INIT:
|
||||||
If you want to boot this system from SPI ROM and bypass e-bios (the
|
If you want to boot this system from SPI ROM and bypass e-bios (the
|
||||||
other boot loader on ROM). You should undefine CONFIG_SKIP_LOWLEVEL_INIT
|
other boot loader on ROM). You should undefine CONFIG_SKIP_LOWLEVEL_INIT
|
||||||
in "include/configs/nx25-ae250.h".
|
in "include/configs/ax25-ae350.h".
|
||||||
|
|
||||||
Build and boot steps
|
Build and boot steps
|
||||||
====================
|
====================
|
||||||
|
|
||||||
build:
|
build:
|
||||||
1. Prepare the toolchains and make sure the $PATH to toolchains is correct.
|
1. Prepare the toolchains and make sure the $PATH to toolchains is correct.
|
||||||
2. Use `make nx25-ae250_defconfig` in u-boot root to build the image.
|
2. Use `make ax25-ae350_defconfig` in u-boot root to build the image.
|
||||||
|
|
||||||
Verification
|
Verification
|
||||||
====================
|
====================
|
||||||
@ -49,7 +49,7 @@ Steps
|
|||||||
5. Burn this u-boot image to spi rom by spi driver
|
5. Burn this u-boot image to spi rom by spi driver
|
||||||
6. Re-boot u-boot from spi flash with power off and power on.
|
6. Re-boot u-boot from spi flash with power off and power on.
|
||||||
|
|
||||||
Messages of U-Boot boot on AE250 board
|
Messages of U-Boot boot on AE350 board
|
||||||
======================================
|
======================================
|
||||||
U-Boot 2018.01-rc2-00033-g824f89a (Dec 21 2017 - 16:51:26 +0800)
|
U-Boot 2018.01-rc2-00033-g824f89a (Dec 21 2017 - 16:51:26 +0800)
|
||||||
|
|
||||||
@ -77,9 +77,9 @@ host 10.0.4.97 is alive
|
|||||||
|
|
||||||
RISC-V # mmc rescan
|
RISC-V # mmc rescan
|
||||||
RISC-V # fatls mmc 0:1
|
RISC-V # fatls mmc 0:1
|
||||||
318907 u-boot-ae250-64.bin
|
318907 u-boot-ae350-64.bin
|
||||||
1252 hello_world_ae250_32.bin
|
1252 hello_world_ae350_32.bin
|
||||||
328787 u-boot-ae250-32.bin
|
328787 u-boot-ae350-32.bin
|
||||||
|
|
||||||
3 file(s), 0 dir(s)
|
3 file(s), 0 dir(s)
|
||||||
|
|
||||||
@ -98,8 +98,8 @@ Test passed
|
|||||||
2 write: 40 ticks, 100 KiB/s 0.800 Mbps
|
2 write: 40 ticks, 100 KiB/s 0.800 Mbps
|
||||||
3 read: 20 ticks, 200 KiB/s 1.600 Mbps
|
3 read: 20 ticks, 200 KiB/s 1.600 Mbps
|
||||||
|
|
||||||
RISC-V # fatload mmc 0:1 0x600000 u-boot-ae250-32.bin
|
RISC-V # fatload mmc 0:1 0x600000 u-boot-ae350-32.bin
|
||||||
reading u-boot-ae250-32.bin
|
reading u-boot-ae350-32.bin
|
||||||
328787 bytes read in 324 ms (990.2 KiB/s)
|
328787 bytes read in 324 ms (990.2 KiB/s)
|
||||||
|
|
||||||
RISC-V # sf erase 0x0 0x51000
|
RISC-V # sf erase 0x0 0x51000
|
||||||
@ -136,7 +136,7 @@ Boot bbl and riscv-linux via U-Boot on QEMU
|
|||||||
===========================================
|
===========================================
|
||||||
1. Build riscv-linux
|
1. Build riscv-linux
|
||||||
2. Build bbl and riscv-linux with --with-payload
|
2. Build bbl and riscv-linux with --with-payload
|
||||||
3. Prepare ae250.dtb
|
3. Prepare ae350.dtb
|
||||||
4. Creating OS-kernel images
|
4. Creating OS-kernel images
|
||||||
./mkimage -A riscv -O linux -T kernel -C none -a 0x0000 -e 0x0000 -d bbl.bin bootmImage-bbl.bin
|
./mkimage -A riscv -O linux -T kernel -C none -a 0x0000 -e 0x0000 -d bbl.bin bootmImage-bbl.bin
|
||||||
Image Name:
|
Image Name:
|
||||||
@ -146,7 +146,7 @@ Boot bbl and riscv-linux via U-Boot on QEMU
|
|||||||
Load Address: 00000000
|
Load Address: 00000000
|
||||||
Entry Point: 00000000
|
Entry Point: 00000000
|
||||||
|
|
||||||
4. Copy bootmImage-bbl.bin and ae250.dtb to qemu sd card image
|
4. Copy bootmImage-bbl.bin and ae350.dtb to qemu sd card image
|
||||||
5. Message of booting riscv-linux from bbl via u-boot on qemu
|
5. Message of booting riscv-linux from bbl via u-boot on qemu
|
||||||
|
|
||||||
U-Boot 2018.03-rc4-00031-g2631273 (Mar 13 2018 - 15:02:55 +0800)
|
U-Boot 2018.03-rc4-00031-g2631273 (Mar 13 2018 - 15:02:55 +0800)
|
||||||
@ -177,7 +177,7 @@ RISC-V # fatls mmc 0:0
|
|||||||
|
|
||||||
RISC-V # fatload mmc 0:0 0x00600000 bootmImage-bbl.bin
|
RISC-V # fatload mmc 0:0 0x00600000 bootmImage-bbl.bin
|
||||||
17901268 bytes read in 4642 ms (3.7 MiB/s)
|
17901268 bytes read in 4642 ms (3.7 MiB/s)
|
||||||
RISC-V # fatload mmc 0:0 0x2000000 ae250.dtb
|
RISC-V # fatload mmc 0:0 0x2000000 ae350.dtb
|
||||||
1954 bytes read in 1 ms (1.9 MiB/s)
|
1954 bytes read in 1 ms (1.9 MiB/s)
|
||||||
RISC-V # setenv bootm_size 0x2000000
|
RISC-V # setenv bootm_size 0x2000000
|
||||||
RISC-V # setenv fdt_high 0x1f00000
|
RISC-V # setenv fdt_high 0x1f00000
|
||||||
@ -272,4 +272,4 @@ Wed Dec 1 10:00:00 CST 2010
|
|||||||
|
|
||||||
TODO
|
TODO
|
||||||
==================================================
|
==================================================
|
||||||
Boot bbl and riscv-linux via U-Boot on AE250 board
|
Boot bbl and riscv-linux via U-Boot on AE350 board
|
@ -463,7 +463,7 @@ int ftsdc010_mmc_bind(struct udevice *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const struct udevice_id ftsdc010_mmc_ids[] = {
|
static const struct udevice_id ftsdc010_mmc_ids[] = {
|
||||||
{ .compatible = "andestech,atsdc010" },
|
{ .compatible = "andestech,atfsdc010" },
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -12,7 +12,6 @@ obj-$(CONFIG_MTD_CONCAT) += mtdconcat.o
|
|||||||
obj-$(CONFIG_ALTERA_QSPI) += altera_qspi.o
|
obj-$(CONFIG_ALTERA_QSPI) += altera_qspi.o
|
||||||
obj-$(CONFIG_FLASH_CFI_DRIVER) += cfi_flash.o
|
obj-$(CONFIG_FLASH_CFI_DRIVER) += cfi_flash.o
|
||||||
obj-$(CONFIG_FLASH_CFI_MTD) += cfi_mtd.o
|
obj-$(CONFIG_FLASH_CFI_MTD) += cfi_mtd.o
|
||||||
obj-$(CONFIG_FTSMC020) += ftsmc020.o
|
|
||||||
obj-$(CONFIG_FLASH_CFI_LEGACY) += jedec_flash.o
|
obj-$(CONFIG_FLASH_CFI_LEGACY) += jedec_flash.o
|
||||||
obj-$(CONFIG_MW_EEPROM) += mw_eeprom.o
|
obj-$(CONFIG_MW_EEPROM) += mw_eeprom.o
|
||||||
obj-$(CONFIG_FLASH_PIC32) += pic32_flash.o
|
obj-$(CONFIG_FLASH_PIC32) += pic32_flash.o
|
||||||
|
@ -1,37 +0,0 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0+
|
|
||||||
/*
|
|
||||||
* (C) Copyright 2009 Faraday Technology
|
|
||||||
* Po-Yu Chuang <ratbert@faraday-tech.com>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <config.h>
|
|
||||||
#include <common.h>
|
|
||||||
#include <asm/io.h>
|
|
||||||
#include <faraday/ftsmc020.h>
|
|
||||||
|
|
||||||
struct ftsmc020_config {
|
|
||||||
unsigned int config;
|
|
||||||
unsigned int timing;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void ftsmc020_setup_bank(unsigned int bank, struct ftsmc020_config *cfg)
|
|
||||||
{
|
|
||||||
struct ftsmc020 *smc = (struct ftsmc020 *)CONFIG_FTSMC020_BASE;
|
|
||||||
|
|
||||||
if (bank > 3) {
|
|
||||||
printf("bank # %u invalid\n", bank);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
writel(cfg->config, &smc->bank[bank].cr);
|
|
||||||
writel(cfg->timing, &smc->bank[bank].tpr);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ftsmc020_init(void)
|
|
||||||
{
|
|
||||||
struct ftsmc020_config config[] = CONFIG_SYS_FTSMC020_CONFIGS;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(config); i++)
|
|
||||||
ftsmc020_setup_bank(i, &config[i]);
|
|
||||||
}
|
|
@ -104,18 +104,18 @@ static int _ftmac100_init(struct ftmac100_data *priv, unsigned char enetaddr[6])
|
|||||||
|
|
||||||
for (i = 0; i < PKTBUFSRX; i++) {
|
for (i = 0; i < PKTBUFSRX; i++) {
|
||||||
/* RXBUF_BADR */
|
/* RXBUF_BADR */
|
||||||
rxdes[i].rxdes2 = (unsigned int)net_rx_packets[i];
|
rxdes[i].rxdes2 = (unsigned int)(unsigned long)net_rx_packets[i];
|
||||||
rxdes[i].rxdes1 |= FTMAC100_RXDES1_RXBUF_SIZE (PKTSIZE_ALIGN);
|
rxdes[i].rxdes1 |= FTMAC100_RXDES1_RXBUF_SIZE (PKTSIZE_ALIGN);
|
||||||
rxdes[i].rxdes0 = FTMAC100_RXDES0_RXDMA_OWN;
|
rxdes[i].rxdes0 = FTMAC100_RXDES0_RXDMA_OWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* transmit ring */
|
/* transmit ring */
|
||||||
|
|
||||||
writel ((unsigned int)txdes, &ftmac100->txr_badr);
|
writel ((unsigned long)txdes, &ftmac100->txr_badr);
|
||||||
|
|
||||||
/* receive ring */
|
/* receive ring */
|
||||||
|
|
||||||
writel ((unsigned int)rxdes, &ftmac100->rxr_badr);
|
writel ((unsigned long)rxdes, &ftmac100->rxr_badr);
|
||||||
|
|
||||||
/* poll receive descriptor automatically */
|
/* poll receive descriptor automatically */
|
||||||
|
|
||||||
@ -192,14 +192,14 @@ static int _ftmac100_send(struct ftmac100_data *priv, void *packet, int length)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
debug ("%s(%x, %x)\n", __func__, (int)packet, length);
|
debug ("%s(%lx, %x)\n", __func__, (unsigned long)packet, length);
|
||||||
|
|
||||||
length = (length < ETH_ZLEN) ? ETH_ZLEN : length;
|
length = (length < ETH_ZLEN) ? ETH_ZLEN : length;
|
||||||
|
|
||||||
/* initiate a transmit sequence */
|
/* initiate a transmit sequence */
|
||||||
|
|
||||||
flush_dcache_range((u32)packet,(u32)packet+length);
|
flush_dcache_range((unsigned long)packet,(unsigned long)packet+length);
|
||||||
curr_des->txdes2 = (unsigned int)packet; /* TXBUF_BADR */
|
curr_des->txdes2 = (unsigned int)(unsigned long)packet; /* TXBUF_BADR */
|
||||||
|
|
||||||
curr_des->txdes1 &= FTMAC100_TXDES1_EDOTR;
|
curr_des->txdes1 &= FTMAC100_TXDES1_EDOTR;
|
||||||
curr_des->txdes1 |= FTMAC100_TXDES1_FTS |
|
curr_des->txdes1 |= FTMAC100_TXDES1_FTS |
|
||||||
@ -343,7 +343,7 @@ static int ftmac100_recv(struct udevice *dev, int flags, uchar **packetp)
|
|||||||
int len;
|
int len;
|
||||||
len = __ftmac100_recv(priv);
|
len = __ftmac100_recv(priv);
|
||||||
if (len)
|
if (len)
|
||||||
*packetp = (void *)curr_des->rxdes2;
|
*packetp = (uchar *)(unsigned long)curr_des->rxdes2;
|
||||||
|
|
||||||
return len ? len : -EAGAIN;
|
return len ? len : -EAGAIN;
|
||||||
}
|
}
|
||||||
|
@ -197,7 +197,7 @@ static int __atcspi200_spi_xfer(struct nds_spi_slave *ns,
|
|||||||
int num_bytes;
|
int num_bytes;
|
||||||
u8 *cmd_buf = ns->cmd_buf;
|
u8 *cmd_buf = ns->cmd_buf;
|
||||||
size_t cmd_len = ns->cmd_len;
|
size_t cmd_len = ns->cmd_len;
|
||||||
size_t data_len = bitlen / 8;
|
unsigned long data_len = bitlen / 8;
|
||||||
int rf_cnt;
|
int rf_cnt;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
@ -229,13 +229,13 @@ static int __atcspi200_spi_xfer(struct nds_spi_slave *ns,
|
|||||||
__atcspi200_spi_start(ns);
|
__atcspi200_spi_start(ns);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
debug("spi_xfer: data_out %08X(%p) data_in %08X(%p) data_len %u\n",
|
debug("spi_xfer: data_out %08X(%p) data_in %08X(%p) data_len %lu\n",
|
||||||
*(uint *)data_out, data_out, *(uint *)data_in, data_in, data_len);
|
*(uint *)data_out, data_out, *(uint *)data_in, data_in, data_len);
|
||||||
num_chunks = DIV_ROUND_UP(data_len, max_tran_len);
|
num_chunks = DIV_ROUND_UP(data_len, max_tran_len);
|
||||||
din = data_in;
|
din = data_in;
|
||||||
dout = data_out;
|
dout = data_out;
|
||||||
while (num_chunks--) {
|
while (num_chunks--) {
|
||||||
tran_len = min(data_len, (size_t)max_tran_len);
|
tran_len = min((size_t)data_len, (size_t)max_tran_len);
|
||||||
ns->tran_len = tran_len;
|
ns->tran_len = tran_len;
|
||||||
num_blks = DIV_ROUND_UP(tran_len , CHUNK_SIZE);
|
num_blks = DIV_ROUND_UP(tran_len , CHUNK_SIZE);
|
||||||
num_bytes = (tran_len) % CHUNK_SIZE;
|
num_bytes = (tran_len) % CHUNK_SIZE;
|
||||||
|
@ -99,6 +99,10 @@
|
|||||||
#define BOOTEFI_NAME "bootia32.efi"
|
#define BOOTEFI_NAME "bootia32.efi"
|
||||||
#elif defined(CONFIG_X86_RUN_64BIT)
|
#elif defined(CONFIG_X86_RUN_64BIT)
|
||||||
#define BOOTEFI_NAME "bootx64.efi"
|
#define BOOTEFI_NAME "bootx64.efi"
|
||||||
|
#elif defined(CONFIG_CPU_RISCV_32)
|
||||||
|
#define BOOTEFI_NAME "bootriscv32.efi"
|
||||||
|
#elif defined(CONFIG_CPU_RISCV_64)
|
||||||
|
#define BOOTEFI_NAME "bootriscv64.efi"
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -240,6 +244,7 @@
|
|||||||
|
|
||||||
#if defined(CONFIG_CMD_DHCP)
|
#if defined(CONFIG_CMD_DHCP)
|
||||||
#if defined(CONFIG_EFI_LOADER)
|
#if defined(CONFIG_EFI_LOADER)
|
||||||
|
/* http://www.iana.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xml */
|
||||||
#if defined(CONFIG_ARM64)
|
#if defined(CONFIG_ARM64)
|
||||||
#define BOOTENV_EFI_PXE_ARCH "0xb"
|
#define BOOTENV_EFI_PXE_ARCH "0xb"
|
||||||
#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00011:UNDI:003000"
|
#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00011:UNDI:003000"
|
||||||
@ -250,6 +255,12 @@
|
|||||||
/* Always assume we're running 64bit */
|
/* Always assume we're running 64bit */
|
||||||
#define BOOTENV_EFI_PXE_ARCH "0x7"
|
#define BOOTENV_EFI_PXE_ARCH "0x7"
|
||||||
#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00007:UNDI:003000"
|
#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00007:UNDI:003000"
|
||||||
|
#elif defined(CONFIG_CPU_RISCV_32)
|
||||||
|
#define BOOTENV_EFI_PXE_ARCH "0x19"
|
||||||
|
#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00025:UNDI:003000"
|
||||||
|
#elif defined(CONFIG_CPU_RISCV_64)
|
||||||
|
#define BOOTENV_EFI_PXE_ARCH "0x1b"
|
||||||
|
#define BOOTENV_EFI_PXE_VCI "PXEClient:Arch:00027:UNDI:003000"
|
||||||
#else
|
#else
|
||||||
#error Please specify an EFI client identifier
|
#error Please specify an EFI client identifier
|
||||||
#endif
|
#endif
|
||||||
|
@ -79,6 +79,44 @@
|
|||||||
#define CONFIG_SYS_MEMTEST_START PHYS_SDRAM_0
|
#define CONFIG_SYS_MEMTEST_START PHYS_SDRAM_0
|
||||||
#define CONFIG_SYS_MEMTEST_END (PHYS_SDRAM_0 + PHYS_SDRAM_0_SIZE)
|
#define CONFIG_SYS_MEMTEST_END (PHYS_SDRAM_0 + PHYS_SDRAM_0_SIZE)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FLASH and environment organization
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* use CFI framework */
|
||||||
|
#define CONFIG_SYS_FLASH_CFI
|
||||||
|
#define CONFIG_FLASH_CFI_DRIVER
|
||||||
|
|
||||||
|
#define CONFIG_SYS_FLASH_CFI_WIDTH FLASH_CFI_16BIT
|
||||||
|
#define CONFIG_SYS_FLASH_USE_BUFFER_WRITE
|
||||||
|
#define CONFIG_SYS_CFI_FLASH_STATUS_POLL
|
||||||
|
|
||||||
|
/* support JEDEC */
|
||||||
|
#ifdef CONFIG_CFI_FLASH
|
||||||
|
#define CONFIG_SYS_MAX_FLASH_BANKS_DETECT 1
|
||||||
|
#endif/* Do not use CONFIG_FLASH_CFI_LEGACY to detect on board flash */
|
||||||
|
#define PHYS_FLASH_1 0x88000000 /* BANK 0 */
|
||||||
|
#define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
|
||||||
|
#define CONFIG_SYS_FLASH_BANKS_LIST { PHYS_FLASH_1, }
|
||||||
|
#define CONFIG_SYS_MONITOR_BASE PHYS_FLASH_1
|
||||||
|
|
||||||
|
#define CONFIG_SYS_FLASH_ERASE_TOUT 120000 /* TO for Flash Erase (ms) */
|
||||||
|
#define CONFIG_SYS_FLASH_WRITE_TOUT 500 /* TO for Flash Write (ms) */
|
||||||
|
|
||||||
|
/* max number of memory banks */
|
||||||
|
/*
|
||||||
|
* There are 4 banks supported for this Controller,
|
||||||
|
* but we have only 1 bank connected to flash on board
|
||||||
|
*/
|
||||||
|
#ifndef CONFIG_SYS_MAX_FLASH_BANKS_DETECT
|
||||||
|
#define CONFIG_SYS_MAX_FLASH_BANKS 1
|
||||||
|
#endif
|
||||||
|
#define CONFIG_SYS_FLASH_BANKS_SIZES {0x4000000}
|
||||||
|
|
||||||
|
/* max number of sectors on one chip */
|
||||||
|
#define CONFIG_FLASH_SECTOR_SIZE (0x10000*2)
|
||||||
|
#define CONFIG_SYS_MAX_FLASH_SECT 512
|
||||||
|
|
||||||
/* environments */
|
/* environments */
|
||||||
#define CONFIG_ENV_SPI_BUS 0
|
#define CONFIG_ENV_SPI_BUS 0
|
||||||
#define CONFIG_ENV_SPI_CS 0
|
#define CONFIG_ENV_SPI_CS 0
|
||||||
@ -104,4 +142,21 @@
|
|||||||
/* Increase max gunzip size */
|
/* Increase max gunzip size */
|
||||||
#define CONFIG_SYS_BOOTM_LEN (64 << 20)
|
#define CONFIG_SYS_BOOTM_LEN (64 << 20)
|
||||||
|
|
||||||
|
/* When we use RAM as ENV */
|
||||||
|
#define CONFIG_ENV_SIZE 0x2000
|
||||||
|
|
||||||
|
/* Enable distro boot */
|
||||||
|
#define BOOT_TARGET_DEVICES(func) \
|
||||||
|
func(MMC, mmc, 0) \
|
||||||
|
func(DHCP, dhcp, na)
|
||||||
|
#include <config_distro_bootcmd.h>
|
||||||
|
|
||||||
|
#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||||
|
"kernel_addr_r=0x00080000\0" \
|
||||||
|
"pxefile_addr_r=0x01f00000\0" \
|
||||||
|
"scriptaddr=0x01f00000\0" \
|
||||||
|
"fdt_addr_r=0x02000000\0" \
|
||||||
|
"ramdisk_addr_r=0x02800000\0" \
|
||||||
|
BOOTENV
|
||||||
|
|
||||||
#endif /* __CONFIG_H */
|
#endif /* __CONFIG_H */
|
@ -75,6 +75,13 @@ const char *__efi_nesting_dec(void);
|
|||||||
##__VA_ARGS__); \
|
##__VA_ARGS__); \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
#ifdef CONFIG_SYS_CACHELINE_SIZE
|
||||||
|
#define EFI_CACHELINE_SIZE CONFIG_SYS_CACHELINE_SIZE
|
||||||
|
#else
|
||||||
|
/* Just use the greatest cache flush alignment requirement I'm aware of */
|
||||||
|
#define EFI_CACHELINE_SIZE 128
|
||||||
|
#endif
|
||||||
|
|
||||||
extern struct efi_runtime_services efi_runtime_services;
|
extern struct efi_runtime_services efi_runtime_services;
|
||||||
extern struct efi_system_table systab;
|
extern struct efi_system_table systab;
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
config EFI_LOADER
|
config EFI_LOADER
|
||||||
bool "Support running EFI Applications in U-Boot"
|
bool "Support running EFI Applications in U-Boot"
|
||||||
depends on (ARM || X86) && OF_LIBFDT
|
depends on (ARM || X86 || RISCV) && OF_LIBFDT
|
||||||
# We do not support bootefi booting ARMv7 in non-secure mode
|
# We do not support bootefi booting ARMv7 in non-secure mode
|
||||||
depends on !ARMV7_NONSEC
|
depends on !ARMV7_NONSEC
|
||||||
# We need EFI_STUB_64BIT to be set on x86_64 with EFI_STUB
|
# We need EFI_STUB_64BIT to be set on x86_64 with EFI_STUB
|
||||||
|
@ -287,7 +287,7 @@ void *efi_load_pe(void *efi, struct efi_loaded_image *loaded_image_info)
|
|||||||
|
|
||||||
/* Flush cache */
|
/* Flush cache */
|
||||||
flush_cache((ulong)efi_reloc,
|
flush_cache((ulong)efi_reloc,
|
||||||
ALIGN(virt_size, CONFIG_SYS_CACHELINE_SIZE));
|
ALIGN(virt_size, EFI_CACHELINE_SIZE));
|
||||||
invalidate_icache_all();
|
invalidate_icache_all();
|
||||||
|
|
||||||
/* Populate the loaded image interface bits */
|
/* Populate the loaded image interface bits */
|
||||||
|
@ -29,13 +29,6 @@ static efi_status_t __efi_runtime EFIAPI efi_unimplemented(void);
|
|||||||
static efi_status_t __efi_runtime EFIAPI efi_device_error(void);
|
static efi_status_t __efi_runtime EFIAPI efi_device_error(void);
|
||||||
static efi_status_t __efi_runtime EFIAPI efi_invalid_parameter(void);
|
static efi_status_t __efi_runtime EFIAPI efi_invalid_parameter(void);
|
||||||
|
|
||||||
#ifdef CONFIG_SYS_CACHELINE_SIZE
|
|
||||||
#define EFI_CACHELINE_SIZE CONFIG_SYS_CACHELINE_SIZE
|
|
||||||
#else
|
|
||||||
/* Just use the greatest cache flush alignment requirement I'm aware of */
|
|
||||||
#define EFI_CACHELINE_SIZE 128
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_ARM64)
|
#if defined(CONFIG_ARM64)
|
||||||
#define R_RELATIVE 1027
|
#define R_RELATIVE 1027
|
||||||
#define R_MASK 0xffffffffULL
|
#define R_MASK 0xffffffffULL
|
||||||
@ -47,6 +40,25 @@ static efi_status_t __efi_runtime EFIAPI efi_invalid_parameter(void);
|
|||||||
#include <asm/elf.h>
|
#include <asm/elf.h>
|
||||||
#define R_RELATIVE R_386_RELATIVE
|
#define R_RELATIVE R_386_RELATIVE
|
||||||
#define R_MASK 0xffULL
|
#define R_MASK 0xffULL
|
||||||
|
#elif defined(CONFIG_RISCV)
|
||||||
|
#include <elf.h>
|
||||||
|
#define R_RELATIVE R_RISCV_RELATIVE
|
||||||
|
#define R_MASK 0xffULL
|
||||||
|
#define IS_RELA 1
|
||||||
|
|
||||||
|
struct dyn_sym {
|
||||||
|
ulong foo1;
|
||||||
|
ulong addr;
|
||||||
|
u32 foo2;
|
||||||
|
u32 foo3;
|
||||||
|
};
|
||||||
|
#ifdef CONFIG_CPU_RISCV_32
|
||||||
|
#define R_ABSOLUTE R_RISCV_32
|
||||||
|
#define SYM_INDEX 8
|
||||||
|
#else
|
||||||
|
#define R_ABSOLUTE R_RISCV_64
|
||||||
|
#define SYM_INDEX 32
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
#error Need to add relocation awareness
|
#error Need to add relocation awareness
|
||||||
#endif
|
#endif
|
||||||
@ -253,15 +265,27 @@ void efi_runtime_relocate(ulong offset, struct efi_mem_desc *map)
|
|||||||
|
|
||||||
p = (void*)((ulong)rel->offset - base) + gd->relocaddr;
|
p = (void*)((ulong)rel->offset - base) + gd->relocaddr;
|
||||||
|
|
||||||
if ((rel->info & R_MASK) != R_RELATIVE) {
|
debug("%s: rel->info=%#lx *p=%#lx rel->offset=%p\n", __func__, rel->info, *p, rel->offset);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
switch (rel->info & R_MASK) {
|
||||||
|
case R_RELATIVE:
|
||||||
#ifdef IS_RELA
|
#ifdef IS_RELA
|
||||||
newaddr = rel->addend + offset - CONFIG_SYS_TEXT_BASE;
|
newaddr = rel->addend + offset - CONFIG_SYS_TEXT_BASE;
|
||||||
#else
|
#else
|
||||||
newaddr = *p - lastoff + offset;
|
newaddr = *p - lastoff + offset;
|
||||||
#endif
|
#endif
|
||||||
|
break;
|
||||||
|
#ifdef R_ABSOLUTE
|
||||||
|
case R_ABSOLUTE: {
|
||||||
|
ulong symidx = rel->info >> SYM_INDEX;
|
||||||
|
extern struct dyn_sym __dyn_sym_start[];
|
||||||
|
newaddr = __dyn_sym_start[symidx].addr + offset;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if the relocation is inside bounds */
|
/* Check if the relocation is inside bounds */
|
||||||
if (map && ((newaddr < map->virtual_start) ||
|
if (map && ((newaddr < map->virtual_start) ||
|
||||||
|
Loading…
Reference in New Issue
Block a user