1 /* $NetBSD: machdep.c,v 1.13 2009/11/27 03:23:08 rmind Exp $ */
4 * Copyright (c) 2007 Ruslan Ermilov and Vsevolod Lobko.
7 * Redistribution and use in source and binary forms, with or
8 * without modification, are permitted provided that the following
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following
14 * disclaimer in the documentation and/or other materials provided
15 * with the distribution.
16 * 3. The names of the authors may not be used to endorse or promote
17 * products derived from this software without specific prior
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY
21 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
23 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS
24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
25 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
27 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
29 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
30 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
34 * Copyright (c) 1992, 1993
35 * The Regents of the University of California. All rights reserved.
37 * This code is derived from software contributed to Berkeley by
38 * the Systems Programming Group of the University of Utah Computer
39 * Science Department, The Mach Operating System project at
40 * Carnegie-Mellon University and Ralph Campbell.
42 * Redistribution and use in source and binary forms, with or without
43 * modification, are permitted provided that the following conditions
45 * 1. Redistributions of source code must retain the above copyright
46 * notice, this list of conditions and the following disclaimer.
47 * 2. Redistributions in binary form must reproduce the above copyright
48 * notice, this list of conditions and the following disclaimer in the
49 * documentation and/or other materials provided with the distribution.
50 * 3. Neither the name of the University nor the names of its contributors
51 * may be used to endorse or promote products derived from this software
52 * without specific prior written permission.
54 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
55 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
56 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
57 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
58 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
59 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
60 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
61 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
62 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
63 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
66 * @(#)machdep.c 8.3 (Berkeley) 1/12/94
67 * from: Utah Hdr: machdep.c 1.63 91/04/24
70 * Copyright (c) 1988 University of Utah.
72 * This code is derived from software contributed to Berkeley by
73 * the Systems Programming Group of the University of Utah Computer
74 * Science Department, The Mach Operating System project at
75 * Carnegie-Mellon University and Ralph Campbell.
77 * Redistribution and use in source and binary forms, with or without
78 * modification, are permitted provided that the following conditions
80 * 1. Redistributions of source code must retain the above copyright
81 * notice, this list of conditions and the following disclaimer.
82 * 2. Redistributions in binary form must reproduce the above copyright
83 * notice, this list of conditions and the following disclaimer in the
84 * documentation and/or other materials provided with the distribution.
85 * 3. All advertising materials mentioning features or use of this software
86 * must display the following acknowledgement:
87 * This product includes software developed by the University of
88 * California, Berkeley and its contributors.
89 * 4. Neither the name of the University nor the names of its contributors
90 * may be used to endorse or promote products derived from this software
91 * without specific prior written permission.
93 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
94 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
95 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
96 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
97 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
98 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
99 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
101 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
102 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
105 * @(#)machdep.c 8.3 (Berkeley) 1/12/94
106 * from: Utah Hdr: machdep.c 1.63 91/04/24
109 #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
110 __KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.13 2009/11/27 03:23:08 rmind Exp $");
113 #include "opt_kgdb.h"
115 #include "opt_memsize.h"
116 #include "opt_modular.h"
117 #include "opt_ethaddr.h"
122 #include <sys/param.h>
123 #include <sys/systm.h>
124 #include <sys/kernel.h>
126 #include <sys/reboot.h>
127 #include <sys/mount.h>
128 #include <sys/kcore.h>
129 #include <sys/boot_flag.h>
130 #include <sys/termios.h>
131 #include <sys/ksyms.h>
132 #include <sys/device.h>
135 #include <net/if_ether.h>
137 #include <uvm/uvm_extern.h>
139 #include <dev/cons.h>
143 #if NKSYMS || defined(DDB) || defined(MODULAR)
144 #include <machine/db_machdep.h>
145 #include <ddb/db_extern.h>
148 #include <mips/cache.h>
149 #include <mips/locore.h>
151 #include <mips/adm5120/include/adm5120reg.h>
152 #include <mips/adm5120/include/adm5120var.h>
153 #include <mips/adm5120/include/adm5120_extiovar.h>
154 #include <mips/adm5120/include/adm5120_obiovar.h>
155 #include <mips/adm5120/include/adm5120_mainbusvar.h>
156 #include <mips/adm5120/include/adm5120_pcivar.h>
157 #include <mips/adm5120/dev/uart.h>
160 #define MEMSIZE 4 * 1024 * 1024
161 #endif /* !MEMSIZE */
163 /* Our exported CPU info; we can have only one. */
164 struct cpu_info cpu_info_store
;
166 /* Maps for VM objects. */
167 struct vm_map
*mb_map
= NULL
;
168 struct vm_map
*phys_map
= NULL
;
170 int maxmem
; /* max memory per process */
173 phys_ram_seg_t mem_clusters
[VM_PHYSSEG_MAX
];
175 struct adm5120_config adm5120_configuration
;
177 void adm5120_setcpufreq(void);
180 adm5120_setcpufreq(void)
184 v
= SW_READ(SW_CODE_REG
);
185 switch (v
& CLKS_MASK
) {
187 freq
= 175 * 1000 * 1000;
190 freq
= 200 * 1000 * 1000;
193 panic("adm5120: cannot determine CPU clock speed");
196 curcpu()->ci_cpu_freq
= freq
;
197 curcpu()->ci_cycles_per_hz
= (freq
+ hz
/ 2) / hz
/ 2;
198 curcpu()->ci_divisor_delay
= ((freq
+ 500000) / 1000000) / 2;
201 void mach_init(int, char **, void *, void *); /* XXX */
204 copy_args(int argc
, char **argv
)
206 struct adm5120_config
*admc
= &adm5120_configuration
;
212 buflen
= sizeof(admc
->args
);
214 if (argc
>= __arraycount(admc
->argv
))
215 panic("%s: too many boot args\n", __func__
);
217 for (i
= 0; buflen
> 0 && i
< argc
&& argv
[i
] != NULL
; i
++) {
219 if ((rc
= strlcpy(buf
, argv
[i
], buflen
)) >= buflen
)
220 panic("%s: boot args too long\n", __func__
);
228 panic("%s: boot args too long\n", __func__
);
234 parse_args(prop_dictionary_t properties
, int argc
, char **argv
,
238 char *key
, *val
, *valend
;
241 uint8_t enaddr
[ETHER_ADDR_LEN
];
243 if (memsizep
!= NULL
)
246 for (i
= 0; i
< argc
&& argv
[i
] != NULL
; i
++) {
247 if (strlcpy(buf
, argv
[i
], sizeof(buf
)) >= sizeof(buf
))
250 key
= strsep(&val
, "=");
253 if (strcmp(key
, "mem") == 0) {
254 tmp
= strtoul(val
, &valend
, 10);
255 if (val
== valend
|| *valend
!= 'M')
257 if (memsizep
!= NULL
)
258 *memsizep
= tmp
* 1024 * 1024;
259 } else if (strcmp(key
, "HZ") == 0)
261 else if (strcmp(key
, "gpio") == 0) {
264 tmp
= strtoul(val
, &valend
, 10);
265 if (val
== valend
|| *valend
!= '\0')
267 if (properties
== NULL
)
269 pn
= prop_number_create_unsigned_integer(tmp
);
272 "%s: prop_number_create_unsigned_integer\n",
276 if (!prop_dictionary_set(properties
, "initial-gpio",
278 printf("%s: prop_dictionary_set(gpio)\n",
281 prop_object_release(pn
);
282 } else if (strcmp(key
, "kmac") == 0) {
285 ether_nonstatic_aton(enaddr
, val
);
286 if (properties
== NULL
)
288 pd
= prop_data_create_data(enaddr
, sizeof(enaddr
));
290 printf("%s: prop_data_create_data\n", __func__
);
293 if (!prop_dictionary_set(properties
, "mac-addr", pd
)) {
294 printf("%s: prop_dictionary_set(mac)\n",
297 prop_object_release(pd
);
298 } else if (strcmp(key
, "board") == 0)
299 printf("Routerboard %s\n", val
);
300 else if (strcmp(key
, "boot") == 0)
304 printf("bad argv[%d] (%s)\n", i
, argv
[i
]);
309 mach_init(int argc
, char **argv
, void *a2
, void *a3
)
311 struct adm5120_config
*admc
= &adm5120_configuration
;
318 extern char edata
[], end
[]; /* XXX */
320 /* clear the BSS segment */
321 kernend
= mips_round_page(end
);
322 memset(edata
, 0, kernend
- (vaddr_t
)edata
);
324 /* set CPU model info for sysctl_hw */
325 strcpy(cpu_model
, "Infineon ADM5120");
328 * Set up the exception vectors and CPU-specific function
329 * vectors early on. We need the wbflush() vector set up
330 * before comcnattach() is called (or at least before the
331 * first printf() after that is called).
332 * Sets up mips_cpu_flags that may be queried by other
333 * functions called during startup.
334 * Also clears the I+D caches.
339 * Set the VM page size.
343 adm5120_setcpufreq();
346 * Initialize bus space tags.
348 obio_bus_mem_init(&admc
->obio_space
, admc
);
349 extio_bus_mem_init(&admc
->extio_space
, admc
);
351 pciio_bus_mem_init(&admc
->pciio_space
, admc
);
352 pcimem_bus_mem_init(&admc
->pcimem_space
, admc
);
356 * Initialize bus DMA tag.
358 obio_dma_init(&admc
->obio_dmat
);
361 * Attach serial console.
366 * Look at arguments passed to us and compute boothowto.
368 boothowto
= RB_AUTOBOOT
;
373 parse_args(NULL
, argc
, argv
, &memsize
);
376 * Determine the memory size.
378 * Note: Reserve the first page! That's where the trap
379 * vectors are located.
383 if (GET_MEMSIZE(memsize
) == 0) {
386 /* This does not seem to work... --dyoung */
387 val
= SW_READ(SW_MEMCONT_REG
);
388 printf("SW_MEMCONT_REG: 0x%08" PRIx32
"\n", val
);
389 switch (val
& SDRAM_SIZE_MASK
) {
390 case SDRAM_SIZE_4MBYTES
:
391 memsize
= 4 * 1024 * 1024;
393 case SDRAM_SIZE_8MBYTES
:
394 memsize
= 8 * 1024 * 1024;
396 case SDRAM_SIZE_16MBYTES
:
397 memsize
= 16 * 1024 * 1024;
399 case SDRAM_SIZE_64MBYTES
:
400 memsize
= 64 * 1024 * 1024;
402 case SDRAM_SIZE_128MBYTES
:
403 memsize
= 128 * 1024 * 1024;
406 panic("adm5120: cannot determine memory size");
411 physmem
= btoc(memsize
);
413 mem_clusters
[mem_cluster_cnt
].start
= PAGE_SIZE
;
414 mem_clusters
[mem_cluster_cnt
].size
=
415 memsize
- mem_clusters
[mem_cluster_cnt
].start
;
419 * Load the rest of the available pages into the VM system.
421 first
= round_page(MIPS_KSEG0_TO_PHYS(kernend
));
422 last
= mem_clusters
[0].start
+ mem_clusters
[0].size
;
423 uvm_page_physload(atop(first
), atop(last
), atop(first
), atop(last
),
424 VM_FREELIST_DEFAULT
);
427 * Initialize message buffer (at end of core).
432 * Initialize the virtual memory system.
437 * Allocate uarea page for lwp0 and set it.
439 mips_init_lwp0_uarea();
442 * Initialize debuggers, and break into them, if appropriate.
445 if (boothowto
& RB_KDB
)
449 copy_args(argc
, argv
);
457 * Everything related to console initialization is done
465 struct adm5120_config
*admc
= &adm5120_configuration
;
467 vaddr_t minaddr
, maxaddr
;
469 extern int pmapdebug
; /* XXX */
470 int opmapdebug
= pmapdebug
;
472 pmapdebug
= 0; /* Shut up pmap debug during bootstrap */
475 if ((admc
->properties
= prop_dictionary_create()) == NULL
)
476 printf("%s: prop_dictionary_create\n", __func__
);
477 parse_args(admc
->properties
, admc
->argc
, admc
->argv
, NULL
);
480 * Good {morning,afternoon,evening,night}.
482 printf("%s%s", copyright
, version
);
483 printf("%s\n", cpu_model
);
484 format_bytes(pbuf
, sizeof(pbuf
), ctob(physmem
));
485 printf("total memory = %s\n", pbuf
);
490 * Allocate a submap for physio
492 phys_map
= uvm_km_suballoc(kernel_map
, &minaddr
, &maxaddr
,
493 VM_PHYS_SIZE
, 0, FALSE
, NULL
);
496 * No need to allocate an mbuf cluster submap. Mbuf clusters
497 * are allocated via the pool allocator, and we use KSEG to
502 pmapdebug
= opmapdebug
;
504 format_bytes(pbuf
, sizeof(pbuf
), ptoa(uvmexp
.free
));
505 printf("avail memory = %s\n", pbuf
);
509 cpu_reboot(int howto
, char *bootstr
)
511 static int waittime
= -1;
513 /* Take a snapshot before clobbering any registers. */
517 /* If "always halt" was specified as a boot flag, obey. */
518 if (boothowto
& RB_HALT
)
523 /* If system is cold, just halt. */
525 boothowto
|= RB_HALT
;
529 if ((boothowto
& RB_NOSYNC
) == 0 && waittime
< 0) {
533 * Synchronize the disks....
538 * If we've been adjusting the clock, the todr
539 * will be out of synch; adjust it now.
544 /* Disable interrupts. */
547 if (boothowto
& RB_DUMP
)
551 /* Run any shutdown hooks. */
554 pmf_system_shutdown(boothowto
);
557 * Routerboard BIOS may autoboot, so "pseudo-halt".
559 if (boothowto
& RB_HALT
) {
561 printf("The operating system has halted.\n");
562 printf("Please press any key to reboot.\n\n");
563 cnpollc(1); /* For proper keyboard command handling */
568 printf("reseting board...\n\n");
569 mips_icache_sync_all();
570 mips_dcache_wbinv_all();
571 SW_WRITE(SW_SFTRES_REG
, 0); /* reset */
573 /* spin forever */ ; /* XXX */