misc.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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