xref: /OK3568_Linux_fs/kernel/arch/sh/boot/romimage/head.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun/*
3*4882a593Smuzhiyun *  linux/arch/sh/boot/romimage/head.S
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Board specific setup code, executed before zImage loader
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun.text
9*4882a593Smuzhiyun	#include <asm/page.h>
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun	.global	romstart
12*4882a593Smuzhiyunromstart:
13*4882a593Smuzhiyun	/* include board specific setup code */
14*4882a593Smuzhiyun#include <mach/romimage.h>
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun#ifdef CONFIG_ROMIMAGE_MMCIF
17*4882a593Smuzhiyun	/* load the romImage to above the empty zero page */
18*4882a593Smuzhiyun	mov.l	empty_zero_page_dst, r4
19*4882a593Smuzhiyun	mov.l	empty_zero_page_dst_adj, r5
20*4882a593Smuzhiyun	add	r5, r4
21*4882a593Smuzhiyun	mov.l	bytes_to_load, r5
22*4882a593Smuzhiyun	mov.l	loader_function, r7
23*4882a593Smuzhiyun	jsr	@r7
24*4882a593Smuzhiyun	 mov	r4, r15
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun	mov.l	empty_zero_page_dst, r4
27*4882a593Smuzhiyun	mov.l	empty_zero_page_dst_adj, r5
28*4882a593Smuzhiyun	add	r5, r4
29*4882a593Smuzhiyun	mov.l	loaded_code_offs, r5
30*4882a593Smuzhiyun	add	r5, r4
31*4882a593Smuzhiyun	jmp	@r4
32*4882a593Smuzhiyun	 nop
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun	.balign 4
35*4882a593Smuzhiyunempty_zero_page_dst_adj:
36*4882a593Smuzhiyun	.long	PAGE_SIZE
37*4882a593Smuzhiyunbytes_to_load:
38*4882a593Smuzhiyun	.long	end_data - romstart
39*4882a593Smuzhiyunloader_function:
40*4882a593Smuzhiyun	.long	mmcif_loader
41*4882a593Smuzhiyunloaded_code_offs:
42*4882a593Smuzhiyun	.long	loaded_code - romstart
43*4882a593Smuzhiyunloaded_code:
44*4882a593Smuzhiyun#endif /* CONFIG_ROMIMAGE_MMCIF */
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun	/* copy the empty_zero_page contents to where vmlinux expects it */
47*4882a593Smuzhiyun	mova	extra_data_pos, r0
48*4882a593Smuzhiyun	mov.l	extra_data_size, r1
49*4882a593Smuzhiyun	add	r1, r0
50*4882a593Smuzhiyun	mov.l	empty_zero_page_dst, r1
51*4882a593Smuzhiyun	mov	#(PAGE_SHIFT - 4), r4
52*4882a593Smuzhiyun	mov	#1, r3
53*4882a593Smuzhiyun	shld	r4, r3 /* r3 = PAGE_SIZE / 16 */
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun1:
56*4882a593Smuzhiyun	mov.l	@r0, r4
57*4882a593Smuzhiyun	mov.l	@(4, r0), r5
58*4882a593Smuzhiyun	mov.l	@(8, r0), r6
59*4882a593Smuzhiyun	mov.l	@(12, r0), r7
60*4882a593Smuzhiyun	add	#16,r0
61*4882a593Smuzhiyun	mov.l	r4, @r1
62*4882a593Smuzhiyun	mov.l	r5, @(4, r1)
63*4882a593Smuzhiyun	mov.l	r6, @(8, r1)
64*4882a593Smuzhiyun	mov.l	r7, @(12, r1)
65*4882a593Smuzhiyun	dt	r3
66*4882a593Smuzhiyun	add	#16,r1
67*4882a593Smuzhiyun	bf	1b
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun	/* jump to the zImage entry point located after the zero page data */
70*4882a593Smuzhiyun	mov	#PAGE_SHIFT, r4
71*4882a593Smuzhiyun	mov	#1, r1
72*4882a593Smuzhiyun	shld	r4, r1
73*4882a593Smuzhiyun	mova	extra_data_pos, r0
74*4882a593Smuzhiyun	add	r1, r0
75*4882a593Smuzhiyun	mov.l	extra_data_size, r1
76*4882a593Smuzhiyun	add	r1, r0
77*4882a593Smuzhiyun	jmp	@r0
78*4882a593Smuzhiyun	 nop
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun	.align 2
81*4882a593Smuzhiyunempty_zero_page_dst:
82*4882a593Smuzhiyun	.long	_text
83*4882a593Smuzhiyunextra_data_pos:
84*4882a593Smuzhiyunextra_data_size:
85*4882a593Smuzhiyun	.long	zero_page_pos - extra_data_pos
86