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_ */