1/*	$OpenBSD: rbus.h,v 1.10 2010/09/22 02:28:37 jsg 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 *
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
21 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
25 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 * POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#ifndef _DEV_CARDBUS_RBUS_H_
31#define _DEV_CARDBUS_RBUS_H_
32
33/*
34 * This file defines the rbus (pseudo) class
35 *
36 * What is rbus?
37 *
38 *  Ths rbus is a recursive bus-space administrator.  This means a
39 *  parent bus-space administrator, which usually belongs to a bus
40 *  bridge, makes some child bus-space administrators and gives
41 *  (restricted) bus-space to children.  There is a root bus-space
42 *  administrator which maintains the whole bus-space.
43 *
44 * Why recursive?
45 *
46 *  The recursive bus-space administration has two reasons. For one
47 *  this modelling matches the actual memory and io space management
48 *  of bridge devices quite well. Furthermore  is the rbus a
49 *  distributed management system, as such it plays well with
50 *  multi-thread kernel.
51 *
52 * Abstraction
53 *
54 *  rbus can model a bus-to-bus bridge in two ways: dedicated or shared
55 *  Dedicated: the bridge has its own bus space.
56 *  Shared: the bridge has bus space, but this bus space is
57 *  shared with other bus bridges.
58 */
59
60
61/* require sys/extent.h */
62/* require machine/bus.h */
63
64struct extent;
65
66
67/*
68 *     General rule
69 *
70 * 1) When a rbustag has its own space (whether shared or dedicated),
71 *    allocate from rb_ext.
72 */
73struct rbustag {
74	bus_space_tag_t rb_bt;
75	struct extent *rb_ext;
76	bus_addr_t rb_start;
77	bus_addr_t rb_end;
78	bus_addr_t rb_offset;
79#if notyet
80	int (*rb_space_alloc)(struct rbustag *, bus_addr_t, bus_addr_t,
81	    bus_addr_t, bus_size_t, bus_addr_t, bus_addr_t,
82	    int, bus_addr_t *, bus_space_handle_t *);
83	int (*rbus_space_free)(struct rbustag *, bus_space_handle_t,
84	    bus_size_t, bus_addr_t *);
85#endif
86	int rb_flags;
87#define RBUS_SPACE_INVALID   0x00
88#define RBUS_SPACE_SHARE     0x01
89#define RBUS_SPACE_DEDICATE  0x02
90#define RBUS_SPACE_MASK      0x03
91	/* your own data below */
92	void *rb_md;
93};
94
95typedef struct rbustag *rbus_tag_t;
96
97
98/*
99 * These functions sugarcoat rbus interface to make rbus being used
100 * easier.  These functions should be member functions of rbus
101 * `class'.
102 */
103int	rbus_space_alloc(rbus_tag_t, bus_addr_t, bus_size_t, bus_addr_t,
104	    bus_addr_t, int, bus_addr_t *, bus_space_handle_t *);
105
106int	rbus_space_alloc_subregion(rbus_tag_t, bus_addr_t, bus_addr_t,
107	    bus_addr_t, bus_size_t, bus_addr_t, bus_addr_t, int,
108	    bus_addr_t *, bus_space_handle_t *);
109
110int	rbus_space_free(rbus_tag_t, bus_space_handle_t, bus_size_t,
111	    bus_addr_t *);
112
113
114/*
115 * These functions create rbus instance.  These functions are
116 * so-called-as a constructor of rbus.
117 *
118 */
119
120rbus_tag_t	rbus_new_body(bus_space_tag_t, struct extent *,
121		      bus_addr_t, bus_addr_t, int);
122
123rbus_tag_t	rbus_new_root_delegate(bus_space_tag_t, bus_addr_t, bus_size_t);
124rbus_tag_t	rbus_new_root_share(bus_space_tag_t, struct extent *,
125		    bus_addr_t, bus_size_t);
126
127/*
128 * Machine-dependent definitions.
129 */
130#include <machine/rbus_machdep.h>
131
132#endif /* !_DEV_CARDBUS_RBUS_H_ */
133