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