Commit 41a8b2c5 authored by Wu Hao's avatar Wu Hao Committed by Greg Kroah-Hartman
Browse files

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: default avatarWu Hao <hao.wu@intel.com>
Acked-by: default avatarAlan Tull <atull@kernel.org>
Acked-by: default avatarMoritz Fischer <mdf@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 99a560bd
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
What:		/sys/class/fpga_region/<region>/compat_id
Date:		June 2018
KernelVersion:	4.19
Contact:	Wu Hao <hao.wu@intel.com>
Description:	FPGA region id for compatibility check, e.g. compatibility
		of the FPGA reconfiguration hardware and image. This value
		is defined or calculated by the layer that is creating the
		FPGA region. This interface returns the compat_id value or
		just error code -ENOENT in case compat_id is not used.
+22 −0
Original line number Diff line number Diff line
@@ -158,6 +158,27 @@ err_put_region:
}
EXPORT_SYMBOL_GPL(fpga_region_program_fpga);

static ssize_t compat_id_show(struct device *dev,
			      struct device_attribute *attr, char *buf)
{
	struct fpga_region *region = to_fpga_region(dev);

	if (!region->compat_id)
		return -ENOENT;

	return sprintf(buf, "%016llx%016llx\n",
		       (unsigned long long)region->compat_id->id_h,
		       (unsigned long long)region->compat_id->id_l);
}

static DEVICE_ATTR_RO(compat_id);

static struct attribute *fpga_region_attrs[] = {
	&dev_attr_compat_id.attr,
	NULL,
};
ATTRIBUTE_GROUPS(fpga_region);

/**
 * fpga_region_create - alloc and init a struct fpga_region
 * @dev: device parent
@@ -258,6 +279,7 @@ static int __init fpga_region_init(void)
	if (IS_ERR(fpga_region_class))
		return PTR_ERR(fpga_region_class);

	fpga_region_class->dev_groups = fpga_region_groups;
	fpga_region_class->dev_release = fpga_region_dev_release;

	return 0;
+2 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
 * @bridge_list: list of FPGA bridges specified in region
 * @mgr: FPGA manager
 * @info: FPGA image info
 * @compat_id: FPGA region id for compatibility check.
 * @priv: private data
 * @get_bridges: optional function to get bridges to a list
 */
@@ -23,6 +24,7 @@ struct fpga_region {
	struct list_head bridge_list;
	struct fpga_manager *mgr;
	struct fpga_image_info *info;
	struct fpga_compat_id *compat_id;
	void *priv;
	int (*get_bridges)(struct fpga_region *region);
};