rbus.h revision 1.5 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