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