xref: /linux/drivers/staging/vme_user/vme_bridge.h (revision 8dd765a5d769c521d73931850d1c8708fbc490cb)
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 *, unsigned long long *,
132 			 unsigned long long *, dma_addr_t *, u32 *, u32 *);
133 	int (*slave_set)(struct vme_slave_resource *, int, unsigned long long,
134 			 unsigned long long, dma_addr_t, u32, u32);
135 
136 	/* Master Functions */
137 	int (*master_get)(struct vme_master_resource *, int *, unsigned long long *,
138 			  unsigned long long *, u32 *, u32 *, u32 *);
139 	int (*master_set)(struct vme_master_resource *, int, unsigned long long,
140 			  unsigned long long,  u32, u32, u32);
141 	ssize_t (*master_read)(struct vme_master_resource *, void *, size_t, loff_t);
142 	ssize_t (*master_write)(struct vme_master_resource *, void *, size_t, loff_t);
143 	unsigned int (*master_rmw)(struct vme_master_resource *, unsigned int,
144 				   unsigned int, unsigned int, loff_t);
145 
146 	/* DMA Functions */
147 	int (*dma_list_add)(struct vme_dma_list *, struct vme_dma_attr *,
148 			    struct vme_dma_attr *, size_t);
149 	int (*dma_list_exec)(struct vme_dma_list *);
150 	int (*dma_list_empty)(struct vme_dma_list *);
151 
152 	/* Interrupt Functions */
153 	void (*irq_set)(struct vme_bridge *, int, int, int);
154 	int (*irq_generate)(struct vme_bridge *, int, int);
155 
156 	/* Location monitor functions */
157 	int (*lm_set)(struct vme_lm_resource *, unsigned long long, u32, u32);
158 	int (*lm_get)(struct vme_lm_resource *, unsigned long long *, u32 *, u32 *);
159 	int (*lm_attach)(struct vme_lm_resource *, int, void (*callback)(void *), void *);
160 	int (*lm_detach)(struct vme_lm_resource *, int);
161 
162 	/* CR/CSR space functions */
163 	int (*slot_get)(struct vme_bridge *);
164 
165 	/* Bridge parent interface */
166 	void *(*alloc_consistent)(struct device *dev, size_t size, dma_addr_t *dma);
167 	void (*free_consistent)(struct device *dev, size_t size, void *vaddr, dma_addr_t dma);
168 };
169 
170 void vme_bus_error_handler(struct vme_bridge *bridge, unsigned long long address, int am);
171 void vme_irq_handler(struct vme_bridge *, int, int);
172 
173 struct vme_bridge *vme_init_bridge(struct vme_bridge *);
174 int vme_register_bridge(struct vme_bridge *);
175 void vme_unregister_bridge(struct vme_bridge *);
176 struct vme_error_handler *vme_register_error_handler(struct vme_bridge *bridge, u32 aspace,
177 						     unsigned long long address, size_t len);
178 void vme_unregister_error_handler(struct vme_error_handler *handler);
179 
180 #endif /* _VME_BRIDGE_H_ */
181