blob: be6e2f5e11f75595621c69b77aaf3b15ef732f8c [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001#ifndef S390_CIO_IOASM_H
2#define S390_CIO_IOASM_H
3
Peter Oberparleitere5854a52007-04-27 16:01:31 +02004#include <asm/chpid.h>
Cornelia Huck9d92a7e2008-07-14 09:59:05 +02005#include <asm/schid.h>
Sebastian Ottdbda8ce2011-03-15 17:08:24 +01006#include "orb.h"
7#include "cio.h"
Cornelia Hucka8237fc2006-01-06 00:19:21 -08008
Linus Torvalds1da177e2005-04-16 15:20:36 -07009/*
10 * TPI info structure
11 */
12struct tpi_info {
Cornelia Hucka8237fc2006-01-06 00:19:21 -080013 struct subchannel_id schid;
Linus Torvalds1da177e2005-04-16 15:20:36 -070014 __u32 intparm; /* interruption parameter */
15 __u32 adapter_IO : 1;
16 __u32 reserved2 : 1;
17 __u32 isc : 3;
18 __u32 reserved3 : 12;
19 __u32 int_type : 3;
20 __u32 reserved4 : 12;
21} __attribute__ ((packed));
22
23
24/*
25 * Some S390 specific IO instructions as inline
26 */
27
Peter Oberparleiter62e65da2015-12-18 12:58:47 +010028static inline int stsch(struct subchannel_id schid, struct schib *addr)
Cornelia Huckfb6958a2006-01-06 00:19:25 -080029{
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +020030 register struct subchannel_id reg1 asm ("1") = schid;
31 int ccode = -EIO;
Cornelia Huckfb6958a2006-01-06 00:19:25 -080032
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +020033 asm volatile(
Peter Oberparleiterf9c9fe32008-10-10 21:33:15 +020034 " stsch 0(%3)\n"
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +020035 "0: ipm %0\n"
36 " srl %0,28\n"
Cornelia Huckfb6958a2006-01-06 00:19:25 -080037 "1:\n"
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +020038 EX_TABLE(0b,1b)
Peter Oberparleiterf9c9fe32008-10-10 21:33:15 +020039 : "+d" (ccode), "=m" (*addr)
40 : "d" (reg1), "a" (addr)
41 : "cc");
Cornelia Huckfb6958a2006-01-06 00:19:25 -080042 return ccode;
43}
44
Peter Oberparleiterf9c9fe32008-10-10 21:33:15 +020045static inline int msch(struct subchannel_id schid, struct schib *addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -070046{
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +020047 register struct subchannel_id reg1 asm ("1") = schid;
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +020048 int ccode = -EIO;
Linus Torvalds1da177e2005-04-16 15:20:36 -070049
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +020050 asm volatile(
51 " msch 0(%2)\n"
52 "0: ipm %0\n"
53 " srl %0,28\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -070054 "1:\n"
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +020055 EX_TABLE(0b,1b)
Peter Oberparleiterf9c9fe32008-10-10 21:33:15 +020056 : "+d" (ccode)
57 : "d" (reg1), "a" (addr), "m" (*addr)
58 : "cc");
Linus Torvalds1da177e2005-04-16 15:20:36 -070059 return ccode;
60}
61
Peter Oberparleiterf9c9fe32008-10-10 21:33:15 +020062static inline int tsch(struct subchannel_id schid, struct irb *addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -070063{
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +020064 register struct subchannel_id reg1 asm ("1") = schid;
Linus Torvalds1da177e2005-04-16 15:20:36 -070065 int ccode;
66
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +020067 asm volatile(
Peter Oberparleiterf9c9fe32008-10-10 21:33:15 +020068 " tsch 0(%3)\n"
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +020069 " ipm %0\n"
70 " srl %0,28"
Peter Oberparleiterf9c9fe32008-10-10 21:33:15 +020071 : "=d" (ccode), "=m" (*addr)
72 : "d" (reg1), "a" (addr)
73 : "cc");
Linus Torvalds1da177e2005-04-16 15:20:36 -070074 return ccode;
75}
76
Sebastian Ottdbda8ce2011-03-15 17:08:24 +010077static inline int ssch(struct subchannel_id schid, union orb *addr)
78{
79 register struct subchannel_id reg1 asm("1") = schid;
80 int ccode = -EIO;
81
82 asm volatile(
83 " ssch 0(%2)\n"
84 "0: ipm %0\n"
85 " srl %0,28\n"
86 "1:\n"
87 EX_TABLE(0b, 1b)
88 : "+d" (ccode)
89 : "d" (reg1), "a" (addr), "m" (*addr)
90 : "cc", "memory");
91 return ccode;
92}
93
94static inline int csch(struct subchannel_id schid)
95{
96 register struct subchannel_id reg1 asm("1") = schid;
97 int ccode;
98
99 asm volatile(
100 " csch\n"
101 " ipm %0\n"
102 " srl %0,28"
103 : "=d" (ccode)
104 : "d" (reg1)
105 : "cc");
106 return ccode;
107}
108
Peter Oberparleiterf9c9fe32008-10-10 21:33:15 +0200109static inline int tpi(struct tpi_info *addr)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110{
111 int ccode;
112
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +0200113 asm volatile(
Peter Oberparleiterf9c9fe32008-10-10 21:33:15 +0200114 " tpi 0(%2)\n"
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +0200115 " ipm %0\n"
116 " srl %0,28"
Peter Oberparleiterf9c9fe32008-10-10 21:33:15 +0200117 : "=d" (ccode), "=m" (*addr)
118 : "a" (addr)
119 : "cc");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120 return ccode;
121}
122
Cornelia Huck4c24da72005-09-03 15:58:01 -0700123static inline int chsc(void *chsc_area)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124{
Cornelia Hucka8237fc2006-01-06 00:19:21 -0800125 typedef struct { char _[4096]; } addr_type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700126 int cc;
127
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +0200128 asm volatile(
129 " .insn rre,0xb25f0000,%2,0\n"
130 " ipm %0\n"
131 " srl %0,28\n"
Cornelia Hucka8237fc2006-01-06 00:19:21 -0800132 : "=d" (cc), "=m" (*(addr_type *) chsc_area)
133 : "d" (chsc_area), "m" (*(addr_type *) chsc_area)
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +0200134 : "cc");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700135 return cc;
136}
137
Peter Oberparleiterf86635f2007-04-27 16:01:26 +0200138static inline int rchp(struct chp_id chpid)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700139{
Peter Oberparleiterf86635f2007-04-27 16:01:26 +0200140 register struct chp_id reg1 asm ("1") = chpid;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700141 int ccode;
142
Martin Schwidefsky94c12cc2006-09-28 16:56:43 +0200143 asm volatile(
144 " lr 1,%1\n"
145 " rchp\n"
146 " ipm %0\n"
147 " srl %0,28"
148 : "=d" (ccode) : "d" (reg1) : "cc");
Linus Torvalds1da177e2005-04-16 15:20:36 -0700149 return ccode;
150}
151
152#endif