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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* 
  2.  *
  3.  * This file is subject to the terms and conditions of the GNU General Public
  4.  * License.  See the file "COPYING" in the main directory of this archive
  5.  * for more details.
  6.  *
  7.  * Copyright (C) 2000 Silicon Graphics, Inc.
  8.  * Copyright (C) 2000 by Jack Steiner (steiner@sgi.com)
  9.  */
  10. #include <linux/types.h>
  11. #include <asm/bitops.h>
  12. void bedrock_init(int);
  13. void synergy_init(int, int);
  14. void sys_fw_init (const char *args, int arglen, int bsp);
  15. volatile int bootmaster=0; /* Used to pick bootmaster */
  16. volatile int nasidmaster[128]={0}; /* Used to pick node/synergy masters */
  17. int init_done=0;
  18. extern int bsp_lid;
  19. #define get_bit(b,p) (((*p)>>(b))&1)
  20. int
  21. fmain(int lid, int bsp) {
  22. int syn, nasid, cpu;
  23. /*
  24.  * First lets figure out who we are. This is done from the
  25.  * LID passed to us.
  26.  */
  27. nasid = (lid>>24);
  28. syn = (lid>>17)&1;
  29. cpu = (lid>>16)&1;
  30. /*
  31.  * Now pick a synergy master to initialize synergy registers.
  32.  */
  33. if (test_and_set_bit(syn, &nasidmaster[nasid]) == 0) {
  34. synergy_init(nasid, syn);
  35. test_and_set_bit(syn+2, &nasidmaster[nasid]);
  36. } else
  37. while (get_bit(syn+2, &nasidmaster[nasid]) == 0);
  38. /*
  39.  * Now pick a nasid master to initialize Bedrock registers.
  40.  */
  41. if (test_and_set_bit(8, &nasidmaster[nasid]) == 0) {
  42. bedrock_init(nasid);
  43. test_and_set_bit(9, &nasidmaster[nasid]);
  44. } else
  45. while (get_bit(9, &nasidmaster[nasid]) == 0);
  46. /*
  47.  * Now pick a BSP & finish init.
  48.  */
  49. if (test_and_set_bit(0, &bootmaster) == 0) {
  50. sys_fw_init(0, 0, bsp);
  51. test_and_set_bit(1, &bootmaster);
  52. } else
  53. while (get_bit(1, &bootmaster) == 0);
  54. return (lid == bsp_lid);
  55. }
  56. void
  57. bedrock_init(int nasid)
  58. {
  59. nasid = nasid; /* to quiet gcc */
  60. }
  61. void
  62. synergy_init(int nasid, int syn)
  63. {
  64. long *base;
  65. long off;
  66. /*
  67.  * Enable all FSB flashed interrupts.
  68.  * ZZZ - I'd really like defines for this......
  69.  */
  70. base = (long*)0x80000e0000000000LL; /* base of synergy regs */
  71. for (off = 0x2a0; off < 0x2e0; off+=8) /* offset for VEC_MASK_{0-3}_A/B */
  72. *(base+off/8) = -1LL;
  73. /*
  74.  * Set the NASID in the FSB_CONFIG register.
  75.  */
  76. base = (long*)0x80000e0000000450LL;
  77. *base = (long)((nasid<<16)|(syn<<9));
  78. }
  79. /* Why isnt there a bcopy/memcpy in lib64.a */
  80. void* 
  81. memcpy(void * dest, const void *src, size_t count)
  82. {
  83. char *s, *se, *d;
  84. for(d=dest, s=(char*)src, se=s+count; s<se; s++, d++)
  85. *d = *s;
  86. return dest;
  87. }