pcivar.h revision 14703
1/**************************************************************************
2**
3**  $Id: pcivar.h,v 1.9 1996/01/25 18:32:00 se 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
49void 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
59typedef 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
79typedef 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
99u_long pci_conf_read  (pcici_t tag, u_long reg		   );
100
101void   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
128struct kern_devconf;
129
130struct pci_device {
131    char*    pd_name;
132    char*  (*pd_probe ) (pcici_t tag, pcidi_t type);
133    void   (*pd_attach) (pcici_t tag, int     unit);
134    u_long  *pd_count;
135    int    (*pd_shutdown) (struct kern_devconf *, int);
136};
137
138/*-----------------------------------------------------------------
139**
140**	This table includes pointers to all pci device drivers.
141**	It should be generated by the linker.
142**
143**-----------------------------------------------------------------
144*/
145
146extern struct linker_set pcidevice_set;
147
148extern unsigned pci_max_burst_len;  /* log2 of safe burst transfer length */
149extern unsigned pci_mechanism;
150extern unsigned pci_maxdevice;
151
152/*-----------------------------------------------------------------
153**
154**	The pci-devconf interface.
155**
156**-----------------------------------------------------------------
157*/
158
159struct pci_info {
160	u_char pi_bus;
161	u_char pi_device;
162	u_char pi_func;
163	u_char pi_dummy;
164};
165
166#define PCI_EXT_CONF_LEN (16)
167#define PCI_EXTERNAL_LEN (sizeof(struct pci_externalize_buffer))
168
169struct pci_externalize_buffer {
170	struct pci_info	peb_pci_info;
171	u_long		peb_config[PCI_EXT_CONF_LEN];
172};
173
174/*-----------------------------------------------------------------
175**
176**	Map a pci device to physical and virtual memory.
177**
178**      Entry selects the register in the pci configuration
179**	space, which supplies the size of the region, and
180**	receives the physical address.
181**
182**	In case of success the function sets the addresses
183**	in *va and *pa, and returns 1.
184**	In case of errors a message is written,
185**	and the function returns 0.
186**
187**-----------------------------------------------------------------
188*/
189
190int pci_map_mem (pcici_t tag, u_long entry, vm_offset_t *va, vm_offset_t *pa);
191
192/*-----------------------------------------------------------------
193**
194**	Map a pci device to an io port area.
195**
196**	Entry selects the register in the pci configuration
197**	space, which supplies the size of the region, and
198**	receives the port number.
199**
200**	In case of success the function sets the port number in pa,
201**	and returns 1.
202**	In case of errors a message is written,
203**	and the function returns 0.
204**
205**-----------------------------------------------------------------
206*/
207
208int pci_map_port (pcici_t tag, u_long entry, u_short * pa);
209
210/*-----------------------------------------------------------------
211**
212**	Map a pci interrupt to an isa irq line, and enable the interrupt.
213**
214**      -----------------
215**
216**      func is the interrupt handler, arg is the argument
217**      to the handler (usually a pointer to a softc).
218**
219**      The maskptr argument should be  &bio_imask,
220**      &net_imask etc. or NULL.
221**
222**      If there is any error, a message is written, and
223**      the function returns with zero.
224**      Else it returns with a value different to zero.
225**
226**      -----------------
227**
228**	The irq number is read from the configuration space.
229**	(Should have been set by the bios).
230**
231**	Supports multiple handlers per irq (shared interrupts).
232**
233**-----------------------------------------------------------------
234*/
235
236typedef void pci_inthand_t(void *arg);
237
238struct pci_int_desc {
239	struct pci_int_desc * pcid_next;
240	pcici_t 	      pcid_tag;
241	pci_inthand_t	     *pcid_handler;
242	void*		      pcid_argument;
243	unsigned *	      pcid_maskptr;
244	unsigned	      pcid_tally;
245	unsigned	      pcid_mask;
246};
247
248int pci_map_int (pcici_t tag, pci_inthand_t *func, void *arg,
249		 unsigned *maskptr);
250
251int pci_unmap_int (pcici_t tag);
252
253#endif
254