linux/arch/sparc/prom/misc_32.c
<<
>>
Prefs
   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 <linux/module.h>
  13
  14#include <asm/openprom.h>
  15#include <asm/oplib.h>
  16#include <asm/auxio.h>
  17
  18extern void restore_current(void);
  19
  20DEFINE_SPINLOCK(prom_lock);
  21
  22/* Reset and reboot the machine with the command 'bcommand'. */
  23void
  24prom_reboot(char *bcommand)
  25{
  26        unsigned long flags;
  27        spin_lock_irqsave(&prom_lock, flags);
  28        (*(romvec->pv_reboot))(bcommand);
  29        /* Never get here. */
  30        restore_current();
  31        spin_unlock_irqrestore(&prom_lock, flags);
  32}
  33
  34/* Forth evaluate the expression contained in 'fstring'. */
  35void
  36prom_feval(char *fstring)
  37{
  38        unsigned long flags;
  39        if(!fstring || fstring[0] == 0)
  40                return;
  41        spin_lock_irqsave(&prom_lock, flags);
  42        if(prom_vers == PROM_V0)
  43                (*(romvec->pv_fortheval.v0_eval))(strlen(fstring), fstring);
  44        else
  45                (*(romvec->pv_fortheval.v2_eval))(fstring);
  46        restore_current();
  47        spin_unlock_irqrestore(&prom_lock, flags);
  48}
  49EXPORT_SYMBOL(prom_feval);
  50
  51/* Drop into the prom, with the chance to continue with the 'go'
  52 * prom command.
  53 */
  54void
  55prom_cmdline(void)
  56{
  57        unsigned long flags;
  58
  59        spin_lock_irqsave(&prom_lock, flags);
  60        (*(romvec->pv_abort))();
  61        restore_current();
  62        spin_unlock_irqrestore(&prom_lock, flags);
  63        set_auxio(AUXIO_LED, 0);
  64}
  65
  66/* Drop into the prom, but completely terminate the program.
  67 * No chance of continuing.
  68 */
  69void __noreturn
  70prom_halt(void)
  71{
  72        unsigned long flags;
  73again:
  74        spin_lock_irqsave(&prom_lock, flags);
  75        (*(romvec->pv_halt))();
  76        /* Never get here. */
  77        restore_current();
  78        spin_unlock_irqrestore(&prom_lock, flags);
  79        goto again; /* PROM is out to get me -DaveM */
  80}
  81
  82typedef void (*sfunc_t)(void);
  83
  84/* Set prom sync handler to call function 'funcp'. */
  85void
  86prom_setsync(sfunc_t funcp)
  87{
  88        if(!funcp) return;
  89        *romvec->pv_synchook = funcp;
  90}
  91
  92/* Get the idprom and stuff it into buffer 'idbuf'.  Returns the
  93 * format type.  'num_bytes' is the number of bytes that your idbuf
  94 * has space for.  Returns 0xff on error.
  95 */
  96unsigned char
  97prom_get_idprom(char *idbuf, int num_bytes)
  98{
  99        int len;
 100
 101        len = prom_getproplen(prom_root_node, "idprom");
 102        if((len>num_bytes) || (len==-1)) return 0xff;
 103        if(!prom_getproperty(prom_root_node, "idprom", idbuf, num_bytes))
 104                return idbuf[0];
 105
 106        return 0xff;
 107}
 108
 109/* Get the major prom version number. */
 110int
 111prom_version(void)
 112{
 113        return romvec->pv_romvers;
 114}
 115
 116/* Get the prom plugin-revision. */
 117int
 118prom_getrev(void)
 119{
 120        return prom_rev;
 121}
 122
 123/* Get the prom firmware print revision. */
 124int
 125prom_getprev(void)
 126{
 127        return prom_prev;
 128}
 129