1 /* $NetBSD: xmi.c,v 1.2 2001/11/13 06:08:32 lukem 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/cdefs.h> 38 __KERNEL_RCSID(0, "$NetBSD: xmi.c,v 1.2 2001/11/13 06:08:32 lukem Exp $"); 39 40 #include <sys/param.h> 41 #include <sys/systm.h> 42 #include <sys/device.h> 43 44 #include <machine/bus.h> 45 #include <machine/cpu.h> 46 47 #include <dev/xmi/xmireg.h> 48 #include <dev/xmi/xmivar.h> 49 50 static int xmi_print(void *, const char *); 51 52 struct xmi_list xmi_list[] = { 53 {XMIDT_KA62, 0, "ka6200"}, 54 {XMIDT_KA64, 1, "ka6400"}, 55 {XMIDT_KA65, 0, "ka6500"}, 56 {XMIDT_KA66, 0, "ka6600"}, 57 {XMIDT_MS62, 1, "ms62"}, 58 {XMIDT_DWMBA, 1, "dwmba"}, 59 {0,0,0} 60 }; 61 62 int 63 xmi_print(void *aux, const char *name) 64 { 65 struct xmi_attach_args *xa = aux; 66 struct xmi_list *xl; 67 68 for (xl = &xmi_list[0]; xl->xl_nr; xl++) 69 if (xl->xl_nr == bus_space_read_2(xa->xa_iot, xa->xa_ioh, 0)) 70 break; 71 72 if (name) { 73 if (xl->xl_nr == 0) 74 printf("unknown device 0x%x", 75 bus_space_read_2(xa->xa_iot, xa->xa_ioh, 0)); 76 else 77 printf(xl->xl_name); 78 printf(" at %s", name); 79 } 80 printf(" node %d", xa->xa_nodenr); 81 return xl->xl_havedriver ? UNCONF : UNSUPP; 82 } 83 84 static int lastiv = 0; 85 86 void 87 xmi_attach(struct xmi_softc *sc) 88 { 89 struct xmi_attach_args xa; 90 int nodenr; 91 92 printf("\n"); 93 94 xa.xa_iot = sc->sc_iot; 95 xa.xa_busnr = sc->sc_busnr; 96 xa.xa_dmat = sc->sc_dmat; 97 xa.xa_intcpu = sc->sc_intcpu; 98 /* 99 * Interrupt numbers. All vectors from 256-512 are free, use 100 * them for XMI devices and just count them up. 101 * Above 512 are only interrupt vectors for unibus devices. 102 * 103 * The XMI nodespace is giant in size. Only map in the first 104 * page here and map more (if needed) in the device itself. 105 */ 106 for (nodenr = 0; nodenr < NNODEXMI; nodenr++) { 107 if (bus_space_map(sc->sc_iot, sc->sc_addr + XMI_NODE(nodenr), 108 NBPG, 0, &xa.xa_ioh)) { 109 printf("xmi_attach: bus_space_map failed, node %d\n", 110 nodenr); 111 return; 112 } 113 if (badaddr((caddr_t)xa.xa_ioh, 4)) { 114 bus_space_unmap(sc->sc_iot, xa.xa_ioh, NBPG); 115 continue; 116 } 117 xa.xa_nodenr = nodenr; 118 xa.xa_ivec = 256 + lastiv; 119 lastiv += 4; 120 config_found(&sc->sc_dev, &xa, xmi_print); 121 } 122 } 123