isa_machdep.c revision 1.23 1 /* $NetBSD: isa_machdep.c,v 1.23 2001/05/14 13:18:47 leo Exp $ */
2
3 /*
4 * Copyright (c) 1997 Leo Weppelman. All rights reserved.
5 * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved.
6 * Copyright (c) 1994 Charles M. 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 M. 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 #include <sys/types.h>
35 #include <sys/param.h>
36 #include <sys/systm.h>
37 #include <sys/device.h>
38
39 #define _ATARI_BUS_DMA_PRIVATE
40 #include <machine/bus.h>
41 #include <dev/isa/isavar.h>
42 #include <dev/isa/isareg.h>
43
44 #include "pckbc.h"
45 #if (NPCKBC > 0)
46 #include <dev/ic/pckbcvar.h>
47 #include <dev/isa/isareg.h>
48 #include <dev/ic/i8042reg.h>
49 #endif /* NPCKBC > 0 */
50
51 #include <machine/iomap.h>
52 #include <machine/mfp.h>
53 #include <atari/atari/device.h>
54
55 #include "isadma.h"
56
57 #if NISADMA == 0
58
59 /*
60 * Entry points for ISA DMA while no DMA capable devices are attached.
61 * This must be a serious error. Cause a panic...
62 */
63 struct atari_bus_dma_tag isa_bus_dma_tag = {
64 0
65 };
66 #endif /* NISADMA == 0 */
67
68 static int isabusprint __P((void *auxp, const char *));
69 static int isabusmatch __P((struct device *, struct cfdata *, void *));
70 static void isabusattach __P((struct device *, struct device *, void *));
71
72 struct isabus_softc {
73 struct device sc_dev;
74 struct atari_isa_chipset sc_chipset;
75 };
76
77 struct cfattach isabus_ca = {
78 sizeof(struct isabus_softc), isabusmatch, isabusattach
79 };
80
81 /*
82 * We need some static storage to attach a console keyboard on the Milan
83 * during early console init.
84 */
85 static struct atari_bus_space bs_storage[2]; /* 1 iot, 1 memt */
86
87 int
88 isabusmatch(pdp, cfp, auxp)
89 struct device *pdp;
90 struct cfdata *cfp;
91 void *auxp;
92 {
93 static int nmatched = 0;
94
95 if (strcmp((char *)auxp, "isabus"))
96 return (0); /* Wrong number... */
97
98 if(atari_realconfig == 0)
99 return (1);
100
101 if (machineid & (ATARI_HADES|ATARI_MILAN)) {
102 /*
103 * The Hades and Milan have only one pci bus
104 */
105 if (nmatched)
106 return (0);
107 nmatched++;
108 return (1);
109 }
110 return(0);
111 }
112
113 void
114 isabusattach(pdp, dp, auxp)
115 struct device *pdp, *dp;
116 void *auxp;
117 {
118 struct isabus_softc *sc = (struct isabus_softc *)dp;
119 struct isabus_attach_args iba;
120 extern struct atari_bus_dma_tag isa_bus_dma_tag;
121 extern void isa_bus_init(void);
122
123 iba.iba_busname = "isa";
124 iba.iba_dmat = &isa_bus_dma_tag;
125 iba.iba_iot = leb_alloc_bus_space_tag(&bs_storage[0]);
126 iba.iba_memt = leb_alloc_bus_space_tag(&bs_storage[1]);
127 iba.iba_ic = &sc->sc_chipset;
128 if ((iba.iba_iot == NULL) || (iba.iba_memt == NULL)) {
129 printf("leb_alloc_bus_space_tag failed!\n");
130 return;
131 }
132 iba.iba_iot->base = ISA_IOSTART;
133 iba.iba_memt->base = ISA_MEMSTART;
134
135 if (machineid & ATARI_HADES)
136 MFP->mf_aer |= (IO_ISA1|IO_ISA2); /* ISA interrupts: LOW->HIGH */
137 isa_bus_init();
138 if (dp == NULL) { /* Early init */
139 #if (NPCKBC > 0)
140 pckbc_cnattach(iba.iba_iot, IO_KBD, KBCMDP, PCKBC_KBD_SLOT);
141 #endif
142 return;
143 }
144
145 printf("\n");
146 config_found(dp, &iba, isabusprint);
147 }
148
149 int
150 isabusprint(auxp, name)
151 void *auxp;
152 const char *name;
153 {
154 if(name == NULL)
155 return(UNCONF);
156 return(QUIET);
157 }
158
159 void
160 isa_attach_hook(parent, self, iba)
161 struct device *parent, *self;
162 struct isabus_attach_args *iba;
163 {
164 }
165
166 const struct evcnt *
167 isa_intr_evcnt(isa_chipset_tag_t ic, int irq)
168 {
169
170 /* XXX for now, no evcnt parent reported */
171 return NULL;
172 }
173