Lines Matching +full:fpga +full:- +full:bridge
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)
38 if (fme_region->port_id == port_id)
46 return dev->parent == data;
58 region = fpga_region_class_find(NULL, &fme_region->region->dev,
68 struct dfl_feature_dev_data *fdata = to_dfl_feature_dev_data(&pdev->dev);
84 return -EFAULT;
87 return -EINVAL;
95 dev_dbg(&pdev->dev, "port number more than maximum\n");
96 return -EINVAL;
107 return -ENOMEM;
112 ret = -EFAULT;
117 info = fpga_image_info_alloc(&pdev->dev);
119 ret = -ENOMEM;
123 info->flags |= FPGA_MGR_PARTIAL_RECONFIG;
125 mutex_lock(&fdata->lock);
129 ret = -EINVAL;
135 ret = -EINVAL;
139 fpga_image_info_free(region->info);
141 info->buf = buf;
142 info->count = length;
143 info->region_id = port_pr.port_id;
144 region->info = info;
150 * reenabling the bridge to clear things out between acceleration runs.
153 if (region->get_bridges)
154 fpga_bridges_put(®ion->bridge_list);
156 put_device(®ion->dev);
158 mutex_unlock(&fdata->lock);
165 * dfl_fme_create_mgr - create fpga mgr platform device as child device
175 struct platform_device *mgr, *fme = fdata->dev;
177 int ret = -ENOMEM;
179 if (!feature->ioaddr)
180 return ERR_PTR(-ENODEV);
182 mgr_pdata.ioaddr = feature->ioaddr;
185 * Each FME has only one fpga-mgr, so allocate platform device using
188 mgr = platform_device_alloc(DFL_FPGA_FME_MGR, fme->id);
192 mgr->dev.parent = &fme->dev;
210 * dfl_fme_destroy_mgr - destroy fpga mgr platform device
217 platform_device_unregister(priv->mgr);
221 * dfl_fme_create_bridge - create fme fpga bridge platform device as child
224 * @port_id: port id for the bridge to be created.
226 * Return: bridge platform device if successful, and error code otherwise.
231 struct device *dev = &fdata->dev->dev;
234 int ret = -ENOMEM;
240 br_pdata.cdev = fdata->dfl_cdev;
243 fme_br->br = platform_device_alloc(DFL_FPGA_FME_BRIDGE,
245 if (!fme_br->br)
248 fme_br->br->dev.parent = dev;
250 ret = platform_device_add_data(fme_br->br, &br_pdata, sizeof(br_pdata));
254 ret = platform_device_add(fme_br->br);
261 platform_device_put(fme_br->br);
266 * dfl_fme_destroy_bridge - destroy fpga bridge platform device
267 * @fme_br: fme bridge to destroy
271 platform_device_unregister(fme_br->br);
275 * dfl_fme_destroy_bridges - destroy all fpga bridge platform device
283 list_for_each_entry_safe(fbridge, tmp, &priv->bridge_list, node) {
284 list_del(&fbridge->node);
290 * dfl_fme_create_region - create fpga region platform device as child
305 struct device *dev = &fdata->dev->dev;
307 int ret = -ENOMEM;
317 * Each FPGA device may have more than one port, so allocate platform
320 fme_region->region = platform_device_alloc(DFL_FPGA_FME_REGION, br->id);
321 if (!fme_region->region)
324 fme_region->region->dev.parent = dev;
326 ret = platform_device_add_data(fme_region->region, ®ion_pdata,
331 ret = platform_device_add(fme_region->region);
335 fme_region->port_id = port_id;
340 platform_device_put(fme_region->region);
345 * dfl_fme_destroy_region - destroy fme region
350 platform_device_unregister(fme_region->region);
354 * dfl_fme_destroy_regions - destroy all fme regions
362 list_for_each_entry_safe(fme_region, tmp, &priv->region_list, node) {
363 list_del(&fme_region->node);
371 struct dfl_feature_dev_data *fdata = to_dfl_feature_dev_data(&pdev->dev);
377 int ret = -ENODEV, i = 0;
382 mutex_lock(&fdata->lock);
385 /* Initialize the region and bridge sub device list */
386 INIT_LIST_HEAD(&priv->region_list);
387 INIT_LIST_HEAD(&priv->bridge_list);
389 /* Create fpga mgr platform device */
392 dev_err(&pdev->dev, "fail to create fpga mgr pdev\n");
396 priv->mgr = mgr;
405 /* Create bridge for each port */
412 list_add(&fme_br->node, &priv->bridge_list);
416 fme_br->br, i);
422 list_add(&fme_region->node, &priv->region_list);
424 mutex_unlock(&fdata->lock);
433 mutex_unlock(&fdata->lock);
440 struct dfl_feature_dev_data *fdata = to_dfl_feature_dev_data(&pdev->dev);
442 mutex_lock(&fdata->lock);
447 mutex_unlock(&fdata->lock);
461 ret = -ENODEV;