Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/m68k/sun3x/prom.c
10818 views
1
/* Prom access routines for the sun3x */
2
3
#include <linux/types.h>
4
#include <linux/kernel.h>
5
#include <linux/tty.h>
6
#include <linux/console.h>
7
#include <linux/init.h>
8
#include <linux/mm.h>
9
#include <linux/string.h>
10
11
#include <asm/page.h>
12
#include <asm/pgtable.h>
13
#include <asm/bootinfo.h>
14
#include <asm/setup.h>
15
#include <asm/traps.h>
16
#include <asm/sun3xprom.h>
17
#include <asm/idprom.h>
18
#include <asm/segment.h>
19
#include <asm/sun3ints.h>
20
#include <asm/openprom.h>
21
#include <asm/machines.h>
22
23
void (*sun3x_putchar)(int);
24
int (*sun3x_getchar)(void);
25
int (*sun3x_mayget)(void);
26
int (*sun3x_mayput)(int);
27
void (*sun3x_prom_reboot)(void);
28
e_vector sun3x_prom_abort;
29
struct linux_romvec *romvec;
30
31
/* prom vector table */
32
e_vector *sun3x_prom_vbr;
33
34
/* Handle returning to the prom */
35
void sun3x_halt(void)
36
{
37
unsigned long flags;
38
39
/* Disable interrupts while we mess with things */
40
local_irq_save(flags);
41
42
/* Restore prom vbr */
43
asm volatile ("movec %0,%%vbr" : : "r" ((void*)sun3x_prom_vbr));
44
45
/* Restore prom NMI clock */
46
// sun3x_disable_intreg(5);
47
sun3_enable_irq(7);
48
49
/* Let 'er rip */
50
asm volatile ("trap #14");
51
52
/* Restore everything */
53
sun3_disable_irq(7);
54
sun3_enable_irq(5);
55
56
asm volatile ("movec %0,%%vbr" : : "r" ((void*)vectors));
57
local_irq_restore(flags);
58
}
59
60
void sun3x_reboot(void)
61
{
62
/* This never returns, don't bother saving things */
63
local_irq_disable();
64
65
/* Restore prom vbr */
66
asm volatile ("movec %0,%%vbr" : : "r" ((void*)sun3x_prom_vbr));
67
68
/* Restore prom NMI clock */
69
sun3_disable_irq(5);
70
sun3_enable_irq(7);
71
72
/* Let 'er rip */
73
(*romvec->pv_reboot)("vmlinux");
74
}
75
76
static void sun3x_prom_write(struct console *co, const char *s,
77
unsigned int count)
78
{
79
while (count--) {
80
if (*s == '\n')
81
sun3x_putchar('\r');
82
sun3x_putchar(*s++);
83
}
84
}
85
86
/* debug console - write-only */
87
88
static struct console sun3x_debug = {
89
.name = "debug",
90
.write = sun3x_prom_write,
91
.flags = CON_PRINTBUFFER,
92
.index = -1,
93
};
94
95
void __init sun3x_prom_init(void)
96
{
97
/* Read the vector table */
98
99
sun3x_putchar = *(void (**)(int)) (SUN3X_P_PUTCHAR);
100
sun3x_getchar = *(int (**)(void)) (SUN3X_P_GETCHAR);
101
sun3x_mayget = *(int (**)(void)) (SUN3X_P_MAYGET);
102
sun3x_mayput = *(int (**)(int)) (SUN3X_P_MAYPUT);
103
sun3x_prom_reboot = *(void (**)(void)) (SUN3X_P_REBOOT);
104
sun3x_prom_abort = *(e_vector *) (SUN3X_P_ABORT);
105
romvec = (struct linux_romvec *)SUN3X_PROM_BASE;
106
107
idprom_init();
108
109
if (!((idprom->id_machtype & SM_ARCH_MASK) == SM_SUN3X)) {
110
printk("Warning: machine reports strange type %02x\n",
111
idprom->id_machtype);
112
printk("Pretending it's a 3/80, but very afraid...\n");
113
idprom->id_machtype = SM_SUN3X | SM_3_80;
114
}
115
116
/* point trap #14 at abort.
117
* XXX this is futile since we restore the vbr first - oops
118
*/
119
vectors[VEC_TRAP14] = sun3x_prom_abort;
120
}
121
122
static int __init sun3x_debug_setup(char *arg)
123
{
124
/* If debug=prom was specified, start the debug console */
125
if (MACH_IS_SUN3X && !strcmp(arg, "prom"))
126
register_console(&sun3x_debug);
127
return 0;
128
}
129
130
early_param("debug", sun3x_debug_setup);
131
132
/* some prom functions to export */
133
int prom_getintdefault(int node, char *property, int deflt)
134
{
135
return deflt;
136
}
137
138
int prom_getbool (int node, char *prop)
139
{
140
return 1;
141
}
142
143
void prom_printf(char *fmt, ...)
144
{
145
}
146
147
void prom_halt (void)
148
{
149
sun3x_halt();
150
}
151
152
/* Get the idprom and stuff it into buffer 'idbuf'. Returns the
153
* format type. 'num_bytes' is the number of bytes that your idbuf
154
* has space for. Returns 0xff on error.
155
*/
156
unsigned char
157
prom_get_idprom(char *idbuf, int num_bytes)
158
{
159
int i;
160
161
/* make a copy of the idprom structure */
162
for (i = 0; i < num_bytes; i++)
163
idbuf[i] = ((char *)SUN3X_IDPROM)[i];
164
165
return idbuf[0];
166
}
167
168