diff options
author | Wu Hao <hao.wu@intel.com> | 2018-06-29 20:53:12 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-07-15 07:55:44 -0400 |
commit | 41a8b2c56470b7e4e3e2db93324d50bbbf60cdc4 (patch) | |
tree | 4e3314c007e056d39805aa8e49cd42678ac9926a | |
parent | 99a560bde313892f87ca81db568a829d3d205882 (diff) |
fpga: region: add compat_id support
This patch introduces a compat_id pointer member and sysfs interface
for each fpga region, similar as compat_id for fpga manager, it allows
applications to read the per region compat_id for compatibility
checking before other actions on this fpga-region (e.g. PR).
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>
-rw-r--r-- | Documentation/ABI/testing/sysfs-class-fpga-region | 9 | ||||
-rw-r--r-- | drivers/fpga/fpga-region.c | 22 | ||||
-rw-r--r-- | include/linux/fpga/fpga-region.h | 2 |
3 files changed, 33 insertions, 0 deletions
diff --git a/Documentation/ABI/testing/sysfs-class-fpga-region b/Documentation/ABI/testing/sysfs-class-fpga-region new file mode 100644 index 000000000000..bc7ec644acc9 --- /dev/null +++ b/Documentation/ABI/testing/sysfs-class-fpga-region | |||
@@ -0,0 +1,9 @@ | |||
1 | What: /sys/class/fpga_region/<region>/compat_id | ||
2 | Date: June 2018 | ||
3 | KernelVersion: 4.19 | ||
4 | Contact: Wu Hao <hao.wu@intel.com> | ||
5 | Description: FPGA region id for compatibility check, e.g. compatibility | ||
6 | of the FPGA reconfiguration hardware and image. This value | ||
7 | is defined or calculated by the layer that is creating the | ||
8 | FPGA region. This interface returns the compat_id value or | ||
9 | just error code -ENOENT in case compat_id is not used. | ||
diff --git a/drivers/fpga/fpga-region.c b/drivers/fpga/fpga-region.c index 6d214d75c7be..0d65220d5ec5 100644 --- a/drivers/fpga/fpga-region.c +++ b/drivers/fpga/fpga-region.c | |||
@@ -158,6 +158,27 @@ err_put_region: | |||
158 | } | 158 | } |
159 | EXPORT_SYMBOL_GPL(fpga_region_program_fpga); | 159 | EXPORT_SYMBOL_GPL(fpga_region_program_fpga); |
160 | 160 | ||
161 | static ssize_t compat_id_show(struct device *dev, | ||
162 | struct device_attribute *attr, char *buf) | ||
163 | { | ||
164 | struct fpga_region *region = to_fpga_region(dev); | ||
165 | |||
166 | if (!region->compat_id) | ||
167 | return -ENOENT; | ||
168 | |||
169 | return sprintf(buf, "%016llx%016llx\n", | ||
170 | (unsigned long long)region->compat_id->id_h, | ||
171 | (unsigned long long)region->compat_id->id_l); | ||
172 | } | ||
173 | |||
174 | static DEVICE_ATTR_RO(compat_id); | ||
175 | |||
176 | static struct attribute *fpga_region_attrs[] = { | ||
177 | &dev_attr_compat_id.attr, | ||
178 | NULL, | ||
179 | }; | ||
180 | ATTRIBUTE_GROUPS(fpga_region); | ||
181 | |||
161 | /** | 182 | /** |
162 | * fpga_region_create - alloc and init a struct fpga_region | 183 | * fpga_region_create - alloc and init a struct fpga_region |
163 | * @dev: device parent | 184 | * @dev: device parent |
@@ -258,6 +279,7 @@ static int __init fpga_region_init(void) | |||
258 | if (IS_ERR(fpga_region_class)) | 279 | if (IS_ERR(fpga_region_class)) |
259 | return PTR_ERR(fpga_region_class); | 280 | return PTR_ERR(fpga_region_class); |
260 | 281 | ||
282 | fpga_region_class->dev_groups = fpga_region_groups; | ||
261 | fpga_region_class->dev_release = fpga_region_dev_release; | 283 | fpga_region_class->dev_release = fpga_region_dev_release; |
262 | 284 | ||
263 | return 0; | 285 | return 0; |
diff --git a/include/linux/fpga/fpga-region.h b/include/linux/fpga/fpga-region.h index d7071cddd727..0521b7f577a4 100644 --- a/include/linux/fpga/fpga-region.h +++ b/include/linux/fpga/fpga-region.h | |||
@@ -14,6 +14,7 @@ | |||
14 | * @bridge_list: list of FPGA bridges specified in region | 14 | * @bridge_list: list of FPGA bridges specified in region |
15 | * @mgr: FPGA manager | 15 | * @mgr: FPGA manager |
16 | * @info: FPGA image info | 16 | * @info: FPGA image info |
17 | * @compat_id: FPGA region id for compatibility check. | ||
17 | * @priv: private data | 18 | * @priv: private data |
18 | * @get_bridges: optional function to get bridges to a list | 19 | * @get_bridges: optional function to get bridges to a list |
19 | */ | 20 | */ |
@@ -23,6 +24,7 @@ struct fpga_region { | |||
23 | struct list_head bridge_list; | 24 | struct list_head bridge_list; |
24 | struct fpga_manager *mgr; | 25 | struct fpga_manager *mgr; |
25 | struct fpga_image_info *info; | 26 | struct fpga_image_info *info; |
27 | struct fpga_compat_id *compat_id; | ||
26 | void *priv; | 28 | void *priv; |
27 | int (*get_bridges)(struct fpga_region *region); | 29 | int (*get_bridges)(struct fpga_region *region); |
28 | }; | 30 | }; |