162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2016 IBM Corporation.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include "ppc_asm.h"
762306a36Sopenharmony_ci#include "../include/asm/opal-api.h"
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci	.text
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci	.globl opal_kentry
1262306a36Sopenharmony_ciopal_kentry:
1362306a36Sopenharmony_ci	/* r3 is the fdt ptr */
1462306a36Sopenharmony_ci	mtctr r4
1562306a36Sopenharmony_ci	li	r4, 0
1662306a36Sopenharmony_ci	li	r5, 0
1762306a36Sopenharmony_ci	li	r6, 0
1862306a36Sopenharmony_ci	li	r7, 0
1962306a36Sopenharmony_ci	LOAD_REG_ADDR(r11, opal)
2062306a36Sopenharmony_ci	ld	r8,0(r11)
2162306a36Sopenharmony_ci	ld	r9,8(r11)
2262306a36Sopenharmony_ci	bctr
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define OPAL_CALL(name, token)				\
2562306a36Sopenharmony_ci	.globl name;					\
2662306a36Sopenharmony_ciname:							\
2762306a36Sopenharmony_ci	li	r0, token;				\
2862306a36Sopenharmony_ci	b	opal_call;
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ciopal_call:
3162306a36Sopenharmony_ci	mflr	r11
3262306a36Sopenharmony_ci	std	r11,16(r1)
3362306a36Sopenharmony_ci	mfcr	r12
3462306a36Sopenharmony_ci	stw	r12,8(r1)
3562306a36Sopenharmony_ci	mr	r13,r2
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	/* Set opal return address */
3862306a36Sopenharmony_ci	LOAD_REG_ADDR(r11, opal_return)
3962306a36Sopenharmony_ci	mtlr	r11
4062306a36Sopenharmony_ci	mfmsr	r12
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	/* switch to BE when we enter OPAL */
4362306a36Sopenharmony_ci	li	r11,MSR_LE
4462306a36Sopenharmony_ci	andc	r12,r12,r11
4562306a36Sopenharmony_ci	mtspr	SPRN_HSRR1,r12
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	/* load the opal call entry point and base */
4862306a36Sopenharmony_ci	LOAD_REG_ADDR(r11, opal)
4962306a36Sopenharmony_ci	ld	r12,8(r11)
5062306a36Sopenharmony_ci	ld	r2,0(r11)
5162306a36Sopenharmony_ci	mtspr	SPRN_HSRR0,r12
5262306a36Sopenharmony_ci	hrfid
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ciopal_return:
5562306a36Sopenharmony_ci	FIXUP_ENDIAN
5662306a36Sopenharmony_ci	mr	r2,r13;
5762306a36Sopenharmony_ci	lwz	r11,8(r1);
5862306a36Sopenharmony_ci	ld	r12,16(r1)
5962306a36Sopenharmony_ci	mtcr	r11;
6062306a36Sopenharmony_ci	mtlr	r12
6162306a36Sopenharmony_ci	blr
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciOPAL_CALL(opal_console_write,			OPAL_CONSOLE_WRITE);
6462306a36Sopenharmony_ciOPAL_CALL(opal_console_read,			OPAL_CONSOLE_READ);
6562306a36Sopenharmony_ciOPAL_CALL(opal_console_write_buffer_space,	OPAL_CONSOLE_WRITE_BUFFER_SPACE);
6662306a36Sopenharmony_ciOPAL_CALL(opal_poll_events,			OPAL_POLL_EVENTS);
6762306a36Sopenharmony_ciOPAL_CALL(opal_console_flush,			OPAL_CONSOLE_FLUSH);
68