root/dev/cardbus/rbus.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    1 /*      $OpenBSD: rbus.h,v 1.6 2006/06/21 11:27:03 fkr Exp $ */
    2 /*      $NetBSD: rbus.h,v 1.3 1999/12/15 12:28:55 kleink Exp $  */
    3 /*
    4  * Copyright (c) 1999
    5  *     HAYAKAWA Koichi.  All rights reserved.
    6  *
    7  * Redistribution and use in source and binary forms, with or without
    8  * modification, are permitted provided that the following conditions
    9  * are met:
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  * 2. Redistributions in binary form must reproduce the above copyright
   13  *    notice, this list of conditions and the following disclaimer in the
   14  *    documentation and/or other materials provided with the distribution.
   15  * 3. All advertising materials mentioning features or use of this software
   16  *    must display the following acknowledgement:
   17  *      This product includes software developed by the author.
   18  * 4. The name of the author may not be used to endorse or promote products
   19  *    derived from this software without specific prior written permission.
   20  *
   21  *
   22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   24  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   25  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
   26  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   27  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   28  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   30  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
   31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   32  * POSSIBILITY OF SUCH DAMAGE.
   33  */
   34 
   35 #ifndef _DEV_CARDBUS_RBUS_H_
   36 #define _DEV_CARDBUS_RBUS_H_
   37 
   38 /*
   39  * This file defines the rbus (pseudo) class
   40  *
   41  * What is rbus?
   42  *
   43  *  Ths rbus is a recursive bus-space administrator.  This means a
   44  *  parent bus-space administrator, which usually belongs to a bus
   45  *  bridge, makes some child bus-space administrators and gives
   46  *  (restricted) bus-space to children.  There is a root bus-space
   47  *  administrator which maintains the whole bus-space.
   48  *
   49  * Why recursive?
   50  *
   51  *  The recursive bus-space administration has two reasons. For one
   52  *  this modelling matches the actual memory and io space management 
   53  *  of bridge devices quite well. Furthermore  is the rbus a
   54  *  distributed management system, as such it plays well with
   55  *  multi-thread kernel.
   56  *
   57  * Abstraction
   58  *
   59  *  rbus can model a bus-to-bus bridge in three ways: dedicated, shared
   60  *  and slave. 
   61  *  Dedicated: the bridge has its own bus space.
   62  *  Shared: the bridge has bus space, but this bus space is
   63  *  shared with other bus bridges. 
   64  *  Slave: the bus bridge does not have its own bus space and has to ask
   65  *  a parent bus bridge for bus space once a client is requesting bus space
   66  *  to the bridge.
   67  */
   68 
   69 
   70 /* require sys/extent.h */
   71 /* require machine/bus.h */
   72 
   73 struct extent;
   74 
   75 
   76 /*
   77  *     General rule
   78  *
   79  * 1) When a rbustag has no space for child (meaning: rb_extent is
   80  *    NULL), ask bus-space for parent through rb_parent.
   81  *
   82  * 2) When a rbustag has its own space (whether shared or dedicated),
   83  *    allocate from rb_ext.
   84  */
   85 struct rbustag {
   86         bus_space_tag_t rb_bt;
   87         struct rbustag *rb_parent;
   88         struct extent *rb_ext;
   89         bus_addr_t rb_start;
   90         bus_addr_t rb_end;
   91         bus_addr_t rb_offset;
   92 #if notyet
   93         int (*rb_space_alloc)(struct rbustag *, bus_addr_t, bus_addr_t,
   94             bus_addr_t, bus_size_t, bus_addr_t, bus_addr_t,
   95             int, bus_addr_t *, bus_space_handle_t *);
   96         int (*rbus_space_free)(struct rbustag *, bus_space_handle_t,
   97             bus_size_t, bus_addr_t *);
   98 #endif
   99         int rb_flags;
  100 #define RBUS_SPACE_INVALID   0x00
  101 #define RBUS_SPACE_SHARE     0x01
  102 #define RBUS_SPACE_DEDICATE  0x02
  103 #define RBUS_SPACE_MASK      0x03
  104 #define RBUS_SPACE_ASK_PARENT 0x04
  105         /* your own data below */
  106         void *rb_md;
  107 };
  108 
  109 typedef struct rbustag *rbus_tag_t;
  110 
  111 
  112 /*
  113  * These functions sugarcoat rbus interface to make rbus being used
  114  * easier.  These functions should be member functions of rbus
  115  * `class'.
  116  */
  117 int     rbus_space_alloc(rbus_tag_t, bus_addr_t, bus_size_t, bus_addr_t,
  118             bus_addr_t, int, bus_addr_t *, bus_space_handle_t *);
  119 
  120 int     rbus_space_alloc_subregion(rbus_tag_t, bus_addr_t, bus_addr_t,
  121             bus_addr_t, bus_size_t, bus_addr_t, bus_addr_t, int,
  122             bus_addr_t *, bus_space_handle_t *);
  123 
  124 int     rbus_space_free(rbus_tag_t, bus_space_handle_t, bus_size_t,
  125             bus_addr_t *);
  126 
  127 
  128 /*
  129  * These functions create rbus instance.  These functions are
  130  * so-called-as a constructor of rbus.
  131  *
  132  * rbus_new is a constructor which make an rbus instance from a parent
  133  * rbus.
  134  */
  135 rbus_tag_t      rbus_new(rbus_tag_t, bus_addr_t, bus_size_t, bus_addr_t, int);
  136 
  137 rbus_tag_t      rbus_new_root_delegate(bus_space_tag_t, bus_addr_t, bus_size_t,
  138                     bus_addr_t);
  139 rbus_tag_t      rbus_new_root_share(bus_space_tag_t, struct extent *,
  140                     bus_addr_t, bus_size_t, bus_addr_t);
  141 
  142 /*
  143  * This function release bus-space used by the argument.  This
  144  * function is so-called-as a destructor.
  145  */
  146 int     rbus_delete(rbus_tag_t);
  147 
  148 
  149 /*
  150  * Machine-dependent definitions.
  151  */
  152 #include <machine/rbus_machdep.h>
  153 
  154 #endif /* !_DEV_CARDBUS_RBUS_H_ */

/* [<][>][^][v][top][bottom][index][help] */