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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: init.c,v 1.14 2000/01/29 01:09:12 anton Exp $
  2.  * init.c:  Initialize internal variables used by the PROM
  3.  *          library functions.
  4.  *
  5.  * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
  6.  * Copyright (C) 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
  7.  */
  8. #include <linux/config.h>
  9. #include <linux/kernel.h>
  10. #include <linux/init.h>
  11. #include <asm/openprom.h>
  12. #include <asm/oplib.h>
  13. #include <asm/sun4prom.h>
  14. struct linux_romvec *romvec;
  15. enum prom_major_version prom_vers;
  16. unsigned int prom_rev, prom_prev;
  17. linux_sun4_romvec *sun4_romvec;
  18. /* The root node of the prom device tree. */
  19. int prom_root_node;
  20. int prom_stdin, prom_stdout;
  21. /* Pointer to the device tree operations structure. */
  22. struct linux_nodeops *prom_nodeops;
  23. /* You must call prom_init() before you attempt to use any of the
  24.  * routines in the prom library.  It returns 0 on success, 1 on
  25.  * failure.  It gets passed the pointer to the PROM vector.
  26.  */
  27. extern void prom_meminit(void);
  28. extern void prom_ranges_init(void);
  29. void __init prom_init(struct linux_romvec *rp)
  30. {
  31. #ifdef CONFIG_SUN4
  32. extern struct linux_romvec *sun4_prom_init(void);
  33. rp = sun4_prom_init();
  34. #endif
  35. romvec = rp;
  36. switch(romvec->pv_romvers) {
  37. case 0:
  38. prom_vers = PROM_V0;
  39. break;
  40. case 2:
  41. prom_vers = PROM_V2;
  42. break;
  43. case 3:
  44. prom_vers = PROM_V3;
  45. break;
  46. case 40:
  47. prom_vers = PROM_SUN4;
  48. break;
  49. default:
  50. prom_printf("PROMLIB: Bad PROM version %dn",
  51.     romvec->pv_romvers);
  52. prom_halt();
  53. break;
  54. };
  55. prom_rev = romvec->pv_plugin_revision;
  56. prom_prev = romvec->pv_printrev;
  57. prom_nodeops = romvec->pv_nodeops;
  58. prom_root_node = prom_getsibling(0);
  59. if((prom_root_node == 0) || (prom_root_node == -1))
  60. prom_halt();
  61. if((((unsigned long) prom_nodeops) == 0) || 
  62.    (((unsigned long) prom_nodeops) == -1))
  63. prom_halt();
  64. if(prom_vers == PROM_V2 || prom_vers == PROM_V3) {
  65. prom_stdout = *romvec->pv_v2bootargs.fd_stdout;
  66. prom_stdin  = *romvec->pv_v2bootargs.fd_stdin;
  67. }
  68. prom_meminit();
  69. prom_ranges_init();
  70. #ifndef CONFIG_SUN4
  71. /* SUN4 prints this in sun4_prom_init */
  72. printk("PROMLIB: Sun Boot Prom Version %d Revision %dn",
  73.        romvec->pv_romvers, prom_rev);
  74. #endif
  75. /* Initialization successful. */
  76. return;
  77. }