arm: Allow lr to be saved by board code
The link register value can be required on some boards (e.g. FEL mode on sunxi) so use a branch instruction to jump to save_boot_params() instead of a branch link. This requires a branch back to save_boot_params_ret so adjust the users to deal with this. For exynos just drop the function since it doesn't do anything. Signed-off-by: Simon Glass <sjg@chromium.org> Acked-by: Siarhei Siamashka <siarhei.siamashka@gmail.com> Acked-by: Hans de Goede <hdegoede@redhat.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
		
							parent
							
								
									c924e2a803
								
							
						
					
					
						commit
						e11c6c279d
					
				|  | @ -309,4 +309,3 @@ void board_init_r(gd_t *id, ulong dest_addr) | ||||||
| 	while (1) | 	while (1) | ||||||
| 		; | 		; | ||||||
| } | } | ||||||
| void save_boot_params(u32 r0, u32 r1, u32 r2, u32 r3) {} |  | ||||||
|  |  | ||||||
|  | @ -19,7 +19,7 @@ | ||||||
| ENTRY(save_boot_params) | ENTRY(save_boot_params) | ||||||
| 	ldr	r1, =OMAP_SRAM_SCRATCH_BOOT_PARAMS | 	ldr	r1, =OMAP_SRAM_SCRATCH_BOOT_PARAMS | ||||||
| 	str	r0, [r1] | 	str	r0, [r1] | ||||||
| 	bx	lr | 	b	save_boot_params_ret | ||||||
| ENDPROC(save_boot_params) | ENDPROC(save_boot_params) | ||||||
| 
 | 
 | ||||||
| ENTRY(set_pl310_ctrl_reg) | ENTRY(set_pl310_ctrl_reg) | ||||||
|  |  | ||||||
|  | @ -23,7 +23,7 @@ ENTRY(save_boot_params) | ||||||
| 	ldr	r5, [r0, #0x4] | 	ldr	r5, [r0, #0x4] | ||||||
| 	and	r5, r5, #0xff | 	and	r5, r5, #0xff | ||||||
| 	str	r5, [r4] | 	str	r5, [r4] | ||||||
| 	bx	lr | 	b	save_boot_params_ret | ||||||
| ENDPROC(save_boot_params) | ENDPROC(save_boot_params) | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -31,9 +31,12 @@ | ||||||
|  *************************************************************************/ |  *************************************************************************/ | ||||||
| 
 | 
 | ||||||
| 	.globl	reset
 | 	.globl	reset
 | ||||||
|  | 	.globl	save_boot_params_ret
 | ||||||
| 
 | 
 | ||||||
| reset: | reset: | ||||||
| 	bl	save_boot_params | 	/* Allow the board to save important registers */ | ||||||
|  | 	b	save_boot_params | ||||||
|  | save_boot_params_ret: | ||||||
| 	/* | 	/* | ||||||
| 	 * disable interrupts (FIQ and IRQ), also set the cpu to SVC32 mode, | 	 * disable interrupts (FIQ and IRQ), also set the cpu to SVC32 mode, | ||||||
| 	 * except if in HYP mode already | 	 * except if in HYP mode already | ||||||
|  | @ -96,7 +99,7 @@ ENDPROC(c_runtime_cpu_setup) | ||||||
|  * |  * | ||||||
|  *************************************************************************/ |  *************************************************************************/ | ||||||
| ENTRY(save_boot_params) | ENTRY(save_boot_params) | ||||||
| 	bx	lr			@ back to my caller
 | 	b	save_boot_params_ret		@ back to my caller
 | ||||||
| ENDPROC(save_boot_params) | ENDPROC(save_boot_params) | ||||||
| 	.weak	save_boot_params
 | 	.weak	save_boot_params
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -142,6 +142,21 @@ void flush_l3_cache(void); | ||||||
| 
 | 
 | ||||||
| #ifndef __ASSEMBLY__ | #ifndef __ASSEMBLY__ | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * save_boot_params() - Save boot parameters before starting reset sequence | ||||||
|  |  * | ||||||
|  |  * If you provide this function it will be called immediately U-Boot starts, | ||||||
|  |  * both for SPL and U-Boot proper. | ||||||
|  |  * | ||||||
|  |  * All registers are unchanged from U-Boot entry. No registers need be | ||||||
|  |  * preserved. | ||||||
|  |  * | ||||||
|  |  * This is not a normal C function. There is no stack. Return by branching to | ||||||
|  |  * save_boot_params_ret. | ||||||
|  |  * | ||||||
|  |  * void save_boot_params(u32 r0, u32 r1, u32 r2, u32 r3); | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
| #define isb() __asm__ __volatile__ ("" : : : "memory") | #define isb() __asm__ __volatile__ ("" : : : "memory") | ||||||
| 
 | 
 | ||||||
| #define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t"); | #define nop() __asm__ __volatile__("mov\tr0,r0\t@ nop\n\t"); | ||||||
|  |  | ||||||
|  | @ -37,7 +37,8 @@ ih_magic:		/* IH_MAGIC in big endian from include/image.h */ | ||||||
| 
 | 
 | ||||||
| .global save_boot_params
 | .global save_boot_params
 | ||||||
| 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 address KERNEL_ADDRESS */ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue