18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * Startup glue code to uncompress the kernel
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci *   (C) 2017 Helge Deller <deller@gmx.de>
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#include <linux/init.h>
88c2ecf20Sopenharmony_ci#include <linux/linkage.h>
98c2ecf20Sopenharmony_ci#include <asm/asm-offsets.h>
108c2ecf20Sopenharmony_ci#include <asm/page.h>
118c2ecf20Sopenharmony_ci#include <asm/psw.h>
128c2ecf20Sopenharmony_ci#include <asm/pdc.h>
138c2ecf20Sopenharmony_ci#include <asm/assembly.h>
148c2ecf20Sopenharmony_ci#include "sizes.h"
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#define BOOTADDR(x)	(x)
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#ifndef CONFIG_64BIT
198c2ecf20Sopenharmony_ci	.import	$global$		/* forward declaration */
208c2ecf20Sopenharmony_ci#endif /*!CONFIG_64BIT*/
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci	__HEAD
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ciENTRY(startup)
258c2ecf20Sopenharmony_ci	 .level PA_ASM_LEVEL
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci#define PSW_W_SM	0x200
288c2ecf20Sopenharmony_ci#define PSW_W_BIT       36
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci	;! nuke the W bit, saving original value
318c2ecf20Sopenharmony_ci	.level 2.0
328c2ecf20Sopenharmony_ci	rsm	PSW_W_SM, %r1
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci	.level 1.1
358c2ecf20Sopenharmony_ci	extrw,u	%r1, PSW_W_BIT-32, 1, %r1
368c2ecf20Sopenharmony_ci	copy	%r1, %arg0
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci	/* Make sure sr4-sr7 are set to zero for the kernel address space */
398c2ecf20Sopenharmony_ci	mtsp    %r0,%sr4
408c2ecf20Sopenharmony_ci	mtsp    %r0,%sr5
418c2ecf20Sopenharmony_ci	mtsp    %r0,%sr6
428c2ecf20Sopenharmony_ci	mtsp    %r0,%sr7
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	/* Clear BSS */
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci	.import _bss,data
478c2ecf20Sopenharmony_ci	.import _ebss,data
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	load32	BOOTADDR(_bss),%r3
508c2ecf20Sopenharmony_ci	load32	BOOTADDR(_ebss),%r4
518c2ecf20Sopenharmony_ci	ldo	FRAME_SIZE(%r4),%sp	/* stack at end of bss */
528c2ecf20Sopenharmony_ci$bss_loop:
538c2ecf20Sopenharmony_ci	cmpb,<<,n %r3,%r4,$bss_loop
548c2ecf20Sopenharmony_ci	stw,ma	%r0,4(%r3)
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	/* Initialize the global data pointer */
578c2ecf20Sopenharmony_ci	loadgp
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_ci	/* arg0..arg4 were set by palo. */
608c2ecf20Sopenharmony_ci	copy	%arg1, %r6		/* command line */
618c2ecf20Sopenharmony_ci	copy	%arg2, %r7		/* rd-start */
628c2ecf20Sopenharmony_ci	copy	%arg3, %r8		/* rd-end */
638c2ecf20Sopenharmony_ci	load32	BOOTADDR(decompress_kernel),%r3
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci#ifdef CONFIG_64BIT
668c2ecf20Sopenharmony_ci	.level PA_ASM_LEVEL
678c2ecf20Sopenharmony_ci	ssm	PSW_W_SM, %r0		/* set W-bit */
688c2ecf20Sopenharmony_ci	depdi	0, 31, 32, %r3
698c2ecf20Sopenharmony_ci#endif
708c2ecf20Sopenharmony_ci	load32	BOOTADDR(startup_continue), %r2
718c2ecf20Sopenharmony_ci	bv,n	0(%r3)
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_cistartup_continue:
748c2ecf20Sopenharmony_ci#ifdef CONFIG_64BIT
758c2ecf20Sopenharmony_ci	.level PA_ASM_LEVEL
768c2ecf20Sopenharmony_ci	rsm	PSW_W_SM, %r0		/* clear W-bit */
778c2ecf20Sopenharmony_ci#endif
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci	load32	KERNEL_BINARY_TEXT_START, %arg0 /* free mem */
808c2ecf20Sopenharmony_ci	copy	%r6, %arg1		/* command line */
818c2ecf20Sopenharmony_ci	copy	%r7, %arg2		/* rd-start */
828c2ecf20Sopenharmony_ci	copy	%r8, %arg3		/* rd-end */
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci	bv,n	0(%ret0)
858c2ecf20Sopenharmony_ciEND(startup)
86