1187498Simp/*- 2187498Simp * Copyright (C) 2007 by Oleksandr Tymoshenko. All rights reserved. 3187498Simp * 4187498Simp * Redistribution and use in source and binary forms, with or without 5187498Simp * modification, are permitted provided that the following conditions 6187498Simp * are met: 7187498Simp * 1. Redistributions of source code must retain the above copyright 8187498Simp * notice, this list of conditions and the following disclaimer. 9187498Simp * 2. Redistributions in binary form must reproduce the above copyright 10187498Simp * notice, this list of conditions and the following disclaimer in the 11187498Simp * documentation and/or other materials provided with the distribution. 12187498Simp * 13187498Simp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 14187498Simp * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 15187498Simp * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 16187498Simp * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT, 17187498Simp * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18187498Simp * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 19187498Simp * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20187498Simp * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 21187498Simp * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 22187498Simp * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23187498Simp * THE POSSIBILITY OF SUCH DAMAGE. 24187498Simp * 25187498Simp */ 26187498Simp 27187498Simp#include <sys/cdefs.h> 28187498Simp__FBSDID("$FreeBSD$"); 29187498Simp 30187498Simp#include "opt_ddb.h" 31187498Simp 32187498Simp#include <sys/param.h> 33187498Simp#include <sys/conf.h> 34187498Simp#include <sys/kernel.h> 35187498Simp#include <sys/systm.h> 36187498Simp#include <sys/imgact.h> 37187498Simp#include <sys/bio.h> 38187498Simp#include <sys/buf.h> 39187498Simp#include <sys/bus.h> 40187498Simp#include <sys/cpu.h> 41187498Simp#include <sys/cons.h> 42187498Simp#include <sys/exec.h> 43187498Simp#include <sys/ucontext.h> 44187498Simp#include <sys/proc.h> 45187498Simp#include <sys/kdb.h> 46187498Simp#include <sys/ptrace.h> 47187498Simp#include <sys/reboot.h> 48187498Simp#include <sys/signalvar.h> 49187498Simp#include <sys/sysent.h> 50187498Simp#include <sys/sysproto.h> 51187498Simp#include <sys/user.h> 52187498Simp 53187498Simp#include <vm/vm.h> 54187498Simp#include <vm/vm_object.h> 55187498Simp#include <vm/vm_page.h> 56187498Simp 57187498Simp#include <machine/cache.h> 58187498Simp#include <machine/clock.h> 59187498Simp#include <machine/cpu.h> 60187498Simp#include <machine/cpuinfo.h> 61187498Simp#include <machine/cpufunc.h> 62187498Simp#include <machine/cpuregs.h> 63187498Simp#include <machine/hwfunc.h> 64187498Simp#include <machine/intr_machdep.h> 65187498Simp#include <machine/locore.h> 66187498Simp#include <machine/md_var.h> 67187498Simp#include <machine/pte.h> 68187498Simp#include <machine/sigframe.h> 69187498Simp#include <machine/trap.h> 70187498Simp#include <machine/vmparam.h> 71187498Simp 72187498Simpextern int *edata; 73187498Simpextern int *end; 74187498Simp 75198669Srrsvoid 76198669Srrsplatform_cpu_init() 77198669Srrs{ 78198669Srrs /* Nothing special */ 79198669Srrs} 80198669Srrs 81187498Simpstatic void 82187498Simpmips_init(void) 83187498Simp{ 84187498Simp int i; 85187498Simp 86187498Simp printf("entry: mips_init()\n"); 87187498Simp 88187498Simp bootverbose = 1; 89187498Simp realmem = btoc(16 << 20); 90187498Simp 91187498Simp for (i = 0; i < 10; i++) { 92187498Simp phys_avail[i] = 0; 93187498Simp } 94187498Simp 95187498Simp /* phys_avail regions are in bytes */ 96202954Sgonzo phys_avail[0] = MIPS_KSEG0_TO_PHYS(kernel_kseg0_end); 97187498Simp phys_avail[1] = ctob(realmem); 98187498Simp 99216318Sgonzo dump_avail[0] = phys_avail[0]; 100216320Sgonzo dump_avail[1] = phys_avail[1]; 101216318Sgonzo 102187498Simp physmem = realmem; 103187498Simp 104187498Simp init_param1(); 105187498Simp init_param2(physmem); 106187498Simp mips_cpu_init(); 107187498Simp pmap_bootstrap(); 108187498Simp mips_proc0_init(); 109187498Simp mutex_init(); 110202849Simp 111187498Simp kdb_init(); 112202849Simp#ifdef KDB 113202849Simp if (boothowto & RB_KDB) 114202849Simp kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger"); 115187498Simp#endif 116187498Simp} 117187498Simp 118187498Simpvoid 119187498Simpplatform_reset(void) 120187498Simp{ 121187498Simp 122187498Simp __asm __volatile("li $25, 0xbfc00000"); 123187498Simp __asm __volatile("j $25"); 124187498Simp} 125187498Simp 126187498Simpvoid 127187498Simpplatform_start(__register_t a0 __unused, __register_t a1 __unused, 128187498Simp __register_t a2 __unused, __register_t a3 __unused) 129187498Simp{ 130187498Simp vm_offset_t kernend; 131187498Simp uint64_t platform_counter_freq = 175 * 1000 * 1000; 132187498Simp 133187498Simp /* clear the BSS and SBSS segments */ 134202954Sgonzo kernend = (vm_offset_t)&end; 135187498Simp memset(&edata, 0, kernend - (vm_offset_t)(&edata)); 136187498Simp 137202954Sgonzo mips_postboot_fixup(); 138202954Sgonzo 139201845Simp /* Initialize pcpu stuff */ 140201881Simp mips_pcpu0_init(); 141201845Simp 142187498Simp cninit(); 143187498Simp mips_init(); 144187498Simp /* Set counter_freq for tick_init_params() */ 145187498Simp platform_counter_freq = 175 * 1000 * 1000; 146187498Simp 147187498Simp mips_timer_init_params(platform_counter_freq, 0); 148187498Simp} 149