1*b3223730Skettenis /* $OpenBSD: uturn.c,v 1.5 2007/12/28 19:49:43 kettenis Exp $ */ 2f7c6bcdeSmickey 3f7c6bcdeSmickey /* 4f7c6bcdeSmickey * Copyright (c) 2004 Michael Shalayeff 5f7c6bcdeSmickey * All rights reserved. 6f7c6bcdeSmickey * 7f7c6bcdeSmickey * Redistribution and use in source and binary forms, with or without 8f7c6bcdeSmickey * modification, are permitted provided that the following conditions 9f7c6bcdeSmickey * are met: 10f7c6bcdeSmickey * 1. Redistributions of source code must retain the above copyright 11f7c6bcdeSmickey * notice, this list of conditions and the following disclaimer. 12f7c6bcdeSmickey * 2. Redistributions in binary form must reproduce the above copyright 13f7c6bcdeSmickey * notice, this list of conditions and the following disclaimer in the 14f7c6bcdeSmickey * documentation and/or other materials provided with the distribution. 15f7c6bcdeSmickey * 16f7c6bcdeSmickey * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17f7c6bcdeSmickey * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18f7c6bcdeSmickey * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19f7c6bcdeSmickey * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT, 20f7c6bcdeSmickey * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21f7c6bcdeSmickey * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22f7c6bcdeSmickey * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23f7c6bcdeSmickey * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 24f7c6bcdeSmickey * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 25f7c6bcdeSmickey * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 26f7c6bcdeSmickey * THE POSSIBILITY OF SUCH DAMAGE. 27f7c6bcdeSmickey */ 28f7c6bcdeSmickey 29f7c6bcdeSmickey /* TODO IOA programming */ 30f7c6bcdeSmickey 31f7c6bcdeSmickey #include <sys/param.h> 32f7c6bcdeSmickey #include <sys/systm.h> 33f7c6bcdeSmickey #include <sys/device.h> 34f7c6bcdeSmickey #include <sys/reboot.h> 35f7c6bcdeSmickey 36f7c6bcdeSmickey #include <machine/iomod.h> 37f7c6bcdeSmickey #include <machine/autoconf.h> 38f7c6bcdeSmickey 39f7c6bcdeSmickey #include <hppa/dev/cpudevs.h> 40f7c6bcdeSmickey 41f7c6bcdeSmickey struct uturn_regs { 42f7c6bcdeSmickey u_int64_t resv0[2]; 43f7c6bcdeSmickey u_int64_t status; /* 0x10: */ 44f7c6bcdeSmickey u_int64_t resv1[5]; 45f7c6bcdeSmickey u_int64_t debug; /* 0x40: */ 46f7c6bcdeSmickey }; 47f7c6bcdeSmickey 48f7c6bcdeSmickey struct uturn_softc { 49f7c6bcdeSmickey struct device sc_dv; 50f7c6bcdeSmickey 51f7c6bcdeSmickey struct uturn_regs volatile *sc_regs; 52f7c6bcdeSmickey }; 53f7c6bcdeSmickey 54f7c6bcdeSmickey int uturnmatch(struct device *, void *, void *); 55f7c6bcdeSmickey void uturnattach(struct device *, struct device *, void *); 56f7c6bcdeSmickey 57f7c6bcdeSmickey struct cfattach uturn_ca = { 58f7c6bcdeSmickey sizeof(struct uturn_softc), uturnmatch, uturnattach 59f7c6bcdeSmickey }; 60f7c6bcdeSmickey 61f7c6bcdeSmickey struct cfdriver uturn_cd = { 62f7c6bcdeSmickey NULL, "uturn", DV_DULL 63f7c6bcdeSmickey }; 64f7c6bcdeSmickey 65f7c6bcdeSmickey int 66f7c6bcdeSmickey uturnmatch(parent, cfdata, aux) 67f7c6bcdeSmickey struct device *parent; 68f7c6bcdeSmickey void *cfdata; 69f7c6bcdeSmickey void *aux; 70f7c6bcdeSmickey { 71f7c6bcdeSmickey struct confargs *ca = aux; 72f7c6bcdeSmickey /* struct cfdata *cf = cfdata; */ 73f7c6bcdeSmickey 74f7c6bcdeSmickey /* there will be only one */ 75f7c6bcdeSmickey if (ca->ca_type.iodc_type != HPPA_TYPE_IOA || 76f7c6bcdeSmickey ca->ca_type.iodc_sv_model != HPPA_IOA_UTURN) 77f7c6bcdeSmickey return 0; 78f7c6bcdeSmickey 7911c6146eSmickey if (ca->ca_type.iodc_model == 0x58 && 8011c6146eSmickey ca->ca_type.iodc_revision >= 0x20) 8111c6146eSmickey return 0; 8211c6146eSmickey 83f7c6bcdeSmickey return 1; 84f7c6bcdeSmickey } 85f7c6bcdeSmickey 86f7c6bcdeSmickey void 87f7c6bcdeSmickey uturnattach(parent, self, aux) 88f7c6bcdeSmickey struct device *parent; 89f7c6bcdeSmickey struct device *self; 90f7c6bcdeSmickey void *aux; 91f7c6bcdeSmickey { 92f7c6bcdeSmickey struct confargs *ca = aux, nca; 93f7c6bcdeSmickey struct uturn_softc *sc = (struct uturn_softc *)self; 94f7c6bcdeSmickey bus_space_handle_t ioh; 9539ee68e0Skettenis hppa_hpa_t hpa; 96f7c6bcdeSmickey 97f7c6bcdeSmickey if (bus_space_map(ca->ca_iot, ca->ca_hpa, IOMOD_HPASIZE, 0, &ioh)) { 98f7c6bcdeSmickey printf(": can't map IO space\n"); 99f7c6bcdeSmickey return; 100f7c6bcdeSmickey } 101f7c6bcdeSmickey sc->sc_regs = (struct uturn_regs *)ca->ca_hpa; 102f7c6bcdeSmickey 103f7c6bcdeSmickey printf(": %s rev %d\n", 104f7c6bcdeSmickey ca->ca_type.iodc_revision < 0x10? "U2" : "UTurn", 105f7c6bcdeSmickey ca->ca_type.iodc_revision & 0xf); 106f7c6bcdeSmickey 107f7c6bcdeSmickey /* keep it real */ 108f7c6bcdeSmickey ((struct iomod *)ioh)->io_control = 0x80; 109f7c6bcdeSmickey 110f7c6bcdeSmickey nca = *ca; /* clone from us */ 1116d6f4087Smickey nca.ca_hpamask = HPPA_IOBEGIN; 112f7c6bcdeSmickey pdc_scanbus(self, &nca, MAXMODBUS, 0); 11339ee68e0Skettenis 11439ee68e0Skettenis /* XXX On some machines, PDC doesn't tell us about all devices. */ 11539ee68e0Skettenis switch (cpu_hvers) { 11639ee68e0Skettenis case HPPA_BOARD_HP809: 11739ee68e0Skettenis case HPPA_BOARD_HP819: 118*b3223730Skettenis case HPPA_BOARD_HP829: 11939ee68e0Skettenis case HPPA_BOARD_HP839: 120*b3223730Skettenis case HPPA_BOARD_HP849: 12139ee68e0Skettenis case HPPA_BOARD_HP859: 122*b3223730Skettenis case HPPA_BOARD_HP869: 12339ee68e0Skettenis hpa = ((struct iomod *)ioh)->io_io_low << 16; 12439ee68e0Skettenis pdc_scanbus(self, &nca, MAXMODBUS, hpa); 12539ee68e0Skettenis break; 12639ee68e0Skettenis default: 12739ee68e0Skettenis break; 12839ee68e0Skettenis } 129f7c6bcdeSmickey } 130