11
11
#include <linux/mm.h>
12
12
#include <linux/errno.h>
13
13
#include <linux/pci.h>
14
+ #include <asm/pci_io.h>
15
+ #include <asm/pci_debug.h>
16
+
17
+ static inline void zpci_err_mmio (u8 cc , u8 status , u64 offset )
18
+ {
19
+ struct {
20
+ u64 offset ;
21
+ u8 cc ;
22
+ u8 status ;
23
+ } data = {offset , cc , status };
24
+
25
+ zpci_err_hex (& data , sizeof (data ));
26
+ }
27
+
28
+ static inline int __pcistb_mio_inuser (
29
+ void __iomem * ioaddr , const void __user * src ,
30
+ u64 len , u8 * status )
31
+ {
32
+ int cc = - ENXIO ;
33
+
34
+ asm volatile (
35
+ " sacf 256\n"
36
+ "0: .insn rsy,0xeb00000000d4,%[len],%[ioaddr],%[src]\n"
37
+ "1: ipm %[cc]\n"
38
+ " srl %[cc],28\n"
39
+ "2: sacf 768\n"
40
+ EX_TABLE (0b , 2b ) EX_TABLE (1b , 2b )
41
+ : [cc ] "+ d " (cc), [len] " + d " (len)
42
+ : [ioaddr ] "a " (ioaddr), [src] " Q " (*((u8 __force *)src))
43
+ : " cc ", " memory ");
44
+ * status = len >> 24 & 0xff ;
45
+ return cc ;
46
+ }
47
+
48
+ static inline int __pcistg_mio_inuser (
49
+ void __iomem * ioaddr , const void __user * src ,
50
+ u64 ulen , u8 * status )
51
+ {
52
+ register u64 addr asm("2" ) = (u64 __force ) ioaddr ;
53
+ register u64 len asm("3" ) = ulen ;
54
+ int cc = - ENXIO ;
55
+ u64 val = 0 ;
56
+ u64 cnt = ulen ;
57
+ u8 tmp ;
58
+
59
+ /*
60
+ * copy 0 < @len <= 8 bytes from @src into the right most bytes of
61
+ * a register, then store it to PCI at @ioaddr while in secondary
62
+ * address space. pcistg then uses the user mappings.
63
+ */
64
+ asm volatile (
65
+ " sacf 256\n"
66
+ "0: llgc %[tmp],0(%[src])\n"
67
+ " sllg %[val],%[val],8\n"
68
+ " aghi %[src],1\n"
69
+ " ogr %[val],%[tmp]\n"
70
+ " brctg %[cnt],0b\n"
71
+ "1: .insn rre,0xb9d40000,%[val],%[ioaddr]\n"
72
+ "2: ipm %[cc]\n"
73
+ " srl %[cc],28\n"
74
+ "3: sacf 768\n"
75
+ EX_TABLE (0b , 3b ) EX_TABLE (1b , 3b ) EX_TABLE (2b , 3b )
76
+ :
77
+ [src ] "+ a " (src), [cnt] " + d " (cnt),
78
+ [val ] "+ d " (val), [tmp] " = d " (tmp),
79
+ [len ] "+d" (len ), [cc ] "+ d " (cc),
80
+ [ioaddr ] "+ a " (addr)
81
+ :: " cc ", " memory ");
82
+ * status = len >> 24 & 0xff ;
83
+
84
+ /* did we read everything from user memory? */
85
+ if (!cc && cnt != 0 )
86
+ cc = - EFAULT ;
87
+
88
+ return cc ;
89
+ }
90
+
91
+ static inline int __memcpy_toio_inuser (void __iomem * dst ,
92
+ const void __user * src , size_t n )
93
+ {
94
+ int size , rc = 0 ;
95
+ u8 status = 0 ;
96
+ mm_segment_t old_fs ;
97
+
98
+ if (!src )
99
+ return - EINVAL ;
100
+
101
+ old_fs = enable_sacf_uaccess ();
102
+ while (n > 0 ) {
103
+ size = zpci_get_max_write_size ((u64 __force ) dst ,
104
+ (u64 __force ) src , n ,
105
+ ZPCI_MAX_WRITE_SIZE );
106
+ if (size > 8 ) /* main path */
107
+ rc = __pcistb_mio_inuser (dst , src , size , & status );
108
+ else
109
+ rc = __pcistg_mio_inuser (dst , src , size , & status );
110
+ if (rc )
111
+ break ;
112
+ src += size ;
113
+ dst += size ;
114
+ n -= size ;
115
+ }
116
+ disable_sacf_uaccess (old_fs );
117
+ if (rc )
118
+ zpci_err_mmio (rc , status , (__force u64 ) dst );
119
+ return rc ;
120
+ }
14
121
15
122
static long get_pfn (unsigned long user_addr , unsigned long access ,
16
123
unsigned long * pfn )
@@ -46,6 +153,20 @@ SYSCALL_DEFINE3(s390_pci_mmio_write, unsigned long, mmio_addr,
46
153
47
154
if (length <= 0 || PAGE_SIZE - (mmio_addr & ~PAGE_MASK ) < length )
48
155
return - EINVAL ;
156
+
157
+ /*
158
+ * Only support read access to MIO capable devices on a MIO enabled
159
+ * system. Otherwise we would have to check for every address if it is
160
+ * a special ZPCI_ADDR and we would have to do a get_pfn() which we
161
+ * don't need for MIO capable devices.
162
+ */
163
+ if (static_branch_likely (& have_mio )) {
164
+ ret = __memcpy_toio_inuser ((void __iomem * ) mmio_addr ,
165
+ user_buffer ,
166
+ length );
167
+ return ret ;
168
+ }
169
+
49
170
if (length > 64 ) {
50
171
buf = kmalloc (length , GFP_KERNEL );
51
172
if (!buf )
@@ -56,7 +177,8 @@ SYSCALL_DEFINE3(s390_pci_mmio_write, unsigned long, mmio_addr,
56
177
ret = get_pfn (mmio_addr , VM_WRITE , & pfn );
57
178
if (ret )
58
179
goto out ;
59
- io_addr = (void __iomem * )((pfn << PAGE_SHIFT ) | (mmio_addr & ~PAGE_MASK ));
180
+ io_addr = (void __iomem * )((pfn << PAGE_SHIFT ) |
181
+ (mmio_addr & ~PAGE_MASK ));
60
182
61
183
ret = - EFAULT ;
62
184
if ((unsigned long ) io_addr < ZPCI_IOMAP_ADDR_BASE )
@@ -72,6 +194,78 @@ SYSCALL_DEFINE3(s390_pci_mmio_write, unsigned long, mmio_addr,
72
194
return ret ;
73
195
}
74
196
197
+ static inline int __pcilg_mio_inuser (
198
+ void __user * dst , const void __iomem * ioaddr ,
199
+ u64 ulen , u8 * status )
200
+ {
201
+ register u64 addr asm("2" ) = (u64 __force ) ioaddr ;
202
+ register u64 len asm("3" ) = ulen ;
203
+ u64 cnt = ulen ;
204
+ int shift = ulen * 8 ;
205
+ int cc = - ENXIO ;
206
+ u64 val , tmp ;
207
+
208
+ /*
209
+ * read 0 < @len <= 8 bytes from the PCI memory mapped at @ioaddr (in
210
+ * user space) into a register using pcilg then store these bytes at
211
+ * user address @dst
212
+ */
213
+ asm volatile (
214
+ " sacf 256\n"
215
+ "0: .insn rre,0xb9d60000,%[val],%[ioaddr]\n"
216
+ "1: ipm %[cc]\n"
217
+ " srl %[cc],28\n"
218
+ " ltr %[cc],%[cc]\n"
219
+ " jne 4f\n"
220
+ "2: ahi %[shift],-8\n"
221
+ " srlg %[tmp],%[val],0(%[shift])\n"
222
+ "3: stc %[tmp],0(%[dst])\n"
223
+ " aghi %[dst],1\n"
224
+ " brctg %[cnt],2b\n"
225
+ "4: sacf 768\n"
226
+ EX_TABLE (0b , 4b ) EX_TABLE (1b , 4b ) EX_TABLE (3b , 4b )
227
+ :
228
+ [cc ] "+ d " (cc), [val] " = d " (val), [len] " + d " (len),
229
+ [dst ] "+ a " (dst), [cnt] " + d " (cnt), [tmp] " = d " (tmp),
230
+ [shift ] "+d" (shift )
231
+ :
232
+ [ioaddr ] "a" (addr )
233
+ : "cc ", " memory ");
234
+
235
+ /* did we write everything to the user space buffer? */
236
+ if (!cc && cnt != 0 )
237
+ cc = - EFAULT ;
238
+
239
+ * status = len >> 24 & 0xff ;
240
+ return cc ;
241
+ }
242
+
243
+ static inline int __memcpy_fromio_inuser (void __user * dst ,
244
+ const void __iomem * src ,
245
+ unsigned long n )
246
+ {
247
+ int size , rc = 0 ;
248
+ u8 status ;
249
+ mm_segment_t old_fs ;
250
+
251
+ old_fs = enable_sacf_uaccess ();
252
+ while (n > 0 ) {
253
+ size = zpci_get_max_write_size ((u64 __force ) src ,
254
+ (u64 __force ) dst , n ,
255
+ ZPCI_MAX_READ_SIZE );
256
+ rc = __pcilg_mio_inuser (dst , src , size , & status );
257
+ if (rc )
258
+ break ;
259
+ src += size ;
260
+ dst += size ;
261
+ n -= size ;
262
+ }
263
+ disable_sacf_uaccess (old_fs );
264
+ if (rc )
265
+ zpci_err_mmio (rc , status , (__force u64 ) dst );
266
+ return rc ;
267
+ }
268
+
75
269
SYSCALL_DEFINE3 (s390_pci_mmio_read , unsigned long , mmio_addr ,
76
270
void __user * , user_buffer , size_t , length )
77
271
{
@@ -86,12 +280,27 @@ SYSCALL_DEFINE3(s390_pci_mmio_read, unsigned long, mmio_addr,
86
280
87
281
if (length <= 0 || PAGE_SIZE - (mmio_addr & ~PAGE_MASK ) < length )
88
282
return - EINVAL ;
283
+
284
+ /*
285
+ * Only support write access to MIO capable devices on a MIO enabled
286
+ * system. Otherwise we would have to check for every address if it is
287
+ * a special ZPCI_ADDR and we would have to do a get_pfn() which we
288
+ * don't need for MIO capable devices.
289
+ */
290
+ if (static_branch_likely (& have_mio )) {
291
+ ret = __memcpy_fromio_inuser (
292
+ user_buffer , (const void __iomem * )mmio_addr ,
293
+ length );
294
+ return ret ;
295
+ }
296
+
89
297
if (length > 64 ) {
90
298
buf = kmalloc (length , GFP_KERNEL );
91
299
if (!buf )
92
300
return - ENOMEM ;
93
- } else
301
+ } else {
94
302
buf = local_buf ;
303
+ }
95
304
96
305
ret = get_pfn (mmio_addr , VM_READ , & pfn );
97
306
if (ret )
0 commit comments