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

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) 1992-1999,2001 Silicon Graphics, Inc.  All rights reserved.
  8.  */
  9. #ifndef _ASM_IA64_SN_ADDRS_H
  10. #define _ASM_IA64_SN_ADDRS_H
  11. #include <linux/config.h>
  12. #if defined (CONFIG_IA64_SGI_SN1)
  13. #include <asm/sn/sn1/addrs.h>
  14. #elif defined (CONFIG_IA64_SGI_SN2)
  15. #include <asm/sn/sn2/addrs.h>
  16. #else
  17. #error <<<BOMB! addrs.h defined only for SN1, or SN2 >>>
  18. #endif /* !SN1 && !SN2 */
  19. #ifndef __ASSEMBLY__
  20. #include <asm/sn/types.h>
  21. #endif 
  22. #ifndef __ASSEMBLY__
  23. #define PS_UINT_CAST (__psunsigned_t)
  24. #define UINT64_CAST (uint64_t)
  25. #ifdef CONFIG_IA64_SGI_SN2
  26. #define HUBREG_CAST (volatile mmr_t *)
  27. #else
  28. #define HUBREG_CAST (volatile hubreg_t *)
  29. #endif
  30. #elif __ASSEMBLY__
  31. #define PS_UINT_CAST
  32. #define UINT64_CAST
  33. #define HUBREG_CAST
  34. #endif
  35. /*
  36.  * The following macros are used to index to the beginning of a specific
  37.  * node's address space.
  38.  */
  39. #ifdef CONFIG_IA64_SGI_SN2 /* SN2 has an extra AS field between node offset and node id (nasid) */
  40. #define NODE_OFFSET(_n) (UINT64_CAST (_n) << NASID_SHFT)
  41. #else
  42. #define NODE_OFFSET(_n) (UINT64_CAST (_n) << NODE_SIZE_BITS)
  43. #endif
  44. #define NODE_CAC_BASE(_n) (CAC_BASE   + NODE_OFFSET(_n))
  45. #define NODE_HSPEC_BASE(_n) (HSPEC_BASE + NODE_OFFSET(_n))
  46. #define NODE_IO_BASE(_n) (IO_BASE    + NODE_OFFSET(_n))
  47. #define NODE_MSPEC_BASE(_n) (MSPEC_BASE + NODE_OFFSET(_n))
  48. #define NODE_UNCAC_BASE(_n) (UNCAC_BASE + NODE_OFFSET(_n))
  49. #define TO_NODE(_n, _x) (NODE_OFFSET(_n)     | ((_x)    ))
  50. #define TO_NODE_CAC(_n, _x) (NODE_CAC_BASE(_n)   | ((_x) & TO_PHYS_MASK))
  51. #define TO_NODE_UNCAC(_n, _x) (NODE_UNCAC_BASE(_n) | ((_x) & TO_PHYS_MASK))
  52. #define TO_NODE_MSPEC(_n, _x) (NODE_MSPEC_BASE(_n) | ((_x) & TO_PHYS_MASK))
  53. #define TO_NODE_HSPEC(_n, _x) (NODE_HSPEC_BASE(_n) | ((_x) & TO_PHYS_MASK))
  54. #define RAW_NODE_SWIN_BASE(nasid, widget)
  55. (NODE_IO_BASE(nasid) + (UINT64_CAST (widget) << SWIN_SIZE_BITS))
  56. #define WIDGETID_GET(addr) ((unsigned char)((addr >> SWIN_SIZE_BITS) & 0xff))
  57. /*
  58.  * The following definitions pertain to the IO special address
  59.  * space.  They define the location of the big and little windows
  60.  * of any given node.
  61.  */
  62. #define SWIN_SIZE_BITS 24
  63. #define SWIN_SIZE (UINT64_CAST 1 << 24)
  64. #define SWIN_SIZEMASK (SWIN_SIZE - 1)
  65. #define SWIN_WIDGET_MASK 0xF
  66. /*
  67.  * Convert smallwindow address to xtalk address.
  68.  *
  69.  * 'addr' can be physical or virtual address, but will be converted
  70.  * to Xtalk address in the range 0 -> SWINZ_SIZEMASK
  71.  */
  72. #define SWIN_WIDGETADDR(addr) ((addr) & SWIN_SIZEMASK)
  73. #define SWIN_WIDGETNUM(addr) (((addr)  >> SWIN_SIZE_BITS) & SWIN_WIDGET_MASK)
  74. /*
  75.  * Verify if addr belongs to small window address on node with "nasid"
  76.  *
  77.  *
  78.  * NOTE: "addr" is expected to be XKPHYS address, and NOT physical
  79.  * address
  80.  *
  81.  *
  82.  */
  83. #define NODE_SWIN_ADDR(nasid, addr)
  84. (((addr) >= NODE_SWIN_BASE(nasid, 0))  && 
  85.  ((addr) <  (NODE_SWIN_BASE(nasid, HUB_NUM_WIDGET) + SWIN_SIZE)
  86.  ))
  87. /*
  88.  * The following define the major position-independent aliases used
  89.  * in SN.
  90.  * LBOOT  -- 256MB in size, reads in the LBOOT area result in
  91.  * uncached references to the local hub's boot prom and
  92.  * other directory-bus connected devices.
  93.  * IALIAS -- 8MB in size, reads in the IALIAS result in uncached
  94.  * references to the local hub's registers.
  95.  */
  96. #if defined CONFIG_IA64_SGI_SN1
  97. #define LREG_BASE (HSPEC_BASE + 0x10000000)
  98. #define LREG_SIZE 0x8000000  /* 128 MB */
  99. #define LREG_LIMIT (LREG_BASE + LREG_SIZE)
  100. #define LBOOT_BASE (LREG_LIMIT)
  101. #define LBOOT_SIZE 0x8000000   /* 128 MB */
  102. #define LBOOT_LIMIT (LBOOT_BASE + LBOOT_SIZE)
  103. #define LBOOT_STRIDE 0x2000000    /* two PROMs, on 32M boundaries */
  104. #endif
  105. #define HUB_REGISTER_WIDGET 1
  106. #ifdef CONFIG_IA64_SGI_SN2
  107. #define IALIAS_BASE LOCAL_SWIN_BASE(HUB_REGISTER_WIDGET)
  108. #else
  109. #define IALIAS_BASE NODE_SWIN_BASE(0, HUB_REGISTER_WIDGET)
  110. #endif
  111. #define IALIAS_SIZE 0x800000 /* 8 Megabytes */
  112. #define IS_IALIAS(_a) (((_a) >= IALIAS_BASE) &&
  113.  ((_a) < (IALIAS_BASE + IALIAS_SIZE)))
  114. /*
  115.  * Macro for referring to Hub's RBOOT space
  116.  */
  117. #if defined CONFIG_IA64_SGI_SN1
  118. #define NODE_LREG_BASE(_n) (NODE_HSPEC_BASE(_n) + 0x30000000)
  119. #define NODE_LREG_LIMIT(_n) (NODE_LREG_BASE(_n) + LREG_SIZE)
  120. #define RREG_BASE(_n) (NODE_LREG_BASE(_n))
  121. #define RREG_LIMIT(_n) (NODE_LREG_LIMIT(_n))
  122. #define RBOOT_SIZE 0x8000000 /* 128 Megabytes */
  123. #define NODE_RBOOT_BASE(_n) (NODE_HSPEC_BASE(_n) + 0x38000000)
  124. #define NODE_RBOOT_LIMIT(_n) (NODE_RBOOT_BASE(_n) + RBOOT_SIZE)
  125. #endif
  126. /*
  127.  * The following macros produce the correct base virtual address for
  128.  * the hub registers.  The LOCAL_HUB_* macros produce the appropriate
  129.  * address for the local registers.  The REMOTE_HUB_* macro produce
  130.  * the address for the specified hub's registers.  The intent is
  131.  * that the appropriate PI, MD, NI, or II register would be substituted
  132.  * for _x.
  133.  */
  134. #ifdef CONFIG_IA64_SGI_SN2
  135. /*
  136.  * SN2 has II mmr's located inside small window space like SN0 & SN1,
  137.  * but has all other non-II mmr's located at the top of big window
  138.  * space, unlike SN0 & SN1.
  139.  */
  140. #define LOCAL_HUB_BASE(_x) (LOCAL_MMR_ADDR(_x) | (((~(_x)) & BWIN_TOP)>>8))
  141. #define REMOTE_HUB_BASE(_x)
  142.         (UNCACHED | GLOBAL_MMR_SPACE |                                  
  143.         (((~(_x)) & BWIN_TOP)>>8)    |                                       
  144.         (((~(_x)) & BWIN_TOP)>>9)    | (_x))
  145. #define LOCAL_HUB(_x) (HUBREG_CAST LOCAL_HUB_BASE(_x))
  146. #define REMOTE_HUB(_n, _x)
  147. (HUBREG_CAST (REMOTE_HUB_BASE(_x) | ((((long)(_n))<<NASID_SHFT))))
  148. #else /* not CONFIG_IA64_SGI_SN2 */
  149. #define LOCAL_HUB(_x) (HUBREG_CAST (IALIAS_BASE + (_x)))
  150. #define REMOTE_HUB(_n, _x) (HUBREG_CAST (NODE_SWIN_BASE(_n, 1) +
  151.       0x800000 + (_x)))
  152. #endif
  153. #ifdef CONFIG_IA64_SGI_SN1
  154. #define LOCAL_HSPEC(_x) (HUBREG_CAST (LREG_BASE + (_x)))
  155. #define REMOTE_HSPEC(_n, _x) (HUBREG_CAST (RREG_BASE(_n) + (_x)))
  156. #endif /* CONFIG_IA64_SGI_SN1 */
  157. /*
  158.  * WARNING:
  159.  * When certain Hub chip workaround are defined, it's not sufficient
  160.  * to dereference the *_HUB_ADDR() macros.  You should instead use
  161.  * HUB_L() and HUB_S() if you must deal with pointers to hub registers.
  162.  * Otherwise, the recommended approach is to use *_HUB_L() and *_HUB_S().
  163.  * They're always safe.
  164.  */
  165. #ifdef CONFIG_IA64_SGI_SN2
  166. #define LOCAL_HUB_ADDR(_x)
  167. (((_x) & BWIN_TOP) ? (HUBREG_CAST (LOCAL_MMR_ADDR(_x)))
  168. : (HUBREG_CAST (IALIAS_BASE + (_x))))
  169. #define REMOTE_HUB_ADDR(_n, _x)
  170. (((_x) & BWIN_TOP) ? (HUBREG_CAST (GLOBAL_MMR_ADDR(_n, _x)))
  171. : (HUBREG_CAST (NODE_SWIN_BASE(_n, 1) + 0x800000 + (_x))))
  172. #else
  173. #define LOCAL_HUB_ADDR(_x) (HUBREG_CAST (IALIAS_BASE + (_x)))
  174. #define REMOTE_HUB_ADDR(_n, _x) (HUBREG_CAST (NODE_SWIN_BASE(_n, 1) +
  175.       0x800000 + (_x)))
  176. #endif
  177. #if CONFIG_IA64_SGI_SN1
  178. #define REMOTE_HUB_PI_ADDR(_n, _sn, _x) (HUBREG_CAST (NODE_SWIN_BASE(_n, 1) +
  179.       0x800000 + PIREG(_x, _sn)))
  180. #endif
  181. #ifdef CONFIG_IA64_SGI_SN1
  182. #define LOCAL_HSPEC_ADDR(_x) (HUBREG_CAST (LREG_BASE + (_x)))
  183. #define REMOTE_HSPEC_ADDR(_n, _x) (HUBREG_CAST (RREG_BASE(_n) + (_x)))
  184. #endif /* CONFIG_IA64_SGI_SN1 */
  185. #ifndef __ASSEMBLY__
  186. #define HUB_L(_a) *(_a)
  187. #define HUB_S(_a, _d) *(_a) = (_d)
  188. #define LOCAL_HUB_L(_r) HUB_L(LOCAL_HUB_ADDR(_r))
  189. #define LOCAL_HUB_S(_r, _d) HUB_S(LOCAL_HUB_ADDR(_r), (_d))
  190. #define REMOTE_HUB_L(_n, _r) HUB_L(REMOTE_HUB_ADDR((_n), (_r)))
  191. #define REMOTE_HUB_S(_n, _r, _d) HUB_S(REMOTE_HUB_ADDR((_n), (_r)), (_d))
  192. #define REMOTE_HUB_PI_L(_n, _sn, _r) HUB_L(REMOTE_HUB_PI_ADDR((_n), (_sn), (_r)))
  193. #define REMOTE_HUB_PI_S(_n, _sn, _r, _d) HUB_S(REMOTE_HUB_PI_ADDR((_n), (_sn), (_r)), (_d))
  194. #ifdef CONFIG_IA64_SGI_SN1
  195. #define LOCAL_HSPEC_L(_r)      HUB_L(LOCAL_HSPEC_ADDR(_r))
  196. #define LOCAL_HSPEC_S(_r, _d)      HUB_S(LOCAL_HSPEC_ADDR(_r), (_d))
  197. #define REMOTE_HSPEC_L(_n, _r)      HUB_L(REMOTE_HSPEC_ADDR((_n), (_r)))
  198. #define REMOTE_HSPEC_S(_n, _r, _d)   HUB_S(REMOTE_HSPEC_ADDR((_n), (_r)), (_d))
  199. #endif /* CONFIG_IA64_SGI_SN1 */
  200. #endif /* __ASSEMBLY__ */
  201. /*
  202.  * The following macros are used to get to a hub/bridge register, given
  203.  * the base of the register space.
  204.  */
  205. #define HUB_REG_PTR(_base, _off)
  206. (HUBREG_CAST ((__psunsigned_t)(_base) + (__psunsigned_t)(_off)))
  207. #define HUB_REG_PTR_L(_base, _off)
  208. HUB_L(HUB_REG_PTR((_base), (_off)))
  209. #define HUB_REG_PTR_S(_base, _off, _data)
  210. HUB_S(HUB_REG_PTR((_base), (_off)), (_data))
  211. /*
  212.  * Software structure locations -- permanently fixed
  213.  *    See diagram in kldir.h
  214.  */
  215. #define PHYS_RAMBASE 0x0
  216. #define K0_RAMBASE PHYS_TO_K0(PHYS_RAMBASE)
  217. #define ARCS_SPB_OFFSET 0x1000
  218. #define ARCS_SPB_ADDR(nasid)
  219. PHYS_TO_K0(NODE_OFFSET(nasid) | ARCS_SPB_OFFSET)
  220. #define ARCS_SPB_SIZE 0x0400
  221. #define KLDIR_OFFSET 0x2000
  222. #define KLDIR_ADDR(nasid)
  223. TO_NODE_CAC((nasid), KLDIR_OFFSET)
  224. #define KLDIR_SIZE 0x0400
  225. /*
  226.  * Software structure locations -- indirected through KLDIR
  227.  *    See diagram in kldir.h
  228.  *
  229.  * Important: All low memory structures must only be accessed
  230.  * uncached, except for the symmon stacks.
  231.  */
  232. #define KLI_LAUNCH 0 /* Dir. entries */
  233. #define KLI_KLCONFIG 1
  234. #define KLI_NMI 2
  235. #define KLI_GDA 3
  236. #define KLI_FREEMEM 4
  237. #define KLI_SYMMON_STK 5
  238. #define KLI_PI_ERROR 6
  239. #define KLI_KERN_VARS 7
  240. #define KLI_KERN_XP 8
  241. #define KLI_KERN_PARTID 9
  242. #ifndef __ASSEMBLY__
  243. #define KLD_BASE(nasid) ((kldir_ent_t *) KLDIR_ADDR(nasid))
  244. #define KLD_LAUNCH(nasid) (KLD_BASE(nasid) + KLI_LAUNCH)
  245. #define KLD_NMI(nasid) (KLD_BASE(nasid) + KLI_NMI)
  246. #define KLD_KLCONFIG(nasid) (KLD_BASE(nasid) + KLI_KLCONFIG)
  247. #define KLD_PI_ERROR(nasid) (KLD_BASE(nasid) + KLI_PI_ERROR)
  248. #define KLD_GDA(nasid) (KLD_BASE(nasid) + KLI_GDA)
  249. #define KLD_SYMMON_STK(nasid) (KLD_BASE(nasid) + KLI_SYMMON_STK)
  250. #define KLD_FREEMEM(nasid) (KLD_BASE(nasid) + KLI_FREEMEM)
  251. #define KLD_KERN_VARS(nasid) (KLD_BASE(nasid) + KLI_KERN_VARS)
  252. #define KLD_KERN_XP(nasid) (KLD_BASE(nasid) + KLI_KERN_XP)
  253. #define KLD_KERN_PARTID(nasid) (KLD_BASE(nasid) + KLI_KERN_PARTID)
  254. #ifndef CONFIG_IA64_SGI_SN2
  255. #define KLCONFIG_OFFSET(nasid) KLD_KLCONFIG(nasid)->offset
  256. #else
  257. #define KLCONFIG_OFFSET(nasid) 
  258. ia64_sn_get_klconfig_addr(nasid)
  259. #endif /* CONFIG_IA64_SGI_SN2 */
  260. #define KLCONFIG_ADDR(nasid)
  261. TO_NODE_CAC((nasid), KLCONFIG_OFFSET(nasid))
  262. #define KLCONFIG_SIZE(nasid) KLD_KLCONFIG(nasid)->size
  263. #define GDA_ADDR(nasid) KLD_GDA(nasid)->pointer
  264. #define GDA_SIZE(nasid) KLD_GDA(nasid)->size
  265. #define NODE_OFFSET_TO_K0(_nasid, _off)
  266. (PAGE_OFFSET | NODE_OFFSET(_nasid) | (_off))
  267. #endif /* __ASSEMBLY__ */
  268. #endif /* _ASM_IA64_SN_ADDRS_H */