Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
0a87c5cf MH |
2 | /* |
3 | * s390 diagnose functions | |
4 | * | |
5 | * Copyright IBM Corp. 2007 | |
6 | * Author(s): Michael Holzheu <holzheu@de.ibm.com> | |
7 | */ | |
8 | ||
9 | #ifndef _ASM_S390_DIAG_H | |
10 | #define _ASM_S390_DIAG_H | |
11 | ||
1b030478 | 12 | #include <linux/if_ether.h> |
1ec2772e MS |
13 | #include <linux/percpu.h> |
14 | ||
15 | enum 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, | |
1b030478 | 29 | DIAG_STAT_X26C, |
1ec2772e MS |
30 | DIAG_STAT_X288, |
31 | DIAG_STAT_X2C4, | |
32 | DIAG_STAT_X2FC, | |
33 | DIAG_STAT_X304, | |
34 | DIAG_STAT_X308, | |
35 | DIAG_STAT_X500, | |
36 | NR_DIAG_STAT | |
37 | }; | |
38 | ||
b5a6b71b MS |
39 | void diag_stat_inc(enum diag_stat_enum nr); |
40 | void diag_stat_inc_norecursion(enum diag_stat_enum nr); | |
1ec2772e | 41 | |
0a87c5cf | 42 | /* |
83ace270 | 43 | * Diagnose 10: Release page range |
0a87c5cf | 44 | */ |
83ace270 MH |
45 | static inline void diag10_range(unsigned long start_pfn, unsigned long num_pfn) |
46 | { | |
47 | unsigned long start_addr, end_addr; | |
48 | ||
49 | start_addr = start_pfn << PAGE_SHIFT; | |
50 | end_addr = (start_pfn + num_pfn - 1) << PAGE_SHIFT; | |
51 | ||
1ec2772e | 52 | diag_stat_inc(DIAG_STAT_X010); |
83ace270 MH |
53 | asm volatile( |
54 | "0: diag %0,%1,0x10\n" | |
6c22c986 | 55 | "1: nopr %%r7\n" |
83ace270 MH |
56 | EX_TABLE(0b, 1b) |
57 | EX_TABLE(1b, 1b) | |
58 | : : "a" (start_addr), "a" (end_addr)); | |
59 | } | |
0a87c5cf MH |
60 | |
61 | /* | |
62 | * Diagnose 14: Input spool file manipulation | |
63 | */ | |
64 | extern int diag14(unsigned long rx, unsigned long ry1, unsigned long subcode); | |
65 | ||
66 | /* | |
67 | * Diagnose 210: Get information about a virtual device | |
68 | */ | |
69 | struct diag210 { | |
70 | u16 vrdcdvno; /* device number (input) */ | |
71 | u16 vrdclen; /* data block length (input) */ | |
72 | u8 vrdcvcla; /* virtual device class (output) */ | |
73 | u8 vrdcvtyp; /* virtual device type (output) */ | |
74 | u8 vrdcvsta; /* virtual device status (output) */ | |
75 | u8 vrdcvfla; /* virtual device flags (output) */ | |
76 | u8 vrdcrccl; /* real device class (output) */ | |
77 | u8 vrdccrty; /* real device type (output) */ | |
78 | u8 vrdccrmd; /* real device model (output) */ | |
79 | u8 vrdccrft; /* real device feature (output) */ | |
80 | } __attribute__((packed, aligned(4))); | |
81 | ||
82 | extern int diag210(struct diag210 *addr); | |
83 | ||
e65f30e0 JF |
84 | /* bit is set in flags, when physical cpu info is included in diag 204 data */ |
85 | #define DIAG204_LPAR_PHYS_FLG 0x80 | |
86 | #define DIAG204_LPAR_NAME_LEN 8 /* lpar name len in diag 204 data */ | |
87 | #define DIAG204_CPU_NAME_LEN 16 /* type name len of cpus in diag224 name table */ | |
88 | ||
89 | /* diag 204 subcodes */ | |
90 | enum diag204_sc { | |
91 | DIAG204_SUBC_STIB4 = 4, | |
92 | DIAG204_SUBC_RSI = 5, | |
93 | DIAG204_SUBC_STIB6 = 6, | |
94 | DIAG204_SUBC_STIB7 = 7 | |
95 | }; | |
96 | ||
97 | /* The two available diag 204 data formats */ | |
98 | enum diag204_format { | |
99 | DIAG204_INFO_SIMPLE = 0, | |
100 | DIAG204_INFO_EXT = 0x00010000 | |
101 | }; | |
102 | ||
a2d57b35 JF |
103 | enum diag204_cpu_flags { |
104 | DIAG204_CPU_ONLINE = 0x20, | |
105 | DIAG204_CPU_CAPPED = 0x40, | |
106 | }; | |
107 | ||
e65f30e0 JF |
108 | struct diag204_info_blk_hdr { |
109 | __u8 npar; | |
110 | __u8 flags; | |
111 | __u16 tslice; | |
112 | __u16 phys_cpus; | |
113 | __u16 this_part; | |
114 | __u64 curtod; | |
115 | } __packed; | |
116 | ||
117 | struct diag204_x_info_blk_hdr { | |
118 | __u8 npar; | |
119 | __u8 flags; | |
120 | __u16 tslice; | |
121 | __u16 phys_cpus; | |
122 | __u16 this_part; | |
123 | __u64 curtod1; | |
124 | __u64 curtod2; | |
125 | char reserved[40]; | |
126 | } __packed; | |
127 | ||
128 | struct diag204_part_hdr { | |
129 | __u8 pn; | |
130 | __u8 cpus; | |
131 | char reserved[6]; | |
132 | char part_name[DIAG204_LPAR_NAME_LEN]; | |
133 | } __packed; | |
134 | ||
135 | struct diag204_x_part_hdr { | |
136 | __u8 pn; | |
137 | __u8 cpus; | |
138 | __u8 rcpus; | |
139 | __u8 pflag; | |
140 | __u32 mlu; | |
141 | char part_name[DIAG204_LPAR_NAME_LEN]; | |
142 | char lpc_name[8]; | |
143 | char os_name[8]; | |
144 | __u64 online_cs; | |
145 | __u64 online_es; | |
146 | __u8 upid; | |
a2d57b35 JF |
147 | __u8 reserved:3; |
148 | __u8 mtid:5; | |
149 | char reserved1[2]; | |
e65f30e0 JF |
150 | __u32 group_mlu; |
151 | char group_name[8]; | |
a2d57b35 JF |
152 | char hardware_group_name[8]; |
153 | char reserved2[24]; | |
e65f30e0 JF |
154 | } __packed; |
155 | ||
156 | struct diag204_cpu_info { | |
157 | __u16 cpu_addr; | |
158 | char reserved1[2]; | |
159 | __u8 ctidx; | |
160 | __u8 cflag; | |
161 | __u16 weight; | |
162 | __u64 acc_time; | |
163 | __u64 lp_time; | |
164 | } __packed; | |
165 | ||
166 | struct diag204_x_cpu_info { | |
167 | __u16 cpu_addr; | |
168 | char reserved1[2]; | |
169 | __u8 ctidx; | |
170 | __u8 cflag; | |
171 | __u16 weight; | |
172 | __u64 acc_time; | |
173 | __u64 lp_time; | |
174 | __u16 min_weight; | |
175 | __u16 cur_weight; | |
176 | __u16 max_weight; | |
177 | char reseved2[2]; | |
178 | __u64 online_time; | |
179 | __u64 wait_time; | |
180 | __u32 pma_weight; | |
181 | __u32 polar_weight; | |
a2d57b35 JF |
182 | __u32 cpu_type_cap; |
183 | __u32 group_cpu_type_cap; | |
184 | char reserved3[32]; | |
e65f30e0 JF |
185 | } __packed; |
186 | ||
187 | struct diag204_phys_hdr { | |
188 | char reserved1[1]; | |
189 | __u8 cpus; | |
190 | char reserved2[6]; | |
191 | char mgm_name[8]; | |
192 | } __packed; | |
193 | ||
194 | struct diag204_x_phys_hdr { | |
195 | char reserved1[1]; | |
196 | __u8 cpus; | |
197 | char reserved2[6]; | |
198 | char mgm_name[8]; | |
199 | char reserved3[80]; | |
200 | } __packed; | |
201 | ||
202 | struct diag204_phys_cpu { | |
203 | __u16 cpu_addr; | |
204 | char reserved1[2]; | |
205 | __u8 ctidx; | |
206 | char reserved2[3]; | |
207 | __u64 mgm_time; | |
208 | char reserved3[8]; | |
209 | } __packed; | |
210 | ||
211 | struct diag204_x_phys_cpu { | |
212 | __u16 cpu_addr; | |
213 | char reserved1[2]; | |
214 | __u8 ctidx; | |
a2d57b35 JF |
215 | char reserved2[1]; |
216 | __u16 weight; | |
e65f30e0 JF |
217 | __u64 mgm_time; |
218 | char reserved3[80]; | |
219 | } __packed; | |
220 | ||
95ca2cb5 JF |
221 | struct diag204_x_part_block { |
222 | struct diag204_x_part_hdr hdr; | |
223 | struct diag204_x_cpu_info cpus[]; | |
224 | } __packed; | |
225 | ||
226 | struct diag204_x_phys_block { | |
227 | struct diag204_x_phys_hdr hdr; | |
228 | struct diag204_x_phys_cpu cpus[]; | |
229 | } __packed; | |
230 | ||
1b030478 JW |
231 | enum diag26c_sc { |
232 | DIAG26C_MAC_SERVICES = 0x00000030 | |
233 | }; | |
234 | ||
235 | enum diag26c_version { | |
236 | DIAG26C_VERSION2 = 0x00000002 /* z/VM 5.4.0 */ | |
237 | }; | |
238 | ||
239 | #define DIAG26C_GET_MAC 0x0000 | |
240 | struct diag26c_mac_req { | |
241 | u32 resp_buf_len; | |
242 | u32 resp_version; | |
243 | u16 op_code; | |
244 | u16 devno; | |
245 | u8 res[4]; | |
246 | }; | |
247 | ||
248 | struct diag26c_mac_resp { | |
249 | u32 version; | |
250 | u8 mac[ETH_ALEN]; | |
251 | u8 res[2]; | |
252 | } __aligned(8); | |
253 | ||
e65f30e0 | 254 | int diag204(unsigned long subcode, unsigned long size, void *addr); |
022bd2d1 | 255 | int diag224(void *ptr); |
1b030478 | 256 | int diag26c(void *req, void *resp, enum diag26c_sc subcode); |
0a87c5cf | 257 | #endif /* _ASM_S390_DIAG_H */ |