• Home
  • Raw
  • Download

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

1 // SPDX-License-Identifier: GPL-2.0
3 * FPGA Region - Device Tree support for FPGA programming under Linux
5 * Copyright (C) 2013-2016 Altera Corporation
8 #include <linux/fpga/fpga-bridge.h>
9 #include <linux/fpga/fpga-mgr.h>
10 #include <linux/fpga/fpga-region.h>
20 { .compatible = "fpga-region", },
26 * of_fpga_region_find - find FPGA region
27 * @np: device node of FPGA Region
29 * Caller will need to put_device(&region->dev) when done.
31 * Returns FPGA Region struct or NULL
39 * of_fpga_region_get_mgr - get reference for FPGA manager
40 * @np: device node of FPGA region
42 * Get FPGA Manager from "fpga-mgr" property or from ancestor region.
46 * Return: fpga manager struct or IS_ERR() condition containing error code.
51 struct fpga_manager *mgr; in of_fpga_region_get_mgr() local
55 if (of_device_is_compatible(np, "fpga-region")) { in of_fpga_region_get_mgr()
56 mgr_node = of_parse_phandle(np, "fpga-mgr", 0); in of_fpga_region_get_mgr()
58 mgr = of_fpga_mgr_get(mgr_node); in of_fpga_region_get_mgr()
61 return mgr; in of_fpga_region_get_mgr()
68 return ERR_PTR(-EINVAL); in of_fpga_region_get_mgr()
72 * of_fpga_region_get_bridges - create a list of bridges
73 * @region: FPGA region
76 * specified by "fpga-bridges" property. Note that the
80 * Caller should call fpga_bridges_put(&region->bridge_list) when
84 * or -EBUSY if any of the bridges are in use.
88 struct device *dev = &region->dev; in of_fpga_region_get_bridges()
89 struct device_node *region_np = dev->of_node; in of_fpga_region_get_bridges()
90 struct fpga_image_info *info = region->info; in of_fpga_region_get_bridges()
95 ret = of_fpga_bridge_get_to_list(region_np->parent, info, in of_fpga_region_get_bridges()
96 &region->bridge_list); in of_fpga_region_get_bridges()
98 /* -EBUSY means parent is a bridge that is under use. Give up. */ in of_fpga_region_get_bridges()
99 if (ret == -EBUSY) in of_fpga_region_get_bridges()
104 parent_br = region_np->parent; in of_fpga_region_get_bridges()
107 br = of_parse_phandle(info->overlay, "fpga-bridges", 0); in of_fpga_region_get_bridges()
110 np = info->overlay; in of_fpga_region_get_bridges()
116 br = of_parse_phandle(np, "fpga-bridges", i); in of_fpga_region_get_bridges()
128 &region->bridge_list); in of_fpga_region_get_bridges()
132 if (ret == -EBUSY) { in of_fpga_region_get_bridges()
133 fpga_bridges_put(&region->bridge_list); in of_fpga_region_get_bridges()
134 return -EBUSY; in of_fpga_region_get_bridges()
145 * If the overlay adds child FPGA regions, they are not allowed to have
146 * firmware-name property.
148 * Return 0 for OK or -EINVAL if child FPGA region adds firmware-name.
160 if (!of_property_read_string(child_region, "firmware-name", in child_regions_with_firmware()
162 ret = -EINVAL; in child_regions_with_firmware()
172 pr_err("firmware-name not allowed in child FPGA region: %pOF", in child_regions_with_firmware()
179 * of_fpga_region_parse_ov - parse and check overlay applied to region
181 * @region: FPGA region
182 * @overlay: overlay applied to the FPGA region
184 * Given an overlay applied to a FPGA region, parse the FPGA image specific
188 * NULL if overlay doesn't direct us to program the FPGA.
196 struct device *dev = &region->dev; in of_fpga_region_parse_ov()
201 if (region->info) { in of_fpga_region_parse_ov()
203 return ERR_PTR(-EINVAL); in of_fpga_region_parse_ov()
207 * Reject overlay if child FPGA Regions added in the overlay have in of_fpga_region_parse_ov()
208 * firmware-name property (would mean that an FPGA region that has in of_fpga_region_parse_ov()
209 * not been added to the live tree yet is doing FPGA programming). in of_fpga_region_parse_ov()
217 return ERR_PTR(-ENOMEM); in of_fpga_region_parse_ov()
219 info->overlay = overlay; in of_fpga_region_parse_ov()
221 /* Read FPGA region properties from the overlay */ in of_fpga_region_parse_ov()
222 if (of_property_read_bool(overlay, "partial-fpga-config")) in of_fpga_region_parse_ov()
223 info->flags |= FPGA_MGR_PARTIAL_RECONFIG; in of_fpga_region_parse_ov()
225 if (of_property_read_bool(overlay, "external-fpga-config")) in of_fpga_region_parse_ov()
226 info->flags |= FPGA_MGR_EXTERNAL_CONFIG; in of_fpga_region_parse_ov()
228 if (of_property_read_bool(overlay, "encrypted-fpga-config")) in of_fpga_region_parse_ov()
229 info->flags |= FPGA_MGR_ENCRYPTED_BITSTREAM; in of_fpga_region_parse_ov()
231 if (!of_property_read_string(overlay, "firmware-name", in of_fpga_region_parse_ov()
233 info->firmware_name = devm_kstrdup(dev, firmware_name, in of_fpga_region_parse_ov()
235 if (!info->firmware_name) in of_fpga_region_parse_ov()
236 return ERR_PTR(-ENOMEM); in of_fpga_region_parse_ov()
239 of_property_read_u32(overlay, "region-unfreeze-timeout-us", in of_fpga_region_parse_ov()
240 &info->enable_timeout_us); in of_fpga_region_parse_ov()
242 of_property_read_u32(overlay, "region-freeze-timeout-us", in of_fpga_region_parse_ov()
243 &info->disable_timeout_us); in of_fpga_region_parse_ov()
245 of_property_read_u32(overlay, "config-complete-timeout-us", in of_fpga_region_parse_ov()
246 &info->config_complete_timeout_us); in of_fpga_region_parse_ov()
248 /* If overlay is not programming the FPGA, don't need FPGA image info */ in of_fpga_region_parse_ov()
249 if (!info->firmware_name) { in of_fpga_region_parse_ov()
255 * If overlay informs us FPGA was externally programmed, specifying in of_fpga_region_parse_ov()
258 if (info->flags & FPGA_MGR_EXTERNAL_CONFIG) { in of_fpga_region_parse_ov()
259 dev_err(dev, "error: specified firmware and external-fpga-config"); in of_fpga_region_parse_ov()
260 ret = -EINVAL; in of_fpga_region_parse_ov()
271 * of_fpga_region_notify_pre_apply - pre-apply overlay notification
273 * @region: FPGA region that the overlay was applied to
276 * Called when an overlay targeted to a FPGA Region is about to be applied.
277 * Parses the overlay for properties that influence how the FPGA will be
278 * programmed and does some checking. If the checks pass, programs the FPGA.
287 struct device *dev = &region->dev; in of_fpga_region_notify_pre_apply()
291 info = of_fpga_region_parse_ov(region, nd->overlay); in of_fpga_region_notify_pre_apply()
295 /* If overlay doesn't program the FPGA, accept it anyway. */ in of_fpga_region_notify_pre_apply()
299 if (region->info) { in of_fpga_region_notify_pre_apply()
301 return -EINVAL; in of_fpga_region_notify_pre_apply()
304 region->info = info; in of_fpga_region_notify_pre_apply()
309 region->info = NULL; in of_fpga_region_notify_pre_apply()
316 * of_fpga_region_notify_post_remove - post-remove overlay notification
318 * @region: FPGA region that was targeted by the overlay that was removed
322 * FPGA region.
327 fpga_bridges_disable(&region->bridge_list); in of_fpga_region_notify_post_remove()
328 fpga_bridges_put(&region->bridge_list); in of_fpga_region_notify_post_remove()
329 fpga_image_info_free(region->info); in of_fpga_region_notify_post_remove()
330 region->info = NULL; in of_fpga_region_notify_post_remove()
334 * of_fpga_region_notify - reconfig notifier for dynamic DT changes
339 * This notifier handles programming a FPGA when a "firmware-name" property is
340 * added to a fpga-region.
342 * Returns NOTIFY_OK or error if FPGA programming fails.
368 region = of_fpga_region_find(nd->target); in of_fpga_region_notify()
383 put_device(&region->dev); in of_fpga_region_notify()
397 struct device *dev = &pdev->dev; in of_fpga_region_probe()
398 struct device_node *np = dev->of_node; in of_fpga_region_probe()
400 struct fpga_manager *mgr; in of_fpga_region_probe() local
403 /* Find the FPGA mgr specified by region or parent region. */ in of_fpga_region_probe()
404 mgr = of_fpga_region_get_mgr(np); in of_fpga_region_probe()
405 if (IS_ERR(mgr)) in of_fpga_region_probe()
406 return -EPROBE_DEFER; in of_fpga_region_probe()
408 region = devm_fpga_region_create(dev, mgr, of_fpga_region_get_bridges); in of_fpga_region_probe()
410 ret = -ENOMEM; in of_fpga_region_probe()
418 of_platform_populate(np, fpga_region_of_match, NULL, &region->dev); in of_fpga_region_probe()
421 dev_info(dev, "FPGA Region probed\n"); in of_fpga_region_probe()
426 fpga_mgr_put(mgr); in of_fpga_region_probe()
433 struct fpga_manager *mgr = region->mgr; in of_fpga_region_remove() local
436 fpga_mgr_put(mgr); in of_fpga_region_remove()
445 .name = "of-fpga-region",
451 * fpga_region_init - init function for fpga_region class
482 MODULE_DESCRIPTION("FPGA Region");