main.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

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-2001 Silicon Graphics, Inc.  All rights reserved.
  8.  */
  9. #include <linux/config.h>
  10. #include <linux/types.h>
  11. #include <asm/bitops.h>
  12. extern void klgraph_init(void);
  13. void bedrock_init(int);
  14. void synergy_init(int, int);
  15. void sys_fw_init (const char *args, int arglen, int bsp);
  16. volatile int bootmaster=0; /* Used to pick bootmaster */
  17. volatile int nasidmaster[128]={0}; /* Used to pick node/synergy masters */
  18. int init_done=0;
  19. extern int bsp_lid;
  20. #define get_bit(b,p) (((*p)>>(b))&1)
  21. int
  22. fmain(int lid, int bsp) {
  23. int syn, nasid, cpu;
  24. /*
  25.  * First lets figure out who we are. This is done from the
  26.  * LID passed to us.
  27.  */
  28. #ifdef CONFIG_IA64_SGI_SN1
  29. nasid = (lid>>24);
  30. syn = (lid>>17)&1;
  31. cpu = (lid>>16)&1;
  32. /*
  33.  * Now pick a synergy master to initialize synergy registers.
  34.  */
  35. if (test_and_set_bit(syn, &nasidmaster[nasid]) == 0) {
  36. synergy_init(nasid, syn);
  37. test_and_set_bit(syn+2, &nasidmaster[nasid]);
  38. } else
  39. while (get_bit(syn+2, &nasidmaster[nasid]) == 0);
  40. #else
  41. nasid = (lid>>16)&0xfff;
  42. cpu = (lid>>28)&3;
  43. syn = 0;
  44. #endif
  45. /*
  46.  * Now pick a nasid master to initialize Bedrock registers.
  47.  */
  48. if (test_and_set_bit(8, &nasidmaster[nasid]) == 0) {
  49. bedrock_init(nasid);
  50. test_and_set_bit(9, &nasidmaster[nasid]);
  51. } else
  52. while (get_bit(9, &nasidmaster[nasid]) == 0);
  53. /*
  54.  * Now pick a BSP & finish init.
  55.  */
  56. if (test_and_set_bit(0, &bootmaster) == 0) {
  57. sys_fw_init(0, 0, bsp);
  58. test_and_set_bit(1, &bootmaster);
  59. } else
  60. while (get_bit(1, &bootmaster) == 0);
  61. return (lid == bsp_lid);
  62. }
  63. void
  64. bedrock_init(int nasid)
  65. {
  66. nasid = nasid; /* to quiet gcc */
  67. #if 0
  68. /*
  69.  * Undef if you need fprom to generate a 1 node klgraph
  70.  * information .. only works for 1 node for nasid 0.
  71.  */
  72. klgraph_init();
  73. #endif
  74. }
  75. void
  76. synergy_init(int nasid, int syn)
  77. {
  78. long *base;
  79. long off;
  80. /*
  81.  * Enable all FSB flashed interrupts.
  82.  * ZZZ - I'd really like defines for this......
  83.  */
  84. base = (long*)0x80000e0000000000LL; /* base of synergy regs */
  85. for (off = 0x2a0; off < 0x2e0; off+=8) /* offset for VEC_MASK_{0-3}_A/B */
  86. *(base+off/8) = -1LL;
  87. /*
  88.  * Set the NASID in the FSB_CONFIG register.
  89.  */
  90. base = (long*)0x80000e0000000450LL;
  91. *base = (long)((nasid<<16)|(syn<<9));
  92. }
  93. /* Why isnt there a bcopy/memcpy in lib64.a */
  94. void* 
  95. memcpy(void * dest, const void *src, size_t count)
  96. {
  97. char *s, *se, *d;
  98. for(d=dest, s=(char*)src, se=s+count; s<se; s++, d++)
  99. *d = *s;
  100. return dest;
  101. }