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

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-2001 Silicon Graphics, Inc. All rights reserved.
  8.  */
  9. /*
  10.  * Hardware Inventory
  11.  *
  12.  * See sys/sn/invent.h for an explanation of the hardware inventory contents.
  13.  *
  14.  */
  15. #include <linux/types.h>
  16. #include <asm/sn/sgi.h>
  17. #include <asm/sn/invent.h>
  18. #include <asm/sn/hcl.h>
  19. #include <asm/sn/labelcl.h>
  20. void
  21. inventinit(void)
  22. {
  23. }
  24. /*
  25.  * For initializing/updating an inventory entry.
  26.  */
  27. void
  28. replace_in_inventory(
  29. inventory_t *pinv, int class, int type,
  30. int controller, int unit, int state)
  31. {
  32. pinv->inv_class = class;
  33. pinv->inv_type = type;
  34. pinv->inv_controller = controller;
  35. pinv->inv_unit = unit;
  36. pinv->inv_state = state;
  37. }
  38. /*
  39.  * Inventory addition 
  40.  *
  41.  * XXX NOTE: Currently must be called after dynamic memory allocator is
  42.  * initialized.
  43.  *
  44.  */
  45. void
  46. add_to_inventory(int class, int type, int controller, int unit, int state)
  47. {
  48. (void)device_inventory_add((devfs_handle_t)GRAPH_VERTEX_NONE, class, type, 
  49. controller, unit, state);
  50. }
  51. /*
  52.  * Inventory retrieval 
  53.  *
  54.  * These two routines are intended to prevent the caller from having to know
  55.  * the internal structure of the inventory table.
  56.  *
  57.  * The caller of get_next_inventory is supposed to call start_scan_invent
  58.  * before the irst call to get_next_inventory, and the caller is required
  59.  * to call end_scan_invent after the last call to get_next_inventory.
  60.  */
  61. inventory_t *
  62. get_next_inventory(invplace_t *place)
  63. {
  64. inventory_t *pinv;
  65. devfs_handle_t device = place->invplace_vhdl;
  66. int rv;
  67. while ((pinv = device_inventory_get_next(device, place)) == NULL) {
  68. /*
  69.  * We've exhausted inventory items on the last device.
  70.  * Advance to next device.
  71.  */
  72. place->invplace_inv = NULL; /* Start from beginning invent on this device */
  73. rv = hwgraph_vertex_get_next(&device, &place->invplace_vplace);
  74. if (rv == LABELCL_SUCCESS) {
  75. place->invplace_vhdl = device;
  76. }
  77. else {
  78. place->invplace_vhdl = GRAPH_VERTEX_NONE;
  79. return(NULL);
  80. }
  81. }
  82. return(pinv);
  83. }
  84. /* ARGSUSED */
  85. int
  86. get_sizeof_inventory(int abi)
  87. {
  88. return sizeof(inventory_t);
  89. }
  90. /* Must be called prior to first call to get_next_inventory */
  91. void
  92. start_scan_inventory(invplace_t *iplace)
  93. {
  94. *iplace = INVPLACE_NONE;
  95. }
  96. /* Must be called after last call to get_next_inventory */
  97. void
  98. end_scan_inventory(invplace_t *iplace)
  99. {
  100. devfs_handle_t vhdl = iplace->invplace_vhdl;
  101. if (vhdl != GRAPH_VERTEX_NONE)
  102. hwgraph_vertex_unref(vhdl);
  103. *iplace = INVPLACE_NONE; /* paranoia */
  104. }
  105. /*
  106.  * Hardware inventory scanner.
  107.  *
  108.  * Calls fun() for every entry in inventory list unless fun() returns something
  109.  * other than 0.
  110.  */
  111. int
  112. scaninvent(int (*fun)(inventory_t *, void *), void *arg)
  113. {
  114. inventory_t *ie;
  115. invplace_t iplace = { NULL,NULL, NULL };
  116. int rc;
  117. ie = 0;
  118. rc = 0;
  119. start_scan_inventory(&iplace);
  120. while ((ie = (inventory_t *)get_next_inventory(&iplace))) {
  121. rc = (*fun)(ie, arg);
  122. if (rc)
  123. break;
  124. }
  125. end_scan_inventory(&iplace);
  126. return rc;
  127. }
  128. /*
  129.  * Find a particular inventory object
  130.  *
  131.  * pinv can be a pointer to an inventory entry and the search will begin from
  132.  * there, or it can be 0 in which case the search starts at the beginning.
  133.  * A -1 for any of the other arguments is a wildcard (i.e. it always matches).
  134.  */
  135. inventory_t *
  136. find_inventory(inventory_t *pinv, int class, int type, int controller,
  137.        int unit, int state)
  138. {
  139. invplace_t iplace =  { NULL,NULL, NULL };
  140. start_scan_inventory(&iplace);
  141. while ((pinv = (inventory_t *)get_next_inventory(&iplace)) != NULL) {
  142. if (class != -1 && pinv->inv_class != class)
  143. continue;
  144. if (type != -1 && pinv->inv_type != type)
  145. continue;
  146. /* XXXX - perhaps the "state" entry should be ignored so an
  147.  * an existing entry can be updated.  See vino_init() and
  148.  * ml/IP22.c:add_ioboard() for an example.
  149.  */
  150. if (state != -1 && pinv->inv_state != state)
  151. continue;
  152. if (controller != -1
  153.     && pinv->inv_controller != controller)
  154. continue;
  155. if (unit != -1 && pinv->inv_unit != unit)
  156. continue;
  157. break;
  158. }
  159. end_scan_inventory(&iplace);
  160. return(pinv);
  161. }
  162. /*
  163. ** Retrieve inventory data associated with a device.
  164. */
  165. inventory_t *
  166. device_inventory_get_next( devfs_handle_t device,
  167. invplace_t *invplace)
  168. {
  169. inventory_t *pinv;
  170. int rv;
  171. rv = hwgraph_inventory_get_next(device, invplace, &pinv);
  172. if (rv == LABELCL_SUCCESS)
  173. return(pinv);
  174. else
  175. return(NULL);
  176. }
  177. /*
  178. ** Associate canonical inventory information with a device (and
  179. ** add it to the general inventory).
  180. */
  181. void
  182. device_inventory_add( devfs_handle_t device,
  183. int class, 
  184. int type, 
  185. major_t controller, 
  186. minor_t unit, 
  187. int state)
  188. {
  189. hwgraph_inventory_add(device, class, type, controller, unit, state);
  190. }
  191. int
  192. device_controller_num_get(devfs_handle_t device)
  193. {
  194. return (hwgraph_controller_num_get(device));
  195. }
  196. void
  197. device_controller_num_set(devfs_handle_t device, int contr_num)
  198. {
  199. hwgraph_controller_num_set(device, contr_num);
  200. }