1 /* $NetBSD: machdep.c,v 1.26 2026/06/10 21:24:11 andvar Exp $ */ 2 3 /*- 4 * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Charles M. Hannum and by Jason R. Thorpe of the Numerical Aerospace 9 * Simulation Facility, NASA Ames Research Center. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 /*- 34 * Copyright (c) 1982, 1987, 1990 The Regents of the University of California. 35 * All rights reserved. 36 * 37 * This code is derived from software contributed to Berkeley by 38 * William Jolitz. 39 * 40 * Redistribution and use in source and binary forms, with or without 41 * modification, are permitted provided that the following conditions 42 * are met: 43 * 1. Redistributions of source code must retain the above copyright 44 * notice, this list of conditions and the following disclaimer. 45 * 2. Redistributions in binary form must reproduce the above copyright 46 * notice, this list of conditions and the following disclaimer in the 47 * documentation and/or other materials provided with the distribution. 48 * 3. Neither the name of the University nor the names of its contributors 49 * may be used to endorse or promote products derived from this software 50 * without specific prior written permission. 51 * 52 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 53 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 54 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 55 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 62 * SUCH DAMAGE. 63 * 64 * @(#)machdep.c 7.4 (Berkeley) 6/3/91 65 */ 66 67 #include <sys/cdefs.h> 68 __KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.26 2026/06/10 21:24:11 andvar Exp $"); 69 70 #include "opt_ddb.h" 71 #include "opt_kgdb.h" 72 #include "opt_kloader.h" 73 #include "opt_kloader_kernel_path.h" 74 #include "opt_memsize.h" 75 #include "opt_modular.h" 76 77 #include "ksyms.h" 78 #include "scif.h" 79 80 #include <sys/param.h> 81 #include <sys/systm.h> 82 #include <sys/kernel.h> 83 #include <sys/mount.h> 84 #include <sys/reboot.h> 85 #include <sys/sysctl.h> 86 #include <sys/ksyms.h> 87 #include <sys/device.h> 88 #include <sys/module.h> 89 #include <sys/cpu.h> 90 91 #include <uvm/uvm_extern.h> 92 #include <ufs/mfs/mfs_extern.h> /* mfs_initminiroot() */ 93 94 #include <dev/cons.h> 95 96 #include <sh3/bscreg.h> 97 #include <sh3/cpgreg.h> 98 #include <sh3/exception.h> 99 #include <sh3/wdtreg.h> 100 101 #include <sh3/cache.h> 102 #include <sh3/cache_sh4.h> 103 #include <sh3/mmu_sh4.h> 104 105 #include <sys/bus.h> 106 #include <machine/bootinfo.h> 107 #include <machine/pcb.h> 108 109 #include <landisk/landisk/landiskreg.h> 110 111 #ifdef KLOADER 112 #include <machine/kloader.h> 113 #endif 114 115 #ifdef KGDB 116 #include <sys/kgdb.h> 117 #include <sh3/dev/scifvar.h> 118 #endif 119 120 #if NKSYMS || defined(MODULAR) || defined(DDB) 121 #include <machine/db_machdep.h> 122 #include <ddb/db_sym.h> 123 #include <ddb/db_extern.h> 124 #include <sys/exec_elf.h> 125 #endif 126 127 /* the following is used externally (sysctl_hw) */ 128 char machine[] = MACHINE; /* landisk */ 129 char machine_arch[] = MACHINE_ARCH; /* sh3el */ 130 131 #ifdef KLOADER 132 struct kloader_bootinfo kbootinfo; 133 #else 134 struct bootinfo _bootinfo; 135 #endif 136 struct bootinfo *bootinfo; 137 138 void main(void) __attribute__((__noreturn__)); 139 void landisk_startup(int, void *) __attribute__((__noreturn__)); 140 141 void 142 cpu_startup(void) 143 { 144 145 /* XXX: show model (LANDISK/USL-5P) */ 146 cpu_setmodel("Model: I-O DATA LANDISK"); 147 148 sh_startup(); 149 } 150 151 void 152 landisk_startup(int howto, void *bi) 153 { 154 extern char edata[], end[]; 155 vaddr_t kernend; 156 size_t symbolsize; 157 158 /* Clear bss */ 159 memset(edata, 0, end - edata); 160 161 /* Symbol table size */ 162 symbolsize = 0; 163 #if NKSYMS || defined(MODULAR) || defined(DDB) 164 if (memcmp(&end, ELFMAG, SELFMAG) == 0) { 165 Elf_Ehdr *eh = (void *)end; 166 Elf_Shdr *sh = (void *)(end + eh->e_shoff); 167 int i; 168 169 for (i = 0; i < eh->e_shnum; i++, sh++) { 170 if (sh->sh_offset > 0 && 171 (sh->sh_offset + sh->sh_size) > symbolsize) { 172 symbolsize = sh->sh_offset + sh->sh_size; 173 } 174 } 175 } 176 #endif 177 178 /* Start to determine heap area */ 179 kernend = (vaddr_t)sh3_round_page(end + symbolsize); 180 181 /* Copy bootinfo */ 182 #ifdef KLOADER 183 bootinfo = &kbootinfo.bootinfo; 184 #else 185 bootinfo = &_bootinfo; 186 #endif 187 memcpy(bootinfo, bi, sizeof(struct bootinfo)); 188 boothowto = howto; 189 190 /* Initialize CPU ops. */ 191 sh_cpu_init(CPU_ARCH_SH4, CPU_PRODUCT_7751R); 192 193 /* Initialize console */ 194 consinit(); 195 196 /* 197 * Check to see if a mini-root was loaded into memory. It resides 198 * at the start of the next page just after the end of BSS. 199 */ 200 if (boothowto & RB_MINIROOT) { 201 size_t fssz; 202 fssz = sh3_round_page(mfs_initminiroot((void *)kernend)); 203 #ifdef MEMORY_DISK_DYNAMIC 204 md_root_setconf((void *)kernend, fssz); 205 #endif 206 kernend += fssz; 207 } 208 209 #ifdef KLOADER 210 /* copy boot parameter for kloader */ 211 kloader_bootinfo_set(&kbootinfo, 0, NULL, NULL, true); 212 #endif 213 214 /* Load memory to UVM */ 215 physmem = atop(IOM_RAM_SIZE); 216 kernend = atop(round_page(SH3_P1SEG_TO_PHYS(kernend))); 217 uvm_page_physload( 218 kernend, atop(IOM_RAM_BEGIN + IOM_RAM_SIZE), 219 kernend, atop(IOM_RAM_BEGIN + IOM_RAM_SIZE), 220 VM_FREELIST_DEFAULT); 221 222 /* Initialize proc0 u-area */ 223 sh_proc0_init(); 224 225 /* Initialize pmap and start to address translation */ 226 pmap_bootstrap(); 227 228 /* Debugger. */ 229 #if NKSYMS || defined(MODULAR) || defined(DDB) 230 if (symbolsize != 0) { 231 ksyms_addsyms_elf(symbolsize, &end, end + symbolsize); 232 } 233 #endif 234 #if defined(DDB) 235 if (boothowto & RB_KDB) { 236 Debugger(); 237 } 238 #endif 239 #if defined(KGDB) && (NSCIF > 0) 240 if (scif_kgdb_init() == 0) { 241 if (boothowto & RB_KDB) { 242 kgdb_debug_init = 1; 243 kgdb_connect(1); 244 } 245 } 246 #endif /* KGDB && NSCIF > 0 */ 247 248 /* Jump to main */ 249 __asm volatile( 250 "jmp @%0;" 251 "mov %1, sp" 252 :: "r" (main), "r" (lwp0.l_md.md_pcb->pcb_sf.sf_r7_bank)); 253 /* NOTREACHED */ 254 for (;;) { 255 continue; 256 } 257 } 258 259 void * 260 lookup_bootinfo(int type) 261 { 262 struct btinfo_common *help; 263 int n = bootinfo->nentries; 264 265 help = (struct btinfo_common *)(bootinfo->info); 266 while (n--) { 267 if (help->type == type) 268 return (help); 269 help = (struct btinfo_common *)((char *)help + help->len); 270 } 271 return (NULL); 272 } 273 274 /* 275 * machine dependent system variables. 276 */ 277 SYSCTL_SETUP(sysctl_machdep_setup, "sysctl machdep subtree setup") 278 { 279 280 sysctl_createv(clog, 0, NULL, NULL, 281 CTLFLAG_PERMANENT, 282 CTLTYPE_NODE, "machdep", NULL, 283 NULL, 0, NULL, 0, 284 CTL_MACHDEP, CTL_EOL); 285 286 sysctl_createv(clog, 0, NULL, NULL, 287 CTLFLAG_PERMANENT, 288 CTLTYPE_STRUCT, "console_device", NULL, 289 sysctl_consdev, 0, NULL, sizeof(dev_t), 290 CTL_MACHDEP, CPU_CONSDEV, CTL_EOL); 291 } 292 293 void 294 cpu_reboot(int howto, char *bootstr) 295 { 296 297 if (cold) { 298 howto |= RB_HALT; 299 goto haltsys; 300 } 301 302 #ifdef KLOADER 303 if ((howto & RB_HALT) == 0) { 304 if ((howto & RB_STRING) && (bootstr != NULL)) { 305 kloader_reboot_setup(bootstr); 306 } 307 #ifdef KLOADER_KERNEL_PATH 308 else { 309 kloader_reboot_setup(KLOADER_KERNEL_PATH); 310 } 311 #endif 312 } 313 #endif 314 315 boothowto = howto; 316 if ((howto & RB_NOSYNC) == 0) { 317 vfs_shutdown(); 318 } 319 320 /* wait 1s */ 321 delay(1 * 1000 * 1000); 322 323 /* Disable interrupts. */ 324 splhigh(); 325 326 /* Do a dump if requested. */ 327 if ((howto & (RB_DUMP | RB_HALT)) == RB_DUMP) { 328 dumpsys(); 329 } 330 331 haltsys: 332 doshutdownhooks(); 333 334 pmf_system_shutdown(boothowto); 335 336 if ((howto & RB_POWERDOWN) == RB_POWERDOWN) { 337 _reg_write_1(LANDISK_PWRMNG, PWRMNG_POWEROFF); 338 delay(1 * 1000 * 1000); 339 printf("POWEROFF FAILED!\n"); 340 } 341 342 if (howto & RB_HALT) { 343 printf("\n"); 344 printf("The operating system has halted.\n"); 345 printf("Please press any key to reboot.\n\n"); 346 cngetc(); 347 } 348 #ifdef KLOADER 349 else { 350 delay(1 * 1000 * 1000); 351 kloader_reboot(); 352 printf("\n"); 353 printf("Failed to load a new kernel.\n"); 354 printf("Please press any key to reboot.\n\n"); 355 cngetc(); 356 } 357 #endif 358 359 printf("rebooting...\n"); 360 machine_reset(); 361 /*NOTREACHED*/ 362 } 363 364 void 365 machine_reset(void) 366 { 367 368 _cpu_exception_suspend(); 369 asm("trapa #0"); 370 371 /*NOTREACHED*/ 372 for (;;) { 373 continue; 374 } 375 } 376 377 #if !defined(DONT_INIT_BSC) 378 /* 379 * InitializeBsc 380 * : BSC(Bus State Controller) 381 */ 382 void InitializeBsc(void); 383 384 void 385 InitializeBsc(void) 386 { 387 388 /* 389 * Drive RAS,CAS in stand by mode and bus release mode 390 * Area0 = Normal memory, Area5,6=Normal(no burst) 391 * Area2 = Normal memory, Area3 = SDRAM, Area5 = Normal memory 392 * Area4 = Normal Memory 393 * Area6 = Normal memory 394 */ 395 _reg_write_4(SH4_BCR1, BSC_BCR1_VAL); 396 397 /* 398 * Bus Width 399 * Area4: Bus width = 16bit 400 * Area6,5 = 16bit 401 * Area1 = 8bit 402 * Area2,3: Bus width = 32bit 403 */ 404 _reg_write_2(SH4_BCR2, BSC_BCR2_VAL); 405 406 #if defined(SH4) && defined(SH7751R) 407 if (cpu_product == CPU_PRODUCT_7751R) { 408 #ifdef BSC_BCR3_VAL 409 _reg_write_2(SH4_BCR3, BSC_BCR3_VAL); 410 #endif 411 #ifdef BSC_BCR4_VAL 412 _reg_write_4(SH4_BCR4, BSC_BCR4_VAL); 413 #endif 414 } 415 #endif /* SH4 && SH7751R */ 416 417 /* 418 * Idle cycle number in transition area and read to write 419 * Area6 = 3, Area5 = 3, Area4 = 3, Area3 = 3, Area2 = 3 420 * Area1 = 3, Area0 = 3 421 */ 422 _reg_write_4(SH4_WCR1, BSC_WCR1_VAL); 423 424 /* 425 * Wait cycle 426 * Area 6 = 6 427 * Area 5 = 2 428 * Area 4 = 10 429 * Area 3 = 3 430 * Area 2,1 = 3 431 * Area 0 = 6 432 */ 433 _reg_write_4(SH4_WCR2, BSC_WCR2_VAL); 434 435 #ifdef BSC_WCR3_VAL 436 _reg_write_4(SH4_WCR3, BSC_WCR3_VAL); 437 #endif 438 439 /* 440 * RAS pre-charge = 2cycle, RAS-CAS delay = 3 cycle, 441 * write pre-charge=1cycle 442 * CAS before RAS refresh RAS assert time = 3 cycle 443 * Disable burst, Bus size=32bit, Column Address=10bit, Refresh ON 444 * CAS before RAS refresh ON, EDO DRAM 445 */ 446 _reg_write_4(SH4_MCR, BSC_MCR_VAL); 447 448 #ifdef BSC_SDMR2_VAL 449 _reg_write_1(BSC_SDMR2_VAL, 0); 450 #endif 451 452 #ifdef BSC_SDMR3_VAL 453 _reg_write_1(BSC_SDMR3_VAL, 0); 454 #endif /* BSC_SDMR3_VAL */ 455 456 /* 457 * PCMCIA Control Register 458 * OE/WE assert delay 3.5 cycle 459 * OE/WE negate-address delay 3.5 cycle 460 */ 461 #ifdef BSC_PCR_VAL 462 _reg_write_2(SH4_PCR, BSC_PCR_VAL); 463 #endif 464 465 /* 466 * Refresh Timer Control/Status Register 467 * Disable interrupt by CMF, closk 1/16, Disable OVF interrupt 468 * Count Limit = 1024 469 * In following statement, the reason why high byte = 0xa5(a4 in RFCR) 470 * is the rule of SH3 in writing these register. 471 */ 472 _reg_write_2(SH4_RTCSR, BSC_RTCSR_VAL); 473 474 /* 475 * Refresh Timer Counter 476 * Initialize to 0 477 */ 478 #ifdef BSC_RTCNT_VAL 479 _reg_write_2(SH4_RTCNT, BSC_RTCNT_VAL); 480 #endif 481 482 /* set Refresh Time Constant Register */ 483 _reg_write_2(SH4_RTCOR, BSC_RTCOR_VAL); 484 485 /* init Refresh Count Register */ 486 #ifdef BSC_RFCR_VAL 487 _reg_write_2(SH4_RFCR, BSC_RFCR_VAL); 488 #endif 489 490 /* 491 * Clock Pulse Generator 492 */ 493 /* Set Clock mode (make internal clock double speed) */ 494 _reg_write_2(SH4_FRQCR, FRQCR_VAL); 495 } 496 #endif /* !DONT_INIT_BSC */ 497