FreeBSD/Linux Kernel Cross Reference
sys/dev/cardbus/rbus.h
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_ */
Cache object: eadb57501c1a46186f0ff9d3fd025fcf
|