Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
[cascardo/linux.git] / arch / s390 / include / asm / diag.h
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
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
36 void diag_stat_inc(enum diag_stat_enum nr);
37 void diag_stat_inc_norecursion(enum diag_stat_enum nr);
38
39 /*
40  * Diagnose 10: Release page range
41  */
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
49         diag_stat_inc(DIAG_STAT_X010);
50         asm volatile(
51                 "0:     diag    %0,%1,0x10\n"
52                 "1:     nopr    %%r7\n"
53                 EX_TABLE(0b, 1b)
54                 EX_TABLE(1b, 1b)
55                 : : "a" (start_addr), "a" (end_addr));
56 }
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
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
100 enum diag204_cpu_flags {
101         DIAG204_CPU_ONLINE = 0x20,
102         DIAG204_CPU_CAPPED = 0x40,
103 };
104
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;
144         __u8  reserved:3;
145         __u8  mtid:5;
146         char  reserved1[2];
147         __u32 group_mlu;
148         char  group_name[8];
149         char  hardware_group_name[8];
150         char  reserved2[24];
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;
179         __u32 cpu_type_cap;
180         __u32 group_cpu_type_cap;
181         char  reserved3[32];
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;
212         char  reserved2[1];
213         __u16 weight;
214         __u64 mgm_time;
215         char  reserved3[80];
216 } __packed;
217
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
228 int diag204(unsigned long subcode, unsigned long size, void *addr);
229 int diag224(void *ptr);
230 #endif /* _ASM_S390_DIAG_H */