rt305x_machdep.c revision 256281
150276Speter/*- 2184989Srafan * Copyright (C) 2010-2011 by Aleksandr Rybalko. All rights reserved. 350276Speter * Copyright (C) 2007 by Oleksandr Tymoshenko. All rights reserved. 450276Speter * 550276Speter * Redistribution and use in source and binary forms, with or without 650276Speter * modification, are permitted provided that the following conditions 750276Speter * are met: 850276Speter * 1. Redistributions of source code must retain the above copyright 950276Speter * notice, this list of conditions and the following disclaimer. 1050276Speter * 2. Redistributions in binary form must reproduce the above copyright 1150276Speter * notice, this list of conditions and the following disclaimer in the 1250276Speter * documentation and/or other materials provided with the distribution. 1350276Speter * 1450276Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1550276Speter * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1650276Speter * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1750276Speter * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT, 1850276Speter * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 1950276Speter * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 2050276Speter * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2150276Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 2250276Speter * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 2350276Speter * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2450276Speter * THE POSSIBILITY OF SUCH DAMAGE. 2550276Speter * 2650276Speter */ 2750276Speter 2850276Speter#include <sys/cdefs.h> 2950276Speter__FBSDID("$FreeBSD: stable/10/sys/mips/rt305x/rt305x_machdep.c 247297 2013-02-26 01:00:11Z attilio $"); 3050276Speter 3150276Speter#include "opt_ddb.h" 3250276Speter 3350276Speter#include <sys/param.h> 3450276Speter#include <sys/conf.h> 3550276Speter#include <sys/kernel.h> 3650276Speter#include <sys/systm.h> 3750276Speter#include <sys/imgact.h> 3850276Speter#include <sys/bio.h> 3950276Speter#include <sys/buf.h> 4050276Speter#include <sys/bus.h> 4150276Speter#include <sys/cpu.h> 4250276Speter#include <sys/cons.h> 4350276Speter#include <sys/exec.h> 44184989Srafan#include <sys/ucontext.h> 4550276Speter#include <sys/proc.h> 4650276Speter#include <sys/kdb.h> 4750276Speter#include <sys/ptrace.h> 4850276Speter#include <sys/reboot.h> 4950276Speter#include <sys/signalvar.h> 5076726Speter#include <sys/sysent.h> 5176726Speter#include <sys/sysproto.h> 5250276Speter#include <sys/user.h> 5376726Speter 5476726Speter#include <vm/vm.h> 5576726Speter#include <vm/vm_object.h> 5676726Speter#include <vm/vm_page.h> 5776726Speter 5850276Speter#include <machine/cache.h> 5976726Speter#include <machine/clock.h> 6076726Speter#include <machine/cpu.h> 6176726Speter#include <machine/cpuinfo.h> 6276726Speter#include <machine/cpufunc.h> 6376726Speter#include <machine/cpuregs.h> 6476726Speter#include <machine/hwfunc.h> 6550276Speter#include <machine/intr_machdep.h> 6676726Speter#include <machine/locore.h> 6750276Speter#include <machine/md_var.h> 6876726Speter#include <machine/pte.h> 6976726Speter#include <machine/sigframe.h> 7050276Speter#include <machine/trap.h> 7150276Speter#include <machine/vmparam.h> 7276726Speter 73166124Srafan#include <mips/rt305x/rt305xreg.h> 74166124Srafan 75166124Srafanextern int *edata; 76166124Srafanextern int *end; 7750276Speterstatic char boot1_env[0x1000]; 78184989Srafan 7976726Speter 8076726Spetervoid 8176726Speterplatform_cpu_init() 8276726Speter{ 8376726Speter /* Nothing special */ 8476726Speter} 8576726Speter 8650276Speterstatic void 8776726Spetermips_init(void) 8850276Speter{ 8976726Speter int i; 9076726Speter 9150276Speter printf("entry: mips_init()\n"); 9276726Speter 9350276Speter bootverbose = 1; 94184989Srafan realmem = btoc(32 << 20); 95184989Srafan 96184989Srafan for (i = 0; i < 10; i++) { 97184989Srafan phys_avail[i] = 0; 9876726Speter } 9976726Speter 10076726Speter /* phys_avail regions are in bytes */ 10176726Speter dump_avail[0] = phys_avail[0] = MIPS_KSEG0_TO_PHYS(kernel_kseg0_end); 10250276Speter dump_avail[1] = phys_avail[1] = ctob(realmem); 10376726Speter 10476726Speter physmem = realmem; 10550276Speter 10676726Speter init_param1(); 10776726Speter init_param2(physmem); 10850276Speter mips_cpu_init(); 10976726Speter pmap_bootstrap(); 11076726Speter mips_proc0_init(); 11150276Speter mutex_init(); 112166124Srafan kdb_init(); 11376726Speter#ifdef KDB 11476726Speter if (boothowto & RB_KDB) 11576726Speter kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger"); 11676726Speter#endif 11776726Speter} 11876726Speter 11976726Spetervoid 12076726Speterplatform_reset(void) 12176726Speter{ 12276726Speter 12376726Speter __asm __volatile("li $25, 0xbf000000"); 12476726Speter __asm __volatile("j $25"); 12576726Speter} 12676726Speter 12776726Spetervoid 12876726Speterplatform_start(__register_t a0 __unused, __register_t a1 __unused, 129166124Srafan __register_t a2 __unused, __register_t a3 __unused) 130166124Srafan{ 131166124Srafan vm_offset_t kernend; 132166124Srafan uint64_t platform_counter_freq = PLATFORM_COUNTER_FREQ; 133166124Srafan int i; 134166124Srafan int argc = a0; 135166124Srafan char **argv = (char **)MIPS_PHYS_TO_KSEG0(a1); 136166124Srafan char **envp = (char **)MIPS_PHYS_TO_KSEG0(a2); 13776726Speter 13876726Speter /* clear the BSS and SBSS segments */ 13976726Speter kernend = (vm_offset_t)&end; 14076726Speter memset(&edata, 0, kernend - (vm_offset_t)(&edata)); 14176726Speter 14276726Speter mips_postboot_fixup(); 14376726Speter 14476726Speter /* Initialize pcpu stuff */ 14576726Speter mips_pcpu0_init(); 14676726Speter 14776726Speter /* initialize console so that we have printf */ 14876726Speter boothowto |= (RB_SERIAL | RB_MULTIPLE); /* Use multiple consoles */ 149184989Srafan boothowto |= (RB_VERBOSE); 15076726Speter cninit(); 15176726Speter 15276726Speter init_static_kenv(boot1_env, sizeof(boot1_env)); 15376726Speter 15476726Speter printf("U-Boot args (from %d args):\n", argc - 1); 15576726Speter 15676726Speter if (argc == 1) 15776726Speter printf("\tNone\n"); 15876726Speter 15976726Speter for (i = 1; i < argc; i++) { 16076726Speter char *n = "argv ", *arg; 16176726Speter 16276726Speter if (i > 99) 16376726Speter break; 16476726Speter 16576726Speter if (argv[i]) 16676726Speter { 16776726Speter arg = (char *)(intptr_t)MIPS_PHYS_TO_KSEG0(argv[i]); 16876726Speter printf("\targv[%d] = %s\n", i, arg); 16976726Speter sprintf(n, "argv%d", i); 17076726Speter setenv(n, arg); 17176726Speter } 17276726Speter } 17350276Speter 17476726Speter printf("Environment:\n"); 17576726Speter 17650276Speter for (i = 0; envp[i] ; i++) { 17776726Speter char *n, *arg; 17876726Speter 17950276Speter arg = (char *)(intptr_t)MIPS_PHYS_TO_KSEG0(envp[i]); 18076726Speter printf("\t%s\n", arg); 18150276Speter n = strsep(&arg, "="); 18276726Speter if (arg == NULL) 18376726Speter setenv(n, "1"); 18476726Speter else 18576726Speter setenv(n, arg); 18676726Speter } 18750276Speter 18876726Speter 18976726Speter mips_init(); 19076726Speter mips_timer_init_params(platform_counter_freq, 2); 191184989Srafan} 192184989Srafan