1 /* $NetBSD: intio.c,v 1.12 2002/10/02 05:15:53 thorpej Exp $ */ 2 3 /*- 4 * Copyright (c) 1996, 1998, 2001 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Jason R. Thorpe. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the NetBSD 21 * Foundation, Inc. and its contributors. 22 * 4. Neither the name of The NetBSD Foundation nor the names of its 23 * contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36 * POSSIBILITY OF SUCH DAMAGE. 37 */ 38 39 /* 40 * Autoconfiguration support for hp300 internal i/o space. 41 */ 42 43 #include <sys/cdefs.h> 44 __KERNEL_RCSID(0, "$NetBSD: intio.c,v 1.12 2002/10/02 05:15:53 thorpej Exp $"); 45 46 #include <sys/param.h> 47 #include <sys/systm.h> 48 #include <sys/device.h> 49 50 #include <machine/hp300spu.h> 51 52 #include <hp300/dev/intioreg.h> 53 #include <hp300/dev/intiovar.h> 54 55 int intiomatch(struct device *, struct cfdata *, void *); 56 void intioattach(struct device *, struct device *, void *); 57 int intioprint(void *, const char *); 58 59 CFATTACH_DECL(intio, sizeof(struct device), 60 intiomatch, intioattach, NULL, NULL); 61 62 #if defined(HP320) || defined(HP330) || defined(HP340) || defined(HP345) || \ 63 defined(HP350) || defined(HP360) || defined(HP370) || defined(HP375) || \ 64 defined(HP380) || defined(HP385) 65 const struct intio_builtins intio_3xx_builtins[] = { 66 { "rtc", 0x020000, -1}, 67 { "hil", 0x028000, 1}, 68 { "fb", 0x160000, -1}, 69 }; 70 #define nintio_3xx_builtins \ 71 (sizeof(intio_3xx_builtins) / sizeof(intio_3xx_builtins[0])) 72 #endif 73 74 #if defined(HP400) || defined(HP425) || defined(HP433) 75 const struct intio_builtins intio_4xx_builtins[] = { 76 { "rtc", 0x020000, -1}, 77 { "frodo", 0x01c000, 5}, 78 { "hil", 0x028000, 1}, 79 }; 80 #define nintio_4xx_builtins \ 81 (sizeof(intio_4xx_builtins) / sizeof(intio_4xx_builtins[0])) 82 #endif 83 84 static int intio_matched = 0; 85 86 int 87 intiomatch(parent, match, aux) 88 struct device *parent; 89 struct cfdata *match; 90 void *aux; 91 { 92 /* Allow only one instance. */ 93 if (intio_matched) 94 return (0); 95 96 intio_matched = 1; 97 return (1); 98 } 99 100 void 101 intioattach(parent, self, aux) 102 struct device *parent, *self; 103 void *aux; 104 { 105 struct intio_attach_args ia; 106 const struct intio_builtins *ib; 107 int ndevs; 108 int i; 109 110 printf("\n"); 111 112 switch (machineid) { 113 #if defined(HP320) || defined(HP330) || defined(HP340) || defined(HP345) || \ 114 defined(HP350) || defined(HP360) || defined(HP370) || defined(HP375) || \ 115 defined(HP380) || defined(HP385) 116 case HP_320: 117 case HP_330: 118 case HP_340: 119 case HP_345: 120 case HP_350: 121 case HP_360: 122 case HP_370: 123 case HP_375: 124 case HP_380: 125 case HP_385: 126 ib = intio_3xx_builtins; 127 ndevs = nintio_3xx_builtins; 128 break; 129 #endif 130 #if defined(HP400) || defined(HP425) || defined(HP433) 131 case HP_400: 132 case HP_425: 133 case HP_433: 134 ib = intio_4xx_builtins; 135 ndevs = nintio_4xx_builtins; 136 break; 137 #endif 138 default: 139 return; 140 } 141 142 memset(&ia, 0, sizeof(ia)); 143 144 for (i=0; i<ndevs; i++) { 145 strncpy(ia.ia_modname, ib[i].ib_modname, INTIO_MOD_LEN); 146 ia.ia_modname[INTIO_MOD_LEN] = '\0'; 147 ia.ia_bst = HP300_BUS_SPACE_INTIO; 148 ia.ia_iobase = ib[i].ib_offset; 149 ia.ia_addr = (bus_addr_t)(intiobase + ib[i].ib_offset); 150 ia.ia_ipl = ib[i].ib_ipl; 151 config_found(self, &ia, intioprint); 152 } 153 } 154 155 int 156 intioprint(aux, pnp) 157 void *aux; 158 const char *pnp; 159 { 160 struct intio_attach_args *ia = aux; 161 162 if (pnp != NULL) 163 printf("%s at %s", ia->ia_modname, pnp); 164 if (ia->ia_iobase != 0) { 165 printf(" addr 0x%lx", INTIOBASE + ia->ia_iobase); 166 if (ia->ia_ipl != -1 && pnp != NULL) 167 printf(" ipl %d", ia->ia_ipl); 168 } 169 return (UNCONF); 170 } 171