12874c5fdSThomas Gleixner/* SPDX-License-Identifier: GPL-2.0-or-later */
214a43e69SBenjamin Herrenschmidt/*
314a43e69SBenjamin Herrenschmidt * PowerNV OPAL API wrappers
414a43e69SBenjamin Herrenschmidt *
514a43e69SBenjamin Herrenschmidt * Copyright 2011 IBM Corp.
614a43e69SBenjamin Herrenschmidt */
714a43e69SBenjamin Herrenschmidt
858995a9aSAnton Blanchard#include <linux/jump_label.h>
914a43e69SBenjamin Herrenschmidt#include <asm/ppc_asm.h>
1014a43e69SBenjamin Herrenschmidt#include <asm/hvcall.h>
1114a43e69SBenjamin Herrenschmidt#include <asm/asm-offsets.h>
1214a43e69SBenjamin Herrenschmidt#include <asm/opal.h>
13ec0c464cSChristophe Leroy#include <asm/asm-compat.h>
142c86cd18SChristophe Leroy#include <asm/feature-fixups.h>
15c49f6353SAnton Blanchard
16c49f6353SAnton Blanchard	.section ".text"
17c49f6353SAnton Blanchard
18c49f6353SAnton Blanchard/*
1975d9fc7fSNicholas Piggin * r3-r10		- OPAL call arguments
2075d9fc7fSNicholas Piggin * STK_PARAM(R11)	- OPAL opcode
2175d9fc7fSNicholas Piggin * STK_PARAM(R12)	- MSR to restore
22c49f6353SAnton Blanchard */
2375d9fc7fSNicholas Piggin_GLOBAL_TOC(__opal_call)
2475d9fc7fSNicholas Piggin	mflr	r0
2575d9fc7fSNicholas Piggin	std	r0,PPC_LR_STKOFF(r1)
2675d9fc7fSNicholas Piggin	ld	r12,STK_PARAM(R12)(r1)
2775d9fc7fSNicholas Piggin	li	r0,MSR_IR|MSR_DR|MSR_LE
2875d9fc7fSNicholas Piggin	andc	r12,r12,r0
2975d9fc7fSNicholas Piggin	LOAD_REG_ADDR(r11, opal_return)
3075d9fc7fSNicholas Piggin	mtlr	r11
3175d9fc7fSNicholas Piggin	LOAD_REG_ADDR(r11, opal)
3275d9fc7fSNicholas Piggin	ld	r2,0(r11)
3375d9fc7fSNicholas Piggin	ld	r11,8(r11)
3475d9fc7fSNicholas Piggin	mtspr	SPRN_HSRR0,r11
3575d9fc7fSNicholas Piggin	mtspr	SPRN_HSRR1,r12
3675d9fc7fSNicholas Piggin	/* set token to r0 */
3775d9fc7fSNicholas Piggin	ld	r0,STK_PARAM(R11)(r1)
3814a43e69SBenjamin Herrenschmidt	hrfid
39ad0289e4SAnton Blanchardopal_return:
40be401b37SBenjamin Herrenschmidt	/*
4175d9fc7fSNicholas Piggin	 * Restore MSR on OPAL return. The MSR is set to big-endian.
42be401b37SBenjamin Herrenschmidt	 */
4375d9fc7fSNicholas Piggin#ifdef __BIG_ENDIAN__
4475d9fc7fSNicholas Piggin	ld	r11,STK_PARAM(R12)(r1)
4575d9fc7fSNicholas Piggin	mtmsrd	r11
4675d9fc7fSNicholas Piggin#else
4775d9fc7fSNicholas Piggin	/* Endian can only be switched with rfi, must byte reverse MSR load */
4875d9fc7fSNicholas Piggin	.short 0x4039	 /* li r10,STK_PARAM(R12)		*/
4975d9fc7fSNicholas Piggin	.byte (STK_PARAM(R12) >> 8) & 0xff
5075d9fc7fSNicholas Piggin	.byte STK_PARAM(R12) & 0xff
5114a43e69SBenjamin Herrenschmidt
5275d9fc7fSNicholas Piggin	.long 0x280c6a7d /* ldbrx r11,r10,r1			*/
5375d9fc7fSNicholas Piggin	.long 0x05009f42 /* bcl 20,31,$+4			*/
5475d9fc7fSNicholas Piggin	.long 0xa602487d /* mflr r10				*/
5575d9fc7fSNicholas Piggin	.long 0x14004a39 /* addi r10,r10,20			*/
5675d9fc7fSNicholas Piggin	.long 0xa64b5a7d /* mthsrr0 r10				*/
5775d9fc7fSNicholas Piggin	.long 0xa64b7b7d /* mthsrr1 r11				*/
5875d9fc7fSNicholas Piggin	.long 0x2402004c /* hrfid				*/
5975d9fc7fSNicholas Piggin#endif
60*8e93fb33SNicholas Piggin	LOAD_PACA_TOC()
6175d9fc7fSNicholas Piggin	ld	r0,PPC_LR_STKOFF(r1)
62c49f6353SAnton Blanchard	mtlr	r0
63c49f6353SAnton Blanchard	blr
64