Lines Matching +full:fpga +full:- +full:region
1 // SPDX-License-Identifier: GPL-2.0
3 * Driver for FPGA Management Engine (FME) Partial Reconfiguration
5 * Copyright (C) 2017-2018 Intel Corporation, Inc.
23 #include <linux/fpga/fpga-mgr.h>
24 #include <linux/fpga/fpga-bridge.h>
25 #include <linux/fpga/fpga-region.h>
26 #include <linux/fpga-dfl.h>
29 #include "dfl-fme.h"
30 #include "dfl-fme-pr.h"
37 list_for_each_entry(fme_region, &fme->region_list, node) in dfl_fme_region_find_by_port_id()
38 if (fme_region->port_id == port_id) in dfl_fme_region_find_by_port_id()
46 return dev->parent == data; in dfl_fme_region_match()
52 struct fpga_region *region; in dfl_fme_region_find() local
58 region = fpga_region_class_find(NULL, &fme_region->region->dev, in dfl_fme_region_find()
60 if (!region) in dfl_fme_region_find()
63 return region; in dfl_fme_region_find()
68 struct dfl_feature_dev_data *fdata = to_dfl_feature_dev_data(&pdev->dev); in fme_pr()
72 struct fpga_region *region; in fme_pr() local
84 return -EFAULT; in fme_pr()
87 return -EINVAL; in fme_pr()
89 /* get fme header region */ in fme_pr()
95 dev_dbg(&pdev->dev, "port number more than maximum\n"); in fme_pr()
96 return -EINVAL; in fme_pr()
107 return -ENOMEM; in fme_pr()
112 ret = -EFAULT; in fme_pr()
117 info = fpga_image_info_alloc(&pdev->dev); in fme_pr()
119 ret = -ENOMEM; in fme_pr()
123 info->flags |= FPGA_MGR_PARTIAL_RECONFIG; in fme_pr()
125 mutex_lock(&fdata->lock); in fme_pr()
129 ret = -EINVAL; in fme_pr()
133 region = dfl_fme_region_find(fme, port_pr.port_id); in fme_pr()
134 if (!region) { in fme_pr()
135 ret = -EINVAL; in fme_pr()
139 fpga_image_info_free(region->info); in fme_pr()
141 info->buf = buf; in fme_pr()
142 info->count = length; in fme_pr()
143 info->region_id = port_pr.port_id; in fme_pr()
144 region->info = info; in fme_pr()
146 ret = fpga_region_program_fpga(region); in fme_pr()
149 * it allows userspace to reset the PR region's logic by disabling and in fme_pr()
153 if (region->get_bridges) in fme_pr()
154 fpga_bridges_put(®ion->bridge_list); in fme_pr()
156 put_device(®ion->dev); in fme_pr()
158 mutex_unlock(&fdata->lock); in fme_pr()
165 * dfl_fme_create_mgr - create fpga mgr platform device as child device
175 struct platform_device *mgr, *fme = fdata->dev; in dfl_fme_create_mgr()
177 int ret = -ENOMEM; in dfl_fme_create_mgr()
179 if (!feature->ioaddr) in dfl_fme_create_mgr()
180 return ERR_PTR(-ENODEV); in dfl_fme_create_mgr()
182 mgr_pdata.ioaddr = feature->ioaddr; in dfl_fme_create_mgr()
185 * Each FME has only one fpga-mgr, so allocate platform device using in dfl_fme_create_mgr()
188 mgr = platform_device_alloc(DFL_FPGA_FME_MGR, fme->id); in dfl_fme_create_mgr()
192 mgr->dev.parent = &fme->dev; in dfl_fme_create_mgr()
210 * dfl_fme_destroy_mgr - destroy fpga mgr platform device
217 platform_device_unregister(priv->mgr); in dfl_fme_destroy_mgr()
221 * dfl_fme_create_bridge - create fme fpga bridge platform device as child
231 struct device *dev = &fdata->dev->dev; in dfl_fme_create_bridge()
234 int ret = -ENOMEM; in dfl_fme_create_bridge()
240 br_pdata.cdev = fdata->dfl_cdev; in dfl_fme_create_bridge()
243 fme_br->br = platform_device_alloc(DFL_FPGA_FME_BRIDGE, in dfl_fme_create_bridge()
245 if (!fme_br->br) in dfl_fme_create_bridge()
248 fme_br->br->dev.parent = dev; in dfl_fme_create_bridge()
250 ret = platform_device_add_data(fme_br->br, &br_pdata, sizeof(br_pdata)); in dfl_fme_create_bridge()
254 ret = platform_device_add(fme_br->br); in dfl_fme_create_bridge()
261 platform_device_put(fme_br->br); in dfl_fme_create_bridge()
266 * dfl_fme_destroy_bridge - destroy fpga bridge platform device
271 platform_device_unregister(fme_br->br); in dfl_fme_destroy_bridge()
275 * dfl_fme_destroy_bridges - destroy all fpga bridge platform device
283 list_for_each_entry_safe(fbridge, tmp, &priv->bridge_list, node) { in dfl_fme_destroy_bridges()
284 list_del(&fbridge->node); in dfl_fme_destroy_bridges()
290 * dfl_fme_create_region - create fpga region platform device as child
293 * @mgr: mgr platform device needed for region
294 * @br: br platform device needed for region
297 * Return: fme region if successful, and error code otherwise.
305 struct device *dev = &fdata->dev->dev; in dfl_fme_create_region()
307 int ret = -ENOMEM; in dfl_fme_create_region()
317 * Each FPGA device may have more than one port, so allocate platform in dfl_fme_create_region()
320 fme_region->region = platform_device_alloc(DFL_FPGA_FME_REGION, br->id); in dfl_fme_create_region()
321 if (!fme_region->region) in dfl_fme_create_region()
324 fme_region->region->dev.parent = dev; in dfl_fme_create_region()
326 ret = platform_device_add_data(fme_region->region, ®ion_pdata, in dfl_fme_create_region()
331 ret = platform_device_add(fme_region->region); in dfl_fme_create_region()
335 fme_region->port_id = port_id; in dfl_fme_create_region()
340 platform_device_put(fme_region->region); in dfl_fme_create_region()
345 * dfl_fme_destroy_region - destroy fme region
346 * @fme_region: fme region to destroy
350 platform_device_unregister(fme_region->region); in dfl_fme_destroy_region()
354 * dfl_fme_destroy_regions - destroy all fme regions
362 list_for_each_entry_safe(fme_region, tmp, &priv->region_list, node) { in dfl_fme_destroy_regions()
363 list_del(&fme_region->node); in dfl_fme_destroy_regions()
371 struct dfl_feature_dev_data *fdata = to_dfl_feature_dev_data(&pdev->dev); in pr_mgmt_init()
377 int ret = -ENODEV, i = 0; in pr_mgmt_init()
382 mutex_lock(&fdata->lock); in pr_mgmt_init()
385 /* Initialize the region and bridge sub device list */ in pr_mgmt_init()
386 INIT_LIST_HEAD(&priv->region_list); in pr_mgmt_init()
387 INIT_LIST_HEAD(&priv->bridge_list); in pr_mgmt_init()
389 /* Create fpga mgr platform device */ in pr_mgmt_init()
392 dev_err(&pdev->dev, "fail to create fpga mgr pdev\n"); in pr_mgmt_init()
396 priv->mgr = mgr; in pr_mgmt_init()
412 list_add(&fme_br->node, &priv->bridge_list); in pr_mgmt_init()
414 /* Create region for each port */ in pr_mgmt_init()
416 fme_br->br, i); in pr_mgmt_init()
422 list_add(&fme_region->node, &priv->region_list); in pr_mgmt_init()
424 mutex_unlock(&fdata->lock); in pr_mgmt_init()
433 mutex_unlock(&fdata->lock); in pr_mgmt_init()
440 struct dfl_feature_dev_data *fdata = to_dfl_feature_dev_data(&pdev->dev); in pr_mgmt_uinit()
442 mutex_lock(&fdata->lock); in pr_mgmt_uinit()
447 mutex_unlock(&fdata->lock); in pr_mgmt_uinit()
461 ret = -ENODEV; in fme_pr_ioctl()