diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-07-18 13:31:12 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-07-18 13:31:12 -0400 |
commit | 3e370b29d35fb01bfb92c2814d6f79bf6a2cb970 (patch) | |
tree | 3b8fb467d60bfe6a34686f4abdc3a60050ba40a4 /include/asm-s390 | |
parent | 88d1dce3a74367291f65a757fbdcaf17f042f30c (diff) | |
parent | 5b664cb235e97afbf34db9c4d77f08ebd725335e (diff) |
Merge branch 'linus' into x86/pci-ioapic-boot-irq-quirks
Conflicts:
drivers/pci/quirks.c
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'include/asm-s390')
-rw-r--r-- | include/asm-s390/Kbuild | 3 | ||||
-rw-r--r-- | include/asm-s390/airq.h | 4 | ||||
-rw-r--r-- | include/asm-s390/ccwdev.h | 12 | ||||
-rw-r--r-- | include/asm-s390/chpid.h | 5 | ||||
-rw-r--r-- | include/asm-s390/chsc.h | 127 | ||||
-rw-r--r-- | include/asm-s390/cio.h | 114 | ||||
-rw-r--r-- | include/asm-s390/elf.h | 51 | ||||
-rw-r--r-- | include/asm-s390/etr.h | 45 | ||||
-rw-r--r-- | include/asm-s390/fcx.h | 311 | ||||
-rw-r--r-- | include/asm-s390/ipl.h | 17 | ||||
-rw-r--r-- | include/asm-s390/isc.h | 25 | ||||
-rw-r--r-- | include/asm-s390/itcw.h | 30 | ||||
-rw-r--r-- | include/asm-s390/pgtable.h | 1 | ||||
-rw-r--r-- | include/asm-s390/processor.h | 24 | ||||
-rw-r--r-- | include/asm-s390/ptrace.h | 15 | ||||
-rw-r--r-- | include/asm-s390/qdio.h | 646 | ||||
-rw-r--r-- | include/asm-s390/schid.h | 31 | ||||
-rw-r--r-- | include/asm-s390/sclp.h | 4 | ||||
-rw-r--r-- | include/asm-s390/setup.h | 12 | ||||
-rw-r--r-- | include/asm-s390/sparsemem.h | 4 | ||||
-rw-r--r-- | include/asm-s390/timer.h | 12 | ||||
-rw-r--r-- | include/asm-s390/zcrypt.h | 2 |
22 files changed, 1087 insertions, 408 deletions
diff --git a/include/asm-s390/Kbuild b/include/asm-s390/Kbuild index 13c9805349f1..bb5e9edb9825 100644 --- a/include/asm-s390/Kbuild +++ b/include/asm-s390/Kbuild | |||
@@ -8,6 +8,9 @@ header-y += ucontext.h | |||
8 | header-y += vtoc.h | 8 | header-y += vtoc.h |
9 | header-y += zcrypt.h | 9 | header-y += zcrypt.h |
10 | header-y += kvm.h | 10 | header-y += kvm.h |
11 | header-y += chsc.h | ||
11 | 12 | ||
12 | unifdef-y += cmb.h | 13 | unifdef-y += cmb.h |
13 | unifdef-y += debug.h | 14 | unifdef-y += debug.h |
15 | unifdef-y += chpid.h | ||
16 | unifdef-y += schid.h | ||
diff --git a/include/asm-s390/airq.h b/include/asm-s390/airq.h index 41d028cb52a4..1ac80d6b0588 100644 --- a/include/asm-s390/airq.h +++ b/include/asm-s390/airq.h | |||
@@ -13,7 +13,7 @@ | |||
13 | 13 | ||
14 | typedef void (*adapter_int_handler_t)(void *, void *); | 14 | typedef void (*adapter_int_handler_t)(void *, void *); |
15 | 15 | ||
16 | void *s390_register_adapter_interrupt(adapter_int_handler_t, void *); | 16 | void *s390_register_adapter_interrupt(adapter_int_handler_t, void *, u8); |
17 | void s390_unregister_adapter_interrupt(void *); | 17 | void s390_unregister_adapter_interrupt(void *, u8); |
18 | 18 | ||
19 | #endif /* _ASM_S390_AIRQ_H */ | 19 | #endif /* _ASM_S390_AIRQ_H */ |
diff --git a/include/asm-s390/ccwdev.h b/include/asm-s390/ccwdev.h index 066aa70518ce..ba007d8df941 100644 --- a/include/asm-s390/ccwdev.h +++ b/include/asm-s390/ccwdev.h | |||
@@ -12,6 +12,7 @@ | |||
12 | 12 | ||
13 | #include <linux/device.h> | 13 | #include <linux/device.h> |
14 | #include <linux/mod_devicetable.h> | 14 | #include <linux/mod_devicetable.h> |
15 | #include <asm/fcx.h> | ||
15 | 16 | ||
16 | /* structs from asm/cio.h */ | 17 | /* structs from asm/cio.h */ |
17 | struct irb; | 18 | struct irb; |
@@ -157,6 +158,17 @@ extern int ccw_device_start_timeout_key(struct ccw_device *, struct ccw1 *, | |||
157 | extern int ccw_device_resume(struct ccw_device *); | 158 | extern int ccw_device_resume(struct ccw_device *); |
158 | extern int ccw_device_halt(struct ccw_device *, unsigned long); | 159 | extern int ccw_device_halt(struct ccw_device *, unsigned long); |
159 | extern int ccw_device_clear(struct ccw_device *, unsigned long); | 160 | extern int ccw_device_clear(struct ccw_device *, unsigned long); |
161 | int ccw_device_tm_start_key(struct ccw_device *cdev, struct tcw *tcw, | ||
162 | unsigned long intparm, u8 lpm, u8 key); | ||
163 | int ccw_device_tm_start_key(struct ccw_device *, struct tcw *, | ||
164 | unsigned long, u8, u8); | ||
165 | int ccw_device_tm_start_timeout_key(struct ccw_device *, struct tcw *, | ||
166 | unsigned long, u8, u8, int); | ||
167 | int ccw_device_tm_start(struct ccw_device *, struct tcw *, | ||
168 | unsigned long, u8); | ||
169 | int ccw_device_tm_start_timeout(struct ccw_device *, struct tcw *, | ||
170 | unsigned long, u8, int); | ||
171 | int ccw_device_tm_intrg(struct ccw_device *cdev); | ||
160 | 172 | ||
161 | extern int ccw_device_set_online(struct ccw_device *cdev); | 173 | extern int ccw_device_set_online(struct ccw_device *cdev); |
162 | extern int ccw_device_set_offline(struct ccw_device *cdev); | 174 | extern int ccw_device_set_offline(struct ccw_device *cdev); |
diff --git a/include/asm-s390/chpid.h b/include/asm-s390/chpid.h index b203336fd892..dfe3c7f3439a 100644 --- a/include/asm-s390/chpid.h +++ b/include/asm-s390/chpid.h | |||
@@ -10,7 +10,6 @@ | |||
10 | 10 | ||
11 | #include <linux/string.h> | 11 | #include <linux/string.h> |
12 | #include <asm/types.h> | 12 | #include <asm/types.h> |
13 | #include <asm/cio.h> | ||
14 | 13 | ||
15 | #define __MAX_CHPID 255 | 14 | #define __MAX_CHPID 255 |
16 | 15 | ||
@@ -21,6 +20,9 @@ struct chp_id { | |||
21 | u8 id; | 20 | u8 id; |
22 | } __attribute__((packed)); | 21 | } __attribute__((packed)); |
23 | 22 | ||
23 | #ifdef __KERNEL__ | ||
24 | #include <asm/cio.h> | ||
25 | |||
24 | static inline void chp_id_init(struct chp_id *chpid) | 26 | static inline void chp_id_init(struct chp_id *chpid) |
25 | { | 27 | { |
26 | memset(chpid, 0, sizeof(struct chp_id)); | 28 | memset(chpid, 0, sizeof(struct chp_id)); |
@@ -49,5 +51,6 @@ static inline int chp_id_is_valid(struct chp_id *chpid) | |||
49 | 51 | ||
50 | #define chp_id_for_each(c) \ | 52 | #define chp_id_for_each(c) \ |
51 | for (chp_id_init(c); chp_id_is_valid(c); chp_id_next(c)) | 53 | for (chp_id_init(c); chp_id_is_valid(c); chp_id_next(c)) |
54 | #endif /* __KERNEL */ | ||
52 | 55 | ||
53 | #endif /* _ASM_S390_CHPID_H */ | 56 | #endif /* _ASM_S390_CHPID_H */ |
diff --git a/include/asm-s390/chsc.h b/include/asm-s390/chsc.h new file mode 100644 index 000000000000..d38d0cf62d4b --- /dev/null +++ b/include/asm-s390/chsc.h | |||
@@ -0,0 +1,127 @@ | |||
1 | /* | ||
2 | * ioctl interface for /dev/chsc | ||
3 | * | ||
4 | * Copyright 2008 IBM Corp. | ||
5 | * Author(s): Cornelia Huck <cornelia.huck@de.ibm.com> | ||
6 | */ | ||
7 | |||
8 | #ifndef _ASM_CHSC_H | ||
9 | #define _ASM_CHSC_H | ||
10 | |||
11 | #include <asm/chpid.h> | ||
12 | #include <asm/schid.h> | ||
13 | |||
14 | struct chsc_async_header { | ||
15 | __u16 length; | ||
16 | __u16 code; | ||
17 | __u32 cmd_dependend; | ||
18 | __u32 key : 4; | ||
19 | __u32 : 28; | ||
20 | struct subchannel_id sid; | ||
21 | } __attribute__ ((packed)); | ||
22 | |||
23 | struct chsc_async_area { | ||
24 | struct chsc_async_header header; | ||
25 | __u8 data[PAGE_SIZE - 16 /* size of chsc_async_header */]; | ||
26 | } __attribute__ ((packed)); | ||
27 | |||
28 | |||
29 | struct chsc_response_struct { | ||
30 | __u16 length; | ||
31 | __u16 code; | ||
32 | __u32 parms; | ||
33 | __u8 data[PAGE_SIZE - 8]; | ||
34 | } __attribute__ ((packed)); | ||
35 | |||
36 | struct chsc_chp_cd { | ||
37 | struct chp_id chpid; | ||
38 | int m; | ||
39 | int fmt; | ||
40 | struct chsc_response_struct cpcb; | ||
41 | }; | ||
42 | |||
43 | struct chsc_cu_cd { | ||
44 | __u16 cun; | ||
45 | __u8 cssid; | ||
46 | int m; | ||
47 | int fmt; | ||
48 | struct chsc_response_struct cucb; | ||
49 | }; | ||
50 | |||
51 | struct chsc_sch_cud { | ||
52 | struct subchannel_id schid; | ||
53 | int fmt; | ||
54 | struct chsc_response_struct scub; | ||
55 | }; | ||
56 | |||
57 | struct conf_id { | ||
58 | int m; | ||
59 | __u8 cssid; | ||
60 | __u8 ssid; | ||
61 | }; | ||
62 | |||
63 | struct chsc_conf_info { | ||
64 | struct conf_id id; | ||
65 | int fmt; | ||
66 | struct chsc_response_struct scid; | ||
67 | }; | ||
68 | |||
69 | struct ccl_parm_chpid { | ||
70 | int m; | ||
71 | struct chp_id chp; | ||
72 | }; | ||
73 | |||
74 | struct ccl_parm_cssids { | ||
75 | __u8 f_cssid; | ||
76 | __u8 l_cssid; | ||
77 | }; | ||
78 | |||
79 | struct chsc_comp_list { | ||
80 | struct { | ||
81 | enum { | ||
82 | CCL_CU_ON_CHP = 1, | ||
83 | CCL_CHP_TYPE_CAP = 2, | ||
84 | CCL_CSS_IMG = 4, | ||
85 | CCL_CSS_IMG_CONF_CHAR = 5, | ||
86 | CCL_IOP_CHP = 6, | ||
87 | } ctype; | ||
88 | int fmt; | ||
89 | struct ccl_parm_chpid chpid; | ||
90 | struct ccl_parm_cssids cssids; | ||
91 | } req; | ||
92 | struct chsc_response_struct sccl; | ||
93 | }; | ||
94 | |||
95 | struct chsc_dcal { | ||
96 | struct { | ||
97 | enum { | ||
98 | DCAL_CSS_IID_PN = 4, | ||
99 | } atype; | ||
100 | __u32 list_parm[2]; | ||
101 | int fmt; | ||
102 | } req; | ||
103 | struct chsc_response_struct sdcal; | ||
104 | }; | ||
105 | |||
106 | struct chsc_cpd_info { | ||
107 | struct chp_id chpid; | ||
108 | int m; | ||
109 | int fmt; | ||
110 | int rfmt; | ||
111 | int c; | ||
112 | struct chsc_response_struct chpdb; | ||
113 | }; | ||
114 | |||
115 | #define CHSC_IOCTL_MAGIC 'c' | ||
116 | |||
117 | #define CHSC_START _IOWR(CHSC_IOCTL_MAGIC, 0x81, struct chsc_async_area) | ||
118 | #define CHSC_INFO_CHANNEL_PATH _IOWR(CHSC_IOCTL_MAGIC, 0x82, \ | ||
119 | struct chsc_chp_cd) | ||
120 | #define CHSC_INFO_CU _IOWR(CHSC_IOCTL_MAGIC, 0x83, struct chsc_cu_cd) | ||
121 | #define CHSC_INFO_SCH_CU _IOWR(CHSC_IOCTL_MAGIC, 0x84, struct chsc_sch_cud) | ||
122 | #define CHSC_INFO_CI _IOWR(CHSC_IOCTL_MAGIC, 0x85, struct chsc_conf_info) | ||
123 | #define CHSC_INFO_CCL _IOWR(CHSC_IOCTL_MAGIC, 0x86, struct chsc_comp_list) | ||
124 | #define CHSC_INFO_CPD _IOWR(CHSC_IOCTL_MAGIC, 0x87, struct chsc_cpd_info) | ||
125 | #define CHSC_INFO_DCAL _IOWR(CHSC_IOCTL_MAGIC, 0x88, struct chsc_dcal) | ||
126 | |||
127 | #endif | ||
diff --git a/include/asm-s390/cio.h b/include/asm-s390/cio.h index 0818ecd30ca6..6dccb071aec3 100644 --- a/include/asm-s390/cio.h +++ b/include/asm-s390/cio.h | |||
@@ -16,7 +16,7 @@ | |||
16 | #define __MAX_CSSID 0 | 16 | #define __MAX_CSSID 0 |
17 | 17 | ||
18 | /** | 18 | /** |
19 | * struct scsw - subchannel status word | 19 | * struct cmd_scsw - command-mode subchannel status word |
20 | * @key: subchannel key | 20 | * @key: subchannel key |
21 | * @sctl: suspend control | 21 | * @sctl: suspend control |
22 | * @eswf: esw format | 22 | * @eswf: esw format |
@@ -38,7 +38,7 @@ | |||
38 | * @cstat: subchannel status | 38 | * @cstat: subchannel status |
39 | * @count: residual count | 39 | * @count: residual count |
40 | */ | 40 | */ |
41 | struct scsw { | 41 | struct cmd_scsw { |
42 | __u32 key : 4; | 42 | __u32 key : 4; |
43 | __u32 sctl : 1; | 43 | __u32 sctl : 1; |
44 | __u32 eswf : 1; | 44 | __u32 eswf : 1; |
@@ -61,6 +61,114 @@ struct scsw { | |||
61 | __u32 count : 16; | 61 | __u32 count : 16; |
62 | } __attribute__ ((packed)); | 62 | } __attribute__ ((packed)); |
63 | 63 | ||
64 | /** | ||
65 | * struct tm_scsw - transport-mode subchannel status word | ||
66 | * @key: subchannel key | ||
67 | * @eswf: esw format | ||
68 | * @cc: deferred condition code | ||
69 | * @fmt: format | ||
70 | * @x: IRB-format control | ||
71 | * @q: interrogate-complete | ||
72 | * @ectl: extended control | ||
73 | * @pno: path not operational | ||
74 | * @fctl: function control | ||
75 | * @actl: activity control | ||
76 | * @stctl: status control | ||
77 | * @tcw: TCW address | ||
78 | * @dstat: device status | ||
79 | * @cstat: subchannel status | ||
80 | * @fcxs: FCX status | ||
81 | * @schxs: subchannel-extended status | ||
82 | */ | ||
83 | struct tm_scsw { | ||
84 | u32 key:4; | ||
85 | u32 :1; | ||
86 | u32 eswf:1; | ||
87 | u32 cc:2; | ||
88 | u32 fmt:3; | ||
89 | u32 x:1; | ||
90 | u32 q:1; | ||
91 | u32 :1; | ||
92 | u32 ectl:1; | ||
93 | u32 pno:1; | ||
94 | u32 :1; | ||
95 | u32 fctl:3; | ||
96 | u32 actl:7; | ||
97 | u32 stctl:5; | ||
98 | u32 tcw; | ||
99 | u32 dstat:8; | ||
100 | u32 cstat:8; | ||
101 | u32 fcxs:8; | ||
102 | u32 schxs:8; | ||
103 | } __attribute__ ((packed)); | ||
104 | |||
105 | /** | ||
106 | * union scsw - subchannel status word | ||
107 | * @cmd: command-mode SCSW | ||
108 | * @tm: transport-mode SCSW | ||
109 | */ | ||
110 | union scsw { | ||
111 | struct cmd_scsw cmd; | ||
112 | struct tm_scsw tm; | ||
113 | } __attribute__ ((packed)); | ||
114 | |||
115 | int scsw_is_tm(union scsw *scsw); | ||
116 | u32 scsw_key(union scsw *scsw); | ||
117 | u32 scsw_eswf(union scsw *scsw); | ||
118 | u32 scsw_cc(union scsw *scsw); | ||
119 | u32 scsw_ectl(union scsw *scsw); | ||
120 | u32 scsw_pno(union scsw *scsw); | ||
121 | u32 scsw_fctl(union scsw *scsw); | ||
122 | u32 scsw_actl(union scsw *scsw); | ||
123 | u32 scsw_stctl(union scsw *scsw); | ||
124 | u32 scsw_dstat(union scsw *scsw); | ||
125 | u32 scsw_cstat(union scsw *scsw); | ||
126 | int scsw_is_solicited(union scsw *scsw); | ||
127 | int scsw_is_valid_key(union scsw *scsw); | ||
128 | int scsw_is_valid_eswf(union scsw *scsw); | ||
129 | int scsw_is_valid_cc(union scsw *scsw); | ||
130 | int scsw_is_valid_ectl(union scsw *scsw); | ||
131 | int scsw_is_valid_pno(union scsw *scsw); | ||
132 | int scsw_is_valid_fctl(union scsw *scsw); | ||
133 | int scsw_is_valid_actl(union scsw *scsw); | ||
134 | int scsw_is_valid_stctl(union scsw *scsw); | ||
135 | int scsw_is_valid_dstat(union scsw *scsw); | ||
136 | int scsw_is_valid_cstat(union scsw *scsw); | ||
137 | int scsw_cmd_is_valid_key(union scsw *scsw); | ||
138 | int scsw_cmd_is_valid_sctl(union scsw *scsw); | ||
139 | int scsw_cmd_is_valid_eswf(union scsw *scsw); | ||
140 | int scsw_cmd_is_valid_cc(union scsw *scsw); | ||
141 | int scsw_cmd_is_valid_fmt(union scsw *scsw); | ||
142 | int scsw_cmd_is_valid_pfch(union scsw *scsw); | ||
143 | int scsw_cmd_is_valid_isic(union scsw *scsw); | ||
144 | int scsw_cmd_is_valid_alcc(union scsw *scsw); | ||
145 | int scsw_cmd_is_valid_ssi(union scsw *scsw); | ||
146 | int scsw_cmd_is_valid_zcc(union scsw *scsw); | ||
147 | int scsw_cmd_is_valid_ectl(union scsw *scsw); | ||
148 | int scsw_cmd_is_valid_pno(union scsw *scsw); | ||
149 | int scsw_cmd_is_valid_fctl(union scsw *scsw); | ||
150 | int scsw_cmd_is_valid_actl(union scsw *scsw); | ||
151 | int scsw_cmd_is_valid_stctl(union scsw *scsw); | ||
152 | int scsw_cmd_is_valid_dstat(union scsw *scsw); | ||
153 | int scsw_cmd_is_valid_cstat(union scsw *scsw); | ||
154 | int scsw_cmd_is_solicited(union scsw *scsw); | ||
155 | int scsw_tm_is_valid_key(union scsw *scsw); | ||
156 | int scsw_tm_is_valid_eswf(union scsw *scsw); | ||
157 | int scsw_tm_is_valid_cc(union scsw *scsw); | ||
158 | int scsw_tm_is_valid_fmt(union scsw *scsw); | ||
159 | int scsw_tm_is_valid_x(union scsw *scsw); | ||
160 | int scsw_tm_is_valid_q(union scsw *scsw); | ||
161 | int scsw_tm_is_valid_ectl(union scsw *scsw); | ||
162 | int scsw_tm_is_valid_pno(union scsw *scsw); | ||
163 | int scsw_tm_is_valid_fctl(union scsw *scsw); | ||
164 | int scsw_tm_is_valid_actl(union scsw *scsw); | ||
165 | int scsw_tm_is_valid_stctl(union scsw *scsw); | ||
166 | int scsw_tm_is_valid_dstat(union scsw *scsw); | ||
167 | int scsw_tm_is_valid_cstat(union scsw *scsw); | ||
168 | int scsw_tm_is_valid_fcxs(union scsw *scsw); | ||
169 | int scsw_tm_is_valid_schxs(union scsw *scsw); | ||
170 | int scsw_tm_is_solicited(union scsw *scsw); | ||
171 | |||
64 | #define SCSW_FCTL_CLEAR_FUNC 0x1 | 172 | #define SCSW_FCTL_CLEAR_FUNC 0x1 |
65 | #define SCSW_FCTL_HALT_FUNC 0x2 | 173 | #define SCSW_FCTL_HALT_FUNC 0x2 |
66 | #define SCSW_FCTL_START_FUNC 0x4 | 174 | #define SCSW_FCTL_START_FUNC 0x4 |
@@ -303,7 +411,7 @@ struct esw3 { | |||
303 | * if applicable). | 411 | * if applicable). |
304 | */ | 412 | */ |
305 | struct irb { | 413 | struct irb { |
306 | struct scsw scsw; | 414 | union scsw scsw; |
307 | union { | 415 | union { |
308 | struct esw0 esw0; | 416 | struct esw0 esw0; |
309 | struct esw1 esw1; | 417 | struct esw1 esw1; |
diff --git a/include/asm-s390/elf.h b/include/asm-s390/elf.h index b3ac262c4582..3cad56923815 100644 --- a/include/asm-s390/elf.h +++ b/include/asm-s390/elf.h | |||
@@ -113,6 +113,9 @@ | |||
113 | typedef s390_fp_regs elf_fpregset_t; | 113 | typedef s390_fp_regs elf_fpregset_t; |
114 | typedef s390_regs elf_gregset_t; | 114 | typedef s390_regs elf_gregset_t; |
115 | 115 | ||
116 | typedef s390_fp_regs compat_elf_fpregset_t; | ||
117 | typedef s390_compat_regs compat_elf_gregset_t; | ||
118 | |||
116 | #include <linux/sched.h> /* for task_struct */ | 119 | #include <linux/sched.h> /* for task_struct */ |
117 | #include <asm/system.h> /* for save_access_regs */ | 120 | #include <asm/system.h> /* for save_access_regs */ |
118 | #include <asm/mmu_context.h> | 121 | #include <asm/mmu_context.h> |
@@ -123,6 +126,10 @@ typedef s390_regs elf_gregset_t; | |||
123 | #define elf_check_arch(x) \ | 126 | #define elf_check_arch(x) \ |
124 | (((x)->e_machine == EM_S390 || (x)->e_machine == EM_S390_OLD) \ | 127 | (((x)->e_machine == EM_S390 || (x)->e_machine == EM_S390_OLD) \ |
125 | && (x)->e_ident[EI_CLASS] == ELF_CLASS) | 128 | && (x)->e_ident[EI_CLASS] == ELF_CLASS) |
129 | #define compat_elf_check_arch(x) \ | ||
130 | (((x)->e_machine == EM_S390 || (x)->e_machine == EM_S390_OLD) \ | ||
131 | && (x)->e_ident[EI_CLASS] == ELF_CLASS) | ||
132 | #define compat_start_thread start_thread31 | ||
126 | 133 | ||
127 | /* For SVR4/S390 the function pointer to be registered with `atexit` is | 134 | /* For SVR4/S390 the function pointer to be registered with `atexit` is |
128 | passed in R14. */ | 135 | passed in R14. */ |
@@ -131,6 +138,7 @@ typedef s390_regs elf_gregset_t; | |||
131 | _r->gprs[14] = 0; \ | 138 | _r->gprs[14] = 0; \ |
132 | } while (0) | 139 | } while (0) |
133 | 140 | ||
141 | #define CORE_DUMP_USE_REGSET | ||
134 | #define USE_ELF_CORE_DUMP | 142 | #define USE_ELF_CORE_DUMP |
135 | #define ELF_EXEC_PAGESIZE 4096 | 143 | #define ELF_EXEC_PAGESIZE 4096 |
136 | 144 | ||
@@ -140,44 +148,6 @@ typedef s390_regs elf_gregset_t; | |||
140 | that it will "exec", and that there is sufficient room for the brk. */ | 148 | that it will "exec", and that there is sufficient room for the brk. */ |
141 | #define ELF_ET_DYN_BASE (STACK_TOP / 3 * 2) | 149 | #define ELF_ET_DYN_BASE (STACK_TOP / 3 * 2) |
142 | 150 | ||
143 | /* Wow, the "main" arch needs arch dependent functions too.. :) */ | ||
144 | |||
145 | /* regs is struct pt_regs, pr_reg is elf_gregset_t (which is | ||
146 | now struct_user_regs, they are different) */ | ||
147 | |||
148 | static inline int dump_regs(struct pt_regs *ptregs, elf_gregset_t *regs) | ||
149 | { | ||
150 | memcpy(®s->psw, &ptregs->psw, sizeof(regs->psw)+sizeof(regs->gprs)); | ||
151 | save_access_regs(regs->acrs); | ||
152 | regs->orig_gpr2 = ptregs->orig_gpr2; | ||
153 | return 1; | ||
154 | } | ||
155 | |||
156 | #define ELF_CORE_COPY_REGS(pr_reg, regs) dump_regs(regs, &pr_reg); | ||
157 | |||
158 | static inline int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs) | ||
159 | { | ||
160 | struct pt_regs *ptregs = task_pt_regs(tsk); | ||
161 | memcpy(®s->psw, &ptregs->psw, sizeof(regs->psw)+sizeof(regs->gprs)); | ||
162 | memcpy(regs->acrs, tsk->thread.acrs, sizeof(regs->acrs)); | ||
163 | regs->orig_gpr2 = ptregs->orig_gpr2; | ||
164 | return 1; | ||
165 | } | ||
166 | |||
167 | #define ELF_CORE_COPY_TASK_REGS(tsk, regs) dump_task_regs(tsk, regs) | ||
168 | |||
169 | static inline int dump_task_fpu(struct task_struct *tsk, elf_fpregset_t *fpregs) | ||
170 | { | ||
171 | if (tsk == current) | ||
172 | save_fp_regs(fpregs); | ||
173 | else | ||
174 | memcpy(fpregs, &tsk->thread.fp_regs, sizeof(elf_fpregset_t)); | ||
175 | return 1; | ||
176 | } | ||
177 | |||
178 | #define ELF_CORE_COPY_FPREGS(tsk, fpregs) dump_task_fpu(tsk, fpregs) | ||
179 | |||
180 | |||
181 | /* This yields a mask that user programs can use to figure out what | 151 | /* This yields a mask that user programs can use to figure out what |
182 | instruction set this CPU supports. */ | 152 | instruction set this CPU supports. */ |
183 | 153 | ||
@@ -204,7 +174,10 @@ do { \ | |||
204 | set_personality(PER_SVR4); \ | 174 | set_personality(PER_SVR4); \ |
205 | else if (current->personality != PER_LINUX32) \ | 175 | else if (current->personality != PER_LINUX32) \ |
206 | set_personality(PER_LINUX); \ | 176 | set_personality(PER_LINUX); \ |
207 | clear_thread_flag(TIF_31BIT); \ | 177 | if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \ |
178 | set_thread_flag(TIF_31BIT); \ | ||
179 | else \ | ||
180 | clear_thread_flag(TIF_31BIT); \ | ||
208 | } while (0) | 181 | } while (0) |
209 | #endif /* __s390x__ */ | 182 | #endif /* __s390x__ */ |
210 | 183 | ||
diff --git a/include/asm-s390/etr.h b/include/asm-s390/etr.h index b498f19bb9a7..80ef58c61970 100644 --- a/include/asm-s390/etr.h +++ b/include/asm-s390/etr.h | |||
@@ -122,7 +122,7 @@ struct etr_aib { | |||
122 | } __attribute__ ((packed,aligned(8))); | 122 | } __attribute__ ((packed,aligned(8))); |
123 | 123 | ||
124 | /* ETR interruption parameter */ | 124 | /* ETR interruption parameter */ |
125 | struct etr_interruption_parameter { | 125 | struct etr_irq_parm { |
126 | unsigned int _pad0 : 8; | 126 | unsigned int _pad0 : 8; |
127 | unsigned int pc0 : 1; /* port 0 state change */ | 127 | unsigned int pc0 : 1; /* port 0 state change */ |
128 | unsigned int pc1 : 1; /* port 1 state change */ | 128 | unsigned int pc1 : 1; /* port 1 state change */ |
@@ -213,7 +213,46 @@ static inline int etr_ptff(void *ptff_block, unsigned int func) | |||
213 | #define ETR_PTFF_SGS 0x43 /* set gross steering rate */ | 213 | #define ETR_PTFF_SGS 0x43 /* set gross steering rate */ |
214 | 214 | ||
215 | /* Functions needed by the machine check handler */ | 215 | /* Functions needed by the machine check handler */ |
216 | extern void etr_switch_to_local(void); | 216 | void etr_switch_to_local(void); |
217 | extern void etr_sync_check(void); | 217 | void etr_sync_check(void); |
218 | |||
219 | /* STP interruption parameter */ | ||
220 | struct stp_irq_parm { | ||
221 | unsigned int _pad0 : 14; | ||
222 | unsigned int tsc : 1; /* Timing status change */ | ||
223 | unsigned int lac : 1; /* Link availability change */ | ||
224 | unsigned int tcpc : 1; /* Time control parameter change */ | ||
225 | unsigned int _pad2 : 15; | ||
226 | } __attribute__ ((packed)); | ||
227 | |||
228 | #define STP_OP_SYNC 1 | ||
229 | #define STP_OP_CTRL 3 | ||
230 | |||
231 | struct stp_sstpi { | ||
232 | unsigned int rsvd0; | ||
233 | unsigned int rsvd1 : 8; | ||
234 | unsigned int stratum : 8; | ||
235 | unsigned int vbits : 16; | ||
236 | unsigned int leaps : 16; | ||
237 | unsigned int tmd : 4; | ||
238 | unsigned int ctn : 4; | ||
239 | unsigned int rsvd2 : 3; | ||
240 | unsigned int c : 1; | ||
241 | unsigned int tst : 4; | ||
242 | unsigned int tzo : 16; | ||
243 | unsigned int dsto : 16; | ||
244 | unsigned int ctrl : 16; | ||
245 | unsigned int rsvd3 : 16; | ||
246 | unsigned int tto; | ||
247 | unsigned int rsvd4; | ||
248 | unsigned int ctnid[3]; | ||
249 | unsigned int rsvd5; | ||
250 | unsigned int todoff[4]; | ||
251 | unsigned int rsvd6[48]; | ||
252 | } __attribute__ ((packed)); | ||
253 | |||
254 | /* Functions needed by the machine check handler */ | ||
255 | void stp_sync_check(void); | ||
256 | void stp_island_check(void); | ||
218 | 257 | ||
219 | #endif /* __S390_ETR_H */ | 258 | #endif /* __S390_ETR_H */ |
diff --git a/include/asm-s390/fcx.h b/include/asm-s390/fcx.h new file mode 100644 index 000000000000..8be1f3a58042 --- /dev/null +++ b/include/asm-s390/fcx.h | |||
@@ -0,0 +1,311 @@ | |||
1 | /* | ||
2 | * Functions for assembling fcx enabled I/O control blocks. | ||
3 | * | ||
4 | * Copyright IBM Corp. 2008 | ||
5 | * Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com> | ||
6 | */ | ||
7 | |||
8 | #ifndef _ASM_S390_FCX_H | ||
9 | #define _ASM_S390_FCX_H _ASM_S390_FCX_H | ||
10 | |||
11 | #include <linux/types.h> | ||
12 | |||
13 | #define TCW_FORMAT_DEFAULT 0 | ||
14 | #define TCW_TIDAW_FORMAT_DEFAULT 0 | ||
15 | #define TCW_FLAGS_INPUT_TIDA 1 << (23 - 5) | ||
16 | #define TCW_FLAGS_TCCB_TIDA 1 << (23 - 6) | ||
17 | #define TCW_FLAGS_OUTPUT_TIDA 1 << (23 - 7) | ||
18 | #define TCW_FLAGS_TIDAW_FORMAT(x) ((x) & 3) << (23 - 9) | ||
19 | #define TCW_FLAGS_GET_TIDAW_FORMAT(x) (((x) >> (23 - 9)) & 3) | ||
20 | |||
21 | /** | ||
22 | * struct tcw - Transport Control Word (TCW) | ||
23 | * @format: TCW format | ||
24 | * @flags: TCW flags | ||
25 | * @tccbl: Transport-Command-Control-Block Length | ||
26 | * @r: Read Operations | ||
27 | * @w: Write Operations | ||
28 | * @output: Output-Data Address | ||
29 | * @input: Input-Data Address | ||
30 | * @tsb: Transport-Status-Block Address | ||
31 | * @tccb: Transport-Command-Control-Block Address | ||
32 | * @output_count: Output Count | ||
33 | * @input_count: Input Count | ||
34 | * @intrg: Interrogate TCW Address | ||
35 | */ | ||
36 | struct tcw { | ||
37 | u32 format:2; | ||
38 | u32 :6; | ||
39 | u32 flags:24; | ||
40 | u32 :8; | ||
41 | u32 tccbl:6; | ||
42 | u32 r:1; | ||
43 | u32 w:1; | ||
44 | u32 :16; | ||
45 | u64 output; | ||
46 | u64 input; | ||
47 | u64 tsb; | ||
48 | u64 tccb; | ||
49 | u32 output_count; | ||
50 | u32 input_count; | ||
51 | u32 :32; | ||
52 | u32 :32; | ||
53 | u32 :32; | ||
54 | u32 intrg; | ||
55 | } __attribute__ ((packed, aligned(64))); | ||
56 | |||
57 | #define TIDAW_FLAGS_LAST 1 << (7 - 0) | ||
58 | #define TIDAW_FLAGS_SKIP 1 << (7 - 1) | ||
59 | #define TIDAW_FLAGS_DATA_INT 1 << (7 - 2) | ||
60 | #define TIDAW_FLAGS_TTIC 1 << (7 - 3) | ||
61 | #define TIDAW_FLAGS_INSERT_CBC 1 << (7 - 4) | ||
62 | |||
63 | /** | ||
64 | * struct tidaw - Transport-Indirect-Addressing Word (TIDAW) | ||
65 | * @flags: TIDAW flags. Can be an arithmetic OR of the following constants: | ||
66 | * %TIDAW_FLAGS_LAST, %TIDAW_FLAGS_SKIP, %TIDAW_FLAGS_DATA_INT, | ||
67 | * %TIDAW_FLAGS_TTIC, %TIDAW_FLAGS_INSERT_CBC | ||
68 | * @count: Count | ||
69 | * @addr: Address | ||
70 | */ | ||
71 | struct tidaw { | ||
72 | u32 flags:8; | ||
73 | u32 :24; | ||
74 | u32 count; | ||
75 | u64 addr; | ||
76 | } __attribute__ ((packed, aligned(16))); | ||
77 | |||
78 | /** | ||
79 | * struct tsa_iostat - I/O-Status Transport-Status Area (IO-Stat TSA) | ||
80 | * @dev_time: Device Time | ||
81 | * @def_time: Defer Time | ||
82 | * @queue_time: Queue Time | ||
83 | * @dev_busy_time: Device-Busy Time | ||
84 | * @dev_act_time: Device-Active-Only Time | ||
85 | * @sense: Sense Data (if present) | ||
86 | */ | ||
87 | struct tsa_iostat { | ||
88 | u32 dev_time; | ||
89 | u32 def_time; | ||
90 | u32 queue_time; | ||
91 | u32 dev_busy_time; | ||
92 | u32 dev_act_time; | ||
93 | u8 sense[32]; | ||
94 | } __attribute__ ((packed)); | ||
95 | |||
96 | /** | ||
97 | * struct tsa_ddpcs - Device-Detected-Program-Check Transport-Status Area (DDPC TSA) | ||
98 | * @rc: Reason Code | ||
99 | * @rcq: Reason Code Qualifier | ||
100 | * @sense: Sense Data (if present) | ||
101 | */ | ||
102 | struct tsa_ddpc { | ||
103 | u32 :24; | ||
104 | u32 rc:8; | ||
105 | u8 rcq[16]; | ||
106 | u8 sense[32]; | ||
107 | } __attribute__ ((packed)); | ||
108 | |||
109 | #define TSA_INTRG_FLAGS_CU_STATE_VALID 1 << (7 - 0) | ||
110 | #define TSA_INTRG_FLAGS_DEV_STATE_VALID 1 << (7 - 1) | ||
111 | #define TSA_INTRG_FLAGS_OP_STATE_VALID 1 << (7 - 2) | ||
112 | |||
113 | /** | ||
114 | * struct tsa_intrg - Interrogate Transport-Status Area (Intrg. TSA) | ||
115 | * @format: Format | ||
116 | * @flags: Flags. Can be an arithmetic OR of the following constants: | ||
117 | * %TSA_INTRG_FLAGS_CU_STATE_VALID, %TSA_INTRG_FLAGS_DEV_STATE_VALID, | ||
118 | * %TSA_INTRG_FLAGS_OP_STATE_VALID | ||
119 | * @cu_state: Controle-Unit State | ||
120 | * @dev_state: Device State | ||
121 | * @op_state: Operation State | ||
122 | * @sd_info: State-Dependent Information | ||
123 | * @dl_id: Device-Level Identifier | ||
124 | * @dd_data: Device-Dependent Data | ||
125 | */ | ||
126 | struct tsa_intrg { | ||
127 | u32 format:8; | ||
128 | u32 flags:8; | ||
129 | u32 cu_state:8; | ||
130 | u32 dev_state:8; | ||
131 | u32 op_state:8; | ||
132 | u32 :24; | ||
133 | u8 sd_info[12]; | ||
134 | u32 dl_id; | ||
135 | u8 dd_data[28]; | ||
136 | } __attribute__ ((packed)); | ||
137 | |||
138 | #define TSB_FORMAT_NONE 0 | ||
139 | #define TSB_FORMAT_IOSTAT 1 | ||
140 | #define TSB_FORMAT_DDPC 2 | ||
141 | #define TSB_FORMAT_INTRG 3 | ||
142 | |||
143 | #define TSB_FLAGS_DCW_OFFSET_VALID 1 << (7 - 0) | ||
144 | #define TSB_FLAGS_COUNT_VALID 1 << (7 - 1) | ||
145 | #define TSB_FLAGS_CACHE_MISS 1 << (7 - 2) | ||
146 | #define TSB_FLAGS_TIME_VALID 1 << (7 - 3) | ||
147 | #define TSB_FLAGS_FORMAT(x) ((x) & 7) | ||
148 | #define TSB_FORMAT(t) ((t)->flags & 7) | ||
149 | |||
150 | /** | ||
151 | * struct tsb - Transport-Status Block (TSB) | ||
152 | * @length: Length | ||
153 | * @flags: Flags. Can be an arithmetic OR of the following constants: | ||
154 | * %TSB_FLAGS_DCW_OFFSET_VALID, %TSB_FLAGS_COUNT_VALID, %TSB_FLAGS_CACHE_MISS, | ||
155 | * %TSB_FLAGS_TIME_VALID | ||
156 | * @dcw_offset: DCW Offset | ||
157 | * @count: Count | ||
158 | * @tsa: Transport-Status-Area | ||
159 | */ | ||
160 | struct tsb { | ||
161 | u32 length:8; | ||
162 | u32 flags:8; | ||
163 | u32 dcw_offset:16; | ||
164 | u32 count; | ||
165 | u32 :32; | ||
166 | union { | ||
167 | struct tsa_iostat iostat; | ||
168 | struct tsa_ddpc ddpc; | ||
169 | struct tsa_intrg intrg; | ||
170 | } __attribute__ ((packed)) tsa; | ||
171 | } __attribute__ ((packed, aligned(8))); | ||
172 | |||
173 | #define DCW_INTRG_FORMAT_DEFAULT 0 | ||
174 | |||
175 | #define DCW_INTRG_RC_UNSPECIFIED 0 | ||
176 | #define DCW_INTRG_RC_TIMEOUT 1 | ||
177 | |||
178 | #define DCW_INTRG_RCQ_UNSPECIFIED 0 | ||
179 | #define DCW_INTRG_RCQ_PRIMARY 1 | ||
180 | #define DCW_INTRG_RCQ_SECONDARY 2 | ||
181 | |||
182 | #define DCW_INTRG_FLAGS_MPM 1 < (7 - 0) | ||
183 | #define DCW_INTRG_FLAGS_PPR 1 < (7 - 1) | ||
184 | #define DCW_INTRG_FLAGS_CRIT 1 < (7 - 2) | ||
185 | |||
186 | /** | ||
187 | * struct dcw_intrg_data - Interrogate DCW data | ||
188 | * @format: Format. Should be %DCW_INTRG_FORMAT_DEFAULT | ||
189 | * @rc: Reason Code. Can be one of %DCW_INTRG_RC_UNSPECIFIED, | ||
190 | * %DCW_INTRG_RC_TIMEOUT | ||
191 | * @rcq: Reason Code Qualifier: Can be one of %DCW_INTRG_RCQ_UNSPECIFIED, | ||
192 | * %DCW_INTRG_RCQ_PRIMARY, %DCW_INTRG_RCQ_SECONDARY | ||
193 | * @lpm: Logical-Path Mask | ||
194 | * @pam: Path-Available Mask | ||
195 | * @pim: Path-Installed Mask | ||
196 | * @timeout: Timeout | ||
197 | * @flags: Flags. Can be an arithmetic OR of %DCW_INTRG_FLAGS_MPM, | ||
198 | * %DCW_INTRG_FLAGS_PPR, %DCW_INTRG_FLAGS_CRIT | ||
199 | * @time: Time | ||
200 | * @prog_id: Program Identifier | ||
201 | * @prog_data: Program-Dependent Data | ||
202 | */ | ||
203 | struct dcw_intrg_data { | ||
204 | u32 format:8; | ||
205 | u32 rc:8; | ||
206 | u32 rcq:8; | ||
207 | u32 lpm:8; | ||
208 | u32 pam:8; | ||
209 | u32 pim:8; | ||
210 | u32 timeout:16; | ||
211 | u32 flags:8; | ||
212 | u32 :24; | ||
213 | u32 :32; | ||
214 | u64 time; | ||
215 | u64 prog_id; | ||
216 | u8 prog_data[0]; | ||
217 | } __attribute__ ((packed)); | ||
218 | |||
219 | #define DCW_FLAGS_CC 1 << (7 - 1) | ||
220 | |||
221 | #define DCW_CMD_WRITE 0x01 | ||
222 | #define DCW_CMD_READ 0x02 | ||
223 | #define DCW_CMD_CONTROL 0x03 | ||
224 | #define DCW_CMD_SENSE 0x04 | ||
225 | #define DCW_CMD_SENSE_ID 0xe4 | ||
226 | #define DCW_CMD_INTRG 0x40 | ||
227 | |||
228 | /** | ||
229 | * struct dcw - Device-Command Word (DCW) | ||
230 | * @cmd: Command Code. Can be one of %DCW_CMD_WRITE, %DCW_CMD_READ, | ||
231 | * %DCW_CMD_CONTROL, %DCW_CMD_SENSE, %DCW_CMD_SENSE_ID, %DCW_CMD_INTRG | ||
232 | * @flags: Flags. Can be an arithmetic OR of %DCW_FLAGS_CC | ||
233 | * @cd_count: Control-Data Count | ||
234 | * @count: Count | ||
235 | * @cd: Control Data | ||
236 | */ | ||
237 | struct dcw { | ||
238 | u32 cmd:8; | ||
239 | u32 flags:8; | ||
240 | u32 :8; | ||
241 | u32 cd_count:8; | ||
242 | u32 count; | ||
243 | u8 cd[0]; | ||
244 | } __attribute__ ((packed)); | ||
245 | |||
246 | #define TCCB_FORMAT_DEFAULT 0x7f | ||
247 | #define TCCB_MAX_DCW 30 | ||
248 | #define TCCB_MAX_SIZE (sizeof(struct tccb_tcah) + \ | ||
249 | TCCB_MAX_DCW * sizeof(struct dcw) + \ | ||
250 | sizeof(struct tccb_tcat)) | ||
251 | #define TCCB_SAC_DEFAULT 0xf901 | ||
252 | #define TCCB_SAC_INTRG 0xf902 | ||
253 | |||
254 | /** | ||
255 | * struct tccb_tcah - Transport-Command-Area Header (TCAH) | ||
256 | * @format: Format. Should be %TCCB_FORMAT_DEFAULT | ||
257 | * @tcal: Transport-Command-Area Length | ||
258 | * @sac: Service-Action Code. Can be one of %TCCB_SAC_DEFAULT, %TCCB_SAC_INTRG | ||
259 | * @prio: Priority | ||
260 | */ | ||
261 | struct tccb_tcah { | ||
262 | u32 format:8; | ||
263 | u32 :24; | ||
264 | u32 :24; | ||
265 | u32 tcal:8; | ||
266 | u32 sac:16; | ||
267 | u32 :8; | ||
268 | u32 prio:8; | ||
269 | u32 :32; | ||
270 | } __attribute__ ((packed)); | ||
271 | |||
272 | /** | ||
273 | * struct tccb_tcat - Transport-Command-Area Trailer (TCAT) | ||
274 | * @count: Transport Count | ||
275 | */ | ||
276 | struct tccb_tcat { | ||
277 | u32 :32; | ||
278 | u32 count; | ||
279 | } __attribute__ ((packed)); | ||
280 | |||
281 | /** | ||
282 | * struct tccb - (partial) Transport-Command-Control Block (TCCB) | ||
283 | * @tcah: TCAH | ||
284 | * @tca: Transport-Command Area | ||
285 | */ | ||
286 | struct tccb { | ||
287 | struct tccb_tcah tcah; | ||
288 | u8 tca[0]; | ||
289 | } __attribute__ ((packed, aligned(8))); | ||
290 | |||
291 | struct tcw *tcw_get_intrg(struct tcw *tcw); | ||
292 | void *tcw_get_data(struct tcw *tcw); | ||
293 | struct tccb *tcw_get_tccb(struct tcw *tcw); | ||
294 | struct tsb *tcw_get_tsb(struct tcw *tcw); | ||
295 | |||
296 | void tcw_init(struct tcw *tcw, int r, int w); | ||
297 | void tcw_finalize(struct tcw *tcw, int num_tidaws); | ||
298 | |||
299 | void tcw_set_intrg(struct tcw *tcw, struct tcw *intrg_tcw); | ||
300 | void tcw_set_data(struct tcw *tcw, void *data, int use_tidal); | ||
301 | void tcw_set_tccb(struct tcw *tcw, struct tccb *tccb); | ||
302 | void tcw_set_tsb(struct tcw *tcw, struct tsb *tsb); | ||
303 | |||
304 | void tccb_init(struct tccb *tccb, size_t tccb_size, u32 sac); | ||
305 | void tsb_init(struct tsb *tsb); | ||
306 | struct dcw *tccb_add_dcw(struct tccb *tccb, size_t tccb_size, u8 cmd, u8 flags, | ||
307 | void *cd, u8 cd_count, u32 count); | ||
308 | struct tidaw *tcw_add_tidaw(struct tcw *tcw, int num_tidaws, u8 flags, | ||
309 | void *addr, u32 count); | ||
310 | |||
311 | #endif /* _ASM_S390_FCX_H */ | ||
diff --git a/include/asm-s390/ipl.h b/include/asm-s390/ipl.h index c1b2e50392bb..eaca6dff5405 100644 --- a/include/asm-s390/ipl.h +++ b/include/asm-s390/ipl.h | |||
@@ -56,15 +56,19 @@ struct ipl_block_fcp { | |||
56 | u8 scp_data[]; | 56 | u8 scp_data[]; |
57 | } __attribute__((packed)); | 57 | } __attribute__((packed)); |
58 | 58 | ||
59 | #define DIAG308_VMPARM_SIZE 64 | ||
60 | |||
59 | struct ipl_block_ccw { | 61 | struct ipl_block_ccw { |
60 | u8 load_param[8]; | 62 | u8 load_parm[8]; |
61 | u8 reserved1[84]; | 63 | u8 reserved1[84]; |
62 | u8 reserved2[2]; | 64 | u8 reserved2[2]; |
63 | u16 devno; | 65 | u16 devno; |
64 | u8 vm_flags; | 66 | u8 vm_flags; |
65 | u8 reserved3[3]; | 67 | u8 reserved3[3]; |
66 | u32 vm_parm_len; | 68 | u32 vm_parm_len; |
67 | u8 reserved4[80]; | 69 | u8 nss_name[8]; |
70 | u8 vm_parm[DIAG308_VMPARM_SIZE]; | ||
71 | u8 reserved4[8]; | ||
68 | } __attribute__((packed)); | 72 | } __attribute__((packed)); |
69 | 73 | ||
70 | struct ipl_parameter_block { | 74 | struct ipl_parameter_block { |
@@ -73,7 +77,7 @@ struct ipl_parameter_block { | |||
73 | struct ipl_block_fcp fcp; | 77 | struct ipl_block_fcp fcp; |
74 | struct ipl_block_ccw ccw; | 78 | struct ipl_block_ccw ccw; |
75 | } ipl_info; | 79 | } ipl_info; |
76 | } __attribute__((packed)); | 80 | } __attribute__((packed,aligned(4096))); |
77 | 81 | ||
78 | /* | 82 | /* |
79 | * IPL validity flags | 83 | * IPL validity flags |
@@ -86,6 +90,8 @@ extern void do_reipl(void); | |||
86 | extern void do_halt(void); | 90 | extern void do_halt(void); |
87 | extern void do_poff(void); | 91 | extern void do_poff(void); |
88 | extern void ipl_save_parameters(void); | 92 | extern void ipl_save_parameters(void); |
93 | extern void ipl_update_parameters(void); | ||
94 | extern void get_ipl_vmparm(char *); | ||
89 | 95 | ||
90 | enum { | 96 | enum { |
91 | IPL_DEVNO_VALID = 1, | 97 | IPL_DEVNO_VALID = 1, |
@@ -147,6 +153,11 @@ enum diag308_flags { | |||
147 | DIAG308_FLAGS_LP_VALID = 0x80, | 153 | DIAG308_FLAGS_LP_VALID = 0x80, |
148 | }; | 154 | }; |
149 | 155 | ||
156 | enum diag308_vm_flags { | ||
157 | DIAG308_VM_FLAGS_NSS_VALID = 0x80, | ||
158 | DIAG308_VM_FLAGS_VP_VALID = 0x40, | ||
159 | }; | ||
160 | |||
150 | enum diag308_rc { | 161 | enum diag308_rc { |
151 | DIAG308_RC_OK = 1, | 162 | DIAG308_RC_OK = 1, |
152 | }; | 163 | }; |
diff --git a/include/asm-s390/isc.h b/include/asm-s390/isc.h new file mode 100644 index 000000000000..34bb8916db4f --- /dev/null +++ b/include/asm-s390/isc.h | |||
@@ -0,0 +1,25 @@ | |||
1 | #ifndef _ASM_S390_ISC_H | ||
2 | #define _ASM_S390_ISC_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | |||
6 | /* | ||
7 | * I/O interruption subclasses used by drivers. | ||
8 | * Please add all used iscs here so that it is possible to distribute | ||
9 | * isc usage between drivers. | ||
10 | * Reminder: 0 is highest priority, 7 lowest. | ||
11 | */ | ||
12 | #define MAX_ISC 7 | ||
13 | |||
14 | /* Regular I/O interrupts. */ | ||
15 | #define IO_SCH_ISC 3 /* regular I/O subchannels */ | ||
16 | #define CONSOLE_ISC 1 /* console I/O subchannel */ | ||
17 | #define CHSC_SCH_ISC 7 /* CHSC subchannels */ | ||
18 | /* Adapter interrupts. */ | ||
19 | #define QDIO_AIRQ_ISC IO_SCH_ISC /* I/O subchannel in qdio mode */ | ||
20 | |||
21 | /* Functions for registration of I/O interruption subclasses */ | ||
22 | void isc_register(unsigned int isc); | ||
23 | void isc_unregister(unsigned int isc); | ||
24 | |||
25 | #endif /* _ASM_S390_ISC_H */ | ||
diff --git a/include/asm-s390/itcw.h b/include/asm-s390/itcw.h new file mode 100644 index 000000000000..a9bc5c36b32a --- /dev/null +++ b/include/asm-s390/itcw.h | |||
@@ -0,0 +1,30 @@ | |||
1 | /* | ||
2 | * Functions for incremental construction of fcx enabled I/O control blocks. | ||
3 | * | ||
4 | * Copyright IBM Corp. 2008 | ||
5 | * Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com> | ||
6 | */ | ||
7 | |||
8 | #ifndef _ASM_S390_ITCW_H | ||
9 | #define _ASM_S390_ITCW_H _ASM_S390_ITCW_H | ||
10 | |||
11 | #include <linux/types.h> | ||
12 | #include <asm/fcx.h> | ||
13 | |||
14 | #define ITCW_OP_READ 0 | ||
15 | #define ITCW_OP_WRITE 1 | ||
16 | |||
17 | struct itcw; | ||
18 | |||
19 | struct tcw *itcw_get_tcw(struct itcw *itcw); | ||
20 | size_t itcw_calc_size(int intrg, int max_tidaws, int intrg_max_tidaws); | ||
21 | struct itcw *itcw_init(void *buffer, size_t size, int op, int intrg, | ||
22 | int max_tidaws, int intrg_max_tidaws); | ||
23 | struct dcw *itcw_add_dcw(struct itcw *itcw, u8 cmd, u8 flags, void *cd, | ||
24 | u8 cd_count, u32 count); | ||
25 | struct tidaw *itcw_add_tidaw(struct itcw *itcw, u8 flags, void *addr, | ||
26 | u32 count); | ||
27 | void itcw_set_data(struct itcw *itcw, void *addr, int use_tidal); | ||
28 | void itcw_finalize(struct itcw *itcw); | ||
29 | |||
30 | #endif /* _ASM_S390_ITCW_H */ | ||
diff --git a/include/asm-s390/pgtable.h b/include/asm-s390/pgtable.h index bd0ea191dfa9..0bdb704ae051 100644 --- a/include/asm-s390/pgtable.h +++ b/include/asm-s390/pgtable.h | |||
@@ -29,6 +29,7 @@ | |||
29 | * the S390 page table tree. | 29 | * the S390 page table tree. |
30 | */ | 30 | */ |
31 | #ifndef __ASSEMBLY__ | 31 | #ifndef __ASSEMBLY__ |
32 | #include <linux/sched.h> | ||
32 | #include <linux/mm_types.h> | 33 | #include <linux/mm_types.h> |
33 | #include <asm/bitops.h> | 34 | #include <asm/bitops.h> |
34 | #include <asm/bug.h> | 35 | #include <asm/bug.h> |
diff --git a/include/asm-s390/processor.h b/include/asm-s390/processor.h index a00f79dd323b..4af80af2a88f 100644 --- a/include/asm-s390/processor.h +++ b/include/asm-s390/processor.h | |||
@@ -143,11 +143,19 @@ struct stack_frame { | |||
143 | /* | 143 | /* |
144 | * Do necessary setup to start up a new thread. | 144 | * Do necessary setup to start up a new thread. |
145 | */ | 145 | */ |
146 | #define start_thread(regs, new_psw, new_stackp) do { \ | 146 | #define start_thread(regs, new_psw, new_stackp) do { \ |
147 | set_fs(USER_DS); \ | 147 | set_fs(USER_DS); \ |
148 | regs->psw.mask = psw_user_bits; \ | 148 | regs->psw.mask = psw_user_bits; \ |
149 | regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ | 149 | regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ |
150 | regs->gprs[15] = new_stackp ; \ | 150 | regs->gprs[15] = new_stackp; \ |
151 | } while (0) | ||
152 | |||
153 | #define start_thread31(regs, new_psw, new_stackp) do { \ | ||
154 | set_fs(USER_DS); \ | ||
155 | regs->psw.mask = psw_user32_bits; \ | ||
156 | regs->psw.addr = new_psw | PSW_ADDR_AMODE; \ | ||
157 | regs->gprs[15] = new_stackp; \ | ||
158 | crst_table_downgrade(current->mm, 1UL << 31); \ | ||
151 | } while (0) | 159 | } while (0) |
152 | 160 | ||
153 | /* Forward declaration, a strange C thing */ | 161 | /* Forward declaration, a strange C thing */ |
@@ -328,16 +336,6 @@ extern void (*s390_base_mcck_handler_fn)(void); | |||
328 | extern void (*s390_base_pgm_handler_fn)(void); | 336 | extern void (*s390_base_pgm_handler_fn)(void); |
329 | extern void (*s390_base_ext_handler_fn)(void); | 337 | extern void (*s390_base_ext_handler_fn)(void); |
330 | 338 | ||
331 | /* | ||
332 | * CPU idle notifier chain. | ||
333 | */ | ||
334 | #define S390_CPU_IDLE 0 | ||
335 | #define S390_CPU_NOT_IDLE 1 | ||
336 | |||
337 | struct notifier_block; | ||
338 | int register_idle_notifier(struct notifier_block *nb); | ||
339 | int unregister_idle_notifier(struct notifier_block *nb); | ||
340 | |||
341 | #define ARCH_LOW_ADDRESS_LIMIT 0x7fffffffUL | 339 | #define ARCH_LOW_ADDRESS_LIMIT 0x7fffffffUL |
342 | 340 | ||
343 | #endif | 341 | #endif |
diff --git a/include/asm-s390/ptrace.h b/include/asm-s390/ptrace.h index d7d4e2eb3e6f..af2c9ac28a07 100644 --- a/include/asm-s390/ptrace.h +++ b/include/asm-s390/ptrace.h | |||
@@ -215,6 +215,12 @@ typedef struct | |||
215 | unsigned long addr; | 215 | unsigned long addr; |
216 | } __attribute__ ((aligned(8))) psw_t; | 216 | } __attribute__ ((aligned(8))) psw_t; |
217 | 217 | ||
218 | typedef struct | ||
219 | { | ||
220 | __u32 mask; | ||
221 | __u32 addr; | ||
222 | } __attribute__ ((aligned(8))) psw_compat_t; | ||
223 | |||
218 | #ifndef __s390x__ | 224 | #ifndef __s390x__ |
219 | 225 | ||
220 | #define PSW_MASK_PER 0x40000000UL | 226 | #define PSW_MASK_PER 0x40000000UL |
@@ -292,6 +298,15 @@ typedef struct | |||
292 | unsigned long orig_gpr2; | 298 | unsigned long orig_gpr2; |
293 | } s390_regs; | 299 | } s390_regs; |
294 | 300 | ||
301 | typedef struct | ||
302 | { | ||
303 | psw_compat_t psw; | ||
304 | __u32 gprs[NUM_GPRS]; | ||
305 | __u32 acrs[NUM_ACRS]; | ||
306 | __u32 orig_gpr2; | ||
307 | } s390_compat_regs; | ||
308 | |||
309 | |||
295 | #ifdef __KERNEL__ | 310 | #ifdef __KERNEL__ |
296 | #include <asm/setup.h> | 311 | #include <asm/setup.h> |
297 | #include <asm/page.h> | 312 | #include <asm/page.h> |
diff --git a/include/asm-s390/qdio.h b/include/asm-s390/qdio.h index 11240342a0f4..6813772171f2 100644 --- a/include/asm-s390/qdio.h +++ b/include/asm-s390/qdio.h | |||
@@ -1,404 +1,382 @@ | |||
1 | /* | 1 | /* |
2 | * linux/include/asm-s390/qdio.h | 2 | * linux/include/asm-s390/qdio.h |
3 | * | 3 | * |
4 | * Linux for S/390 QDIO base support, Hipersocket base support | 4 | * Copyright 2000,2008 IBM Corp. |
5 | * version 2 | ||
6 | * | ||
7 | * Copyright 2000,2002 IBM Corporation | ||
8 | * Author(s): Utz Bacher <utz.bacher@de.ibm.com> | 5 | * Author(s): Utz Bacher <utz.bacher@de.ibm.com> |
6 | * Jan Glauber <jang@linux.vnet.ibm.com> | ||
9 | * | 7 | * |
10 | */ | 8 | */ |
11 | #ifndef __QDIO_H__ | 9 | #ifndef __QDIO_H__ |
12 | #define __QDIO_H__ | 10 | #define __QDIO_H__ |
13 | 11 | ||
14 | /* note, that most of the typedef's are from ingo. */ | ||
15 | |||
16 | #include <linux/interrupt.h> | 12 | #include <linux/interrupt.h> |
17 | #include <asm/cio.h> | 13 | #include <asm/cio.h> |
18 | #include <asm/ccwdev.h> | 14 | #include <asm/ccwdev.h> |
19 | 15 | ||
20 | #define QDIO_NAME "qdio " | 16 | #define QDIO_MAX_QUEUES_PER_IRQ 32 |
21 | 17 | #define QDIO_MAX_BUFFERS_PER_Q 128 | |
22 | #ifndef __s390x__ | 18 | #define QDIO_MAX_BUFFERS_MASK (QDIO_MAX_BUFFERS_PER_Q - 1) |
23 | #define QDIO_32_BIT | 19 | #define QDIO_MAX_ELEMENTS_PER_BUFFER 16 |
24 | #endif /* __s390x__ */ | 20 | #define QDIO_SBAL_SIZE 256 |
25 | 21 | ||
26 | /**** CONSTANTS, that are relied on without using these symbols *****/ | 22 | #define QDIO_QETH_QFMT 0 |
27 | #define QDIO_MAX_QUEUES_PER_IRQ 32 /* used in width of unsigned int */ | 23 | #define QDIO_ZFCP_QFMT 1 |
28 | /************************ END of CONSTANTS **************************/ | 24 | #define QDIO_IQDIO_QFMT 2 |
29 | #define QDIO_MAX_BUFFERS_PER_Q 128 /* must be a power of 2 (%x=&(x-1)*/ | 25 | |
30 | #define QDIO_BUF_ORDER 7 /* 2**this == number of pages used for sbals in 1 q */ | 26 | /** |
31 | #define QDIO_MAX_ELEMENTS_PER_BUFFER 16 | 27 | * struct qdesfmt0 - queue descriptor, format 0 |
32 | #define SBAL_SIZE 256 | 28 | * @sliba: storage list information block address |
33 | 29 | * @sla: storage list address | |
34 | #define QDIO_QETH_QFMT 0 | 30 | * @slsba: storage list state block address |
35 | #define QDIO_ZFCP_QFMT 1 | 31 | * @akey: access key for DLIB |
36 | #define QDIO_IQDIO_QFMT 2 | 32 | * @bkey: access key for SL |
37 | #define QDIO_IQDIO_QFMT_ASYNCH 3 | 33 | * @ckey: access key for SBALs |
38 | 34 | * @dkey: access key for SLSB | |
39 | struct qdio_buffer_element{ | 35 | */ |
40 | unsigned int flags; | ||
41 | unsigned int length; | ||
42 | #ifdef QDIO_32_BIT | ||
43 | void *reserved; | ||
44 | #endif /* QDIO_32_BIT */ | ||
45 | void *addr; | ||
46 | } __attribute__ ((packed,aligned(16))); | ||
47 | |||
48 | struct qdio_buffer{ | ||
49 | volatile struct qdio_buffer_element element[16]; | ||
50 | } __attribute__ ((packed,aligned(256))); | ||
51 | |||
52 | |||
53 | /* params are: ccw_device, status, qdio_error, siga_error, | ||
54 | queue_number, first element processed, number of elements processed, | ||
55 | int_parm */ | ||
56 | typedef void qdio_handler_t(struct ccw_device *,unsigned int,unsigned int, | ||
57 | unsigned int,unsigned int,int,int,unsigned long); | ||
58 | |||
59 | |||
60 | #define QDIO_STATUS_INBOUND_INT 0x01 | ||
61 | #define QDIO_STATUS_OUTBOUND_INT 0x02 | ||
62 | #define QDIO_STATUS_LOOK_FOR_ERROR 0x04 | ||
63 | #define QDIO_STATUS_MORE_THAN_ONE_QDIO_ERROR 0x08 | ||
64 | #define QDIO_STATUS_MORE_THAN_ONE_SIGA_ERROR 0x10 | ||
65 | #define QDIO_STATUS_ACTIVATE_CHECK_CONDITION 0x20 | ||
66 | |||
67 | #define QDIO_SIGA_ERROR_ACCESS_EXCEPTION 0x10 | ||
68 | #define QDIO_SIGA_ERROR_B_BIT_SET 0x20 | ||
69 | |||
70 | /* for qdio_initialize */ | ||
71 | #define QDIO_INBOUND_0COPY_SBALS 0x01 | ||
72 | #define QDIO_OUTBOUND_0COPY_SBALS 0x02 | ||
73 | #define QDIO_USE_OUTBOUND_PCIS 0x04 | ||
74 | |||
75 | /* for qdio_cleanup */ | ||
76 | #define QDIO_FLAG_CLEANUP_USING_CLEAR 0x01 | ||
77 | #define QDIO_FLAG_CLEANUP_USING_HALT 0x02 | ||
78 | |||
79 | struct qdio_initialize { | ||
80 | struct ccw_device *cdev; | ||
81 | unsigned char q_format; | ||
82 | unsigned char adapter_name[8]; | ||
83 | unsigned int qib_param_field_format; /*adapter dependent*/ | ||
84 | /* pointer to 128 bytes or NULL, if no param field */ | ||
85 | unsigned char *qib_param_field; /* adapter dependent */ | ||
86 | /* pointer to no_queues*128 words of data or NULL */ | ||
87 | unsigned long *input_slib_elements; | ||
88 | unsigned long *output_slib_elements; | ||
89 | unsigned int min_input_threshold; | ||
90 | unsigned int max_input_threshold; | ||
91 | unsigned int min_output_threshold; | ||
92 | unsigned int max_output_threshold; | ||
93 | unsigned int no_input_qs; | ||
94 | unsigned int no_output_qs; | ||
95 | qdio_handler_t *input_handler; | ||
96 | qdio_handler_t *output_handler; | ||
97 | unsigned long int_parm; | ||
98 | unsigned long flags; | ||
99 | void **input_sbal_addr_array; /* addr of n*128 void ptrs */ | ||
100 | void **output_sbal_addr_array; /* addr of n*128 void ptrs */ | ||
101 | }; | ||
102 | |||
103 | extern int qdio_initialize(struct qdio_initialize *init_data); | ||
104 | extern int qdio_allocate(struct qdio_initialize *init_data); | ||
105 | extern int qdio_establish(struct qdio_initialize *init_data); | ||
106 | |||
107 | extern int qdio_activate(struct ccw_device *,int flags); | ||
108 | |||
109 | #define QDIO_STATE_MUST_USE_OUTB_PCI 0x00000001 | ||
110 | #define QDIO_STATE_INACTIVE 0x00000002 /* after qdio_cleanup */ | ||
111 | #define QDIO_STATE_ESTABLISHED 0x00000004 /* after qdio_initialize */ | ||
112 | #define QDIO_STATE_ACTIVE 0x00000008 /* after qdio_activate */ | ||
113 | #define QDIO_STATE_STOPPED 0x00000010 /* after queues went down */ | ||
114 | extern unsigned long qdio_get_status(int irq); | ||
115 | |||
116 | |||
117 | #define QDIO_FLAG_SYNC_INPUT 0x01 | ||
118 | #define QDIO_FLAG_SYNC_OUTPUT 0x02 | ||
119 | #define QDIO_FLAG_UNDER_INTERRUPT 0x04 | ||
120 | #define QDIO_FLAG_NO_INPUT_INTERRUPT_CONTEXT 0x08 /* no effect on | ||
121 | adapter interrupts */ | ||
122 | #define QDIO_FLAG_DONT_SIGA 0x10 | ||
123 | #define QDIO_FLAG_PCI_OUT 0x20 | ||
124 | |||
125 | extern int do_QDIO(struct ccw_device*, unsigned int flags, | ||
126 | unsigned int queue_number, | ||
127 | unsigned int qidx,unsigned int count, | ||
128 | struct qdio_buffer *buffers); | ||
129 | |||
130 | extern int qdio_get_ssqd_pct(struct ccw_device*); | ||
131 | extern int qdio_synchronize(struct ccw_device*, unsigned int flags, | ||
132 | unsigned int queue_number); | ||
133 | |||
134 | extern int qdio_cleanup(struct ccw_device*, int how); | ||
135 | extern int qdio_shutdown(struct ccw_device*, int how); | ||
136 | extern int qdio_free(struct ccw_device*); | ||
137 | |||
138 | unsigned char qdio_get_slsb_state(struct ccw_device*, unsigned int flag, | ||
139 | unsigned int queue_number, | ||
140 | unsigned int qidx); | ||
141 | |||
142 | extern void qdio_init_scrubber(void); | ||
143 | |||
144 | struct qdesfmt0 { | 36 | struct qdesfmt0 { |
145 | #ifdef QDIO_32_BIT | 37 | u64 sliba; |
146 | unsigned long res1; /* reserved */ | 38 | u64 sla; |
147 | #endif /* QDIO_32_BIT */ | 39 | u64 slsba; |
148 | unsigned long sliba; /* storage-list-information-block | 40 | u32 : 32; |
149 | address */ | 41 | u32 akey : 4; |
150 | #ifdef QDIO_32_BIT | 42 | u32 bkey : 4; |
151 | unsigned long res2; /* reserved */ | 43 | u32 ckey : 4; |
152 | #endif /* QDIO_32_BIT */ | 44 | u32 dkey : 4; |
153 | unsigned long sla; /* storage-list address */ | 45 | u32 : 16; |
154 | #ifdef QDIO_32_BIT | ||
155 | unsigned long res3; /* reserved */ | ||
156 | #endif /* QDIO_32_BIT */ | ||
157 | unsigned long slsba; /* storage-list-state-block address */ | ||
158 | unsigned int res4; /* reserved */ | ||
159 | unsigned int akey : 4; /* access key for DLIB */ | ||
160 | unsigned int bkey : 4; /* access key for SL */ | ||
161 | unsigned int ckey : 4; /* access key for SBALs */ | ||
162 | unsigned int dkey : 4; /* access key for SLSB */ | ||
163 | unsigned int res5 : 16; /* reserved */ | ||
164 | } __attribute__ ((packed)); | 46 | } __attribute__ ((packed)); |
165 | 47 | ||
166 | /* | 48 | /** |
167 | * Queue-Description record (QDR) | 49 | * struct qdr - queue description record (QDR) |
50 | * @qfmt: queue format | ||
51 | * @pfmt: implementation dependent parameter format | ||
52 | * @ac: adapter characteristics | ||
53 | * @iqdcnt: input queue descriptor count | ||
54 | * @oqdcnt: output queue descriptor count | ||
55 | * @iqdsz: inpout queue descriptor size | ||
56 | * @oqdsz: output queue descriptor size | ||
57 | * @qiba: queue information block address | ||
58 | * @qkey: queue information block key | ||
59 | * @qdf0: queue descriptions | ||
168 | */ | 60 | */ |
169 | struct qdr { | 61 | struct qdr { |
170 | unsigned int qfmt : 8; /* queue format */ | 62 | u32 qfmt : 8; |
171 | unsigned int pfmt : 8; /* impl. dep. parameter format */ | 63 | u32 pfmt : 8; |
172 | unsigned int res1 : 8; /* reserved */ | 64 | u32 : 8; |
173 | unsigned int ac : 8; /* adapter characteristics */ | 65 | u32 ac : 8; |
174 | unsigned int res2 : 8; /* reserved */ | 66 | u32 : 8; |
175 | unsigned int iqdcnt : 8; /* input-queue-descriptor count */ | 67 | u32 iqdcnt : 8; |
176 | unsigned int res3 : 8; /* reserved */ | 68 | u32 : 8; |
177 | unsigned int oqdcnt : 8; /* output-queue-descriptor count */ | 69 | u32 oqdcnt : 8; |
178 | unsigned int res4 : 8; /* reserved */ | 70 | u32 : 8; |
179 | unsigned int iqdsz : 8; /* input-queue-descriptor size */ | 71 | u32 iqdsz : 8; |
180 | unsigned int res5 : 8; /* reserved */ | 72 | u32 : 8; |
181 | unsigned int oqdsz : 8; /* output-queue-descriptor size */ | 73 | u32 oqdsz : 8; |
182 | unsigned int res6[9]; /* reserved */ | 74 | /* private: */ |
183 | #ifdef QDIO_32_BIT | 75 | u32 res[9]; |
184 | unsigned long res7; /* reserved */ | 76 | /* public: */ |
185 | #endif /* QDIO_32_BIT */ | 77 | u64 qiba; |
186 | unsigned long qiba; /* queue-information-block address */ | 78 | u32 : 32; |
187 | unsigned int res8; /* reserved */ | 79 | u32 qkey : 4; |
188 | unsigned int qkey : 4; /* queue-information-block key */ | 80 | u32 : 28; |
189 | unsigned int res9 : 28; /* reserved */ | 81 | struct qdesfmt0 qdf0[126]; |
190 | /* union _qd {*/ /* why this? */ | 82 | } __attribute__ ((packed, aligned(4096))); |
191 | struct qdesfmt0 qdf0[126]; | 83 | |
192 | /* } qd;*/ | 84 | #define QIB_AC_OUTBOUND_PCI_SUPPORTED 0x40 |
193 | } __attribute__ ((packed,aligned(4096))); | ||
194 | |||
195 | |||
196 | /* | ||
197 | * queue information block (QIB) | ||
198 | */ | ||
199 | #define QIB_AC_INBOUND_PCI_SUPPORTED 0x80 | ||
200 | #define QIB_AC_OUTBOUND_PCI_SUPPORTED 0x40 | ||
201 | #define QIB_RFLAGS_ENABLE_QEBSM 0x80 | 85 | #define QIB_RFLAGS_ENABLE_QEBSM 0x80 |
202 | 86 | ||
87 | /** | ||
88 | * struct qib - queue information block (QIB) | ||
89 | * @qfmt: queue format | ||
90 | * @pfmt: implementation dependent parameter format | ||
91 | * @rflags: QEBSM | ||
92 | * @ac: adapter characteristics | ||
93 | * @isliba: absolute address of first input SLIB | ||
94 | * @osliba: absolute address of first output SLIB | ||
95 | * @ebcnam: adapter identifier in EBCDIC | ||
96 | * @parm: implementation dependent parameters | ||
97 | */ | ||
203 | struct qib { | 98 | struct qib { |
204 | unsigned int qfmt : 8; /* queue format */ | 99 | u32 qfmt : 8; |
205 | unsigned int pfmt : 8; /* impl. dep. parameter format */ | 100 | u32 pfmt : 8; |
206 | unsigned int rflags : 8; /* QEBSM */ | 101 | u32 rflags : 8; |
207 | unsigned int ac : 8; /* adapter characteristics */ | 102 | u32 ac : 8; |
208 | unsigned int res2; /* reserved */ | 103 | u32 : 32; |
209 | #ifdef QDIO_32_BIT | 104 | u64 isliba; |
210 | unsigned long res3; /* reserved */ | 105 | u64 osliba; |
211 | #endif /* QDIO_32_BIT */ | 106 | u32 : 32; |
212 | unsigned long isliba; /* absolute address of 1st | 107 | u32 : 32; |
213 | input SLIB */ | 108 | u8 ebcnam[8]; |
214 | #ifdef QDIO_32_BIT | 109 | /* private: */ |
215 | unsigned long res4; /* reserved */ | 110 | u8 res[88]; |
216 | #endif /* QDIO_32_BIT */ | 111 | /* public: */ |
217 | unsigned long osliba; /* absolute address of 1st | 112 | u8 parm[QDIO_MAX_BUFFERS_PER_Q]; |
218 | output SLIB */ | 113 | } __attribute__ ((packed, aligned(256))); |
219 | unsigned int res5; /* reserved */ | 114 | |
220 | unsigned int res6; /* reserved */ | 115 | /** |
221 | unsigned char ebcnam[8]; /* adapter identifier in EBCDIC */ | 116 | * struct slibe - storage list information block element (SLIBE) |
222 | unsigned char res7[88]; /* reserved */ | 117 | * @parms: implementation dependent parameters |
223 | unsigned char parm[QDIO_MAX_BUFFERS_PER_Q]; | ||
224 | /* implementation dependent | ||
225 | parameters */ | ||
226 | } __attribute__ ((packed,aligned(256))); | ||
227 | |||
228 | |||
229 | /* | ||
230 | * storage-list-information block element (SLIBE) | ||
231 | */ | 118 | */ |
232 | struct slibe { | 119 | struct slibe { |
233 | #ifdef QDIO_32_BIT | 120 | u64 parms; |
234 | unsigned long res; /* reserved */ | ||
235 | #endif /* QDIO_32_BIT */ | ||
236 | unsigned long parms; /* implementation dependent | ||
237 | parameters */ | ||
238 | }; | 121 | }; |
239 | 122 | ||
240 | /* | 123 | /** |
241 | * storage-list-information block (SLIB) | 124 | * struct slib - storage list information block (SLIB) |
125 | * @nsliba: next SLIB address (if any) | ||
126 | * @sla: SL address | ||
127 | * @slsba: SLSB address | ||
128 | * @slibe: SLIB elements | ||
242 | */ | 129 | */ |
243 | struct slib { | 130 | struct slib { |
244 | #ifdef QDIO_32_BIT | 131 | u64 nsliba; |
245 | unsigned long res1; /* reserved */ | 132 | u64 sla; |
246 | #endif /* QDIO_32_BIT */ | 133 | u64 slsba; |
247 | unsigned long nsliba; /* next SLIB address (if any) */ | 134 | /* private: */ |
248 | #ifdef QDIO_32_BIT | 135 | u8 res[1000]; |
249 | unsigned long res2; /* reserved */ | 136 | /* public: */ |
250 | #endif /* QDIO_32_BIT */ | 137 | struct slibe slibe[QDIO_MAX_BUFFERS_PER_Q]; |
251 | unsigned long sla; /* SL address */ | 138 | } __attribute__ ((packed, aligned(2048))); |
252 | #ifdef QDIO_32_BIT | 139 | |
253 | unsigned long res3; /* reserved */ | 140 | /** |
254 | #endif /* QDIO_32_BIT */ | 141 | * struct sbal_flags - storage block address list flags |
255 | unsigned long slsba; /* SLSB address */ | 142 | * @last: last entry |
256 | unsigned char res4[1000]; /* reserved */ | 143 | * @cont: contiguous storage |
257 | struct slibe slibe[QDIO_MAX_BUFFERS_PER_Q]; /* SLIB elements */ | 144 | * @frag: fragmentation |
258 | } __attribute__ ((packed,aligned(2048))); | 145 | */ |
259 | |||
260 | struct sbal_flags { | 146 | struct sbal_flags { |
261 | unsigned char res1 : 1; /* reserved */ | 147 | u8 : 1; |
262 | unsigned char last : 1; /* last entry */ | 148 | u8 last : 1; |
263 | unsigned char cont : 1; /* contiguous storage */ | 149 | u8 cont : 1; |
264 | unsigned char res2 : 1; /* reserved */ | 150 | u8 : 1; |
265 | unsigned char frag : 2; /* fragmentation (s.below) */ | 151 | u8 frag : 2; |
266 | unsigned char res3 : 2; /* reserved */ | 152 | u8 : 2; |
267 | } __attribute__ ((packed)); | 153 | } __attribute__ ((packed)); |
268 | 154 | ||
269 | #define SBAL_FLAGS_FIRST_FRAG 0x04000000UL | 155 | #define SBAL_FLAGS_FIRST_FRAG 0x04000000UL |
270 | #define SBAL_FLAGS_MIDDLE_FRAG 0x08000000UL | 156 | #define SBAL_FLAGS_MIDDLE_FRAG 0x08000000UL |
271 | #define SBAL_FLAGS_LAST_FRAG 0x0c000000UL | 157 | #define SBAL_FLAGS_LAST_FRAG 0x0c000000UL |
272 | #define SBAL_FLAGS_LAST_ENTRY 0x40000000UL | 158 | #define SBAL_FLAGS_LAST_ENTRY 0x40000000UL |
273 | #define SBAL_FLAGS_CONTIGUOUS 0x20000000UL | 159 | #define SBAL_FLAGS_CONTIGUOUS 0x20000000UL |
274 | 160 | ||
275 | #define SBAL_FLAGS0_DATA_CONTINUATION 0x20UL | 161 | #define SBAL_FLAGS0_DATA_CONTINUATION 0x20UL |
276 | 162 | ||
277 | /* Awesome OpenFCP extensions */ | 163 | /* Awesome OpenFCP extensions */ |
278 | #define SBAL_FLAGS0_TYPE_STATUS 0x00UL | 164 | #define SBAL_FLAGS0_TYPE_STATUS 0x00UL |
279 | #define SBAL_FLAGS0_TYPE_WRITE 0x08UL | 165 | #define SBAL_FLAGS0_TYPE_WRITE 0x08UL |
280 | #define SBAL_FLAGS0_TYPE_READ 0x10UL | 166 | #define SBAL_FLAGS0_TYPE_READ 0x10UL |
281 | #define SBAL_FLAGS0_TYPE_WRITE_READ 0x18UL | 167 | #define SBAL_FLAGS0_TYPE_WRITE_READ 0x18UL |
282 | #define SBAL_FLAGS0_MORE_SBALS 0x04UL | 168 | #define SBAL_FLAGS0_MORE_SBALS 0x04UL |
283 | #define SBAL_FLAGS0_COMMAND 0x02UL | 169 | #define SBAL_FLAGS0_COMMAND 0x02UL |
284 | #define SBAL_FLAGS0_LAST_SBAL 0x00UL | 170 | #define SBAL_FLAGS0_LAST_SBAL 0x00UL |
285 | #define SBAL_FLAGS0_ONLY_SBAL SBAL_FLAGS0_COMMAND | 171 | #define SBAL_FLAGS0_ONLY_SBAL SBAL_FLAGS0_COMMAND |
286 | #define SBAL_FLAGS0_MIDDLE_SBAL SBAL_FLAGS0_MORE_SBALS | 172 | #define SBAL_FLAGS0_MIDDLE_SBAL SBAL_FLAGS0_MORE_SBALS |
287 | #define SBAL_FLAGS0_FIRST_SBAL SBAL_FLAGS0_MORE_SBALS | SBAL_FLAGS0_COMMAND | 173 | #define SBAL_FLAGS0_FIRST_SBAL SBAL_FLAGS0_MORE_SBALS | SBAL_FLAGS0_COMMAND |
288 | /* Naught of interest beyond this point */ | 174 | #define SBAL_FLAGS0_PCI 0x40 |
289 | 175 | ||
290 | #define SBAL_FLAGS0_PCI 0x40 | 176 | /** |
177 | * struct sbal_sbalf_0 - sbal flags for sbale 0 | ||
178 | * @pci: PCI indicator | ||
179 | * @cont: data continuation | ||
180 | * @sbtype: storage-block type (FCP) | ||
181 | */ | ||
291 | struct sbal_sbalf_0 { | 182 | struct sbal_sbalf_0 { |
292 | unsigned char res1 : 1; /* reserved */ | 183 | u8 : 1; |
293 | unsigned char pci : 1; /* PCI indicator */ | 184 | u8 pci : 1; |
294 | unsigned char cont : 1; /* data continuation */ | 185 | u8 cont : 1; |
295 | unsigned char sbtype: 2; /* storage-block type (OpenFCP) */ | 186 | u8 sbtype : 2; |
296 | unsigned char res2 : 3; /* reserved */ | 187 | u8 : 3; |
297 | } __attribute__ ((packed)); | 188 | } __attribute__ ((packed)); |
298 | 189 | ||
190 | /** | ||
191 | * struct sbal_sbalf_1 - sbal flags for sbale 1 | ||
192 | * @key: storage key | ||
193 | */ | ||
299 | struct sbal_sbalf_1 { | 194 | struct sbal_sbalf_1 { |
300 | unsigned char res1 : 4; /* reserved */ | 195 | u8 : 4; |
301 | unsigned char key : 4; /* storage key */ | 196 | u8 key : 4; |
302 | } __attribute__ ((packed)); | 197 | } __attribute__ ((packed)); |
303 | 198 | ||
199 | /** | ||
200 | * struct sbal_sbalf_14 - sbal flags for sbale 14 | ||
201 | * @erridx: error index | ||
202 | */ | ||
304 | struct sbal_sbalf_14 { | 203 | struct sbal_sbalf_14 { |
305 | unsigned char res1 : 4; /* reserved */ | 204 | u8 : 4; |
306 | unsigned char erridx : 4; /* error index */ | 205 | u8 erridx : 4; |
307 | } __attribute__ ((packed)); | 206 | } __attribute__ ((packed)); |
308 | 207 | ||
208 | /** | ||
209 | * struct sbal_sbalf_15 - sbal flags for sbale 15 | ||
210 | * @reason: reason for error state | ||
211 | */ | ||
309 | struct sbal_sbalf_15 { | 212 | struct sbal_sbalf_15 { |
310 | unsigned char reason; /* reserved */ | 213 | u8 reason; |
311 | } __attribute__ ((packed)); | 214 | } __attribute__ ((packed)); |
312 | 215 | ||
216 | /** | ||
217 | * union sbal_sbalf - storage block address list flags | ||
218 | * @i0: sbalf0 | ||
219 | * @i1: sbalf1 | ||
220 | * @i14: sbalf14 | ||
221 | * @i15: sblaf15 | ||
222 | * @value: raw value | ||
223 | */ | ||
313 | union sbal_sbalf { | 224 | union sbal_sbalf { |
314 | struct sbal_sbalf_0 i0; | 225 | struct sbal_sbalf_0 i0; |
315 | struct sbal_sbalf_1 i1; | 226 | struct sbal_sbalf_1 i1; |
316 | struct sbal_sbalf_14 i14; | 227 | struct sbal_sbalf_14 i14; |
317 | struct sbal_sbalf_15 i15; | 228 | struct sbal_sbalf_15 i15; |
318 | unsigned char value; | 229 | u8 value; |
319 | }; | 230 | }; |
320 | 231 | ||
321 | struct sbal_element { | 232 | /** |
322 | union { | 233 | * struct qdio_buffer_element - SBAL entry |
323 | struct sbal_flags bits; /* flags */ | 234 | * @flags: flags |
324 | unsigned char value; | 235 | * @length: length |
325 | } flags; | 236 | * @addr: address |
326 | unsigned int res1 : 16; /* reserved */ | 237 | */ |
327 | union sbal_sbalf sbalf; /* SBAL flags */ | 238 | struct qdio_buffer_element { |
328 | unsigned int res2 : 16; /* reserved */ | 239 | u32 flags; |
329 | unsigned int count : 16; /* data count */ | 240 | u32 length; |
330 | #ifdef QDIO_32_BIT | 241 | #ifdef CONFIG_32BIT |
331 | unsigned long res3; /* reserved */ | 242 | /* private: */ |
332 | #endif /* QDIO_32_BIT */ | 243 | void *reserved; |
333 | unsigned long addr; /* absolute data address */ | 244 | /* public: */ |
334 | } __attribute__ ((packed,aligned(16))); | 245 | #endif |
246 | void *addr; | ||
247 | } __attribute__ ((packed, aligned(16))); | ||
335 | 248 | ||
336 | /* | 249 | /** |
337 | * strorage-block access-list (SBAL) | 250 | * struct qdio_buffer - storage block address list (SBAL) |
251 | * @element: SBAL entries | ||
338 | */ | 252 | */ |
339 | struct sbal { | 253 | struct qdio_buffer { |
340 | struct sbal_element element[QDIO_MAX_ELEMENTS_PER_BUFFER]; | 254 | struct qdio_buffer_element element[QDIO_MAX_ELEMENTS_PER_BUFFER]; |
341 | } __attribute__ ((packed,aligned(256))); | 255 | } __attribute__ ((packed, aligned(256))); |
342 | 256 | ||
343 | /* | 257 | /** |
344 | * storage-list (SL) | 258 | * struct sl_element - storage list entry |
259 | * @sbal: absolute SBAL address | ||
345 | */ | 260 | */ |
346 | struct sl_element { | 261 | struct sl_element { |
347 | #ifdef QDIO_32_BIT | 262 | #ifdef CONFIG_32BIT |
348 | unsigned long res; /* reserved */ | 263 | /* private: */ |
349 | #endif /* QDIO_32_BIT */ | 264 | unsigned long reserved; |
350 | unsigned long sbal; /* absolute SBAL address */ | 265 | /* public: */ |
266 | #endif | ||
267 | unsigned long sbal; | ||
351 | } __attribute__ ((packed)); | 268 | } __attribute__ ((packed)); |
352 | 269 | ||
270 | /** | ||
271 | * struct sl - storage list (SL) | ||
272 | * @element: SL entries | ||
273 | */ | ||
353 | struct sl { | 274 | struct sl { |
354 | struct sl_element element[QDIO_MAX_BUFFERS_PER_Q]; | 275 | struct sl_element element[QDIO_MAX_BUFFERS_PER_Q]; |
355 | } __attribute__ ((packed,aligned(1024))); | 276 | } __attribute__ ((packed, aligned(1024))); |
356 | 277 | ||
357 | /* | 278 | /** |
358 | * storage-list-state block (SLSB) | 279 | * struct slsb - storage list state block (SLSB) |
280 | * @val: state per buffer | ||
359 | */ | 281 | */ |
360 | struct slsb_flags { | 282 | struct slsb { |
361 | unsigned char owner : 2; /* SBAL owner */ | 283 | u8 val[QDIO_MAX_BUFFERS_PER_Q]; |
362 | unsigned char type : 1; /* buffer type */ | 284 | } __attribute__ ((packed, aligned(256))); |
363 | unsigned char state : 5; /* processing state */ | 285 | |
286 | struct qdio_ssqd_desc { | ||
287 | u8 flags; | ||
288 | u8:8; | ||
289 | u16 sch; | ||
290 | u8 qfmt; | ||
291 | u8 parm; | ||
292 | u8 qdioac1; | ||
293 | u8 sch_class; | ||
294 | u8 pcnt; | ||
295 | u8 icnt; | ||
296 | u8:8; | ||
297 | u8 ocnt; | ||
298 | u8:8; | ||
299 | u8 mbccnt; | ||
300 | u16 qdioac2; | ||
301 | u64 sch_token; | ||
302 | u64:64; | ||
364 | } __attribute__ ((packed)); | 303 | } __attribute__ ((packed)); |
365 | 304 | ||
305 | /* params are: ccw_device, qdio_error, queue_number, | ||
306 | first element processed, number of elements processed, int_parm */ | ||
307 | typedef void qdio_handler_t(struct ccw_device *, unsigned int, int, | ||
308 | int, int, unsigned long); | ||
366 | 309 | ||
367 | struct slsb { | 310 | /* qdio errors reported to the upper-layer program */ |
368 | union { | 311 | #define QDIO_ERROR_SIGA_ACCESS_EXCEPTION 0x10 |
369 | unsigned char val[QDIO_MAX_BUFFERS_PER_Q]; | 312 | #define QDIO_ERROR_SIGA_BUSY 0x20 |
370 | struct slsb_flags flags[QDIO_MAX_BUFFERS_PER_Q]; | 313 | #define QDIO_ERROR_ACTIVATE_CHECK_CONDITION 0x40 |
371 | } acc; | 314 | #define QDIO_ERROR_SLSB_STATE 0x80 |
372 | } __attribute__ ((packed,aligned(256))); | ||
373 | 315 | ||
374 | /* | 316 | /* for qdio_initialize */ |
375 | * SLSB values | 317 | #define QDIO_INBOUND_0COPY_SBALS 0x01 |
318 | #define QDIO_OUTBOUND_0COPY_SBALS 0x02 | ||
319 | #define QDIO_USE_OUTBOUND_PCIS 0x04 | ||
320 | |||
321 | /* for qdio_cleanup */ | ||
322 | #define QDIO_FLAG_CLEANUP_USING_CLEAR 0x01 | ||
323 | #define QDIO_FLAG_CLEANUP_USING_HALT 0x02 | ||
324 | |||
325 | /** | ||
326 | * struct qdio_initialize - qdio initalization data | ||
327 | * @cdev: associated ccw device | ||
328 | * @q_format: queue format | ||
329 | * @adapter_name: name for the adapter | ||
330 | * @qib_param_field_format: format for qib_parm_field | ||
331 | * @qib_param_field: pointer to 128 bytes or NULL, if no param field | ||
332 | * @input_slib_elements: pointer to no_input_qs * 128 words of data or NULL | ||
333 | * @output_slib_elements: pointer to no_output_qs * 128 words of data or NULL | ||
334 | * @no_input_qs: number of input queues | ||
335 | * @no_output_qs: number of output queues | ||
336 | * @input_handler: handler to be called for input queues | ||
337 | * @output_handler: handler to be called for output queues | ||
338 | * @int_parm: interruption parameter | ||
339 | * @flags: initialization flags | ||
340 | * @input_sbal_addr_array: address of no_input_qs * 128 pointers | ||
341 | * @output_sbal_addr_array: address of no_output_qs * 128 pointers | ||
376 | */ | 342 | */ |
377 | #define SLSB_OWNER_PROG 1 | 343 | struct qdio_initialize { |
378 | #define SLSB_OWNER_CU 2 | 344 | struct ccw_device *cdev; |
379 | 345 | unsigned char q_format; | |
380 | #define SLSB_TYPE_INPUT 0 | 346 | unsigned char adapter_name[8]; |
381 | #define SLSB_TYPE_OUTPUT 1 | 347 | unsigned int qib_param_field_format; |
382 | 348 | unsigned char *qib_param_field; | |
383 | #define SLSB_STATE_NOT_INIT 0 | 349 | unsigned long *input_slib_elements; |
384 | #define SLSB_STATE_EMPTY 1 | 350 | unsigned long *output_slib_elements; |
385 | #define SLSB_STATE_PRIMED 2 | 351 | unsigned int no_input_qs; |
386 | #define SLSB_STATE_HALTED 0xe | 352 | unsigned int no_output_qs; |
387 | #define SLSB_STATE_ERROR 0xf | 353 | qdio_handler_t *input_handler; |
388 | 354 | qdio_handler_t *output_handler; | |
389 | #define SLSB_P_INPUT_NOT_INIT 0x80 | 355 | unsigned long int_parm; |
390 | #define SLSB_P_INPUT_PROCESSING 0x81 | 356 | unsigned long flags; |
391 | #define SLSB_CU_INPUT_EMPTY 0x41 | 357 | void **input_sbal_addr_array; |
392 | #define SLSB_P_INPUT_PRIMED 0x82 | 358 | void **output_sbal_addr_array; |
393 | #define SLSB_P_INPUT_HALTED 0x8E | 359 | }; |
394 | #define SLSB_P_INPUT_ERROR 0x8F | 360 | |
395 | 361 | #define QDIO_STATE_INACTIVE 0x00000002 /* after qdio_cleanup */ | |
396 | #define SLSB_P_OUTPUT_NOT_INIT 0xA0 | 362 | #define QDIO_STATE_ESTABLISHED 0x00000004 /* after qdio_establish */ |
397 | #define SLSB_P_OUTPUT_EMPTY 0xA1 | 363 | #define QDIO_STATE_ACTIVE 0x00000008 /* after qdio_activate */ |
398 | #define SLSB_CU_OUTPUT_PRIMED 0x62 | 364 | #define QDIO_STATE_STOPPED 0x00000010 /* after queues went down */ |
399 | #define SLSB_P_OUTPUT_HALTED 0xAE | 365 | |
400 | #define SLSB_P_OUTPUT_ERROR 0xAF | 366 | #define QDIO_FLAG_SYNC_INPUT 0x01 |
401 | 367 | #define QDIO_FLAG_SYNC_OUTPUT 0x02 | |
402 | #define SLSB_ERROR_DURING_LOOKUP 0xFF | 368 | #define QDIO_FLAG_PCI_OUT 0x10 |
369 | |||
370 | extern int qdio_initialize(struct qdio_initialize *init_data); | ||
371 | extern int qdio_allocate(struct qdio_initialize *init_data); | ||
372 | extern int qdio_establish(struct qdio_initialize *init_data); | ||
373 | extern int qdio_activate(struct ccw_device *); | ||
374 | |||
375 | extern int do_QDIO(struct ccw_device*, unsigned int flags, | ||
376 | int q_nr, int qidx, int count); | ||
377 | extern int qdio_cleanup(struct ccw_device*, int how); | ||
378 | extern int qdio_shutdown(struct ccw_device*, int how); | ||
379 | extern int qdio_free(struct ccw_device *); | ||
380 | extern struct qdio_ssqd_desc *qdio_get_ssqd_desc(struct ccw_device *cdev); | ||
403 | 381 | ||
404 | #endif /* __QDIO_H__ */ | 382 | #endif /* __QDIO_H__ */ |
diff --git a/include/asm-s390/schid.h b/include/asm-s390/schid.h new file mode 100644 index 000000000000..7bdc0fe15691 --- /dev/null +++ b/include/asm-s390/schid.h | |||
@@ -0,0 +1,31 @@ | |||
1 | #ifndef ASM_SCHID_H | ||
2 | #define ASM_SCHID_H | ||
3 | |||
4 | struct subchannel_id { | ||
5 | __u32 cssid : 8; | ||
6 | __u32 : 4; | ||
7 | __u32 m : 1; | ||
8 | __u32 ssid : 2; | ||
9 | __u32 one : 1; | ||
10 | __u32 sch_no : 16; | ||
11 | } __attribute__ ((packed, aligned(4))); | ||
12 | |||
13 | #ifdef __KERNEL__ | ||
14 | |||
15 | /* Helper function for sane state of pre-allocated subchannel_id. */ | ||
16 | static inline void | ||
17 | init_subchannel_id(struct subchannel_id *schid) | ||
18 | { | ||
19 | memset(schid, 0, sizeof(struct subchannel_id)); | ||
20 | schid->one = 1; | ||
21 | } | ||
22 | |||
23 | static inline int | ||
24 | schid_equal(struct subchannel_id *schid1, struct subchannel_id *schid2) | ||
25 | { | ||
26 | return !memcmp(schid1, schid2, sizeof(struct subchannel_id)); | ||
27 | } | ||
28 | |||
29 | #endif /* __KERNEL__ */ | ||
30 | |||
31 | #endif /* ASM_SCHID_H */ | ||
diff --git a/include/asm-s390/sclp.h b/include/asm-s390/sclp.h index b5f2843013a3..fed7bee650a0 100644 --- a/include/asm-s390/sclp.h +++ b/include/asm-s390/sclp.h | |||
@@ -45,9 +45,9 @@ struct sclp_cpu_info { | |||
45 | int sclp_get_cpu_info(struct sclp_cpu_info *info); | 45 | int sclp_get_cpu_info(struct sclp_cpu_info *info); |
46 | int sclp_cpu_configure(u8 cpu); | 46 | int sclp_cpu_configure(u8 cpu); |
47 | int sclp_cpu_deconfigure(u8 cpu); | 47 | int sclp_cpu_deconfigure(u8 cpu); |
48 | void sclp_read_info_early(void); | ||
49 | void sclp_facilities_detect(void); | 48 | void sclp_facilities_detect(void); |
50 | unsigned long long sclp_memory_detect(void); | 49 | unsigned long long sclp_get_rnmax(void); |
50 | unsigned long long sclp_get_rzm(void); | ||
51 | int sclp_sdias_blk_count(void); | 51 | int sclp_sdias_blk_count(void); |
52 | int sclp_sdias_copy(void *dest, int blk_num, int nr_blks); | 52 | int sclp_sdias_copy(void *dest, int blk_num, int nr_blks); |
53 | int sclp_chp_configure(struct chp_id chpid); | 53 | int sclp_chp_configure(struct chp_id chpid); |
diff --git a/include/asm-s390/setup.h b/include/asm-s390/setup.h index ba69674012a7..4ba14e463e83 100644 --- a/include/asm-s390/setup.h +++ b/include/asm-s390/setup.h | |||
@@ -8,14 +8,16 @@ | |||
8 | #ifndef _ASM_S390_SETUP_H | 8 | #ifndef _ASM_S390_SETUP_H |
9 | #define _ASM_S390_SETUP_H | 9 | #define _ASM_S390_SETUP_H |
10 | 10 | ||
11 | #define COMMAND_LINE_SIZE 896 | 11 | #define COMMAND_LINE_SIZE 1024 |
12 | |||
13 | #define ARCH_COMMAND_LINE_SIZE 896 | ||
12 | 14 | ||
13 | #ifdef __KERNEL__ | 15 | #ifdef __KERNEL__ |
14 | 16 | ||
15 | #include <asm/types.h> | 17 | #include <asm/types.h> |
16 | 18 | ||
17 | #define PARMAREA 0x10400 | 19 | #define PARMAREA 0x10400 |
18 | #define MEMORY_CHUNKS 16 /* max 0x7fff */ | 20 | #define MEMORY_CHUNKS 256 |
19 | 21 | ||
20 | #ifndef __ASSEMBLY__ | 22 | #ifndef __ASSEMBLY__ |
21 | 23 | ||
@@ -36,12 +38,14 @@ | |||
36 | struct mem_chunk { | 38 | struct mem_chunk { |
37 | unsigned long addr; | 39 | unsigned long addr; |
38 | unsigned long size; | 40 | unsigned long size; |
39 | unsigned long type; | 41 | int type; |
40 | }; | 42 | }; |
41 | 43 | ||
42 | extern struct mem_chunk memory_chunk[]; | 44 | extern struct mem_chunk memory_chunk[]; |
43 | extern unsigned long real_memory_size; | 45 | extern unsigned long real_memory_size; |
44 | 46 | ||
47 | void detect_memory_layout(struct mem_chunk chunk[]); | ||
48 | |||
45 | #ifdef CONFIG_S390_SWITCH_AMODE | 49 | #ifdef CONFIG_S390_SWITCH_AMODE |
46 | extern unsigned int switch_amode; | 50 | extern unsigned int switch_amode; |
47 | #else | 51 | #else |
@@ -74,7 +78,6 @@ extern unsigned long machine_flags; | |||
74 | 78 | ||
75 | #define MACHINE_IS_VM (machine_flags & MACHINE_FLAG_VM) | 79 | #define MACHINE_IS_VM (machine_flags & MACHINE_FLAG_VM) |
76 | #define MACHINE_IS_KVM (machine_flags & MACHINE_FLAG_KVM) | 80 | #define MACHINE_IS_KVM (machine_flags & MACHINE_FLAG_KVM) |
77 | #define MACHINE_IS_P390 (machine_flags & MACHINE_FLAG_P390) | ||
78 | #define MACHINE_HAS_DIAG9C (machine_flags & MACHINE_FLAG_DIAG9C) | 81 | #define MACHINE_HAS_DIAG9C (machine_flags & MACHINE_FLAG_DIAG9C) |
79 | 82 | ||
80 | #ifndef __s390x__ | 83 | #ifndef __s390x__ |
@@ -97,7 +100,6 @@ extern unsigned long machine_flags; | |||
97 | #define MACHINE_HAS_PFMF (machine_flags & MACHINE_FLAG_PFMF) | 100 | #define MACHINE_HAS_PFMF (machine_flags & MACHINE_FLAG_PFMF) |
98 | #endif /* __s390x__ */ | 101 | #endif /* __s390x__ */ |
99 | 102 | ||
100 | #define MACHINE_HAS_SCLP (!MACHINE_IS_P390) | ||
101 | #define ZFCPDUMP_HSA_SIZE (32UL<<20) | 103 | #define ZFCPDUMP_HSA_SIZE (32UL<<20) |
102 | 104 | ||
103 | /* | 105 | /* |
diff --git a/include/asm-s390/sparsemem.h b/include/asm-s390/sparsemem.h index 06dfdab6c0e8..545d219e6a2d 100644 --- a/include/asm-s390/sparsemem.h +++ b/include/asm-s390/sparsemem.h | |||
@@ -1,15 +1,15 @@ | |||
1 | #ifndef _ASM_S390_SPARSEMEM_H | 1 | #ifndef _ASM_S390_SPARSEMEM_H |
2 | #define _ASM_S390_SPARSEMEM_H | 2 | #define _ASM_S390_SPARSEMEM_H |
3 | 3 | ||
4 | #define SECTION_SIZE_BITS 25 | ||
5 | |||
6 | #ifdef CONFIG_64BIT | 4 | #ifdef CONFIG_64BIT |
7 | 5 | ||
6 | #define SECTION_SIZE_BITS 28 | ||
8 | #define MAX_PHYSADDR_BITS 42 | 7 | #define MAX_PHYSADDR_BITS 42 |
9 | #define MAX_PHYSMEM_BITS 42 | 8 | #define MAX_PHYSMEM_BITS 42 |
10 | 9 | ||
11 | #else | 10 | #else |
12 | 11 | ||
12 | #define SECTION_SIZE_BITS 25 | ||
13 | #define MAX_PHYSADDR_BITS 31 | 13 | #define MAX_PHYSADDR_BITS 31 |
14 | #define MAX_PHYSMEM_BITS 31 | 14 | #define MAX_PHYSMEM_BITS 31 |
15 | 15 | ||
diff --git a/include/asm-s390/timer.h b/include/asm-s390/timer.h index adb34860a543..d98d79e35cd6 100644 --- a/include/asm-s390/timer.h +++ b/include/asm-s390/timer.h | |||
@@ -48,6 +48,18 @@ extern int del_virt_timer(struct vtimer_list *timer); | |||
48 | extern void init_cpu_vtimer(void); | 48 | extern void init_cpu_vtimer(void); |
49 | extern void vtime_init(void); | 49 | extern void vtime_init(void); |
50 | 50 | ||
51 | #ifdef CONFIG_VIRT_TIMER | ||
52 | |||
53 | extern void vtime_start_cpu_timer(void); | ||
54 | extern void vtime_stop_cpu_timer(void); | ||
55 | |||
56 | #else | ||
57 | |||
58 | static inline void vtime_start_cpu_timer(void) { } | ||
59 | static inline void vtime_stop_cpu_timer(void) { } | ||
60 | |||
61 | #endif /* CONFIG_VIRT_TIMER */ | ||
62 | |||
51 | #endif /* __KERNEL__ */ | 63 | #endif /* __KERNEL__ */ |
52 | 64 | ||
53 | #endif /* _ASM_S390_TIMER_H */ | 65 | #endif /* _ASM_S390_TIMER_H */ |
diff --git a/include/asm-s390/zcrypt.h b/include/asm-s390/zcrypt.h index f228f1b86877..00d3bbd44117 100644 --- a/include/asm-s390/zcrypt.h +++ b/include/asm-s390/zcrypt.h | |||
@@ -29,7 +29,7 @@ | |||
29 | 29 | ||
30 | #define ZCRYPT_VERSION 2 | 30 | #define ZCRYPT_VERSION 2 |
31 | #define ZCRYPT_RELEASE 1 | 31 | #define ZCRYPT_RELEASE 1 |
32 | #define ZCRYPT_VARIANT 0 | 32 | #define ZCRYPT_VARIANT 1 |
33 | 33 | ||
34 | #include <linux/ioctl.h> | 34 | #include <linux/ioctl.h> |
35 | #include <linux/compiler.h> | 35 | #include <linux/compiler.h> |