import of upstream 2.4.34.4 from kernel.org
[linux-2.4.git] / drivers / fc4 / soc.h
1 /* soc.h: Definitions for Sparc SUNW,soc Fibre Channel Sbus driver.
2  *
3  * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
4  */
5
6 #ifndef __SOC_H
7 #define __SOC_H
8
9 #include "fc.h"
10 #include "fcp.h"
11 #include "fcp_impl.h"
12
13 /* Hardware register offsets and constants first {{{ */
14 #define CFG     0x00UL          /* Config Register */
15 #define SAE     0x04UL          /* Slave Access Error Register */
16 #define CMD     0x08UL          /* Command and Status Register */
17 #define IMASK   0x0cUL          /* Interrupt Mask Register */
18
19 /* Config Register */
20 #define SOC_CFG_EXT_RAM_BANK_MASK       0x07000000
21 #define SOC_CFG_EEPROM_BANK_MASK        0x00030000
22 #define SOC_CFG_BURST64_MASK            0x00000700
23 #define SOC_CFG_SBUS_PARITY_TEST        0x00000020
24 #define SOC_CFG_SBUS_PARITY_CHECK       0x00000010
25 #define SOC_CFG_SBUS_ENHANCED           0x00000008
26 #define SOC_CFG_BURST_MASK              0x00000007
27 /* Bursts */
28 #define SOC_CFG_BURST_4                 0x00000000
29 #define SOC_CFG_BURST_16                0x00000004
30 #define SOC_CFG_BURST_32                0x00000005
31 #define SOC_CFG_BURST_64                0x00000006
32
33 /* Slave Access Error Register */
34 #define SOC_SAE_ALIGNMENT               0x00000004
35 #define SOC_SAE_UNSUPPORTED             0x00000002
36 #define SOC_SAE_PARITY                  0x00000001
37
38 /* Command & Status Register */
39 #define SOC_CMD_RSP_QALL                0x000f0000
40 #define SOC_CMD_RSP_Q0                  0x00010000
41 #define SOC_CMD_RSP_Q1                  0x00020000
42 #define SOC_CMD_RSP_Q2                  0x00040000
43 #define SOC_CMD_RSP_Q3                  0x00080000
44 #define SOC_CMD_REQ_QALL                0x00000f00
45 #define SOC_CMD_REQ_Q0                  0x00000100
46 #define SOC_CMD_REQ_Q1                  0x00000200
47 #define SOC_CMD_REQ_Q2                  0x00000400
48 #define SOC_CMD_REQ_Q3                  0x00000800
49 #define SOC_CMD_SAE                     0x00000080
50 #define SOC_CMD_INTR_PENDING            0x00000008
51 #define SOC_CMD_NON_QUEUED              0x00000004
52 #define SOC_CMD_IDLE                    0x00000002
53 #define SOC_CMD_SOFT_RESET              0x00000001
54
55 /* Interrupt Mask Register */
56 #define SOC_IMASK_RSP_QALL              0x000f0000
57 #define SOC_IMASK_RSP_Q0                0x00010000
58 #define SOC_IMASK_RSP_Q1                0x00020000
59 #define SOC_IMASK_RSP_Q2                0x00040000
60 #define SOC_IMASK_RSP_Q3                0x00080000
61 #define SOC_IMASK_REQ_QALL              0x00000f00
62 #define SOC_IMASK_REQ_Q0                0x00000100
63 #define SOC_IMASK_REQ_Q1                0x00000200
64 #define SOC_IMASK_REQ_Q2                0x00000400
65 #define SOC_IMASK_REQ_Q3                0x00000800
66 #define SOC_IMASK_SAE                   0x00000080
67 #define SOC_IMASK_NON_QUEUED            0x00000004
68
69 #define SOC_INTR(s, cmd) \
70         (((cmd & SOC_CMD_RSP_QALL) | ((~cmd) & SOC_CMD_REQ_QALL)) \
71          & s->imask)
72          
73 #define SOC_SETIMASK(s, i) \
74 do {    (s)->imask = (i); \
75         sbus_writel((i), (s)->regs + IMASK); \
76 } while(0)
77
78 /* XRAM
79  *
80  * This is a 64KB register area. It accepts only halfword access.
81  * That's why here are the following inline functions...
82  */
83  
84 typedef unsigned long xram_p;
85
86 /* Get 32bit number from XRAM */
87 static inline u32 xram_get_32 (xram_p x)
88 {
89         return ((sbus_readw(x + 0x00UL) << 16) |
90                 (sbus_readw(x + 0x02UL)));
91 }
92
93 /* Like the above, but when we don't care about the high 16 bits */
94 static inline u32 xram_get_32low (xram_p x)
95 {
96         return (u32) sbus_readw(x + 0x02UL);
97 }
98
99 static inline u16 xram_get_16 (xram_p x)
100 {
101         return sbus_readw(x);
102 }
103
104 static inline u8 xram_get_8 (xram_p x)
105 {
106         if (x & (xram_p)0x1) {
107                 x = x - 1;
108                 return (u8) sbus_readw(x);
109         } else {
110                 return (u8) (sbus_readw(x) >> 8);
111         }
112 }
113
114 static inline void xram_copy_from (void *p, xram_p x, int len)
115 {
116         for (len >>= 2; len > 0; len--, x += sizeof(u32)) {
117                 u32 val;
118
119                 val = ((sbus_readw(x + 0x00UL) << 16) |
120                        (sbus_readw(x + 0x02UL)));
121                 *(u32 *)p = val;
122                 p += sizeof(u32);
123         }
124 }
125
126 static inline void xram_copy_to (xram_p x, void *p, int len)
127 {
128         for (len >>= 2; len > 0; len--, x += sizeof(u32)) {
129                 u32 tmp = *(u32 *)p;
130                 p += sizeof(u32);
131                 sbus_writew(tmp >> 16, x + 0x00UL);
132                 sbus_writew(tmp, x + 0x02UL);
133         }
134 }
135
136 static inline void xram_bzero (xram_p x, int len)
137 {
138         for (len >>= 1; len > 0; len--, x += sizeof(u16))
139                 sbus_writew(0, x);
140 }
141
142 /* Circular Queue */
143
144 #define SOC_CQ_REQ_OFFSET       (0x100 * sizeof(u16))
145 #define SOC_CQ_RSP_OFFSET       (0x110 * sizeof(u16))
146
147 typedef struct {
148         u32                     address;
149         u8                      in;
150         u8                      out;
151         u8                      last;
152         u8                      seqno;
153 } soc_hw_cq;
154
155 #define SOC_PORT_A      0x0000  /* From/To Port A */
156 #define SOC_PORT_B      0x0001  /* From/To Port A */
157 #define SOC_FC_HDR      0x0002  /* Contains FC Header */
158 #define SOC_NORSP       0x0004  /* Don't generate response nor interrupt */
159 #define SOC_NOINT       0x0008  /* Generate response but not interrupt */
160 #define SOC_XFERRDY     0x0010  /* Generate XFERRDY */
161 #define SOC_IGNOREPARAM 0x0020  /* Ignore PARAM field in the FC header */
162 #define SOC_COMPLETE    0x0040  /* Command completed */
163 #define SOC_UNSOLICITED 0x0080  /* For request this is the packet to establish unsolicited pools, */
164                                 /* for rsp this is unsolicited packet */
165 #define SOC_STATUS      0x0100  /* State change (on/off line) */
166
167 typedef struct {
168         u32                     token;
169         u16                     flags;
170         u8                      class;
171         u8                      segcnt;
172         u32                     bytecnt;
173 } soc_hdr;
174
175 typedef struct {
176         u32                     base;
177         u32                     count;
178 } soc_data;
179
180 #define SOC_CQTYPE_OUTBOUND     0x01
181 #define SOC_CQTYPE_INBOUND      0x02
182 #define SOC_CQTYPE_SIMPLE       0x03
183 #define SOC_CQTYPE_IO_WRITE     0x04
184 #define SOC_CQTYPE_IO_READ      0x05
185 #define SOC_CQTYPE_UNSOLICITED  0x06
186 #define SOC_CQTYPE_DIAG         0x07
187 #define SOC_CQTYPE_OFFLINE      0x08
188 #define SOC_CQTYPE_RESPONSE     0x10
189 #define SOC_CQTYPE_INLINE       0x20
190
191 #define SOC_CQFLAGS_CONT        0x01
192 #define SOC_CQFLAGS_FULL        0x02
193 #define SOC_CQFLAGS_BADHDR      0x04
194 #define SOC_CQFLAGS_BADPKT      0x08
195
196 typedef struct {
197         soc_hdr                 shdr;
198         soc_data                data[3];
199         fc_hdr                  fchdr;
200         u8                      count;
201         u8                      type;
202         u8                      flags;
203         u8                      seqno;
204 } soc_req;
205
206 #define SOC_OK                  0
207 #define SOC_P_RJT               2
208 #define SOC_F_RJT               3
209 #define SOC_P_BSY               4
210 #define SOC_F_BSY               5
211 #define SOC_ONLINE              0x10
212 #define SOC_OFFLINE             0x11
213 #define SOC_TIMEOUT             0x12
214 #define SOC_OVERRUN             0x13
215 #define SOC_UNKOWN_CQ_TYPE      0x20
216 #define SOC_BAD_SEG_CNT         0x21
217 #define SOC_MAX_XCHG_EXCEEDED   0x22
218 #define SOC_BAD_XID             0x23
219 #define SOC_XCHG_BUSY           0x24
220 #define SOC_BAD_POOL_ID         0x25
221 #define SOC_INSUFFICIENT_CQES   0x26
222 #define SOC_ALLOC_FAIL          0x27
223 #define SOC_BAD_SID             0x28
224 #define SOC_NO_SEG_INIT         0x29
225
226 typedef struct {
227         soc_hdr                 shdr;
228         u32                     status;
229         soc_data                data;
230         u8                      xxx1[12];
231         fc_hdr                  fchdr;
232         u8                      count;
233         u8                      type;
234         u8                      flags;
235         u8                      seqno;
236 } soc_rsp;
237
238 /* }}} */
239
240 /* Now our software structures and constants we use to drive the beast {{{ */
241
242 #define SOC_CQ_REQ0_SIZE        4
243 #define SOC_CQ_REQ1_SIZE        64
244 #define SOC_CQ_RSP0_SIZE        8
245 #define SOC_CQ_RSP1_SIZE        4
246
247 #define SOC_SOLICITED_RSP_Q     0
248 #define SOC_UNSOLICITED_RSP_Q   1
249
250 struct soc;
251
252 typedef struct {
253         /* This must come first */
254         fc_channel              fc;
255         struct soc              *s;
256         u16                     flags;
257         u16                     mask;
258 } soc_port; 
259
260 typedef struct {
261         soc_hw_cq               *hw_cq; /* Related XRAM cq */
262         soc_req                 *pool;
263         u8                      in;
264         u8                      out;
265         u8                      last;
266         u8                      seqno;
267 } soc_cq;
268
269 struct soc {
270         soc_port                port[2]; /* Every SOC has one or two FC ports */
271         soc_cq                  req[2]; /* Request CQs */
272         soc_cq                  rsp[2]; /* Response CQs */
273         int                     soc_no;
274         unsigned long           regs;
275         xram_p                  xram;
276         fc_wwn                  wwn;
277         u32                     imask;  /* Our copy of regs->imask */
278         u32                     cfg;    /* Our copy of regs->cfg */
279         char                    serv_params[80];
280         struct soc              *next;
281         int                     curr_port; /* Which port will have priority to fcp_queue_empty */
282
283         soc_req                 *req_cpu;
284         u32                     req_dvma;
285 };
286
287 /* }}} */
288
289 #endif /* !(__SOC_H) */