1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * misc.c: Miscellaneous prom functions that don't belong 4 * anywhere else. 5 * 6 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 7 */ 8 9 #include <linux/types.h> 10 #include <linux/kernel.h> 11 #include <linux/sched.h> 12 #include <asm/sun3-head.h> 13 #include <asm/idprom.h> 14 #include <asm/openprom.h> 15 #include <asm/oplib.h> 16 #include <asm/movs.h> 17 18 /* Reset and reboot the machine with the command 'bcommand'. */ 19 void prom_reboot(char * bcommand)20prom_reboot(char *bcommand) 21 { 22 unsigned long flags; 23 local_irq_save(flags); 24 (*(romvec->pv_reboot))(bcommand); 25 local_irq_restore(flags); 26 } 27 28 /* Drop into the prom, with the chance to continue with the 'go' 29 * prom command. 30 */ 31 void prom_cmdline(void)32prom_cmdline(void) 33 { 34 } 35 36 /* Drop into the prom, but completely terminate the program. 37 * No chance of continuing. 38 */ 39 void prom_halt(void)40prom_halt(void) 41 { 42 unsigned long flags; 43 again: 44 local_irq_save(flags); 45 (*(romvec->pv_halt))(); 46 local_irq_restore(flags); 47 goto again; /* PROM is out to get me -DaveM */ 48 } 49 50 typedef void (*sfunc_t)(void); 51 52 /* Get the idprom and stuff it into buffer 'idbuf'. Returns the 53 * format type. 'num_bytes' is the number of bytes that your idbuf 54 * has space for. Returns 0xff on error. 55 */ 56 unsigned char prom_get_idprom(char * idbuf,int num_bytes)57prom_get_idprom(char *idbuf, int num_bytes) 58 { 59 int i, oldsfc; 60 GET_SFC(oldsfc); 61 SET_SFC(FC_CONTROL); 62 for(i=0;i<num_bytes; i++) 63 { 64 /* There is a problem with the GET_CONTROL_BYTE 65 macro; defining the extra variable 66 gets around it. 67 */ 68 int c; 69 GET_CONTROL_BYTE(SUN3_IDPROM_BASE + i, c); 70 idbuf[i] = c; 71 } 72 SET_SFC(oldsfc); 73 return idbuf[0]; 74 } 75 76 /* Get the major prom version number. */ 77 int prom_version(void)78prom_version(void) 79 { 80 return romvec->pv_romvers; 81 } 82 83 /* Get the prom plugin-revision. */ 84 int prom_getrev(void)85prom_getrev(void) 86 { 87 return prom_rev; 88 } 89 90 /* Get the prom firmware print revision. */ 91 int prom_getprev(void)92prom_getprev(void) 93 { 94 return prom_prev; 95 } 96