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

Linux/Unix编程

开发平台:

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, 2000-2002 Silicon Graphics, Inc.  All rights reserved.
  8.  */
  9. /*
  10.  * hubspc.c - Hub Memory Space Management Driver
  11.  * This driver implements the managers for the following
  12.  * memory resources:
  13.  * 1) reference counters
  14.  */
  15. #include <linux/types.h>
  16. #include <linux/config.h>
  17. #include <linux/slab.h>
  18. #include <asm/sn/sgi.h>
  19. #include <asm/sn/io.h>
  20. #include <asm/sn/sn_cpuid.h>
  21. #include <linux/devfs_fs.h>
  22. #include <linux/devfs_fs_kernel.h>
  23. #include <asm/io.h>
  24. #include <asm/sn/iograph.h>
  25. #include <asm/sn/invent.h>
  26. #include <asm/sn/hcl.h>
  27. #include <asm/sn/labelcl.h>
  28. #include <asm/sn/sn1/mem_refcnt.h>
  29. #include <asm/sn/addrs.h>
  30. #include <asm/sn/snconfig.h>
  31. #include <asm/sn/sn1/hubspc.h>
  32. #include <asm/sn/ksys/elsc.h>
  33. #include <asm/sn/simulator.h>
  34. /* Uncomment the following line for tracing */
  35. /* #define HUBSPC_DEBUG 1 */
  36. int hubspc_devflag = D_MP;
  37. /***********************************************************************/
  38. /* CPU Prom Space         */
  39. /***********************************************************************/
  40. typedef struct cpuprom_info {
  41. devfs_handle_t prom_dev;
  42. devfs_handle_t nodevrtx;
  43. struct cpuprom_info *next;
  44. }cpuprom_info_t;
  45. static cpuprom_info_t *cpuprom_head;
  46. static spinlock_t cpuprom_spinlock;
  47. #define PROM_LOCK() mutex_spinlock(&cpuprom_spinlock)
  48. #define PROM_UNLOCK(s) mutex_spinunlock(&cpuprom_spinlock, (s))
  49. /*
  50.  * Add prominfo to the linked list maintained.
  51.  */
  52. void
  53. prominfo_add(devfs_handle_t hub, devfs_handle_t prom)
  54. {
  55. cpuprom_info_t *info;
  56. unsigned long s;
  57. info = kmalloc(sizeof(cpuprom_info_t), GFP_KERNEL);
  58. ASSERT(info);
  59. info->prom_dev = prom;
  60. info->nodevrtx = hub;
  61. s = PROM_LOCK();
  62. info->next = cpuprom_head;
  63. cpuprom_head = info;
  64. PROM_UNLOCK(s);
  65. }
  66. void
  67. prominfo_del(devfs_handle_t prom)
  68. {
  69. unsigned long s;
  70. cpuprom_info_t *info;
  71. cpuprom_info_t **prev;
  72. s = PROM_LOCK();
  73. prev = &cpuprom_head;
  74. while ( (info = *prev) ) {
  75. if (info->prom_dev == prom) {
  76. *prev = info->next;
  77. PROM_UNLOCK(s);
  78. return;
  79. }
  80. prev = &info->next;
  81. }
  82. PROM_UNLOCK(s);
  83. ASSERT(0);
  84. }
  85. devfs_handle_t
  86. prominfo_nodeget(devfs_handle_t prom)
  87. {
  88. unsigned long s;
  89. cpuprom_info_t *info;
  90. s = PROM_LOCK();
  91. info = cpuprom_head;
  92. while (info) {
  93. if(info->prom_dev == prom) {
  94. PROM_UNLOCK(s);
  95. return info->nodevrtx;
  96. }
  97. info = info->next;
  98. }
  99. PROM_UNLOCK(s);
  100. return 0;
  101. }
  102. #if defined(CONFIG_IA64_SGI_SN1)
  103. #define SN_PROMVERSION INV_IP35PROM
  104. /* Add "detailed" labelled inventory information to the
  105.  * prom vertex 
  106.  */
  107. void
  108. cpuprom_detailed_inventory_info_add(devfs_handle_t prom_dev,devfs_handle_t node)
  109. {
  110. invent_miscinfo_t  *cpuprom_inventory_info;
  111. extern invent_generic_t *klhwg_invent_alloc(cnodeid_t cnode, 
  112.      int class, int size);
  113. cnodeid_t cnode = hubdev_cnodeid_get(node);
  114. /* Allocate memory for the extra inventory information
  115.  * for the  prom
  116.  */
  117. cpuprom_inventory_info = (invent_miscinfo_t *) 
  118. klhwg_invent_alloc(cnode, INV_PROM, sizeof(invent_miscinfo_t));
  119. ASSERT(cpuprom_inventory_info);
  120. /* Set the enabled flag so that the hinv interprets this
  121.  * information
  122.  */
  123. cpuprom_inventory_info->im_gen.ig_flag = INVENT_ENABLED;
  124. cpuprom_inventory_info->im_type = SN_PROMVERSION;
  125. /* Store prom revision into inventory information */
  126. cpuprom_inventory_info->im_rev = IP27CONFIG.pvers_rev;
  127. cpuprom_inventory_info->im_version = IP27CONFIG.pvers_vers;
  128. /* Store this info as labelled information hanging off the
  129.  * prom device vertex
  130.  */
  131. hwgraph_info_add_LBL(prom_dev, INFO_LBL_DETAIL_INVENT, 
  132.      (arbitrary_info_t) cpuprom_inventory_info);
  133. /* Export this information so that user programs can get to
  134.  * this by using attr_get()
  135.  */
  136.         hwgraph_info_export_LBL(prom_dev, INFO_LBL_DETAIL_INVENT,
  137. sizeof(invent_miscinfo_t));
  138. }
  139. #define FPROM_CONFIG_ADDR MD_JUNK_BUS_TIMING
  140. #define FPROM_ENABLE_MASK MJT_FPROM_ENABLE_MASK
  141. #define FPROM_ENABLE_SHFT MJT_FPROM_ENABLE_SHFT
  142. #define FPROM_SETUP_MASK MJT_FPROM_SETUP_MASK
  143. #define FPROM_SETUP_SHFT MJT_FPROM_SETUP_SHFT
  144. /*ARGSUSED*/
  145. int
  146. cpuprom_map(devfs_handle_t dev, vhandl_t *vt, off_t addr, size_t len)
  147. {
  148.         int  errcode = 0;
  149. caddr_t  kvaddr;
  150. devfs_handle_t node;
  151. cnodeid_t  cnode;
  152. node = prominfo_nodeget(dev);
  153. if (!node)
  154. return EIO;
  155.         
  156. kvaddr = hubdev_prombase_get(node);
  157. cnode  = hubdev_cnodeid_get(node);
  158. #ifdef HUBSPC_DEBUG
  159. printk("cpuprom_map: hubnode %d kvaddr 0x%xn", node, kvaddr);
  160. #endif
  161. if (len > RBOOT_SIZE)
  162. len = RBOOT_SIZE;
  163.         /*
  164.          * Map in the prom space
  165.          */
  166. errcode = v_mapphys(vt, kvaddr, len);
  167. if (errcode == 0 ){
  168. /*
  169.  * Set the MD configuration registers suitably.
  170.  */
  171. nasid_t nasid;
  172. uint64_t value;
  173. volatile hubreg_t *regaddr;
  174. nasid = COMPACT_TO_NASID_NODEID(cnode);
  175. regaddr = REMOTE_HUB_ADDR(nasid, FPROM_CONFIG_ADDR);
  176. value = HUB_L(regaddr);
  177. value &= ~(FPROM_SETUP_MASK | FPROM_ENABLE_MASK);
  178. {
  179. value |= (((long)CONFIG_FPROM_SETUP << FPROM_SETUP_SHFT) | 
  180.   ((long)CONFIG_FPROM_ENABLE << FPROM_ENABLE_SHFT));
  181. }
  182. HUB_S(regaddr, value);
  183. }
  184.         return (errcode);
  185. }
  186. #endif /* CONFIG_IA64_SGI_SN1 */
  187. /*ARGSUSED*/
  188. int
  189. cpuprom_unmap(devfs_handle_t dev, vhandl_t *vt)
  190. {
  191.         return 0;
  192. }
  193. /***********************************************************************/
  194. /* Base Hub Space Driver                                               */
  195. /***********************************************************************/
  196. /*
  197.  * hubspc_init
  198.  * Registration of the hubspc devices with the hub manager
  199.  */
  200. void
  201. hubspc_init(void)
  202. {
  203.         /*
  204.          * Register with the hub manager
  205.          */
  206.         /* The reference counters */
  207. #if defined(CONFIG_IA64_SGI_SN1)
  208.         hubdev_register(mem_refcnt_attach);
  209. #endif
  210. /* L1 system controller link */
  211. if ( !IS_RUNNING_ON_SIMULATOR() ) {
  212. /* initialize the L1 link */
  213. extern void l1_init(void);
  214. l1_init();
  215. }
  216. #ifdef HUBSPC_DEBUG
  217. printk("hubspc_init: Completedn");
  218. #endif /* HUBSPC_DEBUG */
  219. /* Initialize spinlocks */
  220. mutex_spinlock_init(&cpuprom_spinlock);
  221. }
  222. /* ARGSUSED */
  223. int
  224. hubspc_open(devfs_handle_t *devp, mode_t oflag, int otyp, cred_t *crp)
  225. {
  226.         return (0);
  227. }
  228. /* ARGSUSED */
  229. int
  230. hubspc_close(devfs_handle_t dev, int oflag, int otyp, cred_t *crp)
  231. {
  232.         return (0);
  233. }
  234. /* ARGSUSED */
  235. int
  236. hubspc_map(devfs_handle_t dev, vhandl_t *vt, off_t off, size_t len, uint prot)
  237. {
  238. /*REFERENCED*/
  239.         int errcode = 0;
  240. /* check validity of request */
  241. if( len == 0 ) {
  242. return ENXIO;
  243.         }
  244. return errcode;
  245. }
  246. /* ARGSUSED */
  247. int
  248. hubspc_unmap(devfs_handle_t dev, vhandl_t *vt)
  249. {
  250. return (0);
  251. }
  252. /* ARGSUSED */
  253. int
  254. hubspc_ioctl(devfs_handle_t dev,
  255.              int cmd,
  256.              void *arg,
  257.              int mode,
  258.              cred_t *cred_p,
  259.              int *rvalp)
  260. {
  261. return (0);
  262. }