xref: /netbsd-src/sys/arch/sparc64/dev/fdcvar.h (revision 4cbd24b23f7b9efac0cd70749df49d28974c7799)
1*4cbd24b2Swiz /*	$NetBSD: fdcvar.h,v 1.3 2011/06/30 20:09:36 wiz Exp $	*/
26238d5faSjnemeth 
36238d5faSjnemeth /*-
46238d5faSjnemeth  * Copyright (c) 1998 The NetBSD Foundation, Inc.
56238d5faSjnemeth  * All rights reserved.
66238d5faSjnemeth  *
76238d5faSjnemeth  * This code is derived from software contributed to The NetBSD Foundation
86238d5faSjnemeth  * by Paul Kranenburg.
96238d5faSjnemeth  *
106238d5faSjnemeth  * Redistribution and use in source and binary forms, with or without
116238d5faSjnemeth  * modification, are permitted provided that the following conditions
126238d5faSjnemeth  * are met:
136238d5faSjnemeth  * 1. Redistributions of source code must retain the above copyright
146238d5faSjnemeth  *    notice, this list of conditions and the following disclaimer.
156238d5faSjnemeth  * 2. Redistributions in binary form must reproduce the above copyright
166238d5faSjnemeth  *    notice, this list of conditions and the following disclaimer in the
176238d5faSjnemeth  *    documentation and/or other materials provided with the distribution.
186238d5faSjnemeth  *
196238d5faSjnemeth  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
206238d5faSjnemeth  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
216238d5faSjnemeth  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
226238d5faSjnemeth  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
236238d5faSjnemeth  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
246238d5faSjnemeth  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
256238d5faSjnemeth  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
266238d5faSjnemeth  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
276238d5faSjnemeth  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
286238d5faSjnemeth  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
296238d5faSjnemeth  * POSSIBILITY OF SUCH DAMAGE.
306238d5faSjnemeth  */
316238d5faSjnemeth 
326238d5faSjnemeth #define	FD_BSIZE(fd)	(128 * (1 << fd->sc_type->secsize))
336238d5faSjnemeth #define	FDC_MAXIOSIZE	NBPG	/* XXX should be MAXBSIZE */
346238d5faSjnemeth 
356238d5faSjnemeth #define FDC_NSTATUS	10
366238d5faSjnemeth 
376238d5faSjnemeth #ifndef _LOCORE
386238d5faSjnemeth struct fdcio {
396238d5faSjnemeth 	bus_space_handle_t	fdcio_handle;
406238d5faSjnemeth 	/*
416238d5faSjnemeth 	 * 82072 (sun4c) and 82077 (sun4m) controllers have different
426238d5faSjnemeth 	 * register layout; so we cache offsets to the registers here.
436238d5faSjnemeth 	 */
446238d5faSjnemeth 	u_int	fdcio_reg_msr;
456238d5faSjnemeth 	u_int	fdcio_reg_fifo;
466238d5faSjnemeth 	u_int	fdcio_reg_dor;		/* 82077 only */
476238d5faSjnemeth 	u_int	fdcio_reg_dir;		/* 82077 only */
486238d5faSjnemeth 
496238d5faSjnemeth 	/*
506238d5faSjnemeth 	 * Interrupt state.
516238d5faSjnemeth 	 */
526238d5faSjnemeth 	int	fdcio_itask;
536238d5faSjnemeth 	int	fdcio_istatus;
546238d5faSjnemeth 
556238d5faSjnemeth 	/*
566238d5faSjnemeth 	 * IO state.
576238d5faSjnemeth 	 */
586238d5faSjnemeth 	char	*fdcio_data;		/* pseudo-DMA data */
596238d5faSjnemeth 	int	fdcio_tc;		/* pseudo-DMA Terminal Count */
606238d5faSjnemeth 	u_char	fdcio_status[FDC_NSTATUS];	/* copy of registers */
616238d5faSjnemeth 	int	fdcio_nstat;		/* # of valid status bytes */
626238d5faSjnemeth 
636238d5faSjnemeth 	/*
646238d5faSjnemeth 	 * Statictics.
656238d5faSjnemeth 	 */
666238d5faSjnemeth 	struct	evcnt	fdcio_intrcnt;
676238d5faSjnemeth };
686238d5faSjnemeth #endif /* _LOCORE */
696238d5faSjnemeth 
706238d5faSjnemeth /* itask values */
716238d5faSjnemeth #define FDC_ITASK_NONE		0	/* No HW interrupt expected */
726238d5faSjnemeth #define FDC_ITASK_SENSEI	1	/* Do SENSEI on next HW interrupt */
736238d5faSjnemeth #define FDC_ITASK_DMA		2	/* Do Pseudo-DMA */
746238d5faSjnemeth #define FDC_ITASK_RESULT	3	/* Pick up command results */
756238d5faSjnemeth 
766238d5faSjnemeth /* istatus values */
776238d5faSjnemeth #define FDC_ISTATUS_NONE	0	/* No status available */
786238d5faSjnemeth #define FDC_ISTATUS_SPURIOUS	1	/* Spurious HW interrupt detected */
796238d5faSjnemeth #define FDC_ISTATUS_ERROR	2	/* Operation completed abnormally */
806238d5faSjnemeth #define FDC_ISTATUS_DONE	3	/* Operation completed normally */
816238d5faSjnemeth 
826238d5faSjnemeth 
836238d5faSjnemeth #define FD_MAX_NSEC 36		/* highest known number of spt - allow for */
846238d5faSjnemeth 				/* 2.88 MB drives */
856238d5faSjnemeth 
866238d5faSjnemeth #ifndef _LOCORE
876238d5faSjnemeth struct ne7_fd_formb {
886238d5faSjnemeth 	int cyl, head;
896238d5faSjnemeth 	int transfer_rate;	/* fdreg.h: FDC_???KBPS */
906238d5faSjnemeth 
916238d5faSjnemeth 	union {
926238d5faSjnemeth 		struct fd_form_data {
936238d5faSjnemeth 			/*
946238d5faSjnemeth 			 * DO NOT CHANGE THE LAYOUT OF THIS STRUCTS
95*4cbd24b2Swiz 			 * it is hardware-dependent since it exactly
966238d5faSjnemeth 			 * matches the byte sequence to write to FDC
976238d5faSjnemeth 			 * during its `format track' operation
986238d5faSjnemeth 			 */
996238d5faSjnemeth 			u_char secshift; /* 0 -> 128, ...; usually 2 -> 512 */
1006238d5faSjnemeth 			u_char nsecs;	/* must be <= FD_MAX_NSEC */
1016238d5faSjnemeth 			u_char gaplen;	/* GAP 3 length; usually 84 */
1026238d5faSjnemeth 			u_char fillbyte; /* usually 0xf6 */
1036238d5faSjnemeth 			struct fd_idfield_data {
1046238d5faSjnemeth 				/*
1056238d5faSjnemeth 				 * data to write into id fields;
1066238d5faSjnemeth 				 * for obscure formats, they mustn't match
1076238d5faSjnemeth 				 * the real values (but mostly do)
1086238d5faSjnemeth 				 */
1096238d5faSjnemeth 				u_char cylno;	/* 0 thru 79 (or 39) */
1106238d5faSjnemeth 				u_char headno;	/* 0, or 1 */
1116238d5faSjnemeth 				u_char secno;	/* starting at 1! */
1126238d5faSjnemeth 				u_char secsize;	/* usually 2 */
1136238d5faSjnemeth 			} idfields[FD_MAX_NSEC]; /* 0 <= idx < nsecs used */
1146238d5faSjnemeth 		} structured;
1156238d5faSjnemeth 		u_char raw[1];	/* to have continuous indexed access */
1166238d5faSjnemeth 	} format_info;
1176238d5faSjnemeth };
1186238d5faSjnemeth 
1196238d5faSjnemeth /* make life easier */
1206238d5faSjnemeth #define fd_formb_secshift   format_info.structured.secshift
1216238d5faSjnemeth #define fd_formb_nsecs      format_info.structured.nsecs
1226238d5faSjnemeth #define fd_formb_gaplen     format_info.structured.gaplen
1236238d5faSjnemeth #define fd_formb_fillbyte   format_info.structured.fillbyte
1246238d5faSjnemeth /* these data must be filled in for(i = 0; i < fd_formb_nsecs; i++) */
1256238d5faSjnemeth #define fd_formb_cylno(i)   format_info.structured.idfields[i].cylno
1266238d5faSjnemeth #define fd_formb_headno(i)  format_info.structured.idfields[i].headno
1276238d5faSjnemeth #define fd_formb_secno(i)   format_info.structured.idfields[i].secno
1286238d5faSjnemeth #define fd_formb_secsize(i) format_info.structured.idfields[i].secsize
1296238d5faSjnemeth #endif /* _LOCORE */
130