• Home
  • Raw
  • Download

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 * fpga_image_info_alloc - Allocate a FPGA image info struct
42 info->dev = dev; in fpga_image_info_alloc()
49 * fpga_image_info_free - Free a FPGA image info struct
50 * @info: FPGA image info struct to free
59 dev = info->dev; in fpga_image_info_free()
60 if (info->firmware_name) in fpga_image_info_free()
61 devm_kfree(dev, info->firmware_name); in fpga_image_info_free()
70 * device-specific things to get the FPGA into the state where it is ready to
71 * receive an FPGA image. The low level driver only gets to see the first
74 static int fpga_mgr_write_init_buf(struct fpga_manager *mgr, in fpga_mgr_write_init_buf() argument
80 mgr->state = FPGA_MGR_STATE_WRITE_INIT; in fpga_mgr_write_init_buf()
81 if (!mgr->mops->initial_header_size) in fpga_mgr_write_init_buf()
82 ret = mgr->mops->write_init(mgr, info, NULL, 0); in fpga_mgr_write_init_buf()
84 ret = mgr->mops->write_init( in fpga_mgr_write_init_buf()
85 mgr, info, buf, min(mgr->mops->initial_header_size, count)); in fpga_mgr_write_init_buf()
88 dev_err(&mgr->dev, "Error preparing FPGA for writing\n"); in fpga_mgr_write_init_buf()
89 mgr->state = FPGA_MGR_STATE_WRITE_INIT_ERR; in fpga_mgr_write_init_buf()
96 static int fpga_mgr_write_init_sg(struct fpga_manager *mgr, in fpga_mgr_write_init_sg() argument
105 if (!mgr->mops->initial_header_size) in fpga_mgr_write_init_sg()
106 return fpga_mgr_write_init_buf(mgr, info, NULL, 0); in fpga_mgr_write_init_sg()
112 sg_miter_start(&miter, sgt->sgl, sgt->nents, SG_MITER_FROM_SG); in fpga_mgr_write_init_sg()
114 miter.length >= mgr->mops->initial_header_size) { in fpga_mgr_write_init_sg()
115 ret = fpga_mgr_write_init_buf(mgr, info, miter.addr, in fpga_mgr_write_init_sg()
123 buf = kmalloc(mgr->mops->initial_header_size, GFP_KERNEL); in fpga_mgr_write_init_sg()
125 return -ENOMEM; in fpga_mgr_write_init_sg()
127 len = sg_copy_to_buffer(sgt->sgl, sgt->nents, buf, in fpga_mgr_write_init_sg()
128 mgr->mops->initial_header_size); in fpga_mgr_write_init_sg()
129 ret = fpga_mgr_write_init_buf(mgr, info, buf, len); in fpga_mgr_write_init_sg()
137 * After all the FPGA image has been written, do the device specific steps to
138 * finish and set the FPGA into operating mode.
140 static int fpga_mgr_write_complete(struct fpga_manager *mgr, in fpga_mgr_write_complete() argument
145 mgr->state = FPGA_MGR_STATE_WRITE_COMPLETE; in fpga_mgr_write_complete()
146 ret = mgr->mops->write_complete(mgr, info); in fpga_mgr_write_complete()
148 dev_err(&mgr->dev, "Error after writing image data to FPGA\n"); in fpga_mgr_write_complete()
149 mgr->state = FPGA_MGR_STATE_WRITE_COMPLETE_ERR; in fpga_mgr_write_complete()
152 mgr->state = FPGA_MGR_STATE_OPERATING; in fpga_mgr_write_complete()
158 * fpga_mgr_buf_load_sg - load fpga from image in buffer from a scatter list
159 * @mgr: fpga manager
160 * @info: fpga image specific information
163 * Step the low level fpga manager through the device-specific steps of getting
164 * an FPGA ready to be configured, writing the image to it, then doing whatever
165 * post-configuration steps necessary. This code assumes the caller got the
166 * mgr pointer from of_fpga_mgr_get() or fpga_mgr_get() and checked that it is
169 * This is the preferred entry point for FPGA programming, it does not require
174 static int fpga_mgr_buf_load_sg(struct fpga_manager *mgr, in fpga_mgr_buf_load_sg() argument
180 ret = fpga_mgr_write_init_sg(mgr, info, sgt); in fpga_mgr_buf_load_sg()
184 /* Write the FPGA image to the FPGA. */ in fpga_mgr_buf_load_sg()
185 mgr->state = FPGA_MGR_STATE_WRITE; in fpga_mgr_buf_load_sg()
186 if (mgr->mops->write_sg) { in fpga_mgr_buf_load_sg()
187 ret = mgr->mops->write_sg(mgr, sgt); in fpga_mgr_buf_load_sg()
191 sg_miter_start(&miter, sgt->sgl, sgt->nents, SG_MITER_FROM_SG); in fpga_mgr_buf_load_sg()
193 ret = mgr->mops->write(mgr, miter.addr, miter.length); in fpga_mgr_buf_load_sg()
201 dev_err(&mgr->dev, "Error while writing image data to FPGA\n"); in fpga_mgr_buf_load_sg()
202 mgr->state = FPGA_MGR_STATE_WRITE_ERR; in fpga_mgr_buf_load_sg()
206 return fpga_mgr_write_complete(mgr, info); in fpga_mgr_buf_load_sg()
209 static int fpga_mgr_buf_load_mapped(struct fpga_manager *mgr, in fpga_mgr_buf_load_mapped() argument
215 ret = fpga_mgr_write_init_buf(mgr, info, buf, count); in fpga_mgr_buf_load_mapped()
220 * Write the FPGA image to the FPGA. in fpga_mgr_buf_load_mapped()
222 mgr->state = FPGA_MGR_STATE_WRITE; in fpga_mgr_buf_load_mapped()
223 ret = mgr->mops->write(mgr, buf, count); in fpga_mgr_buf_load_mapped()
225 dev_err(&mgr->dev, "Error while writing image data to FPGA\n"); in fpga_mgr_buf_load_mapped()
226 mgr->state = FPGA_MGR_STATE_WRITE_ERR; in fpga_mgr_buf_load_mapped()
230 return fpga_mgr_write_complete(mgr, info); in fpga_mgr_buf_load_mapped()
234 * fpga_mgr_buf_load - load fpga from image in buffer
235 * @mgr: fpga manager
236 * @info: fpga image info
237 * @buf: buffer contain fpga image
240 * Step the low level fpga manager through the device-specific steps of getting
241 * an FPGA ready to be configured, writing the image to it, then doing whatever
242 * post-configuration steps necessary. This code assumes the caller got the
243 * mgr pointer from of_fpga_mgr_get() and checked that it is not an error code.
247 static int fpga_mgr_buf_load(struct fpga_manager *mgr, in fpga_mgr_buf_load() argument
260 * contiguous kernel buffer and the driver doesn't require SG, non-SG in fpga_mgr_buf_load()
263 if (mgr->mops->write) in fpga_mgr_buf_load()
264 return fpga_mgr_buf_load_mapped(mgr, info, buf, count); in fpga_mgr_buf_load()
270 nr_pages = DIV_ROUND_UP((unsigned long)buf + count, PAGE_SIZE) - in fpga_mgr_buf_load()
274 return -ENOMEM; in fpga_mgr_buf_load()
276 p = buf - offset_in_page(buf); in fpga_mgr_buf_load()
284 return -EFAULT; in fpga_mgr_buf_load()
299 rc = fpga_mgr_buf_load_sg(mgr, info, &sgt); in fpga_mgr_buf_load()
306 * fpga_mgr_firmware_load - request firmware and load to fpga
307 * @mgr: fpga manager
308 * @info: fpga image specific information
311 * Request an FPGA image using the firmware class, then write out to the FPGA.
313 * there is a failure. This code assumes the caller got the mgr pointer
319 static int fpga_mgr_firmware_load(struct fpga_manager *mgr, in fpga_mgr_firmware_load() argument
323 struct device *dev = &mgr->dev; in fpga_mgr_firmware_load()
327 dev_info(dev, "writing %s to %s\n", image_name, mgr->name); in fpga_mgr_firmware_load()
329 mgr->state = FPGA_MGR_STATE_FIRMWARE_REQ; in fpga_mgr_firmware_load()
333 mgr->state = FPGA_MGR_STATE_FIRMWARE_REQ_ERR; in fpga_mgr_firmware_load()
338 ret = fpga_mgr_buf_load(mgr, info, fw->data, fw->size); in fpga_mgr_firmware_load()
346 * fpga_mgr_load - load FPGA from scatter/gather table, buffer, or firmware
347 * @mgr: fpga manager
348 * @info: fpga image information.
350 * Load the FPGA from an image which is indicated in @info. If successful, the
351 * FPGA ends up in operating mode.
355 int fpga_mgr_load(struct fpga_manager *mgr, struct fpga_image_info *info) in fpga_mgr_load() argument
357 if (info->sgt) in fpga_mgr_load()
358 return fpga_mgr_buf_load_sg(mgr, info, info->sgt); in fpga_mgr_load()
359 if (info->buf && info->count) in fpga_mgr_load()
360 return fpga_mgr_buf_load(mgr, info, info->buf, info->count); in fpga_mgr_load()
361 if (info->firmware_name) in fpga_mgr_load()
362 return fpga_mgr_firmware_load(mgr, info, info->firmware_name); in fpga_mgr_load()
363 return -EINVAL; in fpga_mgr_load()
373 /* requesting FPGA image from firmware */
377 /* Preparing FPGA to receive image */
381 /* Writing image to FPGA */
389 /* FPGA reports to be in normal operating mode */
396 struct fpga_manager *mgr = to_fpga_manager(dev); in name_show() local
398 return sprintf(buf, "%s\n", mgr->name); in name_show()
404 struct fpga_manager *mgr = to_fpga_manager(dev); in state_show() local
406 return sprintf(buf, "%s\n", state_str[mgr->state]); in state_show()
412 struct fpga_manager *mgr = to_fpga_manager(dev); in status_show() local
416 if (!mgr->mops->status) in status_show()
417 return -ENOENT; in status_show()
419 status = mgr->mops->status(mgr); in status_show()
449 struct fpga_manager *mgr; in __fpga_mgr_get() local
451 mgr = to_fpga_manager(dev); in __fpga_mgr_get()
453 if (!try_module_get(dev->parent->driver->owner)) in __fpga_mgr_get()
456 return mgr; in __fpga_mgr_get()
460 return ERR_PTR(-ENODEV); in __fpga_mgr_get()
465 return dev->parent == data; in fpga_mgr_dev_match()
469 * fpga_mgr_get - Given a device, get a reference to a fpga mgr.
470 * @dev: parent device that fpga mgr was registered with
472 * Return: fpga manager struct or IS_ERR() condition containing error code.
479 return ERR_PTR(-ENODEV); in fpga_mgr_get()
486 * of_fpga_mgr_get - Given a device node, get a reference to a fpga mgr.
490 * Return: fpga manager struct or IS_ERR() condition containing error code.
498 return ERR_PTR(-ENODEV); in of_fpga_mgr_get()
505 * fpga_mgr_put - release a reference to a fpga manager
506 * @mgr: fpga manager structure
508 void fpga_mgr_put(struct fpga_manager *mgr) in fpga_mgr_put() argument
510 module_put(mgr->dev.parent->driver->owner); in fpga_mgr_put()
511 put_device(&mgr->dev); in fpga_mgr_put()
516 * fpga_mgr_lock - Lock FPGA manager for exclusive use
517 * @mgr: fpga manager
519 * Given a pointer to FPGA Manager (from fpga_mgr_get() or
522 * program the FPGA. Likewise, the user should call fpga_mgr_unlock
523 * when done programming the FPGA.
525 * Return: 0 for success or -EBUSY
527 int fpga_mgr_lock(struct fpga_manager *mgr) in fpga_mgr_lock() argument
529 if (!mutex_trylock(&mgr->ref_mutex)) { in fpga_mgr_lock()
530 dev_err(&mgr->dev, "FPGA manager is in use.\n"); in fpga_mgr_lock()
531 return -EBUSY; in fpga_mgr_lock()
539 * fpga_mgr_unlock - Unlock FPGA manager after done programming
540 * @mgr: fpga manager
542 void fpga_mgr_unlock(struct fpga_manager *mgr) in fpga_mgr_unlock() argument
544 mutex_unlock(&mgr->ref_mutex); in fpga_mgr_unlock()
549 * fpga_mgr_create - create and initialize a FPGA manager struct
550 * @dev: fpga manager device from pdev
551 * @name: fpga manager name
552 * @mops: pointer to structure of fpga manager ops
553 * @priv: fpga manager private data
564 struct fpga_manager *mgr; in fpga_mgr_create() local
567 if (!mops || !mops->write_complete || !mops->state || in fpga_mgr_create()
568 !mops->write_init || (!mops->write && !mops->write_sg) || in fpga_mgr_create()
569 (mops->write && mops->write_sg)) { in fpga_mgr_create()
579 mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); in fpga_mgr_create()
580 if (!mgr) in fpga_mgr_create()
587 mutex_init(&mgr->ref_mutex); in fpga_mgr_create()
589 mgr->name = name; in fpga_mgr_create()
590 mgr->mops = mops; in fpga_mgr_create()
591 mgr->priv = priv; in fpga_mgr_create()
593 device_initialize(&mgr->dev); in fpga_mgr_create()
594 mgr->dev.class = fpga_mgr_class; in fpga_mgr_create()
595 mgr->dev.groups = mops->groups; in fpga_mgr_create()
596 mgr->dev.parent = dev; in fpga_mgr_create()
597 mgr->dev.of_node = dev->of_node; in fpga_mgr_create()
598 mgr->dev.id = id; in fpga_mgr_create()
600 ret = dev_set_name(&mgr->dev, "fpga%d", id); in fpga_mgr_create()
604 return mgr; in fpga_mgr_create()
609 kfree(mgr); in fpga_mgr_create()
616 * fpga_mgr_free - free a FPGA manager created with fpga_mgr_create()
617 * @mgr: fpga manager struct
619 void fpga_mgr_free(struct fpga_manager *mgr) in fpga_mgr_free() argument
621 ida_simple_remove(&fpga_mgr_ida, mgr->dev.id); in fpga_mgr_free()
622 kfree(mgr); in fpga_mgr_free()
628 struct fpga_manager *mgr = *(struct fpga_manager **)res; in devm_fpga_mgr_release() local
630 fpga_mgr_free(mgr); in devm_fpga_mgr_release()
634 * devm_fpga_mgr_create - create and initialize a managed FPGA manager struct
635 * @dev: fpga manager device from pdev
636 * @name: fpga manager name
637 * @mops: pointer to structure of fpga manager ops
638 * @priv: fpga manager private data
640 * This function is intended for use in a FPGA manager driver's probe function.
654 struct fpga_manager **ptr, *mgr; in devm_fpga_mgr_create() local
660 mgr = fpga_mgr_create(dev, name, mops, priv); in devm_fpga_mgr_create()
661 if (!mgr) { in devm_fpga_mgr_create()
664 *ptr = mgr; in devm_fpga_mgr_create()
668 return mgr; in devm_fpga_mgr_create()
673 * fpga_mgr_register - register a FPGA manager
674 * @mgr: fpga manager struct
678 int fpga_mgr_register(struct fpga_manager *mgr) in fpga_mgr_register() argument
684 * from device. FPGA may be in reset mode or may have been programmed in fpga_mgr_register()
687 mgr->state = mgr->mops->state(mgr); in fpga_mgr_register()
689 ret = device_add(&mgr->dev); in fpga_mgr_register()
693 dev_info(&mgr->dev, "%s registered\n", mgr->name); in fpga_mgr_register()
698 ida_simple_remove(&fpga_mgr_ida, mgr->dev.id); in fpga_mgr_register()
705 * fpga_mgr_unregister - unregister a FPGA manager
706 * @mgr: fpga manager struct
708 * This function is intended for use in a FPGA manager driver's remove function.
710 void fpga_mgr_unregister(struct fpga_manager *mgr) in fpga_mgr_unregister() argument
712 dev_info(&mgr->dev, "%s %s\n", __func__, mgr->name); in fpga_mgr_unregister()
715 * If the low level driver provides a method for putting fpga into in fpga_mgr_unregister()
718 if (mgr->mops->fpga_remove) in fpga_mgr_unregister()
719 mgr->mops->fpga_remove(mgr); in fpga_mgr_unregister()
721 device_unregister(&mgr->dev); in fpga_mgr_unregister()
731 pr_info("FPGA manager framework\n"); in fpga_mgr_class_init()
737 fpga_mgr_class->dev_groups = fpga_mgr_groups; in fpga_mgr_class_init()
738 fpga_mgr_class->dev_release = fpga_mgr_dev_release; in fpga_mgr_class_init()
750 MODULE_DESCRIPTION("FPGA manager framework");