1*6c9f99dfSJanosch Frank /* SPDX-License-Identifier: GPL-2.0-only */ 20af4b381SJanosch Frank /* 30af4b381SJanosch Frank * SIGP related definitions. 40af4b381SJanosch Frank * 50af4b381SJanosch Frank * Copied from the Linux kernel file arch/s390/include/asm/sigp.h 60af4b381SJanosch Frank */ 70af4b381SJanosch Frank 80af4b381SJanosch Frank #ifndef ASM_S390X_SIGP_H 90af4b381SJanosch Frank #define ASM_S390X_SIGP_H 100af4b381SJanosch Frank 110af4b381SJanosch Frank /* SIGP order codes */ 120af4b381SJanosch Frank #define SIGP_SENSE 1 130af4b381SJanosch Frank #define SIGP_EXTERNAL_CALL 2 140af4b381SJanosch Frank #define SIGP_EMERGENCY_SIGNAL 3 150af4b381SJanosch Frank #define SIGP_START 4 160af4b381SJanosch Frank #define SIGP_STOP 5 170af4b381SJanosch Frank #define SIGP_RESTART 6 180af4b381SJanosch Frank #define SIGP_STOP_AND_STORE_STATUS 9 190af4b381SJanosch Frank #define SIGP_INITIAL_CPU_RESET 11 200af4b381SJanosch Frank #define SIGP_CPU_RESET 12 210af4b381SJanosch Frank #define SIGP_SET_PREFIX 13 220af4b381SJanosch Frank #define SIGP_STORE_STATUS_AT_ADDRESS 14 230af4b381SJanosch Frank #define SIGP_SET_ARCHITECTURE 18 240af4b381SJanosch Frank #define SIGP_COND_EMERGENCY_SIGNAL 19 250af4b381SJanosch Frank #define SIGP_SENSE_RUNNING 21 260af4b381SJanosch Frank #define SIGP_SET_MULTI_THREADING 22 270af4b381SJanosch Frank #define SIGP_STORE_ADDITIONAL_STATUS 23 280af4b381SJanosch Frank 290af4b381SJanosch Frank /* SIGP condition codes */ 300af4b381SJanosch Frank #define SIGP_CC_ORDER_CODE_ACCEPTED 0 310af4b381SJanosch Frank #define SIGP_CC_STATUS_STORED 1 320af4b381SJanosch Frank #define SIGP_CC_BUSY 2 330af4b381SJanosch Frank #define SIGP_CC_NOT_OPERATIONAL 3 340af4b381SJanosch Frank 350af4b381SJanosch Frank /* SIGP cpu status bits */ 360af4b381SJanosch Frank 370af4b381SJanosch Frank #define SIGP_STATUS_INVALID_ORDER 0x00000002UL 380af4b381SJanosch Frank #define SIGP_STATUS_CHECK_STOP 0x00000010UL 390af4b381SJanosch Frank #define SIGP_STATUS_STOPPED 0x00000040UL 400af4b381SJanosch Frank #define SIGP_STATUS_EXT_CALL_PENDING 0x00000080UL 410af4b381SJanosch Frank #define SIGP_STATUS_INVALID_PARAMETER 0x00000100UL 420af4b381SJanosch Frank #define SIGP_STATUS_INCORRECT_STATE 0x00000200UL 430af4b381SJanosch Frank #define SIGP_STATUS_NOT_RUNNING 0x00000400UL 440af4b381SJanosch Frank 450af4b381SJanosch Frank #ifndef __ASSEMBLER__ 460af4b381SJanosch Frank 47f77c0515SJanosch Frank 48f77c0515SJanosch Frank static inline int sigp(uint16_t addr, uint8_t order, unsigned long parm, 49f77c0515SJanosch Frank uint32_t *status) 500af4b381SJanosch Frank { 51f77c0515SJanosch Frank register unsigned long reg1 asm ("1") = parm; 52f77c0515SJanosch Frank int cc; 530af4b381SJanosch Frank 540af4b381SJanosch Frank asm volatile( 55f77c0515SJanosch Frank " sigp %1,%2,0(%3)\n" 56f77c0515SJanosch Frank " ipm %0\n" 57f77c0515SJanosch Frank " srl %0,28\n" 58f77c0515SJanosch Frank : "=d" (cc), "+d" (reg1) : "d" (addr), "a" (order) : "cc"); 59f77c0515SJanosch Frank if (status) 60f77c0515SJanosch Frank *status = reg1; 61f77c0515SJanosch Frank return cc; 62f77c0515SJanosch Frank } 63f77c0515SJanosch Frank 64f77c0515SJanosch Frank static inline int sigp_retry(uint16_t addr, uint8_t order, unsigned long parm, 65f77c0515SJanosch Frank uint32_t *status) 66f77c0515SJanosch Frank { 67f77c0515SJanosch Frank int cc; 68f77c0515SJanosch Frank 69f77c0515SJanosch Frank do { 70f77c0515SJanosch Frank cc = sigp(addr, order, parm, status); 71f77c0515SJanosch Frank } while (cc == 2); 72f77c0515SJanosch Frank return cc; 730af4b381SJanosch Frank } 740af4b381SJanosch Frank 750af4b381SJanosch Frank #endif /* __ASSEMBLER__ */ 760af4b381SJanosch Frank #endif /* ASM_S390X_SIGP_H */ 77