1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun/* 3*4882a593Smuzhiyun * PowerNV OPAL API wrappers 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright 2011 IBM Corp. 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun#include <linux/jump_label.h> 9*4882a593Smuzhiyun#include <asm/ppc_asm.h> 10*4882a593Smuzhiyun#include <asm/hvcall.h> 11*4882a593Smuzhiyun#include <asm/asm-offsets.h> 12*4882a593Smuzhiyun#include <asm/opal.h> 13*4882a593Smuzhiyun#include <asm/asm-compat.h> 14*4882a593Smuzhiyun#include <asm/feature-fixups.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun .section ".text" 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun/* 19*4882a593Smuzhiyun * r3-r10 - OPAL call arguments 20*4882a593Smuzhiyun * STK_PARAM(R11) - OPAL opcode 21*4882a593Smuzhiyun * STK_PARAM(R12) - MSR to restore 22*4882a593Smuzhiyun */ 23*4882a593Smuzhiyun_GLOBAL_TOC(__opal_call) 24*4882a593Smuzhiyun mflr r0 25*4882a593Smuzhiyun std r0,PPC_LR_STKOFF(r1) 26*4882a593Smuzhiyun ld r12,STK_PARAM(R12)(r1) 27*4882a593Smuzhiyun li r0,MSR_IR|MSR_DR|MSR_LE 28*4882a593Smuzhiyun andc r12,r12,r0 29*4882a593Smuzhiyun LOAD_REG_ADDR(r11, opal_return) 30*4882a593Smuzhiyun mtlr r11 31*4882a593Smuzhiyun LOAD_REG_ADDR(r11, opal) 32*4882a593Smuzhiyun ld r2,0(r11) 33*4882a593Smuzhiyun ld r11,8(r11) 34*4882a593Smuzhiyun mtspr SPRN_HSRR0,r11 35*4882a593Smuzhiyun mtspr SPRN_HSRR1,r12 36*4882a593Smuzhiyun /* set token to r0 */ 37*4882a593Smuzhiyun ld r0,STK_PARAM(R11)(r1) 38*4882a593Smuzhiyun hrfid 39*4882a593Smuzhiyunopal_return: 40*4882a593Smuzhiyun /* 41*4882a593Smuzhiyun * Restore MSR on OPAL return. The MSR is set to big-endian. 42*4882a593Smuzhiyun */ 43*4882a593Smuzhiyun#ifdef __BIG_ENDIAN__ 44*4882a593Smuzhiyun ld r11,STK_PARAM(R12)(r1) 45*4882a593Smuzhiyun mtmsrd r11 46*4882a593Smuzhiyun#else 47*4882a593Smuzhiyun /* Endian can only be switched with rfi, must byte reverse MSR load */ 48*4882a593Smuzhiyun .short 0x4039 /* li r10,STK_PARAM(R12) */ 49*4882a593Smuzhiyun .byte (STK_PARAM(R12) >> 8) & 0xff 50*4882a593Smuzhiyun .byte STK_PARAM(R12) & 0xff 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun .long 0x280c6a7d /* ldbrx r11,r10,r1 */ 53*4882a593Smuzhiyun .long 0x05009f42 /* bcl 20,31,$+4 */ 54*4882a593Smuzhiyun .long 0xa602487d /* mflr r10 */ 55*4882a593Smuzhiyun .long 0x14004a39 /* addi r10,r10,20 */ 56*4882a593Smuzhiyun .long 0xa64b5a7d /* mthsrr0 r10 */ 57*4882a593Smuzhiyun .long 0xa64b7b7d /* mthsrr1 r11 */ 58*4882a593Smuzhiyun .long 0x2402004c /* hrfid */ 59*4882a593Smuzhiyun#endif 60*4882a593Smuzhiyun ld r2,PACATOC(r13) 61*4882a593Smuzhiyun ld r0,PPC_LR_STKOFF(r1) 62*4882a593Smuzhiyun mtlr r0 63*4882a593Smuzhiyun blr 64