1 1.49 thorpej /* $NetBSD: kdb.c,v 1.49 2021/08/07 16:19:09 thorpej Exp $ */ 2 1.1 ragge /* 3 1.1 ragge * Copyright (c) 1996 Ludd, University of Lule}, Sweden. 4 1.1 ragge * All rights reserved. 5 1.1 ragge * 6 1.1 ragge * Redistribution and use in source and binary forms, with or without 7 1.1 ragge * modification, are permitted provided that the following conditions 8 1.1 ragge * are met: 9 1.1 ragge * 1. Redistributions of source code must retain the above copyright 10 1.1 ragge * notice, this list of conditions and the following disclaimer. 11 1.1 ragge * 2. Redistributions in binary form must reproduce the above copyright 12 1.1 ragge * notice, this list of conditions and the following disclaimer in the 13 1.1 ragge * documentation and/or other materials provided with the distribution. 14 1.1 ragge * 3. All advertising materials mentioning features or use of this software 15 1.1 ragge * must display the following acknowledgement: 16 1.37 perry * This product includes software developed at Ludd, University of 17 1.12 ragge * Lule}, Sweden and its contributors. 18 1.1 ragge * 4. The name of the author may not be used to endorse or promote products 19 1.1 ragge * derived from this software without specific prior written permission 20 1.1 ragge * 21 1.1 ragge * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 1.1 ragge * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 1.1 ragge * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 1.1 ragge * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 1.1 ragge * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 1.1 ragge * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 1.1 ragge * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 1.1 ragge * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 1.1 ragge * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 1.1 ragge * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 1.1 ragge */ 32 1.1 ragge 33 1.1 ragge /* 34 1.1 ragge * KDB50 disk device driver 35 1.1 ragge */ 36 1.1 ragge /* 37 1.1 ragge * TODO 38 1.1 ragge * Implement node reset routine. 39 1.1 ragge * Nices hardware error handling. 40 1.1 ragge */ 41 1.26 lukem 42 1.26 lukem #include <sys/cdefs.h> 43 1.49 thorpej __KERNEL_RCSID(0, "$NetBSD: kdb.c,v 1.49 2021/08/07 16:19:09 thorpej Exp $"); 44 1.1 ragge 45 1.1 ragge #include <sys/param.h> 46 1.1 ragge #include <sys/kernel.h> 47 1.1 ragge #include <sys/buf.h> 48 1.35 he #include <sys/bufq.h> 49 1.1 ragge #include <sys/device.h> 50 1.1 ragge #include <sys/proc.h> 51 1.1 ragge #include <sys/malloc.h> 52 1.12 ragge #include <sys/systm.h> 53 1.24 ragge #include <sys/sched.h> 54 1.1 ragge 55 1.23 mrg #include <uvm/uvm_extern.h> 56 1.1 ragge 57 1.17 ragge #ifdef __vax__ 58 1.1 ragge #include <machine/pte.h> 59 1.1 ragge #include <machine/pcb.h> 60 1.17 ragge #endif 61 1.41 ad #include <sys/bus.h> 62 1.1 ragge 63 1.17 ragge #include <dev/bi/bireg.h> 64 1.17 ragge #include <dev/bi/bivar.h> 65 1.17 ragge #include <dev/bi/kdbreg.h> 66 1.17 ragge 67 1.17 ragge #include <dev/mscp/mscp.h> 68 1.17 ragge #include <dev/mscp/mscpreg.h> 69 1.17 ragge #include <dev/mscp/mscpvar.h> 70 1.1 ragge 71 1.7 jtk #include "locators.h" 72 1.7 jtk 73 1.17 ragge #define KDB_WL(adr, val) bus_space_write_4(sc->sc_iot, sc->sc_ioh, adr, val) 74 1.17 ragge #define KDB_RL(adr) bus_space_read_4(sc->sc_iot, sc->sc_ioh, adr) 75 1.17 ragge #define KDB_RS(adr) bus_space_read_2(sc->sc_iot, sc->sc_ioh, adr) 76 1.17 ragge 77 1.12 ragge #define b_forw b_hash.le_next 78 1.1 ragge /* 79 1.1 ragge * Software status, per controller. 80 1.1 ragge */ 81 1.1 ragge struct kdb_softc { 82 1.42 matt device_t sc_dev; /* Autoconfig info */ 83 1.42 matt struct evcnt sc_intrcnt; /* Interrupt counting */ 84 1.42 matt void *sc_kdb; /* Struct for kdb communication */ 85 1.42 matt struct mscp_softc *sc_softc; /* MSCP info (per mscpvar.h) */ 86 1.17 ragge bus_dma_tag_t sc_dmat; 87 1.17 ragge bus_dmamap_t sc_cmap; /* Control structures */ 88 1.17 ragge bus_space_tag_t sc_iot; 89 1.17 ragge bus_space_handle_t sc_ioh; 90 1.1 ragge }; 91 1.1 ragge 92 1.42 matt int kdbmatch(device_t, cfdata_t, void *); 93 1.42 matt void kdbattach(device_t, device_t, void *); 94 1.36 perry void kdbreset(int); 95 1.36 perry void kdbintr(void *); 96 1.45 cegger void kdbctlrdone(device_t); 97 1.36 perry int kdbprint(void *, const char *); 98 1.42 matt void kdbsaerror(device_t, int); 99 1.42 matt void kdbgo(device_t, struct mscp_xi *); 100 1.1 ragge 101 1.44 joerg CFATTACH_DECL_NEW(kdb, sizeof(struct kdb_softc), 102 1.29 thorpej kdbmatch, kdbattach, NULL, NULL); 103 1.9 thorpej 104 1.1 ragge /* 105 1.1 ragge * More driver definitions, for generic MSCP code. 106 1.1 ragge */ 107 1.1 ragge struct mscp_ctlr kdb_mscp_ctlr = { 108 1.1 ragge kdbctlrdone, 109 1.1 ragge kdbgo, 110 1.1 ragge kdbsaerror, 111 1.1 ragge }; 112 1.1 ragge 113 1.1 ragge int 114 1.42 matt kdbprint(void *aux, const char *name) 115 1.1 ragge { 116 1.1 ragge if (name) 117 1.30 thorpej aprint_normal("%s: mscpbus", name); 118 1.1 ragge return UNCONF; 119 1.1 ragge } 120 1.1 ragge 121 1.1 ragge /* 122 1.1 ragge * Poke at a supposed KDB to see if it is there. 123 1.1 ragge */ 124 1.1 ragge int 125 1.44 joerg kdbmatch(device_t parent, cfdata_t cf, void *aux) 126 1.1 ragge { 127 1.1 ragge struct bi_attach_args *ba = aux; 128 1.1 ragge 129 1.17 ragge if (bus_space_read_2(ba->ba_iot, ba->ba_ioh, BIREG_DTYPE) != BIDT_KDB50) 130 1.12 ragge return 0; 131 1.1 ragge 132 1.12 ragge if (cf->cf_loc[BICF_NODE] != BICF_NODE_DEFAULT && 133 1.7 jtk cf->cf_loc[BICF_NODE] != ba->ba_nodenr) 134 1.12 ragge return 0; 135 1.1 ragge 136 1.12 ragge return 1; 137 1.1 ragge } 138 1.1 ragge 139 1.1 ragge void 140 1.42 matt kdbattach(device_t parent, device_t self, void *aux) 141 1.1 ragge { 142 1.42 matt struct kdb_softc *sc = device_private(self); 143 1.42 matt struct bi_attach_args *ba = aux; 144 1.42 matt struct mscp_attach_args ma; 145 1.1 ragge volatile int i = 10000; 146 1.17 ragge int error, rseg; 147 1.17 ragge bus_dma_segment_t seg; 148 1.1 ragge 149 1.44 joerg sc->sc_dev = self; 150 1.44 joerg 151 1.4 christos printf("\n"); 152 1.20 matt bi_intr_establish(ba->ba_icookie, ba->ba_ivec, 153 1.20 matt kdbintr, sc, &sc->sc_intrcnt); 154 1.21 matt evcnt_attach_dynamic(&sc->sc_intrcnt, EVCNT_TYPE_INTR, NULL, 155 1.42 matt device_xname(sc->sc_dev), "intr"); 156 1.1 ragge 157 1.17 ragge sc->sc_iot = ba->ba_iot; 158 1.17 ragge sc->sc_ioh = ba->ba_ioh; 159 1.17 ragge sc->sc_dmat = ba->ba_dmat; 160 1.17 ragge 161 1.17 ragge /* 162 1.17 ragge * Map the communication area and command and 163 1.17 ragge * response packets into Unibus space. 164 1.17 ragge */ 165 1.17 ragge if ((error = bus_dmamem_alloc(sc->sc_dmat, sizeof(struct mscp_pack), 166 1.32 thorpej PAGE_SIZE, 0, &seg, 1, &rseg, BUS_DMA_NOWAIT)) != 0) { 167 1.17 ragge printf("Alloc ctrl area %d\n", error); 168 1.17 ragge return; 169 1.17 ragge } 170 1.17 ragge if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg, 171 1.17 ragge sizeof(struct mscp_pack), &sc->sc_kdb, 172 1.17 ragge BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) != 0) { 173 1.17 ragge printf("Map ctrl area %d\n", error); 174 1.17 ragge err: bus_dmamem_free(sc->sc_dmat, &seg, rseg); 175 1.17 ragge return; 176 1.17 ragge } 177 1.17 ragge if ((error = bus_dmamap_create(sc->sc_dmat, sizeof(struct mscp_pack), 178 1.17 ragge 1, sizeof(struct mscp_pack), 0, BUS_DMA_NOWAIT, &sc->sc_cmap))) { 179 1.17 ragge printf("Create DMA map %d\n", error); 180 1.17 ragge err2: bus_dmamem_unmap(sc->sc_dmat, sc->sc_kdb, 181 1.17 ragge sizeof(struct mscp_pack)); 182 1.17 ragge goto err; 183 1.17 ragge } 184 1.37 perry if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_cmap, 185 1.17 ragge sc->sc_kdb, sizeof(struct mscp_pack), 0, BUS_DMA_NOWAIT))) { 186 1.17 ragge printf("Load ctrl map %d\n", error); 187 1.17 ragge bus_dmamap_destroy(sc->sc_dmat, sc->sc_cmap); 188 1.17 ragge goto err2; 189 1.17 ragge } 190 1.25 thorpej memset(sc->sc_kdb, 0, sizeof(struct mscp_pack)); 191 1.1 ragge 192 1.1 ragge ma.ma_mc = &kdb_mscp_ctlr; 193 1.1 ragge ma.ma_type = MSCPBUS_DISK|MSCPBUS_KDB; 194 1.17 ragge ma.ma_uda = (struct mscp_pack *)sc->sc_kdb; 195 1.1 ragge ma.ma_softc = &sc->sc_softc; 196 1.17 ragge ma.ma_iot = sc->sc_iot; 197 1.17 ragge ma.ma_iph = sc->sc_ioh + KDB_IP; 198 1.17 ragge ma.ma_sah = sc->sc_ioh + KDB_SA; 199 1.17 ragge ma.ma_swh = sc->sc_ioh + KDB_SW; 200 1.17 ragge ma.ma_dmat = sc->sc_dmat; 201 1.17 ragge ma.ma_dmam = sc->sc_cmap; 202 1.17 ragge ma.ma_ivec = ba->ba_ivec; 203 1.1 ragge ma.ma_ctlrnr = ba->ba_nodenr; 204 1.17 ragge ma.ma_adapnr = ba->ba_busnr; 205 1.17 ragge 206 1.17 ragge KDB_WL(BIREG_VAXBICSR, KDB_RL(BIREG_VAXBICSR) | BICSR_NRST); 207 1.1 ragge while (i--) /* Need delay??? */ 208 1.1 ragge ; 209 1.17 ragge KDB_WL(BIREG_INTRDES, ba->ba_intcpu); /* Interrupt on CPU # */ 210 1.17 ragge KDB_WL(BIREG_BCICSR, KDB_RL(BIREG_BCICSR) | 211 1.17 ragge BCI_STOPEN | BCI_IDENTEN | BCI_UINTEN | BCI_INTEN); 212 1.17 ragge KDB_WL(BIREG_UINTRCSR, ba->ba_ivec); 213 1.49 thorpej config_found(sc->sc_dev, &ma, kdbprint, CFARGS_NONE); 214 1.1 ragge } 215 1.1 ragge 216 1.17 ragge void 217 1.42 matt kdbgo(device_t usc, struct mscp_xi *mxi) 218 1.1 ragge { 219 1.42 matt struct kdb_softc *sc = device_private(usc); 220 1.17 ragge struct buf *bp = mxi->mxi_bp; 221 1.17 ragge struct mscp *mp = mxi->mxi_mp; 222 1.18 thorpej u_int32_t addr = (u_int32_t)bp->b_data; 223 1.17 ragge u_int32_t mapaddr; 224 1.17 ragge int err; 225 1.1 ragge 226 1.12 ragge /* 227 1.17 ragge * The KDB50 wants to read VAX Page tables directly, therefore 228 1.17 ragge * the result from bus_dmamap_load() is uninteresting. (But it 229 1.17 ragge * should never fail!). 230 1.17 ragge * 231 1.17 ragge * On VAX, point to the corresponding page tables. (user/sys) 232 1.37 perry * On other systems, do something else... 233 1.17 ragge */ 234 1.18 thorpej err = bus_dmamap_load(sc->sc_dmat, mxi->mxi_dmam, bp->b_data, 235 1.24 ragge bp->b_bcount, (bp->b_flags & B_PHYS ? bp->b_proc : 0), 236 1.24 ragge BUS_DMA_NOWAIT); 237 1.17 ragge 238 1.17 ragge if (err) /* Shouldn't happen */ 239 1.17 ragge panic("kdbgo: bus_dmamap_load: error %d", err); 240 1.17 ragge 241 1.17 ragge #ifdef __vax__ 242 1.17 ragge /* 243 1.12 ragge * Get a pointer to the pte pointing out the first virtual address. 244 1.12 ragge * Use different ways in kernel and user space. 245 1.12 ragge */ 246 1.12 ragge if ((bp->b_flags & B_PHYS) == 0) { 247 1.17 ragge mapaddr = ((u_int32_t)kvtopte(addr)) & ~KERNBASE; 248 1.12 ragge } else { 249 1.17 ragge 250 1.33 christos /* XXX: This code does not belong here! */ 251 1.33 christos #define UVTOPTE(addr, pmap) (((addr) < 0x40000000) ? \ 252 1.34 he &(*pmap)->pm_p0br[PG_PFNUM(addr)] : &(*pmap)->pm_p1br[PG_PFNUM(addr)]) 253 1.33 christos 254 1.33 christos pmap_t *pmap = &bp->b_proc->p_vmspace->vm_map.pmap; 255 1.34 he u_int32_t eaddr = addr + (bp->b_bcount - 1); 256 1.33 christos u_int32_t emapaddr = (u_int32_t)UVTOPTE(eaddr, pmap); 257 1.31 thorpej 258 1.33 christos mapaddr = (u_int32_t)UVTOPTE(addr, pmap); 259 1.33 christos if (trunc_page(mapaddr) != trunc_page(emapaddr)) { 260 1.17 ragge mp->mscp_seq.seq_bytecount = 261 1.17 ragge (((round_page(mapaddr) - mapaddr)/4) * 512); 262 1.17 ragge } 263 1.17 ragge mapaddr = kvtophys(mapaddr); 264 1.12 ragge } 265 1.17 ragge #else 266 1.17 ragge #error Must write code to handle KDB50 on non-vax. 267 1.17 ragge #endif 268 1.12 ragge 269 1.17 ragge mp->mscp_seq.seq_mapbase = mapaddr; 270 1.17 ragge mxi->mxi_dmam->dm_segs[0].ds_addr = (addr & 511) | KDB_MAP; 271 1.17 ragge mscp_dgo(sc->sc_softc, mxi); 272 1.1 ragge } 273 1.1 ragge 274 1.1 ragge void 275 1.42 matt kdbsaerror(device_t usc, int doreset) 276 1.1 ragge { 277 1.42 matt struct kdb_softc *sc = device_private(usc); 278 1.1 ragge 279 1.17 ragge if ((KDB_RS(KDB_SA) & MP_ERR) == 0) 280 1.1 ragge return; 281 1.42 matt printf("%s: controller error, sa=0x%x\n", device_xname(sc->sc_dev), 282 1.17 ragge KDB_RS(KDB_SA)); 283 1.1 ragge /* What to do now??? */ 284 1.1 ragge } 285 1.1 ragge 286 1.1 ragge /* 287 1.1 ragge * Interrupt routine. Depending on the state of the controller, 288 1.1 ragge * continue initialisation, or acknowledge command and response 289 1.1 ragge * interrupts, and process responses. 290 1.1 ragge */ 291 1.1 ragge void 292 1.17 ragge kdbintr(void *arg) 293 1.1 ragge { 294 1.17 ragge struct kdb_softc *sc = arg; 295 1.1 ragge 296 1.17 ragge if (KDB_RS(KDB_SA) & MP_ERR) { /* ctlr fatal error */ 297 1.42 matt kdbsaerror(sc->sc_dev, 1); 298 1.1 ragge return; 299 1.1 ragge } 300 1.39 ad KERNEL_LOCK(1, NULL); 301 1.1 ragge mscp_intr(sc->sc_softc); 302 1.39 ad KERNEL_UNLOCK_ONE(NULL); 303 1.1 ragge } 304 1.1 ragge 305 1.1 ragge void 306 1.44 joerg kdbctlrdone(device_t usc) 307 1.1 ragge { 308 1.1 ragge } 309