| #ifndef S390_CIO_IOASM_H |
| #define S390_CIO_IOASM_H |
| |
| /* |
| * TPI info structure |
| */ |
| struct tpi_info { |
| __u32 reserved1 : 16; /* reserved 0x00000001 */ |
| __u32 irq : 16; /* aka. subchannel number */ |
| __u32 intparm; /* interruption parameter */ |
| __u32 adapter_IO : 1; |
| __u32 reserved2 : 1; |
| __u32 isc : 3; |
| __u32 reserved3 : 12; |
| __u32 int_type : 3; |
| __u32 reserved4 : 12; |
| } __attribute__ ((packed)); |
| |
| |
| /* |
| * Some S390 specific IO instructions as inline |
| */ |
| |
| static inline int stsch(int irq, volatile struct schib *addr) |
| { |
| int ccode; |
| |
| __asm__ __volatile__( |
| " lr 1,%1\n" |
| " stsch 0(%2)\n" |
| " ipm %0\n" |
| " srl %0,28" |
| : "=d" (ccode) |
| : "d" (irq | 0x10000), "a" (addr) |
| : "cc", "1" ); |
| return ccode; |
| } |
| |
| static inline int msch(int irq, volatile struct schib *addr) |
| { |
| int ccode; |
| |
| __asm__ __volatile__( |
| " lr 1,%1\n" |
| " msch 0(%2)\n" |
| " ipm %0\n" |
| " srl %0,28" |
| : "=d" (ccode) |
| : "d" (irq | 0x10000L), "a" (addr) |
| : "cc", "1" ); |
| return ccode; |
| } |
| |
| static inline int msch_err(int irq, volatile struct schib *addr) |
| { |
| int ccode; |
| |
| __asm__ __volatile__( |
| " lhi %0,%3\n" |
| " lr 1,%1\n" |
| " msch 0(%2)\n" |
| "0: ipm %0\n" |
| " srl %0,28\n" |
| "1:\n" |
| #ifdef CONFIG_ARCH_S390X |
| ".section __ex_table,\"a\"\n" |
| " .align 8\n" |
| " .quad 0b,1b\n" |
| ".previous" |
| #else |
| ".section __ex_table,\"a\"\n" |
| " .align 4\n" |
| " .long 0b,1b\n" |
| ".previous" |
| #endif |
| : "=&d" (ccode) |
| : "d" (irq | 0x10000L), "a" (addr), "K" (-EIO) |
| : "cc", "1" ); |
| return ccode; |
| } |
| |
| static inline int tsch(int irq, volatile struct irb *addr) |
| { |
| int ccode; |
| |
| __asm__ __volatile__( |
| " lr 1,%1\n" |
| " tsch 0(%2)\n" |
| " ipm %0\n" |
| " srl %0,28" |
| : "=d" (ccode) |
| : "d" (irq | 0x10000L), "a" (addr) |
| : "cc", "1" ); |
| return ccode; |
| } |
| |
| static inline int tpi( volatile struct tpi_info *addr) |
| { |
| int ccode; |
| |
| __asm__ __volatile__( |
| " tpi 0(%1)\n" |
| " ipm %0\n" |
| " srl %0,28" |
| : "=d" (ccode) |
| : "a" (addr) |
| : "cc", "1" ); |
| return ccode; |
| } |
| |
| static inline int ssch(int irq, volatile struct orb *addr) |
| { |
| int ccode; |
| |
| __asm__ __volatile__( |
| " lr 1,%1\n" |
| " ssch 0(%2)\n" |
| " ipm %0\n" |
| " srl %0,28" |
| : "=d" (ccode) |
| : "d" (irq | 0x10000L), "a" (addr) |
| : "cc", "1" ); |
| return ccode; |
| } |
| |
| static inline int rsch(int irq) |
| { |
| int ccode; |
| |
| __asm__ __volatile__( |
| " lr 1,%1\n" |
| " rsch\n" |
| " ipm %0\n" |
| " srl %0,28" |
| : "=d" (ccode) |
| : "d" (irq | 0x10000L) |
| : "cc", "1" ); |
| return ccode; |
| } |
| |
| static inline int csch(int irq) |
| { |
| int ccode; |
| |
| __asm__ __volatile__( |
| " lr 1,%1\n" |
| " csch\n" |
| " ipm %0\n" |
| " srl %0,28" |
| : "=d" (ccode) |
| : "d" (irq | 0x10000L) |
| : "cc", "1" ); |
| return ccode; |
| } |
| |
| static inline int hsch(int irq) |
| { |
| int ccode; |
| |
| __asm__ __volatile__( |
| " lr 1,%1\n" |
| " hsch\n" |
| " ipm %0\n" |
| " srl %0,28" |
| : "=d" (ccode) |
| : "d" (irq | 0x10000L) |
| : "cc", "1" ); |
| return ccode; |
| } |
| |
| static inline int xsch(int irq) |
| { |
| int ccode; |
| |
| __asm__ __volatile__( |
| " lr 1,%1\n" |
| " .insn rre,0xb2760000,%1,0\n" |
| " ipm %0\n" |
| " srl %0,28" |
| : "=d" (ccode) |
| : "d" (irq | 0x10000L) |
| : "cc", "1" ); |
| return ccode; |
| } |
| |
| static inline int chsc(void *chsc_area) |
| { |
| int cc; |
| |
| __asm__ __volatile__ ( |
| ".insn rre,0xb25f0000,%1,0 \n\t" |
| "ipm %0 \n\t" |
| "srl %0,28 \n\t" |
| : "=d" (cc) |
| : "d" (chsc_area) |
| : "cc" ); |
| |
| return cc; |
| } |
| |
| static inline int iac( void) |
| { |
| int ccode; |
| |
| __asm__ __volatile__( |
| " iac 1\n" |
| " ipm %0\n" |
| " srl %0,28" |
| : "=d" (ccode) : : "cc", "1" ); |
| return ccode; |
| } |
| |
| static inline int rchp(int chpid) |
| { |
| int ccode; |
| |
| __asm__ __volatile__( |
| " lr 1,%1\n" |
| " rchp\n" |
| " ipm %0\n" |
| " srl %0,28" |
| : "=d" (ccode) |
| : "d" (chpid) |
| : "cc", "1" ); |
| return ccode; |
| } |
| |
| #endif |