Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
rio_drv.h
Go to the documentation of this file.
1 /*
2  * RapidIO driver services
3  *
4  * Copyright 2005 MontaVista Software, Inc.
5  * Matt Porter <[email protected]>
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 #include <linux/types.h>
17 #include <linux/ioport.h>
18 #include <linux/list.h>
19 #include <linux/errno.h>
20 #include <linux/string.h>
21 #include <linux/rio.h>
22 
24  u32 * data);
26  u32 data);
28  u16 * data);
30  u16 data);
32  u8 * data);
34  u8 data);
35 
36 extern int rio_mport_read_config_32(struct rio_mport *port, u16 destid,
37  u8 hopcount, u32 offset, u32 * data);
38 extern int rio_mport_write_config_32(struct rio_mport *port, u16 destid,
39  u8 hopcount, u32 offset, u32 data);
40 extern int rio_mport_read_config_16(struct rio_mport *port, u16 destid,
41  u8 hopcount, u32 offset, u16 * data);
42 extern int rio_mport_write_config_16(struct rio_mport *port, u16 destid,
43  u8 hopcount, u32 offset, u16 data);
44 extern int rio_mport_read_config_8(struct rio_mport *port, u16 destid,
45  u8 hopcount, u32 offset, u8 * data);
46 extern int rio_mport_write_config_8(struct rio_mport *port, u16 destid,
47  u8 hopcount, u32 offset, u8 data);
48 
58 static inline int rio_local_read_config_32(struct rio_mport *port, u32 offset,
59  u32 * data)
60 {
61  return __rio_local_read_config_32(port, offset, data);
62 }
63 
73 static inline int rio_local_write_config_32(struct rio_mport *port, u32 offset,
74  u32 data)
75 {
76  return __rio_local_write_config_32(port, offset, data);
77 }
78 
88 static inline int rio_local_read_config_16(struct rio_mport *port, u32 offset,
89  u16 * data)
90 {
91  return __rio_local_read_config_16(port, offset, data);
92 }
93 
104 static inline int rio_local_write_config_16(struct rio_mport *port, u32 offset,
105  u16 data)
106 {
107  return __rio_local_write_config_16(port, offset, data);
108 }
109 
119 static inline int rio_local_read_config_8(struct rio_mport *port, u32 offset,
120  u8 * data)
121 {
122  return __rio_local_read_config_8(port, offset, data);
123 }
124 
134 static inline int rio_local_write_config_8(struct rio_mport *port, u32 offset,
135  u8 data)
136 {
137  return __rio_local_write_config_8(port, offset, data);
138 }
139 
149 static inline int rio_read_config_32(struct rio_dev *rdev, u32 offset,
150  u32 * data)
151 {
152  return rio_mport_read_config_32(rdev->net->hport, rdev->destid,
153  rdev->hopcount, offset, data);
154 };
155 
165 static inline int rio_write_config_32(struct rio_dev *rdev, u32 offset,
166  u32 data)
167 {
168  return rio_mport_write_config_32(rdev->net->hport, rdev->destid,
169  rdev->hopcount, offset, data);
170 };
171 
181 static inline int rio_read_config_16(struct rio_dev *rdev, u32 offset,
182  u16 * data)
183 {
184  return rio_mport_read_config_16(rdev->net->hport, rdev->destid,
185  rdev->hopcount, offset, data);
186 };
187 
197 static inline int rio_write_config_16(struct rio_dev *rdev, u32 offset,
198  u16 data)
199 {
200  return rio_mport_write_config_16(rdev->net->hport, rdev->destid,
201  rdev->hopcount, offset, data);
202 };
203 
213 static inline int rio_read_config_8(struct rio_dev *rdev, u32 offset, u8 * data)
214 {
215  return rio_mport_read_config_8(rdev->net->hport, rdev->destid,
216  rdev->hopcount, offset, data);
217 };
218 
228 static inline int rio_write_config_8(struct rio_dev *rdev, u32 offset, u8 data)
229 {
230  return rio_mport_write_config_8(rdev->net->hport, rdev->destid,
231  rdev->hopcount, offset, data);
232 };
233 
234 extern int rio_mport_send_doorbell(struct rio_mport *mport, u16 destid,
235  u16 data);
236 
245 static inline int rio_send_doorbell(struct rio_dev *rdev, u16 data)
246 {
247  return rio_mport_send_doorbell(rdev->net->hport, rdev->destid, data);
248 };
249 
260 static inline void rio_init_mbox_res(struct resource *res, int start, int end)
261 {
262  memset(res, 0, sizeof(struct resource));
263  res->start = start;
264  res->end = end;
266 }
267 
278 static inline void rio_init_dbell_res(struct resource *res, u16 start, u16 end)
279 {
280  memset(res, 0, sizeof(struct resource));
281  res->start = start;
282  res->end = end;
284 }
285 
295 #define RIO_DEVICE(dev,ven) \
296  .did = (dev), .vid = (ven), \
297  .asm_did = RIO_ANY_ID, .asm_vid = RIO_ANY_ID
298 
299 /* Mailbox management */
300 extern int rio_request_outb_mbox(struct rio_mport *, void *, int, int,
301  void (*)(struct rio_mport *, void *,int, int));
302 extern int rio_release_outb_mbox(struct rio_mport *, int);
303 
315 static inline int rio_add_outb_message(struct rio_mport *mport,
316  struct rio_dev *rdev, int mbox,
317  void *buffer, size_t len)
318 {
319  return mport->ops->add_outb_message(mport, rdev, mbox,
320  buffer, len);
321 }
322 
323 extern int rio_request_inb_mbox(struct rio_mport *, void *, int, int,
324  void (*)(struct rio_mport *, void *, int, int));
325 extern int rio_release_inb_mbox(struct rio_mport *, int);
326 
336 static inline int rio_add_inb_buffer(struct rio_mport *mport, int mbox,
337  void *buffer)
338 {
339  return mport->ops->add_inb_buffer(mport, mbox, buffer);
340 }
341 
349 static inline void *rio_get_inb_message(struct rio_mport *mport, int mbox)
350 {
351  return mport->ops->get_inb_message(mport, mbox);
352 }
353 
354 /* Doorbell management */
355 extern int rio_request_inb_dbell(struct rio_mport *, void *, u16, u16,
356  void (*)(struct rio_mport *, void *, u16, u16, u16));
357 extern int rio_release_inb_dbell(struct rio_mport *, u16, u16);
358 extern struct resource *rio_request_outb_dbell(struct rio_dev *, u16, u16);
359 extern int rio_release_outb_dbell(struct rio_dev *, struct resource *);
360 
361 /* Memory region management */
362 int rio_claim_resource(struct rio_dev *, int);
363 int rio_request_regions(struct rio_dev *, char *);
364 void rio_release_regions(struct rio_dev *);
365 int rio_request_region(struct rio_dev *, int, char *);
366 void rio_release_region(struct rio_dev *, int);
367 
368 /* Memory mapping functions */
369 extern int rio_map_inb_region(struct rio_mport *mport, dma_addr_t local,
370  u64 rbase, u32 size, u32 rflags);
371 extern void rio_unmap_inb_region(struct rio_mport *mport, dma_addr_t lstart);
372 
373 /* Port-Write management */
374 extern int rio_request_inb_pwrite(struct rio_dev *,
375  int (*)(struct rio_dev *, union rio_pw_msg*, int));
376 extern int rio_release_inb_pwrite(struct rio_dev *);
377 extern int rio_inb_pwrite_handler(union rio_pw_msg *pw_msg);
378 
379 /* LDM support */
380 int rio_register_driver(struct rio_driver *);
381 void rio_unregister_driver(struct rio_driver *);
382 struct rio_dev *rio_dev_get(struct rio_dev *);
383 void rio_dev_put(struct rio_dev *);
384 
385 #ifdef CONFIG_RAPIDIO_DMA_ENGINE
386 extern struct dma_chan *rio_request_dma(struct rio_dev *rdev);
387 extern void rio_release_dma(struct dma_chan *dchan);
388 extern struct dma_async_tx_descriptor *rio_dma_prep_slave_sg(
389  struct rio_dev *rdev, struct dma_chan *dchan,
390  struct rio_dma_data *data,
391  enum dma_transfer_direction direction, unsigned long flags);
392 #endif
393 
401 static inline const char *rio_name(struct rio_dev *rdev)
402 {
403  return dev_name(&rdev->dev);
404 }
405 
413 static inline void *rio_get_drvdata(struct rio_dev *rdev)
414 {
415  return dev_get_drvdata(&rdev->dev);
416 }
417 
426 static inline void rio_set_drvdata(struct rio_dev *rdev, void *data)
427 {
428  dev_set_drvdata(&rdev->dev, data);
429 }
430 
431 /* Misc driver helpers */
432 extern u16 rio_local_get_device_id(struct rio_mport *port);
433 extern struct rio_dev *rio_get_device(u16 vid, u16 did, struct rio_dev *from);
434 extern struct rio_dev *rio_get_asm(u16 vid, u16 did, u16 asm_vid, u16 asm_did,
435  struct rio_dev *from);
436 
437 #endif /* LINUX_RIO_DRV_H */