xref: /openbmc/linux/arch/s390/include/asm/diag.h (revision abfbd895)
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:\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