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 */
diag10_range(unsigned long start_pfn,unsigned long num_pfn)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:\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 #endif /* _ASM_S390_DIAG_H */
82