summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun/sys/fdreg.h
blob: 53afa6af5999e6cd4c896eb88646cae6527181cc (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
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (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 (c) 1989-1998,2000 by Sun Microsystems, Inc.
 * All rights reserved.
 */

#ifndef	_SYS_FDREG_H
#define	_SYS_FDREG_H

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

#ifdef	__cplusplus
extern "C" {
#endif


/*
 * Floppy Controller Registers
 */
#ifndef	_ASM
union fdcreg {
	volatile struct {
		uchar_t	fdc_control;
		uchar_t	fdc_fifo;
	} fdc_82072_reg;

	volatile struct fdc_82077_reg {
		uchar_t	fdc_filler1[2];
		uchar_t	fdc_dor;	/* Digital Output Register */
		uchar_t	fdc_filler2;
		uchar_t	fdc_control;	/* DSR on write, MSR on read */
#define			fdc_msr	fdc_control
#define			fdc_dsr	fdc_control
		uchar_t	fdc_fifo;
		uchar_t	fdc_filler3;
		uchar_t	fdc_dir;	/* Digital Input Register */
#define			fdc_ccr	fdc_dir
	} fdc_82077_reg;
};
#endif	/* !_ASM */

/* DSR - data rate select register */
#define	SWR		0x80	/* software reset */
#define	PD		0x40	/* power down */
#define	EPL		0x20	/* enable phase lock loop */
#define	PRECOMPMSK	0x1c	/* precomp mask */
#define	DRSELMSK	0x3	/* data rate select mask */

/* MSR - main status register */
#define	RQM 0x80	/* request for master - chip needs attention */
#define	DIO 0x40	/* data in/out - 1 = remove bytes from fifo */
#define	NDM 0x20	/* non-dma mode - 1 during execution phase */
#define	CB  0x10	/* controller busy - command in progress */

/* command types */
#define	GPLN 0x1b	/* gap length for read/write command */
#define	GPLF 0x54	/* gap length for format command */
#define	FDATA 0xe5	/* fill data fields during format */

/* commands */

/* 0x00-0x01 not defined */
#define	RDTRK		0x02
#define	SPECIFY		0x03
#define	SNSDSTAT	0x04
#define	WRTCMD		0x05
#define	RDCMD		0x06
#define	RECALIBRATE	0x07
#define	SNSISTAT	0x08	/* Sense Interrupt Status */
#define	WRTDEL		0x09	/* Write Deleted Data Sector */
#define	RDID		0x0A	/* Read Identifier */
#define	MTONOFF		0x0B	/* motor on/off */
#define	RDDEL		0x0C	/* Read Deleted Data Sector */
#define	FMTTRK		0x0D	/* Format Track */
#define	DUMPREG		0x0E	/* Dump Registers */
#define	SEEK		0x0F	/* Seek */
/* 0x10-0x12 not defined */
#define	CONFIGURE	0x13
/* 0x14-0x1F not defined */

/* Modifier bits for the command byte */
#define	MT		0x80
#define	MFM		0x40
#define	SK		0x20
#define	MOT		0x80
#define	IPS		0x80	/* Used for South Bridge superI/O */


#define	SSSDTL		0xff	/* special sector size */

#define	NCBRW		0x09	/* number cmd bytes for read/write cmds */
#define	NRBRW		0x07	/* number result bytes for read/write cmds */

/* results */
/* status reg0 */
#define	IC_SR0		0xc0	/* interrupt code */
#define	SE_SR0		0x20	/* seek end */
#define	EC_SR0		0x10	/* equipment check */
#define	NR_SR0		0x08	/* not ready */
#define	H_SR0		0x04	/* head address */
#define	DS_SR0		0x03	/* drive select */

/* status reg1 */
#define	EN_SR1		0x80	/* end of cylinder */
#define	DE_SR1		0x20	/* data error */
#define	OR_SR1		0x10	/* overrun/underrun */
#define	ND_SR1		0x04	/* no data */
#define	NW_SR1		0x02	/* not writable */
#define	MA_SR1		0x01	/* missing address mark */
#define	TO_SR1		0x08	/* Timeout */

/* status reg3 */
#define	WP_SR3		0x40	/* write protected */
#define	T0_SR3		0x10	/* track zero */

/* DOR - Digital Output register - 82077 only */
#define	EJECT   	0x80	/* eject diskette - was in Auxio */
#define	EJECT_DMA	0x20	/* eject diskette - on DMA platform */
#define	MOTEN(unit) 	(unit ? 0x30 : 0x10) 	/* motor enable bit */
#define	DMAGATE 	0x8	/* must be high to enable interrupts */
#define	RESET   	0x4	/* reset bit */
#define	DRVSEL		0x1 	/* drive select */

/* DIR - Digital Input register - 82077 only */
#define	DSKCHG  0x80		/* diskette was changed - was in Auxio */

#define	DRV_MASK	0x03	/* drive mask for the second command byte */

#ifndef	_ASM
#define	Moton_delay	(drv_usectohz(750000))		/* motor on delay */
							/* 0.75 seconds */
#define	Motoff_delay	(6 * drv_usectohz(1000000))	/* motor off delay */
							/* 6 seconds */

/* Macros to set and retrieve data from the controller registers */
#define	Msr(fdc)	ddi_get8(fdc->c_handlep_cont, \
					((uint8_t *)fdc->c_control))
#define	Dsr(fdc, val)   ddi_put8(fdc->c_handlep_cont, \
					((uint8_t *)fdc->c_control),\
					((uint8_t)val))
#define	Dir(fdc)	ddi_get8(fdc->c_handlep_cont, \
					((uint8_t *)fdc->c_dir))
#define	Fifo(fdc)	ddi_get8(fdc->c_handlep_cont, \
					((uint8_t *)fdc->c_fifo))
#define	Set_Fifo(fdc, val) ddi_put8(fdc->c_handlep_cont, \
					((uint8_t *)fdc->c_fifo), \
					((uint8_t)val))
#define	Dor(fdc)	ddi_get8(fdc->c_handlep_cont, ((uint8_t *)fdc->c_dor))
#define	Set_dor(fdc, val, flag) \
	{ if (flag) \
		ddi_put8(fdc->c_handlep_cont, ((uint8_t *)fdc->c_dor), \
			((uint8_t)(Dor(fdc) | (val)))); \
	    else \
		ddi_put8(fdc->c_handlep_cont, ((uint8_t *)fdc->c_dor), \
			((uint8_t)(Dor(fdc) & ~(val)))); }
#endif	/* !_ASM */

/*
 * Auxio Registers
 */

/*
 * Definitions and structures for the floppy Auxiliary Input/Output register
 * for the muchio, slavio, and cheerio I/O subsystem chips
 *
 * In general, muchio is found on sun4c, slavio is found on sun4m and sun4u
 * with Sbus.  Cheerio is found on sun4u with a PCI bus.
 *
 *
 *
 *			07   06   05   04   03   02   01   00
 *	muchio		1    1    DEN  CHG  SEL  TC   EJCT LED
 *	slavio   	1    1    DEN  0    IMUX 0    TC   LED
 *
 * The auxio register is designed poorly from a software perspective.
 *  a) it supports other functions as well as floppy
 *  b) TC is at a different bit position for muchio versus sun4m
 *
 * The cheerio auxio register is only for the floppy and it is a 32 bit
 * register.  It does not contain a TC because the cheerio supports
 * floppy DMA.  Please note that on the slavio auxio, the Digital
 * Output register of the floppy controller contains a Density Select bit.
 * On the cheerio, this bit is muxed with another
 * signal.  So, the cheerio auxio register contains a density select bit.
 *
 *    cheerio auxio bit name	bit#
 *    ------------------------------
 *    Floppy density sense    	0
 *    Floppy desnity select     1
 *    Unused			31:1
 *
 */

/*
 * muchio/slavio: Bits of the auxio register
 *	- when writing to the auxio register, the bits represented by
 *	  AUX_MBO and AUX_MBO4M must be one
 */

#define	AUX_MBO		0xF0		/* Must be written with ones */
#define	AUX_MBO4M	0xC0		/* Must be written with ones */

#define	AUX_TC4M	0x02	/* 4m Floppy termnal count */
				/* 1 = transfer over */
#define	AUX_TC		0x04	/* 4c Floppy terminal count */
				/* 1 = transfer over */
#define	AUX_DENSITY	0x20	/* Floppy density (input value) */
				/* 1 = high, 0 = low */


/*
 * muchio additional floppy auxio bits
 * slavio uses internal dor for these bits
 */

#define	AUX_DISKCHG	0x10		/* Floppy diskette change (input) */
					/* 1 = new diskette inserted */
#define	AUX_DRVSELECT	0x08		/* Floppy drive select (output) */
					/* 1 = selected, 0 = deselected */
#define	AUX_EJECT	0x02		/* Floppy eject (output,NON inverted) */
					/* 0 = eject the diskette */
/*
 * cheerio additional floppy auxio bits
 */

#define	AUX_MEDIUM_DENSITY	0x0	/* Use medium density */
#define	AUX_HIGH_DENSITY	0x2

/*
 * macros to set the Cheerio auxio registers.
 */

#define	Set_auxio(fdc, val)	ddi_put32(fdc->c_handlep_aux, \
				((uint32_t *)fdc->c_auxio_reg), \
				    ((uint32_t)(val)))

#define	Get_auxio(fdc)		ddi_get32(fdc->c_handlep_aux, \
				((uint32_t *)fdc->c_auxio_reg))

/*
 * DMA registers (sun4u only)
 */
#ifndef _ASM
struct	cheerio_dma_reg {
	uint_t fdc_dcsr;		/* Data Control Status Register */
	uint_t fdc_dacr;		/* DMA Address Count Registers */
	uint_t fdc_dbcr;		/* DMA Byte Count Register */
};

#define	ISA_REG_LEN	0x500	/* South Bridge dma regs span */
				/* complete 0x500 isa registers. */

struct sb_dma_reg {
	uchar_t sb_dma_regs[ISA_REG_LEN];
};
struct fdc_dma_reg {
	uchar_t fdc_dma_regs[ISA_REG_LEN]; /* registers from isa config space */
};


#endif /* !_ASM */



/*
 * DMA Control and Status Register(DCSR) definitions.  See Cheerio spec
 * for more details
 */
#define	DCSR_INT_PEND 	0x00000001	/* 1= floppy interrupts */
#define	DCSR_ERR_PEND 	0x00000002	/* 1= host bus error detected */
#define	DCSR_INT_EN 	0x00000010	/* 1= enable floppy interrupts */
#define	DCSR_RESET  	0x00000080	/* 1= resets the DCSR */
#define	DCSR_WRITE  	0x00000100  	/* DMA direction; 1 = memory */
#define	DCSR_EN_DMA  	0x00000200  	/* 1= enable DMA */
#define	DCSR_CYC_PEND	0x00000400	/* 1 = DMA pending */
#define	DCSR_EN_CNT 	0x00002000	/* 1= enables byte counter */
#define	DCSR_TC		0x00004000  	/* 1= Terminal Count occurred */
#define	DCSR_CSR_DRAIN 	0x00000000 	/* 1= disable draining */
#define	DCSR_BURST_0    0x00080000 	/* Burst Size bit 0 */
#define	DCSR_BURST_1    0x00040000 	/* Burst Size bit 1 */
#define	DCSR_DIAG	0x00000000 	/* 1= diag enable */
#define	DCSR_TCI_DIS 	0x00800000	/* 1= TC won't cause interrupt */
#define	DCSR_INIT_BITS  DCSR_INT_EN | DCSR_EN_CNT | DCSR_CSR_DRAIN  \
			| fd_burstsize \
			| DCSR_TCI_DIS | DCSR_EN_DMA

#ifdef	__cplusplus
}
#endif

#endif	/* !_SYS_FDREG_H */