1 1.27 andvar /* $NetBSD: vrc4173bcu.c,v 1.27 2022/07/21 10:09:21 andvar Exp $ */ 2 1.1 enami 3 1.1 enami /*- 4 1.4 takemura * Copyright (c) 2001,2002 Enami Tsugutomo. 5 1.1 enami * All rights reserved. 6 1.1 enami * 7 1.1 enami * Redistribution and use in source and binary forms, with or without 8 1.1 enami * modification, are permitted provided that the following conditions 9 1.1 enami * are met: 10 1.1 enami * 1. Redistributions of source code must retain the above copyright 11 1.1 enami * notice, this list of conditions and the following disclaimer. 12 1.1 enami * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 enami * notice, this list of conditions and the following disclaimer in the 14 1.1 enami * documentation and/or other materials provided with the distribution. 15 1.1 enami * 16 1.1 enami * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 17 1.1 enami * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 1.1 enami * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 1.1 enami * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 20 1.1 enami * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 1.1 enami * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 1.1 enami * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 1.1 enami * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 1.1 enami * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 1.1 enami * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 1.1 enami * SUCH DAMAGE. 27 1.1 enami */ 28 1.14 lukem 29 1.14 lukem #include <sys/cdefs.h> 30 1.27 andvar __KERNEL_RCSID(0, "$NetBSD: vrc4173bcu.c,v 1.27 2022/07/21 10:09:21 andvar Exp $"); 31 1.1 enami 32 1.1 enami #include <sys/param.h> 33 1.1 enami #include <sys/systm.h> 34 1.1 enami #include <sys/device.h> 35 1.1 enami 36 1.1 enami #include <machine/bus.h> 37 1.1 enami 38 1.1 enami #include <dev/pci/pcivar.h> 39 1.1 enami #include <dev/pci/pcidevs.h> 40 1.1 enami 41 1.2 takemura #include <machine/platid.h> 42 1.2 takemura #include <machine/platid_mask.h> 43 1.6 takemura #include <machine/config_hook.h> 44 1.2 takemura 45 1.7 takemura #include <hpcmips/vr/vripunit.h> 46 1.7 takemura #include <hpcmips/vr/vripif.h> 47 1.1 enami #include <hpcmips/vr/vrc4173bcuvar.h> 48 1.1 enami #include <hpcmips/vr/vrc4173icureg.h> 49 1.2 takemura #include <hpcmips/vr/vrc4173cmureg.h> 50 1.1 enami 51 1.13 imp #include "locators.h" 52 1.13 imp 53 1.7 takemura #ifdef VRC4173BCU_DEBUG 54 1.7 takemura #define DPRINTF_ENABLE 55 1.7 takemura #define DPRINTF_DEBUG vrc4173bcu_debug 56 1.1 enami #endif 57 1.7 takemura #define USE_HPC_DPRINTF 58 1.7 takemura #include <machine/debug.h> 59 1.1 enami 60 1.7 takemura #define VRC4173BCU_BADR 0x10 61 1.2 takemura #define USE_WINCE_CLKMASK (~0) 62 1.2 takemura 63 1.22 chs static int vrc4173bcu_match(device_t, cfdata_t, void *); 64 1.22 chs static void vrc4173bcu_attach(device_t, device_t, void *); 65 1.7 takemura static int vrc4173bcu_intr(void *); 66 1.1 enami static int vrc4173bcu_print(void *, const char *); 67 1.22 chs static int vrc4173bcu_search(device_t, cfdata_t, const int *, void *); 68 1.7 takemura static int vrc4173bcu_pci_intr(void *); 69 1.7 takemura #ifdef VRC4173BCU_DEBUG 70 1.7 takemura static void vrc4173bcu_dump_level2mask(vrip_chipset_tag_t, 71 1.7 takemura vrip_intr_handle_t); 72 1.7 takemura #endif 73 1.7 takemura 74 1.7 takemura int __vrc4173bcu_power(vrip_chipset_tag_t, int, int); 75 1.7 takemura vrip_intr_handle_t __vrc4173bcu_intr_establish(vrip_chipset_tag_t, int, int, 76 1.7 takemura int, int(*)(void*), void*); 77 1.7 takemura void __vrc4173bcu_intr_disestablish(vrip_chipset_tag_t, vrip_intr_handle_t); 78 1.7 takemura void __vrc4173bcu_intr_setmask1(vrip_chipset_tag_t, vrip_intr_handle_t, int); 79 1.7 takemura void __vrc4173bcu_intr_setmask2(vrip_chipset_tag_t, vrip_intr_handle_t, 80 1.7 takemura u_int32_t, int); 81 1.7 takemura void __vrc4173bcu_intr_getstatus2(vrip_chipset_tag_t, vrip_intr_handle_t, 82 1.7 takemura u_int32_t*); 83 1.7 takemura void __vrc4173bcu_register_cmu(vrip_chipset_tag_t, vrcmu_chipset_tag_t); 84 1.7 takemura void __vrc4173bcu_register_gpio(vrip_chipset_tag_t, hpcio_chip_t); 85 1.7 takemura void __vrc4173bcu_register_dmaau(vrip_chipset_tag_t, vrdmaau_chipset_tag_t); 86 1.7 takemura void __vrc4173bcu_register_dcu(vrip_chipset_tag_t, vrdcu_chipset_tag_t); 87 1.7 takemura int __vrc4173bcu_clock(vrcmu_chipset_tag_t, u_int16_t, int); 88 1.1 enami 89 1.4 takemura /* 90 1.4 takemura * machine dependent info 91 1.4 takemura */ 92 1.2 takemura static struct vrc4173bcu_platdep { 93 1.4 takemura platid_mask_t *platidmask; 94 1.2 takemura u_int32_t clkmask; 95 1.6 takemura int intrmask; 96 1.2 takemura } platdep_table[] = { 97 1.2 takemura { 98 1.4 takemura &platid_mask_MACH_VICTOR_INTERLINK_MPC303, 99 1.6 takemura USE_WINCE_CLKMASK, /* clock mask */ 100 1.27 andvar (1 << VRC4173ICU_USBINTR)| /* interrupts */ 101 1.6 takemura (1 << VRC4173ICU_PCMCIA1INTR)| 102 1.6 takemura (1 << VRC4173ICU_PCMCIA2INTR), 103 1.4 takemura }, 104 1.4 takemura { 105 1.4 takemura &platid_mask_MACH_VICTOR_INTERLINK_MPC304, 106 1.6 takemura USE_WINCE_CLKMASK, /* clock mask */ 107 1.27 andvar (1 << VRC4173ICU_USBINTR)| /* interrupts */ 108 1.6 takemura (1 << VRC4173ICU_PCMCIA1INTR)| 109 1.6 takemura (1 << VRC4173ICU_PCMCIA2INTR), 110 1.4 takemura }, 111 1.4 takemura { 112 1.4 takemura &platid_mask_MACH_NEC_MCR_SIGMARION2, 113 1.6 takemura USE_WINCE_CLKMASK, /* clock mask */ 114 1.27 andvar (1 << VRC4173ICU_USBINTR), /* interrupts */ 115 1.4 takemura }, 116 1.4 takemura { 117 1.2 takemura &platid_wild, 118 1.2 takemura USE_WINCE_CLKMASK, /* XXX */ 119 1.4 takemura -1, 120 1.2 takemura }, 121 1.2 takemura }; 122 1.2 takemura 123 1.7 takemura struct vrc4173bcu_unit { 124 1.16 he const char *vu_name; 125 1.7 takemura int vu_intr[2]; 126 1.7 takemura int vu_clkmask; 127 1.7 takemura bus_addr_t vu_lreg; 128 1.7 takemura bus_addr_t vu_mlreg; 129 1.7 takemura bus_addr_t vu_hreg; 130 1.7 takemura bus_addr_t vu_mhreg; 131 1.7 takemura }; 132 1.7 takemura 133 1.4 takemura struct vrc4173bcu_softc { 134 1.22 chs device_t sc_dev; 135 1.7 takemura struct vrip_chipset_tag sc_chipset; 136 1.7 takemura struct vrcmu_chipset_tag sc_cmuchip; 137 1.4 takemura 138 1.4 takemura pci_chipset_tag_t sc_pc; 139 1.4 takemura bus_space_tag_t sc_iot; 140 1.4 takemura bus_space_handle_t sc_ioh; 141 1.4 takemura bus_size_t sc_size; 142 1.4 takemura 143 1.4 takemura bus_space_handle_t sc_icuh; /* I/O handle for ICU. */ 144 1.4 takemura bus_space_handle_t sc_cmuh; /* I/O handle for CMU. */ 145 1.4 takemura void *sc_ih; 146 1.6 takemura #define VRC4173BCU_NINTRS 16 147 1.5 takemura int sc_intrmask; 148 1.7 takemura struct vrc4173bcu_intrhand { 149 1.7 takemura int (*ih_fun)(void *); 150 1.7 takemura void *ih_arg; 151 1.7 takemura const struct vrc4173bcu_unit *ih_unit; 152 1.7 takemura } sc_intrhands[32]; 153 1.7 takemura 154 1.7 takemura struct vrc4173bcu_unit *sc_units; 155 1.7 takemura int sc_nunits; 156 1.7 takemura int sc_pri; 157 1.4 takemura 158 1.4 takemura struct vrc4173bcu_platdep *sc_platdep; 159 1.4 takemura }; 160 1.4 takemura 161 1.7 takemura #define VALID_UNIT(sc, unit) (0 <= (unit) && (unit) < (sc)->sc_nunits) 162 1.7 takemura 163 1.7 takemura static struct vrc4173bcu_unit vrc4173bcu_units[] = { 164 1.7 takemura [VRIP_UNIT_KIU] = { 165 1.7 takemura "kiu", 166 1.7 takemura { VRC4173ICU_KIUINTR, }, 167 1.7 takemura VRC4173CMU_CLKMSK_KIU, 168 1.7 takemura VRC4173ICU_KIUINT, VRC4173ICU_MKIUINT, 169 1.7 takemura }, 170 1.7 takemura [VRIP_UNIT_PIU] = { 171 1.7 takemura "piu", 172 1.7 takemura { VRC4173ICU_PIUINTR, VRC4173ICU_DOZEPIUINTR}, 173 1.7 takemura VRC4173CMU_CLKMSK_PIU, 174 1.7 takemura VRC4173ICU_PIUINT, VRC4173ICU_MPIUINT, 175 1.7 takemura }, 176 1.7 takemura [VRIP_UNIT_AIU] = { 177 1.7 takemura "aiu", 178 1.7 takemura { VRC4173ICU_AIUINTR, }, 179 1.7 takemura VRC4173CMU_CLKMSK_AIU, 180 1.7 takemura VRC4173ICU_AIUINT, VRC4173ICU_MAIUINT, 181 1.7 takemura }, 182 1.7 takemura [VRIP_UNIT_GIU] = { 183 1.7 takemura "giu", 184 1.7 takemura { VRC4173ICU_GIUINTR, }, 185 1.7 takemura 0, 186 1.7 takemura VRC4173ICU_GIULINT, VRC4173ICU_MGIULINT, 187 1.7 takemura VRC4173ICU_GIUHINT, VRC4173ICU_MGIUHINT, 188 1.7 takemura }, 189 1.7 takemura [VRIP_UNIT_PS2U0] = { 190 1.7 takemura "PS/2-Ch1", 191 1.7 takemura { VRC4173ICU_PS2CH1INTR, }, 192 1.7 takemura VRC4173CMU_CLKMSK_PS2CH1, 193 1.7 takemura }, 194 1.7 takemura [VRIP_UNIT_PS2U1] = { 195 1.7 takemura "PS/2-Ch2", 196 1.7 takemura { VRC4173ICU_PS2CH2INTR, }, 197 1.7 takemura VRC4173CMU_CLKMSK_PS2CH2, 198 1.7 takemura }, 199 1.7 takemura [VRIP_UNIT_USBU] = { 200 1.7 takemura "usbu", 201 1.7 takemura { VRC4173ICU_USBINTR, }, 202 1.7 takemura VRC4173CMU_CLKMSK_USB, 203 1.7 takemura }, 204 1.7 takemura [VRIP_UNIT_CARDU0] = { 205 1.7 takemura "cardu0", 206 1.7 takemura { VRC4173ICU_PCMCIA1INTR, }, 207 1.7 takemura VRC4173CMU_CLKMSK_CARD1, 208 1.7 takemura }, 209 1.7 takemura [VRIP_UNIT_CARDU1] = { 210 1.7 takemura "cardu1", 211 1.7 takemura { VRC4173ICU_PCMCIA2INTR, }, 212 1.7 takemura VRC4173CMU_CLKMSK_CARD2, 213 1.7 takemura }, 214 1.7 takemura }; 215 1.7 takemura 216 1.22 chs CFATTACH_DECL_NEW(vrc4173bcu, sizeof(struct vrc4173bcu_softc), 217 1.11 thorpej vrc4173bcu_match, vrc4173bcu_attach, NULL, NULL); 218 1.4 takemura 219 1.7 takemura static const struct vrip_chipset_tag vrc4173bcu_chipset_methods = { 220 1.7 takemura .vc_power = __vrc4173bcu_power, 221 1.7 takemura .vc_intr_establish = __vrc4173bcu_intr_establish, 222 1.7 takemura .vc_intr_disestablish = __vrc4173bcu_intr_disestablish, 223 1.7 takemura .vc_intr_setmask1 = __vrc4173bcu_intr_setmask1, 224 1.7 takemura .vc_intr_setmask2 = __vrc4173bcu_intr_setmask2, 225 1.7 takemura .vc_intr_getstatus2 = __vrc4173bcu_intr_getstatus2, 226 1.7 takemura .vc_register_cmu = __vrc4173bcu_register_cmu, 227 1.7 takemura .vc_register_gpio = __vrc4173bcu_register_gpio, 228 1.7 takemura .vc_register_dmaau = __vrc4173bcu_register_dmaau, 229 1.7 takemura .vc_register_dcu = __vrc4173bcu_register_dcu, 230 1.7 takemura }; 231 1.7 takemura 232 1.1 enami int 233 1.22 chs vrc4173bcu_match(device_t parent, cfdata_t match, void *aux) 234 1.1 enami { 235 1.1 enami struct pci_attach_args *pa = (struct pci_attach_args *)aux; 236 1.1 enami 237 1.1 enami if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_NEC && 238 1.1 enami PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_NEC_VRC4173_BCU) 239 1.1 enami return (1); 240 1.1 enami 241 1.1 enami return (0); 242 1.1 enami } 243 1.1 enami 244 1.1 enami void 245 1.22 chs vrc4173bcu_attach(device_t parent, device_t self, void *aux) 246 1.1 enami { 247 1.22 chs struct vrc4173bcu_softc *sc = device_private(self); 248 1.22 chs struct pci_attach_args *pa = aux; 249 1.1 enami pci_chipset_tag_t pc = pa->pa_pc; 250 1.1 enami pcitag_t tag = pa->pa_tag; 251 1.1 enami pcireg_t csr; 252 1.1 enami char devinfo[256]; 253 1.2 takemura u_int16_t reg; 254 1.6 takemura pci_intr_handle_t ih; 255 1.6 takemura const char *intrstr; 256 1.6 takemura int bus, device, function; 257 1.23 christos char ibuf[PCI_INTRSTR_LEN]; 258 1.1 enami #ifdef DEBUG 259 1.1 enami char buf[80]; 260 1.1 enami #endif 261 1.1 enami 262 1.22 chs sc->sc_dev = self; 263 1.22 chs 264 1.15 kleink pci_devinfo(pa->pa_id, pa->pa_class, 0, devinfo, sizeof(devinfo)); 265 1.1 enami printf(": %s (rev. 0x%02x)\n", devinfo, PCI_REVISION(pa->pa_class)); 266 1.1 enami 267 1.1 enami #if 0 268 1.22 chs printf("%s: ", device_xname(self)); 269 1.1 enami pci_conf_print(pa->pa_pc, pa->pa_tag, NULL); 270 1.1 enami #endif 271 1.1 enami 272 1.7 takemura sc->sc_pc = pc; 273 1.7 takemura sc->sc_cmuchip.cc_sc = sc; 274 1.7 takemura sc->sc_cmuchip.cc_clock = __vrc4173bcu_clock; 275 1.7 takemura sc->sc_units = vrc4173bcu_units; 276 1.7 takemura sc->sc_nunits = sizeof(vrc4173bcu_units)/sizeof(struct vrc4173bcu_unit); 277 1.7 takemura sc->sc_chipset = vrc4173bcu_chipset_methods; /* structure assignment */ 278 1.7 takemura sc->sc_chipset.vc_sc = sc; 279 1.1 enami 280 1.4 takemura sc->sc_platdep = platid_search(&platid, platdep_table, 281 1.2 takemura sizeof(platdep_table)/sizeof(*platdep_table), 282 1.2 takemura sizeof(*platdep_table)); 283 1.2 takemura 284 1.1 enami /* Map I/O registers */ 285 1.1 enami if (pci_mapreg_map(pa, VRC4173BCU_BADR, PCI_MAPREG_TYPE_IO, 0, 286 1.1 enami &sc->sc_iot, &sc->sc_ioh, NULL, &sc->sc_size)) { 287 1.22 chs printf("%s: can't map mem space\n", device_xname(self)); 288 1.1 enami return; 289 1.1 enami } 290 1.1 enami 291 1.1 enami /* Enable the device. */ 292 1.1 enami csr = pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG); 293 1.22 chs DPRINTF(("%s: csr = 0x%08x", device_xname(self), csr)); 294 1.1 enami pci_conf_write(pc, tag, PCI_COMMAND_STATUS_REG, 295 1.1 enami csr | PCI_COMMAND_MASTER_ENABLE | PCI_COMMAND_IO_ENABLE); 296 1.1 enami csr = pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG); 297 1.1 enami DPRINTF((" -> 0x%08x\n", csr)); 298 1.1 enami 299 1.1 enami csr = pci_conf_read(pc, tag, VRC4173BCU_BADR); 300 1.22 chs DPRINTF(("%s: base addr = %x@0x%08x\n", device_xname(self), 301 1.1 enami (int)sc->sc_size, csr)); 302 1.22 chs DPRINTF(("%s: iot = 0x%08x, ioh = 0x%08x\n", device_xname(self), 303 1.4 takemura (int)sc->sc_iot, (int)sc->sc_ioh)); 304 1.1 enami 305 1.1 enami /* 306 1.1 enami * Map I/O space for ICU. 307 1.1 enami */ 308 1.1 enami if (bus_space_subregion(sc->sc_iot, sc->sc_ioh, 309 1.1 enami VRC4173ICU_IOBASE, VRC4173ICU_IOSIZE, &sc->sc_icuh)) { 310 1.1 enami printf(": can't map ICU i/o space\n"); 311 1.1 enami return; 312 1.1 enami } 313 1.1 enami 314 1.2 takemura /* 315 1.2 takemura * Map I/O space for CMU. 316 1.2 takemura */ 317 1.2 takemura if (bus_space_subregion(sc->sc_iot, sc->sc_ioh, 318 1.2 takemura VRC4173CMU_IOBASE, VRC4173CMU_IOSIZE, &sc->sc_cmuh)) { 319 1.2 takemura printf(": can't map CMU i/o space\n"); 320 1.2 takemura return; 321 1.2 takemura } 322 1.2 takemura 323 1.4 takemura /* machine dependent setup */ 324 1.4 takemura if (sc->sc_platdep->clkmask == USE_WINCE_CLKMASK) { 325 1.4 takemura /* XXX, You can nothing! */ 326 1.2 takemura reg = bus_space_read_2(sc->sc_iot, sc->sc_cmuh, 327 1.4 takemura VRC4173CMU_CLKMSK); 328 1.2 takemura printf("%s: default clock mask is %04x\n", 329 1.22 chs device_xname(self), reg); 330 1.2 takemura } else { 331 1.4 takemura /* assert all reset bits */ 332 1.4 takemura bus_space_write_2(sc->sc_iot, sc->sc_cmuh, VRC4173CMU_SRST, 333 1.4 takemura VRC4173CMU_SRST_AC97 | VRC4173CMU_SRST_USB | 334 1.4 takemura VRC4173CMU_SRST_CARD2 | VRC4173CMU_SRST_CARD1); 335 1.4 takemura /* set clock mask */ 336 1.2 takemura bus_space_write_2(sc->sc_iot, sc->sc_cmuh, 337 1.4 takemura VRC4173CMU_CLKMSK, sc->sc_platdep->clkmask); 338 1.4 takemura /* clear reset bit */ 339 1.4 takemura bus_space_write_2(sc->sc_iot, sc->sc_cmuh, VRC4173CMU_SRST, 0); 340 1.2 takemura } 341 1.2 takemura 342 1.1 enami #ifdef DEBUG 343 1.1 enami reg = bus_space_read_2(sc->sc_iot, sc->sc_icuh, VRC4173ICU_SYSINT1); 344 1.20 christos snprintb(buf, sizeof(buf), 345 1.1 enami "\20\1USB\2PCMCIA2\3PCMCIA1\4PS2CH2\5PS2CH1\6PIU\7AIU\10KIU" 346 1.20 christos "\11GIU\12AC97\13AC97-1\14B11\15B12\16DOZEPIU\17B14\20B15", reg); 347 1.24 msaitoh printf("%s: SYSINT1 = %s\n", device_xname(self), buf); 348 1.1 enami 349 1.1 enami reg = bus_space_read_2(sc->sc_iot, sc->sc_icuh, VRC4173ICU_MKIUINT); 350 1.20 christos snprintb(buf, sizeof(buf), 351 1.1 enami "\20\1SCANINT\2KDATRDY\3KDATLOST\4B3\5B4\6B5\7B6\10B7" 352 1.20 christos "\11B8\12B9\13B10\14B11\15B12\16B13\17B14\20B15", reg); 353 1.24 msaitoh printf("%s: MKIUINT = %s\n", device_xname(self), buf); 354 1.1 enami 355 1.1 enami reg = bus_space_read_2(sc->sc_iot, sc->sc_icuh, VRC4173ICU_MSYSINT1); 356 1.20 christos snprintb(buf, sizeof(buf), 357 1.1 enami "\20\1USB\2PCMCIA2\3PCMCIA1\4PS2CH2\5PS2CH1\6PIU\7AIU\10KIU" 358 1.20 christos "\11GIU\12AC97\13AC97-1\14B11\15B12\16DOZEPIU\17B14\20B15", reg); 359 1.24 msaitoh printf("%s: MSYSINT1 = %s\n", device_xname(self), buf); 360 1.1 enami 361 1.1 enami #if 1 362 1.1 enami reg = VRC4173ICU_USBINTR | VRC4173ICU_PIUINTR | VRC4173ICU_KIUINTR | 363 1.1 enami VRC4173ICU_DOZEPIUINTR; 364 1.1 enami bus_space_write_2(sc->sc_iot, sc->sc_icuh, VRC4173ICU_MSYSINT1, reg); 365 1.1 enami 366 1.1 enami reg = bus_space_read_2(sc->sc_iot, sc->sc_icuh, VRC4173ICU_MSYSINT1); 367 1.21 dholland snprintb(buf, sizeof(buf), 368 1.1 enami "\20\1USB\2PCMCIA2\3PCMCIA1\4PS2CH2\5PS2CH1\6PIU\7AIU\10KIU" 369 1.20 christos "\11GIU\12AC97\13AC97-1\14B11\15B12\16DOZEPIU\17B14\20B15", reg); 370 1.24 msaitoh printf("%s: MSYSINT1 = %s\n", device_xname(self), buf); 371 1.1 enami #endif 372 1.1 enami #endif 373 1.1 enami 374 1.6 takemura /* 375 1.7 takemura * set interrupt mask 376 1.7 takemura */ 377 1.7 takemura sc->sc_intrmask = sc->sc_platdep->intrmask; 378 1.7 takemura bus_space_write_2(sc->sc_iot, sc->sc_icuh, VRC4173ICU_MSYSINT1, 379 1.7 takemura sc->sc_intrmask); 380 1.7 takemura 381 1.7 takemura /* 382 1.6 takemura * install interrupt handler 383 1.6 takemura */ 384 1.6 takemura if (pci_intr_map(pa, &ih)) { 385 1.22 chs printf("%s: couldn't map interrupt\n", device_xname(self)); 386 1.6 takemura return; 387 1.6 takemura } 388 1.23 christos intrstr = pci_intr_string(pc, ih, ibuf, sizeof(ibuf)); 389 1.6 takemura sc->sc_ih = pci_intr_establish(pc, ih, IPL_NET, vrc4173bcu_intr, sc); 390 1.6 takemura if (sc->sc_ih == NULL) { 391 1.6 takemura printf("%s: couldn't establish interrupt", 392 1.22 chs device_xname(self)); 393 1.6 takemura if (intrstr != NULL) 394 1.6 takemura printf(" at %s", intrstr); 395 1.6 takemura printf("\n"); 396 1.6 takemura return; 397 1.6 takemura } 398 1.22 chs printf("%s: interrupting at %s\n", device_xname(self), intrstr); 399 1.6 takemura 400 1.6 takemura /* 401 1.6 takemura * install pci intr hooks 402 1.6 takemura */ 403 1.6 takemura pci_decompose_tag(pc, pa->pa_intrtag, &bus, &device, &function); 404 1.6 takemura /* USB unit */ 405 1.6 takemura if (sc->sc_intrmask & (1 << VRC4173ICU_USBINTR)) 406 1.7 takemura vrip_intr_establish(&sc->sc_chipset, VRIP_UNIT_USBU, 0, 407 1.7 takemura IPL_NET, vrc4173bcu_pci_intr, 408 1.6 takemura config_connect(CONFIG_HOOK_PCIINTR, 409 1.7 takemura CONFIG_HOOK_PCIINTR_ID(bus, device, 2))); 410 1.6 takemura /* PC card unit 1 */ 411 1.6 takemura if (sc->sc_intrmask & (1 << VRC4173ICU_PCMCIA1INTR)) 412 1.7 takemura vrip_intr_establish(&sc->sc_chipset, VRIP_UNIT_CARDU0, 0, 413 1.7 takemura IPL_NET, vrc4173bcu_pci_intr, 414 1.6 takemura config_connect(CONFIG_HOOK_PCIINTR, 415 1.7 takemura CONFIG_HOOK_PCIINTR_ID(bus, 1, 0))); 416 1.6 takemura /* PC card unit 2 */ 417 1.6 takemura if (sc->sc_intrmask & (1 << VRC4173ICU_PCMCIA2INTR)) 418 1.7 takemura vrip_intr_establish(&sc->sc_chipset, VRIP_UNIT_CARDU1, 0, 419 1.7 takemura IPL_NET, vrc4173bcu_pci_intr, 420 1.6 takemura config_connect(CONFIG_HOOK_PCIINTR, 421 1.7 takemura CONFIG_HOOK_PCIINTR_ID(bus, 2, 0))); 422 1.6 takemura 423 1.6 takemura /* 424 1.7 takemura * Attach each devices 425 1.7 takemura * sc->sc_pri = 2~1 426 1.1 enami */ 427 1.25 thorpej for (sc->sc_pri = 2; 0 < sc->sc_pri; sc->sc_pri--) { 428 1.25 thorpej config_search(self, NULL, 429 1.26 thorpej CFARGS(.search = vrc4173bcu_search)); 430 1.25 thorpej } 431 1.1 enami } 432 1.1 enami 433 1.1 enami int 434 1.7 takemura vrc4173bcu_print(void *aux, const char *hoge) 435 1.1 enami { 436 1.7 takemura struct vrip_attach_args *va = (struct vrip_attach_args*)aux; 437 1.1 enami 438 1.8 takemura if (va->va_addr != VRIPIFCF_ADDR_DEFAULT) 439 1.12 thorpej aprint_normal(" addr 0x%04lx", va->va_addr); 440 1.8 takemura if (va->va_size != VRIPIFCF_SIZE_DEFAULT) 441 1.12 thorpej aprint_normal("-%04lx", 442 1.12 thorpej (va->va_addr + va->va_size - 1) & 0xffff); 443 1.8 takemura if (va->va_addr2 != VRIPIFCF_ADDR2_DEFAULT) 444 1.12 thorpej aprint_normal(", 0x%04lx", va->va_addr2); 445 1.8 takemura if (va->va_size2 != VRIPIFCF_SIZE2_DEFAULT) 446 1.12 thorpej aprint_normal("-%04lx", 447 1.12 thorpej (va->va_addr2 + va->va_size2 - 1) & 0xffff); 448 1.1 enami 449 1.1 enami return (UNCONF); 450 1.1 enami } 451 1.1 enami 452 1.1 enami int 453 1.22 chs vrc4173bcu_search(device_t parent, cfdata_t cf, const int *ldesc, void *aux) 454 1.7 takemura { 455 1.22 chs struct vrc4173bcu_softc *sc = device_private(parent); 456 1.7 takemura struct vrip_attach_args va; 457 1.7 takemura 458 1.7 takemura memset(&va, 0, sizeof(va)); 459 1.7 takemura va.va_vc = &sc->sc_chipset; 460 1.7 takemura va.va_iot = sc->sc_iot; 461 1.7 takemura va.va_parent_ioh = sc->sc_ioh; 462 1.7 takemura va.va_unit = cf->cf_loc[VRIPIFCF_UNIT]; 463 1.7 takemura va.va_addr = cf->cf_loc[VRIPIFCF_ADDR]; 464 1.7 takemura va.va_size = cf->cf_loc[VRIPIFCF_SIZE]; 465 1.7 takemura va.va_addr2 = cf->cf_loc[VRIPIFCF_ADDR2]; 466 1.7 takemura va.va_size2 = cf->cf_loc[VRIPIFCF_SIZE2]; 467 1.7 takemura va.va_gpio_chips = NULL; /* XXX */ 468 1.7 takemura va.va_cc = sc->sc_chipset.vc_cc; 469 1.7 takemura va.va_ac = sc->sc_chipset.vc_ac; 470 1.7 takemura va.va_dc = sc->sc_chipset.vc_dc; 471 1.25 thorpej if (/*XXX*/config_probe(parent, cf, &va) == sc->sc_pri) 472 1.26 thorpej config_attach(parent, cf, &va, vrc4173bcu_print, CFARGS_NONE); 473 1.7 takemura 474 1.7 takemura return (0); 475 1.7 takemura } 476 1.7 takemura 477 1.7 takemura int 478 1.1 enami vrc4173bcu_intr(void *arg) 479 1.1 enami { 480 1.1 enami struct vrc4173bcu_softc *sc = (struct vrc4173bcu_softc *)arg; 481 1.1 enami u_int16_t reg; 482 1.7 takemura struct vrc4173bcu_intrhand *ih; 483 1.6 takemura int i; 484 1.1 enami 485 1.1 enami reg = bus_space_read_2(sc->sc_iot, sc->sc_icuh, VRC4173ICU_SYSINT1); 486 1.6 takemura reg &= sc->sc_intrmask; 487 1.1 enami if (reg == 0) 488 1.1 enami return (0); 489 1.1 enami 490 1.1 enami #if 0 491 1.1 enami { 492 1.1 enami char buf[80]; 493 1.20 christos snprintb(buf, sizeof(buf), 494 1.1 enami "\20\1USB\2PCMCIA2\3PCMCIA1\4PS2CH2\5PS2CH1\6PIU\7AIU\10KIU" 495 1.20 christos "\11GIU\12AC97\13AC97-1\14B11\15B12\16DOZEPIU\17B14\20B15", reg); 496 1.22 chs printf("%s: %s\n", device_xname(sc->sc_dev), buf); 497 1.1 enami } 498 1.1 enami #endif 499 1.7 takemura for (ih = sc->sc_intrhands, i = 0; i < VRC4173BCU_NINTRS; i++, ih++) 500 1.7 takemura if ((reg & (1 << i)) && ih->ih_fun != NULL) 501 1.7 takemura ih->ih_fun(ih->ih_arg); 502 1.1 enami 503 1.6 takemura return (1); 504 1.7 takemura } 505 1.7 takemura 506 1.7 takemura static int 507 1.7 takemura vrc4173bcu_pci_intr(void *arg) 508 1.7 takemura { 509 1.7 takemura config_call_tag ct = (config_call_tag)arg; 510 1.7 takemura config_connected_call(ct, NULL); 511 1.7 takemura 512 1.7 takemura return (0); 513 1.7 takemura } 514 1.7 takemura 515 1.7 takemura #ifdef VRC4173BCU_DEBUG 516 1.7 takemura static void 517 1.7 takemura vrc4173bcu_dump_level2mask(vrip_chipset_tag_t vc, vrip_intr_handle_t handle) 518 1.7 takemura { 519 1.7 takemura struct vrc4173bcu_softc *sc = vc->vc_sc; 520 1.7 takemura struct vrc4173bcu_intrhand *ih = handle; 521 1.7 takemura const struct vrc4173bcu_unit *vu = ih->ih_unit; 522 1.7 takemura u_int32_t reg; 523 1.7 takemura 524 1.7 takemura if (vu->vu_mlreg) { 525 1.7 takemura DPRINTF(("level1[%d] level2 mask:", vu->vu_intr[0])); 526 1.7 takemura reg = bus_space_read_2(sc->sc_iot, sc->sc_icuh, vu->vu_mlreg); 527 1.7 takemura if (vu->vu_mhreg) { 528 1.7 takemura reg |= (bus_space_read_2(sc->sc_iot, sc->sc_icuh, 529 1.7 takemura vu->vu_mhreg) << 16); 530 1.7 takemura dbg_bit_print(reg); 531 1.7 takemura } else 532 1.7 takemura dbg_bit_print(reg); 533 1.7 takemura } 534 1.7 takemura } 535 1.7 takemura #endif 536 1.7 takemura 537 1.7 takemura int 538 1.7 takemura __vrc4173bcu_power(vrip_chipset_tag_t vc, int unit, int onoff) 539 1.7 takemura { 540 1.7 takemura struct vrc4173bcu_softc *sc = vc->vc_sc; 541 1.7 takemura const struct vrc4173bcu_unit *vu; 542 1.7 takemura 543 1.7 takemura if (sc->sc_chipset.vc_cc == NULL) 544 1.7 takemura return (0); /* You have no clock mask unit yet. */ 545 1.7 takemura if (!VALID_UNIT(sc, unit)) 546 1.7 takemura return (0); 547 1.7 takemura vu = &sc->sc_units[unit]; 548 1.7 takemura 549 1.7 takemura return (*sc->sc_chipset.vc_cc->cc_clock)(sc->sc_chipset.vc_cc, 550 1.7 takemura vu->vu_clkmask, onoff); 551 1.7 takemura } 552 1.7 takemura 553 1.7 takemura vrip_intr_handle_t 554 1.7 takemura __vrc4173bcu_intr_establish(vrip_chipset_tag_t vc, int unit, int line, 555 1.7 takemura int level, int (*ih_fun)(void *), void *ih_arg) 556 1.7 takemura { 557 1.7 takemura struct vrc4173bcu_softc *sc = vc->vc_sc; 558 1.7 takemura const struct vrc4173bcu_unit *vu; 559 1.7 takemura struct vrc4173bcu_intrhand *ih; 560 1.7 takemura 561 1.7 takemura if (!VALID_UNIT(sc, unit)) 562 1.7 takemura return (NULL); 563 1.7 takemura vu = &sc->sc_units[unit]; 564 1.7 takemura ih = &sc->sc_intrhands[vu->vu_intr[line]]; 565 1.7 takemura if (ih->ih_fun) /* Can't share level 1 interrupt */ 566 1.7 takemura return (NULL); 567 1.7 takemura ih->ih_fun = ih_fun; 568 1.7 takemura ih->ih_arg = ih_arg; 569 1.7 takemura ih->ih_unit = vu; 570 1.7 takemura 571 1.7 takemura /* Mask level 2 interrupt mask register. (disable interrupt) */ 572 1.7 takemura vrip_intr_setmask2(vc, ih, ~0, 0); 573 1.7 takemura /* Unmask Level 1 interrupt mask register (enable interrupt) */ 574 1.7 takemura vrip_intr_setmask1(vc, ih, 1); 575 1.7 takemura 576 1.7 takemura return ((void *)ih); 577 1.7 takemura } 578 1.7 takemura 579 1.7 takemura void 580 1.7 takemura __vrc4173bcu_intr_disestablish(vrip_chipset_tag_t vc, vrip_intr_handle_t handle) 581 1.7 takemura { 582 1.7 takemura struct vrc4173bcu_intrhand *ih = handle; 583 1.7 takemura 584 1.7 takemura /* Mask Level 1 interrupt mask register (disable interrupt) */ 585 1.7 takemura vrip_intr_setmask1(vc, ih, 0); 586 1.7 takemura /* Mask level 2 interrupt mask register(if any). (disable interrupt) */ 587 1.7 takemura vrip_intr_setmask2(vc, ih, ~0, 0); 588 1.7 takemura ih->ih_fun = NULL; 589 1.7 takemura ih->ih_arg = NULL; 590 1.7 takemura } 591 1.7 takemura 592 1.7 takemura /* Set level 1 interrupt mask. */ 593 1.7 takemura void 594 1.7 takemura __vrc4173bcu_intr_setmask1(vrip_chipset_tag_t vc, vrip_intr_handle_t handle, 595 1.7 takemura int enable) 596 1.7 takemura { 597 1.7 takemura struct vrc4173bcu_softc *sc = vc->vc_sc; 598 1.7 takemura struct vrc4173bcu_intrhand *ih = handle; 599 1.7 takemura int level1 = ih - sc->sc_intrhands; 600 1.7 takemura 601 1.7 takemura DPRINTF(("__vrc4173bcu_intr_setmask1: SYSINT: %s %d\n", 602 1.7 takemura enable ? "enable" : "disable", level1)); 603 1.7 takemura if (enable) 604 1.7 takemura sc->sc_intrmask |= (1 << level1); 605 1.7 takemura else 606 1.7 takemura sc->sc_intrmask &= ~(1 << level1); 607 1.7 takemura bus_space_write_2 (sc->sc_iot, sc->sc_icuh, VRC4173ICU_MSYSINT1, 608 1.7 takemura sc->sc_intrmask); 609 1.7 takemura #ifdef VRC4173BCU_DEBUG 610 1.7 takemura if (vrc4173bcu_debug) 611 1.7 takemura dbg_bit_print(sc->sc_intrmask); 612 1.7 takemura #endif 613 1.7 takemura 614 1.7 takemura return; 615 1.7 takemura } 616 1.7 takemura 617 1.7 takemura /* Get level 2 interrupt status */ 618 1.7 takemura void 619 1.7 takemura __vrc4173bcu_intr_getstatus2(vrip_chipset_tag_t vc, vrip_intr_handle_t handle, 620 1.7 takemura u_int32_t *status /* Level 2 status */) 621 1.7 takemura { 622 1.7 takemura struct vrc4173bcu_softc *sc = vc->vc_sc; 623 1.7 takemura struct vrc4173bcu_intrhand *ih = handle; 624 1.7 takemura const struct vrc4173bcu_unit *vu = ih->ih_unit; 625 1.7 takemura u_int32_t reg; 626 1.7 takemura 627 1.7 takemura reg = bus_space_read_2(sc->sc_iot, sc->sc_icuh, vu->vu_lreg); 628 1.7 takemura reg |= (bus_space_read_2(sc->sc_iot, sc->sc_icuh, vu->vu_hreg) << 16); 629 1.7 takemura *status = reg; 630 1.7 takemura } 631 1.7 takemura 632 1.7 takemura /* Set level 2 interrupt mask. */ 633 1.7 takemura void 634 1.7 takemura __vrc4173bcu_intr_setmask2(vrip_chipset_tag_t vc, vrip_intr_handle_t handle, 635 1.7 takemura u_int32_t mask /* Level 2 mask */, int onoff) 636 1.7 takemura { 637 1.7 takemura struct vrc4173bcu_softc *sc = vc->vc_sc; 638 1.7 takemura struct vrc4173bcu_intrhand *ih = handle; 639 1.7 takemura const struct vrc4173bcu_unit *vu = ih->ih_unit; 640 1.7 takemura u_int16_t reg; 641 1.7 takemura 642 1.7 takemura DPRINTF(("vrc4173bcu_intr_setmask2:\n")); 643 1.7 takemura #ifdef VRC4173BCU_DEBUG 644 1.7 takemura if (vrc4173bcu_debug) 645 1.7 takemura vrc4173bcu_dump_level2mask(vc, handle); 646 1.7 takemura #endif 647 1.7 takemura if (vu->vu_mlreg) { 648 1.7 takemura reg = bus_space_read_2(sc->sc_iot, sc->sc_icuh, vu->vu_mlreg); 649 1.7 takemura if (onoff) 650 1.7 takemura reg |= (mask & 0xffff); 651 1.7 takemura else 652 1.7 takemura reg &= ~(mask & 0xffff); 653 1.7 takemura bus_space_write_2(sc->sc_iot, sc->sc_ioh, vu->vu_mlreg, reg); 654 1.7 takemura } 655 1.7 takemura if (vu->vu_mhreg) { 656 1.7 takemura reg = bus_space_read_2(sc->sc_iot, sc->sc_icuh, vu->vu_mhreg); 657 1.7 takemura if (onoff) 658 1.7 takemura reg |= ((mask >> 16) & 0xffff); 659 1.7 takemura else 660 1.7 takemura reg &= ~((mask >> 16) & 0xffff); 661 1.7 takemura bus_space_write_2(sc->sc_iot, sc->sc_icuh, vu->vu_mhreg, reg); 662 1.7 takemura } 663 1.7 takemura #ifdef VRC4173BCU_DEBUG 664 1.7 takemura if (vrc4173bcu_debug) 665 1.7 takemura vrc4173bcu_dump_level2mask(vc, handle); 666 1.7 takemura #endif 667 1.7 takemura 668 1.7 takemura return; 669 1.7 takemura } 670 1.7 takemura 671 1.7 takemura int 672 1.7 takemura __vrc4173bcu_clock(vrcmu_chipset_tag_t cc, u_int16_t mask, int onoff) 673 1.7 takemura { 674 1.7 takemura struct vrc4173bcu_softc *sc = cc->cc_sc; 675 1.7 takemura u_int16_t reg; 676 1.7 takemura 677 1.7 takemura reg = bus_space_read_2(sc->sc_iot, sc->sc_cmuh, VRC4173CMU_CLKMSK); 678 1.7 takemura #if 0 679 1.7 takemura printf("cmu register(enter):"); 680 1.7 takemura dbg_bit_print(reg); 681 1.7 takemura #endif 682 1.7 takemura if (onoff) 683 1.7 takemura reg |= mask; 684 1.7 takemura else 685 1.7 takemura reg &= ~mask; 686 1.7 takemura bus_space_write_2(sc->sc_iot, sc->sc_cmuh, VRC4173CMU_CLKMSK, reg); 687 1.7 takemura #if 0 688 1.7 takemura printf("cmu register(exit) :"); 689 1.7 takemura dbg_bit_print(reg); 690 1.7 takemura #endif 691 1.7 takemura return (0); 692 1.7 takemura } 693 1.7 takemura 694 1.7 takemura void 695 1.7 takemura __vrc4173bcu_register_cmu(vrip_chipset_tag_t vc, vrcmu_chipset_tag_t cmu) 696 1.7 takemura { 697 1.7 takemura vc->vc_cc = cmu; 698 1.7 takemura } 699 1.7 takemura 700 1.7 takemura void 701 1.7 takemura __vrc4173bcu_register_gpio(vrip_chipset_tag_t vc, hpcio_chip_t chip) 702 1.7 takemura { 703 1.7 takemura /* XXX, not implemented yet */ 704 1.7 takemura } 705 1.7 takemura 706 1.7 takemura void 707 1.7 takemura __vrc4173bcu_register_dmaau(vrip_chipset_tag_t vc, vrdmaau_chipset_tag_t dmaau) 708 1.7 takemura { 709 1.7 takemura 710 1.7 takemura vc->vc_ac = dmaau; 711 1.7 takemura } 712 1.7 takemura 713 1.7 takemura void 714 1.7 takemura __vrc4173bcu_register_dcu(vrip_chipset_tag_t vc, vrdcu_chipset_tag_t dcu) 715 1.7 takemura { 716 1.7 takemura 717 1.7 takemura vc->vc_dc = dcu; 718 1.1 enami } 719