1708d4f09SSam Ravnborg /* 2708d4f09SSam Ravnborg * misc.c: Miscellaneous prom functions that don't belong 3708d4f09SSam Ravnborg * anywhere else. 4708d4f09SSam Ravnborg * 5708d4f09SSam Ravnborg * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 6708d4f09SSam Ravnborg */ 7708d4f09SSam Ravnborg 8708d4f09SSam Ravnborg #include <linux/types.h> 9708d4f09SSam Ravnborg #include <linux/kernel.h> 10708d4f09SSam Ravnborg #include <linux/sched.h> 11708d4f09SSam Ravnborg #include <asm/openprom.h> 12708d4f09SSam Ravnborg #include <asm/oplib.h> 13708d4f09SSam Ravnborg #include <asm/auxio.h> 14708d4f09SSam Ravnborg #include <asm/system.h> 15708d4f09SSam Ravnborg 16708d4f09SSam Ravnborg extern void restore_current(void); 17708d4f09SSam Ravnborg 18708d4f09SSam Ravnborg DEFINE_SPINLOCK(prom_lock); 19708d4f09SSam Ravnborg 20708d4f09SSam Ravnborg /* Reset and reboot the machine with the command 'bcommand'. */ 21708d4f09SSam Ravnborg void 22708d4f09SSam Ravnborg prom_reboot(char *bcommand) 23708d4f09SSam Ravnborg { 24708d4f09SSam Ravnborg unsigned long flags; 25708d4f09SSam Ravnborg spin_lock_irqsave(&prom_lock, flags); 26708d4f09SSam Ravnborg (*(romvec->pv_reboot))(bcommand); 27708d4f09SSam Ravnborg /* Never get here. */ 28708d4f09SSam Ravnborg restore_current(); 29708d4f09SSam Ravnborg spin_unlock_irqrestore(&prom_lock, flags); 30708d4f09SSam Ravnborg } 31708d4f09SSam Ravnborg 32708d4f09SSam Ravnborg /* Forth evaluate the expression contained in 'fstring'. */ 33708d4f09SSam Ravnborg void 34708d4f09SSam Ravnborg prom_feval(char *fstring) 35708d4f09SSam Ravnborg { 36708d4f09SSam Ravnborg unsigned long flags; 37708d4f09SSam Ravnborg if(!fstring || fstring[0] == 0) 38708d4f09SSam Ravnborg return; 39708d4f09SSam Ravnborg spin_lock_irqsave(&prom_lock, flags); 40708d4f09SSam Ravnborg if(prom_vers == PROM_V0) 41708d4f09SSam Ravnborg (*(romvec->pv_fortheval.v0_eval))(strlen(fstring), fstring); 42708d4f09SSam Ravnborg else 43708d4f09SSam Ravnborg (*(romvec->pv_fortheval.v2_eval))(fstring); 44708d4f09SSam Ravnborg restore_current(); 45708d4f09SSam Ravnborg spin_unlock_irqrestore(&prom_lock, flags); 46708d4f09SSam Ravnborg } 47708d4f09SSam Ravnborg 48708d4f09SSam Ravnborg /* Drop into the prom, with the chance to continue with the 'go' 49708d4f09SSam Ravnborg * prom command. 50708d4f09SSam Ravnborg */ 51708d4f09SSam Ravnborg void 52708d4f09SSam Ravnborg prom_cmdline(void) 53708d4f09SSam Ravnborg { 54708d4f09SSam Ravnborg extern void install_obp_ticker(void); 55708d4f09SSam Ravnborg extern void install_linux_ticker(void); 56708d4f09SSam Ravnborg unsigned long flags; 57708d4f09SSam Ravnborg 58708d4f09SSam Ravnborg spin_lock_irqsave(&prom_lock, flags); 59708d4f09SSam Ravnborg install_obp_ticker(); 60708d4f09SSam Ravnborg (*(romvec->pv_abort))(); 61708d4f09SSam Ravnborg restore_current(); 62708d4f09SSam Ravnborg install_linux_ticker(); 63708d4f09SSam Ravnborg spin_unlock_irqrestore(&prom_lock, flags); 64708d4f09SSam Ravnborg #ifdef CONFIG_SUN_AUXIO 65708d4f09SSam Ravnborg set_auxio(AUXIO_LED, 0); 66708d4f09SSam Ravnborg #endif 67708d4f09SSam Ravnborg } 68708d4f09SSam Ravnborg 69708d4f09SSam Ravnborg /* Drop into the prom, but completely terminate the program. 70708d4f09SSam Ravnborg * No chance of continuing. 71708d4f09SSam Ravnborg */ 72708d4f09SSam Ravnborg void 73708d4f09SSam Ravnborg prom_halt(void) 74708d4f09SSam Ravnborg { 75708d4f09SSam Ravnborg unsigned long flags; 76708d4f09SSam Ravnborg again: 77708d4f09SSam Ravnborg spin_lock_irqsave(&prom_lock, flags); 78708d4f09SSam Ravnborg (*(romvec->pv_halt))(); 79708d4f09SSam Ravnborg /* Never get here. */ 80708d4f09SSam Ravnborg restore_current(); 81708d4f09SSam Ravnborg spin_unlock_irqrestore(&prom_lock, flags); 82708d4f09SSam Ravnborg goto again; /* PROM is out to get me -DaveM */ 83708d4f09SSam Ravnborg } 84708d4f09SSam Ravnborg 85708d4f09SSam Ravnborg typedef void (*sfunc_t)(void); 86708d4f09SSam Ravnborg 87708d4f09SSam Ravnborg /* Set prom sync handler to call function 'funcp'. */ 88708d4f09SSam Ravnborg void 89708d4f09SSam Ravnborg prom_setsync(sfunc_t funcp) 90708d4f09SSam Ravnborg { 91708d4f09SSam Ravnborg if(!funcp) return; 92708d4f09SSam Ravnborg *romvec->pv_synchook = funcp; 93708d4f09SSam Ravnborg } 94708d4f09SSam Ravnborg 95708d4f09SSam Ravnborg /* Get the idprom and stuff it into buffer 'idbuf'. Returns the 96708d4f09SSam Ravnborg * format type. 'num_bytes' is the number of bytes that your idbuf 97708d4f09SSam Ravnborg * has space for. Returns 0xff on error. 98708d4f09SSam Ravnborg */ 99708d4f09SSam Ravnborg unsigned char 100708d4f09SSam Ravnborg prom_get_idprom(char *idbuf, int num_bytes) 101708d4f09SSam Ravnborg { 102708d4f09SSam Ravnborg int len; 103708d4f09SSam Ravnborg 104708d4f09SSam Ravnborg len = prom_getproplen(prom_root_node, "idprom"); 105708d4f09SSam Ravnborg if((len>num_bytes) || (len==-1)) return 0xff; 106708d4f09SSam Ravnborg if(!prom_getproperty(prom_root_node, "idprom", idbuf, num_bytes)) 107708d4f09SSam Ravnborg return idbuf[0]; 108708d4f09SSam Ravnborg 109708d4f09SSam Ravnborg return 0xff; 110708d4f09SSam Ravnborg } 111708d4f09SSam Ravnborg 112708d4f09SSam Ravnborg /* Get the major prom version number. */ 113708d4f09SSam Ravnborg int 114708d4f09SSam Ravnborg prom_version(void) 115708d4f09SSam Ravnborg { 116708d4f09SSam Ravnborg return romvec->pv_romvers; 117708d4f09SSam Ravnborg } 118708d4f09SSam Ravnborg 119708d4f09SSam Ravnborg /* Get the prom plugin-revision. */ 120708d4f09SSam Ravnborg int 121708d4f09SSam Ravnborg prom_getrev(void) 122708d4f09SSam Ravnborg { 123708d4f09SSam Ravnborg return prom_rev; 124708d4f09SSam Ravnborg } 125708d4f09SSam Ravnborg 126708d4f09SSam Ravnborg /* Get the prom firmware print revision. */ 127708d4f09SSam Ravnborg int 128708d4f09SSam Ravnborg prom_getprev(void) 129708d4f09SSam Ravnborg { 130708d4f09SSam Ravnborg return prom_prev; 131708d4f09SSam Ravnborg } 132