1 1.6 thorpej /* $NetBSD: p5bus.c,v 1.6 2021/08/07 16:18:41 thorpej Exp $ */ 2 1.1 rkujawa 3 1.1 rkujawa /*- 4 1.1 rkujawa * Copyright (c) 2011, 2012 The NetBSD Foundation, Inc. 5 1.1 rkujawa * All rights reserved. 6 1.1 rkujawa * 7 1.1 rkujawa * This code is derived from software contributed to The NetBSD Foundation 8 1.1 rkujawa * by Radoslaw Kujawa. 9 1.1 rkujawa * 10 1.1 rkujawa * Redistribution and use in source and binary forms, with or without 11 1.1 rkujawa * modification, are permitted provided that the following conditions 12 1.1 rkujawa * are met: 13 1.1 rkujawa * 1. Redistributions of source code must retain the above copyright 14 1.1 rkujawa * notice, this list of conditions and the following disclaimer. 15 1.1 rkujawa * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 rkujawa * notice, this list of conditions and the following disclaimer in the 17 1.1 rkujawa * documentation and/or other materials provided with the distribution. 18 1.1 rkujawa * 19 1.1 rkujawa * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 rkujawa * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 rkujawa * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 rkujawa * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 rkujawa * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 rkujawa * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 rkujawa * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 rkujawa * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 rkujawa * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 rkujawa * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 rkujawa * POSSIBILITY OF SUCH DAMAGE. 30 1.1 rkujawa */ 31 1.1 rkujawa 32 1.1 rkujawa /* Driver for internal BlizzardPPC, CyberStorm Mk-III/PPC bus. */ 33 1.1 rkujawa 34 1.1 rkujawa #include <sys/cdefs.h> 35 1.1 rkujawa 36 1.1 rkujawa #include <sys/systm.h> 37 1.1 rkujawa #include <sys/types.h> 38 1.1 rkujawa #include <sys/device.h> 39 1.1 rkujawa #include <sys/kmem.h> 40 1.1 rkujawa 41 1.1 rkujawa #include <amiga/dev/zbusvar.h> 42 1.1 rkujawa #include <amiga/dev/p5busvar.h> 43 1.1 rkujawa 44 1.1 rkujawa #define ZORRO_MANID_P5 8512 45 1.1 rkujawa #define ZORRO_PRODID_CSPPC 100 46 1.1 rkujawa #define ZORRO_PRODID_BPPC 110 47 1.1 rkujawa 48 1.1 rkujawa #define P5_ROM_OFF 0xF00010 49 1.1 rkujawa #define P5_SN_LEN 7 50 1.1 rkujawa 51 1.4 chs static int p5bus_match(device_t, cfdata_t, void *); 52 1.4 chs static void p5bus_attach(device_t, device_t, void *); 53 1.1 rkujawa static char* p5bus_cardsn(void); 54 1.1 rkujawa static int p5bus_print(void *aux, const char *str); 55 1.1 rkujawa static void p5bus_callback(device_t self); 56 1.1 rkujawa 57 1.1 rkujawa struct p5bus_softc { 58 1.1 rkujawa device_t sc_dev; 59 1.1 rkujawa uint8_t sc_cardtype; 60 1.1 rkujawa uint8_t sc_has_scsi; 61 1.1 rkujawa #define P5BUS_SCSI_NONE 0 62 1.1 rkujawa #define P5BUS_SCSI_710 1 /* NCR 53C710 */ 63 1.1 rkujawa #define P5BUS_SCSI_770 2 /* NCR 53C770 */ 64 1.1 rkujawa uint8_t sc_has_ppc; 65 1.1 rkujawa #define P5BUS_PPC_NONE 0 /* CS Mk-III only */ 66 1.1 rkujawa #define P5BUS_PPC_OK 1 /* has working PPC CPU */ 67 1.1 rkujawa }; 68 1.1 rkujawa 69 1.1 rkujawa CFATTACH_DECL_NEW(p5bus, sizeof(struct p5bus_softc), 70 1.1 rkujawa p5bus_match, p5bus_attach, NULL, NULL); 71 1.1 rkujawa 72 1.1 rkujawa static int 73 1.4 chs p5bus_match(device_t parent, cfdata_t cf, void *aux) 74 1.1 rkujawa { 75 1.1 rkujawa struct zbus_args *zap; 76 1.1 rkujawa 77 1.4 chs zap = aux; 78 1.1 rkujawa 79 1.1 rkujawa if (zap->manid != ZORRO_MANID_P5) 80 1.1 rkujawa return 0; 81 1.1 rkujawa 82 1.1 rkujawa 83 1.1 rkujawa if ((zap->prodid != ZORRO_PRODID_BPPC) && 84 1.1 rkujawa (zap->prodid != ZORRO_PRODID_CSPPC)) 85 1.1 rkujawa return 0; 86 1.1 rkujawa 87 1.1 rkujawa return 1; 88 1.1 rkujawa } 89 1.1 rkujawa 90 1.1 rkujawa static void 91 1.1 rkujawa p5bus_attach(device_t parent, device_t self, void *aux) 92 1.1 rkujawa { 93 1.1 rkujawa struct p5bus_softc *sc; 94 1.1 rkujawa struct zbus_args *zap; 95 1.1 rkujawa struct p5bus_attach_args p5baa; 96 1.1 rkujawa char *sn; 97 1.1 rkujawa 98 1.1 rkujawa zap = aux; 99 1.1 rkujawa sc = device_private(self); 100 1.1 rkujawa sc->sc_dev = self; 101 1.1 rkujawa 102 1.1 rkujawa sn = p5bus_cardsn(); 103 1.1 rkujawa 104 1.1 rkujawa aprint_normal(": Phase5 PowerUP on-board bus\n"); 105 1.1 rkujawa 106 1.1 rkujawa /* "Detect" what devices are present and attach the right drivers. */ 107 1.1 rkujawa 108 1.1 rkujawa if (zap->prodid == ZORRO_PRODID_CSPPC) { 109 1.1 rkujawa 110 1.1 rkujawa if (sn[0] == 'F') { 111 1.1 rkujawa aprint_normal_dev(sc->sc_dev, 112 1.1 rkujawa "CyberStorm Mk-III (sn %s)\n", sn); 113 1.1 rkujawa sc->sc_has_ppc = P5BUS_PPC_NONE; 114 1.1 rkujawa } else { 115 1.1 rkujawa aprint_normal_dev(sc->sc_dev, 116 1.1 rkujawa "CyberStorm PPC 604e (sn %s)\n", sn); 117 1.1 rkujawa sc->sc_has_ppc = P5BUS_PPC_OK; 118 1.1 rkujawa } 119 1.1 rkujawa 120 1.1 rkujawa sc->sc_cardtype = P5_CARDTYPE_CS; 121 1.1 rkujawa sc->sc_has_scsi = P5BUS_SCSI_770; 122 1.1 rkujawa 123 1.1 rkujawa } else if (zap->prodid == ZORRO_PRODID_BPPC) { 124 1.1 rkujawa 125 1.2 rkujawa if (sn[0] != 'I') { /* only "+" model has SCSI */ 126 1.1 rkujawa aprint_normal_dev(sc->sc_dev, 127 1.1 rkujawa "BlizzardPPC 603e (sn %s)\n", sn); 128 1.1 rkujawa sc->sc_has_scsi = P5BUS_SCSI_NONE; 129 1.1 rkujawa } else { 130 1.1 rkujawa aprint_normal_dev(sc->sc_dev, 131 1.1 rkujawa "BlizzardPPC 603e+ (sn %s)\n", sn); 132 1.1 rkujawa sc->sc_has_scsi = P5BUS_SCSI_710; 133 1.1 rkujawa } 134 1.1 rkujawa 135 1.1 rkujawa sc->sc_cardtype = P5_CARDTYPE_BPPC; 136 1.1 rkujawa sc->sc_has_ppc = P5BUS_PPC_OK; 137 1.1 rkujawa 138 1.1 rkujawa } 139 1.1 rkujawa 140 1.1 rkujawa p5baa.p5baa_cardtype = sc->sc_cardtype; 141 1.1 rkujawa 142 1.1 rkujawa /* Attach the SCSI host adapters. */ 143 1.1 rkujawa switch (sc->sc_has_scsi) { 144 1.1 rkujawa case P5BUS_SCSI_710: 145 1.1 rkujawa strcpy(p5baa.p5baa_name, "bppcsc"); 146 1.6 thorpej config_found(sc->sc_dev, &p5baa, p5bus_print, CFARGS_NONE); 147 1.1 rkujawa break; 148 1.1 rkujawa case P5BUS_SCSI_770: 149 1.1 rkujawa strcpy(p5baa.p5baa_name, "cbiiisc"); 150 1.6 thorpej config_found(sc->sc_dev, &p5baa, p5bus_print, CFARGS_NONE); 151 1.1 rkujawa break; 152 1.1 rkujawa default: 153 1.1 rkujawa break; 154 1.1 rkujawa } 155 1.1 rkujawa 156 1.1 rkujawa /* 157 1.1 rkujawa * We need to wait for possible p5membar attachments. Defer the rest 158 1.1 rkujawa * until parent (zbus) is completely configured. 159 1.1 rkujawa */ 160 1.1 rkujawa config_defer(self, p5bus_callback); 161 1.1 rkujawa 162 1.1 rkujawa } 163 1.1 rkujawa 164 1.1 rkujawa /* Continue the attachment. */ 165 1.1 rkujawa static void 166 1.1 rkujawa p5bus_callback(device_t self) { 167 1.1 rkujawa 168 1.1 rkujawa struct p5bus_attach_args p5baa; 169 1.1 rkujawa struct p5bus_softc *sc; 170 1.1 rkujawa 171 1.1 rkujawa sc = device_private(self); 172 1.1 rkujawa p5baa.p5baa_cardtype = sc->sc_cardtype; 173 1.1 rkujawa 174 1.2 rkujawa /* p5pb is always found, probe is inside of p5pb driver */ 175 1.2 rkujawa strcpy(p5baa.p5baa_name, "p5pb"); 176 1.6 thorpej config_found(sc->sc_dev, &p5baa, p5bus_print, CFARGS_NONE); 177 1.1 rkujawa } 178 1.1 rkujawa 179 1.1 rkujawa /* Get serial number of the card. */ 180 1.1 rkujawa static char * 181 1.3 matt p5bus_cardsn(void) 182 1.1 rkujawa { 183 1.1 rkujawa char *snr, *sn; 184 1.1 rkujawa 185 1.1 rkujawa sn = kmem_zalloc(P5_SN_LEN + 1, KM_SLEEP); 186 1.1 rkujawa snr = (char *)__UNVOLATILE(ztwomap(P5_ROM_OFF)); 187 1.1 rkujawa 188 1.1 rkujawa memcpy(sn, snr, P5_SN_LEN); 189 1.1 rkujawa return sn; 190 1.1 rkujawa } 191 1.1 rkujawa 192 1.1 rkujawa static int 193 1.1 rkujawa p5bus_print(void *aux, const char *str) 194 1.1 rkujawa { 195 1.1 rkujawa if (str == NULL) 196 1.1 rkujawa return 0; 197 1.1 rkujawa 198 1.1 rkujawa printf("%s ", str); 199 1.1 rkujawa 200 1.1 rkujawa return 0; 201 1.1 rkujawa } 202