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#include <asm/system.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        extern void install_obp_ticker(void);
  58        extern void install_linux_ticker(void);
  59        unsigned long flags;
  60
  61        spin_lock_irqsave(&prom_lock, flags);
  62        install_obp_ticker();
  63        (*(romvec->pv_abort))();
  64        restore_current();
  65        install_linux_ticker();
  66        spin_unlock_irqrestore(&prom_lock, flags);
  67        set_auxio(AUXIO_LED, 0);
  68}
  69
  70/* Drop into the prom, but completely terminate the program.
  71 * No chance of continuing.
  72 */
  73void
  74prom_halt(void)
  75{
  76        unsigned long flags;
  77again:
  78        spin_lock_irqsave(&prom_lock, flags);
  79        (*(romvec->pv_halt))();
  80        /* Never get here. */
  81        restore_current();
  82        spin_unlock_irqrestore(&prom_lock, flags);
  83        goto again; /* PROM is out to get me -DaveM */
  84}
  85
  86typedef void (*sfunc_t)(void);
  87
  88/* Set prom sync handler to call function 'funcp'. */
  89void
  90prom_setsync(sfunc_t funcp)
  91{
  92        if(!funcp) return;
  93        *romvec->pv_synchook = funcp;
  94}
  95
  96/* Get the idprom and stuff it into buffer 'idbuf'.  Returns the
  97 * format type.  'num_bytes' is the number of bytes that your idbuf
  98 * has space for.  Returns 0xff on error.
  99 */
 100unsigned char
 101prom_get_idprom(char *idbuf, int num_bytes)
 102{
 103        int len;
 104
 105        len = prom_getproplen(prom_root_node, "idprom");
 106        if((len>num_bytes) || (len==-1)) return 0xff;
 107        if(!prom_getproperty(prom_root_node, "idprom", idbuf, num_bytes))
 108                return idbuf[0];
 109
 110        return 0xff;
 111}
 112
 113/* Get the major prom version number. */
 114int
 115prom_version(void)
 116{
 117        return romvec->pv_romvers;
 118}
 119
 120/* Get the prom plugin-revision. */
 121int
 122prom_getrev(void)
 123{
 124        return prom_rev;
 125}
 126
 127/* Get the prom firmware print revision. */
 128int
 129prom_getprev(void)
 130{
 131        return prom_prev;
 132}
 133