summaryrefslogtreecommitdiff
path: root/sys/arch/mipsco/include/prom.h
blob: 87be79d3743194197eb0e6afdbe90a9f2ad96821 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
/*	$NetBSD: prom.h,v 1.12 2009/03/14 14:46:02 dsl Exp $	*/

/*
 * Copyright (c) 2000 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Wayne Knowles
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * Entry points into PROM firmware functions for MIPS machines
 */

#ifndef _MIPSCO_PROM_H
#define _MIPSCO_PROM_H

#ifndef _LOCORE
#include <sys/types.h>
#include <sys/cdefs.h>

struct mips_prom {

	/*
	 * transferred to on hardware reset, configures MIPS boards,
	 * runs diags, check for appropriate auto boot action in
	 * "bootmode" environment variable and performs that action.
	 */
	void	(*prom_reset)(void) __attribute__((__noreturn__));

	/*
	 * called to use prom to boot new image.  After the booted
	 * program returns control can either be returned to the
	 * original caller of the exec routine or to the prom monitor.
	 * (to return to the original caller, the new program must
	 * not destroy any text, data, or stack of the parent.  the
	 * new programs stack continues on the parents stack.
	 */
	int	(*prom_exec)(void);

	/* re-enter the prom command parser, do not reset prom state	*/
	void	(*prom_restart)(void) __attribute__((__noreturn__));

	/* reinitialize prom state and re-enter the prom command parser */
	void	(*prom_reinit)(void) __attribute__((__noreturn__));

	/* reboot machine using current bootmode setting.  No diags */
	void	(*prom_reboot)(void) __attribute__((__noreturn__));

	/* perform an autoboot sequence, no configuration or diags run */
	void	(*prom_autoboot)(void) __attribute__((__noreturn__));

	/*
	 * these routines access prom "saio" routines, and may be used
	 * by standalone programs that would like to use prom io
	 */
	int	(*prom_open)(char *, int, ...);
	int	(*prom_read)(int, void *, int);
	int	(*prom_write)(int, void *, int);
	int	(*prom_ioctl)(int, long, ...);
	int	(*prom_close)(int);
	int	(*prom_getchar)(void);
	int	(*prom_putchar)(int c);
	void	(*prom_showchar)(int c);
	char * 	(*prom_gets)(char *s);
	void	(*prom_puts)(const char *);
	int	(*prom_printf)(const char *, ...);

	/* prom protocol entry points */
	void	(*prom_initproto)(void); /* ??? */
	void	(*prom_protoenable)(void); /* ??? */
	void	(*prom_protodisable)(void); /* ??? */
	void	(*prom_getpkt)(void); /* ??? */
	void	(*prom_putpkt)(void); /* ??? */

	/*
	 * read-modify-write routine use special CPU board circuitry to
	 * accomplish vme bus r-m-w cycles.
	 */
	void	(*prom_orw_rmw)(void);
	void	(*prom_orh_rmw)(void);
	void	(*prom_orb_rmw)(void);
	void	(*prom_andw_rmw)(void);
	void	(*prom_andh_rmw)(void);
	void	(*prom_andb_rmw)(void);

	/*
	 * cache control entry points
	 * flushcache is called without arguments and invalidates entire
	 *      contents of both i and d caches
	 * clearcache is called with a base address and length (where
	 *      address is either K0, K1, or physical) and clears both
	 *      i and d cache for entries that alias to specified address
	 *      range.
	 */
	void	(*prom_flushcache)(void);
	void	(*prom_clearcache)(void *, size_t);

	/*
	 * Libc compatible functions
	 */
	void	(*prom_setjmp)(void);
	void	(*prom_longjmp)(void);
	void	(*prom_bevutlb)(void);
	char *	(*prom_getenv)(const char *name);
	int	(*prom_setenv)(char *name, char *val);
	int	(*prom_atob)(char *s);
	int	(*prom_strcmp)(char *s1, char *s2);
	int	(*prom_strlen)(char *s);
	char *	(*prom_strcpy)(char *s1, char *s2);
	char *	(*prom_strcat)(char *s1, char *s2);

	/*
	 * command parser entry points
	 */
	void	(*prom_parser)(void); /* ??? */
	void	(*prom_range)(void); /* ??? */
	void	(*prom_argvize)(void); /* ??? */
	void	(*prom_help)(void);

	/*
	 * prom commands
	 */
	void	(*prom_dumpcmd)(void);
	void	(*prom_setenvcmd)(void);
	void	(*prom_unsetenvcmd)(void);
	void	(*prom_bevexcept)(void);
	void	(*prom_enablecmd)(void);
	void	(*prom_disablecmd)(void);

	/*
	 * clear existing fault handlers
	 * used by clients that link to prom on situations where client has
	 * interrupted out of prom code and wish to reenter without being
	 * tripped up by any pending prom timers set earlier.
	 */
	void	(*prom_clearnofault)(void);

	void	(*prom_notimpl)(void);

	/*
	 * PROM_NVGET, PROM_NVSET will get/set information in the NVRAM.
	 * Both of these routines take indexes as opposed to addresses
	 * to guarantee portability between various platforms
	 */
	int	(*prom_nvget)(int);
	void	(*prom_nvset)(void);
};

extern struct mips_prom *callv;

extern void prom_init(void);

#endif	/* _LOCORE */

/*
 * Macro to help call a prom function
 */
#define MIPS_PROM(func)		(callv->prom_##func)

/*
 * Return the address for a given prom function number
 */
#define	MIPS_PROM_ENTRY(x)	(0xbfc00000+((x)*8))

/*
 * MIPS PROM firmware functions:
 *
 *	MIPS_PROM_RESET		Run diags, check bootmode, reinit.
 *	MIPS_PROM_EXEC		Load new program image.
 *	MIPS_PROM_RESTART	Re-enter monitor command loop.
 *	MIPS_PROM_REINIT	Re-init monitor, then cmd loop.
 *	MIPS_PROM_REBOOT	Check bootmode, no config.
 *	MIPS_PROM_AUTOBOOT	Autoboot the system.
 *
 * The following routines access PROM saio routines and may be used by
 * standalone programs that would like to use PROM I/O:
 *
 *	MIPS_PROM_OPEN		Open a file.
 *	MIPS_PROM_READ		Read from a file.
 *	MIPS_PROM_WRITE		Write to a file.
 *	MIPS_PROM_IOCTL		Ioctl on a file.
 *	MIPS_PROM_CLOSE		Close a file.
 *	MIPS_PROM_GETCHAR	Read character from console.
 *	MIPS_PROM_PUTCHAR	Put character on console.
 *	MIPS_PROM_SHOWCHAR	Show a char visibly.
 *	MIPS_PROM_GETS		gets with editing.
 *	MIPS_PROM_PUTS		Put string to console.
 *	MIPS_PROM_PRINTF	Kernel style printf to console.
 *
 *  PROM protocol entry points:
 *
 *	MIPS_PROM_INITPROTO	Initialize protocol.
 *	MIPS_PROM_PROTOENABLE	Enable protocol mode.
 *	MIPS_PROM_PROTODISABLE	Disable protocol mode.
 *	MIPS_PROM_GETPKT	Get protocol packet.
 *	MIPS_PROM_PUTPKT	Put protocol packet.
 *
 *   Atomic Read-Modify-Write functions
 *
 *	MIPS_PROM_RMW_OR32	r-m-w OR word.
 *	MIPS_PROM_RMW_OR16	r-m-w OR halfword.
 *	MIPS_PROM_RMW_OR8	r-m-w OR or byte.
 *	MIPS_PROM_RMW_AND32	r-m-w AND word.
 *	MIPS_PROM_RMW_AND16	r-m-w AND halfword.
 *	MIPS_PROM_RMW_AND8	r-m-w AND byte.
 *
 *	MIPS_PROM_FLUSHCACHE	Flush entire cache ().
 *	MIPS_PROM_CLEARCACHE	Clear I & D cache in range (addr, len).
 *	MIPS_PROM_SETJMP	Save registers in a buffer.
 *	MIPS_PROM_LONGJMP	Get register back from buffer.
 *	MIPS_PROM_BEVUTLB	utlbmiss boot exception vector
 *	MIPS_PROM_GETENV	Gets a string from system environment.
 *	MIPS_PROM_SETENV	Sets a string in system environment.
 *	MIPS_PROM_ATOB		Converts ascii string to number.
 *	MIPS_PROM_STRCMP	Compares strings (strcmp).
 *	MIPS_PROM_STRLEN	Length of string (strlen).
 *	MIPS_PROM_STRCPY	Copies string (strcpy).
 *	MIPS_PROM_STRCAT	Appends string (strcat).
 *	MIPS_PROM_PARSER	Command parser.
 *	MIPS_PROM_RANGE		Address range parser
 *	MIPS_PROM_ARGVIZE	Parses string to argc,argv.
 *	MIPS_PROM_HELP		Help on prom commands.
 *	MIPS_PROM_DUMP		Dump memory command.
 *	MIPS_PROM_SETENVCMD	Setenv command.
 *	MIPS_PROM_UNSETENVCMD	Unsetenv command.
 *	MIPS_PROM_PRINTENV	Print environment command.
 *	MIPS_PROM_BEVEXCEPT	General boot exception vector 
 *	MIPS_PROM_ENABLE	Performs prom enable command.
 *	MIPS_PROM_DISABLE	Performs prom disable command.
 *	MIPS_PROM_CLEARNOFAULT	Clear existing fault handlers.
 *	MIPS_PROM_NOTIMPL	Guaranteed to be not implemented
 *	MIPS_PROM_NVGET		Read bytes from NVRAM
 *	MIPS_PROM_NVSET		Write bytes to NVRAM
 */

#define	MIPS_PROM_RESET		MIPS_PROM_ENTRY(0)
#define	MIPS_PROM_EXEC		MIPS_PROM_ENTRY(1)
#define	MIPS_PROM_RESTART	MIPS_PROM_ENTRY(2)
#define	MIPS_PROM_REINIT	MIPS_PROM_ENTRY(3)
#define	MIPS_PROM_REBOOT	MIPS_PROM_ENTRY(4)
#define	MIPS_PROM_AUTOBOOT	MIPS_PROM_ENTRY(5)
#define	MIPS_PROM_OPEN		MIPS_PROM_ENTRY(6)
#define	MIPS_PROM_READ		MIPS_PROM_ENTRY(7)
#define	MIPS_PROM_WRITE		MIPS_PROM_ENTRY(8)
#define	MIPS_PROM_IOCTL		MIPS_PROM_ENTRY(9)
#define	MIPS_PROM_CLOSE		MIPS_PROM_ENTRY(10)
#define	MIPS_PROM_GETCHAR	MIPS_PROM_ENTRY(11)
#define	MIPS_PROM_PUTCHAR	MIPS_PROM_ENTRY(12)
#define	MIPS_PROM_SHOWCHAR	MIPS_PROM_ENTRY(13)
#define	MIPS_PROM_GETS		MIPS_PROM_ENTRY(14)
#define	MIPS_PROM_PUTS		MIPS_PROM_ENTRY(15)
#define	MIPS_PROM_PRINTF	MIPS_PROM_ENTRY(16)
#define	MIPS_PROM_INITPROTO	MIPS_PROM_ENTRY(17)
#define	MIPS_PROM_PROTOENABLE	MIPS_PROM_ENTRY(18)
#define	MIPS_PROM_PROTODISABLE	MIPS_PROM_ENTRY(19)
#define	MIPS_PROM_GETPKT	MIPS_PROM_ENTRY(20)
#define	MIPS_PROM_PUTPKT	MIPS_PROM_ENTRY(21)
#define	MIPS_PROM_ORW_RMW	MIPS_PROM_ENTRY(22)
#define	MIPS_PROM_ORH_RMW	MIPS_PROM_ENTRY(23)
#define	MIPS_PROM_ORB_RMW	MIPS_PROM_ENTRY(24)
#define	MIPS_PROM_ANDW_RMW	MIPS_PROM_ENTRY(25)
#define	MIPS_PROM_ANDH_RMW	MIPS_PROM_ENTRY(26)
#define	MIPS_PROM_ANDB_RMW	MIPS_PROM_ENTRY(27)
#define	MIPS_PROM_FLUSHCACHE	MIPS_PROM_ENTRY(28)
#define	MIPS_PROM_CLEARCACHE	MIPS_PROM_ENTRY(29)
#define	MIPS_PROM_SETJMP	MIPS_PROM_ENTRY(30)
#define	MIPS_PROM_LONGJMP	MIPS_PROM_ENTRY(31)
#define	MIPS_PROM_BEVUTLB	MIPS_PROM_ENTRY(32)
#define	MIPS_PROM_GETENV	MIPS_PROM_ENTRY(33)
#define	MIPS_PROM_SETENV	MIPS_PROM_ENTRY(34)
#define	MIPS_PROM_ATOB		MIPS_PROM_ENTRY(35)
#define	MIPS_PROM_STRCMP	MIPS_PROM_ENTRY(36)
#define	MIPS_PROM_STRLEN	MIPS_PROM_ENTRY(37)
#define	MIPS_PROM_STRCPY	MIPS_PROM_ENTRY(38)
#define	MIPS_PROM_STRCAT	MIPS_PROM_ENTRY(39)
#define	MIPS_PROM_PARSER	MIPS_PROM_ENTRY(40)
#define	MIPS_PROM_RANGE		MIPS_PROM_ENTRY(41)
#define	MIPS_PROM_ARGVIZE	MIPS_PROM_ENTRY(42)
#define	MIPS_PROM_HELP		MIPS_PROM_ENTRY(43)
#define	MIPS_PROM_DUMP		MIPS_PROM_ENTRY(44)
#define	MIPS_PROM_SETENVCMD	MIPS_PROM_ENTRY(45)
#define	MIPS_PROM_UNSETENVCMD	MIPS_PROM_ENTRY(46)
#define	MIPS_PROM_PRINTENV	MIPS_PROM_ENTRY(47)
#define	MIPS_PROM_BEVEXCEPT	MIPS_PROM_ENTRY(48)
#define	MIPS_PROM_ENABLE	MIPS_PROM_ENTRY(49)
#define	MIPS_PROM_DISABLE	MIPS_PROM_ENTRY(50)
#define	MIPS_PROM_CLEARNOFAULT	MIPS_PROM_ENTRY(51)
#define	MIPS_PROM_NOTIMPLEMENT	MIPS_PROM_ENTRY(52)
#define MIPS_PROM_NVGET		MIPS_PROM_ENTRY(53)
#define MIPS_PROM_NVSET		MIPS_PROM_ENTRY(54)

#if defined(_KERNEL) && !defined(__ASSEMBLER__)
extern void prom_init (void);
extern int prom_getconsole (void);
#endif

#endif /* ! _MIPSCO_PROM_H */