1220297Sadrian/*- 2220297Sadrian * Copyright (C) 2010-2011 by Aleksandr Rybalko. All rights reserved. 3220297Sadrian * Copyright (C) 2007 by Oleksandr Tymoshenko. All rights reserved. 4220297Sadrian * 5220297Sadrian * Redistribution and use in source and binary forms, with or without 6220297Sadrian * modification, are permitted provided that the following conditions 7220297Sadrian * are met: 8220297Sadrian * 1. Redistributions of source code must retain the above copyright 9220297Sadrian * notice, this list of conditions and the following disclaimer. 10220297Sadrian * 2. Redistributions in binary form must reproduce the above copyright 11220297Sadrian * notice, this list of conditions and the following disclaimer in the 12220297Sadrian * documentation and/or other materials provided with the distribution. 13220297Sadrian * 14220297Sadrian * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15220297Sadrian * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16220297Sadrian * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17220297Sadrian * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT, 18220297Sadrian * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 19220297Sadrian * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 20220297Sadrian * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21220297Sadrian * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 22220297Sadrian * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 23220297Sadrian * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 24220297Sadrian * THE POSSIBILITY OF SUCH DAMAGE. 25220297Sadrian * 26220297Sadrian */ 27220297Sadrian 28220297Sadrian#include <sys/cdefs.h> 29220297Sadrian__FBSDID("$FreeBSD: releng/10.3/sys/mips/rt305x/rt305x_machdep.c 247297 2013-02-26 01:00:11Z attilio $"); 30220297Sadrian 31220297Sadrian#include "opt_ddb.h" 32220297Sadrian 33220297Sadrian#include <sys/param.h> 34220297Sadrian#include <sys/conf.h> 35220297Sadrian#include <sys/kernel.h> 36220297Sadrian#include <sys/systm.h> 37220297Sadrian#include <sys/imgact.h> 38220297Sadrian#include <sys/bio.h> 39220297Sadrian#include <sys/buf.h> 40220297Sadrian#include <sys/bus.h> 41220297Sadrian#include <sys/cpu.h> 42220297Sadrian#include <sys/cons.h> 43220297Sadrian#include <sys/exec.h> 44220297Sadrian#include <sys/ucontext.h> 45220297Sadrian#include <sys/proc.h> 46220297Sadrian#include <sys/kdb.h> 47220297Sadrian#include <sys/ptrace.h> 48220297Sadrian#include <sys/reboot.h> 49220297Sadrian#include <sys/signalvar.h> 50220297Sadrian#include <sys/sysent.h> 51220297Sadrian#include <sys/sysproto.h> 52220297Sadrian#include <sys/user.h> 53220297Sadrian 54220297Sadrian#include <vm/vm.h> 55220297Sadrian#include <vm/vm_object.h> 56220297Sadrian#include <vm/vm_page.h> 57220297Sadrian 58220297Sadrian#include <machine/cache.h> 59220297Sadrian#include <machine/clock.h> 60220297Sadrian#include <machine/cpu.h> 61220297Sadrian#include <machine/cpuinfo.h> 62220297Sadrian#include <machine/cpufunc.h> 63220297Sadrian#include <machine/cpuregs.h> 64220297Sadrian#include <machine/hwfunc.h> 65220297Sadrian#include <machine/intr_machdep.h> 66220297Sadrian#include <machine/locore.h> 67220297Sadrian#include <machine/md_var.h> 68220297Sadrian#include <machine/pte.h> 69220297Sadrian#include <machine/sigframe.h> 70220297Sadrian#include <machine/trap.h> 71220297Sadrian#include <machine/vmparam.h> 72220297Sadrian 73220297Sadrian#include <mips/rt305x/rt305xreg.h> 74220297Sadrian 75220297Sadrianextern int *edata; 76220297Sadrianextern int *end; 77220297Sadrianstatic char boot1_env[0x1000]; 78220297Sadrian 79220297Sadrian 80220297Sadrianvoid 81220297Sadrianplatform_cpu_init() 82220297Sadrian{ 83220297Sadrian /* Nothing special */ 84220297Sadrian} 85220297Sadrian 86220297Sadrianstatic void 87220297Sadrianmips_init(void) 88220297Sadrian{ 89220297Sadrian int i; 90220297Sadrian 91220297Sadrian printf("entry: mips_init()\n"); 92220297Sadrian 93220297Sadrian bootverbose = 1; 94220297Sadrian realmem = btoc(32 << 20); 95220297Sadrian 96220297Sadrian for (i = 0; i < 10; i++) { 97220297Sadrian phys_avail[i] = 0; 98220297Sadrian } 99220297Sadrian 100220297Sadrian /* phys_avail regions are in bytes */ 101220297Sadrian dump_avail[0] = phys_avail[0] = MIPS_KSEG0_TO_PHYS(kernel_kseg0_end); 102220297Sadrian dump_avail[1] = phys_avail[1] = ctob(realmem); 103220297Sadrian 104220297Sadrian physmem = realmem; 105220297Sadrian 106220297Sadrian init_param1(); 107220297Sadrian init_param2(physmem); 108220297Sadrian mips_cpu_init(); 109220297Sadrian pmap_bootstrap(); 110220297Sadrian mips_proc0_init(); 111220297Sadrian mutex_init(); 112220297Sadrian kdb_init(); 113220297Sadrian#ifdef KDB 114220297Sadrian if (boothowto & RB_KDB) 115220297Sadrian kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger"); 116220297Sadrian#endif 117220297Sadrian} 118220297Sadrian 119220297Sadrianvoid 120220297Sadrianplatform_reset(void) 121220297Sadrian{ 122220297Sadrian 123220297Sadrian __asm __volatile("li $25, 0xbf000000"); 124220297Sadrian __asm __volatile("j $25"); 125220297Sadrian} 126220297Sadrian 127220297Sadrianvoid 128220297Sadrianplatform_start(__register_t a0 __unused, __register_t a1 __unused, 129220297Sadrian __register_t a2 __unused, __register_t a3 __unused) 130220297Sadrian{ 131220297Sadrian vm_offset_t kernend; 132220297Sadrian uint64_t platform_counter_freq = PLATFORM_COUNTER_FREQ; 133220297Sadrian int i; 134220297Sadrian int argc = a0; 135220297Sadrian char **argv = (char **)MIPS_PHYS_TO_KSEG0(a1); 136220297Sadrian char **envp = (char **)MIPS_PHYS_TO_KSEG0(a2); 137220297Sadrian 138220297Sadrian /* clear the BSS and SBSS segments */ 139220297Sadrian kernend = (vm_offset_t)&end; 140220297Sadrian memset(&edata, 0, kernend - (vm_offset_t)(&edata)); 141220297Sadrian 142220297Sadrian mips_postboot_fixup(); 143220297Sadrian 144220297Sadrian /* Initialize pcpu stuff */ 145220297Sadrian mips_pcpu0_init(); 146220297Sadrian 147220297Sadrian /* initialize console so that we have printf */ 148220297Sadrian boothowto |= (RB_SERIAL | RB_MULTIPLE); /* Use multiple consoles */ 149220297Sadrian boothowto |= (RB_VERBOSE); 150220297Sadrian cninit(); 151220297Sadrian 152220297Sadrian init_static_kenv(boot1_env, sizeof(boot1_env)); 153220297Sadrian 154220297Sadrian printf("U-Boot args (from %d args):\n", argc - 1); 155220297Sadrian 156220297Sadrian if (argc == 1) 157220297Sadrian printf("\tNone\n"); 158220297Sadrian 159220297Sadrian for (i = 1; i < argc; i++) { 160220297Sadrian char *n = "argv ", *arg; 161220297Sadrian 162220297Sadrian if (i > 99) 163220297Sadrian break; 164220297Sadrian 165220297Sadrian if (argv[i]) 166220297Sadrian { 167220297Sadrian arg = (char *)(intptr_t)MIPS_PHYS_TO_KSEG0(argv[i]); 168220297Sadrian printf("\targv[%d] = %s\n", i, arg); 169220297Sadrian sprintf(n, "argv%d", i); 170220297Sadrian setenv(n, arg); 171220297Sadrian } 172220297Sadrian } 173220297Sadrian 174220297Sadrian printf("Environment:\n"); 175220297Sadrian 176220297Sadrian for (i = 0; envp[i] ; i++) { 177220297Sadrian char *n, *arg; 178220297Sadrian 179220297Sadrian arg = (char *)(intptr_t)MIPS_PHYS_TO_KSEG0(envp[i]); 180220297Sadrian printf("\t%s\n", arg); 181220297Sadrian n = strsep(&arg, "="); 182220297Sadrian if (arg == NULL) 183220297Sadrian setenv(n, "1"); 184220297Sadrian else 185220297Sadrian setenv(n, arg); 186220297Sadrian } 187220297Sadrian 188220297Sadrian 189220297Sadrian mips_init(); 190220297Sadrian mips_timer_init_params(platform_counter_freq, 2); 191220297Sadrian} 192