xref: /openbmc/linux/arch/parisc/boot/compressed/head.S (revision c39f2d9db0fd81ea20bb5cce9b3f082ca63753e2)
12f3c7b81SHelge Deller/*
22f3c7b81SHelge Deller * Startup glue code to uncompress the kernel
32f3c7b81SHelge Deller *
42f3c7b81SHelge Deller *   (C) 2017 Helge Deller <deller@gmx.de>
52f3c7b81SHelge Deller */
62f3c7b81SHelge Deller
72f3c7b81SHelge Deller#include <linux/init.h>
82f3c7b81SHelge Deller#include <linux/linkage.h>
92f3c7b81SHelge Deller#include <asm/asm-offsets.h>
102f3c7b81SHelge Deller#include <asm/page.h>
112f3c7b81SHelge Deller#include <asm/psw.h>
122f3c7b81SHelge Deller#include <asm/pdc.h>
132f3c7b81SHelge Deller#include <asm/assembly.h>
142f3c7b81SHelge Deller#include "sizes.h"
152f3c7b81SHelge Deller
162f3c7b81SHelge Deller#define BOOTADDR(x)	(x)
172f3c7b81SHelge Deller
182f3c7b81SHelge Deller#ifndef CONFIG_64BIT
192f3c7b81SHelge Deller	.import	$global$		/* forward declaration */
202f3c7b81SHelge Deller#endif /*!CONFIG_64BIT*/
212f3c7b81SHelge Deller
222f3c7b81SHelge Deller	__HEAD
232f3c7b81SHelge Deller
242f3c7b81SHelge DellerENTRY(startup)
25*bdca5d64SHelge Deller	 .level PA_ASM_LEVEL
262f3c7b81SHelge Deller
272f3c7b81SHelge Deller#define PSW_W_SM	0x200
282f3c7b81SHelge Deller#define PSW_W_BIT       36
292f3c7b81SHelge Deller
302f3c7b81SHelge Deller	;! nuke the W bit, saving original value
312f3c7b81SHelge Deller	.level 2.0
322f3c7b81SHelge Deller	rsm	PSW_W_SM, %r1
332f3c7b81SHelge Deller
342f3c7b81SHelge Deller	.level 1.1
352f3c7b81SHelge Deller	extrw,u	%r1, PSW_W_BIT-32, 1, %r1
362f3c7b81SHelge Deller	copy	%r1, %arg0
372f3c7b81SHelge Deller
382f3c7b81SHelge Deller	/* Make sure sr4-sr7 are set to zero for the kernel address space */
392f3c7b81SHelge Deller	mtsp    %r0,%sr4
402f3c7b81SHelge Deller	mtsp    %r0,%sr5
412f3c7b81SHelge Deller	mtsp    %r0,%sr6
422f3c7b81SHelge Deller	mtsp    %r0,%sr7
432f3c7b81SHelge Deller
442f3c7b81SHelge Deller	/* Clear BSS */
452f3c7b81SHelge Deller
462f3c7b81SHelge Deller	.import _bss,data
472f3c7b81SHelge Deller	.import _ebss,data
482f3c7b81SHelge Deller
492f3c7b81SHelge Deller	load32	BOOTADDR(_bss),%r3
502f3c7b81SHelge Deller	load32	BOOTADDR(_ebss),%r4
512f3c7b81SHelge Deller	ldo	FRAME_SIZE(%r4),%sp	/* stack at end of bss */
522f3c7b81SHelge Deller$bss_loop:
532f3c7b81SHelge Deller	cmpb,<<,n %r3,%r4,$bss_loop
542f3c7b81SHelge Deller	stw,ma	%r0,4(%r3)
552f3c7b81SHelge Deller
562f3c7b81SHelge Deller	/* Initialize the global data pointer */
572f3c7b81SHelge Deller	loadgp
582f3c7b81SHelge Deller
592f3c7b81SHelge Deller	/* arg0..arg4 were set by palo. */
602f3c7b81SHelge Deller	copy	%arg1, %r6		/* command line */
612f3c7b81SHelge Deller	copy	%arg2, %r7		/* rd-start */
622f3c7b81SHelge Deller	copy	%arg3, %r8		/* rd-end */
632f3c7b81SHelge Deller	load32	BOOTADDR(decompress_kernel),%r3
642f3c7b81SHelge Deller
652f3c7b81SHelge Deller#ifdef CONFIG_64BIT
66*bdca5d64SHelge Deller	.level PA_ASM_LEVEL
672f3c7b81SHelge Deller	ssm	PSW_W_SM, %r0		/* set W-bit */
682f3c7b81SHelge Deller	depdi	0, 31, 32, %r3
692f3c7b81SHelge Deller#endif
702f3c7b81SHelge Deller	load32	BOOTADDR(startup_continue), %r2
712f3c7b81SHelge Deller	bv,n	0(%r3)
722f3c7b81SHelge Deller
732f3c7b81SHelge Dellerstartup_continue:
742f3c7b81SHelge Deller#ifdef CONFIG_64BIT
75*bdca5d64SHelge Deller	.level PA_ASM_LEVEL
762f3c7b81SHelge Deller	rsm	PSW_W_SM, %r0		/* clear W-bit */
772f3c7b81SHelge Deller#endif
782f3c7b81SHelge Deller
792f3c7b81SHelge Deller	load32	KERNEL_BINARY_TEXT_START, %arg0 /* free mem */
802f3c7b81SHelge Deller	copy	%r6, %arg1		/* command line */
812f3c7b81SHelge Deller	copy	%r7, %arg2		/* rd-start */
822f3c7b81SHelge Deller	copy	%r8, %arg3		/* rd-end */
832f3c7b81SHelge Deller
842f3c7b81SHelge Deller	bv,n	0(%ret0)
852f3c7b81SHelge DellerEND(startup)
86