1 /* $NetBSD: intio.c,v 1.11 2002/05/05 22:55:49 gmcgarry 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.11 2002/05/05 22:55:49 gmcgarry 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 const struct cfattach intio_ca = { 60 sizeof(struct device), intiomatch, intioattach 61 }; 62 63 #if defined(HP320) || defined(HP330) || defined(HP340) || defined(HP345) || \ 64 defined(HP350) || defined(HP360) || defined(HP370) || defined(HP375) || \ 65 defined(HP380) || defined(HP385) 66 const struct intio_builtins intio_3xx_builtins[] = { 67 { "rtc", 0x020000, -1}, 68 { "hil", 0x028000, 1}, 69 { "fb", 0x160000, -1}, 70 }; 71 #define nintio_3xx_builtins \ 72 (sizeof(intio_3xx_builtins) / sizeof(intio_3xx_builtins[0])) 73 #endif 74 75 #if defined(HP400) || defined(HP425) || defined(HP433) 76 const struct intio_builtins intio_4xx_builtins[] = { 77 { "rtc", 0x020000, -1}, 78 { "frodo", 0x01c000, 5}, 79 { "hil", 0x028000, 1}, 80 }; 81 #define nintio_4xx_builtins \ 82 (sizeof(intio_4xx_builtins) / sizeof(intio_4xx_builtins[0])) 83 #endif 84 85 static int intio_matched = 0; 86 87 int 88 intiomatch(parent, match, aux) 89 struct device *parent; 90 struct cfdata *match; 91 void *aux; 92 { 93 /* Allow only one instance. */ 94 if (intio_matched) 95 return (0); 96 97 intio_matched = 1; 98 return (1); 99 } 100 101 void 102 intioattach(parent, self, aux) 103 struct device *parent, *self; 104 void *aux; 105 { 106 struct intio_attach_args ia; 107 const struct intio_builtins *ib; 108 int ndevs; 109 int i; 110 111 printf("\n"); 112 113 switch (machineid) { 114 #if defined(HP320) || defined(HP330) || defined(HP340) || defined(HP345) || \ 115 defined(HP350) || defined(HP360) || defined(HP370) || defined(HP375) || \ 116 defined(HP380) || defined(HP385) 117 case HP_320: 118 case HP_330: 119 case HP_340: 120 case HP_345: 121 case HP_350: 122 case HP_360: 123 case HP_370: 124 case HP_375: 125 case HP_380: 126 case HP_385: 127 ib = intio_3xx_builtins; 128 ndevs = nintio_3xx_builtins; 129 break; 130 #endif 131 #if defined(HP400) || defined(HP425) || defined(HP433) 132 case HP_400: 133 case HP_425: 134 case HP_433: 135 ib = intio_4xx_builtins; 136 ndevs = nintio_4xx_builtins; 137 break; 138 #endif 139 default: 140 return; 141 } 142 143 memset(&ia, 0, sizeof(ia)); 144 145 for (i=0; i<ndevs; i++) { 146 strncpy(ia.ia_modname, ib[i].ib_modname, INTIO_MOD_LEN); 147 ia.ia_modname[INTIO_MOD_LEN] = '\0'; 148 ia.ia_bst = HP300_BUS_SPACE_INTIO; 149 ia.ia_iobase = ib[i].ib_offset; 150 ia.ia_addr = (bus_addr_t)(intiobase + ib[i].ib_offset); 151 ia.ia_ipl = ib[i].ib_ipl; 152 config_found(self, &ia, intioprint); 153 } 154 } 155 156 int 157 intioprint(aux, pnp) 158 void *aux; 159 const char *pnp; 160 { 161 struct intio_attach_args *ia = aux; 162 163 if (pnp != NULL) 164 printf("%s at %s", ia->ia_modname, pnp); 165 if (ia->ia_iobase != 0) { 166 printf(" addr 0x%lx", INTIOBASE + ia->ia_iobase); 167 if (ia->ia_ipl != -1 && pnp != NULL) 168 printf(" ipl %d", ia->ia_ipl); 169 } 170 return (UNCONF); 171 } 172