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