1*b2441318SGreg 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 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 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'. */ 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'. */ 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 */ 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 */ 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 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 */ 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 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 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. */ 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 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 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 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 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 */ 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 */ 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. */ 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 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 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 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 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 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 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 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 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