Lines Matching refs:sc

74 digi_isa_setwin(struct digi_softc *sc, unsigned int addr)
76 outb(sc->wport, sc->window = FEPWIN | (addr >> sc->win_bits));
77 return (sc->vmem + (addr % sc->win_size));
81 digi_xi_setwin(struct digi_softc *sc, unsigned int addr)
83 outb(sc->wport, sc->window = FEPMEM);
84 return (sc->vmem + addr);
88 digi_isa_hidewin(struct digi_softc *sc)
90 outb(sc->wport, sc->window = 0);
91 /* outb(sc->port, 0); */
95 digi_isa_towin(struct digi_softc *sc, int win)
97 outb(sc->wport, sc->window = win);
101 digi_xi_towin(struct digi_softc *sc, int win)
103 outb(sc->wport, sc->window = FEPMEM);
107 * sc->port should be set and its resource allocated.
110 digi_isa_check(struct digi_softc *sc)
114 sc->name = NULL;
117 outb(sc->port, FEPRST);
118 for (i = 0; (inb(sc->port) & FEPMASK) != FEPRST; i++) {
121 digi_delay(sc, "digirst", 1);
123 DLOG(DIGIDB_INIT, (sc->dev, "got reset after %d iterations\n", i));
125 ident = inb(sc->port);
131 DLOG(DIGIDB_INIT, (sc->dev, "board type is 0x%x\n", ident));
138 sc->model = PCXI;
139 sc->csigs = &digi_xixe_signals;
142 sc->name = "Digiboard PC/Xi 64K";
143 sc->mem_seg = 0xf000;
144 sc->win_size = 0x10000;
145 sc->win_bits = 16;
148 sc->name = "Digiboard PC/Xi 128K";
149 sc->mem_seg = 0xE000;
150 sc->win_size = 0x20000;
151 sc->win_bits = 17;
154 sc->name = "Digiboard PC/Xi 256K";
155 sc->mem_seg = 0xC000;
156 sc->win_size = 0x40000;
157 sc->win_bits = 18;
160 sc->name = "Digiboard PC/Xi 512K";
161 sc->mem_seg = 0x8000;
162 sc->win_size = 0x80000;
163 sc->win_bits = 19;
166 sc->wport = sc->port;
167 sc->module = "Xe";
169 sc->setwin = digi_xi_setwin;
170 sc->hidewin = digi_isa_hidewin;
171 sc->towin = digi_xi_towin;
175 sc->name = "Digiboard PC/Xem";
176 sc->model = PCXEM;
177 sc->csigs = &digi_normal_signals;
178 sc->win_size = 0x8000;
179 sc->win_bits = 15;
180 sc->wport = sc->port + 1;
181 sc->module = "Xem";
183 sc->setwin = digi_isa_setwin;
184 sc->hidewin = digi_isa_hidewin;
185 sc->towin = digi_isa_towin;
189 outb(sc->port, 1);
190 ident = inb(sc->port);
193 device_printf(sc->dev, "PC/Xm is unsupported\n");
197 sc->mem_seg = 0xf000;
200 sc->name = "Digiboard PC/Xe 64K";
201 sc->model = PCXE;
202 sc->csigs = &digi_xixe_signals;
203 sc->win_size = 0x10000;
204 sc->win_bits = 16;
205 sc->wport = sc->port;
207 sc->name = "Digiboard PC/Xe 64/8K (windowed)";
208 sc->model = PCXEVE;
209 sc->csigs = &digi_normal_signals;
210 sc->win_size = 0x2000;
211 sc->win_bits = 13;
212 sc->wport = sc->port + 1;
214 sc->module = "Xe";
216 sc->setwin = digi_isa_setwin;
217 sc->hidewin = digi_isa_hidewin;
218 sc->towin = digi_isa_towin;
221 return (sc->name != NULL);
227 struct digi_softc *sc = device_get_softc(dev);
230 KASSERT(sc, ("digi%d: softc not allocated in digi_isa_probe\n",
233 bzero(sc, sizeof(*sc));
234 sc->status = DIGI_STATUS_NOTINIT;
235 sc->dev = dev;
236 sc->res.unit = device_get_unit(dev);
237 if (sc->res.unit >= 16) {
242 DLOG(DIGIDB_INIT, (sc->dev, "probing on isa bus\n"));
245 if ((sc->port = bus_get_resource_start(dev, SYS_RES_IOPORT, 0)) == 0) {
246 DLOG(DIGIDB_INIT, (sc->dev, "io address not given\n"));
250 if (sc->port == digi_validio[i] ||
251 sc->port == digi_validio[i] + 4)
254 device_printf(dev, "0x%03x: Invalid i/o address\n", sc->port);
259 if ((sc->pmem = bus_get_resource_start(dev, SYS_RES_MEMORY, 0)) == 0)
262 if (sc->pmem == digi_validmem[i])
265 device_printf(dev, "0x%lx: Invalid memory address\n", sc->pmem);
268 if ((sc->pmem & 0xfffffful) != sc->pmem) {
270 sc->pmem);
273 sc->vmem = (u_char *)sc->pmem;
275 DLOG(DIGIDB_INIT, (sc->dev, "isa? port 0x%03x mem 0x%lx\n",
276 sc->port, sc->pmem));
279 sc->res.iorid = 0;
280 sc->res.io = bus_alloc_resource_anywhere(dev, SYS_RES_IOPORT,
281 &sc->res.iorid, IO_SIZE, RF_ACTIVE);
282 if (sc->res.io == NULL)
286 if (!digi_isa_check(sc)) {
287 bus_release_resource(dev, SYS_RES_IOPORT, sc->res.iorid,
288 sc->res.io);
293 sc->res.mrid = 0;
294 sc->res.mem = bus_alloc_resource_anywhere(dev, SYS_RES_MEMORY,
295 &sc->res.mrid, sc->win_size, 0);
296 if (sc->res.mem == NULL) {
297 device_printf(dev, "0x%lx: Memory range is in use\n", sc->pmem);
298 bus_release_resource(dev, SYS_RES_IOPORT, sc->res.iorid,
299 sc->res.io);
303 outb(sc->port, FEPCLR); /* drop RESET */
304 sc->hidewin(sc); /* set initial sc->window */
306 bus_release_resource(dev, SYS_RES_MEMORY, sc->res.mrid, sc->res.mem);
307 bus_release_resource(dev, SYS_RES_IOPORT, sc->res.iorid, sc->res.io);
310 bus_set_resource(dev, SYS_RES_IOPORT, 0, sc->port, IO_SIZE);
311 bus_set_resource(dev, SYS_RES_MEMORY, 0, sc->pmem, sc->win_size);
313 DLOG(DIGIDB_INIT, (sc->dev, "Probe returns -10\n"));
321 struct digi_softc *sc = device_get_softc(dev);
328 KASSERT(sc, ("digi%d: softc not allocated in digi_isa_attach\n",
332 bzero(sc, sizeof(*sc));
333 sc->status = DIGI_STATUS_NOTINIT;
334 sc->dev = dev;
335 sc->res.unit = device_get_unit(dev);
336 DLOG(DIGIDB_INIT, (sc->dev, "attaching\n"));
339 bus_get_resource(dev, SYS_RES_MEMORY, 0, &sc->pmem, &msize);
340 sc->port = scport;
341 /* sc->altpin = !!(device_get_flags(dev) & DGBFLAG_ALTPIN); */
344 sc->res.iorid = 0;
345 sc->res.io = bus_alloc_resource_anywhere(dev, SYS_RES_IOPORT,
346 &sc->res.iorid, iosize, RF_ACTIVE);
347 if (sc->res.io == NULL)
351 DLOG(DIGIDB_INIT, (sc->dev, "Checking card type\n"));
352 if (!digi_isa_check(sc))
355 callout_handle_init(&sc->callout);
356 callout_handle_init(&sc->inttest);
358 sc->res.mrid = 0;
359 sc->res.mem = bus_alloc_resource_anywhere(dev, SYS_RES_MEMORY,
360 &sc->res.mrid, msize, RF_ACTIVE);
361 if (sc->res.mem == NULL) {
362 device_printf(dev, "0x%lx: Memory range is in use\n", sc->pmem);
363 sc->hidewin(sc);
368 sc->vmem = pmap_mapdev(sc->pmem, msize);
370 DLOG(DIGIDB_INIT, (sc->dev, "internal memory segment 0x%x\n",
371 sc->mem_seg));
375 if (sc->model == PCXI)
378 outb(sc->port, reset);
379 for (i = 0; (inb(sc->port) & FEPMASK) != reset; i++) {
382 sc->hidewin(sc);
385 digi_delay(sc, "digirst1", 1);
387 DLOG(DIGIDB_INIT, (sc->dev, "got reset after %d iterations\n", i));
389 if (sc->model != PCXI) {
390 t = (sc->pmem >> 8) & 0xffe0;
391 if (sc->model == PCXEVE)
393 outb(sc->port + 2, t & 0xff);
394 outb(sc->port + 3, t >> 8);
397 if (sc->model == PCXI || sc->model == PCXE) {
398 outb(sc->port, FEPRST | FEPMEM);
399 for (i = 0; (inb(sc->port) & FEPMASK) != FEPRST; i++) {
403 inb(sc->port));
404 sc->hidewin(sc);
407 digi_delay(sc, "digirst2", 1);
409 DLOG(DIGIDB_INIT, (sc->dev, "got memory after %d iterations\n",
413 DLOG(DIGIDB_INIT, (sc->dev, "short memory test\n"));
414 ptr = sc->setwin(sc, BOTWIN);
418 sc->hidewin(sc);
421 DLOG(DIGIDB_INIT, (sc->dev, "1st memory test ok\n"));
423 ptr = sc->setwin(sc, TOPWIN);
427 sc->hidewin(sc);
430 DLOG(DIGIDB_INIT, (sc->dev, "2nd memory test ok\n"));
432 ptr = sc->setwin(sc, BIOSCODE + ((0xf000 - sc->mem_seg) << 4));
436 sc->hidewin(sc);
439 DLOG(DIGIDB_INIT, (sc->dev, "3rd memory test ok\n"));
441 if ((res = digi_attach(sc)) == 0)
445 if (sc->res.mem != NULL) {
446 bus_release_resource(dev, SYS_RES_MEMORY, sc->res.mrid,
447 sc->res.mem);
448 sc->res.mem = NULL;
450 if (sc->res.io != NULL) {
451 bus_release_resource(dev, SYS_RES_IOPORT, sc->res.iorid,
452 sc->res.io);
453 sc->res.io = NULL;