1#ifndef _VME_BRIDGE_H_ 2#define _VME_BRIDGE_H_ 3 4#define VME_CRCSR_BUF_SIZE (508*1024) 5#define VME_SLOTS_MAX 32 6/* 7 * Resource structures 8 */ 9struct vme_master_resource { 10 struct list_head list; 11 struct vme_bridge *parent; 12 /* 13 * We are likely to need to access the VME bus in interrupt context, so 14 * protect master routines with a spinlock rather than a mutex. 15 */ 16 spinlock_t lock; 17 int locked; 18 int number; 19 vme_address_t address_attr; 20 vme_cycle_t cycle_attr; 21 vme_width_t width_attr; 22 struct resource bus_resource; 23 void *kern_base; 24}; 25 26struct vme_slave_resource { 27 struct list_head list; 28 struct vme_bridge *parent; 29 struct mutex mtx; 30 int locked; 31 int number; 32 vme_address_t address_attr; 33 vme_cycle_t cycle_attr; 34}; 35 36struct vme_dma_pattern { 37 u32 pattern; 38 vme_pattern_t type; 39}; 40 41struct vme_dma_pci { 42 dma_addr_t address; 43}; 44 45struct vme_dma_vme { 46 unsigned long long address; 47 vme_address_t aspace; 48 vme_cycle_t cycle; 49 vme_width_t dwidth; 50}; 51 52struct vme_dma_list { 53 struct list_head list; 54 struct vme_dma_resource *parent; 55 struct list_head entries; 56 struct mutex mtx; 57}; 58 59struct vme_dma_resource { 60 struct list_head list; 61 struct vme_bridge *parent; 62 struct mutex mtx; 63 int locked; 64 int number; 65 struct list_head pending; 66 struct list_head running; 67 vme_dma_route_t route_attr; 68}; 69 70struct vme_lm_resource { 71 struct list_head list; 72 struct vme_bridge *parent; 73 struct mutex mtx; 74 int locked; 75 int number; 76 int monitors; 77}; 78 79struct vme_bus_error { 80 struct list_head list; 81 unsigned long long address; 82 u32 attributes; 83}; 84 85struct vme_callback { 86 void (*func)(int, int, void*); 87 void *priv_data; 88}; 89 90struct vme_irq { 91 int count; 92 struct vme_callback callback[255]; 93}; 94 95/* Allow 16 characters for name (including null character) */ 96#define VMENAMSIZ 16 97 98/* This structure stores all the information about one bridge 99 * The structure should be dynamically allocated by the driver and one instance 100 * of the structure should be present for each VME chip present in the system. 101 * 102 * Currently we assume that all chips are PCI-based 103 */ 104struct vme_bridge { 105 char name[VMENAMSIZ]; 106 int num; 107 struct list_head master_resources; 108 struct list_head slave_resources; 109 struct list_head dma_resources; 110 struct list_head lm_resources; 111 112 struct list_head vme_errors; /* List for errors generated on VME */ 113 114 struct device *parent; /* Generic device struct (pdev->dev for PCI) */ 115 void *driver_priv; /* Private pointer for the bridge driver */ 116 117 struct device dev[VME_SLOTS_MAX]; /* Device registered with 118 * device model on VME bus 119 */ 120 121 /* Interrupt callbacks */ 122 struct vme_irq irq[7]; 123 /* Locking for VME irq callback configuration */ 124 struct mutex irq_mtx; 125 126 /* Slave Functions */ 127 int (*slave_get) (struct vme_slave_resource *, int *, 128 unsigned long long *, unsigned long long *, dma_addr_t *, 129 vme_address_t *, vme_cycle_t *); 130 int (*slave_set) (struct vme_slave_resource *, int, unsigned long long, 131 unsigned long long, dma_addr_t, vme_address_t, vme_cycle_t); 132 133 /* Master Functions */ 134 int (*master_get) (struct vme_master_resource *, int *, 135 unsigned long long *, unsigned long long *, vme_address_t *, 136 vme_cycle_t *, vme_width_t *); 137 int (*master_set) (struct vme_master_resource *, int, 138 unsigned long long, unsigned long long, vme_address_t, 139 vme_cycle_t, vme_width_t); 140 ssize_t (*master_read) (struct vme_master_resource *, void *, size_t, 141 loff_t); 142 ssize_t (*master_write) (struct vme_master_resource *, void *, size_t, 143 loff_t); 144 unsigned int (*master_rmw) (struct vme_master_resource *, unsigned int, 145 unsigned int, unsigned int, loff_t); 146 147 /* DMA Functions */ 148 int (*dma_list_add) (struct vme_dma_list *, struct vme_dma_attr *, 149 struct vme_dma_attr *, size_t); 150 int (*dma_list_exec) (struct vme_dma_list *); 151 int (*dma_list_empty) (struct vme_dma_list *); 152 153 /* Interrupt Functions */ 154 void (*irq_set) (struct vme_bridge *, int, int, int); 155 int (*irq_generate) (struct vme_bridge *, int, int); 156 157 /* Location monitor functions */ 158 int (*lm_set) (struct vme_lm_resource *, unsigned long long, 159 vme_address_t, vme_cycle_t); 160 int (*lm_get) (struct vme_lm_resource *, unsigned long long *, 161 vme_address_t *, vme_cycle_t *); 162 int (*lm_attach) (struct vme_lm_resource *, int, void (*callback)(int)); 163 int (*lm_detach) (struct vme_lm_resource *, int); 164 165 /* CR/CSR space functions */ 166 int (*slot_get) (struct vme_bridge *); 167}; 168 169void vme_irq_handler(struct vme_bridge *, int, int); 170 171int vme_register_bridge(struct vme_bridge *); 172void vme_unregister_bridge(struct vme_bridge *); 173 174#endif /* _VME_BRIDGE_H_ */ 175