18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *  linux/arch/sh/boot/romimage/head.S
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Board specific setup code, executed before zImage loader
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci.text
98c2ecf20Sopenharmony_ci	#include <asm/page.h>
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci	.global	romstart
128c2ecf20Sopenharmony_ciromstart:
138c2ecf20Sopenharmony_ci	/* include board specific setup code */
148c2ecf20Sopenharmony_ci#include <mach/romimage.h>
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#ifdef CONFIG_ROMIMAGE_MMCIF
178c2ecf20Sopenharmony_ci	/* load the romImage to above the empty zero page */
188c2ecf20Sopenharmony_ci	mov.l	empty_zero_page_dst, r4
198c2ecf20Sopenharmony_ci	mov.l	empty_zero_page_dst_adj, r5
208c2ecf20Sopenharmony_ci	add	r5, r4
218c2ecf20Sopenharmony_ci	mov.l	bytes_to_load, r5
228c2ecf20Sopenharmony_ci	mov.l	loader_function, r7
238c2ecf20Sopenharmony_ci	jsr	@r7
248c2ecf20Sopenharmony_ci	 mov	r4, r15
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci	mov.l	empty_zero_page_dst, r4
278c2ecf20Sopenharmony_ci	mov.l	empty_zero_page_dst_adj, r5
288c2ecf20Sopenharmony_ci	add	r5, r4
298c2ecf20Sopenharmony_ci	mov.l	loaded_code_offs, r5
308c2ecf20Sopenharmony_ci	add	r5, r4
318c2ecf20Sopenharmony_ci	jmp	@r4
328c2ecf20Sopenharmony_ci	 nop
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci	.balign 4
358c2ecf20Sopenharmony_ciempty_zero_page_dst_adj:
368c2ecf20Sopenharmony_ci	.long	PAGE_SIZE
378c2ecf20Sopenharmony_cibytes_to_load:
388c2ecf20Sopenharmony_ci	.long	end_data - romstart
398c2ecf20Sopenharmony_ciloader_function:
408c2ecf20Sopenharmony_ci	.long	mmcif_loader
418c2ecf20Sopenharmony_ciloaded_code_offs:
428c2ecf20Sopenharmony_ci	.long	loaded_code - romstart
438c2ecf20Sopenharmony_ciloaded_code:
448c2ecf20Sopenharmony_ci#endif /* CONFIG_ROMIMAGE_MMCIF */
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci	/* copy the empty_zero_page contents to where vmlinux expects it */
478c2ecf20Sopenharmony_ci	mova	extra_data_pos, r0
488c2ecf20Sopenharmony_ci	mov.l	extra_data_size, r1
498c2ecf20Sopenharmony_ci	add	r1, r0
508c2ecf20Sopenharmony_ci	mov.l	empty_zero_page_dst, r1
518c2ecf20Sopenharmony_ci	mov	#(PAGE_SHIFT - 4), r4
528c2ecf20Sopenharmony_ci	mov	#1, r3
538c2ecf20Sopenharmony_ci	shld	r4, r3 /* r3 = PAGE_SIZE / 16 */
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci1:
568c2ecf20Sopenharmony_ci	mov.l	@r0, r4
578c2ecf20Sopenharmony_ci	mov.l	@(4, r0), r5
588c2ecf20Sopenharmony_ci	mov.l	@(8, r0), r6
598c2ecf20Sopenharmony_ci	mov.l	@(12, r0), r7
608c2ecf20Sopenharmony_ci	add	#16,r0
618c2ecf20Sopenharmony_ci	mov.l	r4, @r1
628c2ecf20Sopenharmony_ci	mov.l	r5, @(4, r1)
638c2ecf20Sopenharmony_ci	mov.l	r6, @(8, r1)
648c2ecf20Sopenharmony_ci	mov.l	r7, @(12, r1)
658c2ecf20Sopenharmony_ci	dt	r3
668c2ecf20Sopenharmony_ci	add	#16,r1
678c2ecf20Sopenharmony_ci	bf	1b
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_ci	/* jump to the zImage entry point located after the zero page data */
708c2ecf20Sopenharmony_ci	mov	#PAGE_SHIFT, r4
718c2ecf20Sopenharmony_ci	mov	#1, r1
728c2ecf20Sopenharmony_ci	shld	r4, r1
738c2ecf20Sopenharmony_ci	mova	extra_data_pos, r0
748c2ecf20Sopenharmony_ci	add	r1, r0
758c2ecf20Sopenharmony_ci	mov.l	extra_data_size, r1
768c2ecf20Sopenharmony_ci	add	r1, r0
778c2ecf20Sopenharmony_ci	jmp	@r0
788c2ecf20Sopenharmony_ci	 nop
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci	.align 2
818c2ecf20Sopenharmony_ciempty_zero_page_dst:
828c2ecf20Sopenharmony_ci	.long	_text
838c2ecf20Sopenharmony_ciextra_data_pos:
848c2ecf20Sopenharmony_ciextra_data_size:
858c2ecf20Sopenharmony_ci	.long	zero_page_pos - extra_data_pos
86