162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  linux/arch/sh/boot/romimage/head.S
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Board specific setup code, executed before zImage loader
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci.text
962306a36Sopenharmony_ci	#include <asm/page.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci	.global	romstart
1262306a36Sopenharmony_ciromstart:
1362306a36Sopenharmony_ci	/* include board specific setup code */
1462306a36Sopenharmony_ci#include <mach/romimage.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#ifdef CONFIG_ROMIMAGE_MMCIF
1762306a36Sopenharmony_ci	/* load the romImage to above the empty zero page */
1862306a36Sopenharmony_ci	mov.l	empty_zero_page_dst, r4
1962306a36Sopenharmony_ci	mov.l	empty_zero_page_dst_adj, r5
2062306a36Sopenharmony_ci	add	r5, r4
2162306a36Sopenharmony_ci	mov.l	bytes_to_load, r5
2262306a36Sopenharmony_ci	mov.l	loader_function, r7
2362306a36Sopenharmony_ci	jsr	@r7
2462306a36Sopenharmony_ci	 mov	r4, r15
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	mov.l	empty_zero_page_dst, r4
2762306a36Sopenharmony_ci	mov.l	empty_zero_page_dst_adj, r5
2862306a36Sopenharmony_ci	add	r5, r4
2962306a36Sopenharmony_ci	mov.l	loaded_code_offs, r5
3062306a36Sopenharmony_ci	add	r5, r4
3162306a36Sopenharmony_ci	jmp	@r4
3262306a36Sopenharmony_ci	 nop
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	.balign 4
3562306a36Sopenharmony_ciempty_zero_page_dst_adj:
3662306a36Sopenharmony_ci	.long	PAGE_SIZE
3762306a36Sopenharmony_cibytes_to_load:
3862306a36Sopenharmony_ci	.long	end_data - romstart
3962306a36Sopenharmony_ciloader_function:
4062306a36Sopenharmony_ci	.long	mmcif_loader
4162306a36Sopenharmony_ciloaded_code_offs:
4262306a36Sopenharmony_ci	.long	loaded_code - romstart
4362306a36Sopenharmony_ciloaded_code:
4462306a36Sopenharmony_ci#endif /* CONFIG_ROMIMAGE_MMCIF */
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	/* copy the empty_zero_page contents to where vmlinux expects it */
4762306a36Sopenharmony_ci	mova	extra_data_pos, r0
4862306a36Sopenharmony_ci	mov.l	extra_data_size, r1
4962306a36Sopenharmony_ci	add	r1, r0
5062306a36Sopenharmony_ci	mov.l	empty_zero_page_dst, r1
5162306a36Sopenharmony_ci	mov	#(PAGE_SHIFT - 4), r4
5262306a36Sopenharmony_ci	mov	#1, r3
5362306a36Sopenharmony_ci	shld	r4, r3 /* r3 = PAGE_SIZE / 16 */
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci1:
5662306a36Sopenharmony_ci	mov.l	@r0, r4
5762306a36Sopenharmony_ci	mov.l	@(4, r0), r5
5862306a36Sopenharmony_ci	mov.l	@(8, r0), r6
5962306a36Sopenharmony_ci	mov.l	@(12, r0), r7
6062306a36Sopenharmony_ci	add	#16,r0
6162306a36Sopenharmony_ci	mov.l	r4, @r1
6262306a36Sopenharmony_ci	mov.l	r5, @(4, r1)
6362306a36Sopenharmony_ci	mov.l	r6, @(8, r1)
6462306a36Sopenharmony_ci	mov.l	r7, @(12, r1)
6562306a36Sopenharmony_ci	dt	r3
6662306a36Sopenharmony_ci	add	#16,r1
6762306a36Sopenharmony_ci	bf	1b
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	/* jump to the zImage entry point located after the zero page data */
7062306a36Sopenharmony_ci	mov	#PAGE_SHIFT, r4
7162306a36Sopenharmony_ci	mov	#1, r1
7262306a36Sopenharmony_ci	shld	r4, r1
7362306a36Sopenharmony_ci	mova	extra_data_pos, r0
7462306a36Sopenharmony_ci	add	r1, r0
7562306a36Sopenharmony_ci	mov.l	extra_data_size, r1
7662306a36Sopenharmony_ci	add	r1, r0
7762306a36Sopenharmony_ci	jmp	@r0
7862306a36Sopenharmony_ci	 nop
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci	.align 2
8162306a36Sopenharmony_ciempty_zero_page_dst:
8262306a36Sopenharmony_ci	.long	_text
8362306a36Sopenharmony_ciextra_data_pos:
8462306a36Sopenharmony_ciextra_data_size:
8562306a36Sopenharmony_ci	.long	zero_page_pos - extra_data_pos
86