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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * init.c: PROM library initialisation code.
  3.  *
  4.  * Copyright (C) 1998 Harald Koerfgen
  5.  */
  6. #include <linux/init.h>
  7. #include <linux/config.h>
  8. #include <asm/bootinfo.h>
  9. #include <asm/cpu.h>
  10. #include "prom.h"
  11. /*
  12.  * PROM Interface (whichprom.c)
  13.  */
  14. typedef struct {
  15. int pagesize;
  16. unsigned char bitmap[0];
  17. } memmap;
  18. int (*rex_bootinit)(void);
  19. int (*rex_bootread)(void);
  20. int (*rex_getbitmap)(memmap *);
  21. unsigned long *(*rex_slot_address)(int);
  22. void *(*rex_gettcinfo)(void);
  23. int (*rex_getsysid)(void);
  24. void (*rex_clear_cache)(void);
  25. int (*prom_getchar)(void);
  26. char *(*prom_getenv)(char *);
  27. int (*prom_printf)(char *, ...);
  28. int (*pmax_open)(char*, int);
  29. int (*pmax_lseek)(int, long, int);
  30. int (*pmax_read)(int, void *, int);
  31. int (*pmax_close)(int);
  32. extern void prom_meminit(unsigned int);
  33. extern void prom_identify_arch(unsigned int);
  34. extern void prom_init_cmdline(int, char **, unsigned long);
  35. /*
  36.  * Detect which PROM's the DECSTATION has, and set the callback vectors
  37.  * appropriately.
  38.  */
  39. void __init which_prom(unsigned long magic, int *prom_vec)
  40. {
  41. /*
  42.  * No sign of the REX PROM's magic number means we assume a non-REX
  43.  * machine (i.e. we're on a DS2100/3100, DS5100 or DS5000/2xx)
  44.  */
  45. if (magic == REX_PROM_MAGIC)
  46. {
  47. /*
  48.  * Set up prom abstraction structure with REX entry points.
  49.  */
  50. rex_bootinit = (int (*)(void)) *(prom_vec + REX_PROM_BOOTINIT);
  51. rex_bootread = (int (*)(void)) *(prom_vec + REX_PROM_BOOTREAD);
  52. rex_getbitmap = (int (*)(memmap *)) *(prom_vec + REX_PROM_GETBITMAP);
  53. prom_getchar = (int (*)(void)) *(prom_vec + REX_PROM_GETCHAR);
  54. prom_getenv = (char *(*)(char *)) *(prom_vec + REX_PROM_GETENV);
  55. rex_getsysid = (int (*)(void)) *(prom_vec + REX_PROM_GETSYSID);
  56. rex_gettcinfo = (void *(*)(void)) *(prom_vec + REX_PROM_GETTCINFO);
  57. prom_printf = (int (*)(char *, ...)) *(prom_vec + REX_PROM_PRINTF);
  58. rex_slot_address = (unsigned long *(*)(int)) *(prom_vec + REX_PROM_SLOTADDR);
  59. rex_clear_cache = (void (*)(void)) * (prom_vec + REX_PROM_CLEARCACHE);
  60. }
  61. else
  62. {
  63. /*
  64.  * Set up prom abstraction structure with non-REX entry points.
  65.  */
  66. prom_getchar = (int (*)(void)) PMAX_PROM_GETCHAR;
  67. prom_getenv = (char *(*)(char *)) PMAX_PROM_GETENV;
  68. prom_printf = (int (*)(char *, ...)) PMAX_PROM_PRINTF;
  69. pmax_open = (int (*)(char *, int)) PMAX_PROM_OPEN;
  70. pmax_lseek = (int (*)(int, long, int)) PMAX_PROM_LSEEK;
  71. pmax_read = (int (*)(int, void *, int)) PMAX_PROM_READ;
  72. pmax_close = (int (*)(int)) PMAX_PROM_CLOSE;
  73. }
  74. int __init prom_init(int argc, char **argv,
  75.        unsigned long magic, int *prom_vec)
  76. {
  77. extern void dec_machine_halt(void);
  78. /* Determine which PROM's we have (and therefore which machine we're on!) */
  79. which_prom(magic, prom_vec);
  80. if (magic == REX_PROM_MAGIC)
  81. rex_clear_cache();
  82. /* Were we compiled with the right CPU option? */
  83. #if defined(CONFIG_CPU_R3000)
  84. if ((mips_cpu.cputype == CPU_R4000SC) ||
  85.     (mips_cpu.cputype == CPU_R4400SC)) {
  86. prom_printf("Sorry, this kernel is compiled for the wrong CPU type!n");
  87. prom_printf("Please recompile with "CONFIG_CPU_R4x00 = y"n");
  88. dec_machine_halt();
  89. }
  90. #endif
  91. #if defined(CONFIG_CPU_R4X00)
  92. if ((mips_cpu.cputype == CPU_R3000) ||
  93.     (mips_cpu.cputype == CPU_R3000A)) {
  94. prom_printf("Sorry, this kernel is compiled for the wrong CPU type!n");
  95. prom_printf("Please recompile with "CONFIG_CPU_R3000 = y"n");
  96. dec_machine_halt();
  97. }
  98. #endif
  99. prom_meminit(magic);
  100. prom_identify_arch(magic);
  101. prom_init_cmdline(argc, argv, magic);
  102. return 0;
  103. }