xref: /openbmc/linux/arch/sparc/prom/misc_64.c (revision b2441318)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
25de18cdeSSam Ravnborg /*
35de18cdeSSam Ravnborg  * misc.c:  Miscellaneous prom functions that don't belong
45de18cdeSSam Ravnborg  *          anywhere else.
55de18cdeSSam Ravnborg  *
65de18cdeSSam Ravnborg  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
75de18cdeSSam Ravnborg  * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
85de18cdeSSam Ravnborg  */
95de18cdeSSam Ravnborg 
105de18cdeSSam Ravnborg #include <linux/types.h>
115de18cdeSSam Ravnborg #include <linux/kernel.h>
125de18cdeSSam Ravnborg #include <linux/sched.h>
135de18cdeSSam Ravnborg #include <linux/interrupt.h>
145de18cdeSSam Ravnborg #include <linux/delay.h>
15917c3660SSam Ravnborg #include <linux/module.h>
16917c3660SSam Ravnborg 
175de18cdeSSam Ravnborg #include <asm/openprom.h>
185de18cdeSSam Ravnborg #include <asm/oplib.h>
195de18cdeSSam Ravnborg #include <asm/ldc.h>
205de18cdeSSam Ravnborg 
prom_service_exists(const char * service_name)21f7b5f55aSDavid S. Miller static int prom_service_exists(const char *service_name)
225de18cdeSSam Ravnborg {
2325edd694SDavid S. Miller 	unsigned long args[5];
245de18cdeSSam Ravnborg 
2525edd694SDavid S. Miller 	args[0] = (unsigned long) "test";
2625edd694SDavid S. Miller 	args[1] = 1;
2725edd694SDavid S. Miller 	args[2] = 1;
2825edd694SDavid S. Miller 	args[3] = (unsigned long) service_name;
2925edd694SDavid S. Miller 	args[4] = (unsigned long) -1;
3025edd694SDavid S. Miller 
3125edd694SDavid S. Miller 	p1275_cmd_direct(args);
3225edd694SDavid S. Miller 
3325edd694SDavid S. Miller 	if (args[4])
345de18cdeSSam Ravnborg 		return 0;
355de18cdeSSam Ravnborg 	return 1;
365de18cdeSSam Ravnborg }
375de18cdeSSam Ravnborg 
prom_sun4v_guest_soft_state(void)385de18cdeSSam Ravnborg void prom_sun4v_guest_soft_state(void)
395de18cdeSSam Ravnborg {
405de18cdeSSam Ravnborg 	const char *svc = "SUNW,soft-state-supported";
4125edd694SDavid S. Miller 	unsigned long args[3];
425de18cdeSSam Ravnborg 
435de18cdeSSam Ravnborg 	if (!prom_service_exists(svc))
445de18cdeSSam Ravnborg 		return;
4525edd694SDavid S. Miller 	args[0] = (unsigned long) svc;
4625edd694SDavid S. Miller 	args[1] = 0;
4725edd694SDavid S. Miller 	args[2] = 0;
4825edd694SDavid S. Miller 	p1275_cmd_direct(args);
495de18cdeSSam Ravnborg }
505de18cdeSSam Ravnborg 
515de18cdeSSam Ravnborg /* Reset and reboot the machine with the command 'bcommand'. */
prom_reboot(const char * bcommand)525de18cdeSSam Ravnborg void prom_reboot(const char *bcommand)
535de18cdeSSam Ravnborg {
5425edd694SDavid S. Miller 	unsigned long args[4];
5525edd694SDavid S. Miller 
565de18cdeSSam Ravnborg #ifdef CONFIG_SUN_LDOMS
575de18cdeSSam Ravnborg 	if (ldom_domaining_enabled)
585de18cdeSSam Ravnborg 		ldom_reboot(bcommand);
595de18cdeSSam Ravnborg #endif
6025edd694SDavid S. Miller 	args[0] = (unsigned long) "boot";
6125edd694SDavid S. Miller 	args[1] = 1;
6225edd694SDavid S. Miller 	args[2] = 0;
6325edd694SDavid S. Miller 	args[3] = (unsigned long) bcommand;
6425edd694SDavid S. Miller 
6525edd694SDavid S. Miller 	p1275_cmd_direct(args);
665de18cdeSSam Ravnborg }
675de18cdeSSam Ravnborg 
685de18cdeSSam Ravnborg /* Forth evaluate the expression contained in 'fstring'. */
prom_feval(const char * fstring)695de18cdeSSam Ravnborg void prom_feval(const char *fstring)
705de18cdeSSam Ravnborg {
7125edd694SDavid S. Miller 	unsigned long args[5];
7225edd694SDavid S. Miller 
735de18cdeSSam Ravnborg 	if (!fstring || fstring[0] == 0)
745de18cdeSSam Ravnborg 		return;
7525edd694SDavid S. Miller 	args[0] = (unsigned long) "interpret";
7625edd694SDavid S. Miller 	args[1] = 1;
7725edd694SDavid S. Miller 	args[2] = 1;
7825edd694SDavid S. Miller 	args[3] = (unsigned long) fstring;
7925edd694SDavid S. Miller 	args[4] = (unsigned long) -1;
8025edd694SDavid S. Miller 
8125edd694SDavid S. Miller 	p1275_cmd_direct(args);
825de18cdeSSam Ravnborg }
83917c3660SSam Ravnborg EXPORT_SYMBOL(prom_feval);
845de18cdeSSam Ravnborg 
855de18cdeSSam Ravnborg /* Drop into the prom, with the chance to continue with the 'go'
865de18cdeSSam Ravnborg  * prom command.
875de18cdeSSam Ravnborg  */
prom_cmdline(void)885de18cdeSSam Ravnborg void prom_cmdline(void)
895de18cdeSSam Ravnborg {
9025edd694SDavid S. Miller 	unsigned long args[3];
915de18cdeSSam Ravnborg 	unsigned long flags;
925de18cdeSSam Ravnborg 
935de18cdeSSam Ravnborg 	local_irq_save(flags);
945de18cdeSSam Ravnborg 
955de18cdeSSam Ravnborg #ifdef CONFIG_SMP
965de18cdeSSam Ravnborg 	smp_capture();
975de18cdeSSam Ravnborg #endif
985de18cdeSSam Ravnborg 
9925edd694SDavid S. Miller 	args[0] = (unsigned long) "enter";
10025edd694SDavid S. Miller 	args[1] = 0;
10125edd694SDavid S. Miller 	args[2] = 0;
10225edd694SDavid S. Miller 
10325edd694SDavid S. Miller 	p1275_cmd_direct(args);
1045de18cdeSSam Ravnborg 
1055de18cdeSSam Ravnborg #ifdef CONFIG_SMP
1065de18cdeSSam Ravnborg 	smp_release();
1075de18cdeSSam Ravnborg #endif
1085de18cdeSSam Ravnborg 
1095de18cdeSSam Ravnborg 	local_irq_restore(flags);
1105de18cdeSSam Ravnborg }
1115de18cdeSSam Ravnborg 
1125de18cdeSSam Ravnborg /* Drop into the prom, but completely terminate the program.
1135de18cdeSSam Ravnborg  * No chance of continuing.
1145de18cdeSSam Ravnborg  */
prom_halt(void)115bd4352caSDavid S. Miller void notrace prom_halt(void)
1165de18cdeSSam Ravnborg {
11725edd694SDavid S. Miller 	unsigned long args[3];
11825edd694SDavid S. Miller 
1195de18cdeSSam Ravnborg #ifdef CONFIG_SUN_LDOMS
1205de18cdeSSam Ravnborg 	if (ldom_domaining_enabled)
1215de18cdeSSam Ravnborg 		ldom_power_off();
1225de18cdeSSam Ravnborg #endif
1235de18cdeSSam Ravnborg again:
12425edd694SDavid S. Miller 	args[0] = (unsigned long) "exit";
12525edd694SDavid S. Miller 	args[1] = 0;
12625edd694SDavid S. Miller 	args[2] = 0;
12725edd694SDavid S. Miller 	p1275_cmd_direct(args);
1285de18cdeSSam Ravnborg 	goto again; /* PROM is out to get me -DaveM */
1295de18cdeSSam Ravnborg }
1305de18cdeSSam Ravnborg 
prom_halt_power_off(void)1315de18cdeSSam Ravnborg void prom_halt_power_off(void)
1325de18cdeSSam Ravnborg {
13325edd694SDavid S. Miller 	unsigned long args[3];
13425edd694SDavid S. Miller 
1355de18cdeSSam Ravnborg #ifdef CONFIG_SUN_LDOMS
1365de18cdeSSam Ravnborg 	if (ldom_domaining_enabled)
1375de18cdeSSam Ravnborg 		ldom_power_off();
1385de18cdeSSam Ravnborg #endif
13925edd694SDavid S. Miller 	args[0] = (unsigned long) "SUNW,power-off";
14025edd694SDavid S. Miller 	args[1] = 0;
14125edd694SDavid S. Miller 	args[2] = 0;
14225edd694SDavid S. Miller 	p1275_cmd_direct(args);
1435de18cdeSSam Ravnborg 
1445de18cdeSSam Ravnborg 	/* if nothing else helps, we just halt */
1455de18cdeSSam Ravnborg 	prom_halt();
1465de18cdeSSam Ravnborg }
1475de18cdeSSam Ravnborg 
1485de18cdeSSam Ravnborg /* Get the idprom and stuff it into buffer 'idbuf'.  Returns the
1495de18cdeSSam Ravnborg  * format type.  'num_bytes' is the number of bytes that your idbuf
1505de18cdeSSam Ravnborg  * has space for.  Returns 0xff on error.
1515de18cdeSSam Ravnborg  */
prom_get_idprom(char * idbuf,int num_bytes)1525de18cdeSSam Ravnborg unsigned char prom_get_idprom(char *idbuf, int num_bytes)
1535de18cdeSSam Ravnborg {
1545de18cdeSSam Ravnborg 	int len;
1555de18cdeSSam Ravnborg 
1565de18cdeSSam Ravnborg 	len = prom_getproplen(prom_root_node, "idprom");
1575de18cdeSSam Ravnborg 	if ((len >num_bytes) || (len == -1))
1585de18cdeSSam Ravnborg 		return 0xff;
1595de18cdeSSam Ravnborg 	if (!prom_getproperty(prom_root_node, "idprom", idbuf, num_bytes))
1605de18cdeSSam Ravnborg 		return idbuf[0];
1615de18cdeSSam Ravnborg 
1625de18cdeSSam Ravnborg 	return 0xff;
1635de18cdeSSam Ravnborg }
1645de18cdeSSam Ravnborg 
prom_get_mmu_ihandle(void)1655de18cdeSSam Ravnborg int prom_get_mmu_ihandle(void)
1665de18cdeSSam Ravnborg {
1678d125562SAndres Salomon 	phandle node;
1688d125562SAndres Salomon 	int ret;
1695de18cdeSSam Ravnborg 
1705de18cdeSSam Ravnborg 	if (prom_mmu_ihandle_cache != 0)
1715de18cdeSSam Ravnborg 		return prom_mmu_ihandle_cache;
1725de18cdeSSam Ravnborg 
1735de18cdeSSam Ravnborg 	node = prom_finddevice(prom_chosen_path);
1745de18cdeSSam Ravnborg 	ret = prom_getint(node, prom_mmu_name);
1755de18cdeSSam Ravnborg 	if (ret == -1 || ret == 0)
1765de18cdeSSam Ravnborg 		prom_mmu_ihandle_cache = -1;
1775de18cdeSSam Ravnborg 	else
1785de18cdeSSam Ravnborg 		prom_mmu_ihandle_cache = ret;
1795de18cdeSSam Ravnborg 
1805de18cdeSSam Ravnborg 	return ret;
1815de18cdeSSam Ravnborg }
1825de18cdeSSam Ravnborg 
prom_get_memory_ihandle(void)1835de18cdeSSam Ravnborg static int prom_get_memory_ihandle(void)
1845de18cdeSSam Ravnborg {
1855de18cdeSSam Ravnborg 	static int memory_ihandle_cache;
1868d125562SAndres Salomon 	phandle node;
1878d125562SAndres Salomon 	int ret;
1885de18cdeSSam Ravnborg 
1895de18cdeSSam Ravnborg 	if (memory_ihandle_cache != 0)
1905de18cdeSSam Ravnborg 		return memory_ihandle_cache;
1915de18cdeSSam Ravnborg 
1925de18cdeSSam Ravnborg 	node = prom_finddevice("/chosen");
1935de18cdeSSam Ravnborg 	ret = prom_getint(node, "memory");
1945de18cdeSSam Ravnborg 	if (ret == -1 || ret == 0)
1955de18cdeSSam Ravnborg 		memory_ihandle_cache = -1;
1965de18cdeSSam Ravnborg 	else
1975de18cdeSSam Ravnborg 		memory_ihandle_cache = ret;
1985de18cdeSSam Ravnborg 
1995de18cdeSSam Ravnborg 	return ret;
2005de18cdeSSam Ravnborg }
2015de18cdeSSam Ravnborg 
2025de18cdeSSam Ravnborg /* Load explicit I/D TLB entries. */
tlb_load(const char * type,unsigned long index,unsigned long tte_data,unsigned long vaddr)20325edd694SDavid S. Miller static long tlb_load(const char *type, unsigned long index,
20425edd694SDavid S. Miller 		     unsigned long tte_data, unsigned long vaddr)
20525edd694SDavid S. Miller {
20625edd694SDavid S. Miller 	unsigned long args[9];
20725edd694SDavid S. Miller 
20825edd694SDavid S. Miller 	args[0] = (unsigned long) prom_callmethod_name;
20925edd694SDavid S. Miller 	args[1] = 5;
21025edd694SDavid S. Miller 	args[2] = 1;
21125edd694SDavid S. Miller 	args[3] = (unsigned long) type;
21225edd694SDavid S. Miller 	args[4] = (unsigned int) prom_get_mmu_ihandle();
21325edd694SDavid S. Miller 	args[5] = vaddr;
21425edd694SDavid S. Miller 	args[6] = tte_data;
21525edd694SDavid S. Miller 	args[7] = index;
21625edd694SDavid S. Miller 	args[8] = (unsigned long) -1;
21725edd694SDavid S. Miller 
21825edd694SDavid S. Miller 	p1275_cmd_direct(args);
21925edd694SDavid S. Miller 
22025edd694SDavid S. Miller 	return (long) args[8];
22125edd694SDavid S. Miller }
22225edd694SDavid S. Miller 
prom_itlb_load(unsigned long index,unsigned long tte_data,unsigned long vaddr)2235de18cdeSSam Ravnborg long prom_itlb_load(unsigned long index,
2245de18cdeSSam Ravnborg 		    unsigned long tte_data,
2255de18cdeSSam Ravnborg 		    unsigned long vaddr)
2265de18cdeSSam Ravnborg {
22725edd694SDavid S. Miller 	return tlb_load("SUNW,itlb-load", index, tte_data, vaddr);
2285de18cdeSSam Ravnborg }
2295de18cdeSSam Ravnborg 
prom_dtlb_load(unsigned long index,unsigned long tte_data,unsigned long vaddr)2305de18cdeSSam Ravnborg long prom_dtlb_load(unsigned long index,
2315de18cdeSSam Ravnborg 		    unsigned long tte_data,
2325de18cdeSSam Ravnborg 		    unsigned long vaddr)
2335de18cdeSSam Ravnborg {
23425edd694SDavid S. Miller 	return tlb_load("SUNW,dtlb-load", index, tte_data, vaddr);
2355de18cdeSSam Ravnborg }
2365de18cdeSSam Ravnborg 
prom_map(int mode,unsigned long size,unsigned long vaddr,unsigned long paddr)2375de18cdeSSam Ravnborg int prom_map(int mode, unsigned long size,
2385de18cdeSSam Ravnborg 	     unsigned long vaddr, unsigned long paddr)
2395de18cdeSSam Ravnborg {
24025edd694SDavid S. Miller 	unsigned long args[11];
24125edd694SDavid S. Miller 	int ret;
2425de18cdeSSam Ravnborg 
24325edd694SDavid S. Miller 	args[0] = (unsigned long) prom_callmethod_name;
24425edd694SDavid S. Miller 	args[1] = 7;
24525edd694SDavid S. Miller 	args[2] = 1;
24625edd694SDavid S. Miller 	args[3] = (unsigned long) prom_map_name;
24725edd694SDavid S. Miller 	args[4] = (unsigned int) prom_get_mmu_ihandle();
24825edd694SDavid S. Miller 	args[5] = (unsigned int) mode;
24925edd694SDavid S. Miller 	args[6] = size;
25025edd694SDavid S. Miller 	args[7] = vaddr;
25125edd694SDavid S. Miller 	args[8] = 0;
25225edd694SDavid S. Miller 	args[9] = paddr;
25325edd694SDavid S. Miller 	args[10] = (unsigned long) -1;
25425edd694SDavid S. Miller 
25525edd694SDavid S. Miller 	p1275_cmd_direct(args);
25625edd694SDavid S. Miller 
25725edd694SDavid S. Miller 	ret = (int) args[10];
2585de18cdeSSam Ravnborg 	if (ret == 0)
2595de18cdeSSam Ravnborg 		ret = -1;
2605de18cdeSSam Ravnborg 	return ret;
2615de18cdeSSam Ravnborg }
2625de18cdeSSam Ravnborg 
prom_unmap(unsigned long size,unsigned long vaddr)2635de18cdeSSam Ravnborg void prom_unmap(unsigned long size, unsigned long vaddr)
2645de18cdeSSam Ravnborg {
26525edd694SDavid S. Miller 	unsigned long args[7];
26625edd694SDavid S. Miller 
26725edd694SDavid S. Miller 	args[0] = (unsigned long) prom_callmethod_name;
26825edd694SDavid S. Miller 	args[1] = 4;
26925edd694SDavid S. Miller 	args[2] = 0;
27025edd694SDavid S. Miller 	args[3] = (unsigned long) prom_unmap_name;
27125edd694SDavid S. Miller 	args[4] = (unsigned int) prom_get_mmu_ihandle();
27225edd694SDavid S. Miller 	args[5] = size;
27325edd694SDavid S. Miller 	args[6] = vaddr;
27425edd694SDavid S. Miller 
27525edd694SDavid S. Miller 	p1275_cmd_direct(args);
2765de18cdeSSam Ravnborg }
2775de18cdeSSam Ravnborg 
2785de18cdeSSam Ravnborg /* Set aside physical memory which is not touched or modified
2795de18cdeSSam Ravnborg  * across soft resets.
2805de18cdeSSam Ravnborg  */
prom_retain(const char * name,unsigned long size,unsigned long align,unsigned long * paddr)28125edd694SDavid S. Miller int prom_retain(const char *name, unsigned long size,
28225edd694SDavid S. Miller 		unsigned long align, unsigned long *paddr)
2835de18cdeSSam Ravnborg {
28425edd694SDavid S. Miller 	unsigned long args[11];
2855de18cdeSSam Ravnborg 
28625edd694SDavid S. Miller 	args[0] = (unsigned long) prom_callmethod_name;
28725edd694SDavid S. Miller 	args[1] = 5;
28825edd694SDavid S. Miller 	args[2] = 3;
28925edd694SDavid S. Miller 	args[3] = (unsigned long) "SUNW,retain";
29025edd694SDavid S. Miller 	args[4] = (unsigned int) prom_get_memory_ihandle();
29125edd694SDavid S. Miller 	args[5] = align;
29225edd694SDavid S. Miller 	args[6] = size;
29325edd694SDavid S. Miller 	args[7] = (unsigned long) name;
29425edd694SDavid S. Miller 	args[8] = (unsigned long) -1;
29525edd694SDavid S. Miller 	args[9] = (unsigned long) -1;
29625edd694SDavid S. Miller 	args[10] = (unsigned long) -1;
29725edd694SDavid S. Miller 
29825edd694SDavid S. Miller 	p1275_cmd_direct(args);
29925edd694SDavid S. Miller 
30025edd694SDavid S. Miller 	if (args[8])
30125edd694SDavid S. Miller 		return (int) args[8];
30225edd694SDavid S. Miller 
30325edd694SDavid S. Miller 	/* Next we get "phys_high" then "phys_low".  On 64-bit
30425edd694SDavid S. Miller 	 * the phys_high cell is don't care since the phys_low
30525edd694SDavid S. Miller 	 * cell has the full value.
3065de18cdeSSam Ravnborg 	 */
30725edd694SDavid S. Miller 	*paddr = args[10];
30825edd694SDavid S. Miller 
30925edd694SDavid S. Miller 	return 0;
3105de18cdeSSam Ravnborg }
3115de18cdeSSam Ravnborg 
3125de18cdeSSam Ravnborg /* Get "Unumber" string for the SIMM at the given
3135de18cdeSSam Ravnborg  * memory address.  Usually this will be of the form
3145de18cdeSSam Ravnborg  * "Uxxxx" where xxxx is a decimal number which is
3155de18cdeSSam Ravnborg  * etched into the motherboard next to the SIMM slot
3165de18cdeSSam Ravnborg  * in question.
3175de18cdeSSam Ravnborg  */
prom_getunumber(int syndrome_code,unsigned long phys_addr,char * buf,int buflen)3185de18cdeSSam Ravnborg int prom_getunumber(int syndrome_code,
3195de18cdeSSam Ravnborg 		    unsigned long phys_addr,
3205de18cdeSSam Ravnborg 		    char *buf, int buflen)
3215de18cdeSSam Ravnborg {
32225edd694SDavid S. Miller 	unsigned long args[12];
32325edd694SDavid S. Miller 
32425edd694SDavid S. Miller 	args[0] = (unsigned long) prom_callmethod_name;
32525edd694SDavid S. Miller 	args[1] = 7;
32625edd694SDavid S. Miller 	args[2] = 2;
32725edd694SDavid S. Miller 	args[3] = (unsigned long) "SUNW,get-unumber";
32825edd694SDavid S. Miller 	args[4] = (unsigned int) prom_get_memory_ihandle();
32925edd694SDavid S. Miller 	args[5] = buflen;
33025edd694SDavid S. Miller 	args[6] = (unsigned long) buf;
33125edd694SDavid S. Miller 	args[7] = 0;
33225edd694SDavid S. Miller 	args[8] = phys_addr;
33325edd694SDavid S. Miller 	args[9] = (unsigned int) syndrome_code;
33425edd694SDavid S. Miller 	args[10] = (unsigned long) -1;
33525edd694SDavid S. Miller 	args[11] = (unsigned long) -1;
33625edd694SDavid S. Miller 
33725edd694SDavid S. Miller 	p1275_cmd_direct(args);
33825edd694SDavid S. Miller 
33925edd694SDavid S. Miller 	return (int) args[10];
3405de18cdeSSam Ravnborg }
3415de18cdeSSam Ravnborg 
3425de18cdeSSam Ravnborg /* Power management extensions. */
prom_sleepself(void)3435de18cdeSSam Ravnborg void prom_sleepself(void)
3445de18cdeSSam Ravnborg {
34525edd694SDavid S. Miller 	unsigned long args[3];
34625edd694SDavid S. Miller 
34725edd694SDavid S. Miller 	args[0] = (unsigned long) "SUNW,sleep-self";
34825edd694SDavid S. Miller 	args[1] = 0;
34925edd694SDavid S. Miller 	args[2] = 0;
35025edd694SDavid S. Miller 	p1275_cmd_direct(args);
3515de18cdeSSam Ravnborg }
3525de18cdeSSam Ravnborg 
prom_sleepsystem(void)3535de18cdeSSam Ravnborg int prom_sleepsystem(void)
3545de18cdeSSam Ravnborg {
35525edd694SDavid S. Miller 	unsigned long args[4];
35625edd694SDavid S. Miller 
35725edd694SDavid S. Miller 	args[0] = (unsigned long) "SUNW,sleep-system";
35825edd694SDavid S. Miller 	args[1] = 0;
35925edd694SDavid S. Miller 	args[2] = 1;
36025edd694SDavid S. Miller 	args[3] = (unsigned long) -1;
36125edd694SDavid S. Miller 	p1275_cmd_direct(args);
36225edd694SDavid S. Miller 
36325edd694SDavid S. Miller 	return (int) args[3];
3645de18cdeSSam Ravnborg }
3655de18cdeSSam Ravnborg 
prom_wakeupsystem(void)3665de18cdeSSam Ravnborg int prom_wakeupsystem(void)
3675de18cdeSSam Ravnborg {
36825edd694SDavid S. Miller 	unsigned long args[4];
36925edd694SDavid S. Miller 
37025edd694SDavid S. Miller 	args[0] = (unsigned long) "SUNW,wakeup-system";
37125edd694SDavid S. Miller 	args[1] = 0;
37225edd694SDavid S. Miller 	args[2] = 1;
37325edd694SDavid S. Miller 	args[3] = (unsigned long) -1;
37425edd694SDavid S. Miller 	p1275_cmd_direct(args);
37525edd694SDavid S. Miller 
37625edd694SDavid S. Miller 	return (int) args[3];
3775de18cdeSSam Ravnborg }
3785de18cdeSSam Ravnborg 
3795de18cdeSSam Ravnborg #ifdef CONFIG_SMP
prom_startcpu(int cpunode,unsigned long pc,unsigned long arg)3805de18cdeSSam Ravnborg void prom_startcpu(int cpunode, unsigned long pc, unsigned long arg)
3815de18cdeSSam Ravnborg {
38225edd694SDavid S. Miller 	unsigned long args[6];
38325edd694SDavid S. Miller 
38425edd694SDavid S. Miller 	args[0] = (unsigned long) "SUNW,start-cpu";
38525edd694SDavid S. Miller 	args[1] = 3;
38625edd694SDavid S. Miller 	args[2] = 0;
38725edd694SDavid S. Miller 	args[3] = (unsigned int) cpunode;
38825edd694SDavid S. Miller 	args[4] = pc;
38925edd694SDavid S. Miller 	args[5] = arg;
39025edd694SDavid S. Miller 	p1275_cmd_direct(args);
3915de18cdeSSam Ravnborg }
3925de18cdeSSam Ravnborg 
prom_startcpu_cpuid(int cpuid,unsigned long pc,unsigned long arg)3935de18cdeSSam Ravnborg void prom_startcpu_cpuid(int cpuid, unsigned long pc, unsigned long arg)
3945de18cdeSSam Ravnborg {
39525edd694SDavid S. Miller 	unsigned long args[6];
39625edd694SDavid S. Miller 
39725edd694SDavid S. Miller 	args[0] = (unsigned long) "SUNW,start-cpu-by-cpuid";
39825edd694SDavid S. Miller 	args[1] = 3;
39925edd694SDavid S. Miller 	args[2] = 0;
40025edd694SDavid S. Miller 	args[3] = (unsigned int) cpuid;
40125edd694SDavid S. Miller 	args[4] = pc;
40225edd694SDavid S. Miller 	args[5] = arg;
40325edd694SDavid S. Miller 	p1275_cmd_direct(args);
4045de18cdeSSam Ravnborg }
4055de18cdeSSam Ravnborg 
prom_stopcpu_cpuid(int cpuid)4065de18cdeSSam Ravnborg void prom_stopcpu_cpuid(int cpuid)
4075de18cdeSSam Ravnborg {
40825edd694SDavid S. Miller 	unsigned long args[4];
40925edd694SDavid S. Miller 
41025edd694SDavid S. Miller 	args[0] = (unsigned long) "SUNW,stop-cpu-by-cpuid";
41125edd694SDavid S. Miller 	args[1] = 1;
41225edd694SDavid S. Miller 	args[2] = 0;
41325edd694SDavid S. Miller 	args[3] = (unsigned int) cpuid;
41425edd694SDavid S. Miller 	p1275_cmd_direct(args);
4155de18cdeSSam Ravnborg }
4165de18cdeSSam Ravnborg 
prom_stopself(void)4175de18cdeSSam Ravnborg void prom_stopself(void)
4185de18cdeSSam Ravnborg {
41925edd694SDavid S. Miller 	unsigned long args[3];
42025edd694SDavid S. Miller 
42125edd694SDavid S. Miller 	args[0] = (unsigned long) "SUNW,stop-self";
42225edd694SDavid S. Miller 	args[1] = 0;
42325edd694SDavid S. Miller 	args[2] = 0;
42425edd694SDavid S. Miller 	p1275_cmd_direct(args);
4255de18cdeSSam Ravnborg }
4265de18cdeSSam Ravnborg 
prom_idleself(void)4275de18cdeSSam Ravnborg void prom_idleself(void)
4285de18cdeSSam Ravnborg {
42925edd694SDavid S. Miller 	unsigned long args[3];
43025edd694SDavid S. Miller 
43125edd694SDavid S. Miller 	args[0] = (unsigned long) "SUNW,idle-self";
43225edd694SDavid S. Miller 	args[1] = 0;
43325edd694SDavid S. Miller 	args[2] = 0;
43425edd694SDavid S. Miller 	p1275_cmd_direct(args);
4355de18cdeSSam Ravnborg }
4365de18cdeSSam Ravnborg 
prom_resumecpu(int cpunode)4375de18cdeSSam Ravnborg void prom_resumecpu(int cpunode)
4385de18cdeSSam Ravnborg {
43925edd694SDavid S. Miller 	unsigned long args[4];
44025edd694SDavid S. Miller 
44125edd694SDavid S. Miller 	args[0] = (unsigned long) "SUNW,resume-cpu";
44225edd694SDavid S. Miller 	args[1] = 1;
44325edd694SDavid S. Miller 	args[2] = 0;
44425edd694SDavid S. Miller 	args[3] = (unsigned int) cpunode;
44525edd694SDavid S. Miller 	p1275_cmd_direct(args);
4465de18cdeSSam Ravnborg }
4475de18cdeSSam Ravnborg #endif
448