1 /* $NetBSD: devopen.c,v 1.20 2018/03/21 18:27:27 ragge Exp $ */ 2 /* 3 * Copyright (c) 1997 Ludd, University of Lule}, Sweden. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 #include <lib/libsa/stand.h> 28 #include <lib/libkern/libkern.h> 29 30 #include <machine/param.h> 31 #include <machine/rpb.h> 32 #include <machine/sid.h> 33 #include <machine/pte.h> 34 #define VAX780 1 35 #include <machine/ka750.h> 36 37 #include <dev/bi/bireg.h> 38 39 #include "vaxstand.h" 40 41 int nexaddr, csrbase; 42 static int *mapaddr; 43 44 /* 45 * Boot device syntax: 46 * device(adapter, controller, unit, partition)file 47 */ 48 int 49 devopen(struct open_file *f, const char *fname, char **file) 50 { 51 int dev, unit, ctlr, part, adapt, i, a[4], x; 52 struct devsw *dp; 53 extern int cnvtab[]; 54 char *s, *c; 55 56 part = 0; 57 58 /* 59 * Adaptor and controller are normally zero (or uninteresting), 60 * but we need to do some conversion here anyway (if it's a 61 * manual boot, but that's checked by the device driver). 62 * Set them to -1 to tell if it's a set number or default. 63 */ 64 dev = bootrpb.devtyp; 65 unit = bootrpb.unit; 66 adapt = ctlr = -1; 67 68 if (dev == BDEV_KDB) 69 dev = BDEV_UDA; /* use the same driver */ 70 71 for (i = 0, dp = 0; i < ndevs; i++) 72 if (cnvtab[i] == dev) 73 dp = devsw + i; 74 75 x = 0; 76 if ((s = strchr((char *)fname, '('))) { 77 *s++ = 0; 78 79 for (i = 0, dp = devsw; i < ndevs; i++, dp++) 80 if (dp->dv_name && strcmp(dp->dv_name, fname) == 0) 81 break; 82 83 if (i == ndevs) { 84 printf("No such device - Configured devices are:\n"); 85 for (dp = devsw, i = 0; i < ndevs; i++, dp++) 86 if (dp->dv_name) 87 printf(" %s", dp->dv_name); 88 printf("\n"); 89 return -1; 90 } 91 dev = cnvtab[i]; 92 if ((c = strchr(s, ')')) == 0) 93 goto usage; 94 95 *c++ = 0; 96 97 if (*s) do { 98 a[x++] = atoi(s); 99 while (*s >= '0' && *s <= '9') 100 s++; 101 102 if (*s != ',' && *s != 0) 103 goto usage; 104 } while (*s++); 105 106 if (x) 107 part = a[x - 1]; 108 if (x > 1) 109 unit = a[x - 2]; 110 if (x > 2) 111 ctlr = a[x - 3]; 112 if (x > 3) 113 adapt = a[0]; 114 *file = c; 115 } else { 116 *file = (char *)fname; 117 c = (char *)fname; 118 } 119 120 if (!dp->dv_open) { 121 printf("Can't open device type %d\n", dev); 122 return(ENODEV); 123 } 124 f->f_dev = dp; 125 bootrpb.unit = unit; 126 bootrpb.devtyp = dev; 127 128 nexaddr = bootrpb.adpphy; 129 switch (vax_boardtype) { 130 case VAX_BTYP_750: 131 csrbase = (nexaddr == 0xf30000 ? 0xffe000 : 0xfbe000); 132 mapaddr = (int *)nexaddr + VAX_NBPG; 133 if (adapt < 0) 134 break; 135 nexaddr = (NEX750 + NEXSIZE * adapt); 136 csrbase = (adapt == 8 ? 0xffe000 : 0xfbe000); 137 break; 138 case VAX_BTYP_780: 139 case VAX_BTYP_790: 140 csrbase = 0x2007e000 + 0x40000 * ((nexaddr & 0x1e000) >> 13); 141 mapaddr = (int *)nexaddr + VAX_NBPG; 142 if (adapt < 0) 143 break; 144 nexaddr = ((int)NEX780 + NEXSIZE * adapt); 145 csrbase = 0x2007e000 + 0x40000 * adapt; 146 break; 147 case VAX_BTYP_9CC: /* 6000/200 */ 148 case VAX_BTYP_9RR: /* 6000/400 */ 149 case VAX_BTYP_1202: /* 6000/500 */ 150 csrbase = 0; 151 if (ctlr < 0) 152 ctlr = bootrpb.adpphy & 15; 153 if (adapt < 0) 154 adapt = (bootrpb.adpphy >> 4) & 15; 155 nexaddr = BI_BASE(adapt, ctlr); 156 break; 157 158 case VAX_BTYP_8000: 159 case VAX_BTYP_8800: 160 case VAX_BTYP_8PS: 161 csrbase = 0; /* _may_ be a KDB */ 162 nexaddr = bootrpb.csrphy; 163 if (ctlr < 0) 164 break; 165 if (adapt < 0) 166 nexaddr = (nexaddr & 0xff000000) + BI_NODE(ctlr); 167 else 168 nexaddr = BI_BASE(adapt, ctlr); 169 break; 170 case VAX_BTYP_610: 171 nexaddr = 0; /* No map regs */ 172 csrbase = 0x20000000; 173 break; 174 175 case VAX_BTYP_VXT: 176 nexaddr = 0; 177 csrbase = bootrpb.csrphy; 178 break; 179 default: 180 nexaddr = 0; /* No map regs */ 181 csrbase = 0x20000000; 182 if (bootrpb.adpphy == 0x20087800) { 183 nexaddr = bootrpb.adpphy; 184 mapaddr = (int *)nexaddr + VAX_NBPG; 185 } 186 break; 187 } 188 189 #ifdef DEV_DEBUG 190 printf("rpb.type %d rpb.unit %d rpb.csr %lx rpb.adp %lx\n", 191 bootrpb.devtyp, bootrpb.unit, bootrpb.csrphy, bootrpb.adpphy); 192 printf("adapter %d ctlr %d unit %d part %d\n", adapt, ctlr, unit, part); 193 printf("nexaddr %x csrbase %x\n", nexaddr, csrbase); 194 #endif 195 196 return (*dp->dv_open)(f, adapt, ctlr, unit, part); 197 198 usage: 199 printf("usage: dev(adapter,controller,unit,partition)file -asd\n"); 200 return -1; 201 } 202 203 /* 204 * Map in virtual address vaddr of size vsize starting with map mapno. 205 * Returns the unibus address of the mapped area. 206 */ 207 int 208 ubmap(int mapno, int vaddr, int size) 209 { 210 int voff = (vaddr & VAX_PGOFSET); 211 int rv = (mapno << VAX_PGSHIFT) + voff; 212 int vpag, npag; 213 214 if (mapaddr == 0) 215 return vaddr; /* no map, phys == virt */ 216 217 npag = (voff + size) / VAX_NBPG; 218 vpag = vaddr >> VAX_PGSHIFT; 219 while (npag-- >= 0) 220 mapaddr[mapno++] = vpag++ | PG_V; 221 return rv; 222 } 223