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 *image, int *enabled,
132 			 unsigned long long *vme_base, unsigned long long *size,
133 			 dma_addr_t *buf_base, u32 *aspace, u32 *cycle);
134 	int (*slave_set)(struct vme_slave_resource *image, int enabled,
135 			 unsigned long long vme_base, unsigned long long size,
136 			 dma_addr_t buf_base, u32 aspace, u32 cycle);
137 
138 	/* Master Functions */
139 	int (*master_get)(struct vme_master_resource *image, int *enabled,
140 			  unsigned long long *vme_base, unsigned long long *size,
141 			  u32 *aspace, u32 *cycle, u32 *dwidth);
142 	int (*master_set)(struct vme_master_resource *image, int enabled,
143 			  unsigned long long vme_base, unsigned long long size,
144 			  u32 aspace, u32 cycle, u32 dwidth);
145 	ssize_t (*master_read)(struct vme_master_resource *image, void *buf,
146 			       size_t count, loff_t offset);
147 	ssize_t (*master_write)(struct vme_master_resource *image, void *buf,
148 				size_t count, loff_t offset);
149 	unsigned int (*master_rmw)(struct vme_master_resource *image,
150 				   unsigned int mask, unsigned int compare,
151 				   unsigned int swap, loff_t offset);
152 
153 	/* DMA Functions */
154 	int (*dma_list_add)(struct vme_dma_list *list, struct vme_dma_attr *src,
155 			    struct vme_dma_attr *dest, size_t count);
156 	int (*dma_list_exec)(struct vme_dma_list *list);
157 	int (*dma_list_empty)(struct vme_dma_list *list);
158 
159 	/* Interrupt Functions */
160 	void (*irq_set)(struct vme_bridge *bridge, int level, int state, int sync);
161 	int (*irq_generate)(struct vme_bridge *bridge, int level, int statid);
162 
163 	/* Location monitor functions */
164 	int (*lm_set)(struct vme_lm_resource *lm, unsigned long long lm_base,
165 		      u32 aspace, u32 cycle);
166 	int (*lm_get)(struct vme_lm_resource *lm, unsigned long long *lm_base,
167 		      u32 *aspace, u32 *cycle);
168 	int (*lm_attach)(struct vme_lm_resource *lm, int monitor,
169 			 void (*callback)(void *), void *data);
170 	int (*lm_detach)(struct vme_lm_resource *lm, int monitor);
171 
172 	/* CR/CSR space functions */
173 	int (*slot_get)(struct vme_bridge *bridge);
174 
175 	/* Bridge parent interface */
176 	void *(*alloc_consistent)(struct device *dev, size_t size, dma_addr_t *dma);
177 	void (*free_consistent)(struct device *dev, size_t size, void *vaddr, dma_addr_t dma);
178 };
179 
180 void vme_bus_error_handler(struct vme_bridge *bridge, unsigned long long address, int am);
181 void vme_irq_handler(struct vme_bridge *, int, int);
182 
183 struct vme_bridge *vme_init_bridge(struct vme_bridge *);
184 int vme_register_bridge(struct vme_bridge *);
185 void vme_unregister_bridge(struct vme_bridge *);
186 struct vme_error_handler *vme_register_error_handler(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