From: Oleksij Rempel <linux@xxxxxxxxxxxxxxxx> At least some ath79 SoC have build in 32K RAM. It allow us to use lowlevel portion of barebox to bootstrap the system by using JTAG debugger (For example OpenOCD). Since ath79 has no reliable way to stop the CPU execution before reading SPI Flash, this can cause different issues. To avoid it, we need to flash a execution trap with software debug breakpoint to the flash. The workflow should be as follow: - After power on or reset the CPU will start execution of SPI flash. As soon as software debug breakpoint is executed, CPU will halt and notify OpenOCD about breakpoint event. - OpenOCD will load reduced barebox to SRAM and execute it. This part will do all needed low level initialization - PLL, RAM and trigger second breakpoint event. - OpenOCD will load full barebox version to the main RAM and start execution. It can be used for bring-up, so no regular flashing is needed. Signed-off-by: Oleksij Rempel <linux@xxxxxxxxxxxxxxxx> --- arch/mips/include/asm/asm.h | 20 ++++++++++++++++++ arch/mips/lib/Makefile | 1 + arch/mips/lib/end.S | 16 ++++++++++++++ arch/mips/mach-ath79/Makefile | 3 +++ .../mips/mach-ath79/include/mach/pbl_macros.h | 21 +++++++++++++++++++ .../mach-ath79/lowlevel_ar9331_spi_trap.S | 18 ++++++++++++++++ arch/mips/mach-ath79/lowlevel_ar9331_sram.S | 18 ++++++++++++++++ images/Makefile.ath79 | 8 +++++++ 8 files changed, 105 insertions(+) create mode 100644 arch/mips/lib/end.S create mode 100644 arch/mips/mach-ath79/lowlevel_ar9331_spi_trap.S create mode 100644 arch/mips/mach-ath79/lowlevel_ar9331_sram.S diff --git a/arch/mips/include/asm/asm.h b/arch/mips/include/asm/asm.h index 7a23f4ed82..7d2b673bd9 100644 --- a/arch/mips/include/asm/asm.h +++ b/arch/mips/include/asm/asm.h @@ -105,6 +105,26 @@ __error: \ b __error; \ nop; +/* + * STOP_WITH_DEBUG_EVENT - Stop code execution by triggering + * Software Debug Breakpoint. It is needed stop CPU and + * notify debugger (for example OpenOCD) about break point event. + * It should allow to simplify bootstrapping a system over JTAG. + */ +#define STOP_WITH_DEBUG_EVENT \ + /* trigger a soft breakpoint for OpenOCD */ \ + SDBBP; \ + /* position independent variant of dead loop */ \ + __error: \ + b __error; \ + nop; \ + /* Call some code from .text section. \ + * It is needed to keep same linker script for \ + * all images. */ \ + la v0, mips_dead_end; \ + jal v0; \ + nop; + /* * FEXPORT - export definition of a function symbol */ diff --git a/arch/mips/lib/Makefile b/arch/mips/lib/Makefile index 1a049c7914..7372e8dc27 100644 --- a/arch/mips/lib/Makefile +++ b/arch/mips/lib/Makefile @@ -1,6 +1,7 @@ extra-$(CONFIG_GENERIC_LINKER_SCRIPT) += barebox.lds obj-$(CONFIG_CSRC_R4K_LIB) += csrc-r4k.o obj-y += cpu-probe.o +lwl-y += end.o obj-y += traps.o obj-y += genex.o obj-y += shutdown.o diff --git a/arch/mips/lib/end.S b/arch/mips/lib/end.S new file mode 100644 index 0000000000..78bd15ec17 --- /dev/null +++ b/arch/mips/lib/end.S @@ -0,0 +1,16 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2018 Oleksij Rempel <linux@xxxxxxxxxxxxxxxx> + */ + +#include <asm/asm.h> +#include <asm/regdef.h> + + .text + .set noreorder +LEAF(mips_dead_end) +__error: + b __error; + nop; + + END(mips_dead_end) diff --git a/arch/mips/mach-ath79/Makefile b/arch/mips/mach-ath79/Makefile index b827b363cf..396df66bf1 100644 --- a/arch/mips/mach-ath79/Makefile +++ b/arch/mips/mach-ath79/Makefile @@ -1,3 +1,6 @@ +lwl-y += lowlevel_ar9331_spi_trap.o +lwl-y += lowlevel_ar9331_sram.o + obj-y += reset.o obj-y += bbu.o obj-y += art.o diff --git a/arch/mips/mach-ath79/include/mach/pbl_macros.h b/arch/mips/mach-ath79/include/mach/pbl_macros.h index 70736b3680..c5f3d4150e 100644 --- a/arch/mips/mach-ath79/include/mach/pbl_macros.h +++ b/arch/mips/mach-ath79/include/mach/pbl_macros.h @@ -400,4 +400,25 @@ skip_pll_ram_config: .set pop .endm + .macro ar9331_pbl_generic_sram_start + .set push + .set noreorder + + mips_barebox_10h + + hornet_mips24k_cp0_setup + + hornet_1_1_war + + pbl_ar9331_pll + pbl_ar9331_ram_generic_config + + pbl_ar9331_uart_enable + debug_ll_ath79_init + + pbl_ar9331_mdio_gpio_enable + + .set pop + .endm + #endif /* __ASM_MACH_ATH79_PBL_MACROS_H */ diff --git a/arch/mips/mach-ath79/lowlevel_ar9331_spi_trap.S b/arch/mips/mach-ath79/lowlevel_ar9331_spi_trap.S new file mode 100644 index 0000000000..82452c74ca --- /dev/null +++ b/arch/mips/mach-ath79/lowlevel_ar9331_spi_trap.S @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2018 Oleksij Rempel <linux@xxxxxxxxxxxxxxxx> + */ + +#define BOARD_PBL_START start_ar9331_spi_trap + +#include <mach/debug_ll.h> +#include <asm/asm.h> +#include <asm/pbl_macros.h> +#include <mach/pbl_macros.h> +#include <asm/pbl_nmon.h> + +ENTRY_FUNCTION(BOARD_PBL_START) + + /* nothing should be done here */ + +STOP_WITH_DEBUG_EVENT diff --git a/arch/mips/mach-ath79/lowlevel_ar9331_sram.S b/arch/mips/mach-ath79/lowlevel_ar9331_sram.S new file mode 100644 index 0000000000..1ef40be905 --- /dev/null +++ b/arch/mips/mach-ath79/lowlevel_ar9331_sram.S @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2018 Oleksij Rempel <linux@xxxxxxxxxxxxxxxx> + */ + +#define BOARD_PBL_START start_ar9331_sram + +#include <mach/debug_ll.h> +#include <asm/asm.h> +#include <asm/pbl_macros.h> +#include <mach/pbl_macros.h> +#include <asm/pbl_nmon.h> + +ENTRY_FUNCTION(BOARD_PBL_START) + + ar9331_pbl_generic_sram_start + +STOP_WITH_DEBUG_EVENT diff --git a/images/Makefile.ath79 b/images/Makefile.ath79 index c7e97f0ac3..5dda411d8f 100644 --- a/images/Makefile.ath79 +++ b/images/Makefile.ath79 @@ -1,3 +1,11 @@ +pblb-$(CONFIG_SOC_QCA_AR9331) += start_ar9331_spi_trap +FILE_barebox-ar9331-spi-trap.img = start_ar9331_spi_trap.pblb +image-$(CONFIG_SOC_QCA_AR9331) += barebox-ar9331-spi-trap.img + +pblb-$(CONFIG_SOC_QCA_AR9331) += start_ar9331_sram +FILE_barebox-ar9331-sram.img = start_ar9331_sram.pblb +image-$(CONFIG_SOC_QCA_AR9331) += barebox-ar9331-sram.img + pblb-$(CONFIG_BOARD_8DEVICES_LIMA) += start_8devices_lima FILE_barebox-8devices-lima.img = start_8devices_lima.pblb image-$(CONFIG_BOARD_8DEVICES_LIMA) += barebox-8devices-lima.img -- 2.20.1 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox