1
2
3
4
5
6
7
8
9#ifndef _ASM_S390_DIAG_H
10#define _ASM_S390_DIAG_H
11
12#include <linux/if_ether.h>
13#include <linux/percpu.h>
14
15enum diag_stat_enum {
16 DIAG_STAT_X008,
17 DIAG_STAT_X00C,
18 DIAG_STAT_X010,
19 DIAG_STAT_X014,
20 DIAG_STAT_X044,
21 DIAG_STAT_X064,
22 DIAG_STAT_X09C,
23 DIAG_STAT_X0DC,
24 DIAG_STAT_X204,
25 DIAG_STAT_X210,
26 DIAG_STAT_X224,
27 DIAG_STAT_X250,
28 DIAG_STAT_X258,
29 DIAG_STAT_X26C,
30 DIAG_STAT_X288,
31 DIAG_STAT_X2C4,
32 DIAG_STAT_X2FC,
33 DIAG_STAT_X304,
34 DIAG_STAT_X308,
35 DIAG_STAT_X318,
36 DIAG_STAT_X500,
37 NR_DIAG_STAT
38};
39
40void diag_stat_inc(enum diag_stat_enum nr);
41void diag_stat_inc_norecursion(enum diag_stat_enum nr);
42
43
44
45
46static inline void diag10_range(unsigned long start_pfn, unsigned long num_pfn)
47{
48 unsigned long start_addr, end_addr;
49
50 start_addr = start_pfn << PAGE_SHIFT;
51 end_addr = (start_pfn + num_pfn - 1) << PAGE_SHIFT;
52
53 diag_stat_inc(DIAG_STAT_X010);
54 asm volatile(
55 "0: diag %0,%1,0x10\n"
56 "1: nopr %%r7\n"
57 EX_TABLE(0b, 1b)
58 EX_TABLE(1b, 1b)
59 : : "a" (start_addr), "a" (end_addr));
60}
61
62
63
64
65extern int diag14(unsigned long rx, unsigned long ry1, unsigned long subcode);
66
67
68
69
70struct diag210 {
71 u16 vrdcdvno;
72 u16 vrdclen;
73 u8 vrdcvcla;
74 u8 vrdcvtyp;
75 u8 vrdcvsta;
76 u8 vrdcvfla;
77 u8 vrdcrccl;
78 u8 vrdccrty;
79 u8 vrdccrmd;
80 u8 vrdccrft;
81} __attribute__((packed, aligned(4)));
82
83extern int diag210(struct diag210 *addr);
84
85
86#define DIAG204_LPAR_PHYS_FLG 0x80
87#define DIAG204_LPAR_NAME_LEN 8
88#define DIAG204_CPU_NAME_LEN 16
89
90
91enum diag204_sc {
92 DIAG204_SUBC_STIB4 = 4,
93 DIAG204_SUBC_RSI = 5,
94 DIAG204_SUBC_STIB6 = 6,
95 DIAG204_SUBC_STIB7 = 7
96};
97
98
99enum diag204_format {
100 DIAG204_INFO_SIMPLE = 0,
101 DIAG204_INFO_EXT = 0x00010000
102};
103
104enum diag204_cpu_flags {
105 DIAG204_CPU_ONLINE = 0x20,
106 DIAG204_CPU_CAPPED = 0x40,
107};
108
109struct diag204_info_blk_hdr {
110 __u8 npar;
111 __u8 flags;
112 __u16 tslice;
113 __u16 phys_cpus;
114 __u16 this_part;
115 __u64 curtod;
116} __packed;
117
118struct diag204_x_info_blk_hdr {
119 __u8 npar;
120 __u8 flags;
121 __u16 tslice;
122 __u16 phys_cpus;
123 __u16 this_part;
124 __u64 curtod1;
125 __u64 curtod2;
126 char reserved[40];
127} __packed;
128
129struct diag204_part_hdr {
130 __u8 pn;
131 __u8 cpus;
132 char reserved[6];
133 char part_name[DIAG204_LPAR_NAME_LEN];
134} __packed;
135
136struct diag204_x_part_hdr {
137 __u8 pn;
138 __u8 cpus;
139 __u8 rcpus;
140 __u8 pflag;
141 __u32 mlu;
142 char part_name[DIAG204_LPAR_NAME_LEN];
143 char lpc_name[8];
144 char os_name[8];
145 __u64 online_cs;
146 __u64 online_es;
147 __u8 upid;
148 __u8 reserved:3;
149 __u8 mtid:5;
150 char reserved1[2];
151 __u32 group_mlu;
152 char group_name[8];
153 char hardware_group_name[8];
154 char reserved2[24];
155} __packed;
156
157struct diag204_cpu_info {
158 __u16 cpu_addr;
159 char reserved1[2];
160 __u8 ctidx;
161 __u8 cflag;
162 __u16 weight;
163 __u64 acc_time;
164 __u64 lp_time;
165} __packed;
166
167struct diag204_x_cpu_info {
168 __u16 cpu_addr;
169 char reserved1[2];
170 __u8 ctidx;
171 __u8 cflag;
172 __u16 weight;
173 __u64 acc_time;
174 __u64 lp_time;
175 __u16 min_weight;
176 __u16 cur_weight;
177 __u16 max_weight;
178 char reseved2[2];
179 __u64 online_time;
180 __u64 wait_time;
181 __u32 pma_weight;
182 __u32 polar_weight;
183 __u32 cpu_type_cap;
184 __u32 group_cpu_type_cap;
185 char reserved3[32];
186} __packed;
187
188struct diag204_phys_hdr {
189 char reserved1[1];
190 __u8 cpus;
191 char reserved2[6];
192 char mgm_name[8];
193} __packed;
194
195struct diag204_x_phys_hdr {
196 char reserved1[1];
197 __u8 cpus;
198 char reserved2[6];
199 char mgm_name[8];
200 char reserved3[80];
201} __packed;
202
203struct diag204_phys_cpu {
204 __u16 cpu_addr;
205 char reserved1[2];
206 __u8 ctidx;
207 char reserved2[3];
208 __u64 mgm_time;
209 char reserved3[8];
210} __packed;
211
212struct diag204_x_phys_cpu {
213 __u16 cpu_addr;
214 char reserved1[2];
215 __u8 ctidx;
216 char reserved2[1];
217 __u16 weight;
218 __u64 mgm_time;
219 char reserved3[80];
220} __packed;
221
222struct diag204_x_part_block {
223 struct diag204_x_part_hdr hdr;
224 struct diag204_x_cpu_info cpus[];
225} __packed;
226
227struct diag204_x_phys_block {
228 struct diag204_x_phys_hdr hdr;
229 struct diag204_x_phys_cpu cpus[];
230} __packed;
231
232enum diag26c_sc {
233 DIAG26C_PORT_VNIC = 0x00000024,
234 DIAG26C_MAC_SERVICES = 0x00000030
235};
236
237enum diag26c_version {
238 DIAG26C_VERSION2 = 0x00000002,
239 DIAG26C_VERSION6_VM65918 = 0x00020006
240};
241
242#define DIAG26C_VNIC_INFO 0x0002
243struct diag26c_vnic_req {
244 u32 resp_buf_len;
245 u32 resp_version;
246 u16 req_format;
247 u16 vlan_id;
248 u64 sys_name;
249 u8 res[2];
250 u16 devno;
251} __packed __aligned(8);
252
253#define VNIC_INFO_PROT_L3 1
254#define VNIC_INFO_PROT_L2 2
255
256struct diag26c_vnic_resp {
257 u32 version;
258 u32 entry_cnt;
259
260 u32 next_entry;
261 u64 owner;
262 u16 devno;
263 u8 status;
264 u8 type;
265 u64 lan_owner;
266 u64 lan_name;
267 u64 port_name;
268 u8 port_type;
269 u8 ext_status:6;
270 u8 protocol:2;
271 u16 base_devno;
272 u32 port_num;
273 u32 ifindex;
274 u32 maxinfo;
275 u32 dev_count;
276
277 u8 dev_info1[28];
278 u8 dev_info2[28];
279 u8 dev_info3[28];
280} __packed __aligned(8);
281
282#define DIAG26C_GET_MAC 0x0000
283struct diag26c_mac_req {
284 u32 resp_buf_len;
285 u32 resp_version;
286 u16 op_code;
287 u16 devno;
288 u8 res[4];
289};
290
291struct diag26c_mac_resp {
292 u32 version;
293 u8 mac[ETH_ALEN];
294 u8 res[2];
295} __aligned(8);
296
297#define CPNC_LINUX 0x4
298union diag318_info {
299 unsigned long val;
300 struct {
301 unsigned long cpnc : 8;
302 unsigned long cpvc : 56;
303 };
304};
305
306int diag204(unsigned long subcode, unsigned long size, void *addr);
307int diag224(void *ptr);
308int diag26c(void *req, void *resp, enum diag26c_sc subcode);
309
310struct hypfs_diag0c_entry;
311
312
313
314
315
316struct diag_ops {
317 int (*diag210)(struct diag210 *addr);
318 int (*diag26c)(void *req, void *resp, enum diag26c_sc subcode);
319 int (*diag14)(unsigned long rx, unsigned long ry1, unsigned long subcode);
320 void (*diag0c)(struct hypfs_diag0c_entry *entry);
321 void (*diag308_reset)(void);
322};
323
324extern struct diag_ops diag_amode31_ops;
325extern struct diag210 *__diag210_tmp_amode31;
326
327int _diag210_amode31(struct diag210 *addr);
328int _diag26c_amode31(void *req, void *resp, enum diag26c_sc subcode);
329int _diag14_amode31(unsigned long rx, unsigned long ry1, unsigned long subcode);
330void _diag0c_amode31(struct hypfs_diag0c_entry *entry);
331void _diag308_reset_amode31(void);
332
333#endif
334