0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/firmware.h>
0012 #include <linux/fpga/fpga-mgr.h>
0013 #include <linux/idr.h>
0014 #include <linux/module.h>
0015 #include <linux/of.h>
0016 #include <linux/mutex.h>
0017 #include <linux/slab.h>
0018 #include <linux/scatterlist.h>
0019 #include <linux/highmem.h>
0020
0021 static DEFINE_IDA(fpga_mgr_ida);
0022 static struct class *fpga_mgr_class;
0023
0024 struct fpga_mgr_devres {
0025 struct fpga_manager *mgr;
0026 };
0027
0028 static inline void fpga_mgr_fpga_remove(struct fpga_manager *mgr)
0029 {
0030 if (mgr->mops->fpga_remove)
0031 mgr->mops->fpga_remove(mgr);
0032 }
0033
0034 static inline enum fpga_mgr_states fpga_mgr_state(struct fpga_manager *mgr)
0035 {
0036 if (mgr->mops->state)
0037 return mgr->mops->state(mgr);
0038 return FPGA_MGR_STATE_UNKNOWN;
0039 }
0040
0041 static inline u64 fpga_mgr_status(struct fpga_manager *mgr)
0042 {
0043 if (mgr->mops->status)
0044 return mgr->mops->status(mgr);
0045 return 0;
0046 }
0047
0048 static inline int fpga_mgr_write(struct fpga_manager *mgr, const char *buf, size_t count)
0049 {
0050 if (mgr->mops->write)
0051 return mgr->mops->write(mgr, buf, count);
0052 return -EOPNOTSUPP;
0053 }
0054
0055
0056
0057
0058
0059 static inline int fpga_mgr_write_complete(struct fpga_manager *mgr,
0060 struct fpga_image_info *info)
0061 {
0062 int ret = 0;
0063
0064 mgr->state = FPGA_MGR_STATE_WRITE_COMPLETE;
0065 if (mgr->mops->write_complete)
0066 ret = mgr->mops->write_complete(mgr, info);
0067 if (ret) {
0068 dev_err(&mgr->dev, "Error after writing image data to FPGA\n");
0069 mgr->state = FPGA_MGR_STATE_WRITE_COMPLETE_ERR;
0070 return ret;
0071 }
0072 mgr->state = FPGA_MGR_STATE_OPERATING;
0073
0074 return 0;
0075 }
0076
0077 static inline int fpga_mgr_parse_header(struct fpga_manager *mgr,
0078 struct fpga_image_info *info,
0079 const char *buf, size_t count)
0080 {
0081 if (mgr->mops->parse_header)
0082 return mgr->mops->parse_header(mgr, info, buf, count);
0083 return 0;
0084 }
0085
0086 static inline int fpga_mgr_write_init(struct fpga_manager *mgr,
0087 struct fpga_image_info *info,
0088 const char *buf, size_t count)
0089 {
0090 if (mgr->mops->write_init)
0091 return mgr->mops->write_init(mgr, info, buf, count);
0092 return 0;
0093 }
0094
0095 static inline int fpga_mgr_write_sg(struct fpga_manager *mgr,
0096 struct sg_table *sgt)
0097 {
0098 if (mgr->mops->write_sg)
0099 return mgr->mops->write_sg(mgr, sgt);
0100 return -EOPNOTSUPP;
0101 }
0102
0103
0104
0105
0106
0107
0108
0109 struct fpga_image_info *fpga_image_info_alloc(struct device *dev)
0110 {
0111 struct fpga_image_info *info;
0112
0113 get_device(dev);
0114
0115 info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
0116 if (!info) {
0117 put_device(dev);
0118 return NULL;
0119 }
0120
0121 info->dev = dev;
0122
0123 return info;
0124 }
0125 EXPORT_SYMBOL_GPL(fpga_image_info_alloc);
0126
0127
0128
0129
0130
0131 void fpga_image_info_free(struct fpga_image_info *info)
0132 {
0133 struct device *dev;
0134
0135 if (!info)
0136 return;
0137
0138 dev = info->dev;
0139 if (info->firmware_name)
0140 devm_kfree(dev, info->firmware_name);
0141
0142 devm_kfree(dev, info);
0143 put_device(dev);
0144 }
0145 EXPORT_SYMBOL_GPL(fpga_image_info_free);
0146
0147
0148
0149
0150
0151 static int fpga_mgr_parse_header_mapped(struct fpga_manager *mgr,
0152 struct fpga_image_info *info,
0153 const char *buf, size_t count)
0154 {
0155 int ret;
0156
0157 mgr->state = FPGA_MGR_STATE_PARSE_HEADER;
0158 ret = fpga_mgr_parse_header(mgr, info, buf, count);
0159
0160 if (info->header_size + info->data_size > count) {
0161 dev_err(&mgr->dev, "Bitstream data outruns FPGA image\n");
0162 ret = -EINVAL;
0163 }
0164
0165 if (ret) {
0166 dev_err(&mgr->dev, "Error while parsing FPGA image header\n");
0167 mgr->state = FPGA_MGR_STATE_PARSE_HEADER_ERR;
0168 }
0169
0170 return ret;
0171 }
0172
0173
0174
0175
0176
0177
0178
0179
0180 static int fpga_mgr_parse_header_sg_first(struct fpga_manager *mgr,
0181 struct fpga_image_info *info,
0182 struct sg_table *sgt)
0183 {
0184 struct sg_mapping_iter miter;
0185 int ret;
0186
0187 mgr->state = FPGA_MGR_STATE_PARSE_HEADER;
0188
0189 sg_miter_start(&miter, sgt->sgl, sgt->nents, SG_MITER_FROM_SG);
0190 if (sg_miter_next(&miter) &&
0191 miter.length >= info->header_size)
0192 ret = fpga_mgr_parse_header(mgr, info, miter.addr, miter.length);
0193 else
0194 ret = -EAGAIN;
0195 sg_miter_stop(&miter);
0196
0197 if (ret && ret != -EAGAIN) {
0198 dev_err(&mgr->dev, "Error while parsing FPGA image header\n");
0199 mgr->state = FPGA_MGR_STATE_PARSE_HEADER_ERR;
0200 }
0201
0202 return ret;
0203 }
0204
0205
0206
0207
0208
0209
0210
0211
0212 static void *fpga_mgr_parse_header_sg(struct fpga_manager *mgr,
0213 struct fpga_image_info *info,
0214 struct sg_table *sgt, size_t *ret_size)
0215 {
0216 size_t len, new_header_size, header_size = 0;
0217 char *new_buf, *buf = NULL;
0218 int ret;
0219
0220 do {
0221 new_header_size = info->header_size;
0222 if (new_header_size <= header_size) {
0223 dev_err(&mgr->dev, "Requested invalid header size\n");
0224 ret = -EFAULT;
0225 break;
0226 }
0227
0228 new_buf = krealloc(buf, new_header_size, GFP_KERNEL);
0229 if (!new_buf) {
0230 ret = -ENOMEM;
0231 break;
0232 }
0233
0234 buf = new_buf;
0235
0236 len = sg_pcopy_to_buffer(sgt->sgl, sgt->nents,
0237 buf + header_size,
0238 new_header_size - header_size,
0239 header_size);
0240 if (len != new_header_size - header_size) {
0241 ret = -EFAULT;
0242 break;
0243 }
0244
0245 header_size = new_header_size;
0246 ret = fpga_mgr_parse_header(mgr, info, buf, header_size);
0247 } while (ret == -EAGAIN);
0248
0249 if (ret) {
0250 dev_err(&mgr->dev, "Error while parsing FPGA image header\n");
0251 mgr->state = FPGA_MGR_STATE_PARSE_HEADER_ERR;
0252 kfree(buf);
0253 buf = ERR_PTR(ret);
0254 }
0255
0256 *ret_size = header_size;
0257
0258 return buf;
0259 }
0260
0261
0262
0263
0264
0265
0266
0267
0268 static int fpga_mgr_write_init_buf(struct fpga_manager *mgr,
0269 struct fpga_image_info *info,
0270 const char *buf, size_t count)
0271 {
0272 size_t header_size = info->header_size;
0273 int ret;
0274
0275 mgr->state = FPGA_MGR_STATE_WRITE_INIT;
0276
0277 if (header_size > count)
0278 ret = -EINVAL;
0279 else if (!header_size)
0280 ret = fpga_mgr_write_init(mgr, info, NULL, 0);
0281 else
0282 ret = fpga_mgr_write_init(mgr, info, buf, count);
0283
0284 if (ret) {
0285 dev_err(&mgr->dev, "Error preparing FPGA for writing\n");
0286 mgr->state = FPGA_MGR_STATE_WRITE_INIT_ERR;
0287 return ret;
0288 }
0289
0290 return 0;
0291 }
0292
0293 static int fpga_mgr_prepare_sg(struct fpga_manager *mgr,
0294 struct fpga_image_info *info,
0295 struct sg_table *sgt)
0296 {
0297 struct sg_mapping_iter miter;
0298 size_t len;
0299 char *buf;
0300 int ret;
0301
0302
0303 if (!mgr->mops->initial_header_size && !mgr->mops->parse_header)
0304 return fpga_mgr_write_init_buf(mgr, info, NULL, 0);
0305
0306
0307
0308
0309
0310 ret = fpga_mgr_parse_header_sg_first(mgr, info, sgt);
0311
0312 if (!ret) {
0313 sg_miter_start(&miter, sgt->sgl, sgt->nents, SG_MITER_FROM_SG);
0314 if (sg_miter_next(&miter)) {
0315 ret = fpga_mgr_write_init_buf(mgr, info, miter.addr,
0316 miter.length);
0317 sg_miter_stop(&miter);
0318 return ret;
0319 }
0320 sg_miter_stop(&miter);
0321
0322
0323
0324
0325 } else if (ret != -EAGAIN) {
0326 return ret;
0327 }
0328
0329
0330
0331
0332
0333 buf = fpga_mgr_parse_header_sg(mgr, info, sgt, &len);
0334 if (IS_ERR(buf))
0335 return PTR_ERR(buf);
0336
0337 ret = fpga_mgr_write_init_buf(mgr, info, buf, len);
0338
0339 kfree(buf);
0340
0341 return ret;
0342 }
0343
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357
0358
0359
0360
0361 static int fpga_mgr_buf_load_sg(struct fpga_manager *mgr,
0362 struct fpga_image_info *info,
0363 struct sg_table *sgt)
0364 {
0365 int ret;
0366
0367 ret = fpga_mgr_prepare_sg(mgr, info, sgt);
0368 if (ret)
0369 return ret;
0370
0371
0372 mgr->state = FPGA_MGR_STATE_WRITE;
0373 if (mgr->mops->write_sg) {
0374 ret = fpga_mgr_write_sg(mgr, sgt);
0375 } else {
0376 size_t length, count = 0, data_size = info->data_size;
0377 struct sg_mapping_iter miter;
0378
0379 sg_miter_start(&miter, sgt->sgl, sgt->nents, SG_MITER_FROM_SG);
0380
0381 if (mgr->mops->skip_header &&
0382 !sg_miter_skip(&miter, info->header_size)) {
0383 ret = -EINVAL;
0384 goto out;
0385 }
0386
0387 while (sg_miter_next(&miter)) {
0388 if (data_size)
0389 length = min(miter.length, data_size - count);
0390 else
0391 length = miter.length;
0392
0393 ret = fpga_mgr_write(mgr, miter.addr, length);
0394 if (ret)
0395 break;
0396
0397 count += length;
0398 if (data_size && count >= data_size)
0399 break;
0400 }
0401 sg_miter_stop(&miter);
0402 }
0403
0404 out:
0405 if (ret) {
0406 dev_err(&mgr->dev, "Error while writing image data to FPGA\n");
0407 mgr->state = FPGA_MGR_STATE_WRITE_ERR;
0408 return ret;
0409 }
0410
0411 return fpga_mgr_write_complete(mgr, info);
0412 }
0413
0414 static int fpga_mgr_buf_load_mapped(struct fpga_manager *mgr,
0415 struct fpga_image_info *info,
0416 const char *buf, size_t count)
0417 {
0418 int ret;
0419
0420 ret = fpga_mgr_parse_header_mapped(mgr, info, buf, count);
0421 if (ret)
0422 return ret;
0423
0424 ret = fpga_mgr_write_init_buf(mgr, info, buf, count);
0425 if (ret)
0426 return ret;
0427
0428 if (mgr->mops->skip_header) {
0429 buf += info->header_size;
0430 count -= info->header_size;
0431 }
0432
0433 if (info->data_size)
0434 count = info->data_size;
0435
0436
0437
0438
0439 mgr->state = FPGA_MGR_STATE_WRITE;
0440 ret = fpga_mgr_write(mgr, buf, count);
0441 if (ret) {
0442 dev_err(&mgr->dev, "Error while writing image data to FPGA\n");
0443 mgr->state = FPGA_MGR_STATE_WRITE_ERR;
0444 return ret;
0445 }
0446
0447 return fpga_mgr_write_complete(mgr, info);
0448 }
0449
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460
0461
0462
0463
0464 static int fpga_mgr_buf_load(struct fpga_manager *mgr,
0465 struct fpga_image_info *info,
0466 const char *buf, size_t count)
0467 {
0468 struct page **pages;
0469 struct sg_table sgt;
0470 const void *p;
0471 int nr_pages;
0472 int index;
0473 int rc;
0474
0475
0476
0477
0478
0479
0480 if (mgr->mops->write)
0481 return fpga_mgr_buf_load_mapped(mgr, info, buf, count);
0482
0483
0484
0485
0486
0487 nr_pages = DIV_ROUND_UP((unsigned long)buf + count, PAGE_SIZE) -
0488 (unsigned long)buf / PAGE_SIZE;
0489 pages = kmalloc_array(nr_pages, sizeof(struct page *), GFP_KERNEL);
0490 if (!pages)
0491 return -ENOMEM;
0492
0493 p = buf - offset_in_page(buf);
0494 for (index = 0; index < nr_pages; index++) {
0495 if (is_vmalloc_addr(p))
0496 pages[index] = vmalloc_to_page(p);
0497 else
0498 pages[index] = kmap_to_page((void *)p);
0499 if (!pages[index]) {
0500 kfree(pages);
0501 return -EFAULT;
0502 }
0503 p += PAGE_SIZE;
0504 }
0505
0506
0507
0508
0509
0510 rc = sg_alloc_table_from_pages(&sgt, pages, index, offset_in_page(buf),
0511 count, GFP_KERNEL);
0512 kfree(pages);
0513 if (rc)
0514 return rc;
0515
0516 rc = fpga_mgr_buf_load_sg(mgr, info, &sgt);
0517 sg_free_table(&sgt);
0518
0519 return rc;
0520 }
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535
0536 static int fpga_mgr_firmware_load(struct fpga_manager *mgr,
0537 struct fpga_image_info *info,
0538 const char *image_name)
0539 {
0540 struct device *dev = &mgr->dev;
0541 const struct firmware *fw;
0542 int ret;
0543
0544 dev_info(dev, "writing %s to %s\n", image_name, mgr->name);
0545
0546 mgr->state = FPGA_MGR_STATE_FIRMWARE_REQ;
0547
0548 ret = request_firmware(&fw, image_name, dev);
0549 if (ret) {
0550 mgr->state = FPGA_MGR_STATE_FIRMWARE_REQ_ERR;
0551 dev_err(dev, "Error requesting firmware %s\n", image_name);
0552 return ret;
0553 }
0554
0555 ret = fpga_mgr_buf_load(mgr, info, fw->data, fw->size);
0556
0557 release_firmware(fw);
0558
0559 return ret;
0560 }
0561
0562
0563
0564
0565
0566
0567
0568
0569
0570
0571
0572 int fpga_mgr_load(struct fpga_manager *mgr, struct fpga_image_info *info)
0573 {
0574 info->header_size = mgr->mops->initial_header_size;
0575
0576 if (info->sgt)
0577 return fpga_mgr_buf_load_sg(mgr, info, info->sgt);
0578 if (info->buf && info->count)
0579 return fpga_mgr_buf_load(mgr, info, info->buf, info->count);
0580 if (info->firmware_name)
0581 return fpga_mgr_firmware_load(mgr, info, info->firmware_name);
0582 return -EINVAL;
0583 }
0584 EXPORT_SYMBOL_GPL(fpga_mgr_load);
0585
0586 static const char * const state_str[] = {
0587 [FPGA_MGR_STATE_UNKNOWN] = "unknown",
0588 [FPGA_MGR_STATE_POWER_OFF] = "power off",
0589 [FPGA_MGR_STATE_POWER_UP] = "power up",
0590 [FPGA_MGR_STATE_RESET] = "reset",
0591
0592
0593 [FPGA_MGR_STATE_FIRMWARE_REQ] = "firmware request",
0594 [FPGA_MGR_STATE_FIRMWARE_REQ_ERR] = "firmware request error",
0595
0596
0597 [FPGA_MGR_STATE_PARSE_HEADER] = "parse header",
0598 [FPGA_MGR_STATE_PARSE_HEADER_ERR] = "parse header error",
0599
0600
0601 [FPGA_MGR_STATE_WRITE_INIT] = "write init",
0602 [FPGA_MGR_STATE_WRITE_INIT_ERR] = "write init error",
0603
0604
0605 [FPGA_MGR_STATE_WRITE] = "write",
0606 [FPGA_MGR_STATE_WRITE_ERR] = "write error",
0607
0608
0609 [FPGA_MGR_STATE_WRITE_COMPLETE] = "write complete",
0610 [FPGA_MGR_STATE_WRITE_COMPLETE_ERR] = "write complete error",
0611
0612
0613 [FPGA_MGR_STATE_OPERATING] = "operating",
0614 };
0615
0616 static ssize_t name_show(struct device *dev,
0617 struct device_attribute *attr, char *buf)
0618 {
0619 struct fpga_manager *mgr = to_fpga_manager(dev);
0620
0621 return sprintf(buf, "%s\n", mgr->name);
0622 }
0623
0624 static ssize_t state_show(struct device *dev,
0625 struct device_attribute *attr, char *buf)
0626 {
0627 struct fpga_manager *mgr = to_fpga_manager(dev);
0628
0629 return sprintf(buf, "%s\n", state_str[mgr->state]);
0630 }
0631
0632 static ssize_t status_show(struct device *dev,
0633 struct device_attribute *attr, char *buf)
0634 {
0635 struct fpga_manager *mgr = to_fpga_manager(dev);
0636 u64 status;
0637 int len = 0;
0638
0639 status = fpga_mgr_status(mgr);
0640
0641 if (status & FPGA_MGR_STATUS_OPERATION_ERR)
0642 len += sprintf(buf + len, "reconfig operation error\n");
0643 if (status & FPGA_MGR_STATUS_CRC_ERR)
0644 len += sprintf(buf + len, "reconfig CRC error\n");
0645 if (status & FPGA_MGR_STATUS_INCOMPATIBLE_IMAGE_ERR)
0646 len += sprintf(buf + len, "reconfig incompatible image\n");
0647 if (status & FPGA_MGR_STATUS_IP_PROTOCOL_ERR)
0648 len += sprintf(buf + len, "reconfig IP protocol error\n");
0649 if (status & FPGA_MGR_STATUS_FIFO_OVERFLOW_ERR)
0650 len += sprintf(buf + len, "reconfig fifo overflow error\n");
0651
0652 return len;
0653 }
0654
0655 static DEVICE_ATTR_RO(name);
0656 static DEVICE_ATTR_RO(state);
0657 static DEVICE_ATTR_RO(status);
0658
0659 static struct attribute *fpga_mgr_attrs[] = {
0660 &dev_attr_name.attr,
0661 &dev_attr_state.attr,
0662 &dev_attr_status.attr,
0663 NULL,
0664 };
0665 ATTRIBUTE_GROUPS(fpga_mgr);
0666
0667 static struct fpga_manager *__fpga_mgr_get(struct device *dev)
0668 {
0669 struct fpga_manager *mgr;
0670
0671 mgr = to_fpga_manager(dev);
0672
0673 if (!try_module_get(dev->parent->driver->owner))
0674 goto err_dev;
0675
0676 return mgr;
0677
0678 err_dev:
0679 put_device(dev);
0680 return ERR_PTR(-ENODEV);
0681 }
0682
0683 static int fpga_mgr_dev_match(struct device *dev, const void *data)
0684 {
0685 return dev->parent == data;
0686 }
0687
0688
0689
0690
0691
0692
0693
0694 struct fpga_manager *fpga_mgr_get(struct device *dev)
0695 {
0696 struct device *mgr_dev = class_find_device(fpga_mgr_class, NULL, dev,
0697 fpga_mgr_dev_match);
0698 if (!mgr_dev)
0699 return ERR_PTR(-ENODEV);
0700
0701 return __fpga_mgr_get(mgr_dev);
0702 }
0703 EXPORT_SYMBOL_GPL(fpga_mgr_get);
0704
0705
0706
0707
0708
0709
0710
0711
0712 struct fpga_manager *of_fpga_mgr_get(struct device_node *node)
0713 {
0714 struct device *dev;
0715
0716 dev = class_find_device_by_of_node(fpga_mgr_class, node);
0717 if (!dev)
0718 return ERR_PTR(-ENODEV);
0719
0720 return __fpga_mgr_get(dev);
0721 }
0722 EXPORT_SYMBOL_GPL(of_fpga_mgr_get);
0723
0724
0725
0726
0727
0728 void fpga_mgr_put(struct fpga_manager *mgr)
0729 {
0730 module_put(mgr->dev.parent->driver->owner);
0731 put_device(&mgr->dev);
0732 }
0733 EXPORT_SYMBOL_GPL(fpga_mgr_put);
0734
0735
0736
0737
0738
0739
0740
0741
0742
0743
0744
0745
0746
0747 int fpga_mgr_lock(struct fpga_manager *mgr)
0748 {
0749 if (!mutex_trylock(&mgr->ref_mutex)) {
0750 dev_err(&mgr->dev, "FPGA manager is in use.\n");
0751 return -EBUSY;
0752 }
0753
0754 return 0;
0755 }
0756 EXPORT_SYMBOL_GPL(fpga_mgr_lock);
0757
0758
0759
0760
0761
0762 void fpga_mgr_unlock(struct fpga_manager *mgr)
0763 {
0764 mutex_unlock(&mgr->ref_mutex);
0765 }
0766 EXPORT_SYMBOL_GPL(fpga_mgr_unlock);
0767
0768
0769
0770
0771
0772
0773
0774
0775
0776
0777
0778 struct fpga_manager *
0779 fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *info)
0780 {
0781 const struct fpga_manager_ops *mops = info->mops;
0782 struct fpga_manager *mgr;
0783 int id, ret;
0784
0785 if (!mops) {
0786 dev_err(parent, "Attempt to register without fpga_manager_ops\n");
0787 return ERR_PTR(-EINVAL);
0788 }
0789
0790 if (!info->name || !strlen(info->name)) {
0791 dev_err(parent, "Attempt to register with no name!\n");
0792 return ERR_PTR(-EINVAL);
0793 }
0794
0795 mgr = kzalloc(sizeof(*mgr), GFP_KERNEL);
0796 if (!mgr)
0797 return ERR_PTR(-ENOMEM);
0798
0799 id = ida_alloc(&fpga_mgr_ida, GFP_KERNEL);
0800 if (id < 0) {
0801 ret = id;
0802 goto error_kfree;
0803 }
0804
0805 mutex_init(&mgr->ref_mutex);
0806
0807 mgr->name = info->name;
0808 mgr->mops = info->mops;
0809 mgr->priv = info->priv;
0810 mgr->compat_id = info->compat_id;
0811
0812 mgr->dev.class = fpga_mgr_class;
0813 mgr->dev.groups = mops->groups;
0814 mgr->dev.parent = parent;
0815 mgr->dev.of_node = parent->of_node;
0816 mgr->dev.id = id;
0817
0818 ret = dev_set_name(&mgr->dev, "fpga%d", id);
0819 if (ret)
0820 goto error_device;
0821
0822
0823
0824
0825
0826
0827 mgr->state = fpga_mgr_state(mgr);
0828
0829 ret = device_register(&mgr->dev);
0830 if (ret) {
0831 put_device(&mgr->dev);
0832 return ERR_PTR(ret);
0833 }
0834
0835 return mgr;
0836
0837 error_device:
0838 ida_free(&fpga_mgr_ida, id);
0839 error_kfree:
0840 kfree(mgr);
0841
0842 return ERR_PTR(ret);
0843 }
0844 EXPORT_SYMBOL_GPL(fpga_mgr_register_full);
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860
0861 struct fpga_manager *
0862 fpga_mgr_register(struct device *parent, const char *name,
0863 const struct fpga_manager_ops *mops, void *priv)
0864 {
0865 struct fpga_manager_info info = { 0 };
0866
0867 info.name = name;
0868 info.mops = mops;
0869 info.priv = priv;
0870
0871 return fpga_mgr_register_full(parent, &info);
0872 }
0873 EXPORT_SYMBOL_GPL(fpga_mgr_register);
0874
0875
0876
0877
0878
0879
0880
0881 void fpga_mgr_unregister(struct fpga_manager *mgr)
0882 {
0883 dev_info(&mgr->dev, "%s %s\n", __func__, mgr->name);
0884
0885
0886
0887
0888
0889 fpga_mgr_fpga_remove(mgr);
0890
0891 device_unregister(&mgr->dev);
0892 }
0893 EXPORT_SYMBOL_GPL(fpga_mgr_unregister);
0894
0895 static void devm_fpga_mgr_unregister(struct device *dev, void *res)
0896 {
0897 struct fpga_mgr_devres *dr = res;
0898
0899 fpga_mgr_unregister(dr->mgr);
0900 }
0901
0902
0903
0904
0905
0906
0907
0908
0909
0910
0911
0912 struct fpga_manager *
0913 devm_fpga_mgr_register_full(struct device *parent, const struct fpga_manager_info *info)
0914 {
0915 struct fpga_mgr_devres *dr;
0916 struct fpga_manager *mgr;
0917
0918 dr = devres_alloc(devm_fpga_mgr_unregister, sizeof(*dr), GFP_KERNEL);
0919 if (!dr)
0920 return ERR_PTR(-ENOMEM);
0921
0922 mgr = fpga_mgr_register_full(parent, info);
0923 if (IS_ERR(mgr)) {
0924 devres_free(dr);
0925 return mgr;
0926 }
0927
0928 dr->mgr = mgr;
0929 devres_add(parent, dr);
0930
0931 return mgr;
0932 }
0933 EXPORT_SYMBOL_GPL(devm_fpga_mgr_register_full);
0934
0935
0936
0937
0938
0939
0940
0941
0942
0943
0944
0945
0946
0947
0948 struct fpga_manager *
0949 devm_fpga_mgr_register(struct device *parent, const char *name,
0950 const struct fpga_manager_ops *mops, void *priv)
0951 {
0952 struct fpga_manager_info info = { 0 };
0953
0954 info.name = name;
0955 info.mops = mops;
0956 info.priv = priv;
0957
0958 return devm_fpga_mgr_register_full(parent, &info);
0959 }
0960 EXPORT_SYMBOL_GPL(devm_fpga_mgr_register);
0961
0962 static void fpga_mgr_dev_release(struct device *dev)
0963 {
0964 struct fpga_manager *mgr = to_fpga_manager(dev);
0965
0966 ida_free(&fpga_mgr_ida, mgr->dev.id);
0967 kfree(mgr);
0968 }
0969
0970 static int __init fpga_mgr_class_init(void)
0971 {
0972 pr_info("FPGA manager framework\n");
0973
0974 fpga_mgr_class = class_create(THIS_MODULE, "fpga_manager");
0975 if (IS_ERR(fpga_mgr_class))
0976 return PTR_ERR(fpga_mgr_class);
0977
0978 fpga_mgr_class->dev_groups = fpga_mgr_groups;
0979 fpga_mgr_class->dev_release = fpga_mgr_dev_release;
0980
0981 return 0;
0982 }
0983
0984 static void __exit fpga_mgr_class_exit(void)
0985 {
0986 class_destroy(fpga_mgr_class);
0987 ida_destroy(&fpga_mgr_ida);
0988 }
0989
0990 MODULE_AUTHOR("Alan Tull <atull@kernel.org>");
0991 MODULE_DESCRIPTION("FPGA manager framework");
0992 MODULE_LICENSE("GPL v2");
0993
0994 subsys_initcall(fpga_mgr_class_init);
0995 module_exit(fpga_mgr_class_exit);