9 #include <linux/types.h>
10 #include <linux/kernel.h>
11 #include <linux/sched.h>
14 #include <linux/module.h>
16 #include <asm/openprom.h>
17 #include <asm/oplib.h>
20 static int prom_service_exists(
const char *service_name)
22 unsigned long args[5];
24 args[0] = (
unsigned long)
"test";
27 args[3] = (
unsigned long) service_name;
28 args[4] = (
unsigned long) -1;
39 const char *svc =
"SUNW,soft-state-supported";
40 unsigned long args[3];
42 if (!prom_service_exists(svc))
44 args[0] = (
unsigned long) svc;
53 unsigned long args[4];
55 #ifdef CONFIG_SUN_LDOMS
59 args[0] = (
unsigned long)
"boot";
62 args[3] = (
unsigned long) bcommand;
70 unsigned long args[5];
72 if (!fstring || fstring[0] == 0)
74 args[0] = (
unsigned long)
"interpret";
77 args[3] = (
unsigned long) fstring;
78 args[4] = (
unsigned long) -1;
94 unsigned long args[3];
103 args[0] = (
unsigned long)
"enter";
121 unsigned long args[3];
123 #ifdef CONFIG_SUN_LDOMS
128 args[0] = (
unsigned long)
"exit";
137 unsigned long args[3];
139 #ifdef CONFIG_SUN_LDOMS
143 args[0] = (
unsigned long)
"SUNW,power-off";
161 if ((len >num_bytes) || (len == -1))
179 if (ret == -1 || ret == 0)
187 static int prom_get_memory_ihandle(
void)
189 static int memory_ihandle_cache;
193 if (memory_ihandle_cache != 0)
194 return memory_ihandle_cache;
198 if (ret == -1 || ret == 0)
199 memory_ihandle_cache = -1;
201 memory_ihandle_cache =
ret;
207 static long tlb_load(
const char *
type,
unsigned long index,
208 unsigned long tte_data,
unsigned long vaddr)
210 unsigned long args[9];
212 args[0] = (
unsigned long) prom_callmethod_name;
215 args[3] = (
unsigned long) type;
220 args[8] = (
unsigned long) -1;
224 return (
long) args[8];
228 unsigned long tte_data,
231 return tlb_load(
"SUNW,itlb-load", index, tte_data, vaddr);
235 unsigned long tte_data,
238 return tlb_load(
"SUNW,dtlb-load", index, tte_data, vaddr);
242 unsigned long vaddr,
unsigned long paddr)
244 unsigned long args[11];
252 args[5] = (
unsigned int) mode;
257 args[10] = (
unsigned long) -1;
261 ret = (
int) args[10];
269 unsigned long args[7];
288 unsigned long args[11];
293 args[3] = (
unsigned long)
"SUNW,retain";
294 args[4] = (
unsigned int) prom_get_memory_ihandle();
297 args[7] = (
unsigned long) name;
298 args[8] = (
unsigned long) -1;
299 args[9] = (
unsigned long) -1;
300 args[10] = (
unsigned long) -1;
305 return (
int) args[8];
326 unsigned long args[12];
331 args[3] = (
unsigned long)
"SUNW,get-unumber";
332 args[4] = (
unsigned int) prom_get_memory_ihandle();
334 args[6] = (
unsigned long) buf;
337 args[9] = (
unsigned int) syndrome_code;
338 args[10] = (
unsigned long) -1;
339 args[11] = (
unsigned long) -1;
343 return (
int) args[10];
349 unsigned long args[3];
351 args[0] = (
unsigned long)
"SUNW,sleep-self";
359 unsigned long args[4];
361 args[0] = (
unsigned long)
"SUNW,sleep-system";
364 args[3] = (
unsigned long) -1;
367 return (
int) args[3];
372 unsigned long args[4];
374 args[0] = (
unsigned long)
"SUNW,wakeup-system";
377 args[3] = (
unsigned long) -1;
380 return (
int) args[3];
386 unsigned long args[6];
388 args[0] = (
unsigned long)
"SUNW,start-cpu";
391 args[3] = (
unsigned int) cpunode;
397 void prom_startcpu_cpuid(
int cpuid,
unsigned long pc,
unsigned long arg)
399 unsigned long args[6];
401 args[0] = (
unsigned long)
"SUNW,start-cpu-by-cpuid";
404 args[3] = (
unsigned int) cpuid;
410 void prom_stopcpu_cpuid(
int cpuid)
412 unsigned long args[4];
414 args[0] = (
unsigned long)
"SUNW,stop-cpu-by-cpuid";
417 args[3] = (
unsigned int) cpuid;
421 void prom_stopself(
void)
423 unsigned long args[3];
425 args[0] = (
unsigned long)
"SUNW,stop-self";
431 void prom_idleself(
void)
433 unsigned long args[3];
435 args[0] = (
unsigned long)
"SUNW,idle-self";
441 void prom_resumecpu(
int cpunode)
443 unsigned long args[4];
445 args[0] = (
unsigned long)
"SUNW,resume-cpu";
448 args[3] = (
unsigned int) cpunode;