1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _VME_BRIDGE_H_ 3*4882a593Smuzhiyun #define _VME_BRIDGE_H_ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/vme.h> 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #define VME_CRCSR_BUF_SIZE (508*1024) 8*4882a593Smuzhiyun /* 9*4882a593Smuzhiyun * Resource structures 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun struct vme_master_resource { 12*4882a593Smuzhiyun struct list_head list; 13*4882a593Smuzhiyun struct vme_bridge *parent; 14*4882a593Smuzhiyun /* 15*4882a593Smuzhiyun * We are likely to need to access the VME bus in interrupt context, so 16*4882a593Smuzhiyun * protect master routines with a spinlock rather than a mutex. 17*4882a593Smuzhiyun */ 18*4882a593Smuzhiyun spinlock_t lock; 19*4882a593Smuzhiyun int locked; 20*4882a593Smuzhiyun int number; 21*4882a593Smuzhiyun u32 address_attr; 22*4882a593Smuzhiyun u32 cycle_attr; 23*4882a593Smuzhiyun u32 width_attr; 24*4882a593Smuzhiyun struct resource bus_resource; 25*4882a593Smuzhiyun void __iomem *kern_base; 26*4882a593Smuzhiyun }; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun struct vme_slave_resource { 29*4882a593Smuzhiyun struct list_head list; 30*4882a593Smuzhiyun struct vme_bridge *parent; 31*4882a593Smuzhiyun struct mutex mtx; 32*4882a593Smuzhiyun int locked; 33*4882a593Smuzhiyun int number; 34*4882a593Smuzhiyun u32 address_attr; 35*4882a593Smuzhiyun u32 cycle_attr; 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun struct vme_dma_pattern { 39*4882a593Smuzhiyun u32 pattern; 40*4882a593Smuzhiyun u32 type; 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun struct vme_dma_pci { 44*4882a593Smuzhiyun dma_addr_t address; 45*4882a593Smuzhiyun }; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun struct vme_dma_vme { 48*4882a593Smuzhiyun unsigned long long address; 49*4882a593Smuzhiyun u32 aspace; 50*4882a593Smuzhiyun u32 cycle; 51*4882a593Smuzhiyun u32 dwidth; 52*4882a593Smuzhiyun }; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun struct vme_dma_list { 55*4882a593Smuzhiyun struct list_head list; 56*4882a593Smuzhiyun struct vme_dma_resource *parent; 57*4882a593Smuzhiyun struct list_head entries; 58*4882a593Smuzhiyun struct mutex mtx; 59*4882a593Smuzhiyun }; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun struct vme_dma_resource { 62*4882a593Smuzhiyun struct list_head list; 63*4882a593Smuzhiyun struct vme_bridge *parent; 64*4882a593Smuzhiyun struct mutex mtx; 65*4882a593Smuzhiyun int locked; 66*4882a593Smuzhiyun int number; 67*4882a593Smuzhiyun struct list_head pending; 68*4882a593Smuzhiyun struct list_head running; 69*4882a593Smuzhiyun u32 route_attr; 70*4882a593Smuzhiyun }; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun struct vme_lm_resource { 73*4882a593Smuzhiyun struct list_head list; 74*4882a593Smuzhiyun struct vme_bridge *parent; 75*4882a593Smuzhiyun struct mutex mtx; 76*4882a593Smuzhiyun int locked; 77*4882a593Smuzhiyun int number; 78*4882a593Smuzhiyun int monitors; 79*4882a593Smuzhiyun }; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun struct vme_error_handler { 82*4882a593Smuzhiyun struct list_head list; 83*4882a593Smuzhiyun unsigned long long start; /* Beginning of error window */ 84*4882a593Smuzhiyun unsigned long long end; /* End of error window */ 85*4882a593Smuzhiyun unsigned long long first_error; /* Address of the first error */ 86*4882a593Smuzhiyun u32 aspace; /* Address space of error window*/ 87*4882a593Smuzhiyun unsigned num_errors; /* Number of errors */ 88*4882a593Smuzhiyun }; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun struct vme_callback { 91*4882a593Smuzhiyun void (*func)(int, int, void*); 92*4882a593Smuzhiyun void *priv_data; 93*4882a593Smuzhiyun }; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun struct vme_irq { 96*4882a593Smuzhiyun int count; 97*4882a593Smuzhiyun struct vme_callback callback[VME_NUM_STATUSID]; 98*4882a593Smuzhiyun }; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /* Allow 16 characters for name (including null character) */ 101*4882a593Smuzhiyun #define VMENAMSIZ 16 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun /* This structure stores all the information about one bridge 104*4882a593Smuzhiyun * The structure should be dynamically allocated by the driver and one instance 105*4882a593Smuzhiyun * of the structure should be present for each VME chip present in the system. 106*4882a593Smuzhiyun */ 107*4882a593Smuzhiyun struct vme_bridge { 108*4882a593Smuzhiyun char name[VMENAMSIZ]; 109*4882a593Smuzhiyun int num; 110*4882a593Smuzhiyun struct list_head master_resources; 111*4882a593Smuzhiyun struct list_head slave_resources; 112*4882a593Smuzhiyun struct list_head dma_resources; 113*4882a593Smuzhiyun struct list_head lm_resources; 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun /* List for registered errors handlers */ 116*4882a593Smuzhiyun struct list_head vme_error_handlers; 117*4882a593Smuzhiyun /* List of devices on this bridge */ 118*4882a593Smuzhiyun struct list_head devices; 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun /* Bridge Info - XXX Move to private structure? */ 121*4882a593Smuzhiyun struct device *parent; /* Parent device (eg. pdev->dev for PCI) */ 122*4882a593Smuzhiyun void *driver_priv; /* Private pointer for the bridge driver */ 123*4882a593Smuzhiyun struct list_head bus_list; /* list of VME buses */ 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /* Interrupt callbacks */ 126*4882a593Smuzhiyun struct vme_irq irq[7]; 127*4882a593Smuzhiyun /* Locking for VME irq callback configuration */ 128*4882a593Smuzhiyun struct mutex irq_mtx; 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun /* Slave Functions */ 131*4882a593Smuzhiyun int (*slave_get) (struct vme_slave_resource *, int *, 132*4882a593Smuzhiyun unsigned long long *, unsigned long long *, dma_addr_t *, 133*4882a593Smuzhiyun u32 *, u32 *); 134*4882a593Smuzhiyun int (*slave_set) (struct vme_slave_resource *, int, unsigned long long, 135*4882a593Smuzhiyun unsigned long long, dma_addr_t, u32, u32); 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun /* Master Functions */ 138*4882a593Smuzhiyun int (*master_get) (struct vme_master_resource *, int *, 139*4882a593Smuzhiyun unsigned long long *, unsigned long long *, u32 *, u32 *, 140*4882a593Smuzhiyun u32 *); 141*4882a593Smuzhiyun int (*master_set) (struct vme_master_resource *, int, 142*4882a593Smuzhiyun unsigned long long, unsigned long long, u32, u32, u32); 143*4882a593Smuzhiyun ssize_t (*master_read) (struct vme_master_resource *, void *, size_t, 144*4882a593Smuzhiyun loff_t); 145*4882a593Smuzhiyun ssize_t (*master_write) (struct vme_master_resource *, void *, size_t, 146*4882a593Smuzhiyun loff_t); 147*4882a593Smuzhiyun unsigned int (*master_rmw) (struct vme_master_resource *, unsigned int, 148*4882a593Smuzhiyun unsigned int, unsigned int, loff_t); 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun /* DMA Functions */ 151*4882a593Smuzhiyun int (*dma_list_add) (struct vme_dma_list *, struct vme_dma_attr *, 152*4882a593Smuzhiyun struct vme_dma_attr *, size_t); 153*4882a593Smuzhiyun int (*dma_list_exec) (struct vme_dma_list *); 154*4882a593Smuzhiyun int (*dma_list_empty) (struct vme_dma_list *); 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /* Interrupt Functions */ 157*4882a593Smuzhiyun void (*irq_set) (struct vme_bridge *, int, int, int); 158*4882a593Smuzhiyun int (*irq_generate) (struct vme_bridge *, int, int); 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun /* Location monitor functions */ 161*4882a593Smuzhiyun int (*lm_set) (struct vme_lm_resource *, unsigned long long, u32, u32); 162*4882a593Smuzhiyun int (*lm_get) (struct vme_lm_resource *, unsigned long long *, u32 *, 163*4882a593Smuzhiyun u32 *); 164*4882a593Smuzhiyun int (*lm_attach)(struct vme_lm_resource *, int, 165*4882a593Smuzhiyun void (*callback)(void *), void *); 166*4882a593Smuzhiyun int (*lm_detach) (struct vme_lm_resource *, int); 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun /* CR/CSR space functions */ 169*4882a593Smuzhiyun int (*slot_get) (struct vme_bridge *); 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun /* Bridge parent interface */ 172*4882a593Smuzhiyun void *(*alloc_consistent)(struct device *dev, size_t size, 173*4882a593Smuzhiyun dma_addr_t *dma); 174*4882a593Smuzhiyun void (*free_consistent)(struct device *dev, size_t size, 175*4882a593Smuzhiyun void *vaddr, dma_addr_t dma); 176*4882a593Smuzhiyun }; 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun void vme_bus_error_handler(struct vme_bridge *bridge, 179*4882a593Smuzhiyun unsigned long long address, int am); 180*4882a593Smuzhiyun void vme_irq_handler(struct vme_bridge *, int, int); 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun struct vme_bridge *vme_init_bridge(struct vme_bridge *); 183*4882a593Smuzhiyun int vme_register_bridge(struct vme_bridge *); 184*4882a593Smuzhiyun void vme_unregister_bridge(struct vme_bridge *); 185*4882a593Smuzhiyun struct vme_error_handler *vme_register_error_handler( 186*4882a593Smuzhiyun struct vme_bridge *bridge, u32 aspace, 187*4882a593Smuzhiyun unsigned long long address, size_t len); 188*4882a593Smuzhiyun void vme_unregister_error_handler(struct vme_error_handler *handler); 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun #endif /* _VME_BRIDGE_H_ */ 191