Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/mips/pmc-sierra/yosemite/prom.c
15118 views
1
/*
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.
6
*
7
* Copyright (C) 2003, 2004 PMC-Sierra Inc.
8
* Author: Manish Lachwani ([email protected])
9
* Copyright (C) 2004 Ralf Baechle
10
*/
11
#include <linux/init.h>
12
#include <linux/sched.h>
13
#include <linux/mm.h>
14
#include <linux/delay.h>
15
#include <linux/pm.h>
16
#include <linux/smp.h>
17
18
#include <asm/io.h>
19
#include <asm/pgtable.h>
20
#include <asm/processor.h>
21
#include <asm/reboot.h>
22
#include <asm/smp-ops.h>
23
#include <asm/system.h>
24
#include <asm/bootinfo.h>
25
#include <asm/pmon.h>
26
27
#ifdef CONFIG_SMP
28
extern void prom_grab_secondary(void);
29
#else
30
#define prom_grab_secondary() do { } while (0)
31
#endif
32
33
#include "setup.h"
34
35
struct callvectors *debug_vectors;
36
37
extern unsigned long yosemite_base;
38
extern unsigned long cpu_clock_freq;
39
40
const char *get_system_type(void)
41
{
42
return "PMC-Sierra Yosemite";
43
}
44
45
static void prom_cpu0_exit(void *arg)
46
{
47
void *nvram = (void *) YOSEMITE_RTC_BASE;
48
49
/* Ask the NVRAM/RTC/watchdog chip to assert reset in 1/16 second */
50
writeb(0x84, nvram + 0xff7);
51
52
/* wait for the watchdog to go off */
53
mdelay(100 + (1000 / 16));
54
55
/* if the watchdog fails for some reason, let people know */
56
printk(KERN_NOTICE "Watchdog reset failed\n");
57
}
58
59
/*
60
* Reset the NVRAM over the local bus
61
*/
62
static void prom_exit(void)
63
{
64
#ifdef CONFIG_SMP
65
if (smp_processor_id())
66
/* CPU 1 */
67
smp_call_function(prom_cpu0_exit, NULL, 1);
68
#endif
69
prom_cpu0_exit(NULL);
70
}
71
72
/*
73
* Halt the system
74
*/
75
static void prom_halt(void)
76
{
77
printk(KERN_NOTICE "\n** You can safely turn off the power\n");
78
while (1)
79
__asm__(".set\tmips3\n\t" "wait\n\t" ".set\tmips0");
80
}
81
82
extern struct plat_smp_ops yos_smp_ops;
83
84
/*
85
* Init routine which accepts the variables from PMON
86
*/
87
void __init prom_init(void)
88
{
89
int argc = fw_arg0;
90
char **arg = (char **) fw_arg1;
91
char **env = (char **) fw_arg2;
92
struct callvectors *cv = (struct callvectors *) fw_arg3;
93
int i = 0;
94
95
/* Callbacks for halt, restart */
96
_machine_restart = (void (*)(char *)) prom_exit;
97
_machine_halt = prom_halt;
98
pm_power_off = prom_halt;
99
100
debug_vectors = cv;
101
arcs_cmdline[0] = '\0';
102
103
/* Get the boot parameters */
104
for (i = 1; i < argc; i++) {
105
if (strlen(arcs_cmdline) + strlen(arg[i] + 1) >=
106
sizeof(arcs_cmdline))
107
break;
108
109
strcat(arcs_cmdline, arg[i]);
110
strcat(arcs_cmdline, " ");
111
}
112
113
#ifdef CONFIG_SERIAL_8250_CONSOLE
114
if ((strstr(arcs_cmdline, "console=ttyS")) == NULL)
115
strcat(arcs_cmdline, "console=ttyS0,115200");
116
#endif
117
118
while (*env) {
119
if (strncmp("ocd_base", *env, strlen("ocd_base")) == 0)
120
yosemite_base =
121
simple_strtol(*env + strlen("ocd_base="), NULL,
122
16);
123
124
if (strncmp("cpuclock", *env, strlen("cpuclock")) == 0)
125
cpu_clock_freq =
126
simple_strtol(*env + strlen("cpuclock="), NULL,
127
10);
128
129
env++;
130
}
131
132
prom_grab_secondary();
133
134
register_smp_ops(&yos_smp_ops);
135
}
136
137
void __init prom_free_prom_memory(void)
138
{
139
}
140
141
void __init prom_fixup_mem_map(unsigned long start, unsigned long end)
142
{
143
}
144
145