Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/fpga/fpga-mgr.c
26378 views
1
// SPDX-License-Identifier: GPL-2.0
2
/*
3
* FPGA Manager Core
4
*
5
* Copyright (C) 2013-2015 Altera Corporation
6
* Copyright (C) 2017 Intel Corporation
7
*
8
* With code from the mailing list:
9
* Copyright (C) 2013 Xilinx, Inc.
10
*/
11
#include <linux/firmware.h>
12
#include <linux/fpga/fpga-mgr.h>
13
#include <linux/idr.h>
14
#include <linux/module.h>
15
#include <linux/of.h>
16
#include <linux/mutex.h>
17
#include <linux/slab.h>
18
#include <linux/scatterlist.h>
19
#include <linux/highmem.h>
20
21
static DEFINE_IDA(fpga_mgr_ida);
22
static const struct class fpga_mgr_class;
23
24
struct fpga_mgr_devres {
25
struct fpga_manager *mgr;
26
};
27
28
static inline void fpga_mgr_fpga_remove(struct fpga_manager *mgr)
29
{
30
if (mgr->mops->fpga_remove)
31
mgr->mops->fpga_remove(mgr);
32
}
33
34
static inline enum fpga_mgr_states fpga_mgr_state(struct fpga_manager *mgr)
35
{
36
if (mgr->mops->state)
37
return mgr->mops->state(mgr);
38
return FPGA_MGR_STATE_UNKNOWN;
39
}
40
41
static inline u64 fpga_mgr_status(struct fpga_manager *mgr)
42
{
43
if (mgr->mops->status)
44
return mgr->mops->status(mgr);
45
return 0;
46
}
47
48
static inline int fpga_mgr_write(struct fpga_manager *mgr, const char *buf, size_t count)
49
{
50
if (mgr->mops->write)
51
return mgr->mops->write(mgr, buf, count);
52
return -EOPNOTSUPP;
53
}
54
55
/*
56
* After all the FPGA image has been written, do the device specific steps to
57
* finish and set the FPGA into operating mode.
58
*/
59
static inline int fpga_mgr_write_complete(struct fpga_manager *mgr,
60
struct fpga_image_info *info)
61
{
62
int ret = 0;
63
64
mgr->state = FPGA_MGR_STATE_WRITE_COMPLETE;
65
if (mgr->mops->write_complete)
66
ret = mgr->mops->write_complete(mgr, info);
67
if (ret) {
68
dev_err(&mgr->dev, "Error after writing image data to FPGA\n");
69
mgr->state = FPGA_MGR_STATE_WRITE_COMPLETE_ERR;
70
return ret;
71
}
72
mgr->state = FPGA_MGR_STATE_OPERATING;
73
74
return 0;
75
}
76
77
static inline int fpga_mgr_parse_header(struct fpga_manager *mgr,
78
struct fpga_image_info *info,
79
const char *buf, size_t count)
80
{
81
if (mgr->mops->parse_header)
82
return mgr->mops->parse_header(mgr, info, buf, count);
83
return 0;
84
}
85
86
static inline int fpga_mgr_write_init(struct fpga_manager *mgr,
87
struct fpga_image_info *info,
88
const char *buf, size_t count)
89
{
90
if (mgr->mops->write_init)
91
return mgr->mops->write_init(mgr, info, buf, count);
92
return 0;
93
}
94
95
static inline int fpga_mgr_write_sg(struct fpga_manager *mgr,
96
struct sg_table *sgt)
97
{
98
if (mgr->mops->write_sg)
99
return mgr->mops->write_sg(mgr, sgt);
100
return -EOPNOTSUPP;
101
}
102
103
/**
104
* fpga_image_info_alloc - Allocate an FPGA image info struct
105
* @dev: owning device
106
*
107
* Return: struct fpga_image_info or NULL
108
*/
109
struct fpga_image_info *fpga_image_info_alloc(struct device *dev)
110
{
111
struct fpga_image_info *info;
112
113
get_device(dev);
114
115
info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
116
if (!info) {
117
put_device(dev);
118
return NULL;
119
}
120
121
info->dev = dev;
122
123
return info;
124
}
125
EXPORT_SYMBOL_GPL(fpga_image_info_alloc);
126
127
/**
128
* fpga_image_info_free - Free an FPGA image info struct
129
* @info: FPGA image info struct to free
130
*/
131
void fpga_image_info_free(struct fpga_image_info *info)
132
{
133
struct device *dev;
134
135
if (!info)
136
return;
137
138
dev = info->dev;
139
if (info->firmware_name)
140
devm_kfree(dev, info->firmware_name);
141
142
devm_kfree(dev, info);
143
put_device(dev);
144
}
145
EXPORT_SYMBOL_GPL(fpga_image_info_free);
146
147
/*
148
* Call the low level driver's parse_header function with entire FPGA image
149
* buffer on the input. This will set info->header_size and info->data_size.
150
*/
151
static int fpga_mgr_parse_header_mapped(struct fpga_manager *mgr,
152
struct fpga_image_info *info,
153
const char *buf, size_t count)
154
{
155
int ret;
156
157
mgr->state = FPGA_MGR_STATE_PARSE_HEADER;
158
ret = fpga_mgr_parse_header(mgr, info, buf, count);
159
160
if (info->header_size + info->data_size > count) {
161
dev_err(&mgr->dev, "Bitstream data outruns FPGA image\n");
162
ret = -EINVAL;
163
}
164
165
if (ret) {
166
dev_err(&mgr->dev, "Error while parsing FPGA image header\n");
167
mgr->state = FPGA_MGR_STATE_PARSE_HEADER_ERR;
168
}
169
170
return ret;
171
}
172
173
/*
174
* Call the low level driver's parse_header function with first fragment of
175
* scattered FPGA image on the input. If header fits first fragment,
176
* parse_header will set info->header_size and info->data_size. If it is not,
177
* parse_header will set desired size to info->header_size and -EAGAIN will be
178
* returned.
179
*/
180
static int fpga_mgr_parse_header_sg_first(struct fpga_manager *mgr,
181
struct fpga_image_info *info,
182
struct sg_table *sgt)
183
{
184
struct sg_mapping_iter miter;
185
int ret;
186
187
mgr->state = FPGA_MGR_STATE_PARSE_HEADER;
188
189
sg_miter_start(&miter, sgt->sgl, sgt->nents, SG_MITER_FROM_SG);
190
if (sg_miter_next(&miter) &&
191
miter.length >= info->header_size)
192
ret = fpga_mgr_parse_header(mgr, info, miter.addr, miter.length);
193
else
194
ret = -EAGAIN;
195
sg_miter_stop(&miter);
196
197
if (ret && ret != -EAGAIN) {
198
dev_err(&mgr->dev, "Error while parsing FPGA image header\n");
199
mgr->state = FPGA_MGR_STATE_PARSE_HEADER_ERR;
200
}
201
202
return ret;
203
}
204
205
/*
206
* Copy scattered FPGA image fragments to temporary buffer and call the
207
* low level driver's parse_header function. This should be called after
208
* fpga_mgr_parse_header_sg_first() returned -EAGAIN. In case of success,
209
* pointer to the newly allocated image header copy will be returned and
210
* its size will be set into *ret_size. Returned buffer needs to be freed.
211
*/
212
static void *fpga_mgr_parse_header_sg(struct fpga_manager *mgr,
213
struct fpga_image_info *info,
214
struct sg_table *sgt, size_t *ret_size)
215
{
216
size_t len, new_header_size, header_size = 0;
217
char *new_buf, *buf = NULL;
218
int ret;
219
220
do {
221
new_header_size = info->header_size;
222
if (new_header_size <= header_size) {
223
dev_err(&mgr->dev, "Requested invalid header size\n");
224
ret = -EFAULT;
225
break;
226
}
227
228
new_buf = krealloc(buf, new_header_size, GFP_KERNEL);
229
if (!new_buf) {
230
ret = -ENOMEM;
231
break;
232
}
233
234
buf = new_buf;
235
236
len = sg_pcopy_to_buffer(sgt->sgl, sgt->nents,
237
buf + header_size,
238
new_header_size - header_size,
239
header_size);
240
if (len != new_header_size - header_size) {
241
ret = -EFAULT;
242
break;
243
}
244
245
header_size = new_header_size;
246
ret = fpga_mgr_parse_header(mgr, info, buf, header_size);
247
} while (ret == -EAGAIN);
248
249
if (ret) {
250
dev_err(&mgr->dev, "Error while parsing FPGA image header\n");
251
mgr->state = FPGA_MGR_STATE_PARSE_HEADER_ERR;
252
kfree(buf);
253
buf = ERR_PTR(ret);
254
}
255
256
*ret_size = header_size;
257
258
return buf;
259
}
260
261
/*
262
* Call the low level driver's write_init function. This will do the
263
* device-specific things to get the FPGA into the state where it is ready to
264
* receive an FPGA image. The low level driver gets to see at least first
265
* info->header_size bytes in the buffer. If info->header_size is 0,
266
* write_init will not get any bytes of image buffer.
267
*/
268
static int fpga_mgr_write_init_buf(struct fpga_manager *mgr,
269
struct fpga_image_info *info,
270
const char *buf, size_t count)
271
{
272
size_t header_size = info->header_size;
273
int ret;
274
275
mgr->state = FPGA_MGR_STATE_WRITE_INIT;
276
277
if (header_size > count)
278
ret = -EINVAL;
279
else if (!header_size)
280
ret = fpga_mgr_write_init(mgr, info, NULL, 0);
281
else
282
ret = fpga_mgr_write_init(mgr, info, buf, count);
283
284
if (ret) {
285
dev_err(&mgr->dev, "Error preparing FPGA for writing\n");
286
mgr->state = FPGA_MGR_STATE_WRITE_INIT_ERR;
287
return ret;
288
}
289
290
return 0;
291
}
292
293
static int fpga_mgr_prepare_sg(struct fpga_manager *mgr,
294
struct fpga_image_info *info,
295
struct sg_table *sgt)
296
{
297
struct sg_mapping_iter miter;
298
size_t len;
299
char *buf;
300
int ret;
301
302
/* Short path. Low level driver don't care about image header. */
303
if (!mgr->mops->initial_header_size && !mgr->mops->parse_header)
304
return fpga_mgr_write_init_buf(mgr, info, NULL, 0);
305
306
/*
307
* First try to use miter to map the first fragment to access the
308
* header, this is the typical path.
309
*/
310
ret = fpga_mgr_parse_header_sg_first(mgr, info, sgt);
311
/* If 0, header fits first fragment, call write_init on it */
312
if (!ret) {
313
sg_miter_start(&miter, sgt->sgl, sgt->nents, SG_MITER_FROM_SG);
314
if (sg_miter_next(&miter)) {
315
ret = fpga_mgr_write_init_buf(mgr, info, miter.addr,
316
miter.length);
317
sg_miter_stop(&miter);
318
return ret;
319
}
320
sg_miter_stop(&miter);
321
/*
322
* If -EAGAIN, more sg buffer is needed,
323
* otherwise an error has occurred.
324
*/
325
} else if (ret != -EAGAIN) {
326
return ret;
327
}
328
329
/*
330
* Copy the fragments into temporary memory.
331
* Copying is done inside fpga_mgr_parse_header_sg().
332
*/
333
buf = fpga_mgr_parse_header_sg(mgr, info, sgt, &len);
334
if (IS_ERR(buf))
335
return PTR_ERR(buf);
336
337
ret = fpga_mgr_write_init_buf(mgr, info, buf, len);
338
339
kfree(buf);
340
341
return ret;
342
}
343
344
/**
345
* fpga_mgr_buf_load_sg - load fpga from image in buffer from a scatter list
346
* @mgr: fpga manager
347
* @info: fpga image specific information
348
* @sgt: scatterlist table
349
*
350
* Step the low level fpga manager through the device-specific steps of getting
351
* an FPGA ready to be configured, writing the image to it, then doing whatever
352
* post-configuration steps necessary. This code assumes the caller got the
353
* mgr pointer from of_fpga_mgr_get() or fpga_mgr_get() and checked that it is
354
* not an error code.
355
*
356
* This is the preferred entry point for FPGA programming, it does not require
357
* any contiguous kernel memory.
358
*
359
* Return: 0 on success, negative error code otherwise.
360
*/
361
static int fpga_mgr_buf_load_sg(struct fpga_manager *mgr,
362
struct fpga_image_info *info,
363
struct sg_table *sgt)
364
{
365
int ret;
366
367
ret = fpga_mgr_prepare_sg(mgr, info, sgt);
368
if (ret)
369
return ret;
370
371
/* Write the FPGA image to the FPGA. */
372
mgr->state = FPGA_MGR_STATE_WRITE;
373
if (mgr->mops->write_sg) {
374
ret = fpga_mgr_write_sg(mgr, sgt);
375
} else {
376
size_t length, count = 0, data_size = info->data_size;
377
struct sg_mapping_iter miter;
378
379
sg_miter_start(&miter, sgt->sgl, sgt->nents, SG_MITER_FROM_SG);
380
381
if (mgr->mops->skip_header &&
382
!sg_miter_skip(&miter, info->header_size)) {
383
ret = -EINVAL;
384
goto out;
385
}
386
387
while (sg_miter_next(&miter)) {
388
if (data_size)
389
length = min(miter.length, data_size - count);
390
else
391
length = miter.length;
392
393
ret = fpga_mgr_write(mgr, miter.addr, length);
394
if (ret)
395
break;
396
397
count += length;
398
if (data_size && count >= data_size)
399
break;
400
}
401
sg_miter_stop(&miter);
402
}
403
404
out:
405
if (ret) {
406
dev_err(&mgr->dev, "Error while writing image data to FPGA\n");
407
mgr->state = FPGA_MGR_STATE_WRITE_ERR;
408
return ret;
409
}
410
411
return fpga_mgr_write_complete(mgr, info);
412
}
413
414
static int fpga_mgr_buf_load_mapped(struct fpga_manager *mgr,
415
struct fpga_image_info *info,
416
const char *buf, size_t count)
417
{
418
int ret;
419
420
ret = fpga_mgr_parse_header_mapped(mgr, info, buf, count);
421
if (ret)
422
return ret;
423
424
ret = fpga_mgr_write_init_buf(mgr, info, buf, count);
425
if (ret)
426
return ret;
427
428
if (mgr->mops->skip_header) {
429
buf += info->header_size;
430
count -= info->header_size;
431
}
432
433
if (info->data_size)
434
count = info->data_size;
435
436
/*
437
* Write the FPGA image to the FPGA.
438
*/
439
mgr->state = FPGA_MGR_STATE_WRITE;
440
ret = fpga_mgr_write(mgr, buf, count);
441
if (ret) {
442
dev_err(&mgr->dev, "Error while writing image data to FPGA\n");
443
mgr->state = FPGA_MGR_STATE_WRITE_ERR;
444
return ret;
445
}
446
447
return fpga_mgr_write_complete(mgr, info);
448
}
449
450
/**
451
* fpga_mgr_buf_load - load fpga from image in buffer
452
* @mgr: fpga manager
453
* @info: fpga image info
454
* @buf: buffer contain fpga image
455
* @count: byte count of buf
456
*
457
* Step the low level fpga manager through the device-specific steps of getting
458
* an FPGA ready to be configured, writing the image to it, then doing whatever
459
* post-configuration steps necessary. This code assumes the caller got the
460
* mgr pointer from of_fpga_mgr_get() and checked that it is not an error code.
461
*
462
* Return: 0 on success, negative error code otherwise.
463
*/
464
static int fpga_mgr_buf_load(struct fpga_manager *mgr,
465
struct fpga_image_info *info,
466
const char *buf, size_t count)
467
{
468
struct page **pages;
469
struct sg_table sgt;
470
const void *p;
471
int nr_pages;
472
int index;
473
int rc;
474
475
/*
476
* This is just a fast path if the caller has already created a
477
* contiguous kernel buffer and the driver doesn't require SG, non-SG
478
* drivers will still work on the slow path.
479
*/
480
if (mgr->mops->write)
481
return fpga_mgr_buf_load_mapped(mgr, info, buf, count);
482
483
/*
484
* Convert the linear kernel pointer into a sg_table of pages for use
485
* by the driver.
486
*/
487
nr_pages = DIV_ROUND_UP((unsigned long)buf + count, PAGE_SIZE) -
488
(unsigned long)buf / PAGE_SIZE;
489
pages = kmalloc_array(nr_pages, sizeof(struct page *), GFP_KERNEL);
490
if (!pages)
491
return -ENOMEM;
492
493
p = buf - offset_in_page(buf);
494
for (index = 0; index < nr_pages; index++) {
495
if (is_vmalloc_addr(p))
496
pages[index] = vmalloc_to_page(p);
497
else
498
pages[index] = kmap_to_page((void *)p);
499
if (!pages[index]) {
500
kfree(pages);
501
return -EFAULT;
502
}
503
p += PAGE_SIZE;
504
}
505
506
/*
507
* The temporary pages list is used to code share the merging algorithm
508
* in sg_alloc_table_from_pages
509
*/
510
rc = sg_alloc_table_from_pages(&sgt, pages, index, offset_in_page(buf),
511
count, GFP_KERNEL);
512
kfree(pages);
513
if (rc)
514
return rc;
515
516
rc = fpga_mgr_buf_load_sg(mgr, info, &sgt);
517
sg_free_table(&sgt);
518
519
return rc;
520
}
521
522
/**
523
* fpga_mgr_firmware_load - request firmware and load to fpga
524
* @mgr: fpga manager
525
* @info: fpga image specific information
526
* @image_name: name of image file on the firmware search path
527
*
528
* Request an FPGA image using the firmware class, then write out to the FPGA.
529
* Update the state before each step to provide info on what step failed if
530
* there is a failure. This code assumes the caller got the mgr pointer
531
* from of_fpga_mgr_get() or fpga_mgr_get() and checked that it is not an error
532
* code.
533
*
534
* Return: 0 on success, negative error code otherwise.
535
*/
536
static int fpga_mgr_firmware_load(struct fpga_manager *mgr,
537
struct fpga_image_info *info,
538
const char *image_name)
539
{
540
struct device *dev = &mgr->dev;
541
const struct firmware *fw;
542
int ret;
543
544
dev_info(dev, "writing %s to %s\n", image_name, mgr->name);
545
546
mgr->state = FPGA_MGR_STATE_FIRMWARE_REQ;
547
548
ret = request_firmware(&fw, image_name, dev);
549
if (ret) {
550
mgr->state = FPGA_MGR_STATE_FIRMWARE_REQ_ERR;
551
dev_err(dev, "Error requesting firmware %s\n", image_name);
552
return ret;
553
}
554
555
ret = fpga_mgr_buf_load(mgr, info, fw->data, fw->size);
556
557
release_firmware(fw);
558
559
return ret;
560
}
561
562
/**
563
* fpga_mgr_load - load FPGA from scatter/gather table, buffer, or firmware
564
* @mgr: fpga manager
565
* @info: fpga image information.
566
*
567
* Load the FPGA from an image which is indicated in @info. If successful, the
568
* FPGA ends up in operating mode.
569
*
570
* Return: 0 on success, negative error code otherwise.
571
*/
572
int fpga_mgr_load(struct fpga_manager *mgr, struct fpga_image_info *info)
573
{
574
info->header_size = mgr->mops->initial_header_size;
575
576
if (info->sgt)
577
return fpga_mgr_buf_load_sg(mgr, info, info->sgt);
578
if (info->buf && info->count)
579
return fpga_mgr_buf_load(mgr, info, info->buf, info->count);
580
if (info->firmware_name)
581
return fpga_mgr_firmware_load(mgr, info, info->firmware_name);
582
return -EINVAL;
583
}
584
EXPORT_SYMBOL_GPL(fpga_mgr_load);
585
586
static const char * const state_str[] = {
587
[FPGA_MGR_STATE_UNKNOWN] = "unknown",
588
[FPGA_MGR_STATE_POWER_OFF] = "power off",
589
[FPGA_MGR_STATE_POWER_UP] = "power up",
590
[FPGA_MGR_STATE_RESET] = "reset",
591
592
/* requesting FPGA image from firmware */
593
[FPGA_MGR_STATE_FIRMWARE_REQ] = "firmware request",
594
[FPGA_MGR_STATE_FIRMWARE_REQ_ERR] = "firmware request error",
595
596
/* Parse FPGA image header */
597
[FPGA_MGR_STATE_PARSE_HEADER] = "parse header",
598
[FPGA_MGR_STATE_PARSE_HEADER_ERR] = "parse header error",
599
600
/* Preparing FPGA to receive image */
601
[FPGA_MGR_STATE_WRITE_INIT] = "write init",
602
[FPGA_MGR_STATE_WRITE_INIT_ERR] = "write init error",
603
604
/* Writing image to FPGA */
605
[FPGA_MGR_STATE_WRITE] = "write",
606
[FPGA_MGR_STATE_WRITE_ERR] = "write error",
607
608
/* Finishing configuration after image has been written */
609
[FPGA_MGR_STATE_WRITE_COMPLETE] = "write complete",
610
[FPGA_MGR_STATE_WRITE_COMPLETE_ERR] = "write complete error",
611
612
/* FPGA reports to be in normal operating mode */
613
[FPGA_MGR_STATE_OPERATING] = "operating",
614
};
615
616
static ssize_t name_show(struct device *dev,
617
struct device_attribute *attr, char *buf)
618
{
619
struct fpga_manager *mgr = to_fpga_manager(dev);
620
621
return sprintf(buf, "%s\n", mgr->name);
622
}
623
624
static ssize_t state_show(struct device *dev,
625
struct device_attribute *attr, char *buf)
626
{
627
struct fpga_manager *mgr = to_fpga_manager(dev);
628
629
return sprintf(buf, "%s\n", state_str[mgr->state]);
630
}
631
632
static ssize_t status_show(struct device *dev,
633
struct device_attribute *attr, char *buf)
634
{
635
struct fpga_manager *mgr = to_fpga_manager(dev);
636
u64 status;
637
int len = 0;
638
639
status = fpga_mgr_status(mgr);
640
641
if (status & FPGA_MGR_STATUS_OPERATION_ERR)
642
len += sprintf(buf + len, "reconfig operation error\n");
643
if (status & FPGA_MGR_STATUS_CRC_ERR)
644
len += sprintf(buf + len, "reconfig CRC error\n");
645
if (status & FPGA_MGR_STATUS_INCOMPATIBLE_IMAGE_ERR)
646
len += sprintf(buf + len, "reconfig incompatible image\n");
647
if (status & FPGA_MGR_STATUS_IP_PROTOCOL_ERR)
648
len += sprintf(buf + len, "reconfig IP protocol error\n");
649
if (status & FPGA_MGR_STATUS_FIFO_OVERFLOW_ERR)
650
len += sprintf(buf + len, "reconfig fifo overflow error\n");
651
652
return len;
653
}
654
655
static DEVICE_ATTR_RO(name);
656
static DEVICE_ATTR_RO(state);
657
static DEVICE_ATTR_RO(status);
658
659
static struct attribute *fpga_mgr_attrs[] = {
660
&dev_attr_name.attr,
661
&dev_attr_state.attr,
662
&dev_attr_status.attr,
663
NULL,
664
};
665
ATTRIBUTE_GROUPS(fpga_mgr);
666
667
static struct fpga_manager *__fpga_mgr_get(struct device *mgr_dev)
668
{
669
struct fpga_manager *mgr;
670
671
mgr = to_fpga_manager(mgr_dev);
672
673
if (!try_module_get(mgr->mops_owner))
674
mgr = ERR_PTR(-ENODEV);
675
676
return mgr;
677
}
678
679
static int fpga_mgr_dev_match(struct device *dev, const void *data)
680
{
681
return dev->parent == data;
682
}
683
684
/**
685
* fpga_mgr_get - Given a device, get a reference to an fpga mgr.
686
* @dev: parent device that fpga mgr was registered with
687
*
688
* Return: fpga manager struct or IS_ERR() condition containing error code.
689
*/
690
struct fpga_manager *fpga_mgr_get(struct device *dev)
691
{
692
struct fpga_manager *mgr;
693
struct device *mgr_dev;
694
695
mgr_dev = class_find_device(&fpga_mgr_class, NULL, dev, fpga_mgr_dev_match);
696
if (!mgr_dev)
697
return ERR_PTR(-ENODEV);
698
699
mgr = __fpga_mgr_get(mgr_dev);
700
if (IS_ERR(mgr))
701
put_device(mgr_dev);
702
703
return mgr;
704
}
705
EXPORT_SYMBOL_GPL(fpga_mgr_get);
706
707
/**
708
* of_fpga_mgr_get - Given a device node, get a reference to an fpga mgr.
709
*
710
* @node: device node
711
*
712
* Return: fpga manager struct or IS_ERR() condition containing error code.
713
*/
714
struct fpga_manager *of_fpga_mgr_get(struct device_node *node)
715
{
716
struct fpga_manager *mgr;
717
struct device *mgr_dev;
718
719
mgr_dev = class_find_device_by_of_node(&fpga_mgr_class, node);
720
if (!mgr_dev)
721
return ERR_PTR(-ENODEV);
722
723
mgr = __fpga_mgr_get(mgr_dev);
724
if (IS_ERR(mgr))
725
put_device(mgr_dev);
726
727
return mgr;
728
}
729
EXPORT_SYMBOL_GPL(of_fpga_mgr_get);
730
731
/**
732
* fpga_mgr_put - release a reference to an fpga manager
733
* @mgr: fpga manager structure
734
*/
735
void fpga_mgr_put(struct fpga_manager *mgr)
736
{
737
module_put(mgr->mops_owner);
738
put_device(&mgr->dev);
739
}
740
EXPORT_SYMBOL_GPL(fpga_mgr_put);
741
742
/**
743
* fpga_mgr_lock - Lock FPGA manager for exclusive use
744
* @mgr: fpga manager
745
*
746
* Given a pointer to FPGA Manager (from fpga_mgr_get() or
747
* of_fpga_mgr_put()) attempt to get the mutex. The user should call
748
* fpga_mgr_lock() and verify that it returns 0 before attempting to
749
* program the FPGA. Likewise, the user should call fpga_mgr_unlock
750
* when done programming the FPGA.
751
*
752
* Return: 0 for success or -EBUSY
753
*/
754
int fpga_mgr_lock(struct fpga_manager *mgr)
755
{
756
if (!mutex_trylock(&mgr->ref_mutex)) {
757
dev_err(&mgr->dev, "FPGA manager is in use.\n");
758
return -EBUSY;
759
}
760
761
return 0;
762
}
763
EXPORT_SYMBOL_GPL(fpga_mgr_lock);
764
765
/**
766
* fpga_mgr_unlock - Unlock FPGA manager after done programming
767
* @mgr: fpga manager
768
*/
769
void fpga_mgr_unlock(struct fpga_manager *mgr)
770
{
771
mutex_unlock(&mgr->ref_mutex);
772
}
773
EXPORT_SYMBOL_GPL(fpga_mgr_unlock);
774
775
/**
776
* __fpga_mgr_register_full - create and register an FPGA Manager device
777
* @parent: fpga manager device from pdev
778
* @info: parameters for fpga manager
779
* @owner: owner module containing the ops
780
*
781
* The caller of this function is responsible for calling fpga_mgr_unregister().
782
* Using devm_fpga_mgr_register_full() instead is recommended.
783
*
784
* Return: pointer to struct fpga_manager pointer or ERR_PTR()
785
*/
786
struct fpga_manager *
787
__fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *info,
788
struct module *owner)
789
{
790
const struct fpga_manager_ops *mops = info->mops;
791
struct fpga_manager *mgr;
792
int id, ret;
793
794
if (!mops) {
795
dev_err(parent, "Attempt to register without fpga_manager_ops\n");
796
return ERR_PTR(-EINVAL);
797
}
798
799
if (!info->name || !strlen(info->name)) {
800
dev_err(parent, "Attempt to register with no name!\n");
801
return ERR_PTR(-EINVAL);
802
}
803
804
mgr = kzalloc(sizeof(*mgr), GFP_KERNEL);
805
if (!mgr)
806
return ERR_PTR(-ENOMEM);
807
808
id = ida_alloc(&fpga_mgr_ida, GFP_KERNEL);
809
if (id < 0) {
810
ret = id;
811
goto error_kfree;
812
}
813
814
mutex_init(&mgr->ref_mutex);
815
816
mgr->mops_owner = owner;
817
818
mgr->name = info->name;
819
mgr->mops = info->mops;
820
mgr->priv = info->priv;
821
mgr->compat_id = info->compat_id;
822
823
mgr->dev.class = &fpga_mgr_class;
824
mgr->dev.groups = mops->groups;
825
mgr->dev.parent = parent;
826
mgr->dev.of_node = parent->of_node;
827
mgr->dev.id = id;
828
829
ret = dev_set_name(&mgr->dev, "fpga%d", id);
830
if (ret)
831
goto error_device;
832
833
/*
834
* Initialize framework state by requesting low level driver read state
835
* from device. FPGA may be in reset mode or may have been programmed
836
* by bootloader or EEPROM.
837
*/
838
mgr->state = fpga_mgr_state(mgr);
839
840
ret = device_register(&mgr->dev);
841
if (ret) {
842
put_device(&mgr->dev);
843
return ERR_PTR(ret);
844
}
845
846
return mgr;
847
848
error_device:
849
ida_free(&fpga_mgr_ida, id);
850
error_kfree:
851
kfree(mgr);
852
853
return ERR_PTR(ret);
854
}
855
EXPORT_SYMBOL_GPL(__fpga_mgr_register_full);
856
857
/**
858
* __fpga_mgr_register - create and register an FPGA Manager device
859
* @parent: fpga manager device from pdev
860
* @name: fpga manager name
861
* @mops: pointer to structure of fpga manager ops
862
* @priv: fpga manager private data
863
* @owner: owner module containing the ops
864
*
865
* The caller of this function is responsible for calling fpga_mgr_unregister().
866
* Using devm_fpga_mgr_register() instead is recommended. This simple
867
* version of the register function should be sufficient for most users. The
868
* fpga_mgr_register_full() function is available for users that need to pass
869
* additional, optional parameters.
870
*
871
* Return: pointer to struct fpga_manager pointer or ERR_PTR()
872
*/
873
struct fpga_manager *
874
__fpga_mgr_register(struct device *parent, const char *name,
875
const struct fpga_manager_ops *mops, void *priv, struct module *owner)
876
{
877
struct fpga_manager_info info = { 0 };
878
879
info.name = name;
880
info.mops = mops;
881
info.priv = priv;
882
883
return __fpga_mgr_register_full(parent, &info, owner);
884
}
885
EXPORT_SYMBOL_GPL(__fpga_mgr_register);
886
887
/**
888
* fpga_mgr_unregister - unregister an FPGA manager
889
* @mgr: fpga manager struct
890
*
891
* This function is intended for use in an FPGA manager driver's remove function.
892
*/
893
void fpga_mgr_unregister(struct fpga_manager *mgr)
894
{
895
dev_info(&mgr->dev, "%s %s\n", __func__, mgr->name);
896
897
/*
898
* If the low level driver provides a method for putting fpga into
899
* a desired state upon unregister, do it.
900
*/
901
fpga_mgr_fpga_remove(mgr);
902
903
device_unregister(&mgr->dev);
904
}
905
EXPORT_SYMBOL_GPL(fpga_mgr_unregister);
906
907
static void devm_fpga_mgr_unregister(struct device *dev, void *res)
908
{
909
struct fpga_mgr_devres *dr = res;
910
911
fpga_mgr_unregister(dr->mgr);
912
}
913
914
/**
915
* __devm_fpga_mgr_register_full - resource managed variant of fpga_mgr_register()
916
* @parent: fpga manager device from pdev
917
* @info: parameters for fpga manager
918
* @owner: owner module containing the ops
919
*
920
* Return: fpga manager pointer on success, negative error code otherwise.
921
*
922
* This is the devres variant of fpga_mgr_register_full() for which the unregister
923
* function will be called automatically when the managing device is detached.
924
*/
925
struct fpga_manager *
926
__devm_fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *info,
927
struct module *owner)
928
{
929
struct fpga_mgr_devres *dr;
930
struct fpga_manager *mgr;
931
932
dr = devres_alloc(devm_fpga_mgr_unregister, sizeof(*dr), GFP_KERNEL);
933
if (!dr)
934
return ERR_PTR(-ENOMEM);
935
936
mgr = __fpga_mgr_register_full(parent, info, owner);
937
if (IS_ERR(mgr)) {
938
devres_free(dr);
939
return mgr;
940
}
941
942
dr->mgr = mgr;
943
devres_add(parent, dr);
944
945
return mgr;
946
}
947
EXPORT_SYMBOL_GPL(__devm_fpga_mgr_register_full);
948
949
/**
950
* __devm_fpga_mgr_register - resource managed variant of fpga_mgr_register()
951
* @parent: fpga manager device from pdev
952
* @name: fpga manager name
953
* @mops: pointer to structure of fpga manager ops
954
* @priv: fpga manager private data
955
* @owner: owner module containing the ops
956
*
957
* Return: fpga manager pointer on success, negative error code otherwise.
958
*
959
* This is the devres variant of fpga_mgr_register() for which the
960
* unregister function will be called automatically when the managing
961
* device is detached.
962
*/
963
struct fpga_manager *
964
__devm_fpga_mgr_register(struct device *parent, const char *name,
965
const struct fpga_manager_ops *mops, void *priv,
966
struct module *owner)
967
{
968
struct fpga_manager_info info = { 0 };
969
970
info.name = name;
971
info.mops = mops;
972
info.priv = priv;
973
974
return __devm_fpga_mgr_register_full(parent, &info, owner);
975
}
976
EXPORT_SYMBOL_GPL(__devm_fpga_mgr_register);
977
978
static void fpga_mgr_dev_release(struct device *dev)
979
{
980
struct fpga_manager *mgr = to_fpga_manager(dev);
981
982
ida_free(&fpga_mgr_ida, mgr->dev.id);
983
kfree(mgr);
984
}
985
986
static const struct class fpga_mgr_class = {
987
.name = "fpga_manager",
988
.dev_groups = fpga_mgr_groups,
989
.dev_release = fpga_mgr_dev_release,
990
};
991
992
static int __init fpga_mgr_class_init(void)
993
{
994
pr_info("FPGA manager framework\n");
995
996
return class_register(&fpga_mgr_class);
997
}
998
999
static void __exit fpga_mgr_class_exit(void)
1000
{
1001
class_unregister(&fpga_mgr_class);
1002
ida_destroy(&fpga_mgr_ida);
1003
}
1004
1005
MODULE_AUTHOR("Alan Tull <[email protected]>");
1006
MODULE_DESCRIPTION("FPGA manager framework");
1007
MODULE_LICENSE("GPL v2");
1008
1009
subsys_initcall(fpga_mgr_class_init);
1010
module_exit(fpga_mgr_class_exit);
1011
1012