1*2ea7afb6SJanosch Frank /* 2*2ea7afb6SJanosch Frank * s390x Ultravisor related definitions 3*2ea7afb6SJanosch Frank * 4*2ea7afb6SJanosch Frank * Copyright (c) 2020 IBM Corp 5*2ea7afb6SJanosch Frank * 6*2ea7afb6SJanosch Frank * Authors: 7*2ea7afb6SJanosch Frank * Janosch Frank <frankja@linux.ibm.com> 8*2ea7afb6SJanosch Frank * 9*2ea7afb6SJanosch Frank * This code is free software; you can redistribute it and/or modify it 10*2ea7afb6SJanosch Frank * under the terms of the GNU General Public License version 2. 11*2ea7afb6SJanosch Frank */ 12*2ea7afb6SJanosch Frank #ifndef UV_H 13*2ea7afb6SJanosch Frank #define UV_H 14*2ea7afb6SJanosch Frank 15*2ea7afb6SJanosch Frank #define UVC_RC_EXECUTED 0x0001 16*2ea7afb6SJanosch Frank #define UVC_RC_INV_CMD 0x0002 17*2ea7afb6SJanosch Frank #define UVC_RC_INV_STATE 0x0003 18*2ea7afb6SJanosch Frank #define UVC_RC_INV_LEN 0x0005 19*2ea7afb6SJanosch Frank #define UVC_RC_NO_RESUME 0x0007 20*2ea7afb6SJanosch Frank 21*2ea7afb6SJanosch Frank #define UVC_CMD_QUI 0x0001 22*2ea7afb6SJanosch Frank #define UVC_CMD_SET_SHARED_ACCESS 0x1000 23*2ea7afb6SJanosch Frank #define UVC_CMD_REMOVE_SHARED_ACCESS 0x1001 24*2ea7afb6SJanosch Frank 25*2ea7afb6SJanosch Frank /* Bits in installed uv calls */ 26*2ea7afb6SJanosch Frank enum uv_cmds_inst { 27*2ea7afb6SJanosch Frank BIT_UVC_CMD_QUI = 0, 28*2ea7afb6SJanosch Frank BIT_UVC_CMD_SET_SHARED_ACCESS = 8, 29*2ea7afb6SJanosch Frank BIT_UVC_CMD_REMOVE_SHARED_ACCESS = 9, 30*2ea7afb6SJanosch Frank }; 31*2ea7afb6SJanosch Frank 32*2ea7afb6SJanosch Frank struct uv_cb_header { 33*2ea7afb6SJanosch Frank u16 len; 34*2ea7afb6SJanosch Frank u16 cmd; /* Command Code */ 35*2ea7afb6SJanosch Frank u16 rc; /* Response Code */ 36*2ea7afb6SJanosch Frank u16 rrc; /* Return Reason Code */ 37*2ea7afb6SJanosch Frank } __attribute__((packed)) __attribute__((aligned(8))); 38*2ea7afb6SJanosch Frank 39*2ea7afb6SJanosch Frank struct uv_cb_qui { 40*2ea7afb6SJanosch Frank struct uv_cb_header header; 41*2ea7afb6SJanosch Frank u64 reserved08; 42*2ea7afb6SJanosch Frank u64 inst_calls_list[4]; 43*2ea7afb6SJanosch Frank u64 reserved30[15]; 44*2ea7afb6SJanosch Frank } __attribute__((packed)) __attribute__((aligned(8))); 45*2ea7afb6SJanosch Frank 46*2ea7afb6SJanosch Frank struct uv_cb_share { 47*2ea7afb6SJanosch Frank struct uv_cb_header header; 48*2ea7afb6SJanosch Frank u64 reserved08[3]; 49*2ea7afb6SJanosch Frank u64 paddr; 50*2ea7afb6SJanosch Frank u64 reserved28; 51*2ea7afb6SJanosch Frank } __attribute__((packed)) __attribute__((aligned(8))); 52*2ea7afb6SJanosch Frank 53*2ea7afb6SJanosch Frank static inline int uv_call(unsigned long r1, unsigned long r2) 54*2ea7afb6SJanosch Frank { 55*2ea7afb6SJanosch Frank int cc; 56*2ea7afb6SJanosch Frank 57*2ea7afb6SJanosch Frank /* 58*2ea7afb6SJanosch Frank * The brc instruction will take care of the cc 2/3 case where 59*2ea7afb6SJanosch Frank * we need to continue the execution because we were 60*2ea7afb6SJanosch Frank * interrupted. The inline assembly will only return on 61*2ea7afb6SJanosch Frank * success/error i.e. cc 0/1. 62*2ea7afb6SJanosch Frank */ 63*2ea7afb6SJanosch Frank asm volatile( 64*2ea7afb6SJanosch Frank "0: .insn rrf,0xB9A40000,%[r1],%[r2],0,0\n" 65*2ea7afb6SJanosch Frank " brc 3,0b\n" 66*2ea7afb6SJanosch Frank " ipm %[cc]\n" 67*2ea7afb6SJanosch Frank " srl %[cc],28\n" 68*2ea7afb6SJanosch Frank : [cc] "=d" (cc) 69*2ea7afb6SJanosch Frank : [r1] "a" (r1), [r2] "a" (r2) 70*2ea7afb6SJanosch Frank : "memory", "cc"); 71*2ea7afb6SJanosch Frank return cc; 72*2ea7afb6SJanosch Frank } 73*2ea7afb6SJanosch Frank 74*2ea7afb6SJanosch Frank #endif 75