machdep.c revision 1.3
1/* $NetBSD: machdep.c,v 1.3 2006/06/05 05:14:37 gdamore 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.3 2006/06/05 05:14:37 gdamore Exp $"); 151 152#include "opt_ddb.h" 153#include "opt_kgdb.h" 154 155#include "opt_memsize.h" 156#include "opt_ethaddr.h" 157 158#include <sys/param.h> 159#include <sys/systm.h> 160#include <sys/kernel.h> 161#include <sys/buf.h> 162#include <sys/reboot.h> 163#include <sys/user.h> 164#include <sys/mount.h> 165#include <sys/kcore.h> 166#include <sys/boot_flag.h> 167#include <sys/termios.h> 168#include <sys/ksyms.h> 169 170#include <net/if.h> 171#include <net/if_ether.h> 172 173#include <uvm/uvm_extern.h> 174 175#include <dev/cons.h> 176 177#include "ksyms.h" 178 179#if NKSYMS || defined(DDB) || defined(LKM) 180#include <machine/db_machdep.h> 181#include <ddb/db_extern.h> 182#endif 183 184#include <mips/cache.h> 185#include <mips/locore.h> 186#include <mips/cpuregs.h> 187 188#include <mips/atheros/include/ar531xreg.h> 189#include <mips/atheros/include/ar531xvar.h> 190#include <mips/atheros/include/arbusvar.h> 191#include "com.h" 192 193struct user *proc0paddr; 194 195/* Our exported CPU info; we can have only one. */ 196struct cpu_info cpu_info_store; 197 198/* Maps for VM objects. */ 199struct vm_map *exec_map = NULL; 200struct vm_map *mb_map = NULL; 201struct vm_map *phys_map = NULL; 202 203int physmem; /* # pages of physical memory */ 204int maxmem; /* max memory per process */ 205 206int mem_cluster_cnt; 207phys_ram_seg_t mem_clusters[VM_PHYSSEG_MAX]; 208 209void mach_init(void); /* XXX */ 210 211void mdputc(char); 212void mdputs(const char *); 213void mdputx(int n); 214void mdputn(int n); 215 216extern struct consdev com_arbus_consdev; 217 218void 219mach_init(void) 220{ 221 caddr_t kernend; 222 u_long first, last; 223 caddr_t v; 224 uint32_t memcfg, bank0, bank1; 225 uint32_t memsize; 226 const struct ar531x_boarddata *infop; 227 228 extern char edata[], end[]; /* XXX */ 229 230 /* clear the BSS segment */ 231 kernend = (caddr_t)mips_round_page(end); 232 233 memset(edata, 0, kernend - (caddr_t)edata); 234 235 infop = ar531x_board_info(); 236 if (infop == NULL) 237 panic("No board info!"); 238 239 /* set CPU model info for sysctl_hw */ 240 snprintf(cpu_model, 64, "%s", infop->boardName); 241 242 /* 243 * Set up the exception vectors and CPU-specific function 244 * vectors early on. We need the wbflush() vector set up 245 * before comcnattach() is called (or at least before the 246 * first printf() after that is called). 247 * Sets up mips_cpu_flags that may be queried by other 248 * functions called during startup. 249 * Also clears the I+D caches. 250 */ 251 mips_vector_init(); 252 253 /* 254 * Calibrate timers. 255 */ 256 ar531x_cal_timer(); 257 258 /* 259 * Set the VM page size. 260 */ 261 uvm_setpagesize(); 262 263 /* 264 * Look at arguments passed to us and compute boothowto. 265 */ 266 boothowto = RB_AUTOBOOT; 267#ifdef KADB 268 boothowto |= RB_KDB; 269#endif 270 271 /* 272 * This would be a good place to parse a boot command line, bif 273 * we got one from the bootloader. Right now we have no way to 274 * get one from e.g. vxworks. 275 */ 276 277 /* 278 * Determine the memory size. Use the `memsize' PMON 279 * variable. If that's not available, panic. 280 * 281 * Note: Reserve the first page! That's where the trap 282 * vectors are located. 283 */ 284 memcfg = GETSDRAMREG(AR531X_SDRAMCTL_MEM_CFG1); 285 bank0 = (memcfg & AR531X_MEM_CFG1_BANK0_MASK) >> 286 AR531X_MEM_CFG1_BANK0_SHIFT; 287 bank1 = (memcfg & AR531X_MEM_CFG1_BANK1_MASK) >> 288 AR531X_MEM_CFG1_BANK1_SHIFT; 289 290 memsize = (bank0 ? (1 << (bank0 + 1)) : 0) + 291 (bank1 ? (1 << (bank1 + 1)) : 0); 292 memsize <<= 20; 293 294 /* allow compile time override */ 295#if defined(MEMSIZE) 296 memsize = MEMSIZE; 297#endif 298 299 printf("Memory size: 0x%08x\n", memsize); 300 physmem = btoc(memsize); 301 302 mem_clusters[mem_cluster_cnt].start = PAGE_SIZE; 303 mem_clusters[mem_cluster_cnt].size = 304 memsize - mem_clusters[mem_cluster_cnt].start; 305 mem_cluster_cnt++; 306 307 /* 308 * Load the rest of the available pages into the VM system. 309 */ 310 first = round_page(MIPS_KSEG0_TO_PHYS(kernend)); 311 last = mem_clusters[0].start + mem_clusters[0].size; 312 uvm_page_physload(atop(first), atop(last), atop(first), atop(last), 313 VM_FREELIST_DEFAULT); 314 315 /* 316 * Initialize message buffer (at end of core). 317 */ 318 mips_init_msgbuf(); 319 320 /* 321 * Initialize the virtual memory system. 322 */ 323 pmap_bootstrap(); 324 325 /* 326 * Init mapping for u page(s) for proc0. 327 */ 328 v = (caddr_t) uvm_pageboot_alloc(USPACE); 329 lwp0.l_addr = proc0paddr = (struct user *)v; 330 lwp0.l_md.md_regs = (struct frame *)(v + USPACE) - 1; 331 curpcb = &lwp0.l_addr->u_pcb; 332 curpcb->pcb_context[11] = MIPS_INT_MASK | MIPS_SR_INT_IE; /* SR */ 333 334 /* 335 * Clear previous AHB errors 336 */ 337 GETSYSREG(AR531X_SYSREG_AHBPERR); 338 GETSYSREG(AR531X_SYSREG_AHBDMAE); 339 340 /* 341 * Turn off (ignore) the hardware watchdog. If we got this 342 * far, then we shouldn't need it anymore. 343 */ 344 PUTSYSREG(AR531X_SYSREG_WDOG_CTL, AR531X_WDOG_CTL_IGNORE); 345 346 /* 347 * Turn off watchpoint that may have been enabled by the 348 * PROM. VxWorks bootloader seems to leave one set. 349 */ 350 __asm volatile ( 351 "mtc0 $0, $" ___STRING(MIPS_COP_0_WATCH_LO) " \n\t" 352 "nop\n\t" 353 "nop\n\t"); 354 355 /* 356 * Initialize debuggers, and break into them, if appropriate. 357 */ 358#if NKSYMS || defined(DDB) || defined(LKM) 359 ksyms_init(0, 0, 0); 360#endif 361 362#ifdef DDB 363 if (boothowto & RB_KDB) 364 Debugger(); 365#endif 366} 367 368void 369consinit(void) 370{ 371 372 /* 373 * Everything related to console initialization is done 374 * in mach_init(). 375 */ 376#if NCOM > 0 377 /* Setup polled serial for early console I/O */ 378 /* XXX: pass in CONSPEED? */ 379 com_arbus_cnattach(AR531X_UART0_BASE); 380#else 381 panic("Not configured to use serial console!\n"); 382 /* not going to see that message now, are we? */ 383#endif 384} 385 386void 387cpu_startup(void) 388{ 389 char pbuf[9]; 390 vaddr_t minaddr, maxaddr; 391#ifdef DEBUG 392 extern int pmapdebug; /* XXX */ 393 int opmapdebug = pmapdebug; 394 395 pmapdebug = 0; /* Shut up pmap debug during bootstrap */ 396#endif 397 398 /* 399 * Good {morning,afternoon,evening,night}. 400 */ 401 printf("%s%s", copyright, version); 402 printf("%s\n", cpu_model); 403 format_bytes(pbuf, sizeof(pbuf), ctob(physmem)); 404 printf("total memory = %s\n", pbuf); 405 406 minaddr = 0; 407 /* 408 * Allocate a submap for exec arguments. This map effectively 409 * limits the number of processes exec'ing at any time. 410 */ 411 exec_map = uvm_km_suballoc(kernel_map, &minaddr, &maxaddr, 412 16 * NCARGS, VM_MAP_PAGEABLE, FALSE, NULL); 413 414 /* 415 * Allocate a submap for physio 416 */ 417 phys_map = uvm_km_suballoc(kernel_map, &minaddr, &maxaddr, 418 VM_PHYS_SIZE, 0, FALSE, NULL); 419 420 /* 421 * No need to allocate an mbuf cluster submap. Mbuf clusters 422 * are allocated via the pool allocator, and we use KSEG to 423 * map those pages. 424 */ 425 426#ifdef DEBUG 427 pmapdebug = opmapdebug; 428#endif 429 format_bytes(pbuf, sizeof(pbuf), ptoa(uvmexp.free)); 430 printf("avail memory = %s\n", pbuf); 431} 432 433void 434cpu_reboot(int howto, char *bootstr) 435{ 436 static int waittime = -1; 437 438 /* Take a snapshot before clobbering any registers. */ 439 if (curproc) 440 savectx((struct user *)curpcb); 441 442 /* If "always halt" was specified as a boot flag, obey. */ 443 if (boothowto & RB_HALT) 444 howto |= RB_HALT; 445 446 boothowto = howto; 447 448 /* If system is cold, just halt. */ 449 if (cold) { 450 boothowto |= RB_HALT; 451 goto haltsys; 452 } 453 454 if ((boothowto & RB_NOSYNC) == 0 && waittime < 0) { 455 waittime = 0; 456 457 /* 458 * Synchronize the disks.... 459 */ 460 vfs_shutdown(); 461 462 /* 463 * If we've been adjusting the clock, the todr 464 * will be out of synch; adjust it now. 465 */ 466 resettodr(); 467 } 468 469 /* Disable interrupts. */ 470 splhigh(); 471 472 if (boothowto & RB_DUMP) 473 dumpsys(); 474 475 haltsys: 476 /* Run any shutdown hooks. */ 477 doshutdownhooks(); 478 479#if 0 480 if ((boothowto & RB_POWERDOWN) == RB_POWERDOWN) 481 if (board && board->ab_poweroff) 482 board->ab_poweroff(); 483#endif 484 485 /* 486 * Firmware may autoboot (depending on settings), and we cannot pass 487 * flags to it (at least I haven't figured out how to yet), so 488 * we "pseudo-halt" now. 489 */ 490 if (boothowto & RB_HALT) { 491 printf("\n"); 492 printf("The operating system has halted.\n"); 493 printf("Please press any key to reboot.\n\n"); 494 cnpollc(1); /* For proper keyboard command handling */ 495 cngetc(); 496 cnpollc(0); 497 } 498 499 printf("reseting board...\n\n"); 500 mips_icache_sync_all(); 501 mips_dcache_wbinv_all(); 502 __asm volatile("jr %0" :: "r"(MIPS_RESET_EXC_VEC)); 503 printf("Oops, back from reset\n\nSpinning..."); 504 for (;;) 505 /* spin forever */ ; /* XXX */ 506 /*NOTREACHED*/ 507} 508