summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun/sys/socalreg.h
blob: 6e18a6a30aab2528666de2008a4113b8b2bbf6ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 1998 Sun Microsystems, Inc. All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_SOCALREG_H
#define	_SYS_SOCALREG_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef __cplusplus
extern "C" {
#endif

/*
 * socalreg.h:
 *
 * 	SOC+ Register Definitions, Interface Adaptor to Fiber Channel
 */

#define	N_SOCAL_NPORTS	2

/*
 * Define the SOC+ configuration register bits.
 */
typedef union socal_cr_register {
	struct cr {
		uint_t	aaa:5;
		uint_t	ramsel:3;	/* Ram bank select. */
		uint_t	bbb:6;
		uint_t	eepromsel:2;	/* Eeprom bank select. */
		uint_t	ccc:5;
		uint_t	burst64:3;	/* Sbus Burst size, 64 bit mode. */
		uint_t	ddd:2;
		uint_t	parenable:1;	/* Partity test enable. */
		uint_t	parsbus:1;	/* Sbus Parity checking. */
		uint_t	sbusmode:1;	/* Enhanced Sbus mode. */
		uint_t	sbusburst:3;	/* Sbus burst size. */
	} reg;
	uint32_t	w;
} socal_cr_reg_t;

/*
 * Define Configuration register bits.
 */

#define	SOCAL_CR_SBUS_BURST_SIZE_MASK		0x007
#define	SOCAL_CR_SBUS_BURST_SIZE_64BIT_MASK	0x700
#define	SOCAL_CR_SBUS_BURST_SIZE_64BIT(a)	\
	(((a) & SOCAL_CR_SBUS_BURST_SIZE_64BIT_MASK) >> 8)

#define	SOCAL_CR_BURST_4		0x0
#define	SOCAL_CR_BURST_8		0x3
#define	SOCAL_CR_BURST_16		0x4
#define	SOCAL_CR_BURST_32		0x5
#define	SOCAL_CR_BURST_64		0x6
#define	SOCAL_CR_BURST_128		0x7

#define	SOCAL_CR_SBUS_ENHANCED		0x08
#define	SOCAL_CR_SBUS_PARITY_CHK	0x10
#define	SOCAL_CR_SBUS_PARITY_TEST	0x20

#define	SOCAL_CR_EEPROM_BANK_MASK	0x30000
#define	SOCAL_CR_EEPROM_BANK(a)	(((a) & SOCAL_CR_EEPROM_BANK_MASK) >> 16)

#define	SOCAL_CR_EXTERNAL_RAM_BANK_MASK	0x7000000
#define	SOCAL_CR_EXTERNAL_RAM_BANK(a) \
	(((a) & SOCAL_CR_EXTERNAL_RAM_BANK_MASK) >> 24)

/*
 * Define SOC+ Slave Access Register.
 */
typedef union socal_sae_register {
	struct sae {
		uint_t	aaa:29;			/* Reserved. */
		uint_t	alignment_err:1;	/* Soc Alignment Error. */
		uint_t	bad_size_err:1;		/* Bad Size error. */
		uint_t	parity_err:1;		/* Parity Error. */
	} reg;
	uint32_t	w;
} socal_sae_reg_t;

/*
 * Define the Slave Access Regsiter Bits.
 */

#define	SOCAL_SAE_PARITY_ERROR		0x01
#define	SOCAL_SAE_UNSUPPORTED_TRANSFER	0x02
#define	SOCAL_SAE_ALIGNMENT_ERROR	0x04

/*
 * Define SOC+ Command and Status Register.
 */
typedef union socal_csr_register {
	struct csr {
		uint_t	comm_param:8;	/* Communication Parameters. */
		uint_t	aaa:4;
		uint_t	socal_to_host:4;	/* Soc to host attention. */
		uint_t	bbb:4;
		uint_t	host_to_socal:4;	/* Host to soc+ attention. */
		uint_t	sae:1;		/* Slave access error indicator. */
		uint_t	ccc:3;
		uint_t	int_pending:1;	/* Interrupt Pending. */
		uint_t	nqcmd:1;	/* Non queued command */
		uint_t	idle:1;		/* SOC+ idle indicator. */
		uint_t	reset:1;	/* Software Reset. */
	} reg;
	uint32_t	w;
} socal_csr_reg_t;


/*
 * Define SOC+ CSR Register Macros.
 */
#define	SOCAL_CSR_ZEROS		0x00000070
#define	SOCAL_CSR_SOCAL_TO_HOST	0x000f0000
#define	SOCAL_CSR_HOST_TO_SOCAL	0x00000f00
#define	SOCAL_CSR_SLV_ACC_ERR	0x00000080
#define	SOCAL_CSR_INT_PENDING	0x00000008
#define	SOCAL_CSR_NON_Q_CMD	0x00000004
#define	SOCAL_CSR_IDLE		0x00000002
#define	SOCAL_CSR_SOFT_RESET	0x00000001

#define	SOCAL_CSR_1ST_S_TO_H	0x00010000
#define	SOCAL_CSR_1ST_H_TO_S	0x00000100

#define	SOCAL_CSR_RSP_QUE_0	SOCAL_CSR_1ST_S_TO_H
#define	SOCAL_CSR_RSP_QUE_1	0x00020000
#define	SOCAL_CSR_RSP_QUE_2	0x00040000
#define	SOCAL_CSR_RSP_QUE_3	0x00080000

#define	SOCAL_CSR_REQ_QUE_0	SOCAL_CSR_1ST_H_TO_S
#define	SOCAL_CSR_REQ_QUE_1	0x00000200
#define	SOCAL_CSR_REQ_QUE_2	0x00000400
#define	SOCAL_CSR_REQ_QUE_3	0x00000800

/*
 * Define SOC Interrupt Mask Register Bits.
 */

#define	SOCAL_IMR_NON_QUEUED_STATE	0x04
#define	SOCAL_IMR_SLAVE_ACCESS_ERROR	0x80

#define	SOCAL_IMR_REQUEST_QUEUE_0	0x100
#define	SOCAL_IMR_REQUEST_QUEUE_1	0x200
#define	SOCAL_IMR_REQUEST_QUEUE_2	0x400
#define	SOCAL_IMR_REQUEST_QUEUE_3	0x800

#define	SOCAL_IMR_RESPONSE_QUEUE_0	0x10000
#define	SOCAL_IMR_RESPONSE_QUEUE_1	0x20000
#define	SOCAL_IMR_RESPONSE_QUEUE_2	0x40000
#define	SOCAL_IMR_RESPONSE_QUEUE_3	0x80000

/*
 * Define SOC+ Request Queue Index Register
 */
typedef union socal_reqp_register {
	struct reqp {
		uint_t	reqq0_index:8;
		uint_t	reqq1_index:8;
		uint_t	reqq2_index:8;
		uint_t	reqq3_index:8;
	} reg;
	uint32_t	w;
} socal_reqp_reg_t;

#define	SOCAL_REQUESTQ0_MASK	0xff000000
#define	SOCAL_REQUESTQ1_MASK	0x00ff0000
#define	SOCAL_REQUESTQ2_MASK	0x0000ff00
#define	SOCAL_REQUESTQ3_MASK	0x000000ff

#define	SOCAL_REQUESTQ0_INDEX(a) (((a) & SOCAL_REQUESTQ0_MASK) >> 24)
#define	SOCAL_REQUESTQ1_INDEX(a) (((a) & SOCAL_REQUESTQ1_MASK) >> 16)
#define	SOCAL_REQUESTQ2_INDEX(a) (((a) & SOCAL_REQUESTQ2_MASK) >> 8)
#define	SOCAL_REQUESTQ3_INDEX(a) ((a) & SOCAL_REQUESTQ3_MASK)

#define	SOCAL_REQUESTQ_INDEX(a, b) ((b)>>((3-(a))<<3) & 0xff)

/*
 * Define SOC+ Response Queue Index Register
 */
typedef union socal_rspp_register {
	struct rspp {
		uint_t	rspq0_index:8;
		uint_t	rspq1_index:8;
		uint_t	rspq2_index:8;
		uint_t	rspq3_index:8;
	} reg;
	uint32_t	w;
} socal_rspp_reg_t;

#define	SOCAL_RESPONSEQ0_MASK	0xff000000
#define	SOCAL_RESPONSEQ1_MASK	0x00ff0000
#define	SOCAL_RESPONSEQ2_MASK	0x0000ff00
#define	SOCAL_RESPONSEQ3_MASK	0x000000ff

#define	SOCAL_RESPONSEQ0_INDEX(a) (((a) & SOCAL_RESPONSEQ0_MASK) >> 24)
#define	SOCAL_RESPONSEQ1_INDEX(a) (((a) & SOCAL_RESPONSEQ1_MASK) >> 16)
#define	SOCAL_RESPONSEQ2_INDEX(a) (((a) & SOCAL_RESPONSEQ2_MASK) >> 8)
#define	SOCAL_RESPONSEQ3_INDEX(a) ((a) & SOCAL_RESPONSEQ3_MASK)

#define	SOCAL_RESPONSEQ_INDEX(a, b) ((b)>>((3-(a))<<3) & 0xff)

typedef struct _socalreg_ {
	socal_cr_reg_t		socal_cr;	/* Configuration reg */
	socal_sae_reg_t		socal_sae;	/* Slave access error reg */
	socal_csr_reg_t		socal_csr;	/* Command Status reg */
	uint32_t		socal_imr;	/* Interrupt Mask reg */
	socal_reqp_reg_t	socal_reqp;	/* request queue index reg */
	socal_rspp_reg_t	socal_rspp;	/* response queue index reg */
} socal_reg_t;

/*
 * Device Address Space Offsets.
 */

#define	SOCAL_XRAM_OFFSET	0x10000
#define	SOCAL_XRAM_SIZE		0x10000

#define	SOCAL_MAX_XCHG		1024

#define	SOCAL_REG_OFFSET	(SOCAL_XRAM_OFFSET + SOCAL_XRAM_SIZE)

#define	SOCAL_CQ_REQUEST_OFFSET (SOCAL_XRAM_OFFSET + 0x200)
#define	SOCAL_CQ_RESPONSE_OFFSET (SOCAL_XRAM_OFFSET + 0x220)


#define	SOCAL_INTR_CAUSE(socalp, csr) \
	(((csr) & SOCAL_CSR_SOCAL_TO_HOST) | \
	((~csr) & (SOCAL_CSR_HOST_TO_SOCAL))) & socalp->socal_k_imr

/*
 * Bus dma burst sizes
 */
#ifndef BURSTSIZE
#define	BURSTSIZE
#define	BURST1			0x01
#define	BURST2			0x02
#define	BURST4			0x04
#define	BURST8			0x08
#define	BURST16			0x10
#define	BURST32			0x20
#define	BURST64			0x40
#define	BURST128		0x80
#define	BURSTSIZE_MASK		0xff
#define	DEFAULT_BURSTSIZE	BURST16|BURST8|BURST4|BURST2|BURST1
#endif  /* BURSTSIZE */

#ifdef __cplusplus
}
#endif

#endif /* !_SYS_SOCALREG_H */