1 /* $NetBSD: rbus.h,v 1.6 2003/07/08 10:06:30 itojun 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 *, 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) __P((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 114 /* 115 * These functions sugarcoat rbus interface to make rbus being used 116 * easier. These functions should be member functions of rbus 117 * `class'. 118 */ 119 int rbus_space_alloc __P((rbus_tag_t, bus_addr_t, bus_size_t, bus_addr_t, 120 bus_addr_t, int, bus_addr_t *, bus_space_handle_t *)); 121 122 int rbus_space_alloc_subregion __P((rbus_tag_t, bus_addr_t, bus_addr_t, 123 bus_addr_t, bus_size_t, bus_addr_t, bus_addr_t, int, 124 bus_addr_t *, bus_space_handle_t *)); 125 126 int rbus_space_free __P((rbus_tag_t, bus_space_handle_t, bus_size_t, 127 bus_addr_t *)); 128 129 130 /* 131 * These functions create rbus instance. These functions are 132 * so-called-as a constructor of rbus. 133 * 134 * rbus_new is a constructor which make an rbus instance from a parent 135 * rbus. 136 */ 137 rbus_tag_t rbus_new __P((rbus_tag_t, bus_addr_t, bus_size_t, bus_addr_t, int)); 138 139 rbus_tag_t rbus_new_root_delegate __P((bus_space_tag_t, bus_addr_t, bus_size_t, 140 bus_addr_t)); 141 rbus_tag_t rbus_new_root_share __P((bus_space_tag_t, struct extent *, 142 bus_addr_t, bus_size_t, bus_addr_t)); 143 144 /* 145 * This function release bus-space used by the argument. This 146 * function is so-called-as a destructor. 147 */ 148 int rbus_delete __P((rbus_tag_t)); 149 150 151 /* 152 * Machine-dependent definitions. 153 */ 154 #include <machine/rbus_machdep.h> 155 156 #endif /* !_DEV_CARDBUS_RBUS_H_ */ 157