1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _VME_H_ 3*4882a593Smuzhiyun #define _VME_H_ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun /* Resource Type */ 6*4882a593Smuzhiyun enum vme_resource_type { 7*4882a593Smuzhiyun VME_MASTER, 8*4882a593Smuzhiyun VME_SLAVE, 9*4882a593Smuzhiyun VME_DMA, 10*4882a593Smuzhiyun VME_LM 11*4882a593Smuzhiyun }; 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* VME Address Spaces */ 14*4882a593Smuzhiyun #define VME_A16 0x1 15*4882a593Smuzhiyun #define VME_A24 0x2 16*4882a593Smuzhiyun #define VME_A32 0x4 17*4882a593Smuzhiyun #define VME_A64 0x8 18*4882a593Smuzhiyun #define VME_CRCSR 0x10 19*4882a593Smuzhiyun #define VME_USER1 0x20 20*4882a593Smuzhiyun #define VME_USER2 0x40 21*4882a593Smuzhiyun #define VME_USER3 0x80 22*4882a593Smuzhiyun #define VME_USER4 0x100 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #define VME_A16_MAX 0x10000ULL 25*4882a593Smuzhiyun #define VME_A24_MAX 0x1000000ULL 26*4882a593Smuzhiyun #define VME_A32_MAX 0x100000000ULL 27*4882a593Smuzhiyun #define VME_A64_MAX 0x10000000000000000ULL 28*4882a593Smuzhiyun #define VME_CRCSR_MAX 0x1000000ULL 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /* VME Cycle Types */ 32*4882a593Smuzhiyun #define VME_SCT 0x1 33*4882a593Smuzhiyun #define VME_BLT 0x2 34*4882a593Smuzhiyun #define VME_MBLT 0x4 35*4882a593Smuzhiyun #define VME_2eVME 0x8 36*4882a593Smuzhiyun #define VME_2eSST 0x10 37*4882a593Smuzhiyun #define VME_2eSSTB 0x20 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun #define VME_2eSST160 0x100 40*4882a593Smuzhiyun #define VME_2eSST267 0x200 41*4882a593Smuzhiyun #define VME_2eSST320 0x400 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define VME_SUPER 0x1000 44*4882a593Smuzhiyun #define VME_USER 0x2000 45*4882a593Smuzhiyun #define VME_PROG 0x4000 46*4882a593Smuzhiyun #define VME_DATA 0x8000 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun /* VME Data Widths */ 49*4882a593Smuzhiyun #define VME_D8 0x1 50*4882a593Smuzhiyun #define VME_D16 0x2 51*4882a593Smuzhiyun #define VME_D32 0x4 52*4882a593Smuzhiyun #define VME_D64 0x8 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun /* Arbitration Scheduling Modes */ 55*4882a593Smuzhiyun #define VME_R_ROBIN_MODE 0x1 56*4882a593Smuzhiyun #define VME_PRIORITY_MODE 0x2 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define VME_DMA_PATTERN (1<<0) 59*4882a593Smuzhiyun #define VME_DMA_PCI (1<<1) 60*4882a593Smuzhiyun #define VME_DMA_VME (1<<2) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define VME_DMA_PATTERN_BYTE (1<<0) 63*4882a593Smuzhiyun #define VME_DMA_PATTERN_WORD (1<<1) 64*4882a593Smuzhiyun #define VME_DMA_PATTERN_INCREMENT (1<<2) 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun #define VME_DMA_VME_TO_MEM (1<<0) 67*4882a593Smuzhiyun #define VME_DMA_MEM_TO_VME (1<<1) 68*4882a593Smuzhiyun #define VME_DMA_VME_TO_VME (1<<2) 69*4882a593Smuzhiyun #define VME_DMA_MEM_TO_MEM (1<<3) 70*4882a593Smuzhiyun #define VME_DMA_PATTERN_TO_VME (1<<4) 71*4882a593Smuzhiyun #define VME_DMA_PATTERN_TO_MEM (1<<5) 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun struct vme_dma_attr { 74*4882a593Smuzhiyun u32 type; 75*4882a593Smuzhiyun void *private; 76*4882a593Smuzhiyun }; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun struct vme_resource { 79*4882a593Smuzhiyun enum vme_resource_type type; 80*4882a593Smuzhiyun struct list_head *entry; 81*4882a593Smuzhiyun }; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun extern struct bus_type vme_bus_type; 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* Number of VME interrupt vectors */ 86*4882a593Smuzhiyun #define VME_NUM_STATUSID 256 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* VME_MAX_BRIDGES comes from the type of vme_bus_numbers */ 89*4882a593Smuzhiyun #define VME_MAX_BRIDGES (sizeof(unsigned int)*8) 90*4882a593Smuzhiyun #define VME_MAX_SLOTS 32 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun #define VME_SLOT_CURRENT -1 93*4882a593Smuzhiyun #define VME_SLOT_ALL -2 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun /** 96*4882a593Smuzhiyun * struct vme_dev - Structure representing a VME device 97*4882a593Smuzhiyun * @num: The device number 98*4882a593Smuzhiyun * @bridge: Pointer to the bridge device this device is on 99*4882a593Smuzhiyun * @dev: Internal device structure 100*4882a593Smuzhiyun * @drv_list: List of devices (per driver) 101*4882a593Smuzhiyun * @bridge_list: List of devices (per bridge) 102*4882a593Smuzhiyun */ 103*4882a593Smuzhiyun struct vme_dev { 104*4882a593Smuzhiyun int num; 105*4882a593Smuzhiyun struct vme_bridge *bridge; 106*4882a593Smuzhiyun struct device dev; 107*4882a593Smuzhiyun struct list_head drv_list; 108*4882a593Smuzhiyun struct list_head bridge_list; 109*4882a593Smuzhiyun }; 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun /** 112*4882a593Smuzhiyun * struct vme_driver - Structure representing a VME driver 113*4882a593Smuzhiyun * @name: Driver name, should be unique among VME drivers and usually the same 114*4882a593Smuzhiyun * as the module name. 115*4882a593Smuzhiyun * @match: Callback used to determine whether probe should be run. 116*4882a593Smuzhiyun * @probe: Callback for device binding, called when new device is detected. 117*4882a593Smuzhiyun * @remove: Callback, called on device removal. 118*4882a593Smuzhiyun * @driver: Underlying generic device driver structure. 119*4882a593Smuzhiyun * @devices: List of VME devices (struct vme_dev) associated with this driver. 120*4882a593Smuzhiyun */ 121*4882a593Smuzhiyun struct vme_driver { 122*4882a593Smuzhiyun const char *name; 123*4882a593Smuzhiyun int (*match)(struct vme_dev *); 124*4882a593Smuzhiyun int (*probe)(struct vme_dev *); 125*4882a593Smuzhiyun int (*remove)(struct vme_dev *); 126*4882a593Smuzhiyun struct device_driver driver; 127*4882a593Smuzhiyun struct list_head devices; 128*4882a593Smuzhiyun }; 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun void *vme_alloc_consistent(struct vme_resource *, size_t, dma_addr_t *); 131*4882a593Smuzhiyun void vme_free_consistent(struct vme_resource *, size_t, void *, 132*4882a593Smuzhiyun dma_addr_t); 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun size_t vme_get_size(struct vme_resource *); 135*4882a593Smuzhiyun int vme_check_window(u32 aspace, unsigned long long vme_base, 136*4882a593Smuzhiyun unsigned long long size); 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun struct vme_resource *vme_slave_request(struct vme_dev *, u32, u32); 139*4882a593Smuzhiyun int vme_slave_set(struct vme_resource *, int, unsigned long long, 140*4882a593Smuzhiyun unsigned long long, dma_addr_t, u32, u32); 141*4882a593Smuzhiyun int vme_slave_get(struct vme_resource *, int *, unsigned long long *, 142*4882a593Smuzhiyun unsigned long long *, dma_addr_t *, u32 *, u32 *); 143*4882a593Smuzhiyun void vme_slave_free(struct vme_resource *); 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun struct vme_resource *vme_master_request(struct vme_dev *, u32, u32, u32); 146*4882a593Smuzhiyun int vme_master_set(struct vme_resource *, int, unsigned long long, 147*4882a593Smuzhiyun unsigned long long, u32, u32, u32); 148*4882a593Smuzhiyun int vme_master_get(struct vme_resource *, int *, unsigned long long *, 149*4882a593Smuzhiyun unsigned long long *, u32 *, u32 *, u32 *); 150*4882a593Smuzhiyun ssize_t vme_master_read(struct vme_resource *, void *, size_t, loff_t); 151*4882a593Smuzhiyun ssize_t vme_master_write(struct vme_resource *, void *, size_t, loff_t); 152*4882a593Smuzhiyun unsigned int vme_master_rmw(struct vme_resource *, unsigned int, unsigned int, 153*4882a593Smuzhiyun unsigned int, loff_t); 154*4882a593Smuzhiyun int vme_master_mmap(struct vme_resource *resource, struct vm_area_struct *vma); 155*4882a593Smuzhiyun void vme_master_free(struct vme_resource *); 156*4882a593Smuzhiyun 157*4882a593Smuzhiyun struct vme_resource *vme_dma_request(struct vme_dev *, u32); 158*4882a593Smuzhiyun struct vme_dma_list *vme_new_dma_list(struct vme_resource *); 159*4882a593Smuzhiyun struct vme_dma_attr *vme_dma_pattern_attribute(u32, u32); 160*4882a593Smuzhiyun struct vme_dma_attr *vme_dma_pci_attribute(dma_addr_t); 161*4882a593Smuzhiyun struct vme_dma_attr *vme_dma_vme_attribute(unsigned long long, u32, u32, u32); 162*4882a593Smuzhiyun void vme_dma_free_attribute(struct vme_dma_attr *); 163*4882a593Smuzhiyun int vme_dma_list_add(struct vme_dma_list *, struct vme_dma_attr *, 164*4882a593Smuzhiyun struct vme_dma_attr *, size_t); 165*4882a593Smuzhiyun int vme_dma_list_exec(struct vme_dma_list *); 166*4882a593Smuzhiyun int vme_dma_list_free(struct vme_dma_list *); 167*4882a593Smuzhiyun int vme_dma_free(struct vme_resource *); 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun int vme_irq_request(struct vme_dev *, int, int, 170*4882a593Smuzhiyun void (*callback)(int, int, void *), void *); 171*4882a593Smuzhiyun void vme_irq_free(struct vme_dev *, int, int); 172*4882a593Smuzhiyun int vme_irq_generate(struct vme_dev *, int, int); 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun struct vme_resource *vme_lm_request(struct vme_dev *); 175*4882a593Smuzhiyun int vme_lm_count(struct vme_resource *); 176*4882a593Smuzhiyun int vme_lm_set(struct vme_resource *, unsigned long long, u32, u32); 177*4882a593Smuzhiyun int vme_lm_get(struct vme_resource *, unsigned long long *, u32 *, u32 *); 178*4882a593Smuzhiyun int vme_lm_attach(struct vme_resource *, int, void (*callback)(void *), void *); 179*4882a593Smuzhiyun int vme_lm_detach(struct vme_resource *, int); 180*4882a593Smuzhiyun void vme_lm_free(struct vme_resource *); 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun int vme_slot_num(struct vme_dev *); 183*4882a593Smuzhiyun int vme_bus_num(struct vme_dev *); 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun int vme_register_driver(struct vme_driver *, unsigned int); 186*4882a593Smuzhiyun void vme_unregister_driver(struct vme_driver *); 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun #endif /* _VME_H_ */ 190*4882a593Smuzhiyun 191