Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.12 139 lines 3.1 kB view raw
1/* $Id: misc.c,v 1.18 2000/08/26 02:38:03 anton Exp $ 2 * misc.c: Miscellaneous prom functions that don't belong 3 * anywhere else. 4 * 5 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 6 */ 7 8#include <linux/config.h> 9#include <linux/types.h> 10#include <linux/kernel.h> 11#include <linux/sched.h> 12#include <asm/openprom.h> 13#include <asm/oplib.h> 14#include <asm/auxio.h> 15#include <asm/system.h> 16 17extern void restore_current(void); 18 19DEFINE_SPINLOCK(prom_lock); 20 21/* Reset and reboot the machine with the command 'bcommand'. */ 22void 23prom_reboot(char *bcommand) 24{ 25 unsigned long flags; 26 spin_lock_irqsave(&prom_lock, flags); 27 (*(romvec->pv_reboot))(bcommand); 28 /* Never get here. */ 29 restore_current(); 30 spin_unlock_irqrestore(&prom_lock, flags); 31} 32 33/* Forth evaluate the expression contained in 'fstring'. */ 34void 35prom_feval(char *fstring) 36{ 37 unsigned long flags; 38 if(!fstring || fstring[0] == 0) 39 return; 40 spin_lock_irqsave(&prom_lock, flags); 41 if(prom_vers == PROM_V0) 42 (*(romvec->pv_fortheval.v0_eval))(strlen(fstring), fstring); 43 else 44 (*(romvec->pv_fortheval.v2_eval))(fstring); 45 restore_current(); 46 spin_unlock_irqrestore(&prom_lock, flags); 47} 48 49/* We want to do this more nicely some day. */ 50extern void (*prom_palette)(int); 51 52/* Drop into the prom, with the chance to continue with the 'go' 53 * prom command. 54 */ 55void 56prom_cmdline(void) 57{ 58 extern void install_obp_ticker(void); 59 extern void install_linux_ticker(void); 60 unsigned long flags; 61 62 if(!serial_console && prom_palette) 63 prom_palette (1); 64 spin_lock_irqsave(&prom_lock, flags); 65 install_obp_ticker(); 66 (*(romvec->pv_abort))(); 67 restore_current(); 68 install_linux_ticker(); 69 spin_unlock_irqrestore(&prom_lock, flags); 70#ifdef CONFIG_SUN_AUXIO 71 set_auxio(AUXIO_LED, 0); 72#endif 73 if(!serial_console && prom_palette) 74 prom_palette (0); 75} 76 77/* Drop into the prom, but completely terminate the program. 78 * No chance of continuing. 79 */ 80void 81prom_halt(void) 82{ 83 unsigned long flags; 84again: 85 spin_lock_irqsave(&prom_lock, flags); 86 (*(romvec->pv_halt))(); 87 /* Never get here. */ 88 restore_current(); 89 spin_unlock_irqrestore(&prom_lock, flags); 90 goto again; /* PROM is out to get me -DaveM */ 91} 92 93typedef void (*sfunc_t)(void); 94 95/* Set prom sync handler to call function 'funcp'. */ 96void 97prom_setsync(sfunc_t funcp) 98{ 99 if(!funcp) return; 100 *romvec->pv_synchook = funcp; 101} 102 103/* Get the idprom and stuff it into buffer 'idbuf'. Returns the 104 * format type. 'num_bytes' is the number of bytes that your idbuf 105 * has space for. Returns 0xff on error. 106 */ 107unsigned char 108prom_get_idprom(char *idbuf, int num_bytes) 109{ 110 int len; 111 112 len = prom_getproplen(prom_root_node, "idprom"); 113 if((len>num_bytes) || (len==-1)) return 0xff; 114 if(!prom_getproperty(prom_root_node, "idprom", idbuf, num_bytes)) 115 return idbuf[0]; 116 117 return 0xff; 118} 119 120/* Get the major prom version number. */ 121int 122prom_version(void) 123{ 124 return romvec->pv_romvers; 125} 126 127/* Get the prom plugin-revision. */ 128int 129prom_getrev(void) 130{ 131 return prom_rev; 132} 133 134/* Get the prom firmware print revision. */ 135int 136prom_getprev(void) 137{ 138 return prom_prev; 139}