aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorMatt Porter <mporter@kernel.crashing.org>2005-11-07 04:00:16 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2005-11-07 10:53:46 -0500
commit70a50ebd9a94533964c19f918dbbd66763e3f9e5 (patch)
treeb0017660afe316d89233c05a6e0ba4b1606df69a /include
parent394b701ce4fbfde919a9bcbf84cb4820a7c6d47c (diff)
[PATCH] RapidIO support: core includes
Add RapidIO core include files. The core code implements enumeration/discovery, management of devices/resources, and interfaces for RIO drivers. Signed-off-by: Matt Porter <mporter@kernel.crashing.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include')
-rw-r--r--include/linux/rio.h321
-rw-r--r--include/linux/rio_drv.h469
-rw-r--r--include/linux/rio_ids.h24
-rw-r--r--include/linux/rio_regs.h202
4 files changed, 1016 insertions, 0 deletions
diff --git a/include/linux/rio.h b/include/linux/rio.h
new file mode 100644
index 000000000000..930bbb7c3802
--- /dev/null
+++ b/include/linux/rio.h
@@ -0,0 +1,321 @@
1/*
2 * RapidIO interconnect services
3 * (RapidIO Interconnect Specification, http://www.rapidio.org)
4 *
5 * Copyright 2005 MontaVista Software, Inc.
6 * Matt Porter <mporter@kernel.crashing.org>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version.
12 */
13
14#ifndef LINUX_RIO_H
15#define LINUX_RIO_H
16
17#ifdef __KERNEL__
18
19#include <linux/types.h>
20#include <linux/config.h>
21#include <linux/ioport.h>
22#include <linux/list.h>
23#include <linux/errno.h>
24#include <linux/device.h>
25#include <linux/rio_regs.h>
26
27#define RIO_ANY_DESTID 0xff
28#define RIO_NO_HOPCOUNT -1
29
30#define RIO_MAX_MPORT_RESOURCES 16
31#define RIO_MAX_DEV_RESOURCES 16
32
33#define RIO_GLOBAL_TABLE 0xff /* Indicates access of a switch's
34 global routing table if it
35 has multiple (or per port)
36 tables */
37
38#define RIO_INVALID_ROUTE 0xff /* Indicates that a route table
39 entry is invalid (no route
40 exists for the device ID) */
41
42#ifdef CONFIG_RAPIDIO_8_BIT_TRANSPORT
43#define RIO_MAX_ROUTE_ENTRIES (1 << 8)
44#else
45#define RIO_MAX_ROUTE_ENTRIES (1 << 16)
46#endif
47
48#define RIO_MAX_MBOX 4
49#define RIO_MAX_MSG_SIZE 0x1000
50
51/*
52 * Error values that may be returned by RIO functions.
53 */
54#define RIO_SUCCESSFUL 0x00
55#define RIO_BAD_SIZE 0x81
56
57/*
58 * For RIO devices, the region numbers are assigned this way:
59 *
60 * 0 RapidIO outbound doorbells
61 * 1-15 RapidIO memory regions
62 *
63 * For RIO master ports, the region number are assigned this way:
64 *
65 * 0 RapidIO inbound doorbells
66 * 1 RapidIO inbound mailboxes
67 * 1 RapidIO outbound mailboxes
68 */
69#define RIO_DOORBELL_RESOURCE 0
70#define RIO_INB_MBOX_RESOURCE 1
71#define RIO_OUTB_MBOX_RESOURCE 2
72
73extern struct bus_type rio_bus_type;
74extern struct list_head rio_devices; /* list of all devices */
75
76struct rio_mport;
77
78/**
79 * struct rio_dev - RIO device info
80 * @global_list: Node in list of all RIO devices
81 * @net_list: Node in list of RIO devices in a network
82 * @net: Network this device is a part of
83 * @did: Device ID
84 * @vid: Vendor ID
85 * @device_rev: Device revision
86 * @asm_did: Assembly device ID
87 * @asm_vid: Assembly vendor ID
88 * @asm_rev: Assembly revision
89 * @efptr: Extended feature pointer
90 * @pef: Processing element features
91 * @swpinfo: Switch port info
92 * @src_ops: Source operation capabilities
93 * @dst_ops: Destination operation capabilities
94 * @rswitch: Pointer to &struct rio_switch if valid for this device
95 * @driver: Driver claiming this device
96 * @dev: Device model device
97 * @riores: RIO resources this device owns
98 * @destid: Network destination ID
99 */
100struct rio_dev {
101 struct list_head global_list; /* node in list of all RIO devices */
102 struct list_head net_list; /* node in per net list */
103 struct rio_net *net; /* RIO net this device resides in */
104 u16 did;
105 u16 vid;
106 u32 device_rev;
107 u16 asm_did;
108 u16 asm_vid;
109 u16 asm_rev;
110 u16 efptr;
111 u32 pef;
112 u32 swpinfo; /* Only used for switches */
113 u32 src_ops;
114 u32 dst_ops;
115 struct rio_switch *rswitch; /* RIO switch info */
116 struct rio_driver *driver; /* RIO driver claiming this device */
117 struct device dev; /* LDM device structure */
118 struct resource riores[RIO_MAX_DEV_RESOURCES];
119 u16 destid;
120};
121
122#define rio_dev_g(n) list_entry(n, struct rio_dev, global_list)
123#define rio_dev_f(n) list_entry(n, struct rio_dev, net_list)
124#define to_rio_dev(n) container_of(n, struct rio_dev, dev)
125
126/**
127 * struct rio_msg - RIO message event
128 * @res: Mailbox resource
129 * @mcback: Message event callback
130 */
131struct rio_msg {
132 struct resource *res;
133 void (*mcback) (struct rio_mport * mport, int mbox, int slot);
134};
135
136/**
137 * struct rio_dbell - RIO doorbell event
138 * @node: Node in list of doorbell events
139 * @res: Doorbell resource
140 * @dinb: Doorbell event callback
141 */
142struct rio_dbell {
143 struct list_head node;
144 struct resource *res;
145 void (*dinb) (struct rio_mport * mport, u16 src, u16 dst, u16 info);
146};
147
148/**
149 * struct rio_mport - RIO master port info
150 * @dbells: List of doorbell events
151 * @node: Node in global list of master ports
152 * @nnode: Node in network list of master ports
153 * @iores: I/O mem resource that this master port interface owns
154 * @riores: RIO resources that this master port interfaces owns
155 * @inb_msg: RIO inbound message event descriptors
156 * @outb_msg: RIO outbound message event descriptors
157 * @host_deviceid: Host device ID associated with this master port
158 * @ops: configuration space functions
159 * @id: Port ID, unique among all ports
160 * @index: Port index, unique among all port interfaces of the same type
161 * @name: Port name string
162 */
163struct rio_mport {
164 struct list_head dbells; /* list of doorbell events */
165 struct list_head node; /* node in global list of ports */
166 struct list_head nnode; /* node in net list of ports */
167 struct resource iores;
168 struct resource riores[RIO_MAX_MPORT_RESOURCES];
169 struct rio_msg inb_msg[RIO_MAX_MBOX];
170 struct rio_msg outb_msg[RIO_MAX_MBOX];
171 int host_deviceid; /* Host device ID */
172 struct rio_ops *ops; /* maintenance transaction functions */
173 unsigned char id; /* port ID, unique among all ports */
174 unsigned char index; /* port index, unique among all port
175 interfaces of the same type */
176 unsigned char name[40];
177};
178
179/**
180 * struct rio_net - RIO network info
181 * @node: Node in global list of RIO networks
182 * @devices: List of devices in this network
183 * @mports: List of master ports accessing this network
184 * @hport: Default port for accessing this network
185 * @id: RIO network ID
186 */
187struct rio_net {
188 struct list_head node; /* node in list of networks */
189 struct list_head devices; /* list of devices in this net */
190 struct list_head mports; /* list of ports accessing net */
191 struct rio_mport *hport; /* primary port for accessing net */
192 unsigned char id; /* RIO network ID */
193};
194
195/**
196 * struct rio_switch - RIO switch info
197 * @node: Node in global list of switches
198 * @switchid: Switch ID that is unique across a network
199 * @hopcount: Hopcount to this switch
200 * @destid: Associated destid in the path
201 * @route_table: Copy of switch routing table
202 * @add_entry: Callback for switch-specific route add function
203 * @get_entry: Callback for switch-specific route get function
204 */
205struct rio_switch {
206 struct list_head node;
207 u16 switchid;
208 u16 hopcount;
209 u16 destid;
210 u8 route_table[RIO_MAX_ROUTE_ENTRIES];
211 int (*add_entry) (struct rio_mport * mport, u16 destid, u8 hopcount,
212 u16 table, u16 route_destid, u8 route_port);
213 int (*get_entry) (struct rio_mport * mport, u16 destid, u8 hopcount,
214 u16 table, u16 route_destid, u8 * route_port);
215};
216
217/* Low-level architecture-dependent routines */
218
219/**
220 * struct rio_ops - Low-level RIO configuration space operations
221 * @lcread: Callback to perform local (master port) read of config space.
222 * @lcwrite: Callback to perform local (master port) write of config space.
223 * @cread: Callback to perform network read of config space.
224 * @cwrite: Callback to perform network write of config space.
225 * @dsend: Callback to send a doorbell message.
226 */
227struct rio_ops {
228 int (*lcread) (int index, u32 offset, int len, u32 * data);
229 int (*lcwrite) (int index, u32 offset, int len, u32 data);
230 int (*cread) (int index, u16 destid, u8 hopcount, u32 offset, int len,
231 u32 * data);
232 int (*cwrite) (int index, u16 destid, u8 hopcount, u32 offset, int len,
233 u32 data);
234 int (*dsend) (int index, u16 destid, u16 data);
235};
236
237#define RIO_RESOURCE_MEM 0x00000100
238#define RIO_RESOURCE_DOORBELL 0x00000200
239#define RIO_RESOURCE_MAILBOX 0x00000400
240
241#define RIO_RESOURCE_CACHEABLE 0x00010000
242#define RIO_RESOURCE_PCI 0x00020000
243
244#define RIO_RESOURCE_BUSY 0x80000000
245
246/**
247 * struct rio_driver - RIO driver info
248 * @node: Node in list of drivers
249 * @name: RIO driver name
250 * @id_table: RIO device ids to be associated with this driver
251 * @probe: RIO device inserted
252 * @remove: RIO device removed
253 * @suspend: RIO device suspended
254 * @resume: RIO device awakened
255 * @enable_wake: RIO device enable wake event
256 * @driver: LDM driver struct
257 *
258 * Provides info on a RIO device driver for insertion/removal and
259 * power management purposes.
260 */
261struct rio_driver {
262 struct list_head node;
263 char *name;
264 const struct rio_device_id *id_table;
265 int (*probe) (struct rio_dev * dev, const struct rio_device_id * id);
266 void (*remove) (struct rio_dev * dev);
267 int (*suspend) (struct rio_dev * dev, u32 state);
268 int (*resume) (struct rio_dev * dev);
269 int (*enable_wake) (struct rio_dev * dev, u32 state, int enable);
270 struct device_driver driver;
271};
272
273#define to_rio_driver(drv) container_of(drv,struct rio_driver, driver)
274
275/**
276 * struct rio_device_id - RIO device identifier
277 * @did: RIO device ID
278 * @vid: RIO vendor ID
279 * @asm_did: RIO assembly device ID
280 * @asm_vid: RIO assembly vendor ID
281 *
282 * Identifies a RIO device based on both the device/vendor IDs and
283 * the assembly device/vendor IDs.
284 */
285struct rio_device_id {
286 u16 did, vid;
287 u16 asm_did, asm_vid;
288};
289
290/**
291 * struct rio_route_ops - Per-switch route operations
292 * @vid: RIO vendor ID
293 * @did: RIO device ID
294 * @add_hook: Callback that adds a route entry
295 * @get_hook: Callback that gets a route entry
296 *
297 * Defines the operations that are necessary to manipulate the route
298 * tables for a particular RIO switch device.
299 */
300struct rio_route_ops {
301 u16 vid, did;
302 int (*add_hook) (struct rio_mport * mport, u16 destid, u8 hopcount,
303 u16 table, u16 route_destid, u8 route_port);
304 int (*get_hook) (struct rio_mport * mport, u16 destid, u8 hopcount,
305 u16 table, u16 route_destid, u8 * route_port);
306};
307
308/* Architecture and hardware-specific functions */
309extern int rio_init_mports(void);
310extern void rio_register_mport(struct rio_mport *);
311extern int rio_hw_add_outb_message(struct rio_mport *, struct rio_dev *, int,
312 void *, size_t);
313extern int rio_hw_add_inb_buffer(struct rio_mport *, int, void *);
314extern void *rio_hw_get_inb_message(struct rio_mport *, int);
315extern int rio_open_inb_mbox(struct rio_mport *, int, int);
316extern void rio_close_inb_mbox(struct rio_mport *, int);
317extern int rio_open_outb_mbox(struct rio_mport *, int, int);
318extern void rio_close_outb_mbox(struct rio_mport *, int);
319
320#endif /* __KERNEL__ */
321#endif /* LINUX_RIO_H */
diff --git a/include/linux/rio_drv.h b/include/linux/rio_drv.h
new file mode 100644
index 000000000000..7483dfc0dfa3
--- /dev/null
+++ b/include/linux/rio_drv.h
@@ -0,0 +1,469 @@
1/*
2 * RapidIO driver services
3 *
4 * Copyright 2005 MontaVista Software, Inc.
5 * Matt Porter <mporter@kernel.crashing.org>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
11 */
12
13#ifndef LINUX_RIO_DRV_H
14#define LINUX_RIO_DRV_H
15
16#ifdef __KERNEL__
17
18#include <linux/types.h>
19#include <linux/config.h>
20#include <linux/ioport.h>
21#include <linux/list.h>
22#include <linux/errno.h>
23#include <linux/device.h>
24#include <linux/rio.h>
25
26extern int __rio_local_read_config_32(struct rio_mport *port, u32 offset,
27 u32 * data);
28extern int __rio_local_write_config_32(struct rio_mport *port, u32 offset,
29 u32 data);
30extern int __rio_local_read_config_16(struct rio_mport *port, u32 offset,
31 u16 * data);
32extern int __rio_local_write_config_16(struct rio_mport *port, u32 offset,
33 u16 data);
34extern int __rio_local_read_config_8(struct rio_mport *port, u32 offset,
35 u8 * data);
36extern int __rio_local_write_config_8(struct rio_mport *port, u32 offset,
37 u8 data);
38
39extern int rio_mport_read_config_32(struct rio_mport *port, u16 destid,
40 u8 hopcount, u32 offset, u32 * data);
41extern int rio_mport_write_config_32(struct rio_mport *port, u16 destid,
42 u8 hopcount, u32 offset, u32 data);
43extern int rio_mport_read_config_16(struct rio_mport *port, u16 destid,
44 u8 hopcount, u32 offset, u16 * data);
45extern int rio_mport_write_config_16(struct rio_mport *port, u16 destid,
46 u8 hopcount, u32 offset, u16 data);
47extern int rio_mport_read_config_8(struct rio_mport *port, u16 destid,
48 u8 hopcount, u32 offset, u8 * data);
49extern int rio_mport_write_config_8(struct rio_mport *port, u16 destid,
50 u8 hopcount, u32 offset, u8 data);
51
52/**
53 * rio_local_read_config_32 - Read 32 bits from local configuration space
54 * @port: Master port
55 * @offset: Offset into local configuration space
56 * @data: Pointer to read data into
57 *
58 * Reads 32 bits of data from the specified offset within the local
59 * device's configuration space.
60 */
61static inline int rio_local_read_config_32(struct rio_mport *port, u32 offset,
62 u32 * data)
63{
64 return __rio_local_read_config_32(port, offset, data);
65}
66
67/**
68 * rio_local_write_config_32 - Write 32 bits to local configuration space
69 * @port: Master port
70 * @offset: Offset into local configuration space
71 * @data: Data to be written
72 *
73 * Writes 32 bits of data to the specified offset within the local
74 * device's configuration space.
75 */
76static inline int rio_local_write_config_32(struct rio_mport *port, u32 offset,
77 u32 data)
78{
79 return __rio_local_write_config_32(port, offset, data);
80}
81
82/**
83 * rio_local_read_config_16 - Read 16 bits from local configuration space
84 * @port: Master port
85 * @offset: Offset into local configuration space
86 * @data: Pointer to read data into
87 *
88 * Reads 16 bits of data from the specified offset within the local
89 * device's configuration space.
90 */
91static inline int rio_local_read_config_16(struct rio_mport *port, u32 offset,
92 u16 * data)
93{
94 return __rio_local_read_config_16(port, offset, data);
95}
96
97/**
98 * rio_local_write_config_16 - Write 16 bits to local configuration space
99 * @port: Master port
100 * @offset: Offset into local configuration space
101 * @data: Data to be written
102 *
103 * Writes 16 bits of data to the specified offset within the local
104 * device's configuration space.
105 */
106
107static inline int rio_local_write_config_16(struct rio_mport *port, u32 offset,
108 u16 data)
109{
110 return __rio_local_write_config_16(port, offset, data);
111}
112
113/**
114 * rio_local_read_config_8 - Read 8 bits from local configuration space
115 * @port: Master port
116 * @offset: Offset into local configuration space
117 * @data: Pointer to read data into
118 *
119 * Reads 8 bits of data from the specified offset within the local
120 * device's configuration space.
121 */
122static inline int rio_local_read_config_8(struct rio_mport *port, u32 offset,
123 u8 * data)
124{
125 return __rio_local_read_config_8(port, offset, data);
126}
127
128/**
129 * rio_local_write_config_8 - Write 8 bits to local configuration space
130 * @port: Master port
131 * @offset: Offset into local configuration space
132 * @data: Data to be written
133 *
134 * Writes 8 bits of data to the specified offset within the local
135 * device's configuration space.
136 */
137static inline int rio_local_write_config_8(struct rio_mport *port, u32 offset,
138 u8 data)
139{
140 return __rio_local_write_config_8(port, offset, data);
141}
142
143/**
144 * rio_read_config_32 - Read 32 bits from configuration space
145 * @rdev: RIO device
146 * @offset: Offset into device configuration space
147 * @data: Pointer to read data into
148 *
149 * Reads 32 bits of data from the specified offset within the
150 * RIO device's configuration space.
151 */
152static inline int rio_read_config_32(struct rio_dev *rdev, u32 offset,
153 u32 * data)
154{
155 u8 hopcount = 0xff;
156 u16 destid = rdev->destid;
157
158 if (rdev->rswitch) {
159 destid = rdev->rswitch->destid;
160 hopcount = rdev->rswitch->hopcount;
161 }
162
163 return rio_mport_read_config_32(rdev->net->hport, destid, hopcount,
164 offset, data);
165};
166
167/**
168 * rio_write_config_32 - Write 32 bits to configuration space
169 * @rdev: RIO device
170 * @offset: Offset into device configuration space
171 * @data: Data to be written
172 *
173 * Writes 32 bits of data to the specified offset within the
174 * RIO device's configuration space.
175 */
176static inline int rio_write_config_32(struct rio_dev *rdev, u32 offset,
177 u32 data)
178{
179 u8 hopcount = 0xff;
180 u16 destid = rdev->destid;
181
182 if (rdev->rswitch) {
183 destid = rdev->rswitch->destid;
184 hopcount = rdev->rswitch->hopcount;
185 }
186
187 return rio_mport_write_config_32(rdev->net->hport, destid, hopcount,
188 offset, data);
189};
190
191/**
192 * rio_read_config_16 - Read 16 bits from configuration space
193 * @rdev: RIO device
194 * @offset: Offset into device configuration space
195 * @data: Pointer to read data into
196 *
197 * Reads 16 bits of data from the specified offset within the
198 * RIO device's configuration space.
199 */
200static inline int rio_read_config_16(struct rio_dev *rdev, u32 offset,
201 u16 * data)
202{
203 u8 hopcount = 0xff;
204 u16 destid = rdev->destid;
205
206 if (rdev->rswitch) {
207 destid = rdev->rswitch->destid;
208 hopcount = rdev->rswitch->hopcount;
209 }
210
211 return rio_mport_read_config_16(rdev->net->hport, destid, hopcount,
212 offset, data);
213};
214
215/**
216 * rio_write_config_16 - Write 16 bits to configuration space
217 * @rdev: RIO device
218 * @offset: Offset into device configuration space
219 * @data: Data to be written
220 *
221 * Writes 16 bits of data to the specified offset within the
222 * RIO device's configuration space.
223 */
224static inline int rio_write_config_16(struct rio_dev *rdev, u32 offset,
225 u16 data)
226{
227 u8 hopcount = 0xff;
228 u16 destid = rdev->destid;
229
230 if (rdev->rswitch) {
231 destid = rdev->rswitch->destid;
232 hopcount = rdev->rswitch->hopcount;
233 }
234
235 return rio_mport_write_config_16(rdev->net->hport, destid, hopcount,
236 offset, data);
237};
238
239/**
240 * rio_read_config_8 - Read 8 bits from configuration space
241 * @rdev: RIO device
242 * @offset: Offset into device configuration space
243 * @data: Pointer to read data into
244 *
245 * Reads 8 bits of data from the specified offset within the
246 * RIO device's configuration space.
247 */
248static inline int rio_read_config_8(struct rio_dev *rdev, u32 offset, u8 * data)
249{
250 u8 hopcount = 0xff;
251 u16 destid = rdev->destid;
252
253 if (rdev->rswitch) {
254 destid = rdev->rswitch->destid;
255 hopcount = rdev->rswitch->hopcount;
256 }
257
258 return rio_mport_read_config_8(rdev->net->hport, destid, hopcount,
259 offset, data);
260};
261
262/**
263 * rio_write_config_8 - Write 8 bits to configuration space
264 * @rdev: RIO device
265 * @offset: Offset into device configuration space
266 * @data: Data to be written
267 *
268 * Writes 8 bits of data to the specified offset within the
269 * RIO device's configuration space.
270 */
271static inline int rio_write_config_8(struct rio_dev *rdev, u32 offset, u8 data)
272{
273 u8 hopcount = 0xff;
274 u16 destid = rdev->destid;
275
276 if (rdev->rswitch) {
277 destid = rdev->rswitch->destid;
278 hopcount = rdev->rswitch->hopcount;
279 }
280
281 return rio_mport_write_config_8(rdev->net->hport, destid, hopcount,
282 offset, data);
283};
284
285extern int rio_mport_send_doorbell(struct rio_mport *mport, u16 destid,
286 u16 data);
287
288/**
289 * rio_send_doorbell - Send a doorbell message to a device
290 * @rdev: RIO device
291 * @data: Doorbell message data
292 *
293 * Send a doorbell message to a RIO device. The doorbell message
294 * has a 16-bit info field provided by the @data argument.
295 */
296static inline int rio_send_doorbell(struct rio_dev *rdev, u16 data)
297{
298 return rio_mport_send_doorbell(rdev->net->hport, rdev->destid, data);
299};
300
301/**
302 * rio_init_mbox_res - Initialize a RIO mailbox resource
303 * @res: resource struct
304 * @start: start of mailbox range
305 * @end: end of mailbox range
306 *
307 * This function is used to initialize the fields of a resource
308 * for use as a mailbox resource. It initializes a range of
309 * mailboxes using the start and end arguments.
310 */
311static inline void rio_init_mbox_res(struct resource *res, int start, int end)
312{
313 memset(res, 0, sizeof(struct resource));
314 res->start = start;
315 res->end = end;
316 res->flags = RIO_RESOURCE_MAILBOX;
317}
318
319/**
320 * rio_init_dbell_res - Initialize a RIO doorbell resource
321 * @res: resource struct
322 * @start: start of doorbell range
323 * @end: end of doorbell range
324 *
325 * This function is used to initialize the fields of a resource
326 * for use as a doorbell resource. It initializes a range of
327 * doorbell messages using the start and end arguments.
328 */
329static inline void rio_init_dbell_res(struct resource *res, u16 start, u16 end)
330{
331 memset(res, 0, sizeof(struct resource));
332 res->start = start;
333 res->end = end;
334 res->flags = RIO_RESOURCE_DOORBELL;
335}
336
337/**
338 * RIO_DEVICE - macro used to describe a specific RIO device
339 * @vid: the 16 bit RIO vendor ID
340 * @did: the 16 bit RIO device ID
341 *
342 * This macro is used to create a struct rio_device_id that matches a
343 * specific device. The assembly vendor and assembly device fields
344 * will be set to %RIO_ANY_ID.
345 */
346#define RIO_DEVICE(dev,ven) \
347 .did = (dev), .vid = (ven), \
348 .asm_did = RIO_ANY_ID, .asm_vid = RIO_ANY_ID
349
350/* Mailbox management */
351extern int rio_request_outb_mbox(struct rio_mport *, int, int,
352 void (*)(struct rio_mport *, int, int));
353extern int rio_release_outb_mbox(struct rio_mport *, int);
354
355/**
356 * rio_add_outb_message - Add RIO message to an outbound mailbox queue
357 * @mport: RIO master port containing the outbound queue
358 * @rdev: RIO device the message is be sent to
359 * @mbox: The outbound mailbox queue
360 * @buffer: Pointer to the message buffer
361 * @len: Length of the message buffer
362 *
363 * Adds a RIO message buffer to an outbound mailbox queue for
364 * transmission. Returns 0 on success.
365 */
366static inline int rio_add_outb_message(struct rio_mport *mport,
367 struct rio_dev *rdev, int mbox,
368 void *buffer, size_t len)
369{
370 return rio_hw_add_outb_message(mport, rdev, mbox, buffer, len);
371}
372
373extern int rio_request_inb_mbox(struct rio_mport *, int, int,
374 void (*)(struct rio_mport *, int, int));
375extern int rio_release_inb_mbox(struct rio_mport *, int);
376
377/**
378 * rio_add_inb_buffer - Add buffer to an inbound mailbox queue
379 * @mport: Master port containing the inbound mailbox
380 * @mbox: The inbound mailbox number
381 * @buffer: Pointer to the message buffer
382 *
383 * Adds a buffer to an inbound mailbox queue for reception. Returns
384 * 0 on success.
385 */
386static inline int rio_add_inb_buffer(struct rio_mport *mport, int mbox,
387 void *buffer)
388{
389 return rio_hw_add_inb_buffer(mport, mbox, buffer);
390}
391
392/**
393 * rio_get_inb_message - Get A RIO message from an inbound mailbox queue
394 * @mport: Master port containing the inbound mailbox
395 * @mbox: The inbound mailbox number
396 * @buffer: Pointer to the message buffer
397 *
398 * Get a RIO message from an inbound mailbox queue. Returns 0 on success.
399 */
400static inline void *rio_get_inb_message(struct rio_mport *mport, int mbox)
401{
402 return rio_hw_get_inb_message(mport, mbox);
403}
404
405/* Doorbell management */
406extern int rio_request_inb_dbell(struct rio_mport *, u16, u16,
407 void (*)(struct rio_mport *, u16, u16, u16));
408extern int rio_release_inb_dbell(struct rio_mport *, u16, u16);
409extern struct resource *rio_request_outb_dbell(struct rio_dev *, u16, u16);
410extern int rio_release_outb_dbell(struct rio_dev *, struct resource *);
411
412/* Memory region management */
413int rio_claim_resource(struct rio_dev *, int);
414int rio_request_regions(struct rio_dev *, char *);
415void rio_release_regions(struct rio_dev *);
416int rio_request_region(struct rio_dev *, int, char *);
417void rio_release_region(struct rio_dev *, int);
418
419/* LDM support */
420int rio_register_driver(struct rio_driver *);
421void rio_unregister_driver(struct rio_driver *);
422struct rio_dev *rio_dev_get(struct rio_dev *);
423void rio_dev_put(struct rio_dev *);
424
425/**
426 * rio_name - Get the unique RIO device identifier
427 * @rdev: RIO device
428 *
429 * Get the unique RIO device identifier. Returns the device
430 * identifier string.
431 */
432static inline char *rio_name(struct rio_dev *rdev)
433{
434 return rdev->dev.bus_id;
435}
436
437/**
438 * rio_get_drvdata - Get RIO driver specific data
439 * @rdev: RIO device
440 *
441 * Get RIO driver specific data. Returns a pointer to the
442 * driver specific data.
443 */
444static inline void *rio_get_drvdata(struct rio_dev *rdev)
445{
446 return dev_get_drvdata(&rdev->dev);
447}
448
449/**
450 * rio_set_drvdata - Set RIO driver specific data
451 * @rdev: RIO device
452 * @data: Pointer to driver specific data
453 *
454 * Set RIO driver specific data. device struct driver data pointer
455 * is set to the @data argument.
456 */
457static inline void rio_set_drvdata(struct rio_dev *rdev, void *data)
458{
459 dev_set_drvdata(&rdev->dev, data);
460}
461
462/* Misc driver helpers */
463extern u16 rio_local_get_device_id(struct rio_mport *port);
464extern struct rio_dev *rio_get_device(u16 vid, u16 did, struct rio_dev *from);
465extern struct rio_dev *rio_get_asm(u16 vid, u16 did, u16 asm_vid, u16 asm_did,
466 struct rio_dev *from);
467
468#endif /* __KERNEL__ */
469#endif /* LINUX_RIO_DRV_H */
diff --git a/include/linux/rio_ids.h b/include/linux/rio_ids.h
new file mode 100644
index 000000000000..919d4e07d54e
--- /dev/null
+++ b/include/linux/rio_ids.h
@@ -0,0 +1,24 @@
1/*
2 * RapidIO devices
3 *
4 * Copyright 2005 MontaVista Software, Inc.
5 * Matt Porter <mporter@kernel.crashing.org>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
11 */
12
13#ifndef LINUX_RIO_IDS_H
14#define LINUX_RIO_IDS_H
15
16#define RIO_ANY_ID 0xffff
17
18#define RIO_VID_FREESCALE 0x0002
19#define RIO_DID_MPC8560 0x0003
20
21#define RIO_VID_TUNDRA 0x000d
22#define RIO_DID_TSI500 0x0500
23
24#endif /* LINUX_RIO_IDS_H */
diff --git a/include/linux/rio_regs.h b/include/linux/rio_regs.h
new file mode 100644
index 000000000000..f419be3be491
--- /dev/null
+++ b/include/linux/rio_regs.h
@@ -0,0 +1,202 @@
1/*
2 * RapidIO register definitions
3 *
4 * Copyright 2005 MontaVista Software, Inc.
5 * Matt Porter <mporter@kernel.crashing.org>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
11 */
12
13#ifndef LINUX_RIO_REGS_H
14#define LINUX_RIO_REGS_H
15
16/*
17 * In RapidIO, each device has a 2MB configuration space that is
18 * accessed via maintenance transactions. Portions of configuration
19 * space are standardized and/or reserved.
20 */
21#define RIO_DEV_ID_CAR 0x00 /* [I] Device Identity CAR */
22#define RIO_DEV_INFO_CAR 0x04 /* [I] Device Information CAR */
23#define RIO_ASM_ID_CAR 0x08 /* [I] Assembly Identity CAR */
24#define RIO_ASM_ID_MASK 0xffff0000 /* [I] Asm ID Mask */
25#define RIO_ASM_VEN_ID_MASK 0x0000ffff /* [I] Asm Vend Mask */
26
27#define RIO_ASM_INFO_CAR 0x0c /* [I] Assembly Information CAR */
28#define RIO_ASM_REV_MASK 0xffff0000 /* [I] Asm Rev Mask */
29#define RIO_EXT_FTR_PTR_MASK 0x0000ffff /* [I] EF_PTR Mask */
30
31#define RIO_PEF_CAR 0x10 /* [I] Processing Element Features CAR */
32#define RIO_PEF_BRIDGE 0x80000000 /* [I] Bridge */
33#define RIO_PEF_MEMORY 0x40000000 /* [I] MMIO */
34#define RIO_PEF_PROCESSOR 0x20000000 /* [I] Processor */
35#define RIO_PEF_SWITCH 0x10000000 /* [I] Switch */
36#define RIO_PEF_INB_MBOX 0x00f00000 /* [II] Mailboxes */
37#define RIO_PEF_INB_MBOX0 0x00800000 /* [II] Mailbox 0 */
38#define RIO_PEF_INB_MBOX1 0x00400000 /* [II] Mailbox 1 */
39#define RIO_PEF_INB_MBOX2 0x00200000 /* [II] Mailbox 2 */
40#define RIO_PEF_INB_MBOX3 0x00100000 /* [II] Mailbox 3 */
41#define RIO_PEF_INB_DOORBELL 0x00080000 /* [II] Doorbells */
42#define RIO_PEF_CTLS 0x00000010 /* [III] CTLS */
43#define RIO_PEF_EXT_FEATURES 0x00000008 /* [I] EFT_PTR valid */
44#define RIO_PEF_ADDR_66 0x00000004 /* [I] 66 bits */
45#define RIO_PEF_ADDR_50 0x00000002 /* [I] 50 bits */
46#define RIO_PEF_ADDR_34 0x00000001 /* [I] 34 bits */
47
48#define RIO_SWP_INFO_CAR 0x14 /* [I] Switch Port Information CAR */
49#define RIO_SWP_INFO_PORT_TOTAL_MASK 0x0000ff00 /* [I] Total number of ports */
50#define RIO_SWP_INFO_PORT_NUM_MASK 0x000000ff /* [I] Maintenance transaction port number */
51#define RIO_GET_TOTAL_PORTS(x) ((x & RIO_SWP_INFO_PORT_TOTAL_MASK) >> 8)
52
53#define RIO_SRC_OPS_CAR 0x18 /* [I] Source Operations CAR */
54#define RIO_SRC_OPS_READ 0x00008000 /* [I] Read op */
55#define RIO_SRC_OPS_WRITE 0x00004000 /* [I] Write op */
56#define RIO_SRC_OPS_STREAM_WRITE 0x00002000 /* [I] Str-write op */
57#define RIO_SRC_OPS_WRITE_RESPONSE 0x00001000 /* [I] Write/resp op */
58#define RIO_SRC_OPS_DATA_MSG 0x00000800 /* [II] Data msg op */
59#define RIO_SRC_OPS_DOORBELL 0x00000400 /* [II] Doorbell op */
60#define RIO_SRC_OPS_ATOMIC_TST_SWP 0x00000100 /* [I] Atomic TAS op */
61#define RIO_SRC_OPS_ATOMIC_INC 0x00000080 /* [I] Atomic inc op */
62#define RIO_SRC_OPS_ATOMIC_DEC 0x00000040 /* [I] Atomic dec op */
63#define RIO_SRC_OPS_ATOMIC_SET 0x00000020 /* [I] Atomic set op */
64#define RIO_SRC_OPS_ATOMIC_CLR 0x00000010 /* [I] Atomic clr op */
65#define RIO_SRC_OPS_PORT_WRITE 0x00000004 /* [I] Port-write op */
66
67#define RIO_DST_OPS_CAR 0x1c /* Destination Operations CAR */
68#define RIO_DST_OPS_READ 0x00008000 /* [I] Read op */
69#define RIO_DST_OPS_WRITE 0x00004000 /* [I] Write op */
70#define RIO_DST_OPS_STREAM_WRITE 0x00002000 /* [I] Str-write op */
71#define RIO_DST_OPS_WRITE_RESPONSE 0x00001000 /* [I] Write/resp op */
72#define RIO_DST_OPS_DATA_MSG 0x00000800 /* [II] Data msg op */
73#define RIO_DST_OPS_DOORBELL 0x00000400 /* [II] Doorbell op */
74#define RIO_DST_OPS_ATOMIC_TST_SWP 0x00000100 /* [I] Atomic TAS op */
75#define RIO_DST_OPS_ATOMIC_INC 0x00000080 /* [I] Atomic inc op */
76#define RIO_DST_OPS_ATOMIC_DEC 0x00000040 /* [I] Atomic dec op */
77#define RIO_DST_OPS_ATOMIC_SET 0x00000020 /* [I] Atomic set op */
78#define RIO_DST_OPS_ATOMIC_CLR 0x00000010 /* [I] Atomic clr op */
79#define RIO_DST_OPS_PORT_WRITE 0x00000004 /* [I] Port-write op */
80
81 /* 0x20-0x3c *//* Reserved */
82
83#define RIO_MBOX_CSR 0x40 /* [II] Mailbox CSR */
84#define RIO_MBOX0_AVAIL 0x80000000 /* [II] Mbox 0 avail */
85#define RIO_MBOX0_FULL 0x40000000 /* [II] Mbox 0 full */
86#define RIO_MBOX0_EMPTY 0x20000000 /* [II] Mbox 0 empty */
87#define RIO_MBOX0_BUSY 0x10000000 /* [II] Mbox 0 busy */
88#define RIO_MBOX0_FAIL 0x08000000 /* [II] Mbox 0 fail */
89#define RIO_MBOX0_ERROR 0x04000000 /* [II] Mbox 0 error */
90#define RIO_MBOX1_AVAIL 0x00800000 /* [II] Mbox 1 avail */
91#define RIO_MBOX1_FULL 0x00200000 /* [II] Mbox 1 full */
92#define RIO_MBOX1_EMPTY 0x00200000 /* [II] Mbox 1 empty */
93#define RIO_MBOX1_BUSY 0x00100000 /* [II] Mbox 1 busy */
94#define RIO_MBOX1_FAIL 0x00080000 /* [II] Mbox 1 fail */
95#define RIO_MBOX1_ERROR 0x00040000 /* [II] Mbox 1 error */
96#define RIO_MBOX2_AVAIL 0x00008000 /* [II] Mbox 2 avail */
97#define RIO_MBOX2_FULL 0x00004000 /* [II] Mbox 2 full */
98#define RIO_MBOX2_EMPTY 0x00002000 /* [II] Mbox 2 empty */
99#define RIO_MBOX2_BUSY 0x00001000 /* [II] Mbox 2 busy */
100#define RIO_MBOX2_FAIL 0x00000800 /* [II] Mbox 2 fail */
101#define RIO_MBOX2_ERROR 0x00000400 /* [II] Mbox 2 error */
102#define RIO_MBOX3_AVAIL 0x00000080 /* [II] Mbox 3 avail */
103#define RIO_MBOX3_FULL 0x00000040 /* [II] Mbox 3 full */
104#define RIO_MBOX3_EMPTY 0x00000020 /* [II] Mbox 3 empty */
105#define RIO_MBOX3_BUSY 0x00000010 /* [II] Mbox 3 busy */
106#define RIO_MBOX3_FAIL 0x00000008 /* [II] Mbox 3 fail */
107#define RIO_MBOX3_ERROR 0x00000004 /* [II] Mbox 3 error */
108
109#define RIO_WRITE_PORT_CSR 0x44 /* [I] Write Port CSR */
110#define RIO_DOORBELL_CSR 0x44 /* [II] Doorbell CSR */
111#define RIO_DOORBELL_AVAIL 0x80000000 /* [II] Doorbell avail */
112#define RIO_DOORBELL_FULL 0x40000000 /* [II] Doorbell full */
113#define RIO_DOORBELL_EMPTY 0x20000000 /* [II] Doorbell empty */
114#define RIO_DOORBELL_BUSY 0x10000000 /* [II] Doorbell busy */
115#define RIO_DOORBELL_FAILED 0x08000000 /* [II] Doorbell failed */
116#define RIO_DOORBELL_ERROR 0x04000000 /* [II] Doorbell error */
117#define RIO_WRITE_PORT_AVAILABLE 0x00000080 /* [I] Write Port Available */
118#define RIO_WRITE_PORT_FULL 0x00000040 /* [I] Write Port Full */
119#define RIO_WRITE_PORT_EMPTY 0x00000020 /* [I] Write Port Empty */
120#define RIO_WRITE_PORT_BUSY 0x00000010 /* [I] Write Port Busy */
121#define RIO_WRITE_PORT_FAILED 0x00000008 /* [I] Write Port Failed */
122#define RIO_WRITE_PORT_ERROR 0x00000004 /* [I] Write Port Error */
123
124 /* 0x48 *//* Reserved */
125
126#define RIO_PELL_CTRL_CSR 0x4c /* [I] PE Logical Layer Control CSR */
127#define RIO_PELL_ADDR_66 0x00000004 /* [I] 66-bit addr */
128#define RIO_PELL_ADDR_50 0x00000002 /* [I] 50-bit addr */
129#define RIO_PELL_ADDR_34 0x00000001 /* [I] 34-bit addr */
130
131 /* 0x50-0x54 *//* Reserved */
132
133#define RIO_LCSH_BA 0x58 /* [I] LCS High Base Address */
134#define RIO_LCSL_BA 0x5c /* [I] LCS Base Address */
135
136#define RIO_DID_CSR 0x60 /* [III] Base Device ID CSR */
137
138 /* 0x64 *//* Reserved */
139
140#define RIO_HOST_DID_LOCK_CSR 0x68 /* [III] Host Base Device ID Lock CSR */
141#define RIO_COMPONENT_TAG_CSR 0x6c /* [III] Component Tag CSR */
142
143 /* 0x70-0xf8 *//* Reserved */
144 /* 0x100-0xfff8 *//* [I] Extended Features Space */
145 /* 0x10000-0xfffff8 *//* [I] Implementation-defined Space */
146
147/*
148 * Extended Features Space is a configuration space area where
149 * functionality is mapped into extended feature blocks via a
150 * singly linked list of extended feature pointers (EFT_PTR).
151 *
152 * Each extended feature block can be identified/located in
153 * Extended Features Space by walking the extended feature
154 * list starting with the Extended Feature Pointer located
155 * in the Assembly Information CAR.
156 *
157 * Extended Feature Blocks (EFBs) are identified with an assigned
158 * EFB ID. Extended feature block offsets in the definitions are
159 * relative to the offset of the EFB within the Extended Features
160 * Space.
161 */
162
163/* Helper macros to parse the Extended Feature Block header */
164#define RIO_EFB_PTR_MASK 0xffff0000
165#define RIO_EFB_ID_MASK 0x0000ffff
166#define RIO_GET_BLOCK_PTR(x) ((x & RIO_EFB_PTR_MASK) >> 16)
167#define RIO_GET_BLOCK_ID(x) (x & RIO_EFB_ID_MASK)
168
169/* Extended Feature Block IDs */
170#define RIO_EFB_PAR_EP_ID 0x0001 /* [IV] LP/LVDS EP Devices */
171#define RIO_EFB_PAR_EP_REC_ID 0x0002 /* [IV] LP/LVDS EP Recovery Devices */
172#define RIO_EFB_PAR_EP_FREE_ID 0x0003 /* [IV] LP/LVDS EP Free Devices */
173#define RIO_EFB_SER_EP_ID 0x0004 /* [VI] LP/Serial EP Devices */
174#define RIO_EFB_SER_EP_REC_ID 0x0005 /* [VI] LP/Serial EP Recovery Devices */
175#define RIO_EFB_SER_EP_FREE_ID 0x0006 /* [VI] LP/Serial EP Free Devices */
176
177/*
178 * Physical 8/16 LP-LVDS
179 * ID=0x0001, Generic End Point Devices
180 * ID=0x0002, Generic End Point Devices, software assisted recovery option
181 * ID=0x0003, Generic End Point Free Devices
182 *
183 * Physical LP-Serial
184 * ID=0x0004, Generic End Point Devices
185 * ID=0x0005, Generic End Point Devices, software assisted recovery option
186 * ID=0x0006, Generic End Point Free Devices
187 */
188#define RIO_PORT_MNT_HEADER 0x0000
189#define RIO_PORT_REQ_CTL_CSR 0x0020
190#define RIO_PORT_RSP_CTL_CSR 0x0024 /* 0x0001/0x0002 */
191#define RIO_PORT_GEN_CTL_CSR 0x003c
192#define RIO_PORT_GEN_HOST 0x80000000
193#define RIO_PORT_GEN_MASTER 0x40000000
194#define RIO_PORT_GEN_DISCOVERED 0x20000000
195#define RIO_PORT_N_MNT_REQ_CSR(x) (0x0040 + x*0x20) /* 0x0002 */
196#define RIO_PORT_N_MNT_RSP_CSR(x) (0x0044 + x*0x20) /* 0x0002 */
197#define RIO_PORT_N_ACK_STS_CSR(x) (0x0048 + x*0x20) /* 0x0002 */
198#define RIO_PORT_N_ERR_STS_CSR(x) (0x58 + x*0x20)
199#define PORT_N_ERR_STS_PORT_OK 0x00000002
200#define RIO_PORT_N_CTL_CSR(x) (0x5c + x*0x20)
201
202#endif /* LINUX_RIO_REGS_H */