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