1/* $Id: oplib.h,v 1.1.1.1 2008/10/15 03:29:18 james26_jang Exp $
2 * oplib.h:  Describes the interface and available routines in the
3 *           Linux Prom library.
4 *
5 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
6 * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
7 */
8
9#ifndef __SPARC64_OPLIB_H
10#define __SPARC64_OPLIB_H
11
12#include <linux/config.h>
13#include <asm/openprom.h>
14
15/* Enumeration to describe the prom major version we have detected. */
16enum prom_major_version {
17	PROM_V0,      /* Original sun4c V0 prom */
18	PROM_V2,      /* sun4c and early sun4m V2 prom */
19	PROM_V3,      /* sun4m and later, up to sun4d/sun4e machines V3 */
20	PROM_P1275,   /* IEEE compliant ISA based Sun PROM, only sun4u */
21        PROM_AP1000,  /* actually no prom at all */
22};
23
24extern enum prom_major_version prom_vers;
25/* Revision, and firmware revision. */
26extern unsigned int prom_rev, prom_prev;
27
28/* Root node of the prom device tree, this stays constant after
29 * initialization is complete.
30 */
31extern int prom_root_node;
32
33/* PROM stdin and stdout */
34extern int prom_stdin, prom_stdout;
35
36/* /chosen node of the prom device tree, this stays constant after
37 * initialization is complete.
38 */
39extern int prom_chosen_node;
40
41struct linux_mlist_p1275 {
42	struct linux_mlist_p1275 *theres_more;
43	unsigned long start_adr;
44	unsigned long num_bytes;
45};
46
47struct linux_mem_p1275 {
48	struct linux_mlist_p1275 **p1275_totphys;
49	struct linux_mlist_p1275 **p1275_prommap;
50	struct linux_mlist_p1275 **p1275_available; /* What we can use */
51};
52
53/* The functions... */
54
55/* You must call prom_init() before using any of the library services,
56 * preferably as early as possible.  Pass it the romvec pointer.
57 */
58extern void prom_init(void *cif_handler, void *cif_stack);
59
60/* Boot argument acquisition, returns the boot command line string. */
61extern char *prom_getbootargs(void);
62
63/* Device utilities. */
64
65/* Device operations. */
66
67/* Open the device described by the passed string.  Note, that the format
68 * of the string is different on V0 vs. V2->higher proms.  The caller must
69 * know what he/she is doing!  Returns the device descriptor, an int.
70 */
71extern int prom_devopen(char *device_string);
72
73/* Close a previously opened device described by the passed integer
74 * descriptor.
75 */
76extern int prom_devclose(int device_handle);
77
78/* Do a seek operation on the device described by the passed integer
79 * descriptor.
80 */
81extern void prom_seek(int device_handle, unsigned int seek_hival,
82		      unsigned int seek_lowval);
83
84/* Machine memory configuration routine. */
85
86/* This function returns a V0 format memory descriptor table, it has three
87 * entries.  One for the total amount of physical ram on the machine, one
88 * for the amount of physical ram available, and one describing the virtual
89 * areas which are allocated by the prom.  So, in a sense the physical
90 * available is a calculation of the total physical minus the physical mapped
91 * by the prom with virtual mappings.
92 *
93 * These lists are returned pre-sorted, this should make your life easier
94 * since the prom itself is way too lazy to do such nice things.
95 */
96extern struct linux_mem_p1275 *prom_meminfo(void);
97
98/* Miscellaneous routines, don't really fit in any category per se. */
99
100/* Reboot the machine with the command line passed. */
101extern void prom_reboot(char *boot_command);
102
103/* Evaluate the forth string passed. */
104extern void prom_feval(char *forth_string);
105
106/* Enter the prom, with possibility of continuation with the 'go'
107 * command in newer proms.
108 */
109extern void prom_cmdline(void);
110
111/* Enter the prom, with no chance of continuation for the stand-alone
112 * which calls this.
113 */
114extern void prom_halt(void) __attribute__ ((noreturn));
115
116/* Halt and power-off the machine. */
117extern void prom_halt_power_off(void) __attribute__ ((noreturn));
118
119/* Set the PROM 'sync' callback function to the passed function pointer.
120 * When the user gives the 'sync' command at the prom prompt while the
121 * kernel is still active, the prom will call this routine.
122 *
123 */
124typedef int (*callback_func_t)(long *cmd);
125extern void prom_setcallback(callback_func_t func_ptr);
126
127/* Acquire the IDPROM of the root node in the prom device tree.  This
128 * gets passed a buffer where you would like it stuffed.  The return value
129 * is the format type of this idprom or 0xff on error.
130 */
131extern unsigned char prom_get_idprom(char *idp_buffer, int idpbuf_size);
132
133/* Get the prom major version. */
134extern int prom_version(void);
135
136/* Get the prom plugin revision. */
137extern int prom_getrev(void);
138
139/* Get the prom firmware revision. */
140extern int prom_getprev(void);
141
142/* Character operations to/from the console.... */
143
144/* Non-blocking get character from console. */
145extern int prom_nbgetchar(void);
146
147/* Non-blocking put character to console. */
148extern int prom_nbputchar(char character);
149
150/* Blocking get character from console. */
151extern char prom_getchar(void);
152
153/* Blocking put character to console. */
154extern void prom_putchar(char character);
155
156/* Prom's internal printf routine, don't use in kernel/boot code. */
157void prom_printf(char *fmt, ...);
158
159/* Query for input device type */
160
161enum prom_input_device {
162	PROMDEV_IKBD,			/* input from keyboard */
163	PROMDEV_ITTYA,			/* input from ttya */
164	PROMDEV_ITTYB,			/* input from ttyb */
165	PROMDEV_I_UNK,
166};
167
168extern enum prom_input_device prom_query_input_device(void);
169
170/* Query for output device type */
171
172enum prom_output_device {
173	PROMDEV_OSCREEN,		/* to screen */
174	PROMDEV_OTTYA,			/* to ttya */
175	PROMDEV_OTTYB,			/* to ttyb */
176	PROMDEV_O_UNK,
177};
178
179extern enum prom_output_device prom_query_output_device(void);
180
181/* Multiprocessor operations... */
182#ifdef CONFIG_SMP
183/* Start the CPU with the given device tree node, context table, and context
184 * at the passed program counter.
185 */
186extern void prom_startcpu(int cpunode, unsigned long pc, unsigned long o0);
187
188/* Stop the current CPU. */
189extern void prom_stopself(void);
190
191/* Idle the current CPU. */
192extern void prom_idleself(void);
193
194/* Resume the CPU with the passed device tree node. */
195extern void prom_resumecpu(int cpunode);
196#endif
197
198/* Power management interfaces. */
199
200/* Put the current CPU to sleep. */
201extern void prom_sleepself(void);
202
203/* Put the entire system to sleep. */
204extern int prom_sleepsystem(void);
205
206/* Initiate a wakeup event. */
207extern int prom_wakeupsystem(void);
208
209/* MMU and memory related OBP interfaces. */
210
211/* Get unique string identifying SIMM at given physical address. */
212extern int prom_getunumber(int syndrome_code,
213			   unsigned long phys_addr,
214			   char *buf, int buflen);
215
216/* Retain physical memory to the caller across soft resets. */
217extern unsigned long prom_retain(char *name,
218				 unsigned long pa_low, unsigned long pa_high,
219				 long size, long align);
220
221/* Load explicit I/D TLB entries into the calling processor. */
222extern long prom_itlb_load(unsigned long index,
223			   unsigned long tte_data,
224			   unsigned long vaddr);
225
226extern long prom_dtlb_load(unsigned long index,
227			   unsigned long tte_data,
228			   unsigned long vaddr);
229
230/* Map/Unmap client program address ranges.  First the format of
231 * the mapping mode argument.
232 */
233#define PROM_MAP_WRITE	0x0001 /* Writable */
234#define PROM_MAP_READ	0x0002 /* Readable - sw */
235#define PROM_MAP_EXEC	0x0004 /* Executable - sw */
236#define PROM_MAP_LOCKED	0x0010 /* Locked, use i/dtlb load calls for this instead */
237#define PROM_MAP_CACHED	0x0020 /* Cacheable in both L1 and L2 caches */
238#define PROM_MAP_SE	0x0040 /* Side-Effects */
239#define PROM_MAP_GLOB	0x0080 /* Global */
240#define PROM_MAP_IE	0x0100 /* Invert-Endianness */
241#define PROM_MAP_DEFAULT (PROM_MAP_WRITE | PROM_MAP_READ | PROM_MAP_EXEC | PROM_MAP_CACHED)
242
243extern int prom_map(int mode, unsigned long size,
244		    unsigned long vaddr, unsigned long paddr);
245extern void prom_unmap(unsigned long size, unsigned long vaddr);
246
247
248/* PROM device tree traversal functions... */
249
250#ifdef PROMLIB_INTERNAL
251
252/* Internal version of prom_getchild. */
253extern int __prom_getchild(int parent_node);
254
255/* Internal version of prom_getsibling. */
256extern int __prom_getsibling(int node);
257
258#endif
259
260/* Get the child node of the given node, or zero if no child exists. */
261extern int prom_getchild(int parent_node);
262
263/* Get the next sibling node of the given node, or zero if no further
264 * siblings exist.
265 */
266extern int prom_getsibling(int node);
267
268/* Get the length, at the passed node, of the given property type.
269 * Returns -1 on error (ie. no such property at this node).
270 */
271extern int prom_getproplen(int thisnode, char *property);
272
273/* Fetch the requested property using the given buffer.  Returns
274 * the number of bytes the prom put into your buffer or -1 on error.
275 */
276extern int prom_getproperty(int thisnode, char *property,
277			    char *prop_buffer, int propbuf_size);
278
279/* Acquire an integer property. */
280extern int prom_getint(int node, char *property);
281
282/* Acquire an integer property, with a default value. */
283extern int prom_getintdefault(int node, char *property, int defval);
284
285/* Acquire a boolean property, 0=FALSE 1=TRUE. */
286extern int prom_getbool(int node, char *prop);
287
288/* Acquire a string property, null string on error. */
289extern void prom_getstring(int node, char *prop, char *buf, int bufsize);
290
291/* Does the passed node have the given "name"? YES=1 NO=0 */
292extern int prom_nodematch(int thisnode, char *name);
293
294/* Puts in buffer a prom name in the form name@x,y or name (x for which_io
295 * and y for first regs phys address
296 */
297extern int prom_getname(int node, char *buf, int buflen);
298
299/* Search all siblings starting at the passed node for "name" matching
300 * the given string.  Returns the node on success, zero on failure.
301 */
302extern int prom_searchsiblings(int node_start, char *name);
303
304/* Return the first property type, as a string, for the given node.
305 * Returns a null string on error. Buffer should be at least 32B long.
306 */
307extern char *prom_firstprop(int node, char *buffer);
308
309/* Returns the next property after the passed property for the given
310 * node.  Returns null string on failure. Buffer should be at least 32B long.
311 */
312extern char *prom_nextprop(int node, char *prev_property, char *buffer);
313
314/* Returns 1 if the specified node has given property. */
315extern int prom_node_has_property(int node, char *property);
316
317/* Returns phandle of the path specified */
318extern int prom_finddevice(char *name);
319
320/* Set the indicated property at the given node with the passed value.
321 * Returns the number of bytes of your value that the prom took.
322 */
323extern int prom_setprop(int node, char *prop_name, char *prop_value,
324			int value_size);
325
326extern int prom_pathtoinode(char *path);
327extern int prom_inst2pkg(int);
328
329/* Client interface level routines. */
330extern void prom_set_trap_table(unsigned long tba);
331
332extern long p1275_cmd (char *, long, ...);
333
334
335#define P1275_SIZE(x) x
336
337/* We support at most 16 input and 1 output argument */
338#define P1275_ARG_NUMBER		0
339#define P1275_ARG_IN_STRING		1
340#define P1275_ARG_OUT_BUF		2
341#define P1275_ARG_OUT_32B		3
342#define P1275_ARG_IN_FUNCTION		4
343#define P1275_ARG_IN_BUF		5
344#define P1275_ARG_IN_64B		6
345
346#define P1275_IN(x) ((x) & 0xf)
347#define P1275_OUT(x) (((x) << 4) & 0xf0)
348#define P1275_INOUT(i,o) (P1275_IN(i)|P1275_OUT(o))
349#define P1275_ARG(n,x) ((x) << ((n)*3 + 8))
350
351#endif /* !(__SPARC64_OPLIB_H) */
352