File: /usr/src/linux/arch/m68k/sun3/prom/misc.c

1     /* $Id: misc.c,v 1.15 1997/05/14 20:45:00 davem Exp $
2      * misc.c:  Miscellaneous prom functions that don't belong
3      *          anywhere else.
4      *
5      * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
6      */
7     
8     #include <linux/types.h>
9     #include <linux/kernel.h>
10     #include <linux/sched.h>
11     #include <asm/sun3-head.h>
12     #include <asm/idprom.h>
13     #include <asm/openprom.h>
14     #include <asm/oplib.h>
15     #include <asm/movs.h>
16     
17     /* Reset and reboot the machine with the command 'bcommand'. */
18     void
19     prom_reboot(char *bcommand)
20     {
21     	unsigned long flags;
22     	save_flags(flags); cli();
23     	(*(romvec->pv_reboot))(bcommand);
24     	restore_flags(flags);
25     }
26     
27     /* Drop into the prom, with the chance to continue with the 'go'
28      * prom command.
29      */
30     void
31     prom_cmdline(void)
32     {
33     }
34     
35     /* Drop into the prom, but completely terminate the program.
36      * No chance of continuing.
37      */
38     void
39     prom_halt(void)
40     {
41     	unsigned long flags;
42     again:
43     	save_flags(flags); cli();
44     	(*(romvec->pv_halt))();
45     	restore_flags(flags);
46     	goto again; /* PROM is out to get me -DaveM */
47     }
48     
49     typedef void (*sfunc_t)(void);
50     
51     /* Get the idprom and stuff it into buffer 'idbuf'.  Returns the
52      * format type.  'num_bytes' is the number of bytes that your idbuf
53      * has space for.  Returns 0xff on error.
54      */
55     unsigned char
56     prom_get_idprom(char *idbuf, int num_bytes)
57     {
58     	int i, oldsfc;
59     	GET_SFC(oldsfc);
60     	SET_SFC(FC_CONTROL);
61     	for(i=0;i<num_bytes; i++)
62     	{
63     		/* There is a problem with the GET_CONTROL_BYTE
64     		macro; defining the extra variable
65     		gets around it.
66     		*/
67     		int c;
68     		GET_CONTROL_BYTE(SUN3_IDPROM_BASE + i, c);
69     		idbuf[i] = c;
70     	}
71     	SET_SFC(oldsfc);
72     	return idbuf[0];
73     }
74     
75     /* Get the major prom version number. */
76     int
77     prom_version(void)
78     {
79     	return romvec->pv_romvers;
80     }
81     
82     /* Get the prom plugin-revision. */
83     int
84     prom_getrev(void)
85     {
86     	return prom_rev;
87     }
88     
89     /* Get the prom firmware print revision. */
90     int
91     prom_getprev(void)
92     {
93     	return prom_prev;
94     }
95