diff options
-rw-r--r-- | arch/s390/appldata/appldata.h | 16 | ||||
-rw-r--r-- | arch/s390/appldata/appldata_base.c | 81 | ||||
-rw-r--r-- | arch/s390/appldata/appldata_os.c | 1 | ||||
-rw-r--r-- | include/asm-s390/appldata.h | 90 |
4 files changed, 103 insertions, 85 deletions
diff --git a/arch/s390/appldata/appldata.h b/arch/s390/appldata/appldata.h index 71d65eb30650..0429481dea63 100644 --- a/arch/s390/appldata/appldata.h +++ b/arch/s390/appldata/appldata.h | |||
@@ -29,22 +29,6 @@ | |||
29 | #define CTL_APPLDATA_NET_SUM 2125 | 29 | #define CTL_APPLDATA_NET_SUM 2125 |
30 | #define CTL_APPLDATA_PROC 2126 | 30 | #define CTL_APPLDATA_PROC 2126 |
31 | 31 | ||
32 | #ifndef CONFIG_64BIT | ||
33 | |||
34 | #define APPLDATA_START_INTERVAL_REC 0x00 /* Function codes for */ | ||
35 | #define APPLDATA_STOP_REC 0x01 /* DIAG 0xDC */ | ||
36 | #define APPLDATA_GEN_EVENT_RECORD 0x02 | ||
37 | #define APPLDATA_START_CONFIG_REC 0x03 | ||
38 | |||
39 | #else | ||
40 | |||
41 | #define APPLDATA_START_INTERVAL_REC 0x80 | ||
42 | #define APPLDATA_STOP_REC 0x81 | ||
43 | #define APPLDATA_GEN_EVENT_RECORD 0x82 | ||
44 | #define APPLDATA_START_CONFIG_REC 0x83 | ||
45 | |||
46 | #endif /* CONFIG_64BIT */ | ||
47 | |||
48 | #define P_INFO(x...) printk(KERN_INFO MY_PRINT_NAME " info: " x) | 32 | #define P_INFO(x...) printk(KERN_INFO MY_PRINT_NAME " info: " x) |
49 | #define P_ERROR(x...) printk(KERN_ERR MY_PRINT_NAME " error: " x) | 33 | #define P_ERROR(x...) printk(KERN_ERR MY_PRINT_NAME " error: " x) |
50 | #define P_WARNING(x...) printk(KERN_WARNING MY_PRINT_NAME " status: " x) | 34 | #define P_WARNING(x...) printk(KERN_WARNING MY_PRINT_NAME " status: " x) |
diff --git a/arch/s390/appldata/appldata_base.c b/arch/s390/appldata/appldata_base.c index a0a94e0ef8d1..b69ed742f981 100644 --- a/arch/s390/appldata/appldata_base.c +++ b/arch/s390/appldata/appldata_base.c | |||
@@ -14,20 +14,20 @@ | |||
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
16 | #include <linux/errno.h> | 16 | #include <linux/errno.h> |
17 | #include <asm/uaccess.h> | ||
18 | #include <asm/io.h> | ||
19 | #include <asm/smp.h> | ||
20 | #include <linux/interrupt.h> | 17 | #include <linux/interrupt.h> |
21 | #include <linux/proc_fs.h> | 18 | #include <linux/proc_fs.h> |
22 | #include <linux/page-flags.h> | 19 | #include <linux/page-flags.h> |
23 | #include <linux/swap.h> | 20 | #include <linux/swap.h> |
24 | #include <linux/pagemap.h> | 21 | #include <linux/pagemap.h> |
25 | #include <linux/sysctl.h> | 22 | #include <linux/sysctl.h> |
26 | #include <asm/timer.h> | ||
27 | //#include <linux/kernel_stat.h> | ||
28 | #include <linux/notifier.h> | 23 | #include <linux/notifier.h> |
29 | #include <linux/cpu.h> | 24 | #include <linux/cpu.h> |
30 | #include <linux/workqueue.h> | 25 | #include <linux/workqueue.h> |
26 | #include <asm/appldata.h> | ||
27 | #include <asm/timer.h> | ||
28 | #include <asm/uaccess.h> | ||
29 | #include <asm/io.h> | ||
30 | #include <asm/smp.h> | ||
31 | 31 | ||
32 | #include "appldata.h" | 32 | #include "appldata.h" |
33 | 33 | ||
@@ -39,34 +39,6 @@ | |||
39 | 39 | ||
40 | #define TOD_MICRO 0x01000 /* nr. of TOD clock units | 40 | #define TOD_MICRO 0x01000 /* nr. of TOD clock units |
41 | for 1 microsecond */ | 41 | for 1 microsecond */ |
42 | |||
43 | /* | ||
44 | * Parameter list for DIAGNOSE X'DC' | ||
45 | */ | ||
46 | #ifndef CONFIG_64BIT | ||
47 | struct appldata_parameter_list { | ||
48 | u16 diag; /* The DIAGNOSE code X'00DC' */ | ||
49 | u8 function; /* The function code for the DIAGNOSE */ | ||
50 | u8 parlist_length; /* Length of the parameter list */ | ||
51 | u32 product_id_addr; /* Address of the 16-byte product ID */ | ||
52 | u16 reserved; | ||
53 | u16 buffer_length; /* Length of the application data buffer */ | ||
54 | u32 buffer_addr; /* Address of the application data buffer */ | ||
55 | }; | ||
56 | #else | ||
57 | struct appldata_parameter_list { | ||
58 | u16 diag; | ||
59 | u8 function; | ||
60 | u8 parlist_length; | ||
61 | u32 unused01; | ||
62 | u16 reserved; | ||
63 | u16 buffer_length; | ||
64 | u32 unused02; | ||
65 | u64 product_id_addr; | ||
66 | u64 buffer_addr; | ||
67 | }; | ||
68 | #endif /* CONFIG_64BIT */ | ||
69 | |||
70 | /* | 42 | /* |
71 | * /proc entries (sysctl) | 43 | * /proc entries (sysctl) |
72 | */ | 44 | */ |
@@ -181,46 +153,17 @@ static void appldata_work_fn(void *data) | |||
181 | int appldata_diag(char record_nr, u16 function, unsigned long buffer, | 153 | int appldata_diag(char record_nr, u16 function, unsigned long buffer, |
182 | u16 length, char *mod_lvl) | 154 | u16 length, char *mod_lvl) |
183 | { | 155 | { |
184 | unsigned long ry; | 156 | struct appldata_product_id id = { |
185 | struct appldata_product_id { | ||
186 | char prod_nr[7]; /* product nr. */ | ||
187 | char prod_fn[2]; /* product function */ | ||
188 | char record_nr; /* record nr. */ | ||
189 | char version_nr[2]; /* version */ | ||
190 | char release_nr[2]; /* release */ | ||
191 | char mod_lvl[2]; /* modification lvl. */ | ||
192 | } appldata_product_id = { | ||
193 | /* all strings are EBCDIC, record_nr is byte */ | ||
194 | .prod_nr = {0xD3, 0xC9, 0xD5, 0xE4, | 157 | .prod_nr = {0xD3, 0xC9, 0xD5, 0xE4, |
195 | 0xE7, 0xD2, 0xD9}, /* "LINUXKR" */ | 158 | 0xE7, 0xD2, 0xD9}, /* "LINUXKR" */ |
196 | .prod_fn = {0xD5, 0xD3}, /* "NL" */ | 159 | .prod_fn = 0xD5D3, /* "NL" */ |
197 | .record_nr = record_nr, | 160 | .record_nr = record_nr, |
198 | .version_nr = {0xF2, 0xF6}, /* "26" */ | 161 | .version_nr = 0xF2F6, /* "26" */ |
199 | .release_nr = {0xF0, 0xF1}, /* "01" */ | 162 | .release_nr = 0xF0F1, /* "01" */ |
200 | .mod_lvl = {mod_lvl[0], mod_lvl[1]}, | 163 | .mod_lvl = (mod_lvl[0]) << 8 | mod_lvl[1], |
201 | }; | ||
202 | struct appldata_parameter_list appldata_parameter_list = { | ||
203 | .diag = 0xDC, | ||
204 | .function = function, | ||
205 | .parlist_length = | ||
206 | sizeof(appldata_parameter_list), | ||
207 | .buffer_length = length, | ||
208 | .product_id_addr = | ||
209 | (unsigned long) &appldata_product_id, | ||
210 | .buffer_addr = virt_to_phys((void *) buffer) | ||
211 | }; | 164 | }; |
212 | 165 | ||
213 | if (!MACHINE_IS_VM) | 166 | return appldata_asm(&id, function, (void *) buffer, length); |
214 | return -ENOSYS; | ||
215 | ry = -1; | ||
216 | asm volatile( | ||
217 | "diag %1,%0,0xDC\n\t" | ||
218 | : "=d" (ry) | ||
219 | : "d" (&appldata_parameter_list), | ||
220 | "m" (appldata_parameter_list), | ||
221 | "m" (appldata_product_id) | ||
222 | : "cc"); | ||
223 | return (int) ry; | ||
224 | } | 167 | } |
225 | /************************ timer, work, DIAG <END> ****************************/ | 168 | /************************ timer, work, DIAG <END> ****************************/ |
226 | 169 | ||
diff --git a/arch/s390/appldata/appldata_os.c b/arch/s390/appldata/appldata_os.c index 161acc5c8a1b..76a15523ae9e 100644 --- a/arch/s390/appldata/appldata_os.c +++ b/arch/s390/appldata/appldata_os.c | |||
@@ -16,6 +16,7 @@ | |||
16 | #include <linux/kernel_stat.h> | 16 | #include <linux/kernel_stat.h> |
17 | #include <linux/netdevice.h> | 17 | #include <linux/netdevice.h> |
18 | #include <linux/sched.h> | 18 | #include <linux/sched.h> |
19 | #include <asm/appldata.h> | ||
19 | #include <asm/smp.h> | 20 | #include <asm/smp.h> |
20 | 21 | ||
21 | #include "appldata.h" | 22 | #include "appldata.h" |
diff --git a/include/asm-s390/appldata.h b/include/asm-s390/appldata.h new file mode 100644 index 000000000000..b1770703b706 --- /dev/null +++ b/include/asm-s390/appldata.h | |||
@@ -0,0 +1,90 @@ | |||
1 | /* | ||
2 | * include/asm-s390/appldata.h | ||
3 | * | ||
4 | * Copyright (C) IBM Corp. 2006 | ||
5 | * | ||
6 | * Author(s): Melissa Howland <melissah@us.ibm.com> | ||
7 | */ | ||
8 | |||
9 | #ifndef _ASM_S390_APPLDATA_H | ||
10 | #define _ASM_S390_APPLDATA_H | ||
11 | |||
12 | #include <asm/io.h> | ||
13 | |||
14 | #ifndef CONFIG_64BIT | ||
15 | |||
16 | #define APPLDATA_START_INTERVAL_REC 0x00 /* Function codes for */ | ||
17 | #define APPLDATA_STOP_REC 0x01 /* DIAG 0xDC */ | ||
18 | #define APPLDATA_GEN_EVENT_REC 0x02 | ||
19 | #define APPLDATA_START_CONFIG_REC 0x03 | ||
20 | |||
21 | /* | ||
22 | * Parameter list for DIAGNOSE X'DC' | ||
23 | */ | ||
24 | struct appldata_parameter_list { | ||
25 | u16 diag; /* The DIAGNOSE code X'00DC' */ | ||
26 | u8 function; /* The function code for the DIAGNOSE */ | ||
27 | u8 parlist_length; /* Length of the parameter list */ | ||
28 | u32 product_id_addr; /* Address of the 16-byte product ID */ | ||
29 | u16 reserved; | ||
30 | u16 buffer_length; /* Length of the application data buffer */ | ||
31 | u32 buffer_addr; /* Address of the application data buffer */ | ||
32 | } __attribute__ ((packed)); | ||
33 | |||
34 | #else /* CONFIG_64BIT */ | ||
35 | |||
36 | #define APPLDATA_START_INTERVAL_REC 0x80 | ||
37 | #define APPLDATA_STOP_REC 0x81 | ||
38 | #define APPLDATA_GEN_EVENT_REC 0x82 | ||
39 | #define APPLDATA_START_CONFIG_REC 0x83 | ||
40 | |||
41 | /* | ||
42 | * Parameter list for DIAGNOSE X'DC' | ||
43 | */ | ||
44 | struct appldata_parameter_list { | ||
45 | u16 diag; | ||
46 | u8 function; | ||
47 | u8 parlist_length; | ||
48 | u32 unused01; | ||
49 | u16 reserved; | ||
50 | u16 buffer_length; | ||
51 | u32 unused02; | ||
52 | u64 product_id_addr; | ||
53 | u64 buffer_addr; | ||
54 | } __attribute__ ((packed)); | ||
55 | |||
56 | #endif /* CONFIG_64BIT */ | ||
57 | |||
58 | struct appldata_product_id { | ||
59 | char prod_nr[7]; /* product number */ | ||
60 | u16 prod_fn; /* product function */ | ||
61 | u8 record_nr; /* record number */ | ||
62 | u16 version_nr; /* version */ | ||
63 | u16 release_nr; /* release */ | ||
64 | u16 mod_lvl; /* modification level */ | ||
65 | } __attribute__ ((packed)); | ||
66 | |||
67 | static inline int appldata_asm(struct appldata_product_id *id, | ||
68 | unsigned short fn, void *buffer, | ||
69 | unsigned short length) | ||
70 | { | ||
71 | struct appldata_parameter_list parm_list; | ||
72 | int ry; | ||
73 | |||
74 | if (!MACHINE_IS_VM) | ||
75 | return -ENOSYS; | ||
76 | parm_list.diag = 0xdc; | ||
77 | parm_list.function = fn; | ||
78 | parm_list.parlist_length = sizeof(parm_list); | ||
79 | parm_list.buffer_length = length; | ||
80 | parm_list.product_id_addr = (unsigned long) id; | ||
81 | parm_list.buffer_addr = virt_to_phys(buffer); | ||
82 | asm volatile( | ||
83 | "diag %1,%0,0xdc" | ||
84 | : "=d" (ry) | ||
85 | : "d" (&parm_list), "m" (parm_list), "m" (*id) | ||
86 | : "cc"); | ||
87 | return ry; | ||
88 | } | ||
89 | |||
90 | #endif /* _ASM_S390_APPLDATA_H */ | ||