Annotation of sys/dev/pci/pcivar.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: pcivar.h,v 1.54 2007/08/01 21:43:03 deraadt Exp $ */
2: /* $NetBSD: pcivar.h,v 1.23 1997/06/06 23:48:05 thorpej Exp $ */
3:
4: /*
5: * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved.
6: * Copyright (c) 1994 Charles Hannum. All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. All advertising materials mentioning features or use of this software
17: * must display the following acknowledgement:
18: * This product includes software developed by Charles Hannum.
19: * 4. The name of the author may not be used to endorse or promote products
20: * derived from this software without specific prior written permission.
21: *
22: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32: */
33:
34: #ifndef _DEV_PCI_PCIVAR_H_
35: #define _DEV_PCI_PCIVAR_H_
36:
37: /*
38: * Definitions for PCI autoconfiguration.
39: *
40: * This file describes types and functions which are used for PCI
41: * configuration. Some of this information is machine-specific, and is
42: * provided by pci_machdep.h.
43: */
44:
45: #include <sys/device.h>
46: #include <machine/bus.h>
47: #include <dev/pci/pcireg.h>
48:
49: /*
50: * Structures and definitions needed by the machine-dependent header.
51: */
52: typedef u_int32_t pcireg_t; /* configuration space register XXX */
53:
54: /*
55: * Power Management (PCI 2.2)
56: */
57: #define PCI_PWR_D0 0
58: #define PCI_PWR_D1 1
59: #define PCI_PWR_D2 2
60: #define PCI_PWR_D3 3
61:
62: #ifdef _KERNEL
63:
64: struct pcibus_attach_args;
65: struct pci_softc;
66:
67: /*
68: * Machine-dependent definitions.
69: */
70: #if defined(__alpha__)
71: #include <alpha/pci/pci_machdep.h>
72: #elif defined(__i386__)
73: #include <i386/pci/pci_machdep.h>
74: #elif defined(__powerpc__)
75: #include <powerpc/pci/pci_machdep.h>
76: #elif defined(__sgi__)
77: #include <sgi/pci/pci_machdep.h>
78: #else
79: #include <machine/pci_machdep.h>
80: #endif
81:
82: /*
83: * PCI bus attach arguments.
84: */
85: struct pcibus_attach_args {
86: char *pba_busname; /* XXX should be common */
87: bus_space_tag_t pba_iot; /* pci i/o space tag */
88: bus_space_tag_t pba_memt; /* pci mem space tag */
89: bus_dma_tag_t pba_dmat; /* DMA tag */
90: pci_chipset_tag_t pba_pc;
91:
92: int pba_domain; /* PCI domain */
93: int pba_bus; /* PCI bus number */
94:
95: /*
96: * Pointer to the pcitag of our parent bridge. If there is no
97: * parent bridge, then we assume we are a root bus.
98: */
99: pcitag_t *pba_bridgetag;
100: pci_intr_handle_t *pba_bridgeih;
101:
102: /*
103: * Interrupt swizzling information. These fields
104: * are only used by secondary busses.
105: */
106: u_int pba_intrswiz; /* how to swizzle pins */
107: pcitag_t pba_intrtag; /* intr. appears to come from here */
108: };
109:
110: /*
111: * PCI device attach arguments.
112: */
113: struct pci_attach_args {
114: bus_space_tag_t pa_iot; /* pci i/o space tag */
115: bus_space_tag_t pa_memt; /* pci mem space tag */
116: bus_dma_tag_t pa_dmat; /* DMA tag */
117: pci_chipset_tag_t pa_pc;
118: int pa_flags; /* flags; see below */
119:
120: u_int pa_domain;
121: u_int pa_bus;
122: u_int pa_device;
123: u_int pa_function;
124: pcitag_t pa_tag;
125: pcireg_t pa_id, pa_class;
126:
127: pcitag_t *pa_bridgetag;
128: pci_intr_handle_t *pa_bridgeih;
129:
130: /*
131: * Interrupt information.
132: *
133: * "Intrline" is used on systems whose firmware puts
134: * the right routing data into the line register in
135: * configuration space. The rest are used on systems
136: * that do not.
137: */
138: u_int pa_intrswiz; /* how to swizzle pins if ppb */
139: pcitag_t pa_intrtag; /* intr. appears to come from here */
140: pci_intr_pin_t pa_intrpin; /* intr. appears on this pin */
141: pci_intr_line_t pa_intrline; /* intr. routing information */
142: pci_intr_pin_t pa_rawintrpin; /* unswizzled pin */
143: };
144:
145: /*
146: * Flags given in the bus and device attachment args.
147: *
148: * OpenBSD doesn't actually use them yet -- csapuntz@cvs.openbsd.org
149: */
150: #define PCI_FLAGS_IO_ENABLED 0x01 /* I/O space is enabled */
151: #define PCI_FLAGS_MEM_ENABLED 0x02 /* memory space is enabled */
152: #define PCI_FLAGS_MRL_OKAY 0x04 /* Memory Read Line okay */
153: #define PCI_FLAGS_MRM_OKAY 0x08 /* Memory Read Multiple okay */
154: #define PCI_FLAGS_MWI_OKAY 0x10 /* Memory Write and Invalidate
155: okay */
156:
157: /*
158: *
159: */
160: struct pci_quirkdata {
161: pci_vendor_id_t vendor; /* Vendor ID */
162: pci_product_id_t product; /* Product ID */
163: int quirks; /* quirks; see below */
164: };
165: #define PCI_QUIRK_MULTIFUNCTION 1
166: #define PCI_QUIRK_MONOFUNCTION 2
167:
168: struct pci_softc {
169: struct device sc_dev;
170: bus_space_tag_t sc_iot, sc_memt;
171: bus_dma_tag_t sc_dmat;
172: pci_chipset_tag_t sc_pc;
173: void *sc_powerhook;
174: LIST_HEAD(, pci_dev) sc_devs;
175: int sc_domain, sc_bus, sc_maxndevs;
176: pcitag_t *sc_bridgetag;
177: pci_intr_handle_t *sc_bridgeih;
178: u_int sc_intrswiz;
179: pcitag_t sc_intrtag;
180: };
181:
182: extern int pci_ndomains;
183:
184: /*
185: * Locators devices that attach to 'pcibus', as specified to config.
186: */
187: #define pcibuscf_bus cf_loc[0]
188: #define PCIBUS_UNK_BUS -1 /* wildcarded 'bus' */
189:
190: /*
191: * Locators for PCI devices, as specified to config.
192: */
193: #define pcicf_dev cf_loc[0]
194: #define PCI_UNK_DEV -1 /* wildcarded 'dev' */
195:
196: #define pcicf_function cf_loc[1]
197: #define PCI_UNK_FUNCTION -1 /* wildcarded 'function' */
198:
199: /*
200: * Configuration space access and utility functions. (Note that most,
201: * e.g. make_tag, conf_read, conf_write are declared by pci_machdep.h.)
202: */
203: int pci_mapreg_probe(pci_chipset_tag_t, pcitag_t, int, pcireg_t *);
204: pcireg_t pci_mapreg_type(pci_chipset_tag_t, pcitag_t, int);
205: int pci_mapreg_info(pci_chipset_tag_t, pcitag_t, int, pcireg_t,
206: bus_addr_t *, bus_size_t *, int *);
207: int pci_mapreg_map(struct pci_attach_args *, int, pcireg_t, int,
208: bus_space_tag_t *, bus_space_handle_t *, bus_addr_t *,
209: bus_size_t *, bus_size_t);
210:
211:
212: int pci_io_find(pci_chipset_tag_t, pcitag_t, int, bus_addr_t *,
213: bus_size_t *);
214: int pci_mem_find(pci_chipset_tag_t, pcitag_t, int, bus_addr_t *,
215: bus_size_t *, int *);
216:
217: int pci_get_capability(pci_chipset_tag_t, pcitag_t, int,
218: int *, pcireg_t *);
219:
220: struct pci_matchid {
221: pci_vendor_id_t pm_vid;
222: pci_product_id_t pm_pid;
223: };
224:
225: int pci_matchbyid(struct pci_attach_args *, const struct pci_matchid *, int);
226:
227: /*
228: * Helper functions for autoconfiguration.
229: */
230: const char *pci_findvendor(pcireg_t);
231: const char *pci_findproduct(pcireg_t);
232: int pci_find_device(struct pci_attach_args *pa,
233: int (*match)(struct pci_attach_args *));
234: int pci_probe_device(struct pci_softc *, pcitag_t tag,
235: int (*)(struct pci_attach_args *), struct pci_attach_args *);
236: void pci_devinfo(pcireg_t, pcireg_t, int, char *, size_t);
237: const struct pci_quirkdata *
238: pci_lookup_quirkdata(pci_vendor_id_t, pci_product_id_t);
239: void pciagp_set_pchb(struct pci_attach_args *);
240:
241: #endif /* _KERNEL */
242: #endif /* _DEV_PCI_PCIVAR_H_ */
CVSweb