162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * misc.c: Miscellaneous prom functions that don't belong 462306a36Sopenharmony_ci * anywhere else. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/types.h> 1062306a36Sopenharmony_ci#include <linux/kernel.h> 1162306a36Sopenharmony_ci#include <linux/sched.h> 1262306a36Sopenharmony_ci#include <asm/sun3-head.h> 1362306a36Sopenharmony_ci#include <asm/idprom.h> 1462306a36Sopenharmony_ci#include <asm/openprom.h> 1562306a36Sopenharmony_ci#include <asm/oplib.h> 1662306a36Sopenharmony_ci#include <asm/movs.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci/* Reset and reboot the machine with the command 'bcommand'. */ 1962306a36Sopenharmony_civoid 2062306a36Sopenharmony_ciprom_reboot(char *bcommand) 2162306a36Sopenharmony_ci{ 2262306a36Sopenharmony_ci unsigned long flags; 2362306a36Sopenharmony_ci local_irq_save(flags); 2462306a36Sopenharmony_ci (*(romvec->pv_reboot))(bcommand); 2562306a36Sopenharmony_ci local_irq_restore(flags); 2662306a36Sopenharmony_ci} 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci/* Drop into the prom, with the chance to continue with the 'go' 2962306a36Sopenharmony_ci * prom command. 3062306a36Sopenharmony_ci */ 3162306a36Sopenharmony_civoid 3262306a36Sopenharmony_ciprom_cmdline(void) 3362306a36Sopenharmony_ci{ 3462306a36Sopenharmony_ci} 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci/* Drop into the prom, but completely terminate the program. 3762306a36Sopenharmony_ci * No chance of continuing. 3862306a36Sopenharmony_ci */ 3962306a36Sopenharmony_civoid 4062306a36Sopenharmony_ciprom_halt(void) 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci unsigned long flags; 4362306a36Sopenharmony_ciagain: 4462306a36Sopenharmony_ci local_irq_save(flags); 4562306a36Sopenharmony_ci (*(romvec->pv_halt))(); 4662306a36Sopenharmony_ci local_irq_restore(flags); 4762306a36Sopenharmony_ci goto again; /* PROM is out to get me -DaveM */ 4862306a36Sopenharmony_ci} 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_citypedef void (*sfunc_t)(void); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci/* Get the idprom and stuff it into buffer 'idbuf'. Returns the 5362306a36Sopenharmony_ci * format type. 'num_bytes' is the number of bytes that your idbuf 5462306a36Sopenharmony_ci * has space for. Returns 0xff on error. 5562306a36Sopenharmony_ci */ 5662306a36Sopenharmony_ciunsigned char 5762306a36Sopenharmony_ciprom_get_idprom(char *idbuf, int num_bytes) 5862306a36Sopenharmony_ci{ 5962306a36Sopenharmony_ci int i, oldsfc; 6062306a36Sopenharmony_ci GET_SFC(oldsfc); 6162306a36Sopenharmony_ci SET_SFC(FC_CONTROL); 6262306a36Sopenharmony_ci for(i=0;i<num_bytes; i++) 6362306a36Sopenharmony_ci { 6462306a36Sopenharmony_ci /* There is a problem with the GET_CONTROL_BYTE 6562306a36Sopenharmony_ci macro; defining the extra variable 6662306a36Sopenharmony_ci gets around it. 6762306a36Sopenharmony_ci */ 6862306a36Sopenharmony_ci int c; 6962306a36Sopenharmony_ci GET_CONTROL_BYTE(SUN3_IDPROM_BASE + i, c); 7062306a36Sopenharmony_ci idbuf[i] = c; 7162306a36Sopenharmony_ci } 7262306a36Sopenharmony_ci SET_SFC(oldsfc); 7362306a36Sopenharmony_ci return idbuf[0]; 7462306a36Sopenharmony_ci} 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci/* Get the major prom version number. */ 7762306a36Sopenharmony_ciint 7862306a36Sopenharmony_ciprom_version(void) 7962306a36Sopenharmony_ci{ 8062306a36Sopenharmony_ci return romvec->pv_romvers; 8162306a36Sopenharmony_ci} 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci/* Get the prom plugin-revision. */ 8462306a36Sopenharmony_ciint 8562306a36Sopenharmony_ciprom_getrev(void) 8662306a36Sopenharmony_ci{ 8762306a36Sopenharmony_ci return prom_rev; 8862306a36Sopenharmony_ci} 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci/* Get the prom firmware print revision. */ 9162306a36Sopenharmony_ciint 9262306a36Sopenharmony_ciprom_getprev(void) 9362306a36Sopenharmony_ci{ 9462306a36Sopenharmony_ci return prom_prev; 9562306a36Sopenharmony_ci} 96