Commit | Line | Data |
---|---|---|
1da177e4 | 1 | /* |
7441b062 | 2 | * Copyright IBM Corp. 1999,2012 |
1da177e4 | 3 | * |
62b74942 MH |
4 | * Author(s): Martin Peschke <mpeschke@de.ibm.com> |
5 | * Martin Schwidefsky <schwidefsky@de.ibm.com> | |
1da177e4 LT |
6 | */ |
7 | ||
8 | #ifndef __SCLP_H__ | |
9 | #define __SCLP_H__ | |
10 | ||
11 | #include <linux/types.h> | |
12 | #include <linux/list.h> | |
ab14de6c | 13 | #include <asm/sclp.h> |
1da177e4 LT |
14 | #include <asm/ebcdic.h> |
15 | ||
16 | /* maximum number of pages concerning our own memory management */ | |
17 | #define MAX_KMEM_PAGES (sizeof(unsigned long) << 3) | |
25b41a7b | 18 | #define SCLP_CONSOLE_PAGES 6 |
1da177e4 | 19 | |
6d4740c8 SH |
20 | #define EVTYP_OPCMD 0x01 |
21 | #define EVTYP_MSG 0x02 | |
8f933b10 | 22 | #define EVTYP_DIAG_TEST 0x07 |
6d4740c8 SH |
23 | #define EVTYP_STATECHANGE 0x08 |
24 | #define EVTYP_PMSGCMD 0x09 | |
25 | #define EVTYP_CNTLPROGOPCMD 0x20 | |
26 | #define EVTYP_CNTLPROGIDENT 0x0B | |
27 | #define EVTYP_SIGQUIESCE 0x1D | |
28 | #define EVTYP_VT220MSG 0x1A | |
2fc2d1e9 | 29 | #define EVTYP_CONFMGMDATA 0x04 |
6d4740c8 | 30 | #define EVTYP_SDIAS 0x1C |
c114728a | 31 | #define EVTYP_ASYNC 0x0A |
7eb9d5be | 32 | #define EVTYP_OCF 0x1E |
6d4740c8 SH |
33 | |
34 | #define EVTYP_OPCMD_MASK 0x80000000 | |
35 | #define EVTYP_MSG_MASK 0x40000000 | |
8f933b10 | 36 | #define EVTYP_DIAG_TEST_MASK 0x02000000 |
6d4740c8 SH |
37 | #define EVTYP_STATECHANGE_MASK 0x01000000 |
38 | #define EVTYP_PMSGCMD_MASK 0x00800000 | |
39 | #define EVTYP_CTLPROGOPCMD_MASK 0x00000001 | |
40 | #define EVTYP_CTLPROGIDENT_MASK 0x00200000 | |
41 | #define EVTYP_SIGQUIESCE_MASK 0x00000008 | |
42 | #define EVTYP_VT220MSG_MASK 0x00000040 | |
2fc2d1e9 | 43 | #define EVTYP_CONFMGMDATA_MASK 0x10000000 |
6d4740c8 | 44 | #define EVTYP_SDIAS_MASK 0x00000010 |
c114728a | 45 | #define EVTYP_ASYNC_MASK 0x00400000 |
7eb9d5be | 46 | #define EVTYP_OCF_MASK 0x00000004 |
6d4740c8 SH |
47 | |
48 | #define GNRLMSGFLGS_DOM 0x8000 | |
49 | #define GNRLMSGFLGS_SNDALRM 0x4000 | |
50 | #define GNRLMSGFLGS_HOLDMSG 0x2000 | |
51 | ||
52 | #define LNTPFLGS_CNTLTEXT 0x8000 | |
53 | #define LNTPFLGS_LABELTEXT 0x4000 | |
54 | #define LNTPFLGS_DATATEXT 0x2000 | |
55 | #define LNTPFLGS_ENDTEXT 0x1000 | |
56 | #define LNTPFLGS_PROMPTTEXT 0x0800 | |
1da177e4 LT |
57 | |
58 | typedef unsigned int sclp_cmdw_t; | |
59 | ||
ab14de6c HC |
60 | #define SCLP_CMDW_READ_EVENT_DATA 0x00770005 |
61 | #define SCLP_CMDW_WRITE_EVENT_DATA 0x00760005 | |
62 | #define SCLP_CMDW_WRITE_EVENT_MASK 0x00780005 | |
1da177e4 LT |
63 | |
64 | #define GDS_ID_MDSMU 0x1310 | |
6d4740c8 SH |
65 | #define GDS_ID_MDSROUTEINFO 0x1311 |
66 | #define GDS_ID_AGUNWRKCORR 0x1549 | |
67 | #define GDS_ID_SNACONDREPORT 0x1532 | |
1da177e4 | 68 | #define GDS_ID_CPMSU 0x1212 |
6d4740c8 SH |
69 | #define GDS_ID_ROUTTARGINSTR 0x154D |
70 | #define GDS_ID_OPREQ 0x8070 | |
71 | #define GDS_ID_TEXTCMD 0x1320 | |
1da177e4 | 72 | |
6d4740c8 | 73 | #define GDS_KEY_SELFDEFTEXTMSG 0x31 |
1da177e4 | 74 | |
62b74942 MH |
75 | enum sclp_pm_event { |
76 | SCLP_PM_EVENT_FREEZE, | |
77 | SCLP_PM_EVENT_THAW, | |
78 | SCLP_PM_EVENT_RESTORE, | |
79 | }; | |
80 | ||
81 | #define SCLP_PANIC_PRIO 1 | |
82 | #define SCLP_PANIC_PRIO_CLIENT 0 | |
83 | ||
1da177e4 LT |
84 | typedef u32 sccb_mask_t; /* ATTENTION: assumes 32bit mask !!! */ |
85 | ||
05dd2530 HC |
86 | struct sccb_header { |
87 | u16 length; | |
88 | u8 function_code; | |
89 | u8 control_mask[3]; | |
90 | u16 response_code; | |
91 | } __attribute__((packed)); | |
92 | ||
cd183459 HG |
93 | struct init_sccb { |
94 | struct sccb_header header; | |
95 | u16 _reserved; | |
96 | u16 mask_length; | |
97 | sccb_mask_t receive_mask; | |
98 | sccb_mask_t send_mask; | |
99 | sccb_mask_t sclp_receive_mask; | |
100 | sccb_mask_t sclp_send_mask; | |
101 | } __attribute__((packed)); | |
102 | ||
83119ad4 | 103 | extern u64 sclp_facilities; |
acf6a004 | 104 | |
83119ad4 HC |
105 | #define SCLP_HAS_CHP_INFO (sclp_facilities & 0x8000000000000000ULL) |
106 | #define SCLP_HAS_CHP_RECONFIG (sclp_facilities & 0x2000000000000000ULL) | |
08d07968 HC |
107 | #define SCLP_HAS_CPU_INFO (sclp_facilities & 0x0800000000000000ULL) |
108 | #define SCLP_HAS_CPU_RECONFIG (sclp_facilities & 0x0400000000000000ULL) | |
7441b062 | 109 | #define SCLP_HAS_PCI_RECONFIG (sclp_facilities & 0x0000000040000000ULL) |
83119ad4 | 110 | |
c114728a | 111 | |
1da177e4 LT |
112 | struct gds_subvector { |
113 | u8 length; | |
114 | u8 key; | |
115 | } __attribute__((packed)); | |
116 | ||
117 | struct gds_vector { | |
118 | u16 length; | |
119 | u16 gds_id; | |
120 | } __attribute__((packed)); | |
121 | ||
122 | struct evbuf_header { | |
123 | u16 length; | |
124 | u8 type; | |
125 | u8 flags; | |
126 | u16 _reserved; | |
127 | } __attribute__((packed)); | |
128 | ||
129 | struct sclp_req { | |
130 | struct list_head list; /* list_head for request queueing. */ | |
131 | sclp_cmdw_t command; /* sclp command to execute */ | |
132 | void *sccb; /* pointer to the sccb to execute */ | |
133 | char status; /* status of this request */ | |
134 | int start_count; /* number of SVCs done for this req */ | |
135 | /* Callback that is called after reaching final status. */ | |
136 | void (*callback)(struct sclp_req *, void *data); | |
137 | void *callback_data; | |
9f0128f9 GS |
138 | int queue_timeout; /* request queue timeout (sec), set by |
139 | caller of sclp_add_request(), if | |
140 | needed */ | |
141 | /* Internal fields */ | |
142 | unsigned long queue_expires; /* request queue timeout (jiffies) */ | |
1da177e4 LT |
143 | }; |
144 | ||
145 | #define SCLP_REQ_FILLED 0x00 /* request is ready to be processed */ | |
146 | #define SCLP_REQ_QUEUED 0x01 /* request is queued to be processed */ | |
147 | #define SCLP_REQ_RUNNING 0x02 /* request is currently running */ | |
148 | #define SCLP_REQ_DONE 0x03 /* request is completed successfully */ | |
149 | #define SCLP_REQ_FAILED 0x05 /* request is finally failed */ | |
9f0128f9 GS |
150 | #define SCLP_REQ_QUEUED_TIMEOUT 0x06 /* request on queue timed out */ |
151 | ||
152 | #define SCLP_QUEUE_INTERVAL 5 /* timeout interval for request queue */ | |
1da177e4 LT |
153 | |
154 | /* function pointers that a high level driver has to use for registration */ | |
155 | /* of some routines it wants to be called from the low level driver */ | |
156 | struct sclp_register { | |
157 | struct list_head list; | |
d082d3ce | 158 | /* User wants to receive: */ |
1da177e4 | 159 | sccb_mask_t receive_mask; |
d082d3ce | 160 | /* User wants to send: */ |
1da177e4 | 161 | sccb_mask_t send_mask; |
d082d3ce | 162 | /* H/W can receive: */ |
1da177e4 | 163 | sccb_mask_t sclp_receive_mask; |
d082d3ce | 164 | /* H/W can send: */ |
1da177e4 LT |
165 | sccb_mask_t sclp_send_mask; |
166 | /* called if event type availability changes */ | |
167 | void (*state_change_fn)(struct sclp_register *); | |
168 | /* called for events in cp_receive_mask/sclp_receive_mask */ | |
169 | void (*receiver_fn)(struct evbuf_header *); | |
62b74942 MH |
170 | /* called for power management events */ |
171 | void (*pm_event_fn)(struct sclp_register *, enum sclp_pm_event); | |
172 | /* pm event posted flag */ | |
173 | int pm_event_posted; | |
1da177e4 LT |
174 | }; |
175 | ||
176 | /* externals from sclp.c */ | |
177 | int sclp_add_request(struct sclp_req *req); | |
178 | void sclp_sync_wait(void); | |
179 | int sclp_register(struct sclp_register *reg); | |
180 | void sclp_unregister(struct sclp_register *reg); | |
181 | int sclp_remove_processed(struct sccb_header *sccb); | |
182 | int sclp_deactivate(void); | |
183 | int sclp_reactivate(void); | |
ab14de6c | 184 | int sclp_service_call(sclp_cmdw_t command, void *sccb); |
d475f942 | 185 | int sclp_sync_request(sclp_cmdw_t command, void *sccb); |
9f0128f9 | 186 | int sclp_sync_request_timeout(sclp_cmdw_t command, void *sccb, int timeout); |
1da177e4 | 187 | |
763968e2 HC |
188 | int sclp_sdias_init(void); |
189 | void sclp_sdias_exit(void); | |
190 | ||
25b41a7b MS |
191 | extern int sclp_console_pages; |
192 | extern int sclp_console_drop; | |
193 | extern unsigned long sclp_console_full; | |
194 | ||
1da177e4 LT |
195 | /* useful inlines */ |
196 | ||
197 | /* VM uses EBCDIC 037, LPAR+native(SE+HMC) use EBCDIC 500 */ | |
198 | /* translate single character from ASCII to EBCDIC */ | |
199 | static inline unsigned char | |
200 | sclp_ascebc(unsigned char ch) | |
201 | { | |
202 | return (MACHINE_IS_VM) ? _ascebc[ch] : _ascebc_500[ch]; | |
203 | } | |
204 | ||
205 | /* translate string from EBCDIC to ASCII */ | |
206 | static inline void | |
207 | sclp_ebcasc_str(unsigned char *str, int nr) | |
208 | { | |
209 | (MACHINE_IS_VM) ? EBCASC(str, nr) : EBCASC_500(str, nr); | |
210 | } | |
211 | ||
212 | /* translate string from ASCII to EBCDIC */ | |
213 | static inline void | |
214 | sclp_ascebc_str(unsigned char *str, int nr) | |
215 | { | |
216 | (MACHINE_IS_VM) ? ASCEBC(str, nr) : ASCEBC_500(str, nr); | |
217 | } | |
218 | ||
30c2df51 MS |
219 | static inline struct gds_vector * |
220 | sclp_find_gds_vector(void *start, void *end, u16 id) | |
221 | { | |
222 | struct gds_vector *v; | |
223 | ||
224 | for (v = start; (void *) v < end; v = (void *) v + v->length) | |
225 | if (v->gds_id == id) | |
226 | return v; | |
227 | return NULL; | |
228 | } | |
229 | ||
230 | static inline struct gds_subvector * | |
231 | sclp_find_gds_subvector(void *start, void *end, u8 key) | |
232 | { | |
233 | struct gds_subvector *sv; | |
234 | ||
235 | for (sv = start; (void *) sv < end; sv = (void *) sv + sv->length) | |
236 | if (sv->key == key) | |
237 | return sv; | |
238 | return NULL; | |
239 | } | |
240 | ||
1da177e4 | 241 | #endif /* __SCLP_H__ */ |