aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPali Rohár <pali@kernel.org>2022-08-11 22:27:22 +0200
committerTom Rini <trini@konsulko.com>2022-08-20 16:17:50 -0400
commitc5be5f6f54893bce9b5f3e8e4b35e38c923fc069 (patch)
tree8a6a1e1f6a1a967f8e27ac8bd26b48a5a2e2ccc2
parent7c4ad9821758f98db127e9d6864671c906c02d3b (diff)
Nokia RX-51: Use U-Boot generic position independent code
Switch from custom board specific fixup/copy code to U-Boot generic position independent code provided by config option POSITION_INDEPENDENT. This also slightly decrease size of u-boot.bin binary (by 52 bytes). Note that option POSITION_INDEPENDENT increase size but not more than custom board fixup/copy code which is being deleted (as it is not needed anymore). Signed-off-by: Pali Rohár <pali@kernel.org>
-rw-r--r--arch/arm/mach-omap2/omap3/Kconfig1
-rw-r--r--board/nokia/rx51/lowlevel_init.S127
-rw-r--r--configs/nokia_rx51_defconfig1
3 files changed, 16 insertions, 113 deletions
diff --git a/arch/arm/mach-omap2/omap3/Kconfig b/arch/arm/mach-omap2/omap3/Kconfig
index 81c898b66e34..18574ab2b2ea 100644
--- a/arch/arm/mach-omap2/omap3/Kconfig
+++ b/arch/arm/mach-omap2/omap3/Kconfig
@@ -107,6 +107,7 @@ config TARGET_OMAP3_LOGIC
config TARGET_NOKIA_RX51
bool "Nokia RX51"
+ select POSITION_INDEPENDENT
config TARGET_TAO3530
bool "TAO3530"
diff --git a/board/nokia/rx51/lowlevel_init.S b/board/nokia/rx51/lowlevel_init.S
index 632595f83785..dd3c830cc2e2 100644
--- a/board/nokia/rx51/lowlevel_init.S
+++ b/board/nokia/rx51/lowlevel_init.S
@@ -33,16 +33,24 @@ z_magic: /* LINUX_ARM_ZIMAGE_MAGIC */
/*
* Routine: save_boot_params (called after reset from start.S)
* Description: Copy attached kernel to address KERNEL_ADDRESS
- * Copy u-boot to address CONFIG_SYS_TEXT_BASE
- * Return to copied u-boot address
*/
.global save_boot_params
save_boot_params:
- /* Get return address */
- ldr lr, =save_boot_params_ret
-/* Copy valid attached kernel to address KERNEL_ADDRESS */
+/*
+ * Copy valid attached kernel to absolute address KERNEL_ADDRESS
+ *
+ * Nokia X-Loader is loading secondary image to address 0x80400000.
+ * NOLO is loading boot image to random place, so it doesn't really
+ * matter what is set in CONFIG_SYS_TEXT_BASE. We have to detect
+ * KERNEL_OFFSET from the current execution address and copy it to
+ * absolute address KERNEL_ADDRESS.
+ *
+ * Note that U-Boot has to be compiled with CONFIG_POSITION_INDEPENDENT
+ * because it is loaded at random address and not to the fixed address
+ * (CONFIG_SYS_TEXT_BASE).
+ */
copy_kernel_start:
adr r0, relocaddr /* r0 - address of section relocaddr */
@@ -100,110 +108,5 @@ copy_kernel_end:
str r5, [r0] /* remove 4 bytes header of kernel uImage */
str r5, [r0, #36] /* remove 4 bytes header of kernel zImage */
-
-/* Fix u-boot code */
-
-fix_start:
- adr r0, relocaddr /* r0 - address of section relocaddr */
- ldr r1, relocaddr /* r1 - address of relocaddr after relocation */
- cmp r0, r1
-
- beq copy_uboot_end /* skip if u-boot is on correct address */
-
- /* r5 - calculated offset */
- subhi r5, r0, r1
- sublo r5, r1, r0
-
- /* r6 - maximal u-boot size */
- ldr r6, imagesize
-
- /* r1 - start of u-boot after */
- ldr r1, startaddr
-
- /* r0 - start of u-boot before */
- addhi r0, r1, r5
- sublo r0, r1, r5
-
- /* check if we need to move uboot copy code before calling it */
- cmp r5, r6
- bhi copy_uboot_start /* now coping u-boot code directly is safe */
-
-
-copy_code_start:
- /* r0 - start of u-boot before */
- /* r1 - start of u-boot after */
- /* r6 - maximal u-boot size */
-
- /* r7 - maximal kernel size */
- ldr r7, kernsize
-
- /* r4 - end of kernel before */
- add r4, r0, r6
- add r4, r4, r7
-
- /* r5 - end of u-boot after */
- ldr r5, startaddr
- add r5, r5, r6
-
- /* r2 - start of loop code after */
- cmp r4, r5 /* higher address (r4 or r5) */
- movhs r2, r4
- movlo r2, r5
-
- /* r3 - end of loop code before */
- adr r3, end
-
- /* r4 - end of loop code after */
- adr r4, copy_uboot_start
- sub r4, r3, r4
- add r4, r2, r4
-
-copy_code_loop:
- ldmdb r3!, {r7 - r10}
- stmdb r4!, {r7 - r10}
- cmp r4, r2
- bhi copy_code_loop
-
-copy_code_end:
- mov pc, r2
-
-
-/*
- * Copy u-boot to address CONFIG_SYS_TEXT_BASE
- *
- * Nokia X-Loader loading secondary image to address 0x80400000
- * NOLO loading boot image to random place, so it doesn't really
- * matter what is set in CONFIG_SYS_TEXT_BASE. We have to copy
- * u-boot to CONFIG_SYS_TEXT_BASE address.
- */
-
-copy_uboot_start:
- /* r0 - start of u-boot before */
- /* r1 - start of u-boot after */
- /* r6 - maximal u-boot size */
-
- /* r2 - end of u-boot after */
- add r2, r1, r6
-
- /* condition for copying from left to right */
- cmp r0, r1
- addlo r1, r0, r6 /* r1 - end of u-boot before */
- blo copy_uboot_loop_right
-
-copy_uboot_loop_left:
- ldmia r0!, {r3 - r10}
- stmia r1!, {r3 - r10}
- cmp r1, r2
- blo copy_uboot_loop_left
- b copy_uboot_end
-
-copy_uboot_loop_right:
- ldmdb r1!, {r3 - r10}
- stmdb r2!, {r3 - r10}
- cmp r1, r0
- bhi copy_uboot_loop_right
-
-copy_uboot_end:
- bx lr
-
-end:
+ /* Returns */
+ b save_boot_params_ret
diff --git a/configs/nokia_rx51_defconfig b/configs/nokia_rx51_defconfig
index 3b559abf2350..1306c1fc26ce 100644
--- a/configs/nokia_rx51_defconfig
+++ b/configs/nokia_rx51_defconfig
@@ -9,7 +9,6 @@ CONFIG_INITRD_TAG=y
CONFIG_REVISION_TAG=y
CONFIG_STATIC_MACH_TYPE=y
CONFIG_MACH_TYPE=1955
-CONFIG_SYS_TEXT_BASE=0x80008000
CONFIG_SYS_MALLOC_LEN=0xc0000
CONFIG_NR_DRAM_BANKS=2
CONFIG_TARGET_NOKIA_RX51=y