Home | History | Annotate | Line # | Download | only in landisk
      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