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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id$
  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 - 1997, 1999 Silicon Graphics, Inc.
  8.  * Copyright (C) 1999 by Ralf Baechle
  9.  */
  10. #ifndef _ASM_SN_ADDRS_H
  11. #define _ASM_SN_ADDRS_H
  12. #include <linux/config.h>
  13. #if _LANGUAGE_C
  14. #include <linux/types.h>
  15. #endif /* _LANGUAGE_C */
  16. #if !defined(CONFIG_IA64_SGI_SN1) && !defined(CONFIG_IA64_GENERIC)
  17. #include <asm/addrspace.h>
  18. #include <asm/reg.h>
  19. #include <asm/sn/kldir.h>
  20. #endif /* CONFIG_IA64_SGI_SN1 */
  21. #if defined(CONFIG_SGI_IP35) || defined(CONFIG_IA64_SGI_SN1) || defined(CONFIG_IA64_GENERIC)
  22. #include <asm/sn/sn1/addrs.h>
  23. #endif
  24. #if _LANGUAGE_C
  25. #define PS_UINT_CAST (__psunsigned_t)
  26. #define UINT64_CAST (uint64_t)
  27. #define HUBREG_CAST (volatile hubreg_t *)
  28. #elif _LANGUAGE_ASSEMBLY
  29. #define PS_UINT_CAST
  30. #define UINT64_CAST
  31. #define HUBREG_CAST
  32. #endif
  33. #define NASID_GET_META(_n) ((_n) >> NASID_LOCAL_BITS)
  34. #if defined CONFIG_SGI_IP35 || defined(CONFIG_IA64_SGI_SN1) || defined(CONFIG_IA64_GENERIC)
  35. #define NASID_GET_LOCAL(_n) ((_n) & 0x7f)
  36. #endif
  37. #define NASID_MAKE(_m, _l) (((_m) << NASID_LOCAL_BITS) | (_l))
  38. #define NODE_ADDRSPACE_MASK (NODE_ADDRSPACE_SIZE - 1)
  39. #define TO_NODE_ADDRSPACE(_pa) (UINT64_CAST (_pa) & NODE_ADDRSPACE_MASK)
  40. #define CHANGE_ADDR_NASID(_pa, _nasid)
  41. ((UINT64_CAST (_pa) & ~NASID_MASK) | 
  42.  (UINT64_CAST(_nasid) <<  NASID_SHFT))
  43. /*
  44.  * The following macros are used to index to the beginning of a specific
  45.  * node's address space.
  46.  */
  47. #define NODE_OFFSET(_n) (UINT64_CAST (_n) << NODE_SIZE_BITS)
  48. #define NODE_CAC_BASE(_n) (CAC_BASE   + NODE_OFFSET(_n))
  49. #define NODE_HSPEC_BASE(_n) (HSPEC_BASE + NODE_OFFSET(_n))
  50. #define NODE_IO_BASE(_n) (IO_BASE    + NODE_OFFSET(_n))
  51. #define NODE_MSPEC_BASE(_n) (MSPEC_BASE + NODE_OFFSET(_n))
  52. #define NODE_UNCAC_BASE(_n) (UNCAC_BASE + NODE_OFFSET(_n))
  53. #define TO_NODE(_n, _x) (NODE_OFFSET(_n)     | ((_x)    ))
  54. #define TO_NODE_CAC(_n, _x) (NODE_CAC_BASE(_n)   | ((_x) & TO_PHYS_MASK))
  55. #define TO_NODE_UNCAC(_n, _x) (NODE_UNCAC_BASE(_n) | ((_x) & TO_PHYS_MASK))
  56. #define TO_NODE_MSPEC(_n, _x) (NODE_MSPEC_BASE(_n) | ((_x) & TO_PHYS_MASK))
  57. #define TO_NODE_HSPEC(_n, _x) (NODE_HSPEC_BASE(_n) | ((_x) & TO_PHYS_MASK))
  58. #define RAW_NODE_SWIN_BASE(nasid, widget)
  59. (NODE_IO_BASE(nasid) + (UINT64_CAST (widget) << SWIN_SIZE_BITS))
  60. #define WIDGETID_GET(addr) ((unsigned char)((addr >> SWIN_SIZE_BITS) & 0xff))
  61. /*
  62.  * The following definitions pertain to the IO special address
  63.  * space.  They define the location of the big and little windows
  64.  * of any given node.
  65.  */
  66. #define SWIN_SIZE_BITS 24
  67. #define SWIN_SIZE (UINT64_CAST 1 << 24)
  68. #define SWIN_SIZEMASK (SWIN_SIZE - 1)
  69. #define SWIN_WIDGET_MASK 0xF
  70. /*
  71.  * Convert smallwindow address to xtalk address.
  72.  *
  73.  * 'addr' can be physical or virtual address, but will be converted
  74.  * to Xtalk address in the range 0 -> SWINZ_SIZEMASK
  75.  */
  76. #define SWIN_WIDGETADDR(addr) ((addr) & SWIN_SIZEMASK)
  77. #define SWIN_WIDGETNUM(addr) (((addr)  >> SWIN_SIZE_BITS) & SWIN_WIDGET_MASK)
  78. /*
  79.  * Verify if addr belongs to small window address on node with "nasid"
  80.  *
  81.  *
  82.  * NOTE: "addr" is expected to be XKPHYS address, and NOT physical
  83.  * address
  84.  *
  85.  *
  86.  */
  87. #define NODE_SWIN_ADDR(nasid, addr)
  88. (((addr) >= NODE_SWIN_BASE(nasid, 0))  && 
  89.  ((addr) <  (NODE_SWIN_BASE(nasid, HUB_NUM_WIDGET) + SWIN_SIZE)
  90.  ))
  91. /*
  92.  * The following define the major position-independent aliases used
  93.  * in SN.
  94.  * UALIAS -- 256MB in size, reads in the UALIAS result in
  95.  * uncached references to the memory of the reader's node.
  96.  * CPU_UALIAS -- 128kb in size, the bottom part of UALIAS is flipped
  97.  * depending on which CPU does the access to provide
  98.  * all CPUs with unique uncached memory at low addresses.
  99.  * LBOOT  -- 256MB in size, reads in the LBOOT area result in
  100.  * uncached references to the local hub's boot prom and
  101.  * other directory-bus connected devices.
  102.  * IALIAS -- 8MB in size, reads in the IALIAS result in uncached
  103.  * references to the local hub's registers.
  104.  */
  105. #define UALIAS_BASE HSPEC_BASE
  106. #define UALIAS_SIZE 0x10000000 /* 256 Megabytes */
  107. #define CPU_UALIAS 0x20000 /* 128 Kilobytes */
  108. #define UALIAS_CPU_SIZE (CPU_UALIAS / CPUS_PER_NODE)
  109. #define UALIAS_LIMIT (UALIAS_BASE + UALIAS_SIZE)
  110. /*
  111.  * The bottom of ualias space is flipped depending on whether you're
  112.  * processor 0 or 1 within a node.
  113.  */
  114. #if defined(CONFIG_SGI_IP35) || defined(CONFIG_IA64_SGI_SN1) || defined(CONFIG_IA64_GENERIC)
  115. #define LREG_BASE (HSPEC_BASE + 0x10000000)
  116. #define LREG_SIZE 0x8000000  /* 128 MB */
  117. #define LREG_LIMIT (LREG_BASE + LREG_SIZE)
  118. #define LBOOT_BASE (LREG_LIMIT)
  119. #define LBOOT_SIZE 0x8000000   /* 128 MB */
  120. #define LBOOT_LIMIT (LBOOT_BASE + LBOOT_SIZE)
  121. #define LBOOT_STRIDE 0x2000000    /* two PROMs, on 32M boundaries */
  122. #endif
  123. #define HUB_REGISTER_WIDGET 1
  124. #define IALIAS_BASE NODE_SWIN_BASE(0, HUB_REGISTER_WIDGET)
  125. #define IALIAS_SIZE 0x800000 /* 8 Megabytes */
  126. #define IS_IALIAS(_a) (((_a) >= IALIAS_BASE) &&
  127.  ((_a) < (IALIAS_BASE + IALIAS_SIZE)))
  128. /*
  129.  * Macro for referring to Hub's RBOOT space
  130.  */
  131. #if defined(CONFIG_SGI_IP35) || defined(CONFIG_IA64_SGI_SN1) || defined(CONFIG_IA64_GENERIC)
  132. #define NODE_LREG_BASE(_n) (NODE_HSPEC_BASE(_n) + 0x30000000)
  133. #define NODE_LREG_LIMIT(_n) (NODE_LREG_BASE(_n) + LREG_SIZE)
  134. #define RREG_BASE(_n) (NODE_LREG_BASE(_n))
  135. #define RREG_LIMIT(_n) (NODE_LREG_LIMIT(_n))
  136. #define RBOOT_SIZE 0x8000000 /* 128 Megabytes */
  137. #define NODE_RBOOT_BASE(_n) (NODE_HSPEC_BASE(_n) + 0x38000000)
  138. #define NODE_RBOOT_LIMIT(_n) (NODE_RBOOT_BASE(_n) + RBOOT_SIZE)
  139. #endif
  140. /*
  141.  * Macros for referring the Hub's back door space
  142.  *
  143.  *   These macros correctly process addresses in any node's space.
  144.  *   WARNING: They won't work in assembler.
  145.  *
  146.  *   BDDIR_ENTRY_LO returns the address of the low double-word of the dir
  147.  *                  entry corresponding to a physical (Cac or Uncac) address.
  148.  *   BDDIR_ENTRY_HI returns the address of the high double-word of the entry.
  149.  *   BDPRT_ENTRY    returns the address of the double-word protection entry
  150.  *                  corresponding to the page containing the physical address.
  151.  *   BDPRT_ENTRY_S  Stores the value into the protection entry.
  152.  *   BDPRT_ENTRY_L  Load the value from the protection entry.
  153.  *   BDECC_ENTRY    returns the address of the ECC byte corresponding to a
  154.  *                  double-word at a specified physical address.
  155.  *   BDECC_ENTRY_H  returns the address of the two ECC bytes corresponding to a
  156.  *                  quad-word at a specified physical address.
  157.  */
  158. #define NODE_BDOOR_BASE(_n) (NODE_HSPEC_BASE(_n) + (NODE_ADDRSPACE_SIZE/2))
  159. #define NODE_BDECC_BASE(_n) (NODE_BDOOR_BASE(_n))
  160. #define NODE_BDDIR_BASE(_n) (NODE_BDOOR_BASE(_n) + (NODE_ADDRSPACE_SIZE/4))
  161. #if defined(CONFIG_SGI_IP35) || defined(CONFIG_IA64_SGI_SN1) || defined(CONFIG_IA64_GENERIC)
  162. /*
  163.  * Bedrock's directory entries are a single word:  no low/high
  164.  */
  165. #define BDDIR_ENTRY(_pa) (HSPEC_BASE +       
  166.   NODE_ADDRSPACE_SIZE * 7 / 8       | 
  167.  UINT64_CAST (_pa) & NASID_MASK     | 
  168.  UINT64_CAST (_pa) >> 3 & BDDIR_UPPER_MASK)
  169. #ifdef BRINGUP
  170.         /* minimize source changes by mapping *_LO() & *_HI()   */
  171. #define BDDIR_ENTRY_LO(_pa)     BDDIR_ENTRY(_pa)
  172. #define BDDIR_ENTRY_HI(_pa)     BDDIR_ENTRY(_pa)
  173. #endif /* BRINGUP */
  174. #define BDDIR_PAGE_MASK (BDDIR_UPPER_MASK & 0x7ffff << 11)
  175. #define BDDIR_PAGE_BASE_MASK (UINT64_CAST 0xfffffffffffff800)
  176. #ifdef _LANGUAGE_C
  177. #define BDPRT_ENTRY_ADDR(_pa, _rgn)      ((uint64_t *) ( (HSPEC_BASE +       
  178.                                  NODE_ADDRSPACE_SIZE * 7 / 8 + 0x408)       | 
  179.                                 (UINT64_CAST (_pa)      & NASID_MASK)        | 
  180.                                 (UINT64_CAST (_pa) >> 3 & BDDIR_PAGE_MASK)   | 
  181.                                 (UINT64_CAST (_pa) >> 3 & 0x3 << 4)          | 
  182.                                 ((_rgn) & 0x1e) << 5))
  183. static __inline uint64_t BDPRT_ENTRY_L(paddr_t pa,uint32_t rgn) {
  184. uint64_t word=*BDPRT_ENTRY_ADDR(pa,rgn);
  185. if(rgn&0x20) /*If the region is > 32, move it down*/
  186. word = word >> 32;
  187. if(rgn&0x1) /*If the region is odd, get that part */
  188. word = word >> 16;
  189. word = word & 0xffff; /*Get the 16 bits we are interested in*/
  190. return word;
  191. }
  192. static __inline void BDPRT_ENTRY_S(paddr_t pa,uint32_t rgn,uint64_t val) {
  193.         uint64_t *addr=(uint64_t *)BDPRT_ENTRY_ADDR(pa,rgn);
  194.         uint64_t word,mask;
  195.         word=*addr;
  196. mask=0;
  197. if(rgn&0x1) {
  198. mask|=0x0000ffff0000ffff;
  199. val=val<<16;
  200. }
  201. else
  202. mask|=0xffff0000ffff0000;
  203. if(rgn&0x20) {
  204. mask|=0x00000000ffffffff;
  205. val=val<<32;
  206. }
  207. else
  208. mask|=0xffffffff00000000;
  209. word &= mask;
  210. word |= val;
  211. *(addr++)=word;
  212. addr++;
  213.         *(addr++)=word;
  214.         addr++;
  215.         *(addr++)=word;
  216.         addr++;
  217.         *addr=word;
  218. }
  219. #endif /*_LANGUAGE_C*/
  220. #define BDCNT_ENTRY(_pa) (HSPEC_BASE +       
  221.   NODE_ADDRSPACE_SIZE * 7 / 8 + 0x8         | 
  222.  UINT64_CAST (_pa) & NASID_MASK     | 
  223.  UINT64_CAST (_pa) >> 3 & BDDIR_PAGE_MASK   | 
  224.  UINT64_CAST (_pa) >> 3 & 0x3 << 4)
  225. #ifdef    BRINGUP
  226.   /* little endian packing of ecc bytes requires a swizzle */ 
  227.   /* this is problemmatic for memory_init_ecc              */
  228. #endif /* BRINGUP */
  229. #define BDECC_ENTRY(_pa) (HSPEC_BASE +       
  230.   NODE_ADDRSPACE_SIZE * 5 / 8      | 
  231.  UINT64_CAST (_pa) & NASID_MASK     | 
  232.  UINT64_CAST (_pa) >> 3 & BDECC_UPPER_MASK    
  233.             ^ 0x7ULL)
  234. #define BDECC_SCRUB(_pa) (HSPEC_BASE +       
  235.   NODE_ADDRSPACE_SIZE / 2      | 
  236.  UINT64_CAST (_pa) & NASID_MASK     | 
  237.  UINT64_CAST (_pa) >> 3 & BDECC_UPPER_MASK    
  238.             ^ 0x7ULL)
  239.   /* address for Halfword backdoor ecc access. Note that   */
  240.   /* ecc bytes are packed in little endian order           */
  241. #define BDECC_ENTRY_H(_pa) (HSPEC_BASE +                                 
  242.   NODE_ADDRSPACE_SIZE * 5 / 8     | 
  243.  UINT64_CAST (_pa)  & NASID_MASK     | 
  244.  UINT64_CAST (_pa) >> 3 & BDECC_UPPER_MASK    
  245.             ^ 0x6ULL)
  246. /*
  247.  * Macro to convert a back door directory, protection, page counter, or ecc
  248.  * address into the raw physical address of the associated cache line
  249.  * or protection page.
  250.  */
  251. #define BDDIR_TO_MEM(_ba) (UINT64_CAST  (_ba) & NASID_MASK            | 
  252.  (UINT64_CAST (_ba) & BDDIR_UPPER_MASK) << 3)
  253. #ifdef BRINGUP
  254. /*
  255.  * This can't be done since there are 4 entries per address so you'd end up
  256.  * mapping back to 4 different physical addrs.
  257.  */
  258.   
  259. #define BDPRT_TO_MEM(_ba)  (UINT64_CAST  (_ba) & NASID_MASK     | 
  260.  (UINT64_CAST (_ba) & BDDIR_PAGE_MASK) << 3 | 
  261.  (UINT64_CAST (_ba) & 0x3 << 4) << 3)
  262. #endif
  263. #define BDCNT_TO_MEM(_ba)  (UINT64_CAST  (_ba) & NASID_MASK     | 
  264.  (UINT64_CAST (_ba) & BDDIR_PAGE_MASK) << 3 | 
  265.  (UINT64_CAST (_ba) & 0x3 << 4) << 3)
  266. #define BDECC_TO_MEM(_ba) (UINT64_CAST  (_ba) & NASID_MASK     | 
  267.  ((UINT64_CAST (_ba) ^ 0x7ULL)                
  268.                     & BDECC_UPPER_MASK) << 3 )
  269. #define BDECC_H_TO_MEM(_ba) (UINT64_CAST  (_ba) & NASID_MASK     | 
  270.  ((UINT64_CAST (_ba) ^ 0x6ULL)                
  271.                     & BDECC_UPPER_MASK) << 3 )
  272. #define BDADDR_IS_DIR(_ba) ((UINT64_CAST  (_ba) & 0x8) == 0)
  273. #define BDADDR_IS_PRT(_ba) ((UINT64_CAST  (_ba) & 0x408) == 0x408)
  274. #define BDADDR_IS_CNT(_ba) ((UINT64_CAST  (_ba) & 0x8) == 0x8)
  275. #endif /* CONFIG_SGI_IP35 */
  276. /*
  277.  * The following macros produce the correct base virtual address for
  278.  * the hub registers.  The LOCAL_HUB_* macros produce the appropriate
  279.  * address for the local registers.  The REMOTE_HUB_* macro produce
  280.  * the address for the specified hub's registers.  The intent is
  281.  * that the appropriate PI, MD, NI, or II register would be substituted
  282.  * for _x.
  283.  */
  284. /*
  285.  * WARNING:
  286.  * When certain Hub chip workaround are defined, it's not sufficient
  287.  * to dereference the *_HUB_ADDR() macros.  You should instead use
  288.  * HUB_L() and HUB_S() if you must deal with pointers to hub registers.
  289.  * Otherwise, the recommended approach is to use *_HUB_L() and *_HUB_S().
  290.  * They're always safe.
  291.  */
  292. #define LOCAL_HUB_ADDR(_x) (HUBREG_CAST (IALIAS_BASE + (_x)))
  293. #define REMOTE_HUB_ADDR(_n, _x) (HUBREG_CAST (NODE_SWIN_BASE(_n, 1) +
  294.       0x800000 + (_x)))
  295. #if defined(CONFIG_SGI_IP35) || defined(CONFIG_IA64_SGI_SN1) || defined(CONFIG_IA64_GENERIC)
  296. #define REMOTE_HUB_PI_ADDR(_n, _sn, _x) (HUBREG_CAST (NODE_SWIN_BASE(_n, 1) +
  297.       0x800000 + PIREG(_x, _sn)))
  298. #define LOCAL_HSPEC_ADDR(_x) (HUBREG_CAST (LREG_BASE + (_x)))
  299. #define REMOTE_HSPEC_ADDR(_n, _x) (HUBREG_CAST (RREG_BASE(_n) + (_x)))
  300. #endif /* CONFIG_SGI_IP35 */
  301. #if _LANGUAGE_C
  302. #define HUB_L(_a) *(_a)
  303. #define HUB_S(_a, _d) *(_a) = (_d)
  304. #define LOCAL_HUB_L(_r) HUB_L(LOCAL_HUB_ADDR(_r))
  305. #define LOCAL_HUB_S(_r, _d) HUB_S(LOCAL_HUB_ADDR(_r), (_d))
  306. #define REMOTE_HUB_L(_n, _r) HUB_L(REMOTE_HUB_ADDR((_n), (_r)))
  307. #define REMOTE_HUB_S(_n, _r, _d) HUB_S(REMOTE_HUB_ADDR((_n), (_r)), (_d))
  308. #define REMOTE_HUB_PI_L(_n, _sn, _r) HUB_L(REMOTE_HUB_PI_ADDR((_n), (_sn), (_r)))
  309. #define REMOTE_HUB_PI_S(_n, _sn, _r, _d) HUB_S(REMOTE_HUB_PI_ADDR((_n), (_sn), (_r)), (_d))
  310. #if defined(CONFIG_SGI_IP35) || defined(CONFIG_IA64_SGI_SN1) || defined(CONFIG_IA64_GENERIC)
  311. #define LOCAL_HSPEC_L(_r)      HUB_L(LOCAL_HSPEC_ADDR(_r))
  312. #define LOCAL_HSPEC_S(_r, _d)      HUB_S(LOCAL_HSPEC_ADDR(_r), (_d))
  313. #define REMOTE_HSPEC_L(_n, _r)      HUB_L(REMOTE_HSPEC_ADDR((_n), (_r)))
  314. #define REMOTE_HSPEC_S(_n, _r, _d)   HUB_S(REMOTE_HSPEC_ADDR((_n), (_r)), (_d))
  315. #endif /* CONFIG_SGI_IP35 */
  316. #endif /* _LANGUAGE_C */
  317. /*
  318.  * The following macros are used to get to a hub/bridge register, given
  319.  * the base of the register space.
  320.  */
  321. #define HUB_REG_PTR(_base, _off)
  322. (HUBREG_CAST ((__psunsigned_t)(_base) + (__psunsigned_t)(_off)))
  323. #define HUB_REG_PTR_L(_base, _off)
  324. HUB_L(HUB_REG_PTR((_base), (_off)))
  325. #define HUB_REG_PTR_S(_base, _off, _data)
  326. HUB_S(HUB_REG_PTR((_base), (_off)), (_data))
  327. /*
  328.  * Software structure locations -- permanently fixed
  329.  *    See diagram in kldir.h
  330.  */
  331. #define PHYS_RAMBASE 0x0
  332. #define K0_RAMBASE PHYS_TO_K0(PHYS_RAMBASE)
  333. #define ARCS_SPB_OFFSET 0x1000
  334. #define ARCS_SPB_ADDR(nasid)
  335. PHYS_TO_K0(NODE_OFFSET(nasid) | ARCS_SPB_OFFSET)
  336. #define ARCS_SPB_SIZE 0x0400
  337. #define KLDIR_OFFSET 0x2000
  338. #ifndef __ia64
  339. #define KLDIR_ADDR(nasid)
  340. TO_NODE_UNCAC((nasid), KLDIR_OFFSET)
  341. #else
  342. #define KLDIR_ADDR(nasid)                                               
  343.         TO_NODE_CAC((nasid), KLDIR_OFFSET)
  344. #endif
  345. #define KLDIR_SIZE 0x0400
  346. /*
  347.  * Software structure locations -- indirected through KLDIR
  348.  *    See diagram in kldir.h
  349.  *
  350.  * Important: All low memory structures must only be accessed
  351.  * uncached, except for the symmon stacks.
  352.  */
  353. #define KLI_LAUNCH 0 /* Dir. entries */
  354. #define KLI_KLCONFIG 1
  355. #define KLI_NMI 2
  356. #define KLI_GDA 3
  357. #define KLI_FREEMEM 4
  358. #define KLI_SYMMON_STK 5
  359. #define KLI_PI_ERROR 6
  360. #define KLI_KERN_VARS 7
  361. #define KLI_KERN_XP 8
  362. #define KLI_KERN_PARTID 9
  363. #if _LANGUAGE_C
  364. #define KLD_BASE(nasid) ((kldir_ent_t *) KLDIR_ADDR(nasid))
  365. #define KLD_LAUNCH(nasid) (KLD_BASE(nasid) + KLI_LAUNCH)
  366. #define KLD_NMI(nasid) (KLD_BASE(nasid) + KLI_NMI)
  367. #define KLD_KLCONFIG(nasid) (KLD_BASE(nasid) + KLI_KLCONFIG)
  368. #define KLD_PI_ERROR(nasid) (KLD_BASE(nasid) + KLI_PI_ERROR)
  369. #define KLD_GDA(nasid) (KLD_BASE(nasid) + KLI_GDA)
  370. #define KLD_SYMMON_STK(nasid) (KLD_BASE(nasid) + KLI_SYMMON_STK)
  371. #define KLD_FREEMEM(nasid) (KLD_BASE(nasid) + KLI_FREEMEM)
  372. #define KLD_KERN_VARS(nasid) (KLD_BASE(nasid) + KLI_KERN_VARS)
  373. #define KLD_KERN_XP(nasid) (KLD_BASE(nasid) + KLI_KERN_XP)
  374. #define KLD_KERN_PARTID(nasid) (KLD_BASE(nasid) + KLI_KERN_PARTID)
  375. #define LAUNCH_OFFSET(nasid, slice)
  376. (KLD_LAUNCH(nasid)->offset +
  377.  KLD_LAUNCH(nasid)->stride * (slice))
  378. #define LAUNCH_ADDR(nasid, slice)
  379. TO_NODE_UNCAC((nasid), LAUNCH_OFFSET(nasid, slice))
  380. #define LAUNCH_SIZE(nasid) KLD_LAUNCH(nasid)->size
  381. #define NMI_OFFSET(nasid, slice)
  382. (KLD_NMI(nasid)->offset +
  383.  KLD_NMI(nasid)->stride * (slice))
  384. #define NMI_ADDR(nasid, slice)
  385. TO_NODE_UNCAC((nasid), NMI_OFFSET(nasid, slice))
  386. #define NMI_SIZE(nasid) KLD_NMI(nasid)->size
  387. #define KLCONFIG_OFFSET(nasid) KLD_KLCONFIG(nasid)->offset
  388. #define KLCONFIG_ADDR(nasid)
  389. TO_NODE_UNCAC((nasid), KLCONFIG_OFFSET(nasid))
  390. #define KLCONFIG_SIZE(nasid) KLD_KLCONFIG(nasid)->size
  391. #define GDA_ADDR(nasid) KLD_GDA(nasid)->pointer
  392. #define GDA_SIZE(nasid) KLD_GDA(nasid)->size
  393. #define SYMMON_STK_OFFSET(nasid, slice)
  394. (KLD_SYMMON_STK(nasid)->offset +
  395.  KLD_SYMMON_STK(nasid)->stride * (slice))
  396. #define SYMMON_STK_STRIDE(nasid) KLD_SYMMON_STK(nasid)->stride
  397. #define SYMMON_STK_ADDR(nasid, slice)
  398. TO_NODE_CAC((nasid), SYMMON_STK_OFFSET(nasid, slice))
  399. #define SYMMON_STK_SIZE(nasid) KLD_SYMMON_STK(nasid)->stride
  400. #define SYMMON_STK_END(nasid) (SYMMON_STK_ADDR(nasid, 0) + KLD_SYMMON_STK(nasid)->size)
  401. /* loading symmon 4k below UNIX. the arcs loader needs the topaddr for a
  402.  * relocatable program
  403.  */
  404. #if defined(CONFIG_SGI_IP35) || defined(CONFIG_IA64_SGI_SN1) || defined(CONFIG_IA64_GENERIC)
  405. /* update master.d/sn1_elspec.dbg, SN1/addrs.h/DEBUGUNIX_ADDR, and
  406.  * DBGLOADADDR in symmon's Makefile when changing this */
  407. #define UNIX_DEBUG_LOADADDR     0x310000
  408. #elif defined(SN0XXL)
  409. #define UNIX_DEBUG_LOADADDR     0x360000
  410. #else
  411. #define UNIX_DEBUG_LOADADDR 0x300000
  412. #endif
  413. #define SYMMON_LOADADDR(nasid)
  414. TO_NODE(nasid, PHYS_TO_K0(UNIX_DEBUG_LOADADDR - 0x1000))
  415. #define FREEMEM_OFFSET(nasid) KLD_FREEMEM(nasid)->offset
  416. #define FREEMEM_ADDR(nasid) SYMMON_STK_END(nasid)
  417. /*
  418.  * XXX
  419.  * Fix this. FREEMEM_ADDR should be aware of if symmon is loaded.
  420.  * Also, it should take into account what prom thinks to be a safe
  421.  * address
  422. PHYS_TO_K0(NODE_OFFSET(nasid) + FREEMEM_OFFSET(nasid))
  423.  */
  424. #define FREEMEM_SIZE(nasid) KLD_FREEMEM(nasid)->size
  425. #define PI_ERROR_OFFSET(nasid) KLD_PI_ERROR(nasid)->offset
  426. #define PI_ERROR_ADDR(nasid)
  427. TO_NODE_UNCAC((nasid), PI_ERROR_OFFSET(nasid))
  428. #define PI_ERROR_SIZE(nasid) KLD_PI_ERROR(nasid)->size
  429. #define NODE_OFFSET_TO_K0(_nasid, _off)
  430. (PAGE_OFFSET | NODE_OFFSET(_nasid) | (_off))
  431. #define K0_TO_NODE_OFFSET(_k0addr)
  432. ((__psunsigned_t)(_k0addr) & NODE_ADDRSPACE_MASK)
  433. #define KERN_VARS_ADDR(nasid) KLD_KERN_VARS(nasid)->pointer
  434. #define KERN_VARS_SIZE(nasid) KLD_KERN_VARS(nasid)->size
  435. #define KERN_XP_ADDR(nasid) KLD_KERN_XP(nasid)->pointer
  436. #define KERN_XP_SIZE(nasid) KLD_KERN_XP(nasid)->size
  437. #define GPDA_ADDR(nasid) TO_NODE_CAC(nasid, GPDA_OFFSET)
  438. #endif /* _LANGUAGE_C */
  439. #endif /* _ASM_SN_ADDRS_H */