1 1.17 rin /* $NetBSD: init_main.c,v 1.17 2024/09/24 11:17:54 rin Exp $ */ 2 1.1 tsutsui 3 1.1 tsutsui /* 4 1.1 tsutsui * Copyright (c) 1992 OMRON Corporation. 5 1.1 tsutsui * 6 1.1 tsutsui * This code is derived from software contributed to Berkeley by 7 1.1 tsutsui * OMRON Corporation. 8 1.1 tsutsui * 9 1.1 tsutsui * Redistribution and use in source and binary forms, with or without 10 1.1 tsutsui * modification, are permitted provided that the following conditions 11 1.1 tsutsui * are met: 12 1.1 tsutsui * 1. Redistributions of source code must retain the above copyright 13 1.1 tsutsui * notice, this list of conditions and the following disclaimer. 14 1.1 tsutsui * 2. Redistributions in binary form must reproduce the above copyright 15 1.1 tsutsui * notice, this list of conditions and the following disclaimer in the 16 1.1 tsutsui * documentation and/or other materials provided with the distribution. 17 1.1 tsutsui * 3. All advertising materials mentioning features or use of this software 18 1.1 tsutsui * must display the following acknowledgement: 19 1.1 tsutsui * This product includes software developed by the University of 20 1.1 tsutsui * California, Berkeley and its contributors. 21 1.1 tsutsui * 4. Neither the name of the University nor the names of its contributors 22 1.1 tsutsui * may be used to endorse or promote products derived from this software 23 1.1 tsutsui * without specific prior written permission. 24 1.1 tsutsui * 25 1.1 tsutsui * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26 1.1 tsutsui * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27 1.1 tsutsui * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28 1.1 tsutsui * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29 1.1 tsutsui * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30 1.1 tsutsui * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 1.1 tsutsui * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 1.1 tsutsui * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 1.1 tsutsui * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 1.1 tsutsui * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 1.1 tsutsui * SUCH DAMAGE. 36 1.1 tsutsui * 37 1.1 tsutsui * @(#)init_main.c 8.2 (Berkeley) 8/15/93 38 1.1 tsutsui */ 39 1.1 tsutsui /* 40 1.1 tsutsui * Copyright (c) 1992, 1993 41 1.1 tsutsui * The Regents of the University of California. All rights reserved. 42 1.1 tsutsui * 43 1.1 tsutsui * This code is derived from software contributed to Berkeley by 44 1.1 tsutsui * OMRON Corporation. 45 1.1 tsutsui * 46 1.1 tsutsui * Redistribution and use in source and binary forms, with or without 47 1.1 tsutsui * modification, are permitted provided that the following conditions 48 1.1 tsutsui * are met: 49 1.1 tsutsui * 1. Redistributions of source code must retain the above copyright 50 1.1 tsutsui * notice, this list of conditions and the following disclaimer. 51 1.1 tsutsui * 2. Redistributions in binary form must reproduce the above copyright 52 1.1 tsutsui * notice, this list of conditions and the following disclaimer in the 53 1.1 tsutsui * documentation and/or other materials provided with the distribution. 54 1.1 tsutsui * 3. Neither the name of the University nor the names of its contributors 55 1.1 tsutsui * may be used to endorse or promote products derived from this software 56 1.1 tsutsui * without specific prior written permission. 57 1.1 tsutsui * 58 1.1 tsutsui * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 59 1.1 tsutsui * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 60 1.1 tsutsui * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 61 1.1 tsutsui * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 62 1.1 tsutsui * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 63 1.1 tsutsui * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 64 1.1 tsutsui * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 65 1.1 tsutsui * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 66 1.1 tsutsui * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 67 1.1 tsutsui * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 68 1.1 tsutsui * SUCH DAMAGE. 69 1.1 tsutsui * 70 1.1 tsutsui * @(#)init_main.c 8.2 (Berkeley) 8/15/93 71 1.1 tsutsui */ 72 1.1 tsutsui 73 1.1 tsutsui #include <sys/param.h> 74 1.6 tsutsui #include <sys/boot_flag.h> 75 1.1 tsutsui #include <machine/cpu.h> 76 1.1 tsutsui #include <luna68k/stand/boot/samachdep.h> 77 1.1 tsutsui #include <luna68k/stand/boot/romvec.h> 78 1.1 tsutsui #include <luna68k/stand/boot/status.h> 79 1.1 tsutsui #include <lib/libsa/loadfile.h> 80 1.3 tsutsui #ifdef SUPPORT_ETHERNET 81 1.3 tsutsui #include <lib/libsa/dev_net.h> 82 1.3 tsutsui #endif 83 1.1 tsutsui 84 1.1 tsutsui static int get_plane_numbers(void); 85 1.1 tsutsui static int reorder_dipsw(int); 86 1.1 tsutsui 87 1.2 tsutsui int cpuspeed; /* for DELAY() macro */ 88 1.5 tsutsui int hz = 60; 89 1.2 tsutsui int machtype; 90 1.6 tsutsui char default_file[64]; 91 1.15 tsutsui const char *default_bootdev; 92 1.14 tsutsui int default_unit; 93 1.1 tsutsui 94 1.1 tsutsui #define VERS_LOCAL "Phase-31" 95 1.1 tsutsui 96 1.1 tsutsui int nplane; 97 1.1 tsutsui 98 1.1 tsutsui /* for command parser */ 99 1.1 tsutsui 100 1.1 tsutsui #define BUFFSIZE 100 101 1.1 tsutsui #define MAXARGS 30 102 1.1 tsutsui 103 1.1 tsutsui char buffer[BUFFSIZE]; 104 1.1 tsutsui 105 1.1 tsutsui int argc; 106 1.1 tsutsui char *argv[MAXARGS]; 107 1.1 tsutsui 108 1.5 tsutsui #define BOOT_TIMEOUT 10 109 1.5 tsutsui int boot_timeout = BOOT_TIMEOUT; 110 1.5 tsutsui 111 1.7 tsutsui static const char prompt[] = "boot> "; 112 1.1 tsutsui 113 1.8 tsutsui /* 114 1.8 tsutsui * PROM monitor's boot device info 115 1.8 tsutsui */ 116 1.8 tsutsui 117 1.8 tsutsui /* LUNA-I monitor's bootinfo structure */ 118 1.8 tsutsui /* This bootinfo data address is investigated on ROM Ver4.22 and Ver4.25 */ 119 1.8 tsutsui #define LUNA1_BOOTINFOADDR 0x000008c0 120 1.8 tsutsui struct luna1_bootinfo { 121 1.8 tsutsui uint8_t bi_xxx1[3]; /* 0x08c0: ??? */ 122 1.8 tsutsui uint8_t bi_device; /* 0x08c3: boot device */ 123 1.8 tsutsui #define LUNA1_BTDEV_DK 0 /* Hard-Disk */ 124 1.8 tsutsui #define LUNA1_BTDEV_FB 1 /* Floppy-Disk */ 125 1.8 tsutsui #define LUNA1_BTDEV_SD 2 /* Streamer-Tape */ 126 1.8 tsutsui #define LUNA1_BTDEV_P0 3 /* RS232c */ 127 1.8 tsutsui #define LUNA1_BTDEV_ET 4 /* Ether-net */ 128 1.8 tsutsui #define LUNA1_NBTDEV 5 129 1.8 tsutsui 130 1.8 tsutsui struct { 131 1.8 tsutsui uint8_t bd_xxx1; /* 0: ??? */ 132 1.8 tsutsui uint8_t bd_boot; /* 1: 1 == booted */ 133 1.8 tsutsui char bd_name[2]; /* 2: device name (dk, fb, sd ... ) */ 134 1.9 tsutsui uint8_t bd_drv; /* 4: drive number (not ID) */ 135 1.8 tsutsui uint8_t bd_xxx2; /* 5: ??? */ 136 1.8 tsutsui uint8_t bd_xxx3; /* 6: ??? */ 137 1.8 tsutsui uint8_t bd_part; /* 7: dk partition / st record # */ 138 1.8 tsutsui uint8_t bd_xxx4[4]; /* 8: ??? */ 139 1.8 tsutsui uint8_t bd_xxx5[4]; /* 12: ??? */ 140 1.8 tsutsui } bi_devinfo[LUNA1_NBTDEV]; 141 1.8 tsutsui } __packed; 142 1.8 tsutsui 143 1.8 tsutsui /* LUNA-II monitor's bootinfo structure */ 144 1.8 tsutsui /* This bootinfo data address is investigated on ROM Version 1.11 */ 145 1.8 tsutsui #define LUNA2_BOOTINFOADDR 0x00001d80 146 1.8 tsutsui struct luna2_bootinfo { 147 1.8 tsutsui uint8_t bi_xxx1[13]; /* 0x1d80: ??? */ 148 1.8 tsutsui uint8_t bi_device; /* 0x1d8d: boot device */ 149 1.8 tsutsui #define LUNA2_BTDEV_DK 0 /* Hard-Disk */ 150 1.8 tsutsui #define LUNA2_BTDEV_FT 1 /* Floppy-Disk */ 151 1.8 tsutsui #define LUNA2_BTDEV_SD 2 /* Streamer-Tape */ 152 1.8 tsutsui #define LUNA2_BTDEV_P0 3 /* RS232c */ 153 1.8 tsutsui #define LUNA2_NBTDEV 4 154 1.8 tsutsui 155 1.8 tsutsui struct { 156 1.8 tsutsui uint8_t bd_xxx1; /* 0: ??? */ 157 1.8 tsutsui uint8_t bd_boot; /* 1: 1 == booted */ 158 1.8 tsutsui char bd_name[4]; /* 2: device name (dk, ft, sd ... ) */ 159 1.8 tsutsui uint8_t bd_xxx2; /* 6: ??? */ 160 1.8 tsutsui uint8_t bd_ctlr; /* 7: SCSI controller number */ 161 1.9 tsutsui uint8_t bd_id; /* 8: SCSI ID number */ 162 1.8 tsutsui uint8_t bd_xxx3; /* 9: device number index? */ 163 1.8 tsutsui uint8_t bd_xxx4; /* 10: ??? */ 164 1.8 tsutsui uint8_t bd_part; /* 11: dk partition / st record # */ 165 1.8 tsutsui uint8_t bd_xxx5[4]; /* 12: ??? */ 166 1.8 tsutsui uint8_t bd_xxx6[4]; /* 16: ??? */ 167 1.8 tsutsui } bi_devinfo[LUNA2_NBTDEV]; 168 1.8 tsutsui } __packed; 169 1.8 tsutsui 170 1.8 tsutsui /* #define BTINFO_DEBUG */ 171 1.8 tsutsui 172 1.1 tsutsui void 173 1.1 tsutsui main(void) 174 1.1 tsutsui { 175 1.13 tsutsui int i, status = ST_NORMAL; 176 1.2 tsutsui const char *machstr; 177 1.8 tsutsui const char *bootdev; 178 1.10 tsutsui uint32_t howto; 179 1.6 tsutsui int unit, part; 180 1.9 tsutsui int bdev, ctlr, id; 181 1.1 tsutsui 182 1.1 tsutsui /* 183 1.1 tsutsui * Initialize the console before we print anything out. 184 1.1 tsutsui */ 185 1.2 tsutsui if (cputype == CPU_68030) { 186 1.2 tsutsui machtype = LUNA_I; 187 1.2 tsutsui machstr = "LUNA-I"; 188 1.2 tsutsui cpuspeed = MHZ_25; 189 1.5 tsutsui hz = 60; 190 1.2 tsutsui } else { 191 1.2 tsutsui machtype = LUNA_II; 192 1.2 tsutsui machstr = "LUNA-II"; 193 1.2 tsutsui cpuspeed = MHZ_25 * 2; /* XXX */ 194 1.5 tsutsui hz = 100; 195 1.2 tsutsui } 196 1.1 tsutsui 197 1.13 tsutsui nplane = get_plane_numbers(); 198 1.1 tsutsui 199 1.1 tsutsui cninit(); 200 1.1 tsutsui 201 1.1 tsutsui printf("\n"); 202 1.1 tsutsui printf(">> %s, Revision %s\n", bootprog_name, bootprog_rev); 203 1.1 tsutsui printf(">> (based on Stinger ver 0.0 [%s])\n", VERS_LOCAL); 204 1.1 tsutsui printf("\n"); 205 1.1 tsutsui 206 1.11 tsutsui i = ROM_memsize; 207 1.2 tsutsui printf("Machine model = %s\n", machstr); 208 1.1 tsutsui printf("Physical Memory = 0x%x ", i); 209 1.1 tsutsui i >>= 20; 210 1.1 tsutsui printf("(%d MB)\n", i); 211 1.1 tsutsui printf("\n"); 212 1.1 tsutsui 213 1.1 tsutsui /* 214 1.1 tsutsui * IO configuration 215 1.1 tsutsui */ 216 1.1 tsutsui 217 1.3 tsutsui #ifdef SUPPORT_ETHERNET 218 1.3 tsutsui try_bootp = 1; 219 1.3 tsutsui #endif 220 1.3 tsutsui 221 1.1 tsutsui find_devs(); 222 1.1 tsutsui printf("\n"); 223 1.1 tsutsui 224 1.8 tsutsui /* use sd(0,0) for the default boot device */ 225 1.8 tsutsui bootdev = "sd"; 226 1.8 tsutsui unit = 0; 227 1.6 tsutsui part = 0; 228 1.8 tsutsui 229 1.17 rin /* 230 1.17 rin * - LUNA1_BOOTINFOADDR is in the 0-th page [0, 0x1000), which causes 231 1.17 rin * -Warray-bounds for GCC12 and later. 232 1.17 rin * - LUNA2_BOOTINFOADDR is also in the 0-th page, if we switch to 233 1.17 rin * 8KB page. 234 1.17 rin */ 235 1.17 rin #pragma GCC diagnostic push 236 1.17 rin #pragma GCC diagnostic ignored "-Warray-bounds" 237 1.17 rin 238 1.8 tsutsui if (machtype == LUNA_I) { 239 1.8 tsutsui const struct luna1_bootinfo *bi1 = (void *)LUNA1_BOOTINFOADDR; 240 1.8 tsutsui 241 1.9 tsutsui bdev = bi1->bi_device; 242 1.9 tsutsui switch (bdev) { 243 1.8 tsutsui case LUNA1_BTDEV_DK: 244 1.9 tsutsui /* note: bd_drv is not SCSI ID */ 245 1.9 tsutsui ctlr = 0; 246 1.9 tsutsui id = 6 - bi1->bi_devinfo[bdev].bd_drv; 247 1.9 tsutsui unit = UNIT(ctlr, id); 248 1.8 tsutsui break; 249 1.8 tsutsui case LUNA1_BTDEV_ET: 250 1.8 tsutsui bootdev = "le"; 251 1.8 tsutsui unit = 0; 252 1.8 tsutsui break; 253 1.8 tsutsui default: 254 1.8 tsutsui /* not supported */ 255 1.8 tsutsui break; 256 1.8 tsutsui } 257 1.8 tsutsui #ifdef BTINFO_DEBUG 258 1.8 tsutsui printf("bi1->bi_device = 0x%02x\n", bi1->bi_device); 259 1.9 tsutsui printf("bi1->bi_devinfo[bdev].bd_boot = 0x%02x\n", 260 1.9 tsutsui bi1->bi_devinfo[bdev].bd_boot); 261 1.9 tsutsui printf("bi1->bi_devinfo[bdev].bd_name = %c%c\n", 262 1.9 tsutsui bi1->bi_devinfo[bdev].bd_name[0], 263 1.9 tsutsui bi1->bi_devinfo[bdev].bd_name[1]); 264 1.9 tsutsui printf("bi1->bi_devinfo[bdev].bd_drv = 0x%02x\n", 265 1.9 tsutsui bi1->bi_devinfo[bdev].bd_drv); 266 1.9 tsutsui printf("bi1->bi_devinfo[bdev].bd_part = 0x%02x\n", 267 1.9 tsutsui bi1->bi_devinfo[bdev].bd_part); 268 1.8 tsutsui #endif 269 1.8 tsutsui } else { 270 1.8 tsutsui const struct luna2_bootinfo *bi2 = (void *)LUNA2_BOOTINFOADDR; 271 1.8 tsutsui 272 1.9 tsutsui bdev = bi2->bi_device; 273 1.9 tsutsui switch (bdev) { 274 1.8 tsutsui case LUNA2_BTDEV_DK: 275 1.9 tsutsui ctlr = bi2->bi_devinfo[bdev].bd_ctlr; 276 1.9 tsutsui id = bi2->bi_devinfo[bdev].bd_id; 277 1.9 tsutsui unit = UNIT(ctlr, id); 278 1.8 tsutsui break; 279 1.8 tsutsui default: 280 1.8 tsutsui /* not supported */ 281 1.8 tsutsui break; 282 1.8 tsutsui } 283 1.8 tsutsui #ifdef BTINFO_DEBUG 284 1.8 tsutsui printf("bi2->bi_device = 0x%02x\n", bi2->bi_device); 285 1.9 tsutsui printf("bi2->bi_devinfo[bdev].bd_boot = 0x%02x\n", 286 1.9 tsutsui bi2->bi_devinfo[bdev].bd_boot); 287 1.9 tsutsui printf("bi2->bi_devinfo[bdev].bd_name = %s\n", 288 1.9 tsutsui bi2->bi_devinfo[bdev].bd_name); 289 1.9 tsutsui printf("bi2->bi_devinfo[bdev].bd_ctlr = 0x%02x\n", 290 1.9 tsutsui bi2->bi_devinfo[bdev].bd_ctlr); 291 1.9 tsutsui printf("bi2->bi_devinfo[bdev].bd_id = 0x%02x\n", 292 1.9 tsutsui bi2->bi_devinfo[bdev].bd_id); 293 1.9 tsutsui printf("bi2->bi_devinfo[bdev].bd_part = 0x%02x\n", 294 1.9 tsutsui bi2->bi_devinfo[bdev].bd_part); 295 1.8 tsutsui #endif 296 1.8 tsutsui } 297 1.8 tsutsui 298 1.17 rin #pragma GCC diagnostic pop 299 1.17 rin 300 1.6 tsutsui snprintf(default_file, sizeof(default_file), 301 1.8 tsutsui "%s(%d,%d)%s", bootdev, unit, part, "netbsd"); 302 1.15 tsutsui default_bootdev = bootdev; 303 1.14 tsutsui default_unit = unit; 304 1.6 tsutsui 305 1.1 tsutsui howto = reorder_dipsw(dipsw2); 306 1.1 tsutsui 307 1.1 tsutsui if ((howto & 0xFE) == 0) { 308 1.5 tsutsui char c; 309 1.5 tsutsui 310 1.5 tsutsui printf("Press return to boot now," 311 1.5 tsutsui " any other key for boot menu\n"); 312 1.5 tsutsui printf("booting %s - starting in ", default_file); 313 1.5 tsutsui c = awaitkey("%d seconds. ", boot_timeout, true); 314 1.5 tsutsui if (c == '\r' || c == '\n' || c == 0) { 315 1.5 tsutsui printf("auto-boot %s\n", default_file); 316 1.10 tsutsui bootnetbsd(default_file, 0); 317 1.5 tsutsui } 318 1.1 tsutsui } 319 1.1 tsutsui 320 1.1 tsutsui /* 321 1.1 tsutsui * Main Loop 322 1.1 tsutsui */ 323 1.1 tsutsui 324 1.5 tsutsui printf("type \"help\" for help.\n"); 325 1.5 tsutsui 326 1.1 tsutsui do { 327 1.1 tsutsui memset(buffer, 0, BUFFSIZE); 328 1.1 tsutsui if (getline(prompt, buffer) > 0) { 329 1.13 tsutsui argc = getargs(buffer, argv, 330 1.13 tsutsui sizeof(argv) / sizeof(char *)); 331 1.1 tsutsui 332 1.1 tsutsui status = parse(argc, argv); 333 1.1 tsutsui if (status == ST_NOTFOUND) 334 1.13 tsutsui printf("Command \"%s\" is not found !!\n", 335 1.13 tsutsui argv[0]); 336 1.1 tsutsui } 337 1.13 tsutsui } while (status != ST_EXIT); 338 1.1 tsutsui 339 1.1 tsutsui exit(0); 340 1.1 tsutsui } 341 1.1 tsutsui 342 1.16 tsutsui static int 343 1.1 tsutsui get_plane_numbers(void) 344 1.1 tsutsui { 345 1.1 tsutsui int r = ROM_plane; 346 1.1 tsutsui int n = 0; 347 1.1 tsutsui 348 1.1 tsutsui for (; r ; r >>= 1) 349 1.1 tsutsui if (r & 0x1) 350 1.1 tsutsui n++; 351 1.1 tsutsui 352 1.13 tsutsui return n; 353 1.1 tsutsui } 354 1.1 tsutsui 355 1.16 tsutsui static int 356 1.1 tsutsui reorder_dipsw(int dipsw) 357 1.1 tsutsui { 358 1.1 tsutsui int i, sw = 0; 359 1.1 tsutsui 360 1.1 tsutsui for (i = 0; i < 8; i++) { 361 1.1 tsutsui if ((dipsw & 0x01) == 0) 362 1.1 tsutsui sw += 1; 363 1.1 tsutsui 364 1.1 tsutsui if (i == 7) 365 1.1 tsutsui break; 366 1.1 tsutsui 367 1.1 tsutsui sw <<= 1; 368 1.1 tsutsui dipsw >>= 1; 369 1.1 tsutsui } 370 1.1 tsutsui 371 1.13 tsutsui return sw; 372 1.1 tsutsui } 373