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