18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * misc.c: Miscellaneous prom functions that don't belong 48c2ecf20Sopenharmony_ci * anywhere else. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/types.h> 108c2ecf20Sopenharmony_ci#include <linux/kernel.h> 118c2ecf20Sopenharmony_ci#include <linux/sched.h> 128c2ecf20Sopenharmony_ci#include <asm/sun3-head.h> 138c2ecf20Sopenharmony_ci#include <asm/idprom.h> 148c2ecf20Sopenharmony_ci#include <asm/openprom.h> 158c2ecf20Sopenharmony_ci#include <asm/oplib.h> 168c2ecf20Sopenharmony_ci#include <asm/movs.h> 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci/* Reset and reboot the machine with the command 'bcommand'. */ 198c2ecf20Sopenharmony_civoid 208c2ecf20Sopenharmony_ciprom_reboot(char *bcommand) 218c2ecf20Sopenharmony_ci{ 228c2ecf20Sopenharmony_ci unsigned long flags; 238c2ecf20Sopenharmony_ci local_irq_save(flags); 248c2ecf20Sopenharmony_ci (*(romvec->pv_reboot))(bcommand); 258c2ecf20Sopenharmony_ci local_irq_restore(flags); 268c2ecf20Sopenharmony_ci} 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci/* Drop into the prom, with the chance to continue with the 'go' 298c2ecf20Sopenharmony_ci * prom command. 308c2ecf20Sopenharmony_ci */ 318c2ecf20Sopenharmony_civoid 328c2ecf20Sopenharmony_ciprom_cmdline(void) 338c2ecf20Sopenharmony_ci{ 348c2ecf20Sopenharmony_ci} 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci/* Drop into the prom, but completely terminate the program. 378c2ecf20Sopenharmony_ci * No chance of continuing. 388c2ecf20Sopenharmony_ci */ 398c2ecf20Sopenharmony_civoid 408c2ecf20Sopenharmony_ciprom_halt(void) 418c2ecf20Sopenharmony_ci{ 428c2ecf20Sopenharmony_ci unsigned long flags; 438c2ecf20Sopenharmony_ciagain: 448c2ecf20Sopenharmony_ci local_irq_save(flags); 458c2ecf20Sopenharmony_ci (*(romvec->pv_halt))(); 468c2ecf20Sopenharmony_ci local_irq_restore(flags); 478c2ecf20Sopenharmony_ci goto again; /* PROM is out to get me -DaveM */ 488c2ecf20Sopenharmony_ci} 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_citypedef void (*sfunc_t)(void); 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci/* Get the idprom and stuff it into buffer 'idbuf'. Returns the 538c2ecf20Sopenharmony_ci * format type. 'num_bytes' is the number of bytes that your idbuf 548c2ecf20Sopenharmony_ci * has space for. Returns 0xff on error. 558c2ecf20Sopenharmony_ci */ 568c2ecf20Sopenharmony_ciunsigned char 578c2ecf20Sopenharmony_ciprom_get_idprom(char *idbuf, int num_bytes) 588c2ecf20Sopenharmony_ci{ 598c2ecf20Sopenharmony_ci int i, oldsfc; 608c2ecf20Sopenharmony_ci GET_SFC(oldsfc); 618c2ecf20Sopenharmony_ci SET_SFC(FC_CONTROL); 628c2ecf20Sopenharmony_ci for(i=0;i<num_bytes; i++) 638c2ecf20Sopenharmony_ci { 648c2ecf20Sopenharmony_ci /* There is a problem with the GET_CONTROL_BYTE 658c2ecf20Sopenharmony_ci macro; defining the extra variable 668c2ecf20Sopenharmony_ci gets around it. 678c2ecf20Sopenharmony_ci */ 688c2ecf20Sopenharmony_ci int c; 698c2ecf20Sopenharmony_ci GET_CONTROL_BYTE(SUN3_IDPROM_BASE + i, c); 708c2ecf20Sopenharmony_ci idbuf[i] = c; 718c2ecf20Sopenharmony_ci } 728c2ecf20Sopenharmony_ci SET_SFC(oldsfc); 738c2ecf20Sopenharmony_ci return idbuf[0]; 748c2ecf20Sopenharmony_ci} 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci/* Get the major prom version number. */ 778c2ecf20Sopenharmony_ciint 788c2ecf20Sopenharmony_ciprom_version(void) 798c2ecf20Sopenharmony_ci{ 808c2ecf20Sopenharmony_ci return romvec->pv_romvers; 818c2ecf20Sopenharmony_ci} 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci/* Get the prom plugin-revision. */ 848c2ecf20Sopenharmony_ciint 858c2ecf20Sopenharmony_ciprom_getrev(void) 868c2ecf20Sopenharmony_ci{ 878c2ecf20Sopenharmony_ci return prom_rev; 888c2ecf20Sopenharmony_ci} 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci/* Get the prom firmware print revision. */ 918c2ecf20Sopenharmony_ciint 928c2ecf20Sopenharmony_ciprom_getprev(void) 938c2ecf20Sopenharmony_ci{ 948c2ecf20Sopenharmony_ci return prom_prev; 958c2ecf20Sopenharmony_ci} 96