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

嵌入式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, 2000 Silicon Graphics, Inc.
  8.  * Copyright (C) 2000 by Colin Ngam
  9.  */
  10. #ifndef _ASM_SN_CDL_H
  11. #define _ASM_SN_CDL_H
  12. #include <asm/sn/sgi.h>
  13. /*
  14.  * cdl: connection/driver list
  15.  *
  16.  * support code for bus infrastructure for busses
  17.  * that have self-identifying devices; initially
  18.  * constructed for xtalk, pciio and gioio modules.
  19.  */
  20. typedef struct cdl     *cdl_p;
  21. /*
  22.  * cdl_itr_f is the type for the functions
  23.  * that are handled by cdl_iterate.
  24.  */
  25. typedef void
  26. cdl_iter_f (devfs_handle_t vhdl);
  27. /*
  28.  * cdl_drv_f is the type for the functions
  29.  * that are called by cdl_add_driver and 
  30.  *      cdl_del_driver.
  31.  */
  32. typedef void
  33. cdl_drv_f (devfs_handle_t vhdl, int key1, int key2, int error);
  34. /*
  35.  * If CDL_PRI_HI is specified in the flags
  36.  * parameter for cdl_add_driver, then that driver's
  37.  * attach routine will be called for future connect
  38.  * points before any (non-CDL_PRI_HI) drivers.
  39.  *
  40.  * The IOC3 driver uses this facility to make sure
  41.  * that the ioc3_attach() function is called before
  42.  * the attach routines of any subdevices.
  43.  *
  44.  * Drivers for bridge-based crosstalk cards that
  45.  * are almost but not quite generic can use it to
  46.  * arrange that their attach() functions get called
  47.  * before the generic bridge drivers, so they can
  48.  * leave behind "hint" structures that will
  49.  * properly configure the generic driver.
  50.  */
  51. #define CDL_PRI_HI 0x0001
  52. /*
  53.  * cdl_new: construct a new connection/driver list
  54.  *
  55.  * Called once for each "kind" of bus. Returns an
  56.  * opaque cookie representing the particular list
  57.  * that will be operated on by the other calls.
  58.  */
  59. extern cdl_p cdl_new(char *, char *, char *);
  60. /*
  61.  * cdl_del: destroy a connection/driver list.
  62.  *
  63.  * Releases all dynamically allocated resources
  64.  * associated with the specified list. Forgets what
  65.  * drivers might be involved in this kind of bus,
  66.  * forgets what connection points have been noticed
  67.  * on this kind of bus.
  68.  */
  69. extern void cdl_del(cdl_p reg);
  70. /*
  71.  * cdl_add_driver: register a device driver
  72.  *
  73.  * Calls the driver's attach routine with all
  74.  * connection points on the list that have the same
  75.  * key information as the driver; call-back the 
  76.  *      specified function to notify the driver of the 
  77.  *      attach status for each device.  Place the driver
  78.  *      on the list so that any connection points
  79.  * discovered in the future that match the driver
  80.  * can be handed off to the driver's attach
  81.  * routine.
  82.  *
  83.  * CDL_PRI_HI may be specified (see above).
  84.  */
  85. extern int cdl_add_driver(cdl_p reg,
  86.        int key1,
  87.        int key2,
  88.        char *prefix,
  89.        int flags,
  90.        cdl_drv_f *func);
  91. /*
  92.  * cdl_del_driver: remove a device driver
  93.  *
  94.  * Calls the driver's detach routine with all
  95.  * connection points on the list that match the
  96.  * driver;  call-back the specified function to
  97.  *      notify the driver of the detach status for each
  98.  *      device.  Then forget about the driver.  Future
  99.  * calls to cdl_add_connpt with connections that
  100.  * would match this driver no longer trigger calls
  101.  * to the driver's attach routine.
  102.  *
  103.  * NOTE: Yes, I said CONNECTION POINTS, not
  104.  * verticies that the driver has been attached to
  105.  * with hwgraph_driver_add(); this gives the driver
  106.  * a chance to clean up anything it did to the
  107.  * connection point in its attach routine. Also,
  108.  * this is done whether or not the attach routine
  109.  * was successful.
  110.  */
  111. extern void cdl_del_driver(cdl_p reg, 
  112.        char *prefix,
  113.        cdl_drv_f *func);
  114. /*
  115.  * cdl_add_connpt: add a connection point
  116.  *
  117.  * Calls the attach routines of all the drivers on
  118.  * the list that match this connection point, in
  119.  * the order that they were added to the list,
  120.  * except that CDL_PRI_HI drivers are called first.
  121.  *
  122.  * Then the vertex is added to the list, so it can
  123.  * be presented to any matching drivers that may be
  124.  * subsequently added to the list.
  125.  */
  126. extern int cdl_add_connpt(cdl_p reg,
  127.        int key1,
  128.        int key2,
  129.        devfs_handle_t conn,
  130.        int drv_flags);
  131. /*
  132.  * cdl_del_connpt: delete a connection point
  133.  *
  134.  * Calls the detach routines of all matching
  135.  * drivers for this connection point, in the same
  136.  * order that the attach routines were called; then
  137.  * forgets about this vertex, so drivers added in
  138.  * the future will not be told about it.
  139.  *
  140.  * NOTE: Same caveat here about the detach calls as
  141.  * in the cdl_del_driver() comment above.
  142.  */
  143. extern int cdl_del_connpt(cdl_p reg,
  144.        int key1,
  145.        int key2,
  146.        devfs_handle_t conn,
  147.        int drv_flags);
  148. /*
  149.  * cdl_iterate: find all verticies in the registry
  150.  * corresponding to the named driver and call them
  151.  * with the specified function (giving the vertex
  152.  * as the parameter).
  153.  */
  154. extern void cdl_iterate(cdl_p reg,
  155.     char *prefix,
  156.     cdl_iter_f *func);
  157. /*
  158.  * An INFO_LBL_ASYNC_ATTACH label is attached to a vertex, pointing to
  159.  * an instance of async_attach_s to indicate that asynchronous
  160.  * attachment may be applied to that device ... if the corresponding
  161.  * driver allows it.
  162.  */
  163. struct async_attach_s {
  164. struct semaphore async_sema;
  165. int    async_count;
  166. };
  167. typedef struct async_attach_s *async_attach_t;
  168. async_attach_t async_attach_new(void);
  169. void async_attach_free(async_attach_t);
  170. async_attach_t  async_attach_get_info(devfs_handle_t);
  171. void            async_attach_add_info(devfs_handle_t, async_attach_t);
  172. void            async_attach_del_info(devfs_handle_t);
  173. void async_attach_signal_start(async_attach_t);
  174. void async_attach_signal_done(async_attach_t);
  175. void async_attach_waitall(async_attach_t);
  176. #endif /* _ASM_SN_CDL_H */