Lines Matching +full:fpga +full:- +full:mgr

1 // SPDX-License-Identifier: GPL-2.0
3 * FPGA Manager Core
5 * Copyright (C) 2013-2015 Altera Corporation
12 #include <linux/fpga/fpga-mgr.h>
25 struct fpga_manager *mgr; member
28 static inline void fpga_mgr_fpga_remove(struct fpga_manager *mgr) in fpga_mgr_fpga_remove() argument
30 if (mgr->mops->fpga_remove) in fpga_mgr_fpga_remove()
31 mgr->mops->fpga_remove(mgr); in fpga_mgr_fpga_remove()
34 static inline enum fpga_mgr_states fpga_mgr_state(struct fpga_manager *mgr) in fpga_mgr_state() argument
36 if (mgr->mops->state) in fpga_mgr_state()
37 return mgr->mops->state(mgr); in fpga_mgr_state()
41 static inline u64 fpga_mgr_status(struct fpga_manager *mgr) in fpga_mgr_status() argument
43 if (mgr->mops->status) in fpga_mgr_status()
44 return mgr->mops->status(mgr); in fpga_mgr_status()
48 static inline int fpga_mgr_write(struct fpga_manager *mgr, const char *buf, size_t count) in fpga_mgr_write() argument
50 if (mgr->mops->write) in fpga_mgr_write()
51 return mgr->mops->write(mgr, buf, count); in fpga_mgr_write()
52 return -EOPNOTSUPP; in fpga_mgr_write()
56 * After all the FPGA image has been written, do the device specific steps to
57 * finish and set the FPGA into operating mode.
59 static inline int fpga_mgr_write_complete(struct fpga_manager *mgr, in fpga_mgr_write_complete() argument
64 mgr->state = FPGA_MGR_STATE_WRITE_COMPLETE; in fpga_mgr_write_complete()
65 if (mgr->mops->write_complete) in fpga_mgr_write_complete()
66 ret = mgr->mops->write_complete(mgr, info); in fpga_mgr_write_complete()
68 dev_err(&mgr->dev, "Error after writing image data to FPGA\n"); in fpga_mgr_write_complete()
69 mgr->state = FPGA_MGR_STATE_WRITE_COMPLETE_ERR; in fpga_mgr_write_complete()
72 mgr->state = FPGA_MGR_STATE_OPERATING; in fpga_mgr_write_complete()
77 static inline int fpga_mgr_parse_header(struct fpga_manager *mgr, in fpga_mgr_parse_header() argument
81 if (mgr->mops->parse_header) in fpga_mgr_parse_header()
82 return mgr->mops->parse_header(mgr, info, buf, count); in fpga_mgr_parse_header()
86 static inline int fpga_mgr_write_init(struct fpga_manager *mgr, in fpga_mgr_write_init() argument
90 if (mgr->mops->write_init) in fpga_mgr_write_init()
91 return mgr->mops->write_init(mgr, info, buf, count); in fpga_mgr_write_init()
95 static inline int fpga_mgr_write_sg(struct fpga_manager *mgr, in fpga_mgr_write_sg() argument
98 if (mgr->mops->write_sg) in fpga_mgr_write_sg()
99 return mgr->mops->write_sg(mgr, sgt); in fpga_mgr_write_sg()
100 return -EOPNOTSUPP; in fpga_mgr_write_sg()
104 * fpga_image_info_alloc - Allocate an FPGA image info struct
121 info->dev = dev; in fpga_image_info_alloc()
128 * fpga_image_info_free - Free an FPGA image info struct
129 * @info: FPGA image info struct to free
138 dev = info->dev; in fpga_image_info_free()
139 if (info->firmware_name) in fpga_image_info_free()
140 devm_kfree(dev, info->firmware_name); in fpga_image_info_free()
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.
151 static int fpga_mgr_parse_header_mapped(struct fpga_manager *mgr, in fpga_mgr_parse_header_mapped() argument
157 mgr->state = FPGA_MGR_STATE_PARSE_HEADER; in fpga_mgr_parse_header_mapped()
158 ret = fpga_mgr_parse_header(mgr, info, buf, count); in fpga_mgr_parse_header_mapped()
160 if (info->header_size + info->data_size > count) { in fpga_mgr_parse_header_mapped()
161 dev_err(&mgr->dev, "Bitstream data outruns FPGA image\n"); in fpga_mgr_parse_header_mapped()
162 ret = -EINVAL; in fpga_mgr_parse_header_mapped()
166 dev_err(&mgr->dev, "Error while parsing FPGA image header\n"); in fpga_mgr_parse_header_mapped()
167 mgr->state = FPGA_MGR_STATE_PARSE_HEADER_ERR; in fpga_mgr_parse_header_mapped()
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
180 static int fpga_mgr_parse_header_sg_first(struct fpga_manager *mgr, in fpga_mgr_parse_header_sg_first() argument
187 mgr->state = FPGA_MGR_STATE_PARSE_HEADER; in fpga_mgr_parse_header_sg_first()
189 sg_miter_start(&miter, sgt->sgl, sgt->nents, SG_MITER_FROM_SG); in fpga_mgr_parse_header_sg_first()
191 miter.length >= info->header_size) in fpga_mgr_parse_header_sg_first()
192 ret = fpga_mgr_parse_header(mgr, info, miter.addr, miter.length); in fpga_mgr_parse_header_sg_first()
194 ret = -EAGAIN; in fpga_mgr_parse_header_sg_first()
197 if (ret && ret != -EAGAIN) { in fpga_mgr_parse_header_sg_first()
198 dev_err(&mgr->dev, "Error while parsing FPGA image header\n"); in fpga_mgr_parse_header_sg_first()
199 mgr->state = FPGA_MGR_STATE_PARSE_HEADER_ERR; in fpga_mgr_parse_header_sg_first()
206 * Copy scattered FPGA image fragments to temporary buffer and call the
208 * fpga_mgr_parse_header_sg_first() returned -EAGAIN. In case of success,
212 static void *fpga_mgr_parse_header_sg(struct fpga_manager *mgr, in fpga_mgr_parse_header_sg() argument
221 new_header_size = info->header_size; in fpga_mgr_parse_header_sg()
223 dev_err(&mgr->dev, "Requested invalid header size\n"); in fpga_mgr_parse_header_sg()
224 ret = -EFAULT; in fpga_mgr_parse_header_sg()
230 ret = -ENOMEM; in fpga_mgr_parse_header_sg()
236 len = sg_pcopy_to_buffer(sgt->sgl, sgt->nents, in fpga_mgr_parse_header_sg()
238 new_header_size - header_size, in fpga_mgr_parse_header_sg()
240 if (len != new_header_size - header_size) { in fpga_mgr_parse_header_sg()
241 ret = -EFAULT; in fpga_mgr_parse_header_sg()
246 ret = fpga_mgr_parse_header(mgr, info, buf, header_size); in fpga_mgr_parse_header_sg()
247 } while (ret == -EAGAIN); in fpga_mgr_parse_header_sg()
250 dev_err(&mgr->dev, "Error while parsing FPGA image header\n"); in fpga_mgr_parse_header_sg()
251 mgr->state = FPGA_MGR_STATE_PARSE_HEADER_ERR; in fpga_mgr_parse_header_sg()
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,
268 static int fpga_mgr_write_init_buf(struct fpga_manager *mgr, in fpga_mgr_write_init_buf() argument
272 size_t header_size = info->header_size; in fpga_mgr_write_init_buf()
275 mgr->state = FPGA_MGR_STATE_WRITE_INIT; in fpga_mgr_write_init_buf()
278 ret = -EINVAL; in fpga_mgr_write_init_buf()
280 ret = fpga_mgr_write_init(mgr, info, NULL, 0); in fpga_mgr_write_init_buf()
282 ret = fpga_mgr_write_init(mgr, info, buf, count); in fpga_mgr_write_init_buf()
285 dev_err(&mgr->dev, "Error preparing FPGA for writing\n"); in fpga_mgr_write_init_buf()
286 mgr->state = FPGA_MGR_STATE_WRITE_INIT_ERR; in fpga_mgr_write_init_buf()
293 static int fpga_mgr_prepare_sg(struct fpga_manager *mgr, in fpga_mgr_prepare_sg() argument
303 if (!mgr->mops->initial_header_size && !mgr->mops->parse_header) in fpga_mgr_prepare_sg()
304 return fpga_mgr_write_init_buf(mgr, info, NULL, 0); in fpga_mgr_prepare_sg()
310 ret = fpga_mgr_parse_header_sg_first(mgr, info, sgt); in fpga_mgr_prepare_sg()
313 sg_miter_start(&miter, sgt->sgl, sgt->nents, SG_MITER_FROM_SG); in fpga_mgr_prepare_sg()
315 ret = fpga_mgr_write_init_buf(mgr, info, miter.addr, in fpga_mgr_prepare_sg()
322 * If -EAGAIN, more sg buffer is needed, in fpga_mgr_prepare_sg()
325 } else if (ret != -EAGAIN) { in fpga_mgr_prepare_sg()
333 buf = fpga_mgr_parse_header_sg(mgr, info, sgt, &len); in fpga_mgr_prepare_sg()
337 ret = fpga_mgr_write_init_buf(mgr, info, buf, len); in fpga_mgr_prepare_sg()
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
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
356 * This is the preferred entry point for FPGA programming, it does not require
361 static int fpga_mgr_buf_load_sg(struct fpga_manager *mgr, in fpga_mgr_buf_load_sg() argument
367 ret = fpga_mgr_prepare_sg(mgr, info, sgt); in fpga_mgr_buf_load_sg()
371 /* Write the FPGA image to the FPGA. */ in fpga_mgr_buf_load_sg()
372 mgr->state = FPGA_MGR_STATE_WRITE; in fpga_mgr_buf_load_sg()
373 if (mgr->mops->write_sg) { in fpga_mgr_buf_load_sg()
374 ret = fpga_mgr_write_sg(mgr, sgt); in fpga_mgr_buf_load_sg()
376 size_t length, count = 0, data_size = info->data_size; in fpga_mgr_buf_load_sg()
379 sg_miter_start(&miter, sgt->sgl, sgt->nents, SG_MITER_FROM_SG); in fpga_mgr_buf_load_sg()
381 if (mgr->mops->skip_header && in fpga_mgr_buf_load_sg()
382 !sg_miter_skip(&miter, info->header_size)) { in fpga_mgr_buf_load_sg()
383 ret = -EINVAL; in fpga_mgr_buf_load_sg()
389 length = min(miter.length, data_size - count); in fpga_mgr_buf_load_sg()
393 ret = fpga_mgr_write(mgr, miter.addr, length); in fpga_mgr_buf_load_sg()
406 dev_err(&mgr->dev, "Error while writing image data to FPGA\n"); in fpga_mgr_buf_load_sg()
407 mgr->state = FPGA_MGR_STATE_WRITE_ERR; in fpga_mgr_buf_load_sg()
411 return fpga_mgr_write_complete(mgr, info); in fpga_mgr_buf_load_sg()
414 static int fpga_mgr_buf_load_mapped(struct fpga_manager *mgr, in fpga_mgr_buf_load_mapped() argument
420 ret = fpga_mgr_parse_header_mapped(mgr, info, buf, count); in fpga_mgr_buf_load_mapped()
424 ret = fpga_mgr_write_init_buf(mgr, info, buf, count); in fpga_mgr_buf_load_mapped()
428 if (mgr->mops->skip_header) { in fpga_mgr_buf_load_mapped()
429 buf += info->header_size; in fpga_mgr_buf_load_mapped()
430 count -= info->header_size; in fpga_mgr_buf_load_mapped()
433 if (info->data_size) in fpga_mgr_buf_load_mapped()
434 count = info->data_size; in fpga_mgr_buf_load_mapped()
437 * Write the FPGA image to the FPGA. in fpga_mgr_buf_load_mapped()
439 mgr->state = FPGA_MGR_STATE_WRITE; in fpga_mgr_buf_load_mapped()
440 ret = fpga_mgr_write(mgr, buf, count); in fpga_mgr_buf_load_mapped()
442 dev_err(&mgr->dev, "Error while writing image data to FPGA\n"); in fpga_mgr_buf_load_mapped()
443 mgr->state = FPGA_MGR_STATE_WRITE_ERR; in fpga_mgr_buf_load_mapped()
447 return fpga_mgr_write_complete(mgr, info); in fpga_mgr_buf_load_mapped()
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
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.
464 static int fpga_mgr_buf_load(struct fpga_manager *mgr, in fpga_mgr_buf_load() argument
477 * contiguous kernel buffer and the driver doesn't require SG, non-SG in fpga_mgr_buf_load()
480 if (mgr->mops->write) in fpga_mgr_buf_load()
481 return fpga_mgr_buf_load_mapped(mgr, info, buf, count); in fpga_mgr_buf_load()
487 nr_pages = DIV_ROUND_UP((unsigned long)buf + count, PAGE_SIZE) - in fpga_mgr_buf_load()
491 return -ENOMEM; in fpga_mgr_buf_load()
493 p = buf - offset_in_page(buf); in fpga_mgr_buf_load()
501 return -EFAULT; in fpga_mgr_buf_load()
516 rc = fpga_mgr_buf_load_sg(mgr, info, &sgt); in fpga_mgr_buf_load()
523 * fpga_mgr_firmware_load - request firmware and load to fpga
524 * @mgr: fpga manager
525 * @info: fpga image specific information
528 * Request an FPGA image using the firmware class, then write out to the FPGA.
530 * there is a failure. This code assumes the caller got the mgr pointer
536 static int fpga_mgr_firmware_load(struct fpga_manager *mgr, in fpga_mgr_firmware_load() argument
540 struct device *dev = &mgr->dev; in fpga_mgr_firmware_load()
544 dev_info(dev, "writing %s to %s\n", image_name, mgr->name); in fpga_mgr_firmware_load()
546 mgr->state = FPGA_MGR_STATE_FIRMWARE_REQ; in fpga_mgr_firmware_load()
550 mgr->state = FPGA_MGR_STATE_FIRMWARE_REQ_ERR; in fpga_mgr_firmware_load()
555 ret = fpga_mgr_buf_load(mgr, info, fw->data, fw->size); in fpga_mgr_firmware_load()
563 * fpga_mgr_load - load FPGA from scatter/gather table, buffer, or firmware
564 * @mgr: fpga manager
565 * @info: fpga image information.
567 * Load the FPGA from an image which is indicated in @info. If successful, the
568 * FPGA ends up in operating mode.
572 int fpga_mgr_load(struct fpga_manager *mgr, struct fpga_image_info *info) in fpga_mgr_load() argument
574 info->header_size = mgr->mops->initial_header_size; in fpga_mgr_load()
576 if (info->sgt) in fpga_mgr_load()
577 return fpga_mgr_buf_load_sg(mgr, info, info->sgt); in fpga_mgr_load()
578 if (info->buf && info->count) in fpga_mgr_load()
579 return fpga_mgr_buf_load(mgr, info, info->buf, info->count); in fpga_mgr_load()
580 if (info->firmware_name) in fpga_mgr_load()
581 return fpga_mgr_firmware_load(mgr, info, info->firmware_name); in fpga_mgr_load()
582 return -EINVAL; in fpga_mgr_load()
592 /* requesting FPGA image from firmware */
596 /* Parse FPGA image header */
600 /* Preparing FPGA to receive image */
604 /* Writing image to FPGA */
612 /* FPGA reports to be in normal operating mode */
619 struct fpga_manager *mgr = to_fpga_manager(dev); in name_show() local
621 return sprintf(buf, "%s\n", mgr->name); in name_show()
627 struct fpga_manager *mgr = to_fpga_manager(dev); in state_show() local
629 return sprintf(buf, "%s\n", state_str[mgr->state]); in state_show()
635 struct fpga_manager *mgr = to_fpga_manager(dev); in status_show() local
639 status = fpga_mgr_status(mgr); in status_show()
669 struct fpga_manager *mgr; in __fpga_mgr_get() local
671 mgr = to_fpga_manager(dev); in __fpga_mgr_get()
673 if (!try_module_get(dev->parent->driver->owner)) in __fpga_mgr_get()
676 return mgr; in __fpga_mgr_get()
680 return ERR_PTR(-ENODEV); in __fpga_mgr_get()
685 return dev->parent == data; in fpga_mgr_dev_match()
689 * fpga_mgr_get - Given a device, get a reference to an fpga mgr.
690 * @dev: parent device that fpga mgr was registered with
692 * Return: fpga manager struct or IS_ERR() condition containing error code.
699 return ERR_PTR(-ENODEV); in fpga_mgr_get()
706 * of_fpga_mgr_get - Given a device node, get a reference to an fpga mgr.
710 * Return: fpga manager struct or IS_ERR() condition containing error code.
718 return ERR_PTR(-ENODEV); in of_fpga_mgr_get()
725 * fpga_mgr_put - release a reference to an fpga manager
726 * @mgr: fpga manager structure
728 void fpga_mgr_put(struct fpga_manager *mgr) in fpga_mgr_put() argument
730 module_put(mgr->dev.parent->driver->owner); in fpga_mgr_put()
731 put_device(&mgr->dev); in fpga_mgr_put()
736 * fpga_mgr_lock - Lock FPGA manager for exclusive use
737 * @mgr: fpga manager
739 * Given a pointer to FPGA Manager (from fpga_mgr_get() or
742 * program the FPGA. Likewise, the user should call fpga_mgr_unlock
743 * when done programming the FPGA.
745 * Return: 0 for success or -EBUSY
747 int fpga_mgr_lock(struct fpga_manager *mgr) in fpga_mgr_lock() argument
749 if (!mutex_trylock(&mgr->ref_mutex)) { in fpga_mgr_lock()
750 dev_err(&mgr->dev, "FPGA manager is in use.\n"); in fpga_mgr_lock()
751 return -EBUSY; in fpga_mgr_lock()
759 * fpga_mgr_unlock - Unlock FPGA manager after done programming
760 * @mgr: fpga manager
762 void fpga_mgr_unlock(struct fpga_manager *mgr) in fpga_mgr_unlock() argument
764 mutex_unlock(&mgr->ref_mutex); in fpga_mgr_unlock()
769 * fpga_mgr_register_full - create and register an FPGA Manager device
770 * @parent: fpga manager device from pdev
771 * @info: parameters for fpga manager
781 const struct fpga_manager_ops *mops = info->mops; in fpga_mgr_register_full()
782 struct fpga_manager *mgr; in fpga_mgr_register_full() local
787 return ERR_PTR(-EINVAL); in fpga_mgr_register_full()
790 if (!info->name || !strlen(info->name)) { in fpga_mgr_register_full()
792 return ERR_PTR(-EINVAL); in fpga_mgr_register_full()
795 mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); in fpga_mgr_register_full()
796 if (!mgr) in fpga_mgr_register_full()
797 return ERR_PTR(-ENOMEM); in fpga_mgr_register_full()
805 mutex_init(&mgr->ref_mutex); in fpga_mgr_register_full()
807 mgr->name = info->name; in fpga_mgr_register_full()
808 mgr->mops = info->mops; in fpga_mgr_register_full()
809 mgr->priv = info->priv; in fpga_mgr_register_full()
810 mgr->compat_id = info->compat_id; in fpga_mgr_register_full()
812 mgr->dev.class = &fpga_mgr_class; in fpga_mgr_register_full()
813 mgr->dev.groups = mops->groups; in fpga_mgr_register_full()
814 mgr->dev.parent = parent; in fpga_mgr_register_full()
815 mgr->dev.of_node = parent->of_node; in fpga_mgr_register_full()
816 mgr->dev.id = id; in fpga_mgr_register_full()
818 ret = dev_set_name(&mgr->dev, "fpga%d", id); in fpga_mgr_register_full()
824 * from device. FPGA may be in reset mode or may have been programmed in fpga_mgr_register_full()
827 mgr->state = fpga_mgr_state(mgr); in fpga_mgr_register_full()
829 ret = device_register(&mgr->dev); in fpga_mgr_register_full()
831 put_device(&mgr->dev); in fpga_mgr_register_full()
835 return mgr; in fpga_mgr_register_full()
840 kfree(mgr); in fpga_mgr_register_full()
847 * fpga_mgr_register - create and register an FPGA Manager device
848 * @parent: fpga manager device from pdev
849 * @name: fpga manager name
850 * @mops: pointer to structure of fpga manager ops
851 * @priv: fpga manager private data
876 * fpga_mgr_unregister - unregister an FPGA manager
877 * @mgr: fpga manager struct
879 * This function is intended for use in an FPGA manager driver's remove function.
881 void fpga_mgr_unregister(struct fpga_manager *mgr) in fpga_mgr_unregister() argument
883 dev_info(&mgr->dev, "%s %s\n", __func__, mgr->name); in fpga_mgr_unregister()
886 * If the low level driver provides a method for putting fpga into in fpga_mgr_unregister()
889 fpga_mgr_fpga_remove(mgr); in fpga_mgr_unregister()
891 device_unregister(&mgr->dev); in fpga_mgr_unregister()
899 fpga_mgr_unregister(dr->mgr); in devm_fpga_mgr_unregister()
903 * devm_fpga_mgr_register_full - resource managed variant of fpga_mgr_register()
904 * @parent: fpga manager device from pdev
905 * @info: parameters for fpga manager
907 * Return: fpga manager pointer on success, negative error code otherwise.
916 struct fpga_manager *mgr; in devm_fpga_mgr_register_full() local
920 return ERR_PTR(-ENOMEM); in devm_fpga_mgr_register_full()
922 mgr = fpga_mgr_register_full(parent, info); in devm_fpga_mgr_register_full()
923 if (IS_ERR(mgr)) { in devm_fpga_mgr_register_full()
925 return mgr; in devm_fpga_mgr_register_full()
928 dr->mgr = mgr; in devm_fpga_mgr_register_full()
931 return mgr; in devm_fpga_mgr_register_full()
936 * devm_fpga_mgr_register - resource managed variant of fpga_mgr_register()
937 * @parent: fpga manager device from pdev
938 * @name: fpga manager name
939 * @mops: pointer to structure of fpga manager ops
940 * @priv: fpga manager private data
942 * Return: fpga manager pointer on success, negative error code otherwise.
964 struct fpga_manager *mgr = to_fpga_manager(dev); in fpga_mgr_dev_release() local
966 ida_free(&fpga_mgr_ida, mgr->dev.id); in fpga_mgr_dev_release()
967 kfree(mgr); in fpga_mgr_dev_release()
978 pr_info("FPGA manager framework\n"); in fpga_mgr_class_init()
990 MODULE_DESCRIPTION("FPGA manager framework");