sigp.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*
  2. * include/asm-s390/sigp.h
  3. *
  4. * S390 version
  5. * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
  6. * Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
  7. * Martin Schwidefsky (schwidefsky@de.ibm.com)
  8. * Heiko Carstens (heiko.carstens@de.ibm.com)
  9. *
  10. * sigp.h by D.J. Barrow (c) IBM 1999
  11. * contains routines / structures for signalling other S/390 processors in an
  12. * SMP configuration.
  13. */
  14. #ifndef __SIGP__
  15. #define __SIGP__
  16. #include <asm/system.h>
  17. /* get real cpu address from logical cpu number */
  18. extern int __cpu_logical_map[];
  19. static inline int cpu_logical_map(int cpu)
  20. {
  21. #ifdef CONFIG_SMP
  22. return __cpu_logical_map[cpu];
  23. #else
  24. return stap();
  25. #endif
  26. }
  27. typedef enum
  28. {
  29. sigp_unassigned=0x0,
  30. sigp_sense,
  31. sigp_external_call,
  32. sigp_emergency_signal,
  33. sigp_start,
  34. sigp_stop,
  35. sigp_restart,
  36. sigp_unassigned1,
  37. sigp_unassigned2,
  38. sigp_stop_and_store_status,
  39. sigp_unassigned3,
  40. sigp_initial_cpu_reset,
  41. sigp_cpu_reset,
  42. sigp_set_prefix,
  43. sigp_store_status_at_address,
  44. sigp_store_extended_status_at_address
  45. } sigp_order_code;
  46. typedef __u32 sigp_status_word;
  47. typedef enum
  48. {
  49. sigp_order_code_accepted=0,
  50. sigp_status_stored,
  51. sigp_busy,
  52. sigp_not_operational
  53. } sigp_ccode;
  54. /*
  55. * Definitions for the external call
  56. */
  57. /* 'Bit' signals, asynchronous */
  58. typedef enum
  59. {
  60. ec_schedule=0,
  61. ec_call_function,
  62. ec_call_function_single,
  63. ec_bit_last
  64. } ec_bit_sig;
  65. /*
  66. * Signal processor
  67. */
  68. static inline sigp_ccode
  69. signal_processor(__u16 cpu_addr, sigp_order_code order_code)
  70. {
  71. register unsigned long reg1 asm ("1") = 0;
  72. sigp_ccode ccode;
  73. asm volatile(
  74. " sigp %1,%2,0(%3)\n"
  75. " ipm %0\n"
  76. " srl %0,28\n"
  77. : "=d" (ccode)
  78. : "d" (reg1), "d" (cpu_logical_map(cpu_addr)),
  79. "a" (order_code) : "cc" , "memory");
  80. return ccode;
  81. }
  82. /*
  83. * Signal processor with parameter
  84. */
  85. static inline sigp_ccode
  86. signal_processor_p(__u32 parameter, __u16 cpu_addr, sigp_order_code order_code)
  87. {
  88. register unsigned int reg1 asm ("1") = parameter;
  89. sigp_ccode ccode;
  90. asm volatile(
  91. " sigp %1,%2,0(%3)\n"
  92. " ipm %0\n"
  93. " srl %0,28\n"
  94. : "=d" (ccode)
  95. : "d" (reg1), "d" (cpu_logical_map(cpu_addr)),
  96. "a" (order_code) : "cc" , "memory");
  97. return ccode;
  98. }
  99. /*
  100. * Signal processor with parameter and return status
  101. */
  102. static inline sigp_ccode
  103. signal_processor_ps(__u32 *statusptr, __u32 parameter, __u16 cpu_addr,
  104. sigp_order_code order_code)
  105. {
  106. register unsigned int reg1 asm ("1") = parameter;
  107. sigp_ccode ccode;
  108. asm volatile(
  109. " sigp %1,%2,0(%3)\n"
  110. " ipm %0\n"
  111. " srl %0,28\n"
  112. : "=d" (ccode), "+d" (reg1)
  113. : "d" (cpu_logical_map(cpu_addr)), "a" (order_code)
  114. : "cc" , "memory");
  115. *statusptr = reg1;
  116. return ccode;
  117. }
  118. #endif /* __SIGP__ */