xref: /freebsd/sys/dev/pci/pcivar.h (revision e627b39baccd1ec9129690167cf5e6d860509655)
1 /**************************************************************************
2 **
3 **  $Id: pcivar.h,v 1.12 1996/09/08 10:44:14 phk Exp $
4 **
5 **  Declarations for pci device drivers.
6 **
7 **  FreeBSD
8 **
9 **-------------------------------------------------------------------------
10 **
11 ** Copyright (c) 1994 Wolfgang Stanglmeier.  All rights reserved.
12 **
13 ** Redistribution and use in source and binary forms, with or without
14 ** modification, are permitted provided that the following conditions
15 ** are met:
16 ** 1. Redistributions of source code must retain the above copyright
17 **    notice, this list of conditions and the following disclaimer.
18 ** 2. Redistributions in binary form must reproduce the above copyright
19 **    notice, this list of conditions and the following disclaimer in the
20 **    documentation and/or other materials provided with the distribution.
21 ** 3. The name of the author may not be used to endorse or promote products
22 **    derived from this software without specific prior written permission.
23 **
24 ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
25 ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26 ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27 ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
28 ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29 ** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33 ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 **
35 ***************************************************************************
36 */
37 
38 #ifndef __PCI_VAR_H__
39 #define __PCI_VAR_H__ "pl2 95/03/21"
40 
41 /*-----------------------------------------------------------------
42 **
43 **	main pci initialization function.
44 **	called at boot time from autoconf.c
45 **
46 **-----------------------------------------------------------------
47 */
48 
49 void pci_configure (void);
50 
51 /*-----------------------------------------------------------------
52 **
53 **	The pci configuration id describes a pci device on the bus.
54 **	It is constructed from: bus, device & function numbers.
55 **
56 **-----------------------------------------------------------------
57 */
58 
59 typedef union {
60 	u_long	 cfg1;
61 	struct {
62 		 u_char   enable;
63 		 u_char   forward;
64 		 u_short  port;
65 	       } cfg2;
66 	unsigned tag;
67 	} pcici_t;
68 
69 #define sametag(x,y)  ((x).tag == (y).tag)
70 
71 /*-----------------------------------------------------------------
72 **
73 **	Each pci device has an unique device id.
74 **	It is used to find a matching driver.
75 **
76 **-----------------------------------------------------------------
77 */
78 
79 typedef u_long pcidi_t;
80 
81 /*-----------------------------------------------------------------
82 **
83 **	The following functions are provided for the device driver
84 **	to read/write the configuration space.
85 **
86 **	pci_conf_read():
87 **		Read a long word from the pci configuration space.
88 **		Requires a tag (from pcitag) and the register
89 **		number (should be a long word alligned one).
90 **
91 **	pci_conf_write():
92 **		Writes a long word to the pci configuration space.
93 **		Requires a tag (from pcitag), the register number
94 **		(should be a long word alligned one), and a value.
95 **
96 **-----------------------------------------------------------------
97 */
98 
99 u_long pci_conf_read  (pcici_t tag, u_long reg		   );
100 
101 void   pci_conf_write (pcici_t tag, u_long reg, u_long data);
102 
103 /*-----------------------------------------------------------------
104 **
105 **	The pci driver structure.
106 **
107 **	name:	The short device name.
108 **
109 **	probe:	Checks if the driver can support a device
110 **		with this type. The tag may be used to get
111 **		more info with pci_read_conf(). See below.
112 **		It returns a string with the devices name,
113 **		or a NULL pointer, if the driver cannot
114 **		support this device.
115 **
116 **	attach:	Allocate a control structure and prepare
117 **		it. This function may use the pci mapping
118 **		functions. See below.
119 **		(configuration id) or type.
120 **
121 **	count:	A pointer to a unit counter.
122 **		It's used by the pci configurator to
123 **		allocate unit numbers.
124 **
125 **-----------------------------------------------------------------
126 */
127 
128 struct pci_device {
129     char*    pd_name;
130     char*  (*pd_probe ) (pcici_t tag, pcidi_t type);
131     void   (*pd_attach) (pcici_t tag, int     unit);
132     u_long  *pd_count;
133     int    (*pd_shutdown) (int, int);
134 };
135 
136 /*-----------------------------------------------------------------
137 **
138 **	This table includes pointers to all pci device drivers.
139 **	It should be generated by the linker.
140 **
141 **-----------------------------------------------------------------
142 */
143 
144 extern struct linker_set pcidevice_set;
145 
146 extern unsigned pci_max_burst_len;  /* log2 of safe burst transfer length */
147 extern unsigned pci_mechanism;
148 extern unsigned pci_maxdevice;
149 
150 /*-----------------------------------------------------------------
151 **
152 **	Map a pci device to physical and virtual memory.
153 **
154 **      Entry selects the register in the pci configuration
155 **	space, which supplies the size of the region, and
156 **	receives the physical address.
157 **
158 **	In case of success the function sets the addresses
159 **	in *va and *pa, and returns 1.
160 **	In case of errors a message is written,
161 **	and the function returns 0.
162 **
163 **-----------------------------------------------------------------
164 */
165 
166 int pci_map_mem (pcici_t tag, u_long entry, vm_offset_t *va, vm_offset_t *pa);
167 
168 /*-----------------------------------------------------------------
169 **
170 **	Map a pci device to an io port area.
171 **
172 **	Entry selects the register in the pci configuration
173 **	space, which supplies the size of the region, and
174 **	receives the port number.
175 **
176 **	In case of success the function sets the port number in pa,
177 **	and returns 1.
178 **	In case of errors a message is written,
179 **	and the function returns 0.
180 **
181 **-----------------------------------------------------------------
182 */
183 
184 int pci_map_port (pcici_t tag, u_long entry, u_short * pa);
185 
186 /*-----------------------------------------------------------------
187 **
188 **	Map a pci interrupt to an isa irq line, and enable the interrupt.
189 **
190 **      -----------------
191 **
192 **      func is the interrupt handler, arg is the argument
193 **      to the handler (usually a pointer to a softc).
194 **
195 **      The maskptr argument should be  &bio_imask,
196 **      &net_imask etc. or NULL.
197 **
198 **      If there is any error, a message is written, and
199 **      the function returns with zero.
200 **      Else it returns with a value different to zero.
201 **
202 **      -----------------
203 **
204 **	The irq number is read from the configuration space.
205 **	(Should have been set by the bios).
206 **
207 **	Supports multiple handlers per irq (shared interrupts).
208 **
209 **-----------------------------------------------------------------
210 */
211 
212 typedef void pci_inthand_t(void *arg);
213 
214 struct pci_int_desc {
215 	struct pci_int_desc * pcid_next;
216 	pcici_t 	      pcid_tag;
217 	pci_inthand_t	     *pcid_handler;
218 	void*		      pcid_argument;
219 	unsigned *	      pcid_maskptr;
220 	unsigned	      pcid_tally;
221 	unsigned	      pcid_mask;
222 };
223 
224 int pci_map_int (pcici_t tag, pci_inthand_t *func, void *arg,
225 		 unsigned *maskptr);
226 
227 int pci_unmap_int (pcici_t tag);
228 
229 #endif
230