Rusty Russell | 07ad157 | 2007-07-19 01:49:22 -0700 | [diff] [blame] | 1 | #ifndef _ASM_LGUEST_DEVICE_H |
| 2 | #define _ASM_LGUEST_DEVICE_H |
| 3 | /* Everything you need to know about lguest devices. */ |
| 4 | #include <linux/device.h> |
| 5 | #include <linux/lguest.h> |
| 6 | #include <linux/lguest_launcher.h> |
| 7 | |
| 8 | struct lguest_device { |
| 9 | /* Unique busid, and index into lguest_page->devices[] */ |
| 10 | unsigned int index; |
| 11 | |
| 12 | struct device dev; |
| 13 | |
| 14 | /* Driver can hang data off here. */ |
| 15 | void *private; |
| 16 | }; |
| 17 | |
Rusty Russell | e2c9784 | 2007-07-26 10:41:03 -0700 | [diff] [blame] | 18 | /*D:380 Since interrupt numbers are arbitrary, we use a convention: each device |
| 19 | * can use the interrupt number corresponding to its index. The +1 is because |
| 20 | * interrupt 0 is not usable (it's actually the timer interrupt). */ |
Rusty Russell | 07ad157 | 2007-07-19 01:49:22 -0700 | [diff] [blame] | 21 | static inline int lgdev_irq(const struct lguest_device *dev) |
| 22 | { |
| 23 | return dev->index + 1; |
| 24 | } |
Rusty Russell | e2c9784 | 2007-07-26 10:41:03 -0700 | [diff] [blame] | 25 | /*:*/ |
Rusty Russell | 07ad157 | 2007-07-19 01:49:22 -0700 | [diff] [blame] | 26 | |
| 27 | /* dma args must not be vmalloced! */ |
| 28 | void lguest_send_dma(unsigned long key, struct lguest_dma *dma); |
| 29 | int lguest_bind_dma(unsigned long key, struct lguest_dma *dmas, |
| 30 | unsigned int num, u8 irq); |
| 31 | void lguest_unbind_dma(unsigned long key, struct lguest_dma *dmas); |
| 32 | |
| 33 | /* Map the virtual device space */ |
| 34 | void *lguest_map(unsigned long phys_addr, unsigned long pages); |
| 35 | void lguest_unmap(void *); |
| 36 | |
| 37 | struct lguest_driver { |
| 38 | const char *name; |
| 39 | struct module *owner; |
| 40 | u16 device_type; |
| 41 | int (*probe)(struct lguest_device *dev); |
| 42 | void (*remove)(struct lguest_device *dev); |
| 43 | |
| 44 | struct device_driver drv; |
| 45 | }; |
| 46 | |
| 47 | extern int register_lguest_driver(struct lguest_driver *drv); |
| 48 | extern void unregister_lguest_driver(struct lguest_driver *drv); |
| 49 | |
| 50 | extern struct lguest_device_desc *lguest_devices; /* Just past max_pfn */ |
| 51 | #endif /* _ASM_LGUEST_DEVICE_H */ |