Skip to content

Commit 0eb597b

Browse files
committed
s390/pci: Convert to use flag output macros
Use flag output macros in inline asm to allow for better code generation if the compiler has support for the flag output constraint. Reviewed-by: Niklas Schnelle <[email protected]> Tested-by: Niklas Schnelle <[email protected]> Reviewed-by: Juergen Christ <[email protected]> Signed-off-by: Heiko Carstens <[email protected]>
1 parent 4e20996 commit 0eb597b

File tree

3 files changed

+124
-100
lines changed

3 files changed

+124
-100
lines changed

arch/s390/pci/pci_clp.c

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <asm/asm-extable.h>
2121
#include <asm/pci_debug.h>
2222
#include <asm/pci_clp.h>
23+
#include <asm/asm.h>
2324
#include <asm/clp.h>
2425
#include <uapi/asm/clp.h>
2526

@@ -52,18 +53,20 @@ static inline void zpci_err_clp(unsigned int rsp, int rc)
5253
static inline int clp_get_ilp(unsigned long *ilp)
5354
{
5455
unsigned long mask;
55-
int cc = 3;
56+
int cc, exception;
5657

58+
exception = 1;
5759
asm volatile (
5860
" .insn rrf,0xb9a00000,%[mask],%[cmd],8,0\n"
59-
"0: ipm %[cc]\n"
60-
" srl %[cc],28\n"
61+
"0: lhi %[exc],0\n"
6162
"1:\n"
63+
CC_IPM(cc)
6264
EX_TABLE(0b, 1b)
63-
: [cc] "+d" (cc), [mask] "=d" (mask) : [cmd] "a" (1)
64-
: "cc");
65+
: CC_OUT(cc, cc), [mask] "=d" (mask), [exc] "+d" (exception)
66+
: [cmd] "a" (1)
67+
: CC_CLOBBER);
6568
*ilp = mask;
66-
return cc;
69+
return exception ? 3 : CC_TRANSFORM(cc);
6770
}
6871

6972
/*
@@ -72,19 +75,20 @@ static inline int clp_get_ilp(unsigned long *ilp)
7275
static __always_inline int clp_req(void *data, unsigned int lps)
7376
{
7477
struct { u8 _[CLP_BLK_SIZE]; } *req = data;
78+
int cc, exception;
7579
u64 ignored;
76-
int cc = 3;
7780

81+
exception = 1;
7882
asm volatile (
7983
" .insn rrf,0xb9a00000,%[ign],%[req],0,%[lps]\n"
80-
"0: ipm %[cc]\n"
81-
" srl %[cc],28\n"
84+
"0: lhi %[exc],0\n"
8285
"1:\n"
86+
CC_IPM(cc)
8387
EX_TABLE(0b, 1b)
84-
: [cc] "+d" (cc), [ign] "=d" (ignored), "+m" (*req)
88+
: CC_OUT(cc, cc), [ign] "=d" (ignored), "+m" (*req), [exc] "+d" (exception)
8589
: [req] "a" (req), [lps] "i" (lps)
86-
: "cc");
87-
return cc;
90+
: CC_CLOBBER);
91+
return exception ? 3 : CC_TRANSFORM(cc);
8892
}
8993

9094
static void *clp_alloc_block(gfp_t gfp_mask)

arch/s390/pci/pci_insn.c

Lines changed: 58 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <asm/pci_debug.h>
1616
#include <asm/pci_io.h>
1717
#include <asm/processor.h>
18+
#include <asm/asm.h>
1819

1920
#define ZPCI_INSN_BUSY_DELAY 1 /* 1 microsecond */
2021

@@ -57,16 +58,16 @@ static inline void zpci_err_insn_addr(int lvl, u8 insn, u8 cc, u8 status,
5758
/* Modify PCI Function Controls */
5859
static inline u8 __mpcifc(u64 req, struct zpci_fib *fib, u8 *status)
5960
{
60-
u8 cc;
61+
int cc;
6162

6263
asm volatile (
6364
" .insn rxy,0xe300000000d0,%[req],%[fib]\n"
64-
" ipm %[cc]\n"
65-
" srl %[cc],28\n"
66-
: [cc] "=d" (cc), [req] "+d" (req), [fib] "+Q" (*fib)
67-
: : "cc");
65+
CC_IPM(cc)
66+
: CC_OUT(cc, cc), [req] "+d" (req), [fib] "+Q" (*fib)
67+
:
68+
: CC_CLOBBER);
6869
*status = req >> 24 & 0xff;
69-
return cc;
70+
return CC_TRANSFORM(cc);
7071
}
7172

7273
u8 zpci_mod_fc(u64 req, struct zpci_fib *fib, u8 *status)
@@ -98,17 +99,16 @@ EXPORT_SYMBOL_GPL(zpci_mod_fc);
9899
static inline u8 __rpcit(u64 fn, u64 addr, u64 range, u8 *status)
99100
{
100101
union register_pair addr_range = {.even = addr, .odd = range};
101-
u8 cc;
102+
int cc;
102103

103104
asm volatile (
104105
" .insn rre,0xb9d30000,%[fn],%[addr_range]\n"
105-
" ipm %[cc]\n"
106-
" srl %[cc],28\n"
107-
: [cc] "=d" (cc), [fn] "+d" (fn)
106+
CC_IPM(cc)
107+
: CC_OUT(cc, cc), [fn] "+d" (fn)
108108
: [addr_range] "d" (addr_range.pair)
109-
: "cc");
109+
: CC_CLOBBER);
110110
*status = fn >> 24 & 0xff;
111-
return cc;
111+
return CC_TRANSFORM(cc);
112112
}
113113

114114
int zpci_refresh_trans(u64 fn, u64 addr, u64 range)
@@ -156,20 +156,23 @@ EXPORT_SYMBOL_GPL(zpci_set_irq_ctrl);
156156
static inline int ____pcilg(u64 *data, u64 req, u64 offset, u8 *status)
157157
{
158158
union register_pair req_off = {.even = req, .odd = offset};
159-
int cc = -ENXIO;
159+
int cc, exception;
160160
u64 __data;
161161

162+
exception = 1;
162163
asm volatile (
163164
" .insn rre,0xb9d20000,%[data],%[req_off]\n"
164-
"0: ipm %[cc]\n"
165-
" srl %[cc],28\n"
165+
"0: lhi %[exc],0\n"
166166
"1:\n"
167+
CC_IPM(cc)
167168
EX_TABLE(0b, 1b)
168-
: [cc] "+d" (cc), [data] "=d" (__data),
169-
[req_off] "+&d" (req_off.pair) :: "cc");
169+
: CC_OUT(cc, cc), [data] "=d" (__data),
170+
[req_off] "+d" (req_off.pair), [exc] "+d" (exception)
171+
:
172+
: CC_CLOBBER);
170173
*status = req_off.even >> 24 & 0xff;
171174
*data = __data;
172-
return cc;
175+
return exception ? -ENXIO : CC_TRANSFORM(cc);
173176
}
174177

175178
static inline int __pcilg(u64 *data, u64 req, u64 offset, u8 *status)
@@ -222,20 +225,23 @@ static inline int zpci_load_fh(u64 *data, const volatile void __iomem *addr,
222225
static inline int __pcilg_mio(u64 *data, u64 ioaddr, u64 len, u8 *status)
223226
{
224227
union register_pair ioaddr_len = {.even = ioaddr, .odd = len};
225-
int cc = -ENXIO;
228+
int cc, exception;
226229
u64 __data;
227230

231+
exception = 1;
228232
asm volatile (
229233
" .insn rre,0xb9d60000,%[data],%[ioaddr_len]\n"
230-
"0: ipm %[cc]\n"
231-
" srl %[cc],28\n"
234+
"0: lhi %[exc],0\n"
232235
"1:\n"
236+
CC_IPM(cc)
233237
EX_TABLE(0b, 1b)
234-
: [cc] "+d" (cc), [data] "=d" (__data),
235-
[ioaddr_len] "+&d" (ioaddr_len.pair) :: "cc");
238+
: CC_OUT(cc, cc), [data] "=d" (__data),
239+
[ioaddr_len] "+d" (ioaddr_len.pair), [exc] "+d" (exception)
240+
:
241+
: CC_CLOBBER);
236242
*status = ioaddr_len.odd >> 24 & 0xff;
237243
*data = __data;
238-
return cc;
244+
return exception ? -ENXIO : CC_TRANSFORM(cc);
239245
}
240246

241247
int zpci_load(u64 *data, const volatile void __iomem *addr, unsigned long len)
@@ -258,19 +264,20 @@ EXPORT_SYMBOL_GPL(zpci_load);
258264
static inline int __pcistg(u64 data, u64 req, u64 offset, u8 *status)
259265
{
260266
union register_pair req_off = {.even = req, .odd = offset};
261-
int cc = -ENXIO;
267+
int cc, exception;
262268

269+
exception = 1;
263270
asm volatile (
264271
" .insn rre,0xb9d00000,%[data],%[req_off]\n"
265-
"0: ipm %[cc]\n"
266-
" srl %[cc],28\n"
272+
"0: lhi %[exc],0\n"
267273
"1:\n"
274+
CC_IPM(cc)
268275
EX_TABLE(0b, 1b)
269-
: [cc] "+d" (cc), [req_off] "+&d" (req_off.pair)
276+
: CC_OUT(cc, cc), [req_off] "+d" (req_off.pair), [exc] "+d" (exception)
270277
: [data] "d" (data)
271-
: "cc");
278+
: CC_CLOBBER);
272279
*status = req_off.even >> 24 & 0xff;
273-
return cc;
280+
return exception ? -ENXIO : CC_TRANSFORM(cc);
274281
}
275282

276283
int __zpci_store(u64 data, u64 req, u64 offset)
@@ -311,19 +318,20 @@ static inline int zpci_store_fh(const volatile void __iomem *addr, u64 data,
311318
static inline int __pcistg_mio(u64 data, u64 ioaddr, u64 len, u8 *status)
312319
{
313320
union register_pair ioaddr_len = {.even = ioaddr, .odd = len};
314-
int cc = -ENXIO;
321+
int cc, exception;
315322

323+
exception = 1;
316324
asm volatile (
317325
" .insn rre,0xb9d40000,%[data],%[ioaddr_len]\n"
318-
"0: ipm %[cc]\n"
319-
" srl %[cc],28\n"
326+
"0: lhi %[exc],0\n"
320327
"1:\n"
328+
CC_IPM(cc)
321329
EX_TABLE(0b, 1b)
322-
: [cc] "+d" (cc), [ioaddr_len] "+&d" (ioaddr_len.pair)
330+
: CC_OUT(cc, cc), [ioaddr_len] "+d" (ioaddr_len.pair), [exc] "+d" (exception)
323331
: [data] "d" (data)
324-
: "cc", "memory");
332+
: CC_CLOBBER_LIST("memory"));
325333
*status = ioaddr_len.odd >> 24 & 0xff;
326-
return cc;
334+
return exception ? -ENXIO : CC_TRANSFORM(cc);
327335
}
328336

329337
int zpci_store(const volatile void __iomem *addr, u64 data, unsigned long len)
@@ -345,19 +353,20 @@ EXPORT_SYMBOL_GPL(zpci_store);
345353
/* PCI Store Block */
346354
static inline int __pcistb(const u64 *data, u64 req, u64 offset, u8 *status)
347355
{
348-
int cc = -ENXIO;
356+
int cc, exception;
349357

358+
exception = 1;
350359
asm volatile (
351360
" .insn rsy,0xeb00000000d0,%[req],%[offset],%[data]\n"
352-
"0: ipm %[cc]\n"
353-
" srl %[cc],28\n"
361+
"0: lhi %[exc],0\n"
354362
"1:\n"
363+
CC_IPM(cc)
355364
EX_TABLE(0b, 1b)
356-
: [cc] "+d" (cc), [req] "+d" (req)
365+
: CC_OUT(cc, cc), [req] "+d" (req), [exc] "+d" (exception)
357366
: [offset] "d" (offset), [data] "Q" (*data)
358-
: "cc");
367+
: CC_CLOBBER);
359368
*status = req >> 24 & 0xff;
360-
return cc;
369+
return exception ? -ENXIO : CC_TRANSFORM(cc);
361370
}
362371

363372
int __zpci_store_block(const u64 *data, u64 req, u64 offset)
@@ -398,19 +407,20 @@ static inline int zpci_write_block_fh(volatile void __iomem *dst,
398407

399408
static inline int __pcistb_mio(const u64 *data, u64 ioaddr, u64 len, u8 *status)
400409
{
401-
int cc = -ENXIO;
410+
int cc, exception;
402411

412+
exception = 1;
403413
asm volatile (
404414
" .insn rsy,0xeb00000000d4,%[len],%[ioaddr],%[data]\n"
405-
"0: ipm %[cc]\n"
406-
" srl %[cc],28\n"
415+
"0: lhi %[exc],0\n"
407416
"1:\n"
417+
CC_IPM(cc)
408418
EX_TABLE(0b, 1b)
409-
: [cc] "+d" (cc), [len] "+d" (len)
419+
: CC_OUT(cc, cc), [len] "+d" (len), [exc] "+d" (exception)
410420
: [ioaddr] "d" (ioaddr), [data] "Q" (*data)
411-
: "cc");
421+
: CC_CLOBBER);
412422
*status = len >> 24 & 0xff;
413-
return cc;
423+
return exception ? -ENXIO : CC_TRANSFORM(cc);
414424
}
415425

416426
int zpci_write_block(volatile void __iomem *dst,

0 commit comments

Comments
 (0)