2 * This program is free software; you can redistribute it and/or modify it
3 * under the terms of the GNU General Public License as published by the
4 * Free Software Foundation; either version 2 of the License, or (at your
5 * option) any later version.
7 * Copyright (C) 2003 PMC-Sierra Inc.
8 * Author: Manish Lachwani (lachwani@pmc-sierra.com)
10 #include <linux/init.h>
11 #include <linux/sched.h>
13 #include <linux/delay.h>
14 #include <linux/smp.h>
17 #include <asm/pgtable.h>
18 #include <asm/processor.h>
19 #include <asm/reboot.h>
20 #include <asm/system.h>
21 #include <asm/bootinfo.h>
26 struct callvectors *debug_vectors;
28 extern unsigned long yosemite_base;
29 extern unsigned long cpu_clock;
31 const char *get_system_type(void)
33 return "PMC-Sierra Yosemite";
36 static void prom_cpu0_exit(void *arg)
38 void *nvram = (void *) YOSEMITE_NVRAM_BASE_ADDR;
40 /* Ask the NVRAM/RTC/watchdog chip to assert reset in 1/16 second */
41 writeb(0x84, nvram + 0xff7);
43 /* wait for the watchdog to go off */
44 mdelay(100 + (1000 / 16));
46 /* if the watchdog fails for some reason, let people know */
47 printk(KERN_NOTICE "Watchdog reset failed\n");
51 * Reset the NVRAM over the local bus
53 static void prom_exit(void)
56 if (smp_processor_id())
58 smp_call_function(prom_cpu0_exit, NULL, 1, 1);
66 static void prom_halt(void)
68 printk(KERN_NOTICE "\n** You can safely turn off the power\n");
70 __asm__(".set\tmips3\n\t" "wait\n\t" ".set\tmips0");
74 * Init routine which accepts the variables from PMON
76 void __init prom_init(void)
79 char **arg = (char **) fw_arg1;
80 char **env = (char **) fw_arg2;
81 struct callvectors *cv = (struct callvectors *) fw_arg3;
84 /* Callbacks for halt, restart */
85 _machine_restart = (void (*)(char *)) prom_exit;
86 _machine_halt = prom_halt;
87 _machine_power_off = prom_halt;
92 arcs_cmdline[0] = '\0';
94 /* Get the boot parameters */
95 for (i = 1; i < argc; i++) {
96 if (strlen(arcs_cmdline) + strlen(arg[i] + 1) >=
100 strcat(arcs_cmdline, arg[i]);
101 strcat(arcs_cmdline, " ");
105 if (strncmp("ocd_base", *env, strlen("ocd_base")) == 0)
107 simple_strtol(*env + strlen("ocd_base="), NULL,
110 if (strncmp("cpuclock", *env, strlen("cpuclock")) == 0)
112 simple_strtol(*env + strlen("cpuclock="), NULL,
117 #endif /* CONFIG_MIPS32 */
121 /* Do nothing for the 64-bit for now. Just implement for the 32-bit */
123 #endif /* CONFIG_MIPS64 */
125 mips_machgroup = MACH_GROUP_TITAN;
126 mips_machtype = MACH_TITAN_YOSEMITE;
129 void __init prom_free_prom_memory(void)
133 void __init prom_fixup_mem_map(unsigned long start, unsigned long end)