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(mgr_dev); in __fpga_mgr_get()
673 if (!try_module_get(mgr->mops_owner)) in __fpga_mgr_get()
674 mgr = ERR_PTR(-ENODEV); in __fpga_mgr_get()
676 return mgr; in __fpga_mgr_get()
681 return dev->parent == data; in fpga_mgr_dev_match()
685 * fpga_mgr_get - Given a device, get a reference to an fpga mgr.
686 * @dev: parent device that fpga mgr was registered with
688 * Return: fpga manager struct or IS_ERR() condition containing error code.
692 struct fpga_manager *mgr; in fpga_mgr_get() local
697 return ERR_PTR(-ENODEV); in fpga_mgr_get()
699 mgr = __fpga_mgr_get(mgr_dev); in fpga_mgr_get()
700 if (IS_ERR(mgr)) in fpga_mgr_get()
703 return mgr; in fpga_mgr_get()
708 * of_fpga_mgr_get - Given a device node, get a reference to an fpga mgr.
712 * Return: fpga manager struct or IS_ERR() condition containing error code.
716 struct fpga_manager *mgr; in of_fpga_mgr_get() local
721 return ERR_PTR(-ENODEV); in of_fpga_mgr_get()
723 mgr = __fpga_mgr_get(mgr_dev); in of_fpga_mgr_get()
724 if (IS_ERR(mgr)) in of_fpga_mgr_get()
727 return mgr; in of_fpga_mgr_get()
732 * fpga_mgr_put - release a reference to an fpga manager
733 * @mgr: fpga manager structure
735 void fpga_mgr_put(struct fpga_manager *mgr) in fpga_mgr_put() argument
737 module_put(mgr->mops_owner); in fpga_mgr_put()
738 put_device(&mgr->dev); in fpga_mgr_put()
743 * fpga_mgr_lock - Lock FPGA manager for exclusive use
744 * @mgr: fpga manager
746 * Given a pointer to FPGA Manager (from fpga_mgr_get() or
749 * program the FPGA. Likewise, the user should call fpga_mgr_unlock
750 * when done programming the FPGA.
752 * Return: 0 for success or -EBUSY
754 int fpga_mgr_lock(struct fpga_manager *mgr) in fpga_mgr_lock() argument
756 if (!mutex_trylock(&mgr->ref_mutex)) { in fpga_mgr_lock()
757 dev_err(&mgr->dev, "FPGA manager is in use.\n"); in fpga_mgr_lock()
758 return -EBUSY; in fpga_mgr_lock()
766 * fpga_mgr_unlock - Unlock FPGA manager after done programming
767 * @mgr: fpga manager
769 void fpga_mgr_unlock(struct fpga_manager *mgr) in fpga_mgr_unlock() argument
771 mutex_unlock(&mgr->ref_mutex); in fpga_mgr_unlock()
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
790 const struct fpga_manager_ops *mops = info->mops; in __fpga_mgr_register_full()
791 struct fpga_manager *mgr; in __fpga_mgr_register_full() local
796 return ERR_PTR(-EINVAL); in __fpga_mgr_register_full()
799 if (!info->name || !strlen(info->name)) { in __fpga_mgr_register_full()
801 return ERR_PTR(-EINVAL); in __fpga_mgr_register_full()
804 mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); in __fpga_mgr_register_full()
805 if (!mgr) in __fpga_mgr_register_full()
806 return ERR_PTR(-ENOMEM); in __fpga_mgr_register_full()
814 mutex_init(&mgr->ref_mutex); in __fpga_mgr_register_full()
816 mgr->mops_owner = owner; in __fpga_mgr_register_full()
818 mgr->name = info->name; in __fpga_mgr_register_full()
819 mgr->mops = info->mops; in __fpga_mgr_register_full()
820 mgr->priv = info->priv; in __fpga_mgr_register_full()
821 mgr->compat_id = info->compat_id; in __fpga_mgr_register_full()
823 mgr->dev.class = &fpga_mgr_class; in __fpga_mgr_register_full()
824 mgr->dev.groups = mops->groups; in __fpga_mgr_register_full()
825 mgr->dev.parent = parent; in __fpga_mgr_register_full()
826 mgr->dev.of_node = parent->of_node; in __fpga_mgr_register_full()
827 mgr->dev.id = id; in __fpga_mgr_register_full()
829 ret = dev_set_name(&mgr->dev, "fpga%d", id); in __fpga_mgr_register_full()
835 * from device. FPGA may be in reset mode or may have been programmed in __fpga_mgr_register_full()
838 mgr->state = fpga_mgr_state(mgr); in __fpga_mgr_register_full()
840 ret = device_register(&mgr->dev); in __fpga_mgr_register_full()
842 put_device(&mgr->dev); in __fpga_mgr_register_full()
846 return mgr; in __fpga_mgr_register_full()
851 kfree(mgr); in __fpga_mgr_register_full()
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
888 * fpga_mgr_unregister - unregister an FPGA manager
889 * @mgr: fpga manager struct
891 * This function is intended for use in an FPGA manager driver's remove function.
893 void fpga_mgr_unregister(struct fpga_manager *mgr) in fpga_mgr_unregister() argument
895 dev_info(&mgr->dev, "%s %s\n", __func__, mgr->name); in fpga_mgr_unregister()
898 * If the low level driver provides a method for putting fpga into in fpga_mgr_unregister()
901 fpga_mgr_fpga_remove(mgr); in fpga_mgr_unregister()
903 device_unregister(&mgr->dev); in fpga_mgr_unregister()
911 fpga_mgr_unregister(dr->mgr); in devm_fpga_mgr_unregister()
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
920 * Return: fpga manager pointer on success, negative error code otherwise.
930 struct fpga_manager *mgr; in __devm_fpga_mgr_register_full() local
934 return ERR_PTR(-ENOMEM); in __devm_fpga_mgr_register_full()
936 mgr = __fpga_mgr_register_full(parent, info, owner); in __devm_fpga_mgr_register_full()
937 if (IS_ERR(mgr)) { in __devm_fpga_mgr_register_full()
939 return mgr; in __devm_fpga_mgr_register_full()
942 dr->mgr = mgr; in __devm_fpga_mgr_register_full()
945 return mgr; in __devm_fpga_mgr_register_full()
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
957 * Return: fpga manager pointer on success, negative error code otherwise.
980 struct fpga_manager *mgr = to_fpga_manager(dev); in fpga_mgr_dev_release() local
982 ida_free(&fpga_mgr_ida, mgr->dev.id); in fpga_mgr_dev_release()
983 kfree(mgr); in fpga_mgr_dev_release()
994 pr_info("FPGA manager framework\n"); in fpga_mgr_class_init()
1006 MODULE_DESCRIPTION("FPGA manager framework");