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