xref: /dflybsd-src/stand/boot/common/isapnp.h (revision 479ab7f0492f2a51b48e8537e4f1dc686fc6014b)
1*479ab7f0SSascha Wildner /*
2*479ab7f0SSascha Wildner  * Copyright (c) 1996, Sujal M. Patel
3*479ab7f0SSascha Wildner  * All rights reserved.
4*479ab7f0SSascha Wildner  *
5*479ab7f0SSascha Wildner  * Redistribution and use in source and binary forms, with or without
6*479ab7f0SSascha Wildner  * modification, are permitted provided that the following conditions
7*479ab7f0SSascha Wildner  * are met:
8*479ab7f0SSascha Wildner  * 1. Redistributions of source code must retain the above copyright
9*479ab7f0SSascha Wildner  *    notice, this list of conditions and the following disclaimer.
10*479ab7f0SSascha Wildner  * 2. Redistributions in binary form must reproduce the above copyright
11*479ab7f0SSascha Wildner  *    notice, this list of conditions and the following disclaimer in the
12*479ab7f0SSascha Wildner  *    documentation and/or other materials provided with the distribution.
13*479ab7f0SSascha Wildner  * 3. All advertising materials mentioning features or use of this software
14*479ab7f0SSascha Wildner  *    must display the following acknowledgement:
15*479ab7f0SSascha Wildner  *      This product includes software developed by Sujal M. Patel
16*479ab7f0SSascha Wildner  * 4. Neither the name of the author nor the names of any co-contributors
17*479ab7f0SSascha Wildner  *    may be used to endorse or promote products derived from this software
18*479ab7f0SSascha Wildner  *    without specific prior written permission.
19*479ab7f0SSascha Wildner  *
20*479ab7f0SSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21*479ab7f0SSascha Wildner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22*479ab7f0SSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23*479ab7f0SSascha Wildner  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24*479ab7f0SSascha Wildner  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25*479ab7f0SSascha Wildner  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26*479ab7f0SSascha Wildner  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27*479ab7f0SSascha Wildner  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28*479ab7f0SSascha Wildner  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29*479ab7f0SSascha Wildner  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30*479ab7f0SSascha Wildner  * SUCH DAMAGE.
31*479ab7f0SSascha Wildner  *
32*479ab7f0SSascha Wildner  * $FreeBSD: src/sys/boot/common/isapnp.h,v 1.7 2002/03/20 07:59:37 alfred Exp $
33*479ab7f0SSascha Wildner  */
34*479ab7f0SSascha Wildner 
35*479ab7f0SSascha Wildner #ifndef _BOOT_COMMON_ISAPNP_H_
36*479ab7f0SSascha Wildner #define _BOOT_COMMON_ISAPNP_H_
37*479ab7f0SSascha Wildner 
38*479ab7f0SSascha Wildner /* Maximum Number of PnP Devices.  8 should be plenty */
39*479ab7f0SSascha Wildner #define MAX_PNP_CARDS 8
40*479ab7f0SSascha Wildner 
41*479ab7f0SSascha Wildner /* Static ports to access PnP state machine */
42*479ab7f0SSascha Wildner #ifndef _KERNEL
43*479ab7f0SSascha Wildner #define _PNP_ADDRESS		0x279
44*479ab7f0SSascha Wildner #define _PNP_WRITE_DATA		0xa79
45*479ab7f0SSascha Wildner #endif
46*479ab7f0SSascha Wildner 
47*479ab7f0SSascha Wildner /* PnP Registers.  Write to ADDRESS and then use WRITE/READ_DATA */
48*479ab7f0SSascha Wildner #define SET_RD_DATA		0x00
49*479ab7f0SSascha Wildner 	/***
50*479ab7f0SSascha Wildner 	Writing to this location modifies the address of the port used for
51*479ab7f0SSascha Wildner 	reading from the Plug and Play ISA cards.   Bits[7:0] become I/O
52*479ab7f0SSascha Wildner 	read port address bits[9:2].  Reads from this register are ignored.
53*479ab7f0SSascha Wildner 	***/
54*479ab7f0SSascha Wildner 
55*479ab7f0SSascha Wildner #define SERIAL_ISOLATION	0x01
56*479ab7f0SSascha Wildner 	/***
57*479ab7f0SSascha Wildner 	A read to this register causes a Plug and Play cards in the Isolation
58*479ab7f0SSascha Wildner 	state to compare one bit of the boards ID.
59*479ab7f0SSascha Wildner 	This register is read only.
60*479ab7f0SSascha Wildner 	***/
61*479ab7f0SSascha Wildner 
62*479ab7f0SSascha Wildner #define	CONFIG_CONTROL		0x02
63*479ab7f0SSascha Wildner 	/***
64*479ab7f0SSascha Wildner 	Bit[2]  Reset CSN to 0
65*479ab7f0SSascha Wildner 	Bit[1]  Return to the Wait for Key state
66*479ab7f0SSascha Wildner 	Bit[0]  Reset all logical devices and restore configuration
67*479ab7f0SSascha Wildner 		registers to their power-up values.
68*479ab7f0SSascha Wildner 
69*479ab7f0SSascha Wildner 	A write to bit[0] of this register performs a reset function on
70*479ab7f0SSascha Wildner 	all logical devices.  This resets the contents of configuration
71*479ab7f0SSascha Wildner 	registers to  their default state.  All card's logical devices
72*479ab7f0SSascha Wildner 	enter their default state and the CSN is preserved.
73*479ab7f0SSascha Wildner 
74*479ab7f0SSascha Wildner 	A write to bit[1] of this register causes all cards to enter the
75*479ab7f0SSascha Wildner 	Wait for Key state but all CSNs are preserved and logical devices
76*479ab7f0SSascha Wildner 	are not affected.
77*479ab7f0SSascha Wildner 
78*479ab7f0SSascha Wildner 	A write to bit[2] of this register causes all cards to reset their
79*479ab7f0SSascha Wildner 	CSN to zero .
80*479ab7f0SSascha Wildner 
81*479ab7f0SSascha Wildner 	This register is write-only.  The values are not sticky, that is,
82*479ab7f0SSascha Wildner 	hardware will automatically clear them and there is no need for
83*479ab7f0SSascha Wildner 	software to clear the bits.
84*479ab7f0SSascha Wildner 	***/
85*479ab7f0SSascha Wildner 
86*479ab7f0SSascha Wildner #define WAKE			0x03
87*479ab7f0SSascha Wildner 	/***
88*479ab7f0SSascha Wildner 	A write to this port will cause all cards that have a CSN that
89*479ab7f0SSascha Wildner 	matches the write data[7:0] to go from the Sleep state to the either
90*479ab7f0SSascha Wildner 	the Isolation state if the write data for this command is zero or
91*479ab7f0SSascha Wildner 	the Config state if the write data is not zero.  Additionally, the
92*479ab7f0SSascha Wildner 	pointer to the byte-serial device is reset.  This register is
93*479ab7f0SSascha Wildner 	writeonly.
94*479ab7f0SSascha Wildner 	***/
95*479ab7f0SSascha Wildner 
96*479ab7f0SSascha Wildner #define	RESOURCE_DATA		0x04
97*479ab7f0SSascha Wildner 	/***
98*479ab7f0SSascha Wildner 	A read from this address reads the next byte of resource information.
99*479ab7f0SSascha Wildner 	The Status register must be polled until bit[0] is set before this
100*479ab7f0SSascha Wildner 	register may be read.  This register is read only.
101*479ab7f0SSascha Wildner 	***/
102*479ab7f0SSascha Wildner 
103*479ab7f0SSascha Wildner #define STATUS			0x05
104*479ab7f0SSascha Wildner 	/***
105*479ab7f0SSascha Wildner 	Bit[0] when set indicates it is okay to read the next data byte
106*479ab7f0SSascha Wildner 	from the Resource Data register.  This register is readonly.
107*479ab7f0SSascha Wildner 	***/
108*479ab7f0SSascha Wildner 
109*479ab7f0SSascha Wildner #define SET_CSN			0x06
110*479ab7f0SSascha Wildner 	/***
111*479ab7f0SSascha Wildner 	A write to this port sets a card's CSN.  The CSN is a value uniquely
112*479ab7f0SSascha Wildner 	assigned to each ISA card after the serial identification process
113*479ab7f0SSascha Wildner 	so that each card may be individually selected during a Wake[CSN]
114*479ab7f0SSascha Wildner 	command. This register is read/write.
115*479ab7f0SSascha Wildner 	***/
116*479ab7f0SSascha Wildner 
117*479ab7f0SSascha Wildner #define SET_LDN			0x07
118*479ab7f0SSascha Wildner 	/***
119*479ab7f0SSascha Wildner 	Selects the current logical device.  All reads and writes of memory,
120*479ab7f0SSascha Wildner 	I/O, interrupt and DMA configuration information access the registers
121*479ab7f0SSascha Wildner 	of the logical device written here.  In addition, the I/O Range
122*479ab7f0SSascha Wildner 	Check and Activate  commands operate only on the selected logical
123*479ab7f0SSascha Wildner 	device.  This register is read/write. If a card has only 1 logical
124*479ab7f0SSascha Wildner 	device, this location should be a read-only value of 0x00.
125*479ab7f0SSascha Wildner 	***/
126*479ab7f0SSascha Wildner 
127*479ab7f0SSascha Wildner /*** addresses 0x08 - 0x1F Card Level Reserved for future use ***/
128*479ab7f0SSascha Wildner /*** addresses 0x20 - 0x2F Card Level, Vendor Defined ***/
129*479ab7f0SSascha Wildner 
130*479ab7f0SSascha Wildner #define ACTIVATE		0x30
131*479ab7f0SSascha Wildner 	/***
132*479ab7f0SSascha Wildner 	For each logical device there is one activate register that controls
133*479ab7f0SSascha Wildner 	whether or not the logical device is active on the ISA bus.  Bit[0],
134*479ab7f0SSascha Wildner 	if set, activates the logical device.  Bits[7:1] are reserved and
135*479ab7f0SSascha Wildner 	must return 0 on reads.  This is a read/write register. Before a
136*479ab7f0SSascha Wildner 	logical device is activated, I/O range check must be disabled.
137*479ab7f0SSascha Wildner 	***/
138*479ab7f0SSascha Wildner 
139*479ab7f0SSascha Wildner #define IO_RANGE_CHECK		0x31
140*479ab7f0SSascha Wildner 	/***
141*479ab7f0SSascha Wildner 	This register is used to perform a conflict check on the I/O port
142*479ab7f0SSascha Wildner 	range programmed for use by a logical device.
143*479ab7f0SSascha Wildner 
144*479ab7f0SSascha Wildner 	Bit[7:2]  Reserved and must return 0 on reads
145*479ab7f0SSascha Wildner 	Bit[1]    Enable I/O Range check, if set then I/O Range Check
146*479ab7f0SSascha Wildner 	is enabled. I/O range check is only valid when the logical
147*479ab7f0SSascha Wildner 	device is inactive.
148*479ab7f0SSascha Wildner 
149*479ab7f0SSascha Wildner 	Bit[0], if set, forces the logical device to respond to I/O reads
150*479ab7f0SSascha Wildner 	of the logical device's assigned I/O range with a 0x55 when I/O
151*479ab7f0SSascha Wildner 	range check is in operation.  If clear, the logical device drives
152*479ab7f0SSascha Wildner 	0xAA.  This register is read/write.
153*479ab7f0SSascha Wildner 	***/
154*479ab7f0SSascha Wildner 
155*479ab7f0SSascha Wildner /*** addr 0x32 - 0x37 Logical Device Control Reserved for future use ***/
156*479ab7f0SSascha Wildner /*** addr 0x38 - 0x3F Logical Device Control Vendor Define ***/
157*479ab7f0SSascha Wildner 
158*479ab7f0SSascha Wildner #define MEM_CONFIG		0x40
159*479ab7f0SSascha Wildner 	/***
160*479ab7f0SSascha Wildner 	Four memory resource registers per range, four ranges.
161*479ab7f0SSascha Wildner 	Fill with 0 if no ranges are enabled.
162*479ab7f0SSascha Wildner 
163*479ab7f0SSascha Wildner 	Offset 0:	RW Memory base address bits[23:16]
164*479ab7f0SSascha Wildner 	Offset 1:	RW Memory base address bits[15:8]
165*479ab7f0SSascha Wildner 	Offset 2:	Memory control
166*479ab7f0SSascha Wildner 	    Bit[1] specifies 8/16-bit control.  This bit is set to indicate
167*479ab7f0SSascha Wildner 	    16-bit memory, and cleared to indicate 8-bit memory.
168*479ab7f0SSascha Wildner 	    Bit[0], if cleared, indicates the next field can be used as a range
169*479ab7f0SSascha Wildner 	    length for decode (implies range length and base alignment of memory
170*479ab7f0SSascha Wildner 	    descriptor are equal).
171*479ab7f0SSascha Wildner 	    Bit[0], if set, indicates the next field is the upper limit for
172*479ab7f0SSascha Wildner 	    the address. -  - Bit[0] is read-only.
173*479ab7f0SSascha Wildner 	Offset 3:	RW upper limit or range len, bits[23:16]
174*479ab7f0SSascha Wildner 	Offset 4:	RW upper limit or range len, bits[15:8]
175*479ab7f0SSascha Wildner 	Offset 5-Offset 7: filler, unused.
176*479ab7f0SSascha Wildner 	***/
177*479ab7f0SSascha Wildner 
178*479ab7f0SSascha Wildner #define IO_CONFIG_BASE		0x60
179*479ab7f0SSascha Wildner 	/***
180*479ab7f0SSascha Wildner 	Eight ranges, two bytes per range.
181*479ab7f0SSascha Wildner 	Offset 0:		I/O port base address bits[15:8]
182*479ab7f0SSascha Wildner 	Offset 1:		I/O port base address bits[7:0]
183*479ab7f0SSascha Wildner 	***/
184*479ab7f0SSascha Wildner 
185*479ab7f0SSascha Wildner #define IRQ_CONFIG		0x70
186*479ab7f0SSascha Wildner 	/***
187*479ab7f0SSascha Wildner 	Two entries, two bytes per entry.
188*479ab7f0SSascha Wildner 	Offset 0:	RW interrupt level (1..15, 0=unused).
189*479ab7f0SSascha Wildner 	Offset 1:	Bit[1]: level(1:hi, 0:low),
190*479ab7f0SSascha Wildner 			Bit[0]: type (1:level, 0:edge)
191*479ab7f0SSascha Wildner 		byte 1 can be readonly if 1 type of int is used.
192*479ab7f0SSascha Wildner 	***/
193*479ab7f0SSascha Wildner 
194*479ab7f0SSascha Wildner #define DRQ_CONFIG		0x74
195*479ab7f0SSascha Wildner 	/***
196*479ab7f0SSascha Wildner 	Two entries, one byte per entry. Bits[2:0] select
197*479ab7f0SSascha Wildner 	which DMA channel is in use for DMA 0.  Zero selects DMA channel
198*479ab7f0SSascha Wildner 	0, seven selects DMA channel 7. DMA channel 4, the cascade channel
199*479ab7f0SSascha Wildner 	is used to indicate no DMA channel is active.
200*479ab7f0SSascha Wildner 	***/
201*479ab7f0SSascha Wildner 
202*479ab7f0SSascha Wildner /*** 32-bit memory accesses are at 0x76 ***/
203*479ab7f0SSascha Wildner 
204*479ab7f0SSascha Wildner /* Macros to parse Resource IDs */
205*479ab7f0SSascha Wildner #define PNP_RES_TYPE(a)		(a >> 7)
206*479ab7f0SSascha Wildner #define PNP_SRES_NUM(a)		(a >> 3)
207*479ab7f0SSascha Wildner #define PNP_SRES_LEN(a)		(a & 0x07)
208*479ab7f0SSascha Wildner #define PNP_LRES_NUM(a)		(a & 0x7f)
209*479ab7f0SSascha Wildner 
210*479ab7f0SSascha Wildner /* Small Resource Item names */
211*479ab7f0SSascha Wildner #define PNP_VERSION		0x1
212*479ab7f0SSascha Wildner #define LOG_DEVICE_ID		0x2
213*479ab7f0SSascha Wildner #define COMP_DEVICE_ID		0x3
214*479ab7f0SSascha Wildner #define IRQ_FORMAT		0x4
215*479ab7f0SSascha Wildner #define DMA_FORMAT		0x5
216*479ab7f0SSascha Wildner #define START_DEPEND_FUNC	0x6
217*479ab7f0SSascha Wildner #define END_DEPEND_FUNC		0x7
218*479ab7f0SSascha Wildner #define IO_PORT_DESC		0x8
219*479ab7f0SSascha Wildner #define FIXED_IO_PORT_DESC	0x9
220*479ab7f0SSascha Wildner #define SM_RES_RESERVED		0xa-0xd
221*479ab7f0SSascha Wildner #define SM_VENDOR_DEFINED	0xe
222*479ab7f0SSascha Wildner #define END_TAG			0xf
223*479ab7f0SSascha Wildner 
224*479ab7f0SSascha Wildner /* Large Resource Item names */
225*479ab7f0SSascha Wildner #define MEMORY_RANGE_DESC	0x1
226*479ab7f0SSascha Wildner #define ID_STRING_ANSI		0x2
227*479ab7f0SSascha Wildner #define ID_STRING_UNICODE	0x3
228*479ab7f0SSascha Wildner #define LG_VENDOR_DEFINED	0x4
229*479ab7f0SSascha Wildner #define _32BIT_MEM_RANGE_DESC	0x5
230*479ab7f0SSascha Wildner #define _32BIT_FIXED_LOC_DESC	0x6
231*479ab7f0SSascha Wildner #define LG_RES_RESERVED		0x7-0x7f
232*479ab7f0SSascha Wildner 
233*479ab7f0SSascha Wildner /*
234*479ab7f0SSascha Wildner  * pnp_cinfo contains Configuration Information. They are used
235*479ab7f0SSascha Wildner  * to communicate to the device driver the actual configuration
236*479ab7f0SSascha Wildner  * of the device.
237*479ab7f0SSascha Wildner  */
238*479ab7f0SSascha Wildner struct pnp_cinfo {
239*479ab7f0SSascha Wildner 	u_int vendor_id;	/* board id */
240*479ab7f0SSascha Wildner 	u_int serial;		/* Board's Serial Number */
241*479ab7f0SSascha Wildner 	u_long flags;		/* OS-reserved flags */
242*479ab7f0SSascha Wildner 	u_char csn;		/* assigned Card Select Number */
243*479ab7f0SSascha Wildner 	u_char ldn;		/* Logical Device Number */
244*479ab7f0SSascha Wildner 	u_char enable;		/* pnp enable */
245*479ab7f0SSascha Wildner 	u_char irq[2];		/* IRQ Number */
246*479ab7f0SSascha Wildner 	u_char irq_type[2];	/* IRQ Type */
247*479ab7f0SSascha Wildner 	u_char drq[2];
248*479ab7f0SSascha Wildner 	u_short port[8];	/* The Base Address of the Port */
249*479ab7f0SSascha Wildner 	struct {
250*479ab7f0SSascha Wildner 		u_long base;	/* Memory Base Address */
251*479ab7f0SSascha Wildner 		int control;	/* Memory Control Register */
252*479ab7f0SSascha Wildner 		u_long range;	/* Memory Range *OR* Upper Limit */
253*479ab7f0SSascha Wildner 	} mem[4];
254*479ab7f0SSascha Wildner };
255*479ab7f0SSascha Wildner 
256*479ab7f0SSascha Wildner #ifdef _KERNEL
257*479ab7f0SSascha Wildner 
258*479ab7f0SSascha Wildner struct pnp_device {
259*479ab7f0SSascha Wildner     char *pd_name;
260*479ab7f0SSascha Wildner     char * (*pd_probe ) (u_long csn, u_long vendor_id);
261*479ab7f0SSascha Wildner     void (*pd_attach ) (u_long csn, u_long vend_id, char * name,
262*479ab7f0SSascha Wildner 	struct isa_device *dev);
263*479ab7f0SSascha Wildner     u_long	*pd_count;
264*479ab7f0SSascha Wildner     u_int *imask ;
265*479ab7f0SSascha Wildner };
266*479ab7f0SSascha Wildner 
267*479ab7f0SSascha Wildner struct _pnp_id {
268*479ab7f0SSascha Wildner     u_long vendor_id;
269*479ab7f0SSascha Wildner     u_long serial;
270*479ab7f0SSascha Wildner     u_char checksum;
271*479ab7f0SSascha Wildner } ;
272*479ab7f0SSascha Wildner 
273*479ab7f0SSascha Wildner struct pnp_dlist_node {
274*479ab7f0SSascha Wildner     struct pnp_device *pnp;
275*479ab7f0SSascha Wildner     struct isa_device dev;
276*479ab7f0SSascha Wildner     struct pnp_dlist_node *next;
277*479ab7f0SSascha Wildner };
278*479ab7f0SSascha Wildner 
279*479ab7f0SSascha Wildner typedef struct _pnp_id pnp_id;
280*479ab7f0SSascha Wildner extern pnp_id pnp_devices[MAX_PNP_CARDS];
281*479ab7f0SSascha Wildner 
282*479ab7f0SSascha Wildner /*
283*479ab7f0SSascha Wildner  * these two functions are for use in drivers
284*479ab7f0SSascha Wildner  */
285*479ab7f0SSascha Wildner int read_pnp_parms(struct pnp_cinfo *d, int ldn);
286*479ab7f0SSascha Wildner int write_pnp_parms(struct pnp_cinfo *d, int ldn);
287*479ab7f0SSascha Wildner int enable_pnp_card(void);
288*479ab7f0SSascha Wildner 
289*479ab7f0SSascha Wildner /*
290*479ab7f0SSascha Wildner  * used by autoconfigure to actually probe and attach drivers
291*479ab7f0SSascha Wildner  */
292*479ab7f0SSascha Wildner void pnp_configure(void);
293*479ab7f0SSascha Wildner 
294*479ab7f0SSascha Wildner #endif /* _KERNEL */
295*479ab7f0SSascha Wildner 
296*479ab7f0SSascha Wildner #endif /* !_BOOT_COMMON_ISAPNP_H_ */
297