1
2
3
4
5
6
7
8
9
10#ifndef __LINUX_FMC_H__
11#define __LINUX_FMC_H__
12#include <linux/types.h>
13#include <linux/moduleparam.h>
14#include <linux/device.h>
15#include <linux/list.h>
16#include <linux/interrupt.h>
17#include <linux/io.h>
18
19struct fmc_device;
20struct fmc_driver;
21
22
23
24
25
26
27#define FMC_MAJOR 3
28#define FMC_MINOR 0
29#define FMC_VERSION ((FMC_MAJOR << 16) | FMC_MINOR)
30#define __FMC_MAJOR(x) ((x) >> 16)
31#define __FMC_MINOR(x) ((x) & 0xffff)
32
33
34
35
36
37
38
39
40
41
42
43struct fmc_fru_id {
44 char *manufacturer;
45 char *product_name;
46};
47
48
49
50
51
52
53
54
55struct fmc_sdb_one_id {
56 uint64_t vendor;
57 uint32_t device;
58};
59struct fmc_sdb_id {
60 struct fmc_sdb_one_id *cores;
61 int cores_nr;
62};
63
64struct fmc_device_id {
65 struct fmc_fru_id *fru_id;
66 int fru_id_nr;
67 struct fmc_sdb_id *sdb_id;
68 int sdb_id_nr;
69};
70
71
72#define FMC_MAX_CARDS 32
73
74
75struct fmc_driver {
76 unsigned long version;
77 struct device_driver driver;
78 int (*probe)(struct fmc_device *);
79 int (*remove)(struct fmc_device *);
80 const struct fmc_device_id id_table;
81
82 int busid_n;
83 int busid_val[FMC_MAX_CARDS];
84 int gw_n;
85 char *gw_val[FMC_MAX_CARDS];
86};
87#define to_fmc_driver(x) container_of((x), struct fmc_driver, driver)
88
89
90#define FMC_PARAM_BUSID(_d) \
91 module_param_array_named(busid, _d.busid_val, int, &_d.busid_n, 0444)
92#define FMC_PARAM_GATEWARE(_d) \
93 module_param_array_named(gateware, _d.gw_val, charp, &_d.gw_n, 0444)
94
95
96
97
98
99
100struct fmc_gpio {
101 char *carrier_name;
102 int gpio;
103 int _gpio;
104 int mode;
105 int irqmode;
106};
107
108
109#define FMC_GPIO_RAW(x) (x)
110#define __FMC_GPIO_IS_RAW(x) ((x) < 0x1000)
111#define FMC_GPIO_IRQ(x) ((x) + 0x1000)
112#define FMC_GPIO_LED(x) ((x) + 0x1100)
113#define FMC_GPIO_KEY(x) ((x) + 0x1200)
114#define FMC_GPIO_TP(x) ((x) + 0x1300)
115#define FMC_GPIO_USER(x) ((x) + 0x1400)
116
117
118
119#ifndef GPIOF_DIR_IN
120# define GPIOF_DIR_OUT (0 << 0)
121# define GPIOF_DIR_IN (1 << 0)
122# define GPIOF_INIT_LOW (0 << 1)
123# define GPIOF_INIT_HIGH (1 << 1)
124#endif
125
126
127
128
129
130
131struct fmc_operations {
132 uint32_t (*read32)(struct fmc_device *fmc, int offset);
133 void (*write32)(struct fmc_device *fmc, uint32_t value, int offset);
134 int (*validate)(struct fmc_device *fmc, struct fmc_driver *drv);
135 int (*reprogram_raw)(struct fmc_device *f, struct fmc_driver *d,
136 void *gw, unsigned long len);
137 int (*reprogram)(struct fmc_device *f, struct fmc_driver *d, char *gw);
138 int (*irq_request)(struct fmc_device *fmc, irq_handler_t h,
139 char *name, int flags);
140 void (*irq_ack)(struct fmc_device *fmc);
141 int (*irq_free)(struct fmc_device *fmc);
142 int (*gpio_config)(struct fmc_device *fmc, struct fmc_gpio *gpio,
143 int ngpio);
144 int (*read_ee)(struct fmc_device *fmc, int pos, void *d, int l);
145 int (*write_ee)(struct fmc_device *fmc, int pos, const void *d, int l);
146};
147
148
149int fmc_reprogram_raw(struct fmc_device *fmc, struct fmc_driver *d,
150 void *gw, unsigned long len, int sdb_entry);
151extern int fmc_reprogram(struct fmc_device *f, struct fmc_driver *d, char *gw,
152 int sdb_entry);
153
154
155
156
157
158
159
160
161
162struct fmc_device {
163 unsigned long version;
164 unsigned long flags;
165 struct module *owner;
166 struct fmc_fru_id id;
167 struct fmc_operations *op;
168 int irq;
169 int eeprom_len;
170 int eeprom_addr;
171 uint8_t *eeprom;
172 char *carrier_name;
173 void *carrier_data;
174 __iomem void *fpga_base;
175 __iomem void *slot_base;
176 struct fmc_device **devarray;
177 int slot_id;
178 int nr_slots;
179 unsigned long memlen;
180 struct device dev;
181 struct device *hwdev;
182 unsigned long sdbfs_entry;
183 struct sdb_array *sdb;
184 uint32_t device_id;
185 char *mezzanine_name;
186 void *mezzanine_data;
187
188 struct dentry *dbg_dir;
189 struct dentry *dbg_sdb_dump;
190};
191#define to_fmc_device(x) container_of((x), struct fmc_device, dev)
192
193#define FMC_DEVICE_HAS_GOLDEN 1
194#define FMC_DEVICE_HAS_CUSTOM 2
195#define FMC_DEVICE_NO_MEZZANINE 4
196#define FMC_DEVICE_MATCH_SDB 8
197
198
199
200
201
202static inline uint32_t fmc_readl(struct fmc_device *fmc, int offset)
203{
204 if (unlikely(fmc->op->read32))
205 return fmc->op->read32(fmc, offset);
206 return readl(fmc->fpga_base + offset);
207}
208static inline void fmc_writel(struct fmc_device *fmc, uint32_t val, int off)
209{
210 if (unlikely(fmc->op->write32))
211 fmc->op->write32(fmc, val, off);
212 else
213 writel(val, fmc->fpga_base + off);
214}
215
216
217static inline void *fmc_get_drvdata(const struct fmc_device *fmc)
218{
219 return dev_get_drvdata(&fmc->dev);
220}
221
222static inline void fmc_set_drvdata(struct fmc_device *fmc, void *data)
223{
224 dev_set_drvdata(&fmc->dev, data);
225}
226
227struct fmc_gateware {
228 void *bitstream;
229 unsigned long len;
230};
231
232
233extern int fmc_driver_register(struct fmc_driver *drv);
234extern void fmc_driver_unregister(struct fmc_driver *drv);
235extern int fmc_device_register(struct fmc_device *tdev);
236extern int fmc_device_register_gw(struct fmc_device *tdev,
237 struct fmc_gateware *gw);
238extern void fmc_device_unregister(struct fmc_device *tdev);
239
240
241extern int fmc_device_register_n(struct fmc_device **devs, int n);
242extern int fmc_device_register_n_gw(struct fmc_device **devs, int n,
243 struct fmc_gateware *gw);
244extern void fmc_device_unregister_n(struct fmc_device **devs, int n);
245
246
247extern int fmc_match(struct device *dev, struct device_driver *drv);
248extern int fmc_fill_id_info(struct fmc_device *fmc);
249extern void fmc_free_id_info(struct fmc_device *fmc);
250extern void fmc_dump_eeprom(const struct fmc_device *fmc);
251
252
253extern int fmc_irq_request(struct fmc_device *fmc, irq_handler_t h,
254 char *name, int flags);
255extern void fmc_irq_free(struct fmc_device *fmc);
256extern void fmc_irq_ack(struct fmc_device *fmc);
257extern int fmc_validate(struct fmc_device *fmc, struct fmc_driver *drv);
258extern int fmc_gpio_config(struct fmc_device *fmc, struct fmc_gpio *gpio,
259 int ngpio);
260extern int fmc_read_ee(struct fmc_device *fmc, int pos, void *d, int l);
261extern int fmc_write_ee(struct fmc_device *fmc, int pos, const void *d, int l);
262
263
264extern int fmc_irq_request(struct fmc_device *fmc, irq_handler_t h,
265 char *name, int flags);
266extern void fmc_irq_free(struct fmc_device *fmc);
267extern void fmc_irq_ack(struct fmc_device *fmc);
268extern int fmc_validate(struct fmc_device *fmc, struct fmc_driver *drv);
269
270#endif
271