idt_machdep.c revision 202849
1/*- 2 * Copyright (C) 2007 by Oleksandr Tymoshenko. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 15 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 16 * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT, 17 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 19 * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 21 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 22 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 * 25 * $Id: $ 26 * 27 */ 28 29#include <sys/cdefs.h> 30__FBSDID("$FreeBSD: head/sys/mips/idt/idt_machdep.c 202849 2010-01-23 00:18:12Z imp $"); 31 32#include "opt_ddb.h" 33 34#include <sys/param.h> 35#include <sys/conf.h> 36#include <sys/kernel.h> 37#include <sys/systm.h> 38#include <sys/imgact.h> 39#include <sys/bio.h> 40#include <sys/buf.h> 41#include <sys/bus.h> 42#include <sys/cpu.h> 43#include <sys/cons.h> 44#include <sys/exec.h> 45#include <sys/ucontext.h> 46#include <sys/proc.h> 47#include <sys/kdb.h> 48#include <sys/ptrace.h> 49#include <sys/reboot.h> 50#include <sys/signalvar.h> 51#include <sys/sysent.h> 52#include <sys/sysproto.h> 53#include <sys/user.h> 54 55#include <vm/vm.h> 56#include <vm/vm_object.h> 57#include <vm/vm_page.h> 58#include <vm/vm_pager.h> 59 60#include <machine/cache.h> 61#include <machine/clock.h> 62#include <machine/cpu.h> 63#include <machine/cpuinfo.h> 64#include <machine/cpufunc.h> 65#include <machine/cpuregs.h> 66#include <machine/hwfunc.h> 67#include <machine/intr_machdep.h> 68#include <machine/locore.h> 69#include <machine/md_var.h> 70#include <machine/pte.h> 71#include <machine/sigframe.h> 72#include <machine/trap.h> 73#include <machine/vmparam.h> 74 75extern int *edata; 76extern int *end; 77 78void 79platform_cpu_init() 80{ 81 /* Nothing special */ 82} 83 84void 85platform_halt(void) 86{ 87 88} 89 90 91void 92platform_identify(void) 93{ 94 95} 96 97void 98platform_reset(void) 99{ 100 volatile unsigned int * p = (void *)0xb8008000; 101 /* 102 * TODO: we should take care of TLB stuff here. Otherwise 103 * board does not boots properly next time 104 */ 105 106 /* Write 0x8000_0001 to the Reset register */ 107 *p = 0x80000001; 108 109 __asm __volatile("li $25, 0xbfc00000"); 110 __asm __volatile("j $25"); 111} 112 113void 114platform_trap_enter(void) 115{ 116 117} 118 119void 120platform_trap_exit(void) 121{ 122 123} 124 125void 126platform_start(__register_t a0, __register_t a1, 127 __register_t a2 __unused, __register_t a3 __unused) 128{ 129 uint64_t platform_counter_freq; 130 vm_offset_t kernend; 131 int argc = a0; 132 char **argv = (char **)a1; 133 int i, mem; 134 135 136 /* clear the BSS and SBSS segments */ 137 kernend = round_page((vm_offset_t)&end); 138 memset(&edata, 0, kernend - (vm_offset_t)(&edata)); 139 140 /* Initialize pcpu stuff */ 141 mips_pcpu0_init(); 142 143 /* 144 * Looking for mem=XXM argument 145 */ 146 mem = 0; /* Just something to start with */ 147 for (i=0; i < argc; i++) { 148 if (strncmp(argv[i], "mem=", 4) == 0) { 149 mem = strtol(argv[i] + 4, NULL, 0); 150 break; 151 } 152 } 153 154 bootverbose = 1; 155 if (mem > 0) 156 realmem = btoc(mem << 20); 157 else 158 realmem = btoc(32 << 20); 159 160 for (i = 0; i < 10; i++) { 161 phys_avail[i] = 0; 162 } 163 164 /* phys_avail regions are in bytes */ 165 phys_avail[0] = MIPS_KSEG0_TO_PHYS((vm_offset_t)&end); 166 phys_avail[1] = ctob(realmem); 167 168 physmem = realmem; 169 170 /* 171 * ns8250 uart code uses DELAY so ticker should be inititalized 172 * before cninit. And tick_init_params refers to hz, so * init_param1 173 * should be called first. 174 */ 175 init_param1(); 176 /* TODO: parse argc,argv */ 177 platform_counter_freq = 330000000UL; 178 mips_timer_init_params(platform_counter_freq, 1); 179 cninit(); 180 /* Panic here, after cninit */ 181 if (mem == 0) 182 panic("No mem=XX parameter in arguments"); 183 184 printf("cmd line: "); 185 for (i=0; i < argc; i++) 186 printf("%s ", argv[i]); 187 printf("\n"); 188 189 init_param2(physmem); 190 mips_cpu_init(); 191 pmap_bootstrap(); 192 mips_proc0_init(); 193 mutex_init(); 194 kdb_init(); 195#ifdef KDB 196 if (boothowto & RB_KDB) 197 kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger"); 198#endif 199} 200