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 */
5859static 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
7273u8 zpci_mod_fc (u64 req , struct zpci_fib * fib , u8 * status )
@@ -98,17 +99,16 @@ EXPORT_SYMBOL_GPL(zpci_mod_fc);
9899static 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
114114int zpci_refresh_trans (u64 fn , u64 addr , u64 range )
@@ -156,20 +156,23 @@ EXPORT_SYMBOL_GPL(zpci_set_irq_ctrl);
156156static 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
175178static 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,
222225static 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
241247int zpci_load (u64 * data , const volatile void __iomem * addr , unsigned long len )
@@ -258,19 +264,20 @@ EXPORT_SYMBOL_GPL(zpci_load);
258264static 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
276283int __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,
311318static 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
329337int 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 */
346354static 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
363372int __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
399408static 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
416426int zpci_write_block (volatile void __iomem * dst ,
0 commit comments