Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/sparc/prom/misc_32.c
10818 views
1
/*
2
* misc.c: Miscellaneous prom functions that don't belong
3
* anywhere else.
4
*
5
* Copyright (C) 1995 David S. Miller ([email protected])
6
*/
7
8
#include <linux/types.h>
9
#include <linux/kernel.h>
10
#include <linux/sched.h>
11
#include <linux/module.h>
12
13
#include <asm/openprom.h>
14
#include <asm/oplib.h>
15
#include <asm/auxio.h>
16
#include <asm/system.h>
17
18
extern void restore_current(void);
19
20
DEFINE_SPINLOCK(prom_lock);
21
22
/* Reset and reboot the machine with the command 'bcommand'. */
23
void
24
prom_reboot(char *bcommand)
25
{
26
unsigned long flags;
27
spin_lock_irqsave(&prom_lock, flags);
28
(*(romvec->pv_reboot))(bcommand);
29
/* Never get here. */
30
restore_current();
31
spin_unlock_irqrestore(&prom_lock, flags);
32
}
33
34
/* Forth evaluate the expression contained in 'fstring'. */
35
void
36
prom_feval(char *fstring)
37
{
38
unsigned long flags;
39
if(!fstring || fstring[0] == 0)
40
return;
41
spin_lock_irqsave(&prom_lock, flags);
42
if(prom_vers == PROM_V0)
43
(*(romvec->pv_fortheval.v0_eval))(strlen(fstring), fstring);
44
else
45
(*(romvec->pv_fortheval.v2_eval))(fstring);
46
restore_current();
47
spin_unlock_irqrestore(&prom_lock, flags);
48
}
49
EXPORT_SYMBOL(prom_feval);
50
51
/* Drop into the prom, with the chance to continue with the 'go'
52
* prom command.
53
*/
54
void
55
prom_cmdline(void)
56
{
57
unsigned long flags;
58
59
spin_lock_irqsave(&prom_lock, flags);
60
(*(romvec->pv_abort))();
61
restore_current();
62
spin_unlock_irqrestore(&prom_lock, flags);
63
set_auxio(AUXIO_LED, 0);
64
}
65
66
/* Drop into the prom, but completely terminate the program.
67
* No chance of continuing.
68
*/
69
void __noreturn
70
prom_halt(void)
71
{
72
unsigned long flags;
73
again:
74
spin_lock_irqsave(&prom_lock, flags);
75
(*(romvec->pv_halt))();
76
/* Never get here. */
77
restore_current();
78
spin_unlock_irqrestore(&prom_lock, flags);
79
goto again; /* PROM is out to get me -DaveM */
80
}
81
82
typedef void (*sfunc_t)(void);
83
84
/* Set prom sync handler to call function 'funcp'. */
85
void
86
prom_setsync(sfunc_t funcp)
87
{
88
if(!funcp) return;
89
*romvec->pv_synchook = funcp;
90
}
91
92
/* Get the idprom and stuff it into buffer 'idbuf'. Returns the
93
* format type. 'num_bytes' is the number of bytes that your idbuf
94
* has space for. Returns 0xff on error.
95
*/
96
unsigned char
97
prom_get_idprom(char *idbuf, int num_bytes)
98
{
99
int len;
100
101
len = prom_getproplen(prom_root_node, "idprom");
102
if((len>num_bytes) || (len==-1)) return 0xff;
103
if(!prom_getproperty(prom_root_node, "idprom", idbuf, num_bytes))
104
return idbuf[0];
105
106
return 0xff;
107
}
108
109
/* Get the major prom version number. */
110
int
111
prom_version(void)
112
{
113
return romvec->pv_romvers;
114
}
115
116
/* Get the prom plugin-revision. */
117
int
118
prom_getrev(void)
119
{
120
return prom_rev;
121
}
122
123
/* Get the prom firmware print revision. */
124
int
125
prom_getprev(void)
126
{
127
return prom_prev;
128
}
129
130