machdep.c revision 1.12
1/* $NetBSD: machdep.c,v 1.12 2008/05/26 15:59:29 tsutsui Exp $ */ 2 3/* 4 * Copyright (c) 2006 Urbana-Champaign Independent Media Center. 5 * Copyright (c) 2006 Garrett D'Amore. 6 * All rights reserved. 7 * 8 * Portions of this code were written by Garrett D'Amore for the 9 * Champaign-Urbana Community Wireless Network Project. 10 * 11 * Redistribution and use in source and binary forms, with or 12 * without modification, are permitted provided that the following 13 * conditions 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 17 * copyright notice, this list of conditions and the following 18 * disclaimer in the documentation and/or other materials provided 19 * with the distribution. 20 * 3. All advertising materials mentioning features or use of this 21 * software must display the following acknowledgements: 22 * This product includes software developed by the Urbana-Champaign 23 * Independent Media Center. 24 * This product includes software developed by Garrett D'Amore. 25 * 4. Urbana-Champaign Independent Media Center's name and Garrett 26 * D'Amore's name may not be used to endorse or promote products 27 * derived from this software without specific prior written permission. 28 * 29 * THIS SOFTWARE IS PROVIDED BY THE URBANA-CHAMPAIGN INDEPENDENT 30 * MEDIA CENTER AND GARRETT D'AMORE ``AS IS'' AND ANY EXPRESS OR 31 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 32 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 33 * ARE DISCLAIMED. IN NO EVENT SHALL THE URBANA-CHAMPAIGN INDEPENDENT 34 * MEDIA CENTER OR GARRETT D'AMORE BE LIABLE FOR ANY DIRECT, INDIRECT, 35 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 36 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 37 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 38 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 40 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 41 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 42 */ 43/*- 44 * Copyright (c) 2006 Itronix Inc. 45 * All rights reserved. 46 * 47 * Portions written by Garrett D'Amore for Itronix Inc. 48 * 49 * Redistribution and use in source and binary forms, with or without 50 * modification, are permitted provided that the following conditions 51 * are met: 52 * 1. Redistributions of source code must retain the above copyright 53 * notice, this list of conditions and the following disclaimer. 54 * 2. Redistributions in binary form must reproduce the above copyright 55 * notice, this list of conditions and the following disclaimer in the 56 * documentation and/or other materials provided with the distribution. 57 * 3. The name of Itronix Inc. may not be used to endorse 58 * or promote products derived from this software without specific 59 * prior written permission. 60 * 61 * THIS SOFTWARE IS PROVIDED BY ITRONIX INC. ``AS IS'' AND 62 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 63 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 64 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ITRONIX INC. BE LIABLE FOR ANY 65 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 66 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 67 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 68 * ON ANY THEORY OF LIABILITY, WHETHER IN 69 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 70 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 71 * POSSIBILITY OF SUCH DAMAGE. 72 */ 73/* 74 * Copyright (c) 1992, 1993 75 * The Regents of the University of California. All rights reserved. 76 * 77 * This code is derived from software contributed to Berkeley by 78 * the Systems Programming Group of the University of Utah Computer 79 * Science Department, The Mach Operating System project at 80 * Carnegie-Mellon University and Ralph Campbell. 81 * 82 * Redistribution and use in source and binary forms, with or without 83 * modification, are permitted provided that the following conditions 84 * are met: 85 * 1. Redistributions of source code must retain the above copyright 86 * notice, this list of conditions and the following disclaimer. 87 * 2. Redistributions in binary form must reproduce the above copyright 88 * notice, this list of conditions and the following disclaimer in the 89 * documentation and/or other materials provided with the distribution. 90 * 3. Neither the name of the University nor the names of its contributors 91 * may be used to endorse or promote products derived from this software 92 * without specific prior written permission. 93 * 94 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 95 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 96 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 97 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 98 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 99 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 100 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 101 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 102 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 103 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 104 * SUCH DAMAGE. 105 * 106 * @(#)machdep.c 8.3 (Berkeley) 1/12/94 107 * from: Utah Hdr: machdep.c 1.63 91/04/24 108 */ 109/* 110 * Copyright (c) 1988 University of Utah. 111 * 112 * This code is derived from software contributed to Berkeley by 113 * the Systems Programming Group of the University of Utah Computer 114 * Science Department, The Mach Operating System project at 115 * Carnegie-Mellon University and Ralph Campbell. 116 * 117 * Redistribution and use in source and binary forms, with or without 118 * modification, are permitted provided that the following conditions 119 * are met: 120 * 1. Redistributions of source code must retain the above copyright 121 * notice, this list of conditions and the following disclaimer. 122 * 2. Redistributions in binary form must reproduce the above copyright 123 * notice, this list of conditions and the following disclaimer in the 124 * documentation and/or other materials provided with the distribution. 125 * 3. All advertising materials mentioning features or use of this software 126 * must display the following acknowledgement: 127 * This product includes software developed by the University of 128 * California, Berkeley and its contributors. 129 * 4. Neither the name of the University nor the names of its contributors 130 * may be used to endorse or promote products derived from this software 131 * without specific prior written permission. 132 * 133 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 134 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 135 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 136 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 137 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 138 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 139 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 140 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 141 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 142 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 143 * SUCH DAMAGE. 144 * 145 * @(#)machdep.c 8.3 (Berkeley) 1/12/94 146 * from: Utah Hdr: machdep.c 1.63 91/04/24 147 */ 148 149#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ 150__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.12 2008/05/26 15:59:29 tsutsui Exp $"); 151 152#include "opt_ddb.h" 153#include "opt_kgdb.h" 154 155#include <sys/param.h> 156#include <sys/systm.h> 157#include <sys/kernel.h> 158#include <sys/buf.h> 159#include <sys/reboot.h> 160#include <sys/user.h> 161#include <sys/mount.h> 162#include <sys/kcore.h> 163#include <sys/boot_flag.h> 164#include <sys/termios.h> 165#include <sys/ksyms.h> 166 167#include <uvm/uvm_extern.h> 168 169#include <dev/cons.h> 170 171#include "ksyms.h" 172 173#if NKSYMS || defined(DDB) || defined(LKM) 174#include <machine/db_machdep.h> 175#include <ddb/db_extern.h> 176#endif 177 178#include <mips/cache.h> 179#include <mips/locore.h> 180#include <mips/cpuregs.h> 181 182#include <mips/atheros/include/ar531xvar.h> 183#include <mips/atheros/include/arbusvar.h> 184 185struct user *proc0paddr; 186 187/* Our exported CPU info; we can have only one. */ 188struct cpu_info cpu_info_store; 189 190/* Maps for VM objects. */ 191struct vm_map *exec_map = NULL; 192struct vm_map *mb_map = NULL; 193struct vm_map *phys_map = NULL; 194 195int physmem; /* # pages of physical memory */ 196int maxmem; /* max memory per process */ 197 198int mem_cluster_cnt; 199phys_ram_seg_t mem_clusters[VM_PHYSSEG_MAX]; 200 201void mach_init(void); /* XXX */ 202 203static void 204cal_timer(void) 205{ 206 uint32_t cntfreq; 207 208 cntfreq = curcpu()->ci_cpu_freq = ar531x_cpu_freq(); 209 210 /* MIPS 4Kc CP0 counts every other clock */ 211 if (mips_cpu_flags & CPU_MIPS_DOUBLE_COUNT) 212 cntfreq /= 2; 213 214 curcpu()->ci_cycles_per_hz = (cntfreq + hz / 2) / hz; 215 216 /* Compute number of cycles per 1us (1/MHz). 0.5MHz is for roundup. */ 217 curcpu()->ci_divisor_delay = ((cntfreq + 500000) / 1000000); 218} 219 220void 221mach_init(void) 222{ 223 void *kernend; 224 u_long first, last; 225 void * v; 226 uint32_t memsize; 227 228 extern char edata[], end[]; /* XXX */ 229 230 /* clear the BSS segment */ 231 kernend = (void *)mips_round_page(end); 232 233 memset(edata, 0, (char *)kernend - edata); 234 235 /* setup early console */ 236 ar531x_early_console(); 237 238 /* set CPU model info for sysctl_hw */ 239 snprintf(cpu_model, 64, "%s", ar531x_cpuname()); 240 241 /* 242 * Set up the exception vectors and CPU-specific function 243 * vectors early on. We need the wbflush() vector set up 244 * before comcnattach() is called (or at least before the 245 * first printf() after that is called). 246 * Sets up mips_cpu_flags that may be queried by other 247 * functions called during startup. 248 * Also clears the I+D caches. 249 */ 250 mips_vector_init(); 251 252 /* 253 * Calibrate timers. 254 */ 255 cal_timer(); 256 257 /* 258 * Set the VM page size. 259 */ 260 uvm_setpagesize(); 261 262 /* 263 * Look at arguments passed to us and compute boothowto. 264 */ 265 boothowto = RB_AUTOBOOT; 266#ifdef KADB 267 boothowto |= RB_KDB; 268#endif 269 270 /* 271 * This would be a good place to parse a boot command line, if 272 * we got one from the bootloader. Right now we have no way to 273 * get one from e.g. vxworks. 274 */ 275 276 /* 277 * Determine the memory size. 278 * 279 * Note: Reserve the first page! That's where the trap 280 * vectors are located. 281 */ 282 memsize = ar531x_memsize(); 283 284 printf("Memory size: 0x%08x\n", memsize); 285 physmem = btoc(memsize); 286 287 mem_clusters[mem_cluster_cnt].start = PAGE_SIZE; 288 mem_clusters[mem_cluster_cnt].size = 289 memsize - mem_clusters[mem_cluster_cnt].start; 290 mem_cluster_cnt++; 291 292 /* 293 * Load the rest of the available pages into the VM system. 294 */ 295 first = round_page(MIPS_KSEG0_TO_PHYS(kernend)); 296 last = mem_clusters[0].start + mem_clusters[0].size; 297 uvm_page_physload(atop(first), atop(last), atop(first), atop(last), 298 VM_FREELIST_DEFAULT); 299 300 /* 301 * Initialize message buffer (at end of core). 302 */ 303 mips_init_msgbuf(); 304 305 /* 306 * Initialize the virtual memory system. 307 */ 308 pmap_bootstrap(); 309 310 /* 311 * Init mapping for u page(s) for proc0. 312 */ 313 v = (void *) uvm_pageboot_alloc(USPACE); 314 lwp0.l_addr = proc0paddr = (struct user *)v; 315 lwp0.l_md.md_regs = (struct frame *)((char *)v + USPACE) - 1; 316 proc0paddr->u_pcb.pcb_context[11] = 317 MIPS_INT_MASK | MIPS_SR_INT_IE; /* SR */ 318 319 /* 320 * Initialize busses. 321 */ 322 ar531x_businit(); 323 324 /* 325 * Turn off (ignore) the hardware watchdog. If we got this 326 * far, then we shouldn't need it anymore. 327 */ 328 ar531x_wdog(0); 329 330 /* 331 * Turn off watchpoint that may have been enabled by the 332 * PROM. VxWorks bootloader seems to leave one set. 333 */ 334 __asm volatile ( 335 "mtc0 $0, $" ___STRING(MIPS_COP_0_WATCH_LO) " \n\t" 336 "nop\n\t" 337 "nop\n\t"); 338 339 /* 340 * Initialize debuggers, and break into them, if appropriate. 341 */ 342#if NKSYMS || defined(DDB) || defined(LKM) 343 ksyms_init(0, 0, 0); 344#endif 345 346#ifdef DDB 347 if (boothowto & RB_KDB) 348 Debugger(); 349#endif 350} 351 352void 353consinit(void) 354{ 355 356 /* 357 * Everything related to console initialization is done 358 * in mach_init(). 359 */ 360 ar531x_consinit(); 361} 362 363void 364cpu_startup(void) 365{ 366 char pbuf[9]; 367 vaddr_t minaddr, maxaddr; 368#ifdef DEBUG 369 extern int pmapdebug; /* XXX */ 370 int opmapdebug = pmapdebug; 371 372 pmapdebug = 0; /* Shut up pmap debug during bootstrap */ 373#endif 374 375 /* 376 * Good {morning,afternoon,evening,night}. 377 */ 378 printf("%s%s", copyright, version); 379 printf("%s\n", cpu_model); 380 format_bytes(pbuf, sizeof(pbuf), ctob(physmem)); 381 printf("total memory = %s\n", pbuf); 382 383 minaddr = 0; 384 /* 385 * Allocate a submap for exec arguments. This map effectively 386 * limits the number of processes exec'ing at any time. 387 */ 388 exec_map = uvm_km_suballoc(kernel_map, &minaddr, &maxaddr, 389 16 * NCARGS, VM_MAP_PAGEABLE, FALSE, NULL); 390 391 /* 392 * Allocate a submap for physio 393 */ 394 phys_map = uvm_km_suballoc(kernel_map, &minaddr, &maxaddr, 395 VM_PHYS_SIZE, 0, FALSE, NULL); 396 397 /* 398 * No need to allocate an mbuf cluster submap. Mbuf clusters 399 * are allocated via the pool allocator, and we use KSEG to 400 * map those pages. 401 */ 402 403#ifdef DEBUG 404 pmapdebug = opmapdebug; 405#endif 406 format_bytes(pbuf, sizeof(pbuf), ptoa(uvmexp.free)); 407 printf("avail memory = %s\n", pbuf); 408} 409 410void 411cpu_reboot(int howto, char *bootstr) 412{ 413 static int waittime = -1; 414 415 /* Take a snapshot before clobbering any registers. */ 416 if (curproc) 417 savectx((struct user *)curpcb); 418 419 /* If "always halt" was specified as a boot flag, obey. */ 420 if (boothowto & RB_HALT) 421 howto |= RB_HALT; 422 423 boothowto = howto; 424 425 /* If system is cold, just halt. */ 426 if (cold) { 427 boothowto |= RB_HALT; 428 goto haltsys; 429 } 430 431 if ((boothowto & RB_NOSYNC) == 0 && waittime < 0) { 432 waittime = 0; 433 434 /* 435 * Synchronize the disks.... 436 */ 437 vfs_shutdown(); 438 439 /* 440 * If we've been adjusting the clock, the todr 441 * will be out of synch; adjust it now. 442 */ 443 resettodr(); 444 } 445 446 /* Disable interrupts. */ 447 splhigh(); 448 449 if (boothowto & RB_DUMP) 450 dumpsys(); 451 452 haltsys: 453 /* Run any shutdown hooks. */ 454 doshutdownhooks(); 455 456#if 0 457 if ((boothowto & RB_POWERDOWN) == RB_POWERDOWN) 458 if (board && board->ab_poweroff) 459 board->ab_poweroff(); 460#endif 461 462 /* 463 * Firmware may autoboot (depending on settings), and we cannot pass 464 * flags to it (at least I haven't figured out how to yet), so 465 * we "pseudo-halt" now. 466 */ 467 if (boothowto & RB_HALT) { 468 printf("\n"); 469 printf("The operating system has halted.\n"); 470 printf("Please press any key to reboot.\n\n"); 471 cnpollc(1); /* For proper keyboard command handling */ 472 cngetc(); 473 cnpollc(0); 474 } 475 476 printf("reseting board...\n\n"); 477 mips_icache_sync_all(); 478 mips_dcache_wbinv_all(); 479 __asm volatile("jr %0" :: "r"(MIPS_RESET_EXC_VEC)); 480 printf("Oops, back from reset\n\nSpinning..."); 481 for (;;) 482 /* spin forever */ ; /* XXX */ 483 /*NOTREACHED*/ 484} 485