diff options
author | Wu Hao <hao.wu@intel.com> | 2018-06-29 20:53:28 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-07-15 07:55:46 -0400 |
commit | bb61b9be3e6b001f1571b230316bf3867dc41df3 (patch) | |
tree | af9750bbca7b424acfb60b26728bd4f5a8853d52 /drivers/fpga | |
parent | de892dff17b36d138ff41aeb46366d7c1ed4cd77 (diff) |
fpga: dfl: add fpga region platform driver for FME
This patch adds fpga region platform driver for FPGA Management Engine.
It register an fpga region with given fpga manager / bridge device.
Signed-off-by: Tim Whisonant <tim.whisonant@intel.com>
Signed-off-by: Enno Luebbers <enno.luebbers@intel.com>
Signed-off-by: Shiva Rao <shiva.rao@intel.com>
Signed-off-by: Christopher Rauer <christopher.rauer@intel.com>
Signed-off-by: Wu Hao <hao.wu@intel.com>
Acked-by: Alan Tull <atull@kernel.org>
Acked-by: Moritz Fischer <mdf@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/fpga')
-rw-r--r-- | drivers/fpga/Kconfig | 6 | ||||
-rw-r--r-- | drivers/fpga/Makefile | 1 | ||||
-rw-r--r-- | drivers/fpga/dfl-fme-region.c | 88 |
3 files changed, 95 insertions, 0 deletions
diff --git a/drivers/fpga/Kconfig b/drivers/fpga/Kconfig index 11d1943b91d4..f99f422feec9 100644 --- a/drivers/fpga/Kconfig +++ b/drivers/fpga/Kconfig | |||
@@ -168,6 +168,12 @@ config FPGA_DFL_FME_BRIDGE | |||
168 | help | 168 | help |
169 | Say Y to enable FPGA Bridge driver for FPGA Management Engine. | 169 | Say Y to enable FPGA Bridge driver for FPGA Management Engine. |
170 | 170 | ||
171 | config FPGA_DFL_FME_REGION | ||
172 | tristate "FPGA DFL FME Region Driver" | ||
173 | depends on FPGA_DFL_FME && HAS_IOMEM | ||
174 | help | ||
175 | Say Y to enable FPGA Region driver for FPGA Management Engine. | ||
176 | |||
171 | config FPGA_DFL_PCI | 177 | config FPGA_DFL_PCI |
172 | tristate "FPGA DFL PCIe Device Driver" | 178 | tristate "FPGA DFL PCIe Device Driver" |
173 | depends on PCI && FPGA_DFL | 179 | depends on PCI && FPGA_DFL |
diff --git a/drivers/fpga/Makefile b/drivers/fpga/Makefile index cda05515ebfd..637c27512c28 100644 --- a/drivers/fpga/Makefile +++ b/drivers/fpga/Makefile | |||
@@ -34,6 +34,7 @@ obj-$(CONFIG_FPGA_DFL) += dfl.o | |||
34 | obj-$(CONFIG_FPGA_DFL_FME) += dfl-fme.o | 34 | obj-$(CONFIG_FPGA_DFL_FME) += dfl-fme.o |
35 | obj-$(CONFIG_FPGA_DFL_FME_MGR) += dfl-fme-mgr.o | 35 | obj-$(CONFIG_FPGA_DFL_FME_MGR) += dfl-fme-mgr.o |
36 | obj-$(CONFIG_FPGA_DFL_FME_BRIDGE) += dfl-fme-br.o | 36 | obj-$(CONFIG_FPGA_DFL_FME_BRIDGE) += dfl-fme-br.o |
37 | obj-$(CONFIG_FPGA_DFL_FME_REGION) += dfl-fme-region.o | ||
37 | 38 | ||
38 | dfl-fme-objs := dfl-fme-main.o dfl-fme-pr.o | 39 | dfl-fme-objs := dfl-fme-main.o dfl-fme-pr.o |
39 | 40 | ||
diff --git a/drivers/fpga/dfl-fme-region.c b/drivers/fpga/dfl-fme-region.c new file mode 100644 index 000000000000..a6e0bde7cc31 --- /dev/null +++ b/drivers/fpga/dfl-fme-region.c | |||
@@ -0,0 +1,88 @@ | |||
1 | // SPDX-License-Identifier: GPL-2.0 | ||
2 | /* | ||
3 | * FPGA Region Driver for FPGA Management Engine (FME) | ||
4 | * | ||
5 | * Copyright (C) 2017-2018 Intel Corporation, Inc. | ||
6 | * | ||
7 | * Authors: | ||
8 | * Wu Hao <hao.wu@intel.com> | ||
9 | * Joseph Grecco <joe.grecco@intel.com> | ||
10 | * Enno Luebbers <enno.luebbers@intel.com> | ||
11 | * Tim Whisonant <tim.whisonant@intel.com> | ||
12 | * Ananda Ravuri <ananda.ravuri@intel.com> | ||
13 | * Henry Mitchel <henry.mitchel@intel.com> | ||
14 | */ | ||
15 | |||
16 | #include <linux/module.h> | ||
17 | #include <linux/fpga/fpga-region.h> | ||
18 | |||
19 | #include "dfl-fme-pr.h" | ||
20 | |||
21 | static int fme_region_get_bridges(struct fpga_region *region) | ||
22 | { | ||
23 | struct dfl_fme_region_pdata *pdata = region->priv; | ||
24 | struct device *dev = &pdata->br->dev; | ||
25 | |||
26 | return fpga_bridge_get_to_list(dev, region->info, ®ion->bridge_list); | ||
27 | } | ||
28 | |||
29 | static int fme_region_probe(struct platform_device *pdev) | ||
30 | { | ||
31 | struct dfl_fme_region_pdata *pdata = dev_get_platdata(&pdev->dev); | ||
32 | struct device *dev = &pdev->dev; | ||
33 | struct fpga_region *region; | ||
34 | struct fpga_manager *mgr; | ||
35 | int ret; | ||
36 | |||
37 | mgr = fpga_mgr_get(&pdata->mgr->dev); | ||
38 | if (IS_ERR(mgr)) | ||
39 | return -EPROBE_DEFER; | ||
40 | |||
41 | region = fpga_region_create(dev, mgr, fme_region_get_bridges); | ||
42 | if (!region) { | ||
43 | ret = -ENOMEM; | ||
44 | goto eprobe_mgr_put; | ||
45 | } | ||
46 | |||
47 | region->priv = pdata; | ||
48 | platform_set_drvdata(pdev, region); | ||
49 | |||
50 | ret = fpga_region_register(region); | ||
51 | if (ret) | ||
52 | goto region_free; | ||
53 | |||
54 | dev_dbg(dev, "DFL FME FPGA Region probed\n"); | ||
55 | |||
56 | return 0; | ||
57 | |||
58 | region_free: | ||
59 | fpga_region_free(region); | ||
60 | eprobe_mgr_put: | ||
61 | fpga_mgr_put(mgr); | ||
62 | return ret; | ||
63 | } | ||
64 | |||
65 | static int fme_region_remove(struct platform_device *pdev) | ||
66 | { | ||
67 | struct fpga_region *region = dev_get_drvdata(&pdev->dev); | ||
68 | |||
69 | fpga_region_unregister(region); | ||
70 | fpga_mgr_put(region->mgr); | ||
71 | |||
72 | return 0; | ||
73 | } | ||
74 | |||
75 | static struct platform_driver fme_region_driver = { | ||
76 | .driver = { | ||
77 | .name = DFL_FPGA_FME_REGION, | ||
78 | }, | ||
79 | .probe = fme_region_probe, | ||
80 | .remove = fme_region_remove, | ||
81 | }; | ||
82 | |||
83 | module_platform_driver(fme_region_driver); | ||
84 | |||
85 | MODULE_DESCRIPTION("FPGA Region for DFL FPGA Management Engine"); | ||
86 | MODULE_AUTHOR("Intel Corporation"); | ||
87 | MODULE_LICENSE("GPL v2"); | ||
88 | MODULE_ALIAS("platform:dfl-fme-region"); | ||