xref: /OK3568_Linux_fs/kernel/include/linux/vme.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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