1 /* $NetBSD: xmi.c,v 1.1 2000/07/06 17:45:52 ragge Exp $ */ 2 3 /* 4 * Copyright (c) 2000 Ludd, University of Lule}, Sweden. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. All advertising materials mentioning features or use of this software 15 * must display the following acknowledgement: 16 * This product includes software developed at Ludd, University of 17 * Lule}, Sweden and its contributors. 18 * 4. The name of the author may not be used to endorse or promote products 19 * derived from this software without specific prior written permission 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 /* 34 * XMI specific routines. 35 */ 36 37 #include <sys/param.h> 38 #include <sys/systm.h> 39 #include <sys/device.h> 40 41 #include <machine/bus.h> 42 #include <machine/cpu.h> 43 44 #include <dev/xmi/xmireg.h> 45 #include <dev/xmi/xmivar.h> 46 47 static int xmi_print(void *, const char *); 48 49 struct xmi_list xmi_list[] = { 50 {XMIDT_KA62, 0, "ka6200"}, 51 {XMIDT_KA64, 1, "ka6400"}, 52 {XMIDT_KA65, 0, "ka6500"}, 53 {XMIDT_KA66, 0, "ka6600"}, 54 {XMIDT_MS62, 1, "ms62"}, 55 {XMIDT_DWMBA, 1, "dwmba"}, 56 {0,0,0} 57 }; 58 59 int 60 xmi_print(void *aux, const char *name) 61 { 62 struct xmi_attach_args *xa = aux; 63 struct xmi_list *xl; 64 65 for (xl = &xmi_list[0]; xl->xl_nr; xl++) 66 if (xl->xl_nr == bus_space_read_2(xa->xa_iot, xa->xa_ioh, 0)) 67 break; 68 69 if (name) { 70 if (xl->xl_nr == 0) 71 printf("unknown device 0x%x", 72 bus_space_read_2(xa->xa_iot, xa->xa_ioh, 0)); 73 else 74 printf(xl->xl_name); 75 printf(" at %s", name); 76 } 77 printf(" node %d", xa->xa_nodenr); 78 return xl->xl_havedriver ? UNCONF : UNSUPP; 79 } 80 81 static int lastiv = 0; 82 83 void 84 xmi_attach(struct xmi_softc *sc) 85 { 86 struct xmi_attach_args xa; 87 int nodenr; 88 89 printf("\n"); 90 91 xa.xa_iot = sc->sc_iot; 92 xa.xa_busnr = sc->sc_busnr; 93 xa.xa_dmat = sc->sc_dmat; 94 xa.xa_intcpu = sc->sc_intcpu; 95 /* 96 * Interrupt numbers. All vectors from 256-512 are free, use 97 * them for XMI devices and just count them up. 98 * Above 512 are only interrupt vectors for unibus devices. 99 * 100 * The XMI nodespace is giant in size. Only map in the first 101 * page here and map more (if needed) in the device itself. 102 */ 103 for (nodenr = 0; nodenr < NNODEXMI; nodenr++) { 104 if (bus_space_map(sc->sc_iot, sc->sc_addr + XMI_NODE(nodenr), 105 NBPG, 0, &xa.xa_ioh)) { 106 printf("xmi_attach: bus_space_map failed, node %d\n", 107 nodenr); 108 return; 109 } 110 if (badaddr((caddr_t)xa.xa_ioh, 4)) { 111 bus_space_unmap(sc->sc_iot, xa.xa_ioh, NBPG); 112 continue; 113 } 114 xa.xa_nodenr = nodenr; 115 xa.xa_ivec = 256 + lastiv; 116 lastiv += 4; 117 config_found(&sc->sc_dev, &xa, xmi_print); 118 } 119 } 120