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) 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()
58 region = fpga_region_class_find(NULL, &fme_region->region->dev, in dfl_fme_region_find()
68 struct dfl_feature_platform_data *pdata = dev_get_platdata(&pdev->dev); in fme_pr()
84 return -EFAULT; in fme_pr()
87 return -EINVAL; in fme_pr()
90 fme_hdr = dfl_get_feature_ioaddr_by_id(&pdev->dev, in fme_pr()
96 dev_dbg(&pdev->dev, "port number more than maximum\n"); in fme_pr()
97 return -EINVAL; in fme_pr()
108 return -ENOMEM; in fme_pr()
113 ret = -EFAULT; in fme_pr()
118 info = fpga_image_info_alloc(&pdev->dev); in fme_pr()
120 ret = -ENOMEM; in fme_pr()
124 info->flags |= FPGA_MGR_PARTIAL_RECONFIG; in fme_pr()
126 mutex_lock(&pdata->lock); in fme_pr()
130 ret = -EINVAL; in fme_pr()
136 ret = -EINVAL; in fme_pr()
140 fpga_image_info_free(region->info); in fme_pr()
142 info->buf = buf; in fme_pr()
143 info->count = length; in fme_pr()
144 info->region_id = port_pr.port_id; in fme_pr()
145 region->info = info; in fme_pr()
151 * reenabling the bridge to clear things out between acceleration runs. in fme_pr()
154 if (region->get_bridges) in fme_pr()
155 fpga_bridges_put(&region->bridge_list); in fme_pr()
157 put_device(&region->dev); in fme_pr()
159 mutex_unlock(&pdata->lock); in fme_pr()
166 * dfl_fme_create_mgr - create fpga mgr platform device as child device
176 struct platform_device *mgr, *fme = pdata->dev; in dfl_fme_create_mgr()
178 int ret = -ENOMEM; in dfl_fme_create_mgr()
180 if (!feature->ioaddr) in dfl_fme_create_mgr()
181 return ERR_PTR(-ENODEV); in dfl_fme_create_mgr()
183 mgr_pdata.ioaddr = feature->ioaddr; in dfl_fme_create_mgr()
186 * Each FME has only one fpga-mgr, so allocate platform device using in dfl_fme_create_mgr()
189 mgr = platform_device_alloc(DFL_FPGA_FME_MGR, fme->id); in dfl_fme_create_mgr()
193 mgr->dev.parent = &fme->dev; in dfl_fme_create_mgr()
211 * dfl_fme_destroy_mgr - destroy fpga mgr platform device
218 platform_device_unregister(priv->mgr); in dfl_fme_destroy_mgr()
222 * dfl_fme_create_bridge - create fme fpga bridge platform device as child
225 * @port_id: port id for the bridge to be created.
227 * Return: bridge platform device if successful, and error code otherwise.
232 struct device *dev = &pdata->dev->dev; in dfl_fme_create_bridge()
235 int ret = -ENOMEM; in dfl_fme_create_bridge()
241 br_pdata.cdev = pdata->dfl_cdev; in dfl_fme_create_bridge()
244 fme_br->br = platform_device_alloc(DFL_FPGA_FME_BRIDGE, in dfl_fme_create_bridge()
246 if (!fme_br->br) in dfl_fme_create_bridge()
249 fme_br->br->dev.parent = dev; in dfl_fme_create_bridge()
251 ret = platform_device_add_data(fme_br->br, &br_pdata, sizeof(br_pdata)); in dfl_fme_create_bridge()
255 ret = platform_device_add(fme_br->br); in dfl_fme_create_bridge()
262 platform_device_put(fme_br->br); in dfl_fme_create_bridge()
267 * dfl_fme_destroy_bridge - destroy fpga bridge platform device
268 * @fme_br: fme bridge to destroy
272 platform_device_unregister(fme_br->br); in dfl_fme_destroy_bridge()
276 * dfl_fme_destroy_bridges - destroy all fpga bridge platform device
284 list_for_each_entry_safe(fbridge, tmp, &priv->bridge_list, node) { in dfl_fme_destroy_bridges()
285 list_del(&fbridge->node); in dfl_fme_destroy_bridges()
291 * dfl_fme_create_region - create fpga region platform device as child
306 struct device *dev = &pdata->dev->dev; in dfl_fme_create_region()
308 int ret = -ENOMEM; in dfl_fme_create_region()
318 * Each FPGA device may have more than one port, so allocate platform in dfl_fme_create_region()
321 fme_region->region = platform_device_alloc(DFL_FPGA_FME_REGION, br->id); in dfl_fme_create_region()
322 if (!fme_region->region) in dfl_fme_create_region()
325 fme_region->region->dev.parent = dev; in dfl_fme_create_region()
327 ret = platform_device_add_data(fme_region->region, &region_pdata, in dfl_fme_create_region()
332 ret = platform_device_add(fme_region->region); in dfl_fme_create_region()
336 fme_region->port_id = port_id; in dfl_fme_create_region()
341 platform_device_put(fme_region->region); in dfl_fme_create_region()
346 * dfl_fme_destroy_region - destroy fme region
351 platform_device_unregister(fme_region->region); in dfl_fme_destroy_region()
355 * dfl_fme_destroy_regions - destroy all fme regions
363 list_for_each_entry_safe(fme_region, tmp, &priv->region_list, node) { in dfl_fme_destroy_regions()
364 list_del(&fme_region->node); in dfl_fme_destroy_regions()
372 struct dfl_feature_platform_data *pdata = dev_get_platdata(&pdev->dev); in pr_mgmt_init()
378 int ret = -ENODEV, i = 0; in pr_mgmt_init()
381 fme_hdr = dfl_get_feature_ioaddr_by_id(&pdev->dev, in pr_mgmt_init()
384 mutex_lock(&pdata->lock); in pr_mgmt_init()
387 /* Initialize the region and bridge sub device list */ in pr_mgmt_init()
388 INIT_LIST_HEAD(&priv->region_list); in pr_mgmt_init()
389 INIT_LIST_HEAD(&priv->bridge_list); in pr_mgmt_init()
391 /* Create fpga mgr platform device */ in pr_mgmt_init()
394 dev_err(&pdev->dev, "fail to create fpga mgr pdev\n"); in pr_mgmt_init()
398 priv->mgr = mgr; in pr_mgmt_init()
407 /* Create bridge for each port */ in pr_mgmt_init()
414 list_add(&fme_br->node, &priv->bridge_list); in pr_mgmt_init()
418 fme_br->br, i); in pr_mgmt_init()
424 list_add(&fme_region->node, &priv->region_list); in pr_mgmt_init()
426 mutex_unlock(&pdata->lock); in pr_mgmt_init()
435 mutex_unlock(&pdata->lock); in pr_mgmt_init()
442 struct dfl_feature_platform_data *pdata = dev_get_platdata(&pdev->dev); in pr_mgmt_uinit()
444 mutex_lock(&pdata->lock); in pr_mgmt_uinit()
449 mutex_unlock(&pdata->lock); in pr_mgmt_uinit()
463 ret = -ENODEV; in fme_pr_ioctl()