Annotation of sys/arch/alpha/pci/sio.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: sio.c,v 1.31 2006/01/02 05:21:26 brad Exp $ */
2: /* $NetBSD: sio.c,v 1.15 1996/12/05 01:39:36 cgd Exp $ */
3:
4: /*
5: * Copyright (c) 1995, 1996 Carnegie-Mellon University.
6: * All rights reserved.
7: *
8: * Author: Chris G. Demetriou
9: *
10: * Permission to use, copy, modify and distribute this software and
11: * its documentation is hereby granted, provided that both the copyright
12: * notice and this permission notice appear in all copies of the
13: * software, derivative works or modified versions, and any portions
14: * thereof, and that both notices appear in supporting documentation.
15: *
16: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
17: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
18: * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
19: *
20: * Carnegie Mellon requests users of this software to return to
21: *
22: * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
23: * School of Computer Science
24: * Carnegie Mellon University
25: * Pittsburgh PA 15213-3890
26: *
27: * any improvements or extensions that they make and grant Carnegie the
28: * rights to redistribute these changes.
29: */
30:
31: #include <sys/param.h>
32: #include <sys/systm.h>
33: #include <sys/kernel.h>
34: #include <sys/device.h>
35:
36: #include <machine/intr.h>
37: #include <machine/bus.h>
38:
39: #include <dev/isa/isavar.h>
40: #include <dev/eisa/eisavar.h>
41:
42: #include <dev/pci/pcireg.h>
43: #include <dev/pci/pcivar.h>
44: #include <dev/pci/pcidevs.h>
45:
46: #include <alpha/pci/siovar.h>
47:
48: #include "isadma.h"
49:
50: struct sio_softc {
51: struct device sc_dv;
52:
53: bus_space_tag_t sc_iot, sc_memt;
54: bus_dma_tag_t sc_dmat;
55: int sc_haseisa;
56: };
57:
58: int siomatch(struct device *, void *, void *);
59: void sioattach(struct device *, struct device *, void *);
60:
61: extern int sio_intr_alloc(isa_chipset_tag_t *, int, int, int *);
62:
63:
64: struct cfattach sio_ca = {
65: sizeof(struct sio_softc), siomatch, sioattach,
66: };
67:
68: struct cfdriver sio_cd = {
69: NULL, "sio", DV_DULL,
70: };
71:
72: int pcebmatch(struct device *, void *, void *);
73:
74: struct cfattach pceb_ca = {
75: sizeof(struct sio_softc), pcebmatch, sioattach,
76: };
77:
78: struct cfdriver pceb_cd = {
79: NULL, "pceb", DV_DULL,
80: };
81:
82: union sio_attach_args {
83: const char *sa_name; /* XXX should be common */
84: struct isabus_attach_args sa_iba;
85: struct eisabus_attach_args sa_eba;
86: };
87:
88: int sioprint(void *, const char *pnp);
89: void sio_isa_attach_hook(struct device *, struct device *,
90: struct isabus_attach_args *);
91: void sio_eisa_attach_hook(struct device *, struct device *,
92: struct eisabus_attach_args *);
93: int sio_eisa_maxslots(void *);
94: int sio_eisa_intr_map(void *, u_int, eisa_intr_handle_t *);
95: void sio_bridge_callback(struct device *);
96:
97: int
98: siomatch(parent, match, aux)
99: struct device *parent;
100: void *match;
101: void *aux;
102: {
103: struct pci_attach_args *pa = aux;
104:
105: if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_CONTAQ &&
106: PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_CONTAQ_82C693 &&
107: pa->pa_function == 0)
108: return (1);
109:
110: if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_INTEL &&
111: PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_SIO)
112: return (1);
113:
114: if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_ALI &&
115: PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_ALI_M1533)
116: return(1);
117:
118: if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_ALI &&
119: PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_ALI_M1543)
120: return(1);
121: return (0);
122: }
123:
124: int
125: pcebmatch(parent, match, aux)
126: struct device *parent;
127: void *match;
128: void *aux;
129: {
130: struct pci_attach_args *pa = aux;
131:
132: if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_INTEL &&
133: PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PCEB)
134: return (1);
135:
136: return (0);
137: }
138:
139: void
140: sioattach(parent, self, aux)
141: struct device *parent, *self;
142: void *aux;
143: {
144: struct sio_softc *sc = (struct sio_softc *)self;
145: struct pci_attach_args *pa = aux;
146:
147: printf("\n");
148:
149: sc->sc_iot = pa->pa_iot;
150: sc->sc_memt = pa->pa_memt;
151: sc->sc_dmat = pa->pa_dmat;
152: sc->sc_haseisa = (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_INTEL &&
153: PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_PCEB);
154:
155: evcount_attach(&sio_intr_count, self->dv_xname, NULL, &evcount_intr);
156:
157: config_defer(self, sio_bridge_callback);
158: }
159:
160: void
161: sio_bridge_callback(self)
162: struct device *self;
163: {
164: struct sio_softc *sc = (struct sio_softc *)self;
165: struct alpha_eisa_chipset ec;
166: struct alpha_isa_chipset ic;
167: union sio_attach_args sa;
168:
169: if (sc->sc_haseisa) {
170: ec.ec_v = NULL;
171: ec.ec_attach_hook = sio_eisa_attach_hook;
172: ec.ec_maxslots = sio_eisa_maxslots;
173: ec.ec_intr_map = sio_eisa_intr_map;
174: ec.ec_intr_string = sio_intr_string;
175: ec.ec_intr_establish = sio_intr_establish;
176: ec.ec_intr_disestablish = sio_intr_disestablish;
177:
178: sa.sa_eba.eba_busname = "eisa";
179: sa.sa_eba.eba_iot = sc->sc_iot;
180: sa.sa_eba.eba_memt = sc->sc_memt;
181: sa.sa_eba.eba_ec = &ec;
182: config_found(&sc->sc_dv, &sa.sa_eba, sioprint);
183: }
184:
185: ic.ic_v = NULL;
186: ic.ic_attach_hook = sio_isa_attach_hook;
187: ic.ic_intr_establish = sio_intr_establish;
188: ic.ic_intr_disestablish = sio_intr_disestablish;
189: ic.ic_intr_alloc = sio_intr_alloc;
190:
191: sa.sa_iba.iba_busname = "isa";
192: sa.sa_iba.iba_iot = sc->sc_iot;
193: sa.sa_iba.iba_memt = sc->sc_memt;
194: #if NISADMA > 0
195: sa.sa_iba.iba_dmat =
196: alphabus_dma_get_tag(sc->sc_dmat, ALPHA_BUS_ISA);
197: #endif
198: sa.sa_iba.iba_ic = ⁣
199: config_found(&sc->sc_dv, &sa.sa_iba, sioprint);
200: }
201:
202: int
203: sioprint(aux, pnp)
204: void *aux;
205: const char *pnp;
206: {
207: register union sio_attach_args *sa = aux;
208:
209: if (pnp)
210: printf("%s at %s", sa->sa_name, pnp);
211: return (UNCONF);
212: }
213:
214: void
215: sio_isa_attach_hook(parent, self, iba)
216: struct device *parent, *self;
217: struct isabus_attach_args *iba;
218: {
219: /* Nothing to do. */
220: }
221:
222: void
223: sio_eisa_attach_hook(parent, self, eba)
224: struct device *parent, *self;
225: struct eisabus_attach_args *eba;
226: {
227:
228: /* Nothing to do. */
229: }
230:
231: int
232: sio_eisa_maxslots(v)
233: void *v;
234: {
235:
236: return 16; /* as good a number as any. only 8, maybe? */
237: }
238:
239: int
240: sio_eisa_intr_map(v, irq, ihp)
241: void *v;
242: u_int irq;
243: eisa_intr_handle_t *ihp;
244: {
245:
246: #define ICU_LEN 16 /* number of ISA IRQs (XXX) */
247:
248: if (irq >= ICU_LEN) {
249: printf("sio_eisa_intr_map: bad IRQ %d\n", irq);
250: *ihp = -1;
251: return 1;
252: }
253: if (irq == 2) {
254: printf("sio_eisa_intr_map: changed IRQ 2 to IRQ 9\n");
255: irq = 9;
256: }
257:
258: *ihp = irq;
259: return 0;
260: }
CVSweb